Вы находитесь на странице: 1из 92

-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.
Ø 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 autor
Correo :am_alberto@hotmail.com
La 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 el
desarrollo 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


-4-

Template Application .- es cuando se abre una nueva aplicación pero con una plantilla
de trabajo
Existing Application .- Para abrir una aplicación que se encuentra en otra versión del
power.

Power Builder 9.0


-5-

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 posición 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

Power Builder 9.0


-6-

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

Power Builder 9.0


-7-

Respecto al ejemplo anterior:


Lb_software.InsertItem( Apache ,6) // inserta el item en la sexta posición, 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 ningún ítem
Syntax
objectname.SelectItem (itemnumber)

Power Builder 9.0


-8-

Controls
ListBox, DropDownListBox, PictureListBox, and DropDownPictureListBox controls
ejemplo
ddlb_software.Selecitem(0) // ningún ítem es seleccionado
lb_software.SelectItem(5) // resalta el item 5

TOTALITEMS
Determina el número 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 múltiple
selección es decir propiedad Multiselect = TRUE

Power Builder 9.0


-9-

Syntax
objectname.SetState (index, state)
Controls
ListBox and PictureListBox controls
ejemplo

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 ASCII
String XS
XS=Char(42) // retorna *
FILL retorna una cadena con una longitud determinada del carácter especificado.
ejemplo
Fill( ,5) // *****
LEFT Retorna un número 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 minúsculas


Ejemplo:
String Xcad
Xcad = Lower( CLAUDIA ) // Retorna claudia

MATCH Determina si la cadena contiene un patrón particular de caracteres.


Ejemplo:

Power Builder 9.0


-11-

Esta 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ón


Ejemplo:
String Xcad
Xcad = Mid( Claudia ,4,2) // retorna ud

POS retorna la posición 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 mayúsculas


Ejemplo:

Power Builder 9.0


-12-

Cad= especialización // devuelve ESPECIALIZACION.

FUNCIONES FECHA
DAY Retorna el día de una fecha.
Ejemplo:
Dia = String(Day(2001-04-21)) // retorna 21, convertimos el dato de tipo
númerico a
cadena, con la funcion string.

DAYNAME Retorna el nombre de día de la semana


Ejemplo:
Cad = DayName(2001-04-22) // retorna Sunday.

DAYNUMBER Retorna el número de día de la semana


Ejemplo:
Cad = string(DayNumber(2001-04-22)) // Retorna 1
DAYAFTER Devuelve los días que hay entre dos fechas
Ejemplo
Cad = DayAfter(2001-04-22, 2001-04-18) // retorna -4
HOUR Retorna un entero que corresponde al número 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 número correspondiente al mes de una fecha


Ejemplo:
Month(2001-04-22) // retorna 4

NOW devuelve la Hora del sistema

Power Builder 9.0


-13-

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 número de día.


Ejemplo:
Date Fecha
Fecha=Relativedate(today(), -25) // la fecha hace 25 días respecto a la fecha
actual.

SECOND Retorna el número 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 año de una fecha.


Ejemplo
Num = year(today())

Power Builder 9.0


-14-

FUNCIONES NUMÉRICAS
ABS obtiene el valor absoluto de un número
Ejemplo:
Num= (abs(-34) // retorna 34

CEILING Obtiene el menor número entero que es menor o igual al número 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 número elevado a la potencia.
Ejemplo:
Deci = String(exp(1)) // 2.718

FACT Obtiene el factorial de un número


Ejemplo:
Num= Fact(4) // retorna 24

MAX Retorna el mayor de dos números


Ejemplo:
Num = Max(-4,-7) // retorna -4

MIN Menor entre dos números


Ejemplo:
Num = Min(4,7) // retorna 4

MOD Obtiene el residuo de dos números


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 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 10

RANDONMIZE(0) Randomize Regenera o inicializa el número aleatorio generador.


Ejemplo:
Randomize(0)

ROUND Obtiene el número entero comprendido en un número decimal


Ejemplo:
Num = Round(3.598,0) // devuelve 4

Power Builder 9.0


-16-

Aplicaciones
DFU (Funciones Defindas por el Usuario).
Pueden ser a nivel de Ventana o a nivel de toda la aplicación

Ejemplo: Ingresar un monto en soles y lo convierta a letras

Em_1 control de
edicion

Mle_1 Contol de
múltiple linea

por ejemplo si:

Funciones a crear Num=345


Num Num
Tipo int

F_mil F_mill
F_centena

Letra

Letra

Devuelve 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)

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"}

