69
-1- POWERBUILDER 9.0 Ing. Alberto Moreno C. Universidad Nacional de Ingenieria Power Builder 9.0 -2- CONTENIDO Ø Entorno del PowerBuilder Ø Propiedades de controles. Ø Funciones de cadena, numéricas y fechas. Ø Aplicación con Arreglos y Funciones de Usuario DFU. Ø Objeto DataWindow. Ø Aplicaciones con DataWindow Filter y Find. Ø Datawindow con Retrieval Arguments y Campos calculados. Ø Validaciones de campo y mantenimiento de una tabla. Ø

Libro Power Builder II

Embed Size (px)

Citation preview

Page 1: Libro Power Builder II

-1-

POWERBUILDER 9.0

Ing. Alberto Moreno C.Universidad Nacional de Ingenieria

Power Builder 9.0

-2-

CONTENIDOØ

Entorno del PowerBuilder

Ø

Propiedades de controles.

Ø

Funciones de cadena, numéricas y fechas.

Ø

Aplicación con Arreglos y Funciones de Usuario DFU.

Ø

Objeto DataWindow.

Ø

Aplicaciones con DataWindow Filter y Find.

Ø

Datawindow con Retrieval Arguments y Campos calculados.

Ø

Validaciones de campo y mantenimiento de una tabla.

Ø

Aplicación elaboración de un factura.

Ø

Estructura de datos y OpenWithParm.

Ø

Page 2: Libro Power Builder II

Objetos de usuario, visuales y no visuales.

Ø

Gráficos uso del estilo Graph.

Ø

Animaciones.

Ø

DataWindow Dinamicos.

Ø

Enviar Correo.

Ø

Api s en Power

Ø

Control treeview

Ø

Trucos en Power.

Profesor

:Ing. Alberto Moreno C..

Prohibida cualquier copia sin permiso del autorCorreo :[email protected] frase debo hacer algo resuelve mas problemas que la frase hay que hacer algo

Power Builder 9.0

-3-

Que es Power Builder?Es una herramienta de desarrollo de aplicaciones gráficas, principalmente para eldesarrollo de aplicaciones Cliente/Servidor de N capas.Antes de empezar a desarrollar cualquier aplicación se debe crear:

a) Un espacio de trabajo Workspace, que asignara la extensión ( *.pbw)

b) Una aplicación que esta ligado a una librería o biblioteca (*.pbl)

Power Builder 9.0

Page 3: Libro Power Builder II

-4-

Template Application .- es cuando se abre una nueva aplicación pero con una plantillade trabajoExisting Application .- Para abrir una aplicación que se encuentra en otra versión delpower.

Power

Builder 9.0

-5-

CAPITULO DE FUNCIONESFunciones del Control:CLEAR()Borra el contenido de un objetoSyntaxobjectname.Clear ( )ControlsDataWindow, EditMask, MultiLineEdit, SingleLineEdit, RichTextEdit,DropDownListBox, DropDownPictureListBox, OLE controls, and OLEStorageobjects

DELETEITEM()Borra un item desde una lista de valoresSyntaxobjectname.DeleteItem ( index )ControlsListBox, DropDownListBox, PictureListBox, and DropDownPictureListBox controlsEjemplo:Esta sentencia borra el primer item seleccionado en Lb_productos

integer Xindex

// Variable de tipo entero

Xindex = lb_software.SelectedIndex() // Capturamos la posición del cursor en lalistalb_ software.DeleteItem(Xindex)

// Eliminamos el item seleccionado

ADDITEM()Adiciona nuevos items para una lista de valoresSyntaxobjectname.AddItem ( item )ControlsListBox and DropDownListBox controlsEjemplo:integer Xrow

Page 4: Libro Power Builder II

Power Builder 9.0

// Variable de tipo entero

-6string s

// Variable de tipo cadena

s = "Insertar Item"

// Almacenamos un valor a la variable

Xrow = lb_software.AddItem(s) // Insertamos el valor de la variable (s) en ellistboxFINDITEM()Busca un texto dentro de una lista de valores, retorna un valor 1 si no encuentra el datoa buscar.Syntaxobjectname.FindItem (text, index)ControlsListBox, DropDownListBox, PictureListBox, and DropDownPictureListBox controlsEjemploInserta en un control listbox el siguiente contenido:

integer XIndexXIndex = lb_software.FindItem("Power Builder", 1)En este ejemplo el valor de index será 6INSERTITEMInserta un item dentro de una lista de valoresSyntaxobjectname.InsertItem

(item, index)ControlsListBox and DropDownListBox controls

Power Builder 9.0

-7Respecto al ejemplo anterior:Lb_software.InsertItem( Apache ,6)

// inserta el item en la sexta posición, es decir en el item 6

SELECTEDTEXTObtiene el texto seleccionado en un control editableSyntaxeditname.SelectedText ( )ControlsDataWindow, EditMask, MultiLineEdit, SingleLineEdit, RichTextEdit,DropDownListBox, and DropDownPictureListBox controls

ejemplo: inserta un dropdownpicturelistbox e ingresale como minumo 5 items, en uncontrol, y en el evento que desees ingresa lo siguiente

Page 5: Libro Power Builder II

string XubicaXubica = ddlb_software.SelectedText()SELECTITEMEncuentra y resalta un item dentro de una lista.ControlsListBox, DropDownListBox, PictureListBox, and DropDownPictureListBox controlsSyntaxa) objectname.SelectItem (item, index)

ejemplo:integer XIndexXIndex = lb_software.SelectItem("Power Builder", 2) // si encuentra el texto lo resalta y si no// el valor devuelto es 0

b) lobjectname.SelectItem (itemnumber)Resalta el item especificado en la lista, si el valor es cero no se selecciona ningún ítemSyntaxobjectname.SelectItem (itemnumber)

Power Builder 9.0

-8ControlsListBox, DropDownListBox, PictureListBox, and DropDownPictureListBox controlsejemploddlb_software.Selecitem(0)

// ningún ítem es seleccionado

lb_software.SelectItem(5)

// resalta el item 5

TOTALITEMSDetermina el número total de itemsSyntaxlistcontrolname.TotalItems ( )ControlsListBox, DropDownListBox, PictureListBox, DropDownPictureListBox, and ListViewcontrolsSTATEDetermina si un elemento de

la lista esta resaltada.SyntaxListboxname.State ( index )ControlsListBox and PictureListBox controlsejemplo:

integer XItemTotal, XItemCountXItemTotal = lb_software.TotalItems( )// Verifica que items esta seleccionadoFOR XItemCount = 1 to XItemTotal

Page 6: Libro Power Builder II

IF lb_software.State(XItemCount) = 1 THEN // Si esta seleccionadoMessageBox("Selected Item", lb_software.text(XItemCount))END IFNEXTSETSTATEResalta un item dentro de una lista solo es aplicable cuando esta lista es de múltipleselección es decir propiedad Multiselect = TRUE

Power Builder 9.0

-9Syntaxobjectname.SetState (index, state)ControlsListBox and PictureListBox controlsejemplo

lb_software.SetState(6, TRUE)

Power Builder 9.0

-10-

FUNCIONES DE CADENA.ASC Obtiene el código ASCII correspondiente, de un carácter de tipo cadena.ejemplo :Asc(

)

// retorna 65

CHAR Retorna el carácter correspondiente al código ASCIIString XSXS=Char(42) // retorna *FILL retorna una cadena con una longitud determinada del carácter especificado.ejemploFill(

,5)

// *****

LEFT Retorna un número especificado de caracteres comenzado por la izquierdaEjemplo:String XcadXcad = Left( Claudia ,3)

// Cla

LEFTTrim Retorna una copia de una cadena sin los espacios en blanco del ladoizquierdo.Ejemplo:String Xcad

Page 7: Libro Power Builder II

Xcad = LeftTrim(LEN(Cad)

Claudia )

// Retorna Claudia

Retorna la longitud de una cadena

Ejemplo:String XcadXcad = Len( Claudia )

// Retorna 7

LOWER(Cad) Convierte toda la cadena a minúsculasEjemplo:String XcadXcad = Lower( CLAUDIA )

// Retorna claudia

MATCH Determina si la cadena contiene

un patrón particular de caracteres.Ejemplo:

Power Builder 9.0

-11Esta sentencia retorna TRUE si el texto contiene una letra Mayúscula:Match(sle_Id.Text, "[A-Z]")MID Extrae caracteres a partir de una PosiciónEjemplo:String XcadXcad = Mid( Claudia ,4,2)

// retorna ud

POS retorna la posición donde comienza una cadena dentro de otra cadena .Ejemplo:Integer XposXpos = Pos( Power Builder Bu ) // Retorna 7REVERSE(Cad) Cambia el orden de los caracteres de una cadena.EjemploString XrevXrev = Reverse( Hola )

// aloH

RIGHT(CAD, n) devuelve caracteres a partir de la derechaEjemplo:String XcadXcad = right( Claudia ,3)

Page 8: Libro Power Builder II

// dia

SPACE(N) Inserta espacios en blancoEjemplo:Cad=Space(5)

// devuelve

, cinco espacios en blanco.

TRIM(Cad) suprime blancos a ambos extremos de la cadena.Ejemplo:Cad= claudia

// devuelve claudia , cadena sin espacios en blanco a los

costados.UPPER(cad) Convierte toda la cadena a letras mayúsculasEjemplo:

Power Builder 9.0

-12Cad= especialización

// devuelve ESPECIALIZACION.

FUNCIONES FECHADAY Retorna el día de una fecha.Ejemplo:Dia = String(Day(2001-04-21)) // retorna 21, convertimos el dato de tiponúmerico acadena, con la funcion string.DAYNAME Retorna el nombre de día de la semanaEjemplo:Cad = DayName(2001-04-22)

// retorna Sunday.

DAYNUMBER Retorna el número de día de la semanaEjemplo:Cad = string(DayNumber(2001-04-22))

// Retorna 1

DAYAFTER Devuelve los días que hay entre dos fechasEjemploCad = DayAfter(2001-04-22, 2001-04-18) // retorna -4HOUR Retorna un entero que corresponde al número de horas, que se

encuentre en undato detipo hora

Page 9: Libro Power Builder II

