You are on page 1of 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, 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

Power Builder 9.0

-3-

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)

Power Builder 9.0

-4-

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.

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

Power Builder 9.0

// Variable de tipo entero

-6string s

// Variable de tipo cadena

s = "Insertar Item"

// Almacenamos un valor a la variable

Xrow = lb_software.AddItem(s) // Insertamos el valor de la variable (s) en 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

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

Power Builder 9.0

-8Controls
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

Power Builder 9.0

-9Syntax
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 cdigo ASCII correspondiente, de un carcter de tipo cadena.
ejemplo :
Asc(

// 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(
LEN(Cad)

Claudia )

// Retorna Claudia

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:

Power Builder 9.0

-11Esta 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:

Power Builder 9.0

-12Cad= 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

Power Builder 9.0

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

Power Builder 9.0

-14-

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

Power Builder 9.0

-15-

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)

Power Builder 9.0

// devuelve 4

-16-

Aplicaciones

DFU (Funciones Defindas por el Usuario).


Pueden ser a nivel de Ventana o a nivel de toda la aplicacin
Ejemplo: Ingresar un monto en soles y lo convierta a letras

Em_1 control de
edicion

Mle_1 Contol de
mltiple linea

por ejemplo si:

Num=345

Funciones a crear

Num

Num

Tipo int
F_mil

F_centena

F_mill
Letra

Letra
Devuelve en letras:
Trescientos cuarenta y cimco

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

Power Builder 9.0

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


a) Clic en (Insert) del men principal.
b) Clic en (Function).

a
a)
b)
c)
d)
e)

Tipo de acceso a la funcin.


Tipo de dato de retorno.
Nombre de la funcin.
Tipo de datos que se va a referenciar, en este caso ser un valor.
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

Power Builder 9.0

-18Funcion 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
end if

Cad1=f_centena(mil)+" Mil"

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

Power Builder 9.0

-20-

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:

Power Builder 9.0

-21DwnSoftware.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

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.

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.

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

-24Ejecuta 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)

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

Power Builder 9.0

-26-

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.

Power Builder 9.0

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

Estructura:
Vendedor:
Codv Char
4
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
continuacin:
FACTURA

VENDEDOR

Paso 2.- Disear el DataWindow - (File-New-DataWindow)


- Se elige el estilo de Presentacin: (Elegir el Tipo Tabular)

Power Builder 9.0

Null(no)

-28-

Presentacin
Composite
Freeform
Graph
Grid
Group
Label

Rich Text

Tabular

Power Builder 9.0

Descripcin
Utiliza como presentacin, un reporte previamente creado.
La presentacin es libre, cada campo se muestra en una lnea
distinta. Muy utilizado para el ingreso de datos.
Disea un grfico dependiendo de una consulta, esta debe
contener datos relacionados.
Disea una malla de datos en forma columnada, y cada
columna con una justificacin completa.
Disea listado por agrupacin de campos. Muy utilizado para
reportes de resumen de informacin.
El diseo es de etiquetas, donde Ud. podr elegir el tipo de
etiqueta de las prediseadas, en papel continuo o separado, y
otras opciones.
Permite definir una carta con combinacin de campos del
Origen de Datos fijado. Se pueden utilizar todas las
caractersticas del formato de texto RTF.
Presenta el Origen de Datos en forma columnada pero sin
ajuste total. Permite una mayor libertad en el diseo.

-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
Quick Select

Sql Select

Query

External

Stored
Procedure

Power Builder 9.0

Descripcin
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)
Presenta las tablas en forma grfica, y permite trabajar con
todas las caractersticas de Sql estndar (Sort, Group, Having,
Compute y Where, entre otros)
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.
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.
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-

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)

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

Diseo
Propiedades
Preview

Columns Specification

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:

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 acontinuacin:

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

Power Builder 9.0

-35end 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

Power Builder 9.0

-36-

Clic en el
siguiente icono
y obtendremos
la siguiente

ventana

Clic en el boton Edit.


Clic en la siguiente pestaa
Obtendremos la siguiente vista

Power Builder 9.0

-37-

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.

Power Builder 9.0

-38-

Colocar la variable receptora, a travs de esta variable ingresar un cdigo y proceder


h realizar la bsqueda en el DataWindow.

Nombre de la Variable

Tipo de dato que


recibirla variable

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

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

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:

Power Builder 9.0

-40-

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.

Power Builder 9.0

-41Al 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
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.

Power Builder 9.0

-42Para 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.

Power Builder 9.0

-43Paso 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;

Power Builder 9.0

-44If 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)

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 funcin en el campo a nivel de columnas, specificaciones,


si desea una rea ms amplia hacer doble click en Validation Expresin.
Al campo grado editarlo como un combo:

1.
2.
3.
4.

Seleccione dicho campo y en propiedades seleccionar la pestaa EDIT.


En tipos de estilos existen seis tipos, seleccione DropDownListBox.
Marca el check Always Show Arrow, para que tenga el aspecto de un combo.
Ingrese 3 valores en la grilla (code Table) como se muestra en el grfico.

Power Builder 9.0

-46-

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

Power Builder 9.0

-47-

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

Power Builder 9.0