Power Builder 9.0


-17-

Paso 2.- Crear las funciones: NumLetras (a nivel de ventana)

a) Clic en (Insert) del menú principal.


b) Clic en (Function).

a b c d f g
a) Tipo de acceso a la función.
b) Tipo de dato de retorno.
c) Nombre de la función.
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 código, 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

Power Builder 9.0


-18-

Funcion miles

Tipeamos el siguiente código:

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.

Power Builder 9.0


-19-

FUNCIONES APLICADAS A CONTROL DATA WINDOWS

Estructura de un Datawindows

Edit Control

Datawindows.- Es una carateristicas más 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 específicamente de una base de datos al usuario final; DataWindows
pueden 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 un
DataWindow 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

SetTransObject
Hace que un control DataWindow use un objeto de transacción especificado por el
programador. El objeto de transacción proporciona la información nesecesaria para
comunicarse 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 un
objeto 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


que contiene el control DataWindow.
En resumen el SettransObject(SQLCA) asocia el objeto transación 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 número de la fila que se ha añadido, 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:

Power Builder 9.0


-21-

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 número 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

Power Builder 9.0


-22-

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.

También en vez del nombre de campo, puede ser el número 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


numérico, 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 posición se encuentre en la fila número 3.

Power Builder 9.0


-23-

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()

Power Builder 9.0


-24-

Ejecuta la clasificación con un previo criterio de selección


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 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 ()

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 número total de la fila, se hace scroll a la última fila.

RowCount
Obtiene el número 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)

Power Builder 9.0


-25-

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 número 8
Dwn.Update() // actualiza la base de datos enlazada

DeletedCount
Retorna el número 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()

Power Builder 9.0


-26-

Utilización 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 aplicación.

Uso de filtros (Find SetFIlter)

A.- Seleccionamos en el control sueldo el carácter de condición e ingresamos un


valor numérico que representa al sueldo básico, luego presionamos clic en el
boton Mostrar y tendremos los requeridos.
B.- Se ingresa solo los primeros caracteres del nombre, si huviera algún registro
que contenga dichos caracteres, deberá resaltar el primer registro tal como
observamos en el ejemplo.

Power Builder 9.0


-27-

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)

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

TABLAS

Ingresar datos consistentes en las tablas creadas, como se muestra a


continuació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


-28-

Presentación Descripción
Composite Utiliza como presentación, un reporte previamente creado.
Freeform La presentación es libre, cada campo se muestra en una línea
distinta. Muy utilizado para el ingreso de datos.
Graph Diseña un gráfico dependiendo de una consulta, esta debe
contener datos relacionados.
Grid Diseña una malla de datos en forma columnada, y cada
columna con una justificación completa.
Group Diseña listado por agrupación de campos. Muy utilizado para
reportes de resumen de información.
Label El diseño es de etiquetas, donde Ud. podrá elegir el tipo de
etiqueta de las prediseñadas, en papel continuo o separado, y
otras opciones.
Rich Text Permite definir una carta con combinación de campos del
Origen de Datos fijado. Se pueden utilizar todas las
características del formato de texto RTF.
Tabular Presenta el Origen de Datos en forma columnada pero sin
ajuste total. Permite una mayor libertad en el diseño.

Power Builder 9.0


-29-

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 Descripción
Quick Select Nos presenta las tablas en forma gráfica, y solo permite las
sentencias ordinarias de SQL (Sort y Criteria). La primera para
sentencia sirve para poder ordenar por el campo específico y la
segunda sentencia para indicar registros a mostrar dependiendo
de un valor condicional (Ejemplo: <39)
Sql Select Presenta las tablas en forma gráfica, y permite trabajar con
todas las características de Sql estándar (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 interactúan (nombre, tipo y tamaño)
Utilice los botones Add para añadir un nuevo campo al final de
los ya existentes, el botón Insert le permitirá insertar un campo
entre otros y el botón Delete le permitirá eliminar el campo
actual.
Stored El Origen de Datos es un procedimiento que ha sido
Procedure almacenado en la Base de Datos. Seleccione uno si lo ha
creado, o créelo previamente.

Power Builder 9.0


-30-

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 continuación:

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 presentación final será:(Detallando las siguientes partes opcion View)


Power Builder 9.0
-31-

Color de fondo
del DW

Color del texto


del DW
Estilo del texto
del DW

Color de las
Cabeceras del DW
Estilo de las
cabecera del DW

Diseño

Propiedades

Preview

Columns Specification

Teniendo opción 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:

Power Builder 9.0


-32-

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 acontinuación:

ddplb_1

Dw_1

Dw_2

Power Builder 9.0


-33-

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 posición de la ventana, donde desea poner el
DataWindow Control.

Nombre por defecto del Control


DataWindow.

Seleccionar el Objeto DataWindow,


previamente creado.

Propiedades complementarias al
control DataWindow.

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()

Power Builder 9.0


-34-

//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 algúna 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 número 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)

Power Builder 9.0


-35-

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 Aplicación:

// 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 conexión
If Sqlca.Sqlcode<>0 then
Messagebox ("Error de Conexión",Sqlca.SqlErrText)
Halt
else
//abrimos la ventana 1 de nuestro proyecto
open(ventana01)
end if

Esta conexión se puede traer desde el entorno de la BDD

Power Builder 9.0


-36-

Clic en el
siguiente icono
y obtendremos
la siguiente
ventana

Clic en el boton Edit….

Clic en la siguiente pestaña


Obtendremos 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 Calculados


Aplicació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 necesite
en la consulta como se observa a continucación:

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

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.

Tipo de dato que


Nombre de la Variable recibirála variable

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

Observe el grafico

Luego 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).