Ejemplo:Hour(19:12:42) // retorna 19.MINUTE retorna los minutosEjemplo:Minute(19:42:13) // retorna 42.MONTH Retorna el número correspondiente al mes de una fechaEjemplo:Month(2001-04-22)

// retorna 4

NOW devuelve la Hora del sistema

Power Builder 9.0

-13EjemploHora = String(now(), HH:mm:ss ) // string(dato,tipo de salida del dato), en estecaso eshora:minuto:segundo.RELATIVEDATE Retorna la fecha con respecto a un determinado número de día.Ejemplo:Date FechaFecha=Relativedate(today(), -25) // la fecha hace 25 días respecto a la fechaactual.SECOND Retorna el número de segundos.Ejemplo:Cad = string(Second(14:13:45)) // retorna 45 expresado en un dato de tipocadena.

TODAY Retorna la Fecha y hora del sistemaEjemplo:Cad = string(today(), DD/MM/YY ) // retorna una cadena con la fecha del sistemaen unformato de dd/mm/y yes decir , 12/04/03YEAR Retorna el año de una fecha.EjemploNum = year(today())

Power Builder 9.0

-14-

FUNCIONES NUMÉRICASABS obtiene el valor absoluto de un númeroEjemplo:Num= (abs(-34) // retorna 34CEILING Obtiene el menor número entero que es menor o igual al número especificadoEjemplo: Donde Deci es una variable de tipo decimalDeci = String(Ceiling(-4.8)) // retorna 4COS Obtiene el coseno de un ángulo el ángulo debe estar en radianesEXP El resultado de un número elevado a la potencia.Ejemplo:Deci = String(exp(1))

Page 10: Libro Power Builder II

// 2.718

FACT Obtiene el factorial de un númeroEjemplo:Num= Fact(4) // retorna 24MAX Retorna el mayor de dos númerosEjemplo:Num = Max(-4,-7) // retorna -4MIN Menor entre dos númerosEjemplo:Num

= Min(4,7) // retorna 4MOD Obtiene el residuo de dos númerosEjemplo:Num = Mod(20,7) //retorna 6PI (n) multiplica PI(3.1416 por un numero)Ejemplo:Deci = Pi(1) // devuelve 3.14159.....RAND(10) Obtiene un número entero aleatorio entre 1 y el número especificado

Power Builder 9.0

-15-

Ejemplo:Num = Rand(10) // devuelve un número comprendido entre el 1 a 10RANDONMIZE(0) Randomize Regenera o inicializa el número aleatorio generador.Ejemplo:Randomize(0)ROUND Obtiene el número entero comprendido en un número decimalEjemplo:Num = Round(3.598,0)

Power Builder 9.0

// devuelve 4

-16-

Aplicaciones

DFU (Funciones Defindas por el Usuario).Pueden ser a nivel de Ventana o a nivel de toda la aplicaciónEjemplo: Ingresar un monto en soles y lo convierta a letras

Em_1 control deedicion

Mle_1 Contol demúltiple linea

Page 11: Libro Power Builder II

por ejemplo si:

Num=345

Funciones a crear

Num

Num

Tipo intF_mil

F_centena

F_millLetra

LetraDevuelve en letras:Trescientos cuarenta y cimco

Es más simple hacer la conversión trabajando con vectores

Paso 1.- Declarar a nivel de instancia (Pestaña Instancia)DeclareInstanciaString vec1[]={"Uno","dos","Tres","cuatro","cinco","seis","siete","ocho","nueve"}String vec2[]={"Once","doce","trece","catorce","quince","dieciseis", "diecisiete", &"dieciocho","diecinueve"}String vec3[]={"Diez","viente","trienta","cuarenta","cincuenta","sesenta", &"setenta","ochenta","noventa"}String vec4[]={"Ciento","Doscientos","trescientos","cuatroscientos","quinientos", &"seiscientos", "setecientos","ochocientos","novecientos"}

Power Builder

9.0

-17Paso 2.- Crear las funciones: NumLetras (a nivel de ventana)a) Clic en (Insert) del menú principal.b) Clic en (Function).

aa)b)c)d)e)

b

c

Page 12: Libro Power Builder II

d

Tipo de acceso a la función.Tipo de dato de retorno.Nombre de la función.Tipo de datos que se va a referenciar, en este caso será un valor.Tipo de dato del valor.

En la ventana de código, tipeamos la siguiente estructura:

String cad1,cad2Int c,res,d,unic=num/100res= mod(num,100)if c>0 Thenif c=1 and res=0 then cad1="Cien" else cad1=vec4[c]end ifchoose case rescase 1 to 9cad2=vec1[res]case 11 to 19cad2=vec2[res - 10]case 10, is >=20d=res/10uni=mod(res,10)if uni=0 thencad2=vec3[d]elsecad2=vec3[d]+ " y "+ vec1[uni]end ifend choosereturn cad1 + cad2

Power Builder 9.0

f

g

-18Funcion miles

Tipeamos el siguiente código:String cad1,cad2Int res,milmil=num/1000res= mod(num,1000)if mil>0 thenif mil=1 then cad1="Mil " elseend if

Cad1=f_centena(mil)+" Mil"

Page 13: Libro Power Builder II

if res>0 Thencad2=f_centena(res)end ifreturn cad1 + " " + cad2

Procedemos a ejecutar la aplicacion y veremos los resultados.

Power Builder 9.0

-19-

FUNCIONES APLICADAS A CONTROL DATA WINDOWSEstructura de un Datawindows

Edit Control

Datawindows.- Es una carateristicas más importante del Power Builder. El DataWindowses la forma en que sus aplicaciones presentan los datos de la base de datos y quizasincluso datos no específicamente de una base de datos al usuario final; DataWindowspueden ser pantalla de consulta, formato de entrada de datos, reportes de impresión, etc.

Un objeto DataWindow debe ser insertado con

una ventana regular, en todo diseño de unDataWindow forman parte dos objetos.1.- DataWindow Object.- que es diseñado con el DataWindow Painter.2.- DataWindow Control.- Es un control donde se insertará el DataWindows Object.

Power Builder 9.0

-20-

Funciones principales de un Datawindows

SetTransObjectHace que un control DataWindow use un objeto de transacción especificado por elprogramador. El objeto de transacción proporciona la información nesecesaria paracomunicarse con la Base de Datos. Retorna -1 si ha ocurrido un error.Sintaxis Dwn. Settransobject(Transacción)Argument

Description

Dwn

El nombre del Control data window, con el cual se desea usar unobjeto de transacción.

Transacción

Nombre del Objeto de transacción, por defecto es SQLCA.

Generalmente se establece el objeto de transacción en el evento Open de la ventana

Page 14: Libro Power Builder II

que contiene el control DataWindow.En resumen el SettransObject(SQLCA) asocia el objeto transación con el controlDataWindow.Ejemplo:DwnSoftware.settransobject(SQLCA)InsertRowInserta una fila en un DataWindow, Si alguna columna tiene valores por defecto, La fila esinicializada con estos valores, retorna el número de la fila que se ha añadido, retorna -1si ha ocurrido un error.Sintaxis Dwn.InsertRow(fila)Argument

Descripcion

Dwn

El nombre del control DataWindow en el cual se desea insertar unafila.

Fila

Un entero Largo (long) que identifica la fila antes de la cual deseainsertar una fila nueva. Si el valor es cero insertará al final de latabla.

Ejemplo:

Power Builder 9.0

-21DwnSoftware.InsertRow(0)Retrieve()Recupera todas las filas

de una tabla de la BDD en un control DataWindow, Si incluyenargumentos, estos son usados por los argumentos de recuperacion de la sentencia SQLSELECT del objeto DataWindow. Retorna el número de filas recuperadas, -1 si ocurre unerror.Sintaxis Dwn.Retrieve({Arg1, Arg2,

})

Argument

Descripcion

Arg1, Arg2

Argumentos de recuperacion, de la tabla de BDD

Ejemplo:DwnSoftware.Retrieve( C001 )SetRowFocusIndicatorEspecifica el indicador visual que identifica la fila actual en un control DataWindow.

Page 15: Libro Power Builder II

Sintaxis Dwn.SetRowFocusIndicator (Indicador)Indicador

El indicador visual para la fila actual, los valores validos son:

Off!

Sin indicador.

FocusRect! Un rectangulo de puntos alrededor de la fila.Hand!

Un dedo indice.El nombre de un Picture Control.

SelectRowSelecciona la fila especificada en el control de un DataWindows.Sintaxis Dwn.SelectRow (Fila, Boolean)Ejemplo:DwnSoftware.SelectRow(0,False)

// desactiva la fila anterior

DwnSoftware.SelectRow(15,true)

// resalta toda la fila 15

Power Builder 9.0

-22-

SetItemEstablece el valor en una fila y columna especificada, un valor dentro del datawindow,retorna -1 si ocurre un error.Sintaxis DwnSoftware.Setitem (Fila, columna/campo, valor)Ejemplo:Dwn.SetItem(5, "sueldo",670)

En la fila 5, en el campo sueldo se asigna 670.

También en vez del nombre de campo, puede ser el número de campo de acuerdo comoha sido seleccionado en el objeto DataWindow.GetItemStringObtiene datos de tipo cadena de un buffer especificado de un control DataWindow.

Sintaxis Dwn.GetitemString (Fila, Columna)EjemploString cadCad=DwnSoftware.GetItemString(3,

"sfw_Nombre")

Extrae el dato que se encuentra en el campo sfw_nombre, en la fila 3, dependiendo del

Page 16: Libro Power Builder II

tipo de dato que se va extraer tenemos:Dwn.GetitemNumber (Fila, columna)

Cuando el campo es de manera generalnumérico, puede ser real o entero.

Dwn.GetitemDecimal (Fila, columna)

Cuando el dato a extraer es exclusivamentedecimal o real.

Dwn.GetitemDate (Fila, columna)

Si el campo es de tipo fecha.

Dwn.GetitemTime (Fila, columna)

Si el campo es de tipo hora.

Dwn.GetitemDateTime (Fila, columna)

Cuando el campo es de tipo fecha y hora.

Ejemlo: Capturar en variables, sueldo del empleado, su edad y fecha de nacimiento delempleado, cuya posición se encuentre en la fila número 3.