-48Script 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

-49cb_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

Power Builder 9.0

-50-

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

Power Builder 9.0

-51xfac=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

-52if 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 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

Power Builder 9.0

-55Paso 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

Power Builder 9.0

-56Script 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

-57dw_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

-58Script 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
3.2
3.3

3.4
3.5

DW_Clientes (estilo Grid), donde solo debe mostrar los campos


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

Power Builder 9.0

-59Nota.- 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.

Power Builder 9.0

-60Script 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

Power Builder 9.0

-61Script 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 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

Cod_rut
Nom_rut
Pago_cho

Char
Varchar
Numeric

Viajes

tipo

Nro_via
Cod_rut
Fsal_via
Hsal_via
Cos_via
Nro_vac
Cod_cho
Flag

Char
Char
Date
Time
Numeric
Numeric
Char
Char

Pasajeros

tipo

Nbol
Nrovia
Nom_pas
Tipo
Pago

Numeric
Char
Varchar
Char
Numeric

Chofer
Cod_cho
Nom_cho
Sba_cho

tipo
Long
Char
4
Varchar
25
Numeric 6 1

4
15
6 1
Long
6
4

6 1
3
4
1
Long
5
6
25
1
6 1

Texto
Codgo de ruta
Nombre de ruta
pago por viaje al chofer
Texto
Nro de Viaje
Codigo de ruta
Fecha de salida
Hora de Salida
Costo del Viaje
Nro de vacantes
Codigo del Chofer
S(si) N(no) viaje realizado
Texto
Numero de Boleto
Nro de Viaje
Nombre del pasajero
(E)studiante (A)dulto (N)io

Texto
Codigo del Chofer
Nombre del chofer
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

Power Builder 9.0

-633.- 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
Nio
Adulto

30%
50%
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.

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

ST_1

-65St_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)+

Power Builder 9.0

-66-

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.

Power Builder 9.0

-67-

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.

Power Builder 9.0

-68-

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
Datag01
Datag02
Datag03

Tablas
Departamento
y Salarios
Departamento
y Salarios
Empleado

Campos
Nom_dept,
Cod_emp
Cod_emp,sueldo

Category

Values

Nom_dept

Count(Cod_emp)

Cod_emp

Sueldo

Todos

Data01 y Data02 son estilos graficos, mientras Data03 estilo freeform

Power Builder 9.0

Retrieval
Arguments

Nom_dept
Cod_emp

-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

-70Script 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

-71if 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:

Power Builder 9.0

-722.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

-734.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

-74i_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
Codal
NomAl
Ape
Femat

Tipo
C(6)
C(15)
C(15)
Date

Power Builder 9.0

Descripcin
Cdigo
Nombre
Apellido
Fecha de Matricula

CURSOS
Campo
Tipo
CodCur
C(4)
NomCur
C(15)
NHrCur
N

Descripcin
Cod. Curso
Asignatura
Nro de Horas

-75NOTAS
Campos
Codal
Codcur
Exp
Exf

Tipo
C(6)
C(4)
N
N

Descripcion
Cdigo Alumno
Curso
Ex. Parcial
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.

Power Builder 9.0

-764) 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
ID
(N)
Fname
(C)
Lname
(C)
Company_name ( C)
State
( C)

Clientes
Identificacin del Clie
Primer Nombre
Ultimo Nombre
Nombre _Compaa
Rstado

Sales_Order
ID ( N)
Cust_id ( N )
Order_Date ( D )
Region
(C)

Orden dePedido
Nro de Pedido
Identificacin del Clie
Fecha de pedido

Sales_Order_Items
ID ( N )
Line_Id (N)
Prod_ID
Quanty
Ship_Date

( detalle del Orden)


Nro de Pedido
Nro de Item
Codigo de Producto
Cantidad
Fecha de Envio

Product
ID ( N)
Description
Unit_Price

Producto
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:

Power Builder 9.0

-77Clientes
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.

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

-78ole_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

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
mailReturnCode
mailMessage
mailFileDescription
string
ls_filename
string
int
boolean

mSes
mRet
mMsg
mAttach[]
ls_ret, ls_syntax, ls_name, ls_open_pathname,
ls_attach_name='c:\pbl\error.psr'
li_index, li_nret, li_nrecipients, li_nfile
lb_noerrors

mSes = create mailSession


mRet = mSes.mailLogon ( mailNewSession! )

Power Builder 9.0

-81If 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
mMsg.Subject=sle_titulo.text
SetPointer(HourGlass!)
mRet = mSes.mailsend ( mMsg )
mSes.mailLogoff()

// destinatario
// subject

APIS DE EN POWER
Declaracin de Funciones externas

Mostrar la Barra de
estado

Ver el Nombre de la maquina


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:

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

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


Aplicacin: 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-

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)

Power Builder 9.0

-85tv_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

-86if 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
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

Power Builder 9.0

-88Char 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

Power Builder 9.0

-89dw_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:

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

Power Builder 9.0

-9112.- 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 ( )
/*

Power Builder 9.0

-92** El cdigo que quieres testear


*/
ll_elapsed = CPU ( ) - ll_Start

Sugerencias:

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

Power Builder 9.0

You might also like