1 2 3

Cada campo tiene un conjunto de propiedades que se muestran en la parte lateral


derecha, dar forma a la presentación de la consulta moviendo las cabeceras y etiquetas
de 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 del
menú principal y seleccionando Retrieve, para ello le pedirá ingresar un código de
vendedor.

Paso 6.- Completar los campos de comisión, comisión total y pago total a través de las
opciones del menú principal: Insert – submenu Control – opcion Compute Field.

Power Builder 9.0


-41-

Al seleccionar esta opción Computed Field , llevar el cursor en la posición donde desea
colocar el calculo de la comisión (Detail), luego mostrara la ventana de Modify Expresión
donde colocara la expresión para la comisión , para facilitar la edición de esta expresión
haga un Clic en los campos mostrados en Columns.

Codificar la siguiente sentencia, para determinar la comisión del empleado, si tipo de


empleado es en 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 pago
total.

Power Builder 9.0


-42-

Para la suma del comisión marcar el campo calculado comisión, similar al Paso 6 Insert
Control- Elegir Sum, entonces autómicamente 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 expresión.

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

Grabarlo como Data01.

Power Builder 9.0


-43-

Paso 8.- Luego Inserte un formulario o ventana para colocar el DataWindow, la


presentación 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 , Código no existe, verificar ,information!)
End if

En la aplicación hacer la conexión con la BDD

// Profile Venta
SQLCA.DBMS = "ODBC"
SQLCA.AutoCommit = False
SQLCA.DBParm = "Connectstring='DSN=venta"
connect;
Power Builder 9.0
-44-

If Sqlca.Sqlcode<>0 then
Messagebox ("Error de Conexión",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 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 las
validaciones respectivas en cada campo, aunque es opcional dependiendo del proyecto
que 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:

1. Seleccione dicho campo y en propiedades seleccionar la pestaña 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 gráfico.

Power Builder 9.0


-46-

5. Ademas dar formato de fecha y formato monetario a los campos: fecha de ingreso
y sueldo básico; en la misma propiedad Edit pero seleccionado EDIT MASK en
Style 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 Venta
SQLCA.DBMS = "ODBC"
SQLCA.AutoCommit = False
SQLCA.DBParm = "Connectstring='DSN=venta"
connect;
If Sqlca.Sqlcode<>0 then
Messagebox ("Error de Conexión",Sqlca.SqlErrText)
Halt
else
open(ventana02)
end if

Script clicked for pb_pri


Dw_1.Scrolltorow(1)
Dw_1.Setfocus()
Power Builder 9.0
-48-

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()

Power Builder 9.0


-49-

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","Código no existe" + string(nf))
else
close(ventana03)
ventana02.cb_graba.enabled=true
ventana02.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 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

Power Builder 9.0


-51-

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()

Power Builder 9.0


-52-

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)

Power Builder 9.0


-53-

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)

Power Builder 9.0


-54-

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 mostrarán 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

Power Builder 9.0


-55-

Paso 4.- Luego especifique La creacion del Obejeto Estructura, utilizando (Structure
painter) del Menu Principal(Power Bar)

File – New – pestaña 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.- 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 de
cursos).
La ventana VenAlumnos debe recibir el parametro (código 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

Power Builder 9.0


-56-

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)

Power Builder 9.0


-57-

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

Power Builder 9.0


-58-

Script ItemError For Dw_alumnos


Return 1