Power Builder 9.0

-23-

Int edadDec SbasDate Fenac

Edad= DwnEmpleado.GetItemNumber(3,"emp_Edad")Sbas= DwnEmpleado.GetItemDecimal(3, "emp_Sbas")Fenac=DwnEmpleado.GetItemDate(3,"emp_Fenac")

Nombre del campos en la tabla.GettextObtiene el valor de un control de edicion en la fila y columna actuales, antes que este seaaceptado.

Sintaxis dwn.Gettext ()

Por ejemplo si este radio button se encuentra dentro del DataWindow, y al seleccionaruna de estas opciones se desea saber su valor seleccionado basta emplear:

String TmonedaTmoneda = DwnSalario.Gettext()SetsortEspecifica, el criterio de ordenamiento para un DataWindow, retorna 1 si tuvo éxito y -1 sise encontro un error.

Page 17: Libro Power Builder II

Sintaxis Dwn.SetSort (campo1 [A|D])Ejemplo:DwnEmpleado.setsort()Dwn.Sort()

Power Builder 9.0

-24Ejecuta la clasificación con un previo criterio de selecciónSintaxis Dwn.Sort ()Ejemplo:DwnEmpleado.SetSort("emp_ape

A, #2 D") // ordena apellido y sueldo asumiendo// que el #2 sea el campo sueldo.DwnEmpleado.Sort()

// Procede al ordenamiento.

GetRowRetorna el número de la fila actual de un DataWindow, como un valor Long,Retorna 0 si no hay fila activa y -1 si se ha producido un error grave.Sintaxis Dwn.GetRow ()

SetRowEstablece la fila deseada, mueve el cursor a la fila especificada, pero no hace Scroll en elDataWindow.Sintaxis Dwn.SetRow (Fila)

ScrollToRowHace un Scroll en un DataWindow, hasta alcanzar la fila especificada.ScrollToRow cambia la fila actual pero no la columna actual. Retorna 1 si hubo éxito, -1 encaso contrario. Scrolltorow no ilumina la fila a la cual se hace scroll.Sintaxis Dwn.ScrolltoRow(fila)

Si la fila toma un valor mayor que el número total de la fila, se hace scroll a la última fila.RowCountObtiene el número de filas que se encuentran disponibles en un DataWindowSintaxis Dwn.RowCount()

ScrollToRowCausa que el control se deslice a la fila especificada, cambiando la fila actual, a donde sele indique.Sintaxis Dwn.Scrolltorow(fila)

Power Builder 9.0

-25-

ScrollToPriorRowSe desliza a la fila previa, sin cambiar la columna activaSintaxis Dwn.ScrollPriorRow(fila)

ScrollNextRow

Page 18: Libro Power Builder II

Se desliza a la siguiente fila.Sintaxis Dn.ScrollNextRow(fila)

DeleteRowSuprime la fila especificada del control DataWindow, se actualiza directamente la tablaenlazada al control.Sintaxis Dwn.DeleteRow(fila)Si la fila es igual a cero, elimina la fila activa donde se encuentra el puntero, cada vez quese emplee esta sentencia, se tiene que actualizar el DataWindow ejemplo:Dwn.deleteRow(8)

//

elimina la fila número 8

Dwn.Update()

// actualiza la base de datos enlazada

DeletedCountRetorna el número de filas que hayan sido suprimidas desde el control DataWindow peroque todavia no hayan sido actualizadas en la tabla de la BDD asociada.Sintaxis Dwn.DeletedCount()Ejemplo:Long NfNf=Dwn.DeletedCount()UpdateSe envia a la base de datos todas las inserciones, eliminaciones y actualizaciones delcontrol DataWindow, retorna 1 si tuvo éxito, -1 si ocurrio un error.Sintaxis Dwn.Update()

Power Builder 9.0

-26-

Utilización del DatawindowsEl objeto DataWindows en si no es de ninguna utilidad, si no se vincula con unDataWindow control. Este objeto, es visual y es posible de insertar directamenteen una ventana; para que pueda ser utilizado por el usuario.Desarrollar la Siguiente aplicación.

Uso de filtros (Find

S etFIlter)

A

B

A

A.- Seleccionamos en el control sueldo el carácter de condición e ingresamos unvalor numérico que representa al sueldo básico, luego presionamos clic en el

Page 19: Libro Power Builder II

boton Mostrar y tendremos los requeridos.B.- Se ingresa solo los primeros caracteres del nombre, si huviera algún registroque contenga dichos caracteres, deberá resaltar el primer registro tal comoobservamos en el ejemplo.

Power Builder 9.0

-27Pasos 1.- La BDD VENTA.DB puede estar en cualquier motor de Base de dato,para este caso se hace uso del AnyWhere del SYSBASE (entorno delPowerBuilder)

Estructura:Vendedor:Codv Char4Nomv varchar 30Sbas Numeric 8,2FacturaNfac char6Codv char4Impor Numeric 8,2Tipov char1

TABLASIngresar datos consistentes

en las tablas creadas, como se muestra acontinuación:FACTURA

VENDEDOR

Paso 2.- Diseñar el DataWindow - (File-New-DataWindow)- Se elige el estilo de Presentación: (Elegir el Tipo Tabular)

Power Builder 9.0

Null(no)

-28-

PresentaciónCompositeFreeformGraphGridGroupLabel

Rich Text

Page 20: Libro Power Builder II

Tabular

Power Builder 9.0

DescripciónUtiliza como presentación, un reporte previamente creado.La presentación es libre, cada campo se muestra en una líneadistinta. Muy utilizado para el ingreso de datos.Diseña un gráfico dependiendo de una consulta, esta debecontener datos relacionados.Diseña una malla de datos en forma columnada, y cadacolumna con una justificación completa.Diseña listado por agrupación de campos. Muy utilizado parareportes de resumen de información.El diseño es de etiquetas, donde Ud. podrá elegir el tipo deetiqueta de las prediseñadas, en papel continuo o separado, yotras opciones.Permite definir una carta con combinación de campos delOrigen de Datos fijado. Se pueden utilizar todas lascaracterísticas del formato de texto RTF.Presenta el Origen de Datos en forma columnada pero sinajuste total. Permite una mayor libertad en el diseño.

-29-

Modos de trabajo: (Seleccione SQl Select)

El modo de trabajo define como se trabajara con el Origen de Datos. Existen 5 tipos demodos de trabajo.ModoQuick Select

Sql Select

Query

External

StoredProcedure

Power Builder 9.0

DescripciónNos presenta las tablas en forma gráfica, y solo permite lassentencias ordinarias de SQL (Sort y Criteria). La primera parasentencia sirve para poder ordenar por el

campo específico y lasegunda sentencia para indicar registros a mostrar dependiendode un valor condicional (Ejemplo: 0 then//almacenamos en la variable busca la siguiente sentencia

Page 21: Libro Power Builder II

busca="Nomv like '" + trim(sle_1.text) + "%' "//contamos el número de filas del control DWnf=dw_1.rowcount()//realizamos la busqueda de la sentencia ya antes almacenadar=dw_1.find(busca,1,nf)// preguntamos si se ha obtenido un valor mayor a cero// si este fuera el caso entonces significa que ha encontrado// uno o varios valores en la busqueda (dependiendo de la sentencia)if r>0 then//marcamos y nos posicionamos en la fila encontradadw_1.selectrow(0,false)dw_1.selectrow(r,true)dw_1.scrolltorow(r)

Power Builder 9.0

-35end ifend ifPaso 7.- Codificar en el control sle_1, evento modify(), lo siguienteSTRING cad// la funcion Trim suprime los blancoscad = "Sbas " + trim(ddplb_1.text) + " " + trim(sle_2.text)dw_2.setfilter(cad)dw_2.filter()Paso 8.- Codificar en el cb_1, evento clicked(), lo siguienteint rr=dw_1.getrow()dw_1.selectrow(0,false)dw_1.selectrow(r,true)Script a Nivel de la Aplicación:// Profile VentaSQLCA.DBMS = "ODBC"SQLCA.AutoCommit = FalseSQLCA.DBParm = "Connectstring='DSN=venta'"//nos conectamos con la Base de Datosconnect;//preguntamos si ha ocurrido un error en la conexiónIf Sqlca.Sqlcode0 thenMessagebox ("Error de Conexión",Sqlca.SqlErrText)Haltelse//abrimos la ventana 1 de nuestro proyectoopen(ventana01)end ifEsta conexión se puede traer desde el entorno de la BDD

Power Builder 9.0

-36-

Clic en elsiguiente iconoy obtendremos

Page 22: Libro Power Builder II

la siguiente

ventana

Clic

en el boton Edit….Clic en la siguiente pestañaObtendremos la siguiente vista

Power Builder 9.0

-37-

Copie el contenido en la aplicación.Lugo proceda a ejecutar el programa

DataWindow Retrieval Arguments con Campos CalculadosAplicación.Mostrar las Facturas por cada vendedor, se ingresa por teclado el código del vendedor.Con las Tablas: Vendedor y Facturas, elaborar el siguiente DataWindow:Paso 1.- Seleccionar el tipo Tabular en el DataWindow.Paso 2.- Abrir las tablas Facturas y Vendedor, luego seleccione los campos que necesiteen la consulta como se observa a continucación:

Paso 3.- Del menú de opciones seleccionar Design, luego seleccionar RetrievalArguments.

Power Builder 9.0

-38-

Colocar la variable receptora, a través de esta variable ingresará un código y procederáhá realizar la búsqueda en el DataWindow.

Nombre de la Variable

Tipo de dato querecibirála variable

Paso 4.- En la opción Where seleccionar el campo para realizar la condición con lavariable definida anteriormente, la variable debe ser precedida por dos puntos(:Var)Observe el graficoLuego Pulse ctrl. + W

Power Builder 9.0

-39-

Paso 5.- El estilo Tabular mostrará 3 secciones de trabajo que son:1. Header1 (cabecera).2. Detail (detalle).3. Summary (donde se muestran los campos totales).

Page 23: Libro Power Builder II

1

2

3

Cada campo tiene un conjunto de propiedades que se muestran en la parte lateralderecha, dar forma a la presentación de la consulta moviendo las cabeceras y etiquetasde cada campo de la siguiente manera:

Power Builder 9.0

-40-

Para ver como esta saliendo el diseño puede comprobarlo mediante

la opción Row delmenú principal y seleccionando Retrieve, para ello le pedirá ingresar un código devendedor.Paso 6.- Completar los campos de comisión, comisión total y pago total a través de lasopciones del menú principal: Insert – submenu Control – opcion Compute Field.

Power Builder 9.0

-41Al seleccionar esta opción Computed Field , llevar el cursor en la posición donde deseacolocar el calculo de la comisión (Detail), luego mostrara la ventana de Modify Expresióndonde colocara la expresión para la comisión , para facilitar la edición de esta expresiónhaga un Clic en los campos mostrados en Columns.Codificar la siguiente sentencia, para determinar la comisión del empleado, si tipo deempleado esen tonces su comisión será del 8 %, de lo contrario será el 5%.

Paso 7.- Cambie de nombre en name (compute_1 nombre por defecto, por Comision)

Ampliar la sección resumen, para colocar el total del campo calculado comisión y pagototal.

Power Builder 9.0

-42Para la suma del comisión marcar el campo calculado comisión, similar al Paso 6 InsertControl- Elegir Sum, entonces autómicamente mostrara el campo sumado en namecolocar el nombre (Tcom).

Para el calculo pago total, de forma similar seleccionar el paso anterior seleccionarInsert-Control-Computed Field y editar la siguiente expresión.

Luego complete las etiquetas, para mostrar la objeto DataWindow final.

Grabarlo como Data01.

Power Builder 9.0

Page 24: Libro Power Builder II

-43Paso 8.- Luego Inserte un formulario o ventana para colocar el DataWindow, lapresentación final sera:

Grabar la ventana con el nombre de Ventana01Paso 9.- Codificar los scripts:- En la ventana,

evento open(), codifique lo siguiente:Dw_1.SettransObject(Sqlca)Sle_1.text =Sle_1.setfocus()- En el control sle_1, evento modify(), codifique lo siguiente:String CadCad=Trim(Sle_1.text)If Dw_1.Retrieve(Cad) =0 Then// Sino se recupera ninguna filaMessageBox( Error , Código no existe, verificar ,information!)End if

En la aplicación hacer la conexión con la BDD// Profile VentaSQLCA.DBMS = "ODBC"SQLCA.AutoCommit = FalseSQLCA.DBParm = "Connectstring='DSN=venta"connect;

Power Builder 9.0

-44If Sqlca.Sqlcode0 thenMessagebox ("Error de Conexión",Sqlca.SqlErrText)Haltelseopen(ventana01)end if

Mantenimiento de una BDDUtilizar la tabla vendedor agregando los campos feing (fecha de ingreso) y grado (gradode estudios).Realizar también las validaciones correspondientes en cada campo:Paso 1.- crear una función a nivel de la aplicación (file-new-project-Function)

Power Builder 9.0

-45-

Paso 2.- Crear el DataWindow estilo FreeForm de la tabla vendedor y realizar lasvalidaciones respectivas en cada campo, aunque es opcional dependiendo del proyectoque este elaborando.

Observe como se incorpora la función en el campo a nivel de columnas, specificaciones,si desea una área más amplia hacer doble click en Validation Expresión.Al campo grado editarlo como un combo:

Page 25: Libro Power Builder II

1.2.3.4.

Seleccione dicho campo y en propiedades seleccionar la pestaña EDIT.En tipos de estilos existen seis tipos, seleccione DropDownListBox.Marca el check Always Show Arrow, para que tenga el aspecto de un combo.Ingrese 3 valores en la grilla (code Table) como se muestra en el gráfico.

Power Builder 9.0

-46-

5.

Ademas dar formato de fecha y formato monetario a los campos: fecha de ingresoy sueldo básico; en la misma propiedad Edit pero seleccionado EDIT MASK enStyle Type.

Paso 3.- Diseñar el siguiente Formulario:Nombre de la Ventana: Ventana02

Power Builder 9.0

-47-

Nombre de la Ventana: Ventana03

Script Open for aplicación// Profile VentaSQLCA.DBMS = "ODBC"SQLCA.AutoCommit = FalseSQLCA.DBParm = "Connectstring='DSN=venta"connect;If Sqlca.Sqlcode0 thenMessagebox ("Error de Conexión",Sqlca.SqlErrText)Haltelseopen(ventana02)end if

Script clicked for pb_priDw_1.Scrolltorow(1)Dw_1.Setfocus()

Power Builder 9.0

-48Script clicked for pb_antDw_1.ScrollPriorRow()Dw_1.Setfocus()Script clicked for pb_SgteDw_1.ScrollNextRow()

Page 26: Libro Power Builder II

Dw_1.Setfocus()Script clicked for pb_Ultlong nfnf=dw_1.rowcount()dw_1.scrolltorow(nf)dw_1.setfocus()Script clicked for Cb_NuevoInt Nflong nfnf=dw_1.insertrow(0)dw_1.scrolltorow(nf)dw_1.setfocus()dw_1.setcolumn("codv")cb_graba.enabled=trueScript clicked for Cb_grabaint resres=dw_1.update()if res=1 thencommit using sqlca;//cd_recupera.enabled=falseelserollback using sqlca;end ifcb_recupera.triggerevent(clicked!)cb_graba.enabled=falseEnd ifScript clicked for Cb_Anulalong nfnf=dw_1.getrow()if nf>0 thendw_1.deleterow(nf)dw_1.update()dw_1.scrolltorow(1)end ifcb_recupera.triggerevent(clicked!)cb_anula.enabled=falseScript clicked for Cb_RecuperaDw_1.Retrieve()

Power Builder 9.0

-49cb_graba.enabled=falsecb_recupera.enabled=falseScript clicked for Cb_Buscaopen(ventana03)Script clicked for Cb_Recuperadw_1.setfilter("")dw_1.filter()dw_1.setsort("#1

A")dw_1.sort()dw_1.retrieve()

Page 27: Libro Power Builder II

cb_graba.enabled=falseScript clicked for Cb_SalirHalt

Paso 4.- En la ventana 03 codificar los siguientes scriptScript Load for Ventana03sle_1.text=""sle_1.setfocus()Script Modify for sle_1string cadlong nfnf=ventana02.dw_1.getrow()cad="codv = '" + trim(sle_1.text) + "'"ventana02.dw_1.setfilter(cad)ventana02.dw_1.filter()if ventana02.dw_1.rowcount()=0 thenventana02.dw_1.setfilter("")ventana02.dw_1.filter()ventana02.dw_1.setsort("#1 A")ventana02.dw_1.sort( )ventana02.dw_1.scrolltorow(nf)messagebox("Error","Código no existe" + string(nf))elseclose(ventana03)ventana02.cb_graba.enabled=trueventana02.dw_1.setfocus()ventana02.dw_1.setcolumn(1)end if

Power Builder 9.0

-50-

Elaboracion de una factura

Tablas Básicas para la elaboración de la factura

Los Script para cada evento1.- W_FacturaOpendw_1.settransobject(sqlca)dw_fac.Settransobject(Sqlca)dw_1.retrieve(" ")Cb_NuevaClickedint fselect max(Nfac) into :xfac from fac_cab;if isnull(xfac) then

Power Builder 9.0

-51xfac=0end if

Page 28: Libro Power Builder II

xfac++dw_1.reset()f=dw_fac.insertrow(0)dw_fac.scrolltorow(f)dw_fac.setitem(f,1,string(xfac,"000000"))dw_fac.setitem(f,3,today())dw_fac.setcolumn(2)dw_1.setfocus()A nivel de Dw_1 (detalle factura elaborar el siguiente evento)

En Event Id Seleccionar Pbm_dwnkeyDw_1

Tecla (Keycode Key,UnsignedLong Keyflags)

if keydown(keyf2!) thenint ff=dw_1.insertrow(0)dw_1.scrolltorow(f)dw_1.setfocus()int mm=dw_1.getitemnumber(1,"maxitem")if isnull(m) thenm=0end ifm++dw_1.setitem(f,"item",m)dw_1.setitem(f,"nfac",string(xfac,"000000"))open(w_pro)end

ifCb_BorrarClicked//Borrar Itemint filafila=dw_1.getrow()

Power Builder 9.0

-52if fila>0 thendw_1.deleterow(fila)dw_1.update()end ifCb_TotalizaClickeddec tot,igv,netotot=dw_1.getitemnumber(1,"totgen")igv=tot*0.18 ; neto=tot+igvst_venta.text=string(tot,"##,###.00")st_igv.text=string(igv,"#,###.00")st_neto.text=string(neto,"###,###.00")Cb_Graba

Page 29: Libro Power Builder II

Clicked//Compleatar los campos para La tabla Fac_Cabedw_fac.setitem(dw_fac.getrow(),"impor",dec(st_venta.text))dw_fac.setitem(dw_fac.getrow(),"igv",dec(st_igv.text))dw_fac.setitem(dw_fac.getrow(),"neto",dec(st_neto.text))int rr=dw_fac.Update()if r=1 thencommit;elseRollback;end if// Grabacion del detalle Facturar=dw_1.update()if r=1 thenCommit;ElseRollback;End if// Actualizar La tabla Stockint Fila,xcanString XcodFor Fila=1 to Dw_1.Rowcount()Xcod=Dw_1.GetItemString(fila,"codpro")Xcan=Dw_1.GetItemNumber(Fila,"can")Update Fac_detaSet Stock = Stock - :Xcan Where Codpro= :Xcod;NextCommit;Dw_proActivate ( en la ventana de consulta de productos)sle_1.setfocus()dw_1.retrieve()Dw_pro Opendw_1.settransobject(sqlca)

Power Builder 9.0

-53-

Dw_1

Tecla(Keycode Key, UnsignedLong KeyFlags)

int rdec precioif key=keyenter! thenr=dw_1.getrow()cad=dw_1.getitemstring(r,1)precio=dw_1.getitemNUmber(r,"puni")W_factura.dw_1.setitem(W_factura.dw_1.getrow(),"codpro",cad)W_factura.dw_1.setitem(W_factura.dw_1.getrow(),"puni",precio)W_factura.dw_1.setcolumn(4)

Page 30: Libro Power Builder II

close(parent)end ifif key=keyescape! thendw_1.setfilter("")dw_1.filter()sle_1.text=""sle_1.setfocus()end

ifSle_1

Modified

string criteriocriterio=" upper(Despro) Like '"+upper(sle_1.text)+"%'"dw_1.setfilter(criterio)dw_1.filter()dw_1.setfocus()dw_1.selectrow(1,true)

Power Builder 9.0

-54-

AplicacionConsiderando que tenemos el mantenimiento de la tabla cursos, al realizar un click en elboton Alumnos, se carga la ventana de alumnos, pero solo se mostrarán los datos deaquellos alumnos de dicho curso (Fila activa de la Tabla Cursos).Para la Ventana alumnos elaboramos:Un Objeto DataWindowData Source SQL SelectStyleTabularNombreDw_NotasLuego seleccione todos los campos a utilizar.Especificamos el argumento de recuperacion de curso.

Paso 1.- Del Menu de Design seleccione la Opcion Retrival Arguments.Paso 2.- En name seleccione cualquier nombre de variable de tipo igual al campoutilizado como argumento.Paso 3.- En la Ficha Where se debe especificar, la relacion entre el campo y la variable

Power Builder 9.0

-55Paso 4.- Luego especifique La creacion del Obejeto Estructura, utilizando (Structurepainter) del Menu Principal(Power Bar)File – New – pestaña PB Object - Structure.En la venta de dialago, especifique:Codigo_Curso de tipo StringNombre_Curso de Tipo de stringSe debe almacenar como S_curso

Page 31: Libro Power Builder II

Paso 5.- En la ventana alumnos (VenAlumnos)Declarar una variable de instanciaString vi_codcurPaso 6.- Codificación de eventos para obtener la lista de los alumnos por curso.Se realiza a traves de un boton de la ventana Cursos VenCursos (Mantenimiento decursos).La ventana VenAlumnos debe recibir el parametro (código

del curso), que se envia desdela Ventana VenCursos.Paso 7Script -Clicked for Cb_alumnos (W_cursos)long nfS_curso Origen //asignamos una variable llamada origen de tipo S_cursonf=dw_1.getrow()origen.codcur=dw_1.getitemstring(nf,"cur_cod")origen.nomcur=dw_1.getitemstring(nf,"cur_des")openwithparm (VenAlumnos,origen)paso 8Script -Open for (VenAlumnos)S_curso DestinoDestino=message.powerobjectparmvi_codcur=Destino.codcurthis.title=vi_codcur + " - " + Destino.nomcurcb_graba.enabled=falsedw_1.SETTRANSOBJECT(sqlca)dw_1.retrieve(vi_codcur)Dw_Alumnos.SetRowFocusIndicator(Hand!)if dw_1.rowcount()0 then dw_1.modify("alu_pro.color='0~tif(alu_pro>=11,RGB(0,0,255),RGB(255,0,0))'")Paso 9.- Codificacion de los botones de desplazamiento

Power Builder 9.0

-56Script clicked for pb_priDw_1.Scrolltorow(1)Dw_1.Setfocus()Script clicked for pb_antDw_1.ScrollPriorRow()Dw_1.Setfocus()Script clicked for pb_SgteDw_1.ScrollNextRow()Dw_1.Setfocus()Script clicked for pb_UltInt nfNf=dw_1.RowCount()Dw_1.Scrolltorow(Nf)Dw_1.Setfocus()Script clicked for Cb_Nuevolong nfnf=dw_1.insertrow(0)dw_1.scrolltorow(nf)dw_1.setitem(nf,"cur_cod",vi_codcur)

Page 32: Libro Power Builder II

dw_1.setitem(nf,"alu_nota1",0)dw_1.setitem(nf,"alu_nota2",0)dw_1.setitem(nf,"alu_nota3",0)dw_1.setitem(nf,"alu_nota4",0)dw_1.setitem(nf,"alu_pro",0)dw_1.setfocus()cb_graba.enabled=trueScript clicked for Cb_grabalong resres=dw_1.update()if res=1 thencommit using sqlca;//cb_graba.enebled=falseelserollback using sqlca;end ifdw_1.retrieve(vi_codcur)dw_1.scrolltorow(1)Script clicked for Cb_Anulalong nfnf=dw_1.getrow()if

nf>0 thendw_1.deleterow(nf)

Power Builder 9.0

-57dw_1.scrolltorow(1)end if

Script clicked for Cb_Recuperadw_1.retrieve(vi_codcur)cb_graba.enabled=falseScript RowFocusChanged For Dw_1// evento que se activa cada vez que se enfoca un nuevo registrolong nfilas,factnfilas=dw_alumnos.Rowcount()fact= dw_alumnos.GetRow()st_mensaje1.text="Fila" +String(fact)+" de"+string(nfilas)Script ItemFocusChanged For Dw_alumnos// Este evento se dispara cada vez que nos situamos en un nuevo campo o columnaint ncnc=dw_1.getcolumn()st_mensaje2.text="Columna " + string(nc)Script ItemChanged For Dw_1/* se activa cada vez que realizamos cualquier cambio dentro de la ventana */dec nota,n1,n2,n3,n4,prodw_1.modify("alu_pro.color='0~t if(alu_pro>=11,RGB(0,0,255),RGB(255,0,0))'")if pos("alu_nota1,alu_nota2,alu_nota3,alu_nota4",dwo.name)>0 then// dwo.name es equivalente a GetColumnName() devuelve el nombreif isnumber(dw_1.gettext()) then //si no es numerico, mantiene el foco el el campo

Page 33: Libro Power Builder II

nota=dec(dw_1.gettext())if nota20 thenmessagebox("Error","El dato debe estar en un rango de 0 a 20")return 1end ifif dw_1.accepttext()=1 thenn1=dw_1.getitemnumber(row,"alu_nota1") // row equivale Getrow()n2=dw_1.getitemnumber(row,"alu_nota2")n3=dw_1.getitemnumber(row,"alu_nota3")n4=dw_1.getitemnumber(row,"alu_nota4")pro=(n1+n2+n3+n4)/4dw_1.setitem(row,"alu_pro",pro)Cb_graba.enabled=trueend ifend if

Power Builder 9.0

-58Script ItemError For Dw_alumnosReturn 1

PRIMERA PRÁCTICA CALIFICADA1. Especificaciones de la aplicaciónCreadas las tablas con sysbase SQL Anywhere para almacenar las facturas de

losclientes••••

Productos (Clave principal cod_Prod)Clientes (Clave principal Cod_Cli)Facturas (Clave Principal Num_Fact,Clave Foranea Codigo del Cliente)Deta_Factura (Clave Principal Num_fact,Cod_prodClave Foranea Num_factClave Foranea Cod_Prod)

Relacione las tablas con sus respectivas Claves.Los registros para cada tabla se adjunta a este proyecto.

2.- La aplicación debe permitir realizar las operaciones:2.1 Tener una ventana principal (VMain) con las siguientes opciones:2.1.1 Mantenimiento de la Tabla Clientes (VManClientes)2.1.2 Mantenimiento de la tabla Productos (VManProductos)2.1.3 Consulta de Facturas.

3.- En la consulta de Facturas por Clientes, se debe tener una ventana con lossiguientes controles DataWindow: (VConFacturas)3.13.2

Page 34: Libro Power Builder II

3.3

3.43.5

DW_Clientes (estilo Grid), donde solo debe mostrar los campos(Cod_cli,Nom_Cli,Tel,Ruc)Dw_Facturas (estilo Tabular), donde debe mostrar las columnas (Num_fact,Fecha, Subtotal, Igv, total).En esta última ventana debe solo extraer las facturas de un cliente seleccionado,Obteniendo al final un resumen (suma del campo total) para ver cual es su totalgeneral.La ventana (VConFacturas) tendra un boton Detalle donde permite visualizar enotra ventana( VFacDetalle) el detalle de la facturaVentana (VFacDetalle) debe mostrar todos los campos de la tabla detalle facturacon el campo descripcion del producto (tabla producto).

Power Builder 9.0

-59Nota.- El diseño de la aplicación es a criterio del alumno.Su presentacion y estetica también se considera.

Aplicación Cuenta CorrienteEsta aplicación permite generar un campo en este

caso es el número de movimiento yactualizar el saldo en el archivo ahorro.

Power Builder 9.0

-60Script open for aplicación:// Profile conexion con sqlserverSQLCA.DBMS = "MSS Microsoft SQL Server 6.x"SQLCA.Database = "BDBANCO"SQLCA.ServerName ="(local)"SQLCA.LogId = "SA"SQLCA.AutoCommit = FalseSQLCA.DBParm = ""CONNECT;if sqlca.sqlcode0 thenmessagebox("Error de coneccion",sqlca.sqlerrtext)haltend ifopen(Venahorro)Script modified for Sle_1int r,vnro,fila,xnro,nfstring cadcad=trim(sle_1.text)dw_1.settransobject(sqlca)r=dw_1.retrieve(cad)if r0 thenxnro=integer(dw_2.getitemstring(1,"maximo"))+1else

Page 35: Libro Power Builder II

xnro=1end if*/select count(numcta) into :xnrofrom movimientowhere numcta=:cad;if sqlca.sqlcode=0 thenxnro++end iffila=dw_2.insertrow(0)dw_2.scrolltorow(fila)dw_2.setitem(fila,"numcta",cad)dw_2.setitem(fila,"nummov",xnro)dw_2.setcolumn(3)dw_2.setfocus()end if

Power Builder 9.0

-61Script Itemchanged for Dw_2string nomcolint filadec monchar tpfila=this.getrow()nomcol=this.getcolumnname()mon=this.getitemnumber(fila,"monto")choose case Lower(nomcol)case "tipoopr"//tp=trim(this.getitemstring(fila,"topr")) //valor obtenido en el datawindowtp=this.gettext() // valor que se da en el edit controlnsal=dw_1.getitemnumber(dw_1.getrow(),"saldo")if upper(tp)="D" thennsal=nsal + monelsensal=nsal - monend ifthis.object.tsaldo.text=string(round(nsal,2))end choosescrpt Clicked for Cb_grabaint rstring cadcad=dw_1.getitemstring(dw_1.getrow(),"numcta")// Actualizacion en el archivo ahorro//modo 1//dw_1.setitem(1,"saldo",nsal)//dw_1.update()//modo

2Update ahorroset saldo = :nsalwhere numcta=:cad;

Page 36: Libro Power Builder II

r=dw_2.update()if r=1 thencommit;elserollback;end if// borrar el contenido de los control data windowdw_2.reset()dw_1.reset()

Power Builder 9.0

-62-

SEGUNDA PRÁCTICA CALIFICADASe requiere un programa para automátizar las ventas de pasajes aéreos, para ello secuenta con las siguientes tablas:Base de datos Vuelos DBTablas:Rutas

tipo

Long

Cod_rutNom_rutPago_cho

CharVarcharNumeric

Viajes

tipo

Nro_viaCod_rutFsal_viaHsal_viaCos_viaNro_vacCod_choFlag

CharCharDateTimeNumericNumericChar

Page 37: Libro Power Builder II

Char

Pasajeros

tipo

NbolNroviaNom_pasTipoPago

NumericCharVarcharCharNumeric

ChoferCod_choNom_choSba_cho

tipoLongChar4Varchar25Numeric 6 1

41561Long64

61341Long5625161

TextoCodígo de rutaNombre de rutapago por viaje al chofer

Page 38: Libro Power Builder II

TextoNro de ViajeCodigo de rutaFecha de salidaHora de SalidaCosto del ViajeNro de vacantesCodigo del ChoferS(si) N(no) viaje realizadoTextoNumero de BoletoNro de ViajeNombre del pasajero(E)studiante (A)dulto (N)iño

TextoCodigo del ChoferNombre del choferSueldo basico

Realizar:1.- Colocar las claves principales y foráneas para cada tabla, cuando relacione cada tablaconformar la opcion:• Delete any Dependent Rows (CASCADE), por ejmplo cuando se anule un registro enviaje anule a todos los pasajeros.2.- La aplicación debe permitir realizar el manteniemiento para cada tabla

Power Builder 9.0

-633.- En el mantenimiento del archivo de viajes debe tener un

botón de Pasajeros de talmodo que permita visualizar solo los pasajeros de ese viaje en otra ventana (adicion,anulacion y modificacion), en la adicion se trae el campo nro de viaje y costo de laventana anterior(ambos de estilo tabular), el pasajero tendra un descuento de acuerdoal tipo :EstudianteNiñoAdulto••••

30%50%0%

El nro de viaje se genera AA9999 los primeros 2 digitos año del sistema y los cuatroúltimos digitos un correlativo.Para el DataWindow de viaje el campo codígo de ruta y codígo del chofer debeincorporarse un DataWindow para cada uno, para que su selección sea más explícita.El número de Boleto se genera a partir del 00001 de manera correlativa

Page 39: Libro Power Builder II

Luego de cada adicion de pasajeros las vacantes en ese viaje debe disminuirse en launidad.

4.- Consulta de viajes por chofer, debe mostrarse en una ventana.La lista de Choferes, al seleccionar uno de ellos, deberá presentar los viajesrealizados, al final debe aparecer su pago total

5.- Consulta de viajes por rutas. En esta ventana; al elegir una ruta (en un controlDataWindow) debe mostrar todos los viajes programados (en otro control data) alseleccionar el viaje debe mostrar la relacion de pasajeros.6.- Consulta de viajes por fecha, en esta ventana se debe ingresar dos fechas: fechainicial y final en caso que solo se ingrese la fecha inicial se debe tomar hasta la últimafecha de viaje, mostrando en un control DataWindow las siguientes columnas:NroViaje,Nombre de ruta , Nombre del pasajero y tipo

7.- Elabore un menú para relacionar cada opcion con las tareas pedidas.8.- El diseño y presentación de cada ventana es de acuerdo a criterio

del alumno.NotaEeste trabajo es para 2 semanas de laboratorio, sera revisado cada avance.•

Trabajo en forma grupal, solo se tomara en cuenta a los alumnos regulares.

Power Builder 9.0

-64-

Objetos de UsuarioTema Custom Clases VisualesPor ejemplo se desea realizar el siguiente evento de usuario:

Paso 1.- En New seleccionar PB OBJECT

Seleccionar Custom VisualEl cual va a mostrar una pantalla similar a la window estándar, para diseñar su plantilla:Realizar el siguiente diseño: tiene dos controles etiquetas, uno encima de otro, uno confondo blanco y el otro con fondo azul, una tercera etiqueta para ver el porcentaje delproceso.

ST_2Power Builder 9.0

ST_1

-65St_pg (para ver el porcentaje)

Codificación del uo_progresoDeclareInstanciaInt Ir_alfinalFunctions

Page 40: Libro Power Builder II

Uf_iniciar(int vini) return noneir_alfinal=vinist_2.width=0Functions Uf_avance(integer valor) return noneInt porcen, anchoReal razonAncho=st_1.widthRazon=valor / ir_alfinalPorcen=round(razaon*100,0)St_pg.text= string(valor)+ de +string(ir_alfinal)+ + string(porcen)+

Power Builder 9.0

-66-

ClasesCrear las siguientes clases de Objetos de usuarios1.- Los Visualesa) Un Progres según se muestra en la figura

b) Un control para desplazamiento de paginas y de Impresiónc) Colocando una caja de texto que permita adicionar o restar días a una fecha através de Vscrolld) Colocando dos listBox , al desplazarse en uno de ellos que se encuentresincronizadoe) Pasando una cadena a una etiqueta que dicha cadena sea tipo Blinkf) Colocando un cuadro texto que solo acepte letras y espacios en Blanco.

