You are on page 1of 92

-1-

Power Builder 9.0


POWERBUILDER 9.0
Ing. Alberto Moreno C.
Universidad Nacional de Ingenieria
-2-
Power Builder 9.0
CONTENIDO
Entorno del PowerBuilder
Propiedades de controles.
Funciones de cadena, numricas y fechas.
Aplicacin 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.
Aplicacin elaboracin de un factura.
Estructura de datos y OpenWithParm.
Objetos de usuario, visuales y no visuales.
Grficos 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 autor
Correo :am_alberto@hotmail.com
"La frase debo hacer algo resuelve mas problemas que la frase hay que hacer algo
-3-
Power Builder 9.0
Que es Power Builder?
Es una herramienta de desarrollo de aplicaciones grficas, principalmente para el
desarrollo de aplicaciones Cliente/Servidor de N capas.
Antes de empezar a desarrollar cualquier aplicacin se debe crear:
a) Un espacio de trabajo Workspace, que asignara la extensin ( *.pbw)
b) Una aplicacin que esta ligado a una librera o biblioteca (*.pbl)
-4-
Power Builder 9.0
Template Application .- es cuando se abre una nueva aplicacin pero con una plantilla
de trabajo
Existing Application .- Para abrir una aplicacin que se encuentra en otra versin del
power.
-5-
Power Builder 9.0
CAPITULO DE FUNCIONES
Funciones del Control:
CLEAR()
Borra el contenido de un objeto
Syntax
objectname.Clear ( )
Controls
DataWindow, EditMask, MultiLineEdit, SingleLineEdit, RichTextEdit,
DropDownListBox, DropDownPictureListBox, OLE controls, and OLEStorage
objects
DELETEITEM()
Borra un item desde una lista de valores
Syntax
objectname.DeleteItem ( index )
Controls
ListBox, DropDownListBox, PictureListBox, and DropDownPictureListBox controls
Ejemplo:
Esta sentencia borra el primer item seleccionado en Lb_productos
integer Xindex // Variable de tipo entero
Xindex = lb_software.SelectedIndex() // Capturamos la posicin del cursor en la
lista
lb_ software.DeleteItem(Xindex) // Eliminamos el item seleccionado
ADDITEM()
Adiciona nuevos items para una lista de valores
Syntax
objectname.AddItem ( item )
Controls
ListBox and DropDownListBox controls
Ejemplo:
integer Xrow // Variable de tipo entero
-6-
Power Builder 9.0
string 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 el
listbox
FINDITEM()
Busca un texto dentro de una lista de valores, retorna un valor 1 si no encuentra el dato
a buscar.
Syntax
objectname.FindItem (text, index)
Controls
ListBox, DropDownListBox, PictureListBox, and DropDownPictureListBox controls
Ejemplo
Inserta en un control listbox el siguiente contenido:
integer XIndex
XIndex = lb_software.FindItem("Power Builder", 1)
En este ejemplo el valor de index ser 6
INSERTITEM
Inserta un item dentro de una lista de valores
Syntax
objectname.InsertItem (item, index)
Controls
ListBox and DropDownListBox controls
-7-
Power Builder 9.0
Respecto al ejemplo anterior:
Lb_software.InsertItem("Apache,6) // inserta el item en la sexta posicin, es decir en el item 6
SELECTEDTEXT
Obtiene el texto seleccionado en un control editable
Syntax
editname.SelectedText ( )
Controls
DataWindow, EditMask, MultiLineEdit, SingleLineEdit, RichTextEdit,
DropDownListBox, and DropDownPictureListBox controls
ejemplo: inserta un dropdownpicturelistbox e ingresale como minumo 5 items, en un
control, y en el evento que desees ingresa lo siguiente
string Xubica
Xubica = ddlb_software.SelectedText()
SELECTITEM
Encuentra y resalta un item dentro de una lista.
Controls
ListBox, DropDownListBox, PictureListBox, and DropDownPictureListBox controls
Syntax
a) objectname.SelectItem (item, index)
ejemplo:
integer XIndex
XIndex = 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 ningn tem
Syntax
objectname.SelectItem (itemnumber)
-8-
Power Builder 9.0
Controls
ListBox, DropDownListBox, PictureListBox, and DropDownPictureListBox controls
ejemplo
ddlb_software.Selecitem(0) // ningn tem es seleccionado
lb_software.SelectItem(5) // resalta el item 5
TOTALITEMS
Determina el nmero total de items
Syntax
listcontrolname.TotalItems ( )
Controls
ListBox, DropDownListBox, PictureListBox, DropDownPictureListBox, and ListView
controls
STATE
Determina si un elemento de la lista esta resaltada.
Syntax
Listboxname.State ( index )
Controls
ListBox and PictureListBox controls
ejemplo:
integer XItemTotal, XItemCount
XItemTotal = lb_software.TotalItems( )
// Verifica que items esta seleccionado
FOR XItemCount = 1 to XItemTotal
IF lb_software.State(XItemCount) = 1 THEN // Si esta seleccionado
MessageBox("Selected Item", lb_software.text(XItemCount))
END IF
NEXT
SETSTATE
Resalta un item dentro de una lista solo es aplicable cuando esta lista es de mltiple
seleccin es decir propiedad Multiselect = TRUE
-9-
Power Builder 9.0
Syntax
objectname.SetState (index, state)
Controls
ListBox and PictureListBox controls
ejemplo
lb_software.SetState(6, TRUE)
-10-
Power Builder 9.0
FUNCIONES DE CADENA.
ASC Obtiene el cdigo ASCII correspondiente, de un carcter de tipo cadena.
ejemplo :
Asc("A) // retorna 65
CHAR Retorna el carcter correspondiente al cdigo ASCII
String XS
XS=Char(42) // retorna *
FILL retorna una cadena con una longitud determinada del carcter especificado.
ejemplo
Fill("*,5) // *****
LEFT Retorna un nmero especificado de caracteres comenzado por la izquierda
Ejemplo:
String Xcad
Xcad = Left("Claudia,3) // Cla
LEFTTrim Retorna una copia de una cadena sin los espacios en blanco del lado
izquierdo.
Ejemplo:
String Xcad
Xcad = LeftTrim(" Claudia) // Retorna "Claudia
LEN(Cad) Retorna la longitud de una cadena
Ejemplo:
String Xcad
Xcad = Len("Claudia) // Retorna 7
LOWER(Cad) Convierte toda la cadena a minsculas
Ejemplo:
String Xcad
Xcad = Lower("CLAUDIA) // Retorna claudia
MATCH Determina si la cadena contiene un patrn particular de caracteres.
Ejemplo:
-11-
Power Builder 9.0
Esta sentencia retorna TRUE si el texto contiene una letra Mayscula:
Match(sle_Id.Text, "[A-Z]")
MID Extrae caracteres a partir de una Posicin
Ejemplo:
String Xcad
Xcad = Mid("Claudia,4,2) // retorna "ud
POS retorna la posicin donde comienza una cadena dentro de otra cadena .
Ejemplo:
Integer Xpos
Xpos = Pos("Power Builder,Bu) // Retorna 7
REVERSE(Cad) Cambia el orden de los caracteres de una cadena.
Ejemplo
String Xrev
Xrev = Reverse("Hola) // aloH
RIGHT(CAD, n) devuelve caracteres a partir de la derecha
Ejemplo:
String Xcad
Xcad = right("Claudia,3) // dia
SPACE(N) Inserta espacios en blanco
Ejemplo:
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 maysculas
Ejemplo:
-12-
Power Builder 9.0
Cad= "especializacin // devuelve ESPECIALIZACION.
FUNCIONES FECHA
DAY Retorna el da de una fecha.
Ejemplo:
Dia = String(Day(2001-04-21)) // retorna 21, convertimos el dato de tipo
nmerico a
cadena, con la funcion string.
DAYNAME Retorna el nombre de da de la semana
Ejemplo:
Cad = DayName(2001-04-22) // retorna Sunday.
DAYNUMBER Retorna el nmero de da de la semana
Ejemplo:
Cad = string(DayNumber(2001-04-22)) // Retorna 1
DAYAFTER Devuelve los das que hay entre dos fechas
Ejemplo
Cad = DayAfter(2001-04-22, 2001-04-18) // retorna -4
HOUR Retorna un entero que corresponde al nmero de horas, que se encuentre en un
dato de
tipo hora
Ejemplo:
Hour(19:12:42) // retorna 19.
MINUTE retorna los minutos
Ejemplo:
Minute(19:42:13) // retorna 42.
MONTH Retorna el nmero correspondiente al mes de una fecha
Ejemplo:
Month(2001-04-22) // retorna 4
NOW devuelve la Hora del sistema
-13-
Power Builder 9.0
Ejemplo
Hora = String(now(),HH:mm:ss) // string(dato,tipo de salida del dato), en este
caso es
hora:minuto:segundo.
RELATIVEDATE Retorna la fecha con respecto a un determinado nmero de da.
Ejemplo:
Date Fecha
Fecha=Relativedate(today(), -25) // la fecha hace 25 das respecto a la fecha
actual.
SECOND Retorna el nmero de segundos.
Ejemplo:
Cad = string(Second(14:13:45)) // retorna 45 expresado en un dato de tipo
cadena.
TODAY Retorna la Fecha y hora del sistema
Ejemplo:
Cad = string(today(),"DD/MM/YY) // retorna una cadena con la fecha del sistema
en un
formato de dd/mm/y yes decir , 12/04/03
YEAR Retorna el ao de una fecha.
Ejemplo
Num = year(today())
-14-
Power Builder 9.0
FUNCIONES NUMRICAS
ABS obtiene el valor absoluto de un nmero
Ejemplo:
Num= (abs(-34) // retorna 34
CEILING Obtiene el menor nmero entero que es menor o igual al nmero especificado
Ejemplo: Donde Deci es una variable de tipo decimal
Deci = String(Ceiling(-4.8)) // retorna 4
COS Obtiene el coseno de un ngulo el ngulo debe estar en radianes
EXP El resultado de un nmero elevado a la potencia.
Ejemplo:
Deci = String(exp(1)) // 2.718
FACT Obtiene el factorial de un nmero
Ejemplo:
Num= Fact(4) // retorna 24
MAX Retorna el mayor de dos nmeros
Ejemplo:
Num = Max(-4,-7) // retorna -4
MIN Menor entre dos nmeros
Ejemplo:
Num = Min(4,7) // retorna 4
MOD Obtiene el residuo de dos nmeros
Ejemplo:
Num = Mod(20,7) //retorna 6
PI (n) multiplica PI(3.1416 por un numero)
Ejemplo:
Deci = Pi(1) // devuelve 3.14159.....
RAND(10) Obtiene un nmero entero aleatorio entre 1 y el nmero especificado
-15-
Power Builder 9.0
Ejemplo:
Num = Rand(10) // devuelve un nmero comprendido entre el 1 a 10
RANDONMIZE(0) Randomize Regenera o inicializa el nmero aleatorio generador.
Ejemplo:
Randomize(0)
ROUND Obtiene el nmero entero comprendido en un nmero decimal
Ejemplo:
Num = Round(3.598,0) // devuelve 4
-16-
Power Builder 9.0
Aplicaciones
DFU (Funciones Defindas por el Usuario).
Pueden ser a nivel de Ventana o a nivel de toda la aplicacin
Ejemplo: Ingresar un monto en soles y lo convierta a letras
por ejemplo si:
Funciones a crear
Es ms simple hacer la conversin trabajando con vectores
Paso 1.- Declarar a nivel de instancia (Pestaa Instancia)
Declare Instancia
String 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"}
Em_1 control de
edicion
Mle_1 Contol de
mltiple linea
F_centena
Num=345
Devuelve en letras:
Trescientos cuarenta y cimco
F_mil
F_mill
Num
Letra
Num
Tipo int
Letra
-17-
Power Builder 9.0
Paso 2.- Crear las funciones: NumLetras (a nivel de ventana)
a) Clic en (Insert) del men principal.
b) Clic en (Function).
a) Tipo de acceso a la funcin.
b) Tipo de dato de retorno.
c) Nombre de la funcin.
d) Tipo de datos que se va a referenciar, en este caso ser un valor.
e) Tipo de dato del valor.
En la ventana de cdigo, tipeamos la siguiente estructura:
String cad1,cad2
Int c,res,d,uni
c=num/100
res= mod(num,100)
if c>0 Then
if c=1 and res=0 then cad1="Cien" else cad1=vec4[c]
end if
choose case res
case 1 to 9
cad2=vec1[res]
case 11 to 19
cad2=vec2[res - 10]
case 10, is >=20
d=res/10
uni=mod(res,10)
if uni=0 then
cad2=vec3[d]
else
cad2=vec3[d]+ " y "+ vec1[uni]
end if
end choose
return cad1 + cad2
b a c f d g
-18-
Power Builder 9.0
Funcion miles
Tipeamos el siguiente cdigo:
String cad1,cad2
Int res,mil
mil=num/1000
res= mod(num,1000)
if mil>0 then
if mil=1 then cad1="Mil " else Cad1=f_centena(mil)+" Mil"
end if
if res>0 Then
cad2=f_centena(res)
end if
return cad1 + " " + cad2
Procedemos a ejecutar la aplicacion y veremos los resultados.
-19-
Power Builder 9.0
FUNCIONES APLICADAS A CONTROL DATA WINDOWS
Estructura de un Datawindows
Datawindows.- Es una carateristicas ms importante del Power Builder. El DataWindows
es la forma en que sus aplicaciones presentan los datos de la base de datos y quizas
incluso datos no especficamente de una base de datos al usuario final; DataWindows
pueden ser pantalla de consulta, formato de entrada de datos, reportes de impresin, etc.
Un objeto DataWindow debe ser insertado con una ventana regular, en todo diseo de un
DataWindow forman parte dos objetos.
1.- DataWindow Object.- que es diseado con el DataWindow Painter.
2.- DataWindow Control.- Es un control donde se insertar el DataWindows Object.
Edit Control
-20-
Power Builder 9.0
Funciones principales de un Datawindows
SetTransObject
Hace que un control DataWindow use un objeto de transaccin especificado por el
programador. El objeto de transaccin proporciona la informacin nesecesaria para
comunicarse con la Base de Datos. Retorna -1 si ha ocurrido un error.
Sintaxis Dwn. Settransobject(Transaccin)
Argument Description
Dwn El nombre del Control data window, con el cual se desea usar un
objeto de transaccin.
Transaccin Nombre del Objeto de transaccin, por defecto es SQLCA.
Generalmente se establece el objeto de transaccin en el evento Open de la ventana
que contiene el control DataWindow.
En resumen el SettransObject(SQLCA) asocia el objeto transacin con el control
DataWindow.
Ejemplo:
DwnSoftware.settransobject(SQLCA)
InsertRow
Inserta una fila en un DataWindow, Si alguna columna tiene valores por defecto, La fila es
inicializada con estos valores, retorna el nmero de la fila que se ha aadido, retorna -1
si ha ocurrido un error.
Sintaxis Dwn.InsertRow(fila)
Argument Descripcion
Dwn El nombre del control DataWindow en el cual se desea insertar una
fila.
Fila Un entero Largo (long) que identifica la fila antes de la cual desea
insertar una fila nueva. Si el valor es cero insertar al final de la
tabla.
Ejemplo:
-21-
Power Builder 9.0
DwnSoftware.InsertRow(0)
Retrieve()
Recupera todas las filas de una tabla de la BDD en un control DataWindow, Si incluyen
argumentos, estos son usados por los argumentos de recuperacion de la sentencia SQL
SELECT del objeto DataWindow. Retorna el nmero de filas recuperadas, -1 si ocurre un
error.
Sintaxis Dwn.Retrieve({Arg1, Arg2,.})
Argument Descripcion
Arg1, Arg2 Argumentos de recuperacion, de la tabla de BDD
Ejemplo:
DwnSoftware.Retrieve("C001)
SetRowFocusIndicator
Especifica el indicador visual que identifica la fila actual en un control DataWindow.
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.
SelectRow
Selecciona 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
-22-
Power Builder 9.0
SetItem
Establece 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.
Tambin en vez del nombre de campo, puede ser el nmero de campo de acuerdo como
ha sido seleccionado en el objeto DataWindow.
GetItemString
Obtiene datos de tipo cadena de un buffer especificado de un control DataWindow.
Sintaxis Dwn.GetitemString (Fila, Columna)
Ejemplo
String cad
Cad=DwnSoftware.GetItemString(3, "sfw_Nombre")
Extrae el dato que se encuentra en el campo sfw_nombre, en la fila 3, dependiendo del
tipo de dato que se va extraer tenemos:
Dwn.GetitemNumber (Fila, columna) Cuando el campo es de manera general
numrico, puede ser real o entero.
Dwn.GetitemDecimal (Fila, columna) Cuando el dato a extraer es exclusivamente
decimal 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 del
empleado, cuya posicin se encuentre en la fila nmero 3.
-23-
Power Builder 9.0
Int edad
Dec Sbas
Date 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.
Gettext
Obtiene el valor de un control de edicion en la fila y columna actuales, antes que este sea
aceptado.
Sintaxis dwn.Gettext ()
Por ejemplo si este radio button se encuentra dentro del DataWindow, y al seleccionar
una de estas opciones se desea saber su valor seleccionado basta emplear:
String Tmoneda
Tmoneda = DwnSalario.Gettext()
Setsort
Especifica, el criterio de ordenamiento para un DataWindow, retorna 1 si tuvo xito y -1 si
se encontro un error.
Sintaxis Dwn.SetSort (campo1 [A|D])
Ejemplo:
DwnEmpleado.setsort()
Dwn.Sort()
-24-
Power Builder 9.0
Ejecuta la clasificacin con un previo criterio de seleccin
Sintaxis 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.
GetRow
Retorna el nmero 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 ()
SetRow
Establece la fila deseada, mueve el cursor a la fila especificada, pero no hace Scroll en el
DataWindow.
Sintaxis Dwn.SetRow (Fila)
ScrollToRow
Hace 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 en
caso 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 nmero total de la fila, se hace scroll a la ltima fila.
RowCount
Obtiene el nmero de filas que se encuentran disponibles en un DataWindow
Sintaxis Dwn.RowCount()
ScrollToRow
Causa que el control se deslice a la fila especificada, cambiando la fila actual, a donde se
le indique.
Sintaxis Dwn.Scrolltorow(fila)
-25-
Power Builder 9.0
ScrollToPriorRow
Se desliza a la fila previa, sin cambiar la columna activa
Sintaxis Dwn.ScrollPriorRow(fila)
ScrollNextRow
Se desliza a la siguiente fila.
Sintaxis Dn.ScrollNextRow(fila)
DeleteRow
Suprime la fila especificada del control DataWindow, se actualiza directamente la tabla
enlazada al control.
Sintaxis Dwn.DeleteRow(fila)
Si la fila es igual a cero, elimina la fila activa donde se encuentra el puntero, cada vez que
se emplee esta sentencia, se tiene que actualizar el DataWindow ejemplo:
Dwn.deleteRow(8) // elimina la fila nmero 8
Dwn.Update() // actualiza la base de datos enlazada
DeletedCount
Retorna el nmero de filas que hayan sido suprimidas desde el control DataWindow pero
que todavia no hayan sido actualizadas en la tabla de la BDD asociada.
Sintaxis Dwn.DeletedCount()
Ejemplo:
Long Nf
Nf=Dwn.DeletedCount()
Update
Se envia a la base de datos todas las inserciones, eliminaciones y actualizaciones del
control DataWindow, retorna 1 si tuvo xito, -1 si ocurrio un error.
Sintaxis Dwn.Update()
-26-
Power Builder 9.0
Utilizacin del Datawindows
El objeto DataWindows en si no es de ninguna utilidad, si no se vincula con un
DataWindow control. Este objeto, es visual y es posible de insertar directamente
en una ventana; para que pueda ser utilizado por el usuario.
Desarrollar la Siguiente aplicacin.
Uso de filtros (Find SetFIlter)
A.- Seleccionamos en el control sueldo el carcter de condicin e ingresamos un
valor numrico que representa al sueldo bsico, luego presionamos clic en el
boton Mostrar y tendremos los requeridos.
B.- Se ingresa solo los primeros caracteres del nombre, si huviera algn registro
que contenga dichos caracteres, deber resaltar el primer registro tal como
observamos en el ejemplo.
A
A
B
-27-
Power Builder 9.0
Pasos 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 del
PowerBuilder)
TABLAS
Ingresar datos consistentes en las tablas creadas, como se muestra a
continuacin:
FACTURA VENDEDOR
Paso 2.- Disear el DataWindow - (File-New-DataWindow)
- Se elige el estilo de Presentacin: (Elegir el Tipo Tabular)
Estructura:
Vendedor:
Codv Char 4 Null(no)
Nomv varchar 30
Sbas Numeric 8,2
Factura
Nfac char 6
Codv char 4
Impor Numeric 8,2
Tipov char 1
-28-
Power Builder 9.0
Presentacin Descripcin
Composite Utiliza como presentacin, un reporte previamente creado.
Freeform La presentacin es libre, cada campo se muestra en una lnea
distinta. Muy utilizado para el ingreso de datos.
Graph Disea un grfico dependiendo de una consulta, esta debe
contener datos relacionados.
Grid Disea una malla de datos en forma columnada, y cada
columna con una justificacin completa.
Group Disea listado por agrupacin de campos. Muy utilizado para
reportes de resumen de informacin.
Label El diseo es de etiquetas, donde Ud. podr elegir el tipo de
etiqueta de las prediseadas, en papel continuo o separado, y
otras opciones.
Rich Text Permite definir una carta con combinacin de campos del
Origen de Datos fijado. Se pueden utilizar todas las
caractersticas del formato de texto RTF.
Tabular Presenta el Origen de Datos en forma columnada pero sin
ajuste total. Permite una mayor libertad en el diseo.
-29-
Power Builder 9.0
Modos de trabajo: (Seleccione SQl Select)
El modo de trabajo define como se trabajara con el Origen de Datos. Existen 5 tipos de
modos de trabajo.
Modo Descripcin
Quick Select Nos presenta las tablas en forma grfica, y solo permite las
sentencias ordinarias de SQL (Sort y Criteria). La primera para
sentencia sirve para poder ordenar por el campo especfico y la
segunda sentencia para indicar registros a mostrar dependiendo
de un valor condicional (Ejemplo: <39)
Sql Select Presenta las tablas en forma grfica, y permite trabajar con
todas las caractersticas de Sql estndar (Sort, Group, Having,
Compute y Where, entre otros)
Query El Origen de Datos es una consulta definida previamente en el
Area de Trabajo Query; esta consulta queda almacenada como
un objeto de PowerBuilder; Ud. debe seleccionar la consulta que
desee utilizar como Origen de Datos de este DataWindows.
External El Origen de Datos no esta relacionado con ninguna Tabla. Ud.
debe definir los campos que interactan (nombre, tipo y tamao)
Utilice los botones 'Add' para aadir un nuevo campo al final de
los ya existentes, el botn 'Insert' le permitir insertar un campo
entre otros y el botn 'Delete' le permitir eliminar el campo
actual.
Stored
Procedure
El Origen de Datos es un procedimiento que ha sido
almacenado en la Base de Datos. Seleccione uno si lo ha
creado, o crelo previamente.
-30-
Power Builder 9.0
Al seleccionar SQL SELECT mostrara la siguiente pantalla:
Seleccione las tablas a usar y precione el boton Open, de inmediato apareceran lasa
tablas seleccionadas
Paso 3.- Seleccione la Tabla Vendedor
Luego Seleccione los campos de la Tabla como se muestra a continuacin:
y al grabar mostrara la siguiente solicitud (control + W):
Presionamos S, para aceptar los cambios
Ud. Puede modificar el color de las columnas y estilo:
La presentacin final ser:(Detallando las siguientes partes opcion View)
-31-
Power Builder 9.0
Teniendo opcin a validar cada campo de ingreso o de salida a traves de sus
propiedades.
Proceda a grabar el objeto DataWindow (almacene en la biblioteca creada y asignarle un
comentario, para determinar cuando se debe de usar dicho DW), tendremos la siguiente
vista:
Color de fondo
del DW
Color del texto
del DW
Color de las
Cabeceras del DW
Estilo de las
cabecera del DW
Estilo del texto
del DW
Preview
Diseo
Propiedades
Columns Specification
-32-
Power Builder 9.0
Una vez Grabado colocarlo en el formulario: (File-New-Project-Window)
A traves de la caja de herramientas.
Controles DataWindows (dw_1, dw_2), como se observa acontinuacin:
Dw_1
Dw_2
ddplb_1
-33-
Power Builder 9.0
Objeto DataWindow Control (Caja de Herramientas)
El Objeto DataWindow Control se selecciona del listado de objetos que se pueden
insertar en una ventana, simplemente haga un clic sobre el siguiente icono .
Luego haga un clic en la posicin de la ventana, donde desea poner el
DataWindow Control.
Paso 4.- En el control ddplb ingresamos los siguientes tems:
Paso 5.- Codificar en el control ventana1, evento open(), lo siguiente
//establece las conexiones con los Objetos DataWindows
dw_1.settransobject(sqlca)
dw_2.settransobject(sqlca)
//carga los datos en el buffer
dw_1.retrieve()
dw_2.retrieve()
Nombre por defecto del Control
DataWindow.
Seleccionar el Objeto DataWindow,
previamente creado.
Propiedades complementarias al
control DataWindow.
-34-
Power Builder 9.0
//ordena el DataWindow por el campo nombre ascendentemente.
dw_1.setsort ("#1 a")
dw_1.sort()
//establece las posiciones de orden, segun el TABULADOR
sle_1.taborder=0
ddplb_1.taborder=1
sle_2.taborder=2
cb_1.taborder=3
dw_1.taborder=4
dw_2.taborder=5
//limpia las cajas de texto
sle_1.text=""
sle_2.text=""
//establece el foco del cursor
sle_1.setfocus()
//posiciona en el primer item del ddplb (combobox)
ddplb_1.selectitem(1)
Paso 6.- Codificar en el control sle_1, evento modify(), lo siguiente
//declaramos las siguientes variables
string busca
int nf,r
//preguntamos si se ha escrito algna letra en el control sle_1
If len(sle_1.text)>0 then
//almacenamos en la variable busca la siguiente sentencia
busca="Nomv like '" + trim(sle_1.text) + "%' "
//contamos el nmero de filas del control DW
nf=dw_1.rowcount()
//realizamos la busqueda de la sentencia ya antes almacenada
r=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 encontrada
dw_1.selectrow(0,false)
dw_1.selectrow(r,true)
dw_1.scrolltorow(r)
-35-
Power Builder 9.0
end if
end if
Paso 7.- Codificar en el control sle_1, evento modify(), lo siguiente
STRING cad
// la funcion Trim suprime los blancos
cad = "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 siguiente
int r
r=dw_1.getrow()
dw_1.selectrow(0,false)
dw_1.selectrow(r,true)
Script a Nivel de la Aplicacin:
// Profile Venta
SQLCA.DBMS = "ODBC"
SQLCA.AutoCommit = False
SQLCA.DBParm = "Connectstring='DSN=venta'"
//nos conectamos con la Base de Datos
connect;
//preguntamos si ha ocurrido un error en la conexin
If Sqlca.Sqlcode<>0 then
Messagebox ("Error de Conexin",Sqlca.SqlErrText)
Halt
else
//abrimos la ventana 1 de nuestro proyecto
open(ventana01)
end if
Esta conexin se puede traer desde el entorno de la BDD
-36-
Power Builder 9.0
Clic en el
siguiente icono
y obtendremos
la siguiente
ventana
Clic en el boton Edit.
Clic en la siguiente pestaa
Obtendremos la siguiente vista
-37-
Power Builder 9.0
Copie el contenido en la aplicacin.
Lugo proceda a ejecutar el programa
DataWindow Retrieval Arguments con Campos Calculados
Aplicacin.
Mostrar las Facturas por cada vendedor, se ingresa por teclado el cdigo 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 necesite
en la consulta como se observa a continucacin:
Paso 3.- Del men de opciones seleccionar Design, luego seleccionar Retrieval
Arguments.
-38-
Power Builder 9.0
Colocar la variable receptora, a travs de esta variable ingresar un cdigo y proceder
h realizar la bsqueda en el DataWindow.
Paso 4.- En la opcin Where seleccionar el campo para realizar la condicin con la
variable definida anteriormente, la variable debe ser precedida por dos puntos(:Var)
Observe el grafico
Luego Pulse ctrl. + W
Nombre de la Variable
Tipo de dato que
recibirla variable
-39-
Power Builder 9.0
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).
Cada campo tiene un conjunto de propiedades que se muestran en la parte lateral
derecha, dar forma a la presentacin de la consulta moviendo las cabeceras y etiquetas
de cada campo de la siguiente manera:
1 2 3
-40-
Power Builder 9.0
Para ver como esta saliendo el diseo puede comprobarlo mediante la opcin Row del
men principal y seleccionando Retrieve, para ello le pedir ingresar un cdigo de
vendedor.
Paso 6.- Completar los campos de comisin, comisin total y pago total a travs de las
opciones del men principal: Insert submenu Control opcion Compute Field.
-41-
Power Builder 9.0
Al seleccionar esta opcin Computed Field , llevar el cursor en la posicin donde desea
colocar el calculo de la comisin (Detail), luego mostrara la ventana de Modify Expresin
donde colocara la expresin para la comisin , para facilitar la edicin de esta expresin
haga un Clic en los campos mostrados en Columns.
Codificar la siguiente sentencia, para determinar la comisin del empleado, si tipo de
empleado es "A en tonces su comisin 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 seccin resumen, para colocar el total del campo calculado comisin y pago
total.
-42-
Power Builder 9.0
Para la suma del comisin marcar el campo calculado comisin, similar al Paso 6 Insert
Control- Elegir Sum, entonces autmicamente mostrara el campo sumado en name
colocar el nombre (Tcom).
Para el calculo pago total, de forma similar seleccionar el paso anterior seleccionar
Insert-Control-Computed Field y editar la siguiente expresin.
Luego complete las etiquetas, para mostrar la objeto DataWindow final.
Grabarlo como Data01.
-43-
Power Builder 9.0
Paso 8.- Luego Inserte un formulario o ventana para colocar el DataWindow, la
presentacin final sera:
Grabar la ventana con el nombre de Ventana01
Paso 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 Cad
Cad=Trim(Sle_1.text)
If Dw_1.Retrieve(Cad) =0 Then // Sino se recupera ninguna fila
MessageBox(" Error, "Cdigo no existe, verificar,information!)
End if
En la aplicacin hacer la conexin con la BDD
// Profile Venta
SQLCA.DBMS = "ODBC"
SQLCA.AutoCommit = False
SQLCA.DBParm = "Connectstring='DSN=venta"
connect;
-44-
Power Builder 9.0
If Sqlca.Sqlcode<>0 then
Messagebox ("Error de Conexin",Sqlca.SqlErrText)
Halt
else
open(ventana01)
end if
Mantenimiento de una BDD
Utilizar la tabla vendedor agregando los campos feing (fecha de ingreso) y grado (grado
de estudios).
Realizar tambin las validaciones correspondientes en cada campo:
Paso 1.- crear una funcin a nivel de la aplicacin (file-new-project-Function)
-45-
Power Builder 9.0
Paso 2.- Crear el DataWindow estilo FreeForm de la tabla vendedor y realizar las
validaciones respectivas en cada campo, aunque es opcional dependiendo del proyecto
que este elaborando.
Al campo grado editarlo como un combo:
1. Seleccione dicho campo y en propiedades seleccionar la pestaa EDIT.
2. En tipos de estilos existen seis tipos, seleccione DropDownListBox.
3. Marca el check Always Show Arrow, para que tenga el aspecto de un combo.
4. Ingrese 3 valores en la grilla (code Table) como se muestra en el grfico.
Observe como se incorpora la funcin en el campo a nivel de columnas, specificaciones,
si desea una rea ms amplia hacer doble click en Validation Expresin.
-46-
Power Builder 9.0
5. Ademas dar formato de fecha y formato monetario a los campos: fecha de ingreso
y sueldo bsico; en la misma propiedad Edit pero seleccionado EDIT MASK en
Style Type.
Paso 3.- Disear el siguiente Formulario:
Nombre de la Ventana: Ventana02
-47-
Power Builder 9.0
Nombre de la Ventana: Ventana03
Script Open for aplicacin
// Profile Venta
SQLCA.DBMS = "ODBC"
SQLCA.AutoCommit = False
SQLCA.DBParm = "Connectstring='DSN=venta"
connect;
If Sqlca.Sqlcode<>0 then
Messagebox ("Error de Conexin",Sqlca.SqlErrText)
Halt
else
open(ventana02)
end if
Script clicked for pb_pri
Dw_1.Scrolltorow(1)
Dw_1.Setfocus()
-48-
Power Builder 9.0
Script clicked for pb_ant
Dw_1.ScrollPriorRow()
Dw_1.Setfocus()
Script clicked for pb_Sgte
Dw_1.ScrollNextRow()
Dw_1.Setfocus()
Script clicked for pb_Ult
long nf
nf=dw_1.rowcount()
dw_1.scrolltorow(nf)
dw_1.setfocus()
Script clicked for Cb_Nuevo
Int Nf
long nf
nf=dw_1.insertrow(0)
dw_1.scrolltorow(nf)
dw_1.setfocus()
dw_1.setcolumn("codv")
cb_graba.enabled=true
Script clicked for Cb_graba
int res
res=dw_1.update()
if res=1 then
commit using sqlca;
//cd_recupera.enabled=false
else
rollback using sqlca;
end if
cb_recupera.triggerevent(clicked!)
cb_graba.enabled=false
End if
Script clicked for Cb_Anula
long nf
nf=dw_1.getrow()
if nf>0 then
dw_1.deleterow(nf)
dw_1.update()
dw_1.scrolltorow(1)
end if
cb_recupera.triggerevent(clicked!)
cb_anula.enabled=false
Script clicked for Cb_Recupera
Dw_1.Retrieve()
-49-
Power Builder 9.0
cb_graba.enabled=false
cb_recupera.enabled=false
Script clicked for Cb_Busca
open(ventana03)
Script clicked for Cb_Recupera
dw_1.setfilter("")
dw_1.filter()
dw_1.setsort("#1 A")
dw_1.sort()
dw_1.retrieve()
cb_graba.enabled=false
Script clicked for Cb_Salir
Halt
Paso 4.- En la ventana 03 codificar los siguientes script
Script Load for Ventana03
sle_1.text=""
sle_1.setfocus()
Script Modify for sle_1
string cad
long nf
nf=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 then
ventana02.dw_1.setfilter("")
ventana02.dw_1.filter()
ventana02.dw_1.setsort("#1 A")
ventana02.dw_1.sort( )
ventana02.dw_1.scrolltorow(nf)
messagebox("Error","Cdigo no existe" + string(nf))
else
close(ventana03)
ventana02.cb_graba.enabled=true
ventana02.dw_1.setfocus()
ventana02.dw_1.setcolumn(1)
end if
-50-
Power Builder 9.0
Elaboracion de una factura
Tablas Bsicas para la elaboracin de la factura
Los Script para cada evento
1.- W_Factura Open
dw_1.settransobject(sqlca)
dw_fac.Settransobject(Sqlca)
dw_1.retrieve(" ")
Cb_Nueva Clicked
int f
select max(Nfac) into :xfac from fac_cab;
if isnull(xfac) then
-51-
Power Builder 9.0
xfac=0
end if
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_dwnkey
Dw_1 Tecla (Keycode Key,UnsignedLong Keyflags)
if keydown(keyf2!) then
int f
f=dw_1.insertrow(0)
dw_1.scrolltorow(f)
dw_1.setfocus()
int m
m=dw_1.getitemnumber(1,"maxitem")
if isnull(m) then
m=0
end if
m++
dw_1.setitem(f,"item",m)
dw_1.setitem(f,"nfac",string(xfac,"000000"))
open(w_pro)
end if
Cb_Borrar Clicked
//Borrar Item
int fila
fila=dw_1.getrow()
-52-
Power Builder 9.0
if fila>0 then
dw_1.deleterow(fila)
dw_1.update()
end if
Cb_Totaliza Clicked
dec tot,igv,neto
tot=dw_1.getitemnumber(1,"totgen")
igv=tot*0.18 ; neto=tot+igv
st_venta.text=string(tot,"##,###.00")
st_igv.text=string(igv,"#,###.00")
st_neto.text=string(neto,"###,###.00")
Cb_Graba Clicked
//Compleatar los campos para La tabla Fac_Cabe
dw_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 r
r=dw_fac.Update()
if r=1 then
commit;
else
Rollback;
end if
// Grabacion del detalle Factura
r=dw_1.update()
if r=1 then
Commit;
Else
Rollback;
End if
// Actualizar La tabla Stock
int Fila,xcan
String Xcod
For Fila=1 to Dw_1.Rowcount()
Xcod=Dw_1.GetItemString(fila,"codpro")
Xcan=Dw_1.GetItemNumber(Fila,"can")
Update Fac_deta
Set Stock = Stock - :Xcan Where Codpro= :Xcod;
Next
Commit;
Dw_pro Activate ( en la ventana de consulta de productos)
sle_1.setfocus()
dw_1.retrieve()
Dw_pro Open
dw_1.settransobject(sqlca)
-53-
Power Builder 9.0
Dw_1 Tecla(Keycode Key, UnsignedLong KeyFlags)
int r
dec precio
if key=keyenter! then
r=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)
close(parent)
end if
if key=keyescape! then
dw_1.setfilter("")
dw_1.filter()
sle_1.text=""
sle_1.setfocus()
end if
Sle_1 Modified
string criterio
criterio=" upper(Despro) Like '"+upper(sle_1.text)+"%'"
dw_1.setfilter(criterio)
dw_1.filter()
dw_1.setfocus()
dw_1.selectrow(1,true)
-54-
Power Builder 9.0
Aplicacion
Considerando que tenemos el mantenimiento de la tabla cursos, al realizar un click en el
boton Alumnos, se carga la ventana de alumnos, pero solo se mostrarn los datos de
aquellos alumnos de dicho curso (Fila activa de la Tabla Cursos).
Para la Ventana alumnos elaboramos:
Un Objeto DataWindow
Data Source SQL Select
Style Tabular
Nombre Dw_Notas
Luego 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 campo
utilizado como argumento.
Paso 3.- En la Ficha Where se debe especificar, la relacion entre el campo y la variable
-55-
Power Builder 9.0
Paso 4.- Luego especifique La creacion del Obejeto Estructura, utilizando (Structure
painter) del Menu Principal(Power Bar)
File New pestaa PB Object - Structure.
En la venta de dialago, especifique:
Codigo_Curso de tipo String
Nombre_Curso de Tipo de string
Se debe almacenar como S_curso
Paso 5.- En la ventana alumnos (VenAlumnos)
Declarar una variable de instancia
String vi_codcur
Paso 6.- Codificacin de eventos para obtener la lista de los alumnos por curso.
Se realiza a traves de un boton de la ventana Cursos VenCursos (Mantenimiento de
cursos).
La ventana VenAlumnos debe recibir el parametro (cdigo del curso), que se envia desde
la Ventana VenCursos.
Paso 7
Script -Clicked for Cb_alumnos (W_cursos)
long nf
S_curso Origen //asignamos una variable llamada origen de tipo S_curso
nf=dw_1.getrow()
origen.codcur=dw_1.getitemstring(nf,"cur_cod")
origen.nomcur=dw_1.getitemstring(nf,"cur_des")
openwithparm (VenAlumnos,origen)
paso 8
Script -Open for (VenAlumnos)
S_curso Destino
Destino=message.powerobjectparm
vi_codcur=Destino.codcur
this.title=vi_codcur + " - " + Destino.nomcur
cb_graba.enabled=false
dw_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~t
if(alu_pro>=11,RGB(0,0,255),RGB(255,0,0))'")
Paso 9.- Codificacion de los botones de desplazamiento
-56-
Power Builder 9.0
Script clicked for pb_pri
Dw_1.Scrolltorow(1)
Dw_1.Setfocus()
Script clicked for pb_ant
Dw_1.ScrollPriorRow()
Dw_1.Setfocus()
Script clicked for pb_Sgte
Dw_1.ScrollNextRow()
Dw_1.Setfocus()
Script clicked for pb_Ult
Int nf
Nf=dw_1.RowCount()
Dw_1.Scrolltorow(Nf)
Dw_1.Setfocus()
Script clicked for Cb_Nuevo
long nf
nf=dw_1.insertrow(0)
dw_1.scrolltorow(nf)
dw_1.setitem(nf,"cur_cod",vi_codcur)
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=true
Script clicked for Cb_graba
long res
res=dw_1.update()
if res=1 then
commit using sqlca;
// cb_graba.enebled=false
else
rollback using sqlca;
end if
dw_1.retrieve(vi_codcur)
dw_1.scrolltorow(1)
Script clicked for Cb_Anula
long nf
nf=dw_1.getrow()
if nf>0 then
dw_1.deleterow(nf)
-57-
Power Builder 9.0
dw_1.scrolltorow(1)
end if
Script clicked for Cb_Recupera
dw_1.retrieve(vi_codcur)
cb_graba.enabled=false
Script RowFocusChanged For Dw_1
// evento que se activa cada vez que se enfoca un nuevo registro
long nfilas,fact
nfilas=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 columna
int nc
nc=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,pro
dw_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 nombre
if isnumber(dw_1.gettext()) then //si no es numerico, mantiene el foco el el campo
nota=dec(dw_1.gettext())
if nota<0 or nota>20 then
messagebox("Error","El dato debe estar en un rango de 0 a 20")
return 1
end if
if dw_1.accepttext()=1 then
n1=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)/4
dw_1.setitem(row,"alu_pro",pro)
Cb_graba.enabled=true
end if
end if
-58-
Power Builder 9.0
Script ItemError For Dw_alumnos
Return 1
PRIMERA PRCTICA CALIFICADA
1. Especificaciones de la aplicacin
Creadas las tablas con sysbase SQL Anywhere para almacenar las facturas de los
clientes
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_prod
Clave Foranea Num_fact
Clave Foranea Cod_Prod)
Relacione las tablas con sus respectivas Claves.
Los registros para cada tabla se adjunta a este proyecto.
2.- La aplicacin 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 los
siguientes controles DataWindow: (VConFacturas)
3.1 DW_Clientes (estilo Grid), donde solo debe mostrar los campos
(Cod_cli,Nom_Cli,Tel,Ruc)
3.2 Dw_Facturas (estilo Tabular), donde debe mostrar las columnas (Num_fact,
Fecha, Subtotal, Igv, total).
3.3 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 total
general.
3.4 La ventana (VConFacturas) tendra un boton Detalle donde permite visualizar en
otra ventana( VFacDetalle) el detalle de la factura
3.5 Ventana (VFacDetalle) debe mostrar todos los campos de la tabla detalle factura
con el campo descripcion del producto (tabla producto).
-59-
Power Builder 9.0
Nota.- El diseo de la aplicacin es a criterio del alumno.
Su presentacion y estetica tambin se considera.
Aplicacin Cuenta Corriente
Esta aplicacin permite generar un campo en este caso es el nmero de movimiento y
actualizar el saldo en el archivo ahorro.
-60-
Power Builder 9.0
Script open for aplicacin:
// Profile conexion con sqlserver
SQLCA.DBMS = "MSS Microsoft SQL Server 6.x"
SQLCA.Database = "BDBANCO"
SQLCA.ServerName ="(local)"
SQLCA.LogId = "SA"
SQLCA.AutoCommit = False
SQLCA.DBParm = ""
CONNECT;
if sqlca.sqlcode<>0 then
messagebox("Error de coneccion",sqlca.sqlerrtext)
halt
end if
open(Venahorro)
Script modified for Sle_1
int r,vnro,fila,xnro,nf
string cad
cad=trim(sle_1.text)
dw_1.settransobject(sqlca)
r=dw_1.retrieve(cad)
if r<1 then
messagebox("Error","Nro de cuenta no existe")
else
nsal=dw_1.getitemnumber(r,"saldo")
dw_2.settransobject(sqlca)
dw_2.retrieve(cad)
/*
if nf>0 then
xnro=integer(dw_2.getitemstring(1,"maximo"))+1
else
xnro=1
end if
*/
select count(numcta) into :xnro
from movimiento
where numcta=:cad;
if sqlca.sqlcode=0 then
xnro++
end if
fila=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
-61-
Power Builder 9.0
Script Itemchanged for Dw_2
string nomcol
int fila
dec mon
char tp
fila=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 datawindow
tp=this.gettext() // valor que se da en el edit control
nsal=dw_1.getitemnumber(dw_1.getrow(),"saldo")
if upper(tp)="D" then
nsal=nsal + mon
else
nsal=nsal - mon
end if
this.object.tsaldo.text=string(round(nsal,2))
end choose
scrpt Clicked for Cb_graba
int r
string cad
cad=dw_1.getitemstring(dw_1.getrow(),"numcta")
// Actualizacion en el archivo ahorro
//modo 1
//dw_1.setitem(1,"saldo",nsal)
//dw_1.update()
//modo 2
Update ahorro
set saldo = :nsal
where numcta=:cad;
r=dw_2.update()
if r=1 then
commit;
else
rollback;
end if
// borrar el contenido de los control data window
dw_2.reset()
dw_1.reset()
-62-
Power Builder 9.0
SEGUNDA PRCTICA CALIFICADA
Se requiere un programa para automtizar las ventas de pasajes areos, para ello se
cuenta con las siguientes tablas:
Base de datos Vuelos DB
Tablas:
Rutas tipo Long Texto
Cod_rut Char 4 Codgo de ruta
Nom_rut Varchar 15 Nombre de ruta
Pago_cho Numeric 6 1 pago por viaje al chofer
Viajes tipo Long Texto
Nro_via Char 6 Nro de Viaje
Cod_rut Char 4 Codigo de ruta
Fsal_via Date Fecha de salida
Hsal_via Time Hora de Salida
Cos_via Numeric 6 1 Costo del Viaje
Nro_vac Numeric 3 Nro de vacantes
Cod_cho Char 4 Codigo del Chofer
Flag Char 1 S(si) N(no) viaje realizado
Pasajeros tipo Long Texto
Nbol Numeric 5 Numero de Boleto
Nrovia Char 6 Nro de Viaje
Nom_pas Varchar 25 Nombre del pasajero
Tipo Char 1 (E)studiante (A)dulto (N)io
Pago Numeric 6 1
Chofer tipo Long Texto
Cod_cho Char 4 Codigo del Chofer
Nom_cho Varchar 25 Nombre del chofer
Sba_cho Numeric 6 1 Sueldo basico
Realizar:
1.- Colocar las claves principales y forneas para cada tabla, cuando relacione cada tabla
conformar la opcion:
Delete any Dependent Rows (CASCADE), por ejmplo cuando se anule un registro en
viaje anule a todos los pasajeros.
2.- La aplicacin debe permitir realizar el manteniemiento para cada tabla
-63-
Power Builder 9.0
3.- En el mantenimiento del archivo de viajes debe tener un botn de Pasajeros de tal
modo 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 la
ventana anterior(ambos de estilo tabular), el pasajero tendra un descuento de acuerdo
al tipo :
Estudiante 30%
Nio 50%
Adulto 0%
El nro de viaje se genera AA9999 los primeros 2 digitos ao del sistema y los cuatro
ltimos digitos un correlativo.
Para el DataWindow de viaje el campo codgo de ruta y codgo del chofer debe
incorporarse un DataWindow para cada uno, para que su seleccin sea ms explcita.
El nmero de Boleto se genera a partir del 00001 de manera correlativa
Luego de cada adicion de pasajeros las vacantes en ese viaje debe disminuirse en la
unidad.
4.- Consulta de viajes por chofer, debe mostrarse en una ventana.
La lista de Choferes, al seleccionar uno de ellos, deber presentar los viajes
realizados, al final debe aparecer su pago total
5.- Consulta de viajes por rutas. En esta ventana; al elegir una ruta (en un control
DataWindow) debe mostrar todos los viajes programados (en otro control data) al
seleccionar el viaje debe mostrar la relacion de pasajeros.
6.- Consulta de viajes por fecha, en esta ventana se debe ingresar dos fechas: fecha
inicial y final en caso que solo se ingrese la fecha inicial se debe tomar hasta la ltima
fecha 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 diseo y presentacin de cada ventana es de acuerdo a criterio del alumno.
Nota
Eeste trabajo es para 2 semanas de laboratorio, sera revisado cada avance.
Trabajo en forma grupal, solo se tomara en cuenta a los alumnos regulares.
-64-
Power Builder 9.0
Objetos de Usuario
Tema Custom Clases Visuales
Por ejemplo se desea realizar el siguiente evento de usuario:
Paso 1.- En New seleccionar PB OBJECT
Seleccionar Custom Visual
El cual va a mostrar una pantalla similar a la window estndar, para disear su plantilla:
Realizar el siguiente diseo: tiene dos controles etiquetas, uno encima de otro, uno con
fondo blanco y el otro con fondo azul, una tercera etiqueta para ver el porcentaje del
proceso.
ST_1 ST_2
-65-
Power Builder 9.0
St_pg (para ver el porcentaje)
Codificacin del uo_progreso
Declare Instancia
Int Ir_alfinal
Functions Uf_iniciar(int vini) return none
ir_alfinal=vini
st_2.width=0
Functions Uf_avance(integer valor) return none
Int porcen, ancho
Real razon
Ancho=st_1.width
Razon=valor / ir_alfinal
Porcen=round(razaon*100,0)
St_pg.text= string(valor)+ ' de ' +string(ir_alfinal)+ '-'+ string(porcen)+%
-66-
Power Builder 9.0
Clases
Crear las siguientes clases de Objetos de usuarios
1.- Los Visuales
a) Un Progres segn se muestra en la figura
b) Un control para desplazamiento de paginas y de Impresin
c) Colocando una caja de texto que permita adicionar o restar das a una fecha a
travs de Vscroll
d) Colocando dos listBox , al desplazarse en uno de ellos que se encuentre
sincronizado
e) Pasando una cadena a una etiqueta que dicha cadena sea tipo Blink
f) Colocando un cuadro texto que solo acepte letras y espacios en Blanco.
2.- No Visuales
a) Una funcin que permita sumar una columna numrica, se pasa como valor el
control DataWindow y el nmero de columna.
b) Un evento que permita centrar una ventana, se pasa como valor una ventana.
c) Una funcin que permita generar un cdigo, se pasa como dato un control
DataWindow, el valor inicial del cdigo, el cdigo puede empezar con una letra o
nmero.
d) Un evento que permita cambiar el color de una columna de un control
DataWindow, pasar como dato el control DataWindow y el nmero de columna.
-67-
Power Builder 9.0
Capitulo de Graficos en Power Builder
Es un estilo de un DataWindow, pero tambin se pueden efectuar grficos a travs del
control graph.
Pasos para crear un grafico.
-68-
Power Builder 9.0
Aplicacin
Se tiene las Base de Datos (EMPRESA), que tiene las siguientes tablas:
Realizar el grafico como se muestra en la figura.
Para ello Disear los siguientes DataWindow
Datawindow Tablas Campos Category Values Retrieval
Arguments
Datag01 Departamento
y Salarios
Nom_dept,
Cod_emp
Nom_dept Count(Cod_emp)
Datag02 Departamento
y Salarios
Cod_emp,sueldo Cod_emp Sueldo Nom_dept
Datag03 Empleado Todos Cod_emp
Data01 y Data02 son estilos graficos, mientras Data03 estilo freeform
-69-
Power Builder 9.0
Aplicar las propiedades correpondientes a los mencionados DataWindows
Al hacer Click en un empleado mostrar una ventana con sus datos personales, como se
muestra en el ejemplo
Laura
Moreno Lee
-70-
Power Builder 9.0
Script open for Aplicacion
// Coneccion con la Base de Datos
// Profile conexion con sqlserver
SQLCA.DBMS = "MSS Microsoft SQL Server 6.x"
SQLCA.Database = "Empresa"
SQLCA.ServerName ="(local)"
SQLCA.LogId = "SA"
SQLCA.AutoCommit = False
SQLCA.DBParm = ""
connect;
open(VenEstadistica1)
Script open for ventana VenEstadistica1
dw_1.settransobject(sqlca)
dw_2.settransobject(sqlca)
dw_1.retrieve()
Script Cliked for dw_1 (VenEstadistica1)
GrObjectType ClickedObject
string nomdept,nomgraf="gr_1"
int v_series,v_categoria
ClickedObject=This.ObjectAtPointer(nomgraf,v_series,v_categoria)
if ClickedObject=Typedata! or ClickedObject=TypeCategory! then
nomdept= this.CategoryName(nomgraf,v_categoria)
string cad
cad="EMPLEADOS EN "+nomdept
dw_2.modify("gr_1.title='"+cad+"' ")
dw_2.retrieve(nomdept)
Else
Messagebox(parent.title,"Click en departamento para ver empleados")
end if
Script Cliked for dw_2 (VenEstadistica1)
GrObjectType ClickedObject
string nomgraf='gr_1'
int v_series,v_categoria
string id_emp
ClickedObject=This.ObjectAtPointer(nomgraf,v_series,v_categoria)
-71-
Power Builder 9.0
if ClickedObject=Typedata! or ClickedObject=TypeCategory! then
id_emp= this.CategoryName(nomgraf,v_categoria)
openwithparm(venfichae,id_emp)
Else
Messagebox(parent.title,"Click en departamento para ver Detalle de empleado")
end if
Open for VenFichaEmp
string cod
dw_1.settransobject(sqlca)
cod=message.stringparm
dw_1.retrieve(cod)
Script Cliked for cb_1 (VenFichaEmp)
close(venfichae)
Aplicacin Formularios MDI y Objetos de Usuario.
En esta aplicacin se ha utilizado Ventanas con herencia (inheret) donde la ventana
w_sheet-dw es la ventana padre que contiene funciones definidas por el usuario
Creacin de Objetos de Usuario empleado para contener controles de tipo general que
seran empleados, por las otras ventanas descendientes (w_alumnos y W_cursos);
ademas se han elaborado las funciones de objeto usuario con la finalidad de generalizar
las 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:
-72-
Power Builder 9.0
2.1 Crear un menu02 heredado(inheret) del menu01
3.- Elaborar las siguientes Ventanas:
3.1 Ventana W_frame aquel que va a contener el menu01 y el objeto de Usuario
Creado en el punto 1
3.2 Ventana W_sheet_dw ventana padre que contiene un control datawindow(dw_1)
sin relacionar a ningun objeto datawindow
3.3 Ventana W_alumno heredado de la ventana (W_sheet_dw) y relacionarlo con el
menu02
3.4 Ventana W_cursos heredado de la ventana (W_sheet_dw) y relacionarlo con el
menu02
4.- Creacion de eventos:
4.1 Anivel de objeto de Usuario
Variable Instancia
Datawindow idw_udo
4.2 Funcion de Objeto de usuario
Uf_setdw(datawindow dw_parm)
idw_udo=dw_parm
4.3 Script Clicked for Cb1
idw_udo.scrolltorow(1)
idw_udo.setfocus()
4.4 Script Clicked for Cb2
idw_udo.scrollnextrow()
idw_udo.setfocus()
4.5 Script Clicked for Cb3
idw_udo.scrollPriorRow()
idw_udo.setfocus()
4.6 Script Clicked for Cb4
int nf
nf=idw_udo.rowcount()
idw_udo.scrolltorow(nf)
idw_udo.setfocus()
4.7 Script Clicked for Cb5
idw_udo.retrieve()
idw_udo.triggerEvent(rowfocusChanged!)
idw_udo.setfocus()
4.8 Script Clicked for Cb6
int nf
nf=idw_udo.insertrow(0)
idw_udo.scrolltorow(NF)
idw_udo.setfocus()
-73-
Power Builder 9.0
4.9 Script Clicked for Cb7
int r
r=idw_udo.update()
if r=1 then
commit;
else
rollback;
end if
5.- Eventos para la ventana W_frame
Script Risize for w_frame
int 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.MicroHelpHeight
mdi_1.Move (0, uo_1.y + uo_1.height)
mdi_1.Resize (nWidth, nHeight + 4)
6.- Evento para la ventana W_sheet_dw
declarar la Variable Instancia
w_frame iw_frame
integer i_row
6.1 Script activate for w_sheet_dw
iw_frame.uo_1.uf_setdw(dw_1)
6.2 Script open for w_sheet_dw
iw_frame=This.parentwindow()
dw_1.settransobject(sqlca)
6.3 Script Ue_cascada for w_sheet_dw
iw_frame.arrangeSheets(cascade!)
6.4 Script Ue_Horizontal for w_sheet_dw
iw_frame.arrangeSheets(tile!)
6.5 Script Ue_totalw for w_sheet_dw
iw_frame.arrangeSheets(layer!)
6.6 Script Ue_vertical for w_sheet_dw
iw_frame.arrangeSheets(tilehorizontal!)
6.7 Script rowfocuschanged for dw_1
-74-
Power Builder 9.0
i_row=this.getrow()
if i_row<1 then return
this.selectrow(0,false)
this.selectrow(i_row,true)
7.- Eventos para el menu01
7.1 Script m_alumnos for dw_1
window lw_win
opensheet(lw_win,"w_alu",parentwindow,0,layered!)
7.2 Script m_cursos for dw_1
window lw_win
opensheet(lw_win,"w_cursos",parentwindow,0,layered!)
7.3 Script m_vertical for menu01
parentwindow.triggerEvent("ue_vertical")
7.4 Script m_horizontal for menu01
parentwindow.triggerEvent("ue_horizontal")
7.5 Script m_cascada for menu01
parentwindow.triggerEvent("ue_cascada")
7.6 Script m_totalw for menu01
parentwindow.triggerEvent("ue_totalw")
7.7 Script m_close for menu01
close(parentwindow)
7.8 Script m_salir for menu01
Halt
TERCERA PRCTICA CALIFICADA
Elaborar la BDD Matriculas DB, cuyas tablas son:
ALUMNOS
Campo Tipo Descripcin
Codal C(6) Cdigo
NomAl C(15) Nombre
Ape C(15) Apellido
Femat Date Fecha de Matricula
CURSOS
Campo Tipo Descripcin
CodCur C(4) Cod. Curso
NomCur C(15) Asignatura
NHrCur N Nro de Horas
-75-
Power Builder 9.0
NOTAS
Campos Tipo Descripcion
Codal C(6) Cdigo Alumno
Codcur C(4) Curso
Exp N Ex. Parcial
Exf N Ex . Final
Establecer los campos principales y las claves Forneas
Se Pide elaborar:
1) La Observacin Mostrar aprobado (Azul) desaprobado (rojo), el examen final es
de Peso Doble.
2) Hacer una consulta por apellido , para ello digitara solo los primeros caracteres de
un apellido y en un DataWindow de tipo tabular mostrara a todos los alumnos que
comienzan con esos caracteres
3) Consulta por curso, Se ingresara por teclado El cdigo o Nombre de Curso luego
en un DataWindow mostrara a todos los alumnos que llevaron dicho curso
ordenado por promedio de manera descendente, los promedios menores a 11
mostrarlos con rojo de lo contrario con azul.
-76-
Power Builder 9.0
4) consulta por fechas, para ello se ingresara dos fechas por teclado la fecha inicial y
la Fecha final, en caso de no ingresar la fecha final se tomara en cuenta hasta la
fecha actual del sistema. Y mostrara en un DataWindow la relacin de alumnos
matriculados en ese rango.
5) Repita el Proceso 1 haciendo una consulta en Cascada, es decir en un formulario
habr dos DataWindow, en el primer DataWindow mostrara la relacin de alumnos
y en el segundo todos los cursos que ese alumno ha llevado con su promedio
respectivo, de tal modo que al hacer un ClicK o cambiar la fila del DataWindow
alumno cambiara automticamente el segundo DataWindow.
6) Realice solo el mantenimiento de la tabla alumno, el cdigo del alumno se va a
generar a partir A00001
CUARTA PRCTICA CALIFICADA
De La BDD del Demo de Power Builder Considerar las siguientes Tablas y campos para
cada una de llas:
Customer Clientes Sales_Order Orden dePedido
ID (N)
Fname ( C )
Lname ( C )
Company_name ( C)
State ( C)
Identificacin del Clie
Primer Nombre
Ultimo Nombre
Nombre _Compaa
Rstado
ID ( N)
Cust_id ( N )
Order_Date ( D )
Region ( C )
Nro de Pedido
Identificacin del Clie
Fecha de pedido
Sales_Order_Items ( detalle del Orden) Product Producto
ID ( N )
Line_Id (N)
Prod_ID
Quanty
Ship_Date
Nro de Pedido
Nro de Item
Codigo de Producto
Cantidad
Fecha de Envio
ID ( N)
Description
Unit_Price
Codigo de Prod.
Descripcin
Precio Unitario
Las Tablas ya tienen datos consistentes:
Realizar:
1) Seleccionando un ao en un combo (1996 - 1999) muestre la cantidad de pedidos
por Mes durante ese ao , los meses deben ser Enero,febre,... (10 Puntos)
2) En una Ventana Muestre la siguiente consulta en Cascada:
-77-
Power Builder 9.0
Clientes
Codigo Nombre y apellido Compaia Telefono
Orden de Pedido
Nro de Pedido Fecha de Pedido Region
Detalle del Pedido
Item Descripcin del Producto Cantidad Precio Total
Total por Pedido
Animaciones
Por ejemplo si se desea mostrar una papelera de reciclaje cuendo se elimina un registro o
cuando se copia emplear controles ole.
Cb_graba Clicked
ole_1.insertfile("c:\Iamgenes\filecopy.avi")
ole_1.activation=activateongetfocus!
ole_1.setfocus()
Cb_anula Clicked
ole_1.insertfile("c:\Imagenes\filedel.avi")
Control Ole , insert
control Avi
-78-
Power Builder 9.0
ole_1.activation=activateongetfocus!
ole_1.setfocus()
int rs
OLEObject ole1
ole1 = create OLEObject
rs = ole1.SetAutomationTimeOut(10000)
.
DataWindow Dinamicos
Sin utilizar objetos datawindow se puede mostrar en un control dartawindow resultados de
una instruccin SQL.
SyntaxFromSql Genera datawindow fuente, basado en instrucciones SQL.
Syntax
transaction.SyntaxFromSQL (sqlselect, presentation, err)
Argument Description
transaction Objeto de Transaccionn
sqlselect Una Cadena que contiene instrucciones SQL
presentation una cadena donde se define el estilo del datawindow mediante
Style(Type=presentationstyle)
Los valores del estilo de presentacin son: Grid, Form, Group(reporte), Graph, tabular
err Una cadena donde se va a recepccionar . el mensaje de error en caso que
lo hubiera.
Ejemplo:
La siguiente sentencia crea un Datawindow grid en dw_1 desde la fuente generada por
la funcin SyntaxFromSQL Si ocurre un error, la cadena ERRORS podra contener
cualquier mensaje de error que es generada, mostrando un mensaje al usuario. Observe
que debe efectuarse a travs del Objeto SQLCA:
Utilizando la tabla empleados
-79-
Power Builder 9.0
Cb_Carga Clicked
string ERRORS, sql_syntax
string presentation_str, dwsyntax_str
sql_syntax = "SELECT * from empleado"
presentation_str = "style(type=grid)"
dwsyntax_str = SQLCA.SyntaxFromSQL(sql_syntax, presentation_str, ERRORS)
IF Len(ERRORS) > 0 THEN
MessageBox("Caution", "SyntaxFromSQL caused these errors: " + ERRORS)
RETURN
END IF
dw_1.Create( dwsyntax_str, ERRORS)
IF Len(ERRORS) > 0 THEN
MessageBox("Caution", "Create cause these errors: " + ERRORS)
RETURN
END IF
dw_1.settransobject(sqlca)
dw_1.retrieve()
Envio de e-m@il
Si se tiene instalado el Outlook se debe de configurar
ddlb_destinatario
Alberto Moreno Cueva
Bayona Ramos
-80-
Power Builder 9.0
Pb_1 Clicked
string docname, named
integer value
value = GetFileOpenName("Selecione Fichero", docname, named, "DOC", &
+ "Text Files (*.TXT),*.TXT, All Files (*.*),*.*")
IF value = 1 THEN
lb_archivos.additem(docname)
end if
cb_1 Clicked
mailSession mSes
mailReturnCode mRet
mailMessage mMsg
mailFileDescription mAttach[]
string ls_ret, ls_syntax, ls_name, ls_open_pathname,
ls_filename
string ls_attach_name='c:\pbl\error.psr'
int li_index, li_nret, li_nrecipients, li_nfile
boolean lb_noerrors
mSes = create mailSession
mRet = mSes.mailLogon ( mailNewSession! )
sle_titulo
mle_text
o
Pb_1
lb_archivos
-81-
Power Builder 9.0
If mRet <> mailReturnSuccess! Then
MessageBox ("Mail Logon", 'Return Code <> mailReturnSuccess!' )
mSes.mailLogoff()
return
End If
SetPointer(HourGlass!)
mMsg.notetext = mle_texto.text // Mensaje a adjuntar ficheros a enviar
long tt,hay
hay=lb_archivos.totalitems()
for tt=1 to hay
mAttach[tt].FileType = mailAttach!
mAttach[tt].PathName = lb_archivos.text(tt)
mAttach[tt].FileName = lb_archivos.text(tt)
mAttach[tt].Position = len(mMsg.notetext) - 1
mMsg.AttachmentFile = mAttach
next
mMsg.Recipient[1].name = ddlb_destinatario.text // destinatario
mMsg.Subject=sle_titulo.text // subject
SetPointer(HourGlass!)
mRet = mSes.mailsend ( mMsg )
mSes.mailLogoff()
APIS DE EN POWER
Declaracin de Funciones externas
Descripcin
Las funciones externas son escritas en diferentes lenguajes y almacenadas en librerias dinamicas
con la extensin DLL, antes de utilizar estas funciones primero debe declararse definiendo su tipo.
Global external functions Estos son disponibles en toda la aplicacin
Local external functions Estos son definidos a nivel de ventana u objeto de usuario
External function syntax Usa la siguiente sintaxis:
Mostrar la Barra de
estado
Ver el Nombre de la maquina
-82-
Power Builder 9.0
{ access } FUNCTION returndatatype name ( { { REF } datatype1 arg1,
..., { REF } datatypen argn } ) LIBRARY "libname"
ALIAS FOR "extname"
Paso1.- Primero declarar las funciones externas ya sea a travs del visor Apis o digitarlos
directamente
cb_ocultar Clicked
Long HBar
// Esconder la barra de tareas
HBar = FindWindowExA( 0, 0, "Shell_TrayWnd", ls_Null )
ShowWindow( HBar, 0 )
Cb_Mostrar Clicked
onstant Long SW_SHOW = 5
// Nombres del shell de Windows que deberiamos buscar
String ls_Null
Long HBar, ll_HDeskTop
HBar = FindWindowExA( 0, 0, "Shell_TrayWnd", ls_Null )
ShowWindow( HBar, SW_SHOW )
// Muestra el escritorio
ll_HDeskTop = FindWindowExA( 0, 0, "Progman", ls_Null )
ShowWindow( ll_HDeskTop, SW_SHOW )
Cb_maquina Clicked
long ll_ret
string ls_ComputerName ,ls_UserName
ulong BufferLength = 250
ll_ret = GetComputerNameA(ls_ComputerName, BufferLength)
messagebox("maquina",ls_ComputerName)
Ubicar la clase dentro de la DLL
-83-
Power Builder 9.0
Control Trreview y procesos de arrastre
Aplicacin: Cambio de empleados en otro departament
Objetos a emplear:
1.-estructura (stremp)
2.-Datawindow estilo tabular datemp
tablas: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)
Control Tv_1
-84-
Power Builder 9.0
Descripcin de los eventos
BeginDrag.-ocurre cuando el usuario presiona el boton izquierdo del mouse, sobre
una etiqueta en el control treeview inicindose 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 boton
del mouse y deja el objeto.
Itempopulate.-Ocurre cuando un item delTreview llena los demas items hijos
Occurs when the user presses the left mouse button on a label in the TreeView control
and begins dragging.
Ven01 open
idsource=create Datastore
idsource.dataobject="Datemp"
idsource.settransobject(sqlca)
triggerEvent("ue_populate")
ven01 ue_populate()
TreeviewItem Vitem
SetPointer(hourglass!)
Vitem.Label="Marketing"
Vitem.Data= "D001"
vitem.PictureIndex=1
vitem.SelectedPictureIndex=7
Vitem.children=true
tv_1.insertitemlast(0,vitem)
Vitem.Label="logistica"
Vitem.Data= "D002"
vitem.PictureIndex=2
tv_1.insertitemlast(0,vitem)
Vitem.Label="Ventas"
Vitem.Data= "D003"
vitem.PictureIndex=3
tv_1.insertitemlast(0,vitem)
Vitem.Label="Contabilidad"
Vitem.Data= "D004"
vitem.PictureIndex=4
tv_1.insertitemlast(0,vitem)
Vitem.Label="Administracion"
Vitem.Data= "D005"
vitem.PictureIndex=5
tv_1.insertitemlast(0,vitem)
-85-
Power Builder 9.0
tv_1 begindrag(long handle ) return long
//Inicio del Arrastre
TreeViewItem t_Source
Getitem(Handle,T_source)
ST_9.TEXT=STRING(T_Source.Level)
if T_Source.Level<>2 then
This.Drag(cancel!)
Else
//Almacena el Handle del item antes de comenzar el arrastre parent(departament)
r_dragsource=handle
r_dragparent=finditem(parentTreeItem!,handle)
end if
tv_1 dragdrop(dragobject source, long handle) return long
int li_pend
long li_newitem
treeviewitem lt_target,lt_source,lt_parent,lt_new
if getitem(r_droptarget,lt_target)=-1 then return
if getitem(r_dragsource,lt_source)=-1 then return
getitem(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 return
li_pend=upperBound(vecEmp)+1
messagebox("lt_source",string(lt_source.data))
messagebox("lt_target",string(lt_target.data))
VecEmp[li_pend].vemp=lt_source.data
VecEmp[li_pend].vdep=lt_target.data
deleteitem(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_over
long a,b
if getitem(handle,t_over)=-1 then // si estamos en el primer nivel
setDropHighlight(0)
r_droptarget=0
return
end if
-86-
Power Builder 9.0
if t_over.level=1 then
// resalta el departamento que va ser arrastrado
if handle<>r_droptarget then
setDropHighlight(handle)
r_droptarget=handle
else
setDropHighlight(0)
r_droptarget=0
end if
else
r_droptarget=finditem(parenttreeItem!,handle)
if r_droptarget<>r_dragparent then
setDropHighlight(r_droptarget)
else
setDropHighlight(0)
r_droptarget=0
end if
end if
tv_1 itempopulate(long handle)
int nf,cf
TreeViewItem tvidep, tvemp
if getitem(Handle,tvidep)=-1 then return
setPointer(hourglass!)
idsource.reset()
nf=idsource.retrieve(tvidep.data)
tvemp.pictureIndex=6
tvemp.selectedpictureIndex=6
tvemp.children=false
for cf=1 to nf
tvemp.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
-87-
Power Builder 9.0
.
Trucos en Power
01 - Cambiar el color alternativamente en las filas de una datawindow
Para que las filas de una DataWindow tengan el aspecto de papel de impresora
aade la siguiente expresin 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 aparecern cuando se imprima el informe.
Si quieres imprimir este efecto tienes que aadir un rectangulo o un campo de texto
en blanco detrs de las columnas de detalle y poner la expresin anterior.
02.- Ordenar una DropDown Datawindow pulsando la cabecera
Una caracterstica que tienen los DataWindow es que te permiten ordenar las
columnas pulsando en la cabecera de la columna. La funcin Sort te permite
especificar el nombre de la columna o el nmero de columna por la cual se ordenar
el dataWindow. Funciona para la mayora de columnas y tipo de datos, pero no
funciona bien cuando la columna pertenece a una DropDown DataWindow
El problema es que la funcin Sort ordena los datos por detrs de la DataWindow no
los valores que el usuario est viendo en pantalla.
Para solucionar esto puedes usar el comando LookUpDisplay.
Esta funcin devuelve la visualizacin de los datos de la columna. Poniendo el
nombre de la columna dentro de esta funcin y usndola para ordenar los datos, el
usuario podr ver los datos ordenados.
Por ejemplo:
dw_1.SetSort( 'LookUpDisplay( dept_id )' )
dw_1.Sort()
03.- Ordenar un DataWindow pulsando en la cabecera
Por ejemplo: El nombre de la cabecera de la columna tiene que tener el mismo
nombre que en la base de datos y acabado en '_t'
Nombre de la columna: 'emp_id' = Nombre de la cabecera: 'emp_id_t'
Slo se puede ordenar por una columna cada vez.
String ls_old_sort, ls_column
-88-
Power Builder 9.0
Char lc_sort
/* Chequea cuando el usuario hace click en la cabecera */
IF Right(dwo.Name,2) = '_t' THEN
ls_column = LEFT(dwo.Name, LEN(String(dwo.Name)) - 2)
/* Guarda la ltima ordenacin, si hubiera alguna*/
ls_old_sort = dw_1.Describe("Datawindow.Table.sort")
/* Chequea cuando prviamente se orden una columna y en la que se hace click
actualmente es la misma o no. Si es la misma, entonces se chequea el orden de
ordenacin del ordenamiento anterior (A - Ascendente, D - Descendente) y lo
cambia. Si las columnas odenadas no son las mismas, las ordena en orden
ascendente. */
IF ls_column = LEFT(ls_old_sort, LEN(ls_old_sort) - 2) THEN
lc_sort = RIGHT(ls_old_sort, 1)
IF lc_sort = 'A' THEN
lc_sort = 'D'
ELSE
lc_sort = 'A'
END IF
dw_1.SetSort(ls_column+" "+lc_sort)
ELSE
dw_1.SetSort(ls_column+" A")
END IF
dw_1.Sort()
END IF
04.- Determinar el uso de memoria de una datawindow
A menudo es necesario saber cuanta memoria esta usando una DataWindow o
datastore para prevenir un "out of memory" o para facilitar la depuracin.
Cuando se sabe la memoria que se est usando, el proceso de datos o la
recuperacin de los mismos, puede ser detenida cuando se llegue a un lmite
mximo.
Para deteminar la cantidad de memoria virtual que est usando una DataWindow o
datastore, se usa el atributo Storage.
Este puede ser invocado desde cualquiera de de los dos mtodos siguientes:
Notacin DOT: dw_control.Object.DataWindow.Storage
Describe: 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 ventana
Llamar a la segunda ventana pasndole como referencia la DataWindow:
OpenWithParm( w_window, dw_1 )
Entonces en el evento OPEN de la ventana escribe:
datastore lds_parm
lds_parm = Message.PowerObjectParm
-89-
Power Builder 9.0
dw_1.DataObject = lds_parm.DataObject
lds_parm.ShareData(dw_1)
Y en el evento CLOSE:
dw_1.ShareDataOff()
06.- Copiar datos de un Grid Datawindow al portapapeles de Windows
Los DataWindow grid tienen la capacidad nica de dejarte seleccionar un nmero de
celdas en el DataWindow (o la totalidad de filas o de columnas de datos).
Este ejemplo ilustra como proporcionar soporte de copia para los datos
seleccionados desde un DataWindow de tipo grid.
Asumimos que un nuevo elemento de menu llamado m_SpecialCopy ha sido
aadido bajo el menu m_Edit .
Aadir el siguiente cdigo para determinar si el elemento Special Copy deber ser
habilitado.
GraphicObject lg_Object
DataWindow lg_DW
string ls_SelectedText
lg_Object = GetFocus ()
CHOOSE CASE TypeOf (lg_Object)
CASE DataWindow!
lg_DW = lg_Object
This.m_SpecialCopy.Enabled = (lg_DW.dwDescribe ("datawindow.selected.data") <>
'')
END CHOOSE
==============================
Codifica lo siguiente en m_SpecialCopy o en un evento disparado por
m_SpecialCopy):
graphicobject lg_Object
datawindow lg_DW
lg_Object = GetFocus ()
CHOOSE CASE TypeOf (lg_Object)
CASE DataWindow!
lg_DW = lg_Object
ClipBoard (lg_DW.dwDescribe ("datawindow.selected.data"))
END CHOOSE
07.- Permitir al usuario aadir solo columnas clave nuevas
A veces es deseable impedir a los usuarios que editen columnas clave una vez que
las han creado. Esto se puede hacer fcilmente usando expresiones de columna en
el DataWindow.
Aade esta expresin en el campo "background color" de la columna clave. Esto
cambiar el color de la columna y mostrar que la columna no es editable:
if ( IsRowNew(), 1090519039, Long(Describe("Datawindow.Color")))
Aade esta expresin en el campo "protect" de la columna clave:
if ( isRowNew(), 0, 1)
Si usas el modo consulta (query mode) utiliza esta expresin:
-90-
Power Builder 9.0
- Background Colour
if ( Describe("Datawindow.QueryMode") = "yes" or isRowNew(), 1090519039,
ong(Describe("Datawindow.Color")))
- Protect
if ( Describe("Datawindow.QueryMode") = "yes" or isRowNew(), 0, 1)
8.- Cargar un array con los nombres de cada columnas en una Datawindow
int colNum, numCols
string colName[]
numCols = Integer(dw_control.Describe("Datawindow.Column.Count"))
FOR colNum = 1 TO numCols
// Obtenemos el nombre de la columna con la funcin Describe
colName[colNum] = dw_control.Describe("#" + String(colNum) + ".name")
NEXT
9.- Saber que ficheros hay en un directorio
Puedes 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 ese
directorio, o tambin puedes usar la funcin 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 instaladas
Por Ral Gagnon
En este truco abriremos un listbox con una lista de las impresoras instaladas:
string printers[]
int rtn, i, nbPrinters
rtn =
RegistryKeys("HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Print\Pri
nters", printers)
nbPrinters = UpperBound(printers)
FOR i = 1 TO nbPrinters
lb_1.addItem(printers[i])
NEXT
11.- Detectar la versin de PowerBuilder
string ls_PBver
environment env
GetEnvironment(env)
ls_PBver = string(env.pbmajorrevision) + '.' + string(env.pbminorrevision) + '.' +
string(env.pbfixesrevision)
-91-
Power Builder 9.0
12.- Obtener el ltimo da del mes
Se coge una fecha, se incrementa el mes, se cambia el da por "01" y entonces
restamos 1:
int li_retdays,ld_previousMonthLastDay,li_month,li_year
date ad_date, ld_newdate
ad_date= today()
li_month = Month(ad_date)
li_year = year(ad_date)
IF li_month < 12 THEN
li_month ++
ELSE
li_month = 1
li_year ++
END IF
// construimos una fecha nueva
ld_newdate = date(li_year,li_month,1)
// extraemos el ltimo da del mes anterior
ld_previousMonthLastDay = day(relativedate(ld_newdate, -1))
13.- Realizar un "Mouse Over" sobre un componente
Suponte que tienes un Static Text sobre una ventana. Cuando el puntero del ratn
pasa por encima, el color del texto del Static Text cambia a color rojo. Cuando el
puntero del ratn sale del Static Text, el color del texto es negro.
[Evento mousemove de la ventana]
// Simplemente para visualizar algo
st_1.text = string(xpos) + ", " + string(ypos)
IF xpos >= st_1.X AND (xpos <= st_1.x + st_1.Width) AND ypos >= st_1.y AND (ypos
<= st_1.y + st_1.Height) THEN
st_1.textcolor = 255
ELSE
st_1.textcolor = 0
END IF
14.- Centrar una ventana (til si es de tipo response). Por Adolfo Chairez.
Long ll_screenWidth,ll_screenHeight
environment lenv_display
if GetEnvironment(lenv_display) = 1 then
ll_screenWidth = PixelsToUnits(lenv_display.screenwidth,XPixelsToUnits!)
ll_screenHeight = PixelsToUnits(lenv_display.screenheight,YPixelsToUnits!)
this.x = (ll_screenWidth - this.width) / 2
this.y = (ll_screenHeight - this.height) / 2
end if
15.- Mostrar lo que tarda en ejecutarse una parte de cdigo
Para testear el tiempo que tarda una parte determinada de cdigo de nuestra
aplicacin usaremos la funcin CPU()
long ll_start, ll_elapsed
ll_Start = CPU ( )
/*
-92-
Power Builder 9.0
** El cdigo que quieres testear
*/
ll_elapsed = CPU ( ) - ll_Start
Sugerencias:
d91041@idat.edu.pe
mmoreno@ucss.edu.pe

You might also like