PRIMERA PRÁCTICA CALIFICADA


1. Especificaciones de la aplicación
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 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 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).

Power Builder 9.0


-59-

Nota.- El diseño de la aplicación es a criterio del alumno.


Su presentacion y estetica también se considera.

Aplicación Cuenta Corriente


Esta aplicación permite generar un campo en este caso es el número de movimiento y
actualizar el saldo en el archivo ahorro.

Power Builder 9.0


-60-

Script open for aplicación:

// 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

Power Builder 9.0


-61-

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()

Power Builder 9.0


-62-

SEGUNDA PRÁCTICA CALIFICADA


Se requiere un programa para automátizar las ventas de pasajes aéreos, para ello se
cuenta con las siguientes tablas:
Base de datos Vuelos DB

Tablas:

Rutas tipo Long Texto

Cod_rut Char 4 Codígo 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)iño
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 foráneas 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 aplicación debe permitir realizar el manteniemiento para cada tabla

Power Builder 9.0


-63-

3.- En el mantenimiento del archivo de viajes debe tener un botón 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%
Niño 50%
Adulto 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 debe
incorporarse 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

• 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 diseño y presentación 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.

Power Builder 9.0


-64-

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 estándar, para diseñar su plantilla:
Realizar el siguiente diseño: 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_2 ST_1

Power Builder 9.0


-65-

St_pg (para ver el porcentaje)

Codificación 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)+

Power Builder 9.0


-66-

Clases
Crear las siguientes clases de Objetos de usuarios

1.- Los Visuales

a) Un Progres según se muestra en la figura

b) Un control para desplazamiento de paginas y de Impresión

c) Colocando una caja de texto que permita adicionar o restar días a una fecha a
través 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 función que permita sumar una columna numérica, se pasa como valor el
control 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 control
DataWindow, el valor inicial del código, el código puede empezar con una letra o
número.

d) Un evento que permita cambiar el color de una columna de un control


DataWindow, pasar como dato el control DataWindow y el número de columna.

Power Builder 9.0


-67-

Capitulo de Graficos en Power Builder


Es un estilo de un DataWindow, pero también se pueden efectuar gráficos a través del
control graph.

Pasos para crear un grafico.

Power Builder 9.0


-68-

Aplicación
Se 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 DataWindow

Datawindow Tablas Campos Category Values Retrieval


Arguments
Datag01 Departamento Nom_dept, Nom_dept Count(Cod_emp)
y Salarios Cod_emp
Datag02 Departamento Cod_emp,sueldo Cod_emp Sueldo Nom_dept
y Salarios
Datag03 Empleado Todos Cod_emp

Data01 y Data02 son estilos graficos, mientras Data03 estilo freeform

Power Builder 9.0


-69-

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

Power Builder 9.0


-70-

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)

Power Builder 9.0


-71-

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)

Aplicación Formularios MDI y Objetos de Usuario.


En esta aplicación se ha utilizado Ventanas con herencia (inheret) donde la ventana
w_sheet-dw es la ventana padre que contiene funciones definidas por el usuario

Creación 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:

Power Builder 9.0


-72-

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()

Power Builder 9.0


-73-

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

Power Builder 9.0


-74-

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 PRÁCTICA CALIFICADA


Elaborar la BDD Matriculas DB, cuyas tablas son:

ALUMNOS

Campo Tipo Descripción CURSOS


Codal C(6) Código Campo Tipo Descripción
NomAl C(15) Nombre
CodCur C(4) Cod. Curso
Ape C(15) Apellido
NomCur C(15) Asignatura
Femat Date Fecha de Matricula
NHrCur N Nro de Horas

Power Builder 9.0


-75-

NOTAS

Campos Tipo Descripcion


Codal C(6) Código Alumno
Codcur C(4) Curso
Exp N Ex. Parcial
Exf N Ex . Final

Establecer los campos principales y las claves Foráneas

Se Pide elaborar:

1) La Observación 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 código 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.

Power Builder 9.0


-76-

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 relación 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 relación 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 automáticamente el segundo DataWindow.

6) Realice solo el mantenimiento de la tabla alumno, el código del alumno se va a


generar a partir A00001

CUARTA PRÁCTICA 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) Identificación del Clie ID ( N) Nro de Pedido
Fname (C) Primer Nombre Cust_id ( N ) Identificación del Clie
Lname (C) Ultimo Nombre Order_Date ( D ) Fecha de pedido
Company_name ( C) Nombre _Compañía Region (C)
State ( C) Rstado

Sales_Order_Items ( detalle del Orden) Product Producto