2.- No

Visualesa) Una función que permita sumar una columna numérica, se pasa como valor elcontrol DataWindow y el número de columna.b) Un evento que permita centrar una ventana, se pasa como valor una ventana.c) Una función que permita generar un código, se pasa como dato un controlDataWindow, el valor inicial del código, el código puede empezar con una letra onúmero.d) Un evento que permita cambiar el color de una columna de un controlDataWindow, pasar como dato el control DataWindow y el número de columna.

Power Builder 9.0

-67-

Capitulo de Graficos en Power BuilderEs un estilo de un DataWindow, pero también se pueden efectuar gráficos a través delcontrol graph.

Pasos para crear un grafico.

Power Builder 9.0

-68-

Page 41: Libro Power Builder II

AplicaciónSe tiene las Base de Datos (EMPRESA), que tiene las siguientes tablas:

Realizar el grafico como se muestra en la figura.Para ello Diseñar los siguientes DataWindowDatawindowDatag01Datag02Datag03

TablasDepartamentoy SalariosDepartamentoy SalariosEmpleado

CamposNom_dept,Cod_empCod_emp,sueldo

Category

Values

Nom_dept

Count(Cod_emp)

Cod_emp

Sueldo

Todos

Data01 y Data02 son estilos graficos, mientras Data03 estilo freeform

Power Builder 9.0

RetrievalArguments

Nom_deptCod_emp

-69-

Aplicar las propiedades correpondientes a los mencionados DataWindowsAl hacer Click en un empleado mostrará una ventana con sus datos personales, como semuestra en el ejemplo

Page 42: Libro Power Builder II

LauraMoreno Lee

Power Builder 9.0

-70Script open for Aplicacion// Coneccion con la Base de Datos// Profile conexion con sqlserverSQLCA.DBMS = "MSS

Microsoft SQL Server 6.x"SQLCA.Database = "Empresa"SQLCA.ServerName ="(local)"SQLCA.LogId = "SA"SQLCA.AutoCommit = FalseSQLCA.DBParm = ""connect;open(VenEstadistica1)Script open for ventana VenEstadistica1dw_1.settransobject(sqlca)dw_2.settransobject(sqlca)dw_1.retrieve()Script Cliked for dw_1 (VenEstadistica1)GrObjectType ClickedObjectstring nomdept,nomgraf="gr_1"int v_series,v_categoriaClickedObject=This.ObjectAtPointer(nomgraf,v_series,v_categoria)if ClickedObject=Typedata! or ClickedObject=TypeCategory! thennomdept= this.CategoryName(nomgraf,v_categoria)string cadcad="EMPLEADOS EN "+nomdeptdw_2.modify("gr_1.title='"+cad+"' ")dw_2.retrieve(nomdept)ElseMessagebox(parent.title,"Click en departamento para ver empleados")end if