ID ( N ) Nro de Pedido ID ( N) Codigo de Prod.
Line_Id (N) Nro de Item Description Descripción
Prod_ID Codigo de Producto Unit_Price Precio Unitario
Quanty Cantidad
Ship_Date Fecha de Envio

Las Tablas ya tienen datos consistentes:


Realizar:

1) Seleccionando un año en un combo (1996 - 1999) muestre la cantidad de pedidos


por Mes durante ese año , los meses deben ser Enero,febre,... (10 Puntos)
2) En una Ventana Muestre la siguiente consulta en Cascada:
Power Builder 9.0
-77-

Clientes
Codigo Nombre y apellido Compañia Telefono

Orden de Pedido

Nro de Pedido Fecha de Pedido Region

Detalle del Pedido

Item Descripción 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.

Control Ole , insert


control Avi

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")
Power Builder 9.0
-78-

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 instrucción 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 presentación 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 función SyntaxFromSQL Si ocurre un error, la cadena ERRORS podría contener
cualquier mensaje de error que es generada, mostrando un mensaje al usuario. Observe
que debe efectuarse a través del Objeto SQLCA:

Utilizando la tabla empleados

Power Builder 9.0


-79-

Alberto Moreno Cueva

Bayona Ramos

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
Power Builder 9.0
-80-

sle_titulo

mle_text
o

lb_archivos
Pb_1
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! )
Power Builder 9.0
-81-

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
Declaración de Funciones externas

Mostrar la Barra de
estado

Ver el Nombre de la maquina

Descripción
Las funciones externas son escritas en diferentes lenguajes y almacenadas en librerias dinamicas
con 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ón


Local external functions Estos son definidos a nivel de ventana u objeto de usuario

External 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 digitarlos
directamente

cb_ocultar Clicked

Long HBar
// Esconder la barra de tareas
HBar = 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 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)

Power Builder 9.0


-83-

Control Trreview y procesos de arrastre

Aplicación: Cambio de empleados en otro departament

Control Tv_1

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)

Power Builder 9.0


-84-

Descripción de los eventos


BeginDrag.-ocurre cuando el usuario presiona el boton izquierdo del mouse, sobre
una 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 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)

Power Builder 9.0


-85-

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

Power Builder 9.0


-86-

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

Power Builder 9.0


-87-

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
añ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 texto
en blanco detrás de las columnas de detalle y poner la expresión anterior.

02.- Ordenar una DropDown Datawindow pulsando la cabecera

Una característica que tienen los DataWindow es que te permiten ordenar las
columnas pulsando en la cabecera de la columna. La función Sort te permite
especificar 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 no
funciona bien cuando la columna pertenece a una DropDown DataWindow

El problema es que la función Sort ordena los datos por detrás de la DataWindow no
los 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 el
nombre de la columna dentro de esta función y usándola 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'
Sólo se puede ordenar por una columna cada vez.

String ls_old_sort, ls_column

Power Builder 9.0


-88-

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 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 click


actualmente es la misma o no. Si es la misma, entonces se chequea el orden de
ordenación 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 depuración.

Cuando se sabe la memoria que se está usando, el proceso de datos o la


recuperación de los mismos, puede ser detenida cuando se llegue a un límite
máximo.
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 métodos siguientes:
Notación 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 pasándole 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

Power Builder 9.0


-89-

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 número 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
añadido bajo el menu m_Edit .
Añadir el siguiente código 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 añadir 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 fácilmente usando expresiones de columna en
el DataWindow.

Añade esta expresión 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")))
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 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 función 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 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 instaladas


Por Réal 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 versión de PowerBuilder


string ls_PBver
environment env
GetEnvironment(env)
ls_PBver = string(env.pbmajorrevision) + '.' + string(env.pbminorrevision) + '.' +
string(env.pbfixesrevision)

Power Builder 9.0


-91-

12.- Obtener el último día del mes


Se coge una fecha, se incrementa el mes, se cambia el día 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 día 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 ratón
pasa por encima, el color del texto del Static Text cambia a color rojo. Cuando el
puntero del ratón 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 código


Para testear el tiempo que tarda una parte determinada de código de nuestra
aplicación usaremos la función CPU()
long ll_start, ll_elapsed
ll_Start = CPU ( )
/*

Power Builder 9.0


-92-

** El código que quieres testear

*/
ll_elapsed = CPU ( ) - ll_Start

Sugerencias:

d91041@idat.edu.pe
mmoreno@ucss.edu.pe

Power Builder 9.0

Вам также может понравиться