Script Cliked for dw_2 (VenEstadistica1)GrObjectType ClickedObjectstring nomgraf='gr_1'int v_series,v_categoriastring id_empClickedObject=This.ObjectAtPointer(nomgraf,v_series,v_categoria)

Power Builder 9.0

-71if ClickedObject=Typedata! or ClickedObject=TypeCategory! thenid_emp= this.CategoryName(nomgraf,v_categoria)openwithparm(venfichae,id_emp)ElseMessagebox(parent.title,"Click en departamento para ver Detalle de empleado")end ifOpen for VenFichaEmp

Page 43: Libro Power Builder II

string coddw_1.settransobject(sqlca)cod=message.stringparmdw_1.retrieve(cod)Script Cliked for cb_1 (VenFichaEmp)close(venfichae)

Aplicación Formularios MDI y Objetos de Usuario.En esta aplicación se ha utilizado Ventanas con herencia (inheret) donde la ventanaw_sheet-dw es la ventana padre que contiene funciones definidas por el usuarioCreación de Objetos de Usuario empleado para

contener controles de tipo general queseran empleados, por las otras ventanas descendientes (w_alumnos y W_cursos);ademas se han elaborado las funciones de objeto usuario con la finalidad de generalizarlas tareas de los eventos.1.- Para crear un objeto usuario siga los pasos del profesor:a)b)c)2.- Crear un menu (menu01) con todas las opciones descritas:

Power Builder 9.0

-722.1 Crear un menu02 heredado(inheret) del menu013.- Elaborar las siguientes Ventanas:3.1Ventana W_frame aquel que va a contener el menu01 y el objeto de UsuarioCreado en el punto 13.2Ventana W_sheet_dw ventana padre que contiene un control datawindow(dw_1)sin relacionar a ningun objeto datawindow3.3Ventana W_alumno heredado de la ventana (W_sheet_dw) y relacionarlo con elmenu023.4Ventana W_cursos heredado de la ventana (W_sheet_dw) y relacionarlo con elmenu024.- Creacion de eventos:4.1 Anivel de objeto de UsuarioVariable InstanciaDatawindow idw_udo4.2 Funcion de Objeto de usuarioUf_setdw(datawindow dw_parm)idw_udo=dw_parm4.3 Script Clicked for Cb1idw_udo.scrolltorow(1)idw_udo.setfocus()4.4 Script Clicked for Cb2idw_udo.scrollnextrow()idw_udo.setfocus()4.5 Script Clicked for Cb3idw_udo.scrollPriorRow()

Page 44: Libro Power Builder II

idw_udo.setfocus()4.6 Script Clicked for Cb4int nfnf=idw_udo.rowcount()idw_udo.scrolltorow(nf)idw_udo.setfocus()4.7 Script Clicked for Cb5idw_udo.retrieve()idw_udo.triggerEvent(rowfocusChanged!)idw_udo.setfocus()4.8 Script Clicked for Cb6int nfnf=idw_udo.insertrow(0)idw_udo.scrolltorow(NF)idw_udo.setfocus()

Power Builder 9.0

-734.9 Script Clicked for Cb7int rr=idw_udo.update()if

r=1 thencommit;elserollback;end if5.- Eventos para la ventana W_frameScript Risize for w_frameint

nX, nY, nWidth, nHeight

/*nX = WorkSpaceX (this)nY = WorkSpaceY (this) */nWidth = this.WorkSpaceWidth( )nHeight = this.WorkSpaceHeight( )nHeight = nHeight - (uo_1.y + uo_1.height)nHeight = nHeight - mdi_1.MicroHelpHeightmdi_1.Move (0, uo_1.y + uo_1.height)mdi_1.Resize (nWidth, nHeight + 4)6.- Evento para la ventana W_sheet_dwdeclarar la Variable Instanciaw_frame iw_frameinteger i_row6.1

Script activate for w_sheet_dwiw_frame.uo_1.uf_setdw(dw_1)

6.2 Script open for w_sheet_dwiw_frame=This.parentwindow()

Page 45: Libro Power Builder II

dw_1.settransobject(sqlca)6.3 Script Ue_cascada for w_sheet_dwiw_frame.arrangeSheets(cascade!)6.4

Script Ue_Horizontal for w_sheet_dwiw_frame.arrangeSheets(tile!)

6.5 Script Ue_totalw for w_sheet_dwiw_frame.arrangeSheets(layer!)6.6 Script Ue_vertical for w_sheet_dwiw_frame.arrangeSheets(tilehorizontal!)6.7 Script rowfocuschanged for dw_1

Power Builder 9.0

-74i_row=this.getrow()if i_row 0 THENMessageBox("Caution", "SyntaxFromSQL caused these errors: " + ERRORS)RETURNEND IFdw_1.Create( dwsyntax_str, ERRORS)IF Len(ERRORS) > 0 THENMessageBox("Caution", "Create cause these errors: " + ERRORS)RETURNEND IFdw_1.settransobject(sqlca)dw_1.retrieve()

Envio de e-m@ilSi se tiene instalado el Outlook se debe de configurar

ddlb_destinatarioPower Builder 9.0

-80-

sle_titulo

mle_texto

lb_archivos

Pb_1

Pb_1Clickedstring docname, namedinteger valuevalue = GetFileOpenName("Selecione Fichero", docname, named, "DOC",

Page 46: Libro Power Builder II

&+ "Text Files (*.TXT),*.TXT, All Files (*.*),*.*")IF value = 1 THENlb_archivos.additem(docname)end ifcb_1

Clicked

mailSessionmailReturnCodemailMessagemailFileDescriptionstringls_filenamestringintboolean

mSesmRetmMsgmAttach[]ls_ret, ls_syntax, ls_name, ls_open_pathname,ls_attach_name='c:\pbl\error.psr'li_index, li_nret, li_nrecipients, li_nfilelb_noerrors

mSes = create mailSessionmRet = mSes.mailLogon ( mailNewSession! )

Power Builder 9.0

-81If mRet   mailReturnSuccess! ThenMessageBox ("Mail Logon", 'Return Code   mailReturnSuccess!' )mSes.mailLogoff()returnEnd IfSetPointer(HourGlass!)mMsg.notetext = mle_texto.text// Mensaje a adjuntar ficheros a enviarlong tt,hayhay=lb_archivos.totalitems()for tt=1 to haymAttach[tt].FileType = mailAttach!mAttach[tt].PathName = lb_archivos.text(tt)mAttach[tt].FileName = lb_archivos.text(tt)mAttach[tt].Position = len(mMsg.notetext) - 1mMsg.AttachmentFile = mAttachnextmMsg.Recipient[1].name = ddlb_destinatario.textmMsg.Subject=sle_titulo.textSetPointer(HourGlass!)

Page 47: Libro Power Builder II

mRet = mSes.mailsend ( mMsg )mSes.mailLogoff()

// destinatario// subject

APIS DE EN POWERDeclaración de Funciones externas

Mostrar la Barra deestado

Ver el Nombre de la maquinaDescripciónLas funciones externas son escritas en diferentes lenguajes y almacenadas en librerias dinamicascon la extensión DLL, antes de utilizar estas funciones primero debe declararse definiendo su tipo.Global external functions Estos son disponibles en toda la aplicaciónLocal external functions Estos son definidos a nivel de ventana u objeto de usuarioExternal

function syntax Usa la siguiente sintaxis:

Power Builder 9.0

-82{ access } FUNCTION returndatatype name ( { { REF } datatype1 arg1,..., { REF } datatypen argn } ) LIBRARY "libname"ALIAS FOR "extname"Paso1.- Primero declarar las funciones externas ya sea a través del visor Apis o digitarlosdirectamente

cb_ocultar

Clicked

Long HBar// Esconder la barra de tareasHBar = FindWindowExA( 0, 0, "Shell_TrayWnd", ls_Null )ShowWindow( HBar, 0 )

Ubicar la clase dentro de la DLL

Cb_Mostrar

Clicked

onstant Long SW_SHOW = 5// Nombres del shell de Windows que deberiamos buscarString ls_NullLong HBar, ll_HDeskTopHBar = FindWindowExA( 0, 0, "Shell_TrayWnd", ls_Null )ShowWindow( HBar, SW_SHOW )

Page 48: Libro Power Builder II

// Muestra el escritorioll_HDeskTop = FindWindowExA( 0, 0, "Progman", ls_Null )ShowWindow( ll_HDeskTop, SW_SHOW )

Cb_maquina

Clicked

long ll_retstring ls_ComputerName ,ls_UserNameulong BufferLength = 250ll_ret = GetComputerNameA(ls_ComputerName, BufferLength)messagebox("maquina",ls_ComputerName)

Power Builder 9.0

-83-

Control Trreview y procesos de arrastreAplicación: Cambio de empleados en otro departament

Control Tv_1Objetos a emplear:1.-estructura (stremp)

2.-Datawindow estilo tabular datemptablas:Departamento, empleado y salarios ( de la BDD empresa utilizado anteriormente)campos:Departamento(id_dep,,nom_dep), empleado(cod_emp,nom_emp,ape_emp)Retrieval argument id_dep (codigo del departamento)

Power Builder 9.0

-84-

Descripción de los eventosBeginDrag.-ocurre cuando el usuario presiona el boton izquierdo del mouse, sobreuna etiqueta en el control treeview

iniciándose el arrastre.DragWithin Ocurre cuando el usuario esta arrastrando con el control.DragDrop.- Ocurre cuando el usuario arrastra un objeto sobre el control y libera el botondel mouse y deja el objeto.Itempopulate.-Ocurre cuando un item delTreview llena los demas items hijosOccurs when the user presses the left mouse button on a label in the TreeView controland begins dragging.Ven01openidsource=create Datastoreidsource.dataobject="Datemp"idsource.settransobject(sqlca)triggerEvent("ue_populate")ven01

Page 49: Libro Power Builder II

ue_populate()

TreeviewItem VitemSetPointer(hourglass!)Vitem.Label="Marketing"Vitem.Data= "D001"vitem.PictureIndex=1vitem.SelectedPictureIndex=7Vitem.children=truetv_1.insertitemlast(0,vitem)Vitem.Label="logistica"Vitem.Data= "D002"vitem.PictureIndex=2tv_1.insertitemlast(0,vitem)Vitem.Label="Ventas"Vitem.Data= "D003"vitem.PictureIndex=3tv_1.insertitemlast(0,vitem)Vitem.Label="Contabilidad"Vitem.Data= "D004"vitem.PictureIndex=4tv_1.insertitemlast(0,vitem)Vitem.Label="Administracion"Vitem.Data= "D005"vitem.PictureIndex=5tv_1.insertitemlast(0,vitem)

Power Builder 9.0

-85tv_1begindrag(long handle ) return long//Inicio del ArrastreTreeViewItem t_SourceGetitem(Handle,T_source)ST_9.TEXT=STRING(T_Source.Level)if T_Source.Level2 thenThis.Drag(cancel!)Else//Almacena el Handle del item antes de comenzar el arrastre parent(departament)r_dragsource=handler_dragparent=finditem(parentTreeItem!,handle)end if

tv_1

dragdrop(dragobject source, long handle) return long

int li_pendlong li_newitemtreeviewitem lt_target,lt_source,lt_parent,lt_newif

Page 50: Libro Power Builder II

getitem(r_droptarget,lt_target)=-1 then returnif getitem(r_dragsource,lt_source)=-1 then returngetitem(r_dragparent,lt_parent)if messagebox("Transferir empleado","Desea Transferir "+lt_source.label+" form"+lt_parent.label+&"~n hACIA "+ lt_target.label+"?",question!,yesno!)=2 then returnli_pend=upperBound(vecEmp)+1messagebox("lt_source",string(lt_source.data))messagebox("lt_target",string(lt_target.data))VecEmp[li_pend].vemp=lt_source.dataVecEmp[li_pend].vdep=lt_target.datadeleteitem(r_dragsource)//setnull(lt_source.itemhandle)li_newitem=insertitemSort(r_droptarget,lt_source)selectitem(li_newitem)

tv_1

dragwithin(dragobject source, long handle) return long

treeviewitem t_overlong a,bif getitem(handle,t_over)=-1 then // si estamos en el primer nivelsetDropHighlight(0)r_droptarget=0returnend if

Power Builder 9.0

-86if t_over.level=1 then// resalta el departamento que va ser arrastradoif handler_droptarget thensetDropHighlight(handle)r_droptarget=handleelsesetDropHighlight(0)r_droptarget=0end ifelser_droptarget=finditem(parenttreeItem!,handle)if r_droptargetr_dragparent thensetDropHighlight(r_droptarget)elsesetDropHighlight(0)r_droptarget=0end ifend iftv_1itempopulate(long handle)int nf,cfTreeViewItem tvidep, tvempif getitem(Handle,tvidep)=-1 then return

Page 51: Libro Power Builder II

setPointer(hourglass!)idsource.reset()nf=idsource.retrieve(tvidep.data)tvemp.pictureIndex=6tvemp.selectedpictureIndex=6tvemp.children=falsefor cf=1 to nftvemp.label=idsource.object.empleado_nom_emp[cf]+","+idsource.object.empleado_ape_emp[cf]tvemp.data=idsource.object.empleado_cod_emp[cf]insertitemsort(handle,tvemp)next

Power

Builder 9.0

-87-

.

Trucos en Power01 - Cambiar el color alternativamente en las filas de una datawindowPara que las filas de una DataWindow tengan el aspecto de papel de impresoraañade la siguiente expresión en el color de la banda de detalle.IF (Mod(GetRow(),2)=0, RGB(0,255,0), RGB(255,255,255))Estos colores de fondo no aparecerán cuando se imprima el informe.Si quieres imprimir este efecto tienes que añadir un rectangulo o un campo de textoen blanco detrás de las columnas de detalle y poner la expresión anterior.02.- Ordenar una DropDown Datawindow pulsando la cabeceraUna característica que tienen los DataWindow es que te permiten ordenar lascolumnas pulsando en la cabecera de la columna. La función Sort te permiteespecificar el nombre de la columna o el número de columna por la cual se ordenaráel dataWindow. Funciona para la mayoría de columnas y tipo de datos, pero nofunciona bien cuando la columna pertenece a una DropDown DataWindowEl problema es que la función Sort ordena los datos por detrás de la DataWindow nolos valores que el usuario está viendo en pantalla.Para solucionar esto puedes usar el comando LookUpDisplay.Esta función devuelve la visualización de los datos de la columna. Poniendo elnombre de la columna dentro de esta función y usándola para ordenar los datos, elusuario podrá ver los datos ordenados.Por ejemplo:dw_1.SetSort( 'LookUpDisplay( dept_id )' )dw_1.Sort()03.- Ordenar un DataWindow pulsando en la cabeceraPor ejemplo: El nombre de la cabecera de la columna tiene que tener el mismonombre que en la base de datos y acabado

en '_t'Nombre de la columna: 'emp_id' = Nombre de la cabecera: 'emp_id_t'Sólo se puede ordenar por una columna cada vez.String ls_old_sort, ls_column

Power Builder 9.0

Page 52: Libro Power Builder II

-88Char lc_sort/* Chequea cuando el usuario hace click en la cabecera */IF Right(dwo.Name,2) = '_t' THENls_column = LEFT(dwo.Name, LEN(String(dwo.Name)) - 2)/* Guarda la última ordenación, si hubiera alguna*/ls_old_sort = dw_1.Describe("Datawindow.Table.sort")/* Chequea cuando préviamente se ordenó una columna y en la que se hace clickactualmente es la misma o no. Si es la misma, entonces se chequea el orden deordenación del ordenamiento anterior (A - Ascendente, D - Descendente) y locambia. Si las columnas odenadas no son las mismas, las ordena en ordenascendente. */IF ls_column = LEFT(ls_old_sort, LEN(ls_old_sort) - 2) THENlc_sort = RIGHT(ls_old_sort, 1)IF lc_sort = 'A' THENlc_sort = 'D'ELSElc_sort = 'A'END IFdw_1.SetSort(ls_column+" "+lc_sort)ELSEdw_1.SetSort(ls_column+" A")END IFdw_1.Sort()END IF04.- Determinar el uso de memoria de una datawindowA menudo es necesario saber cuanta memoria esta usando una DataWindow odatastore para prevenir un "out of memory" o para facilitar la depuración.Cuando se sabe la memoria que se está usando, el proceso de datos o larecuperación de los mismos, puede ser detenida cuando se llegue a un límitemáximo.Para deteminar la cantidad de memoria virtual que está usando una DataWindow odatastore, se usa el atributo Storage.Este puede ser invocado desde cualquiera de de los dos métodos siguientes:Notación DOT: dw_control.Object.DataWindow.StorageDescribe: dw_control.Describe("DataWindow.Storage")En

ambos caso devuelve una cadena con el valor utilizado en bytes.05.- Pasar el contenido de una Datawindow a otra ventanaLlamar a la segunda ventana pasándole como referencia la DataWindow:OpenWithParm( w_window, dw_1 )Entonces en el evento OPEN de la ventana escribe:datastore lds_parmlds_parm = Message.PowerObjectParm

Power Builder 9.0

-89dw_1.DataObject = lds_parm.DataObjectlds_parm.ShareData(dw_1)Y en el evento CLOSE:dw_1.ShareDataOff()06.- Copiar datos de un Grid Datawindow al portapapeles de Windows

Page 53: Libro Power Builder II

Los DataWindow grid tienen la capacidad única de dejarte seleccionar un número deceldas en el DataWindow (o la totalidad de filas o de columnas de datos).Este ejemplo ilustra como proporcionar soporte de copia para los datosseleccionados desde un DataWindow de tipo grid.Asumimos que un nuevo elemento de menu llamado m_SpecialCopy ha sidoañadido bajo el menu m_Edit .Añadir el siguiente código para determinar si el elemento Special Copy deberá serhabilitado.GraphicObject lg_ObjectDataWindow lg_DWstring ls_SelectedTextlg_Object = GetFocus ()CHOOSE CASE TypeOf (lg_Object)CASE DataWindow!lg_DW = lg_ObjectThis.m_SpecialCopy.Enabled = (lg_DW.dwDescribe ("datawindow.selected.data") '')END CHOOSE==============================Codifica lo siguiente en m_SpecialCopy o en un evento disparado porm_SpecialCopy):graphicobject lg_Objectdatawindow lg_DWlg_Object = GetFocus ()CHOOSE CASE TypeOf (lg_Object)CASE DataWindow!lg_DW = lg_ObjectClipBoard (lg_DW.dwDescribe ("datawindow.selected.data"))END CHOOSE07.- Permitir al usuario añadir solo columnas clave

nuevasA veces es deseable impedir a los usuarios que editen columnas clave una vez quelas han creado. Esto se puede hacer fácilmente usando expresiones de columna enel DataWindow.Añade esta expresión en el campo "background color" de la columna clave. Estocambiará el color de la columna y mostrará que la columna no es editable:if ( IsRowNew(), 1090519039, Long(Describe("Datawindow.Color")))Añade esta expresión en el campo "protect" de la columna clave:if ( isRowNew(), 0, 1)Si usas el modo consulta (query mode) utiliza esta expresión:

Power Builder 9.0

-90- Background Colourif ( Describe("Datawindow.QueryMode") = "yes" or isRowNew(), 1090519039,ong(Describe("Datawindow.Color")))- Protectif ( Describe("Datawindow.QueryMode") = "yes" or isRowNew(), 0, 1)8.- Cargar un array con los nombres de cada columnas en una Datawindowint colNum, numColsstring colName[]numCols = Integer(dw_control.Describe("Datawindow.Column.Count"))

Page 54: Libro Power Builder II

FOR colNum = 1 TO numCols// Obtenemos el nombre de la columna con la función DescribecolName[colNum] = dw_control.Describe("#" + String(colNum) + ".name")NEXT9.- Saber que ficheros hay en un directorioPuedes usar las API's de Windows:Function ulong GetWindowsDirectoryA (ref string dirtext, ulong textlen) library"KERNEL32.DLL"ls_dir = space(lul_size)lul_rc = GetWindowsDirectoryA(ls_dir, lul_size)La cual retornará una cadena conteniendo todos los ficheros que hay en esedirectorio, o también puedes usar la función DirList()listboxname.DirList ( filespec, filetype {, statictext } )La cual mostrará un ListBox con los ficheros que coincidan con el criterio especificado.Si

no quieres que el usuario vea estos ficheros, tienes que hacer el ListBox invisible.10.- Obtener una lista de las impresoras instaladasPor Réal GagnonEn este truco abriremos un listbox con una lista de las impresoras instaladas:string printers[]int rtn, i, nbPrintersrtn=RegistryKeys("HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Print\Printers", printers)nbPrinters = UpperBound(printers)FOR i = 1 TO nbPrinterslb_1.addItem(printers[i])NEXT11.- Detectar la versión de PowerBuilderstring ls_PBverenvironment envGetEnvironment(env)ls_PBver = string(env.pbmajorrevision) + '.' + string(env.pbminorrevision) + '.' +string(env.pbfixesrevision)

Power Builder 9.0

-9112.- Obtener el último día del mesSe coge una fecha, se incrementa el mes, se cambia el día por "01" y entoncesrestamos 1:int li_retdays,ld_previousMonthLastDay,li_month,li_yeardate ad_date, ld_newdatead_date= today()li_month = Month(ad_date)li_year = year(ad_date)IF li_month < 12 THENli_month ++ELSEli_month = 1li_year ++END IF

Page 55: Libro Power Builder II

// construimos una fecha nuevald_newdate = date(li_year,li_month,1)// extraemos el último día del mes anteriorld_previousMonthLastDay = day(relativedate(ld_newdate, -1))13.- Realizar un "Mouse Over" sobre un componenteSuponte que tienes un Static Text sobre una ventana. Cuando el puntero del ratónpasa por encima, el color del texto del Static Text cambia a color rojo. Cuando elpuntero del ratón sale del Static Text, el color del texto es negro.[Evento mousemove de la ventana]// Simplemente para visualizar algost_1.text = string(xpos) + ", " + string(ypos)IF xpos >= st_1.X AND (