Transcript
Page 1: 12404687 Manual Power Builder

-1-

Power Builder 9.0

POWERBUILDER 9.0

Ing. Alberto Moreno C.

Universidad Nacional de Ingenieria

Page 2: 12404687 Manual Power Builder

-2-

Power Builder 9.0

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 :[email protected]

La frase debo hacer algo resuelve mas problemas que la frase hay que hacer algo

Page 3: 12404687 Manual Power Builder

-3-

Power Builder 9.0

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)

Page 4: 12404687 Manual Power Builder

-4-

Power Builder 9.0

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

Page 5: 12404687 Manual Power Builder

-5-

Power Builder 9.0

CAPITULO DE FUNCIONES

Funciones del Control:CLEAR()

Borra el contenido de un objeto

Syntax

objectname.Clear ( )

Controls

DataWindow, EditMask, MultiLineEdit, SingleLineEdit, RichTextEdit,

DropDownListBox, DropDownPictureListBox, OLE controls, and OLEStorage

objects

DELETEITEM()

Borra un item desde una lista de valores

Syntax

objectname.DeleteItem ( index )

Controls

ListBox, DropDownListBox, PictureListBox, and DropDownPictureListBox controls

Ejemplo:

Esta sentencia borra el primer item seleccionado en Lb_productos

integer Xindex // Variable de tipo entero

Xindex = lb_software.SelectedIndex() // Capturamos la 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

Page 6: 12404687 Manual Power Builder

-6-

Power Builder 9.0

string s // Variable de tipo cadena

s = "Insertar Item" // Almacenamos un valor a la variable

Xrow = lb_software.AddItem(s) // Insertamos el valor de la variable (s) en el

listbox

FINDITEM()

Busca un texto dentro de una lista de valores, retorna un valor 1 si no encuentra el dato

a buscar.

Syntax

objectname.FindItem (text, index)

Controls

ListBox, DropDownListBox, PictureListBox, and DropDownPictureListBox controls

Ejemplo

Inserta en un control listbox el siguiente contenido:

integer XIndex

XIndex = lb_software.FindItem("Power Builder", 1)

En este ejemplo el valor de index será 6

INSERTITEM

Inserta un item dentro de una lista de valores

Syntax

objectname.InsertItem (item, index)

Controls

ListBox and DropDownListBox controls

Page 7: 12404687 Manual Power Builder

-7-

Power Builder 9.0

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)

Page 8: 12404687 Manual Power Builder

-8-

Power Builder 9.0

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

Page 9: 12404687 Manual Power Builder

-9-

Power Builder 9.0

Syntax

objectname.SetState (index, state)

Controls

ListBox and PictureListBox controls

ejemplo

lb_software.SetState(6, TRUE)

Page 10: 12404687 Manual Power Builder

-10-

Power Builder 9.0

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:

Page 11: 12404687 Manual Power Builder

-11-

Power Builder 9.0

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:

Page 12: 12404687 Manual Power Builder

-12-

Power Builder 9.0

Cad= especialización // devuelve ESPECIALIZACION.

FUNCIONES FECHADAY Retorna el día de una fecha.

Ejemplo:

Dia = String(Day(2001-04-21)) // retorna 21, convertimos el dato de 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

Page 13: 12404687 Manual Power Builder

-13-

Power Builder 9.0

Ejemplo

Hora = String(now(), HH:mm:ss ) // string(dato,tipo de salida del dato), en este

caso es

hora:minuto:segundo.

RELATIVEDATE Retorna la fecha con respecto a un determinado 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())

Page 14: 12404687 Manual Power Builder

-14-

Power Builder 9.0

FUNCIONES NUMÉRICASABS 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

Page 15: 12404687 Manual Power Builder

-15-

Power Builder 9.0

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

Page 16: 12404687 Manual Power Builder

-16-

Power Builder 9.0

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

por ejemplo si:

Funciones a crear

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

Paso 1.- Declarar a nivel de instancia (Pestaña Instancia)

Declare InstanciaString vec1[]={"Uno","dos","Tres","cuatro","cinco","seis","siete","ocho","nueve"}String vec2[]={"Once","doce","trece","catorce","quince","dieciseis", "diecisiete", & "dieciocho","diecinueve"}String vec3[]={"Diez","viente","trienta","cuarenta","cincuenta","sesenta", & "setenta","ochenta","noventa"}String vec4[]={"Ciento","Doscientos","trescientos","cuatroscientos","quinientos", & "seiscientos", "setecientos","ochocientos","novecientos"}

Em_1 control deedicion

Mle_1 Contol demúltiple linea

F_centena

Num=345

Devuelve en letras:Trescientos cuarenta y cimco

F_mil F_mill

Num

Letra

NumTipo int

Letra

Page 17: 12404687 Manual Power Builder

-17-

Power Builder 9.0

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

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

a) Tipo de acceso a la 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,cad2Int c,res,d,unic=num/100res= mod(num,100)if c>0 Then if c=1 and res=0 then cad1="Cien" else cad1=vec4[c]end ifchoose 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 ifend choose return cad1 + cad2

ba c fd g

Page 18: 12404687 Manual Power Builder

-18-

Power Builder 9.0

Funcion miles

Tipeamos el siguiente código:

String cad1,cad2Int res,milmil=num/1000res= mod(num,1000)

if mil>0 then if mil=1 then cad1="Mil " else Cad1=f_centena(mil)+" Mil"end if

if res>0 Thencad2=f_centena(res)

end if return cad1 + " " + cad2

Procedemos a ejecutar la aplicacion y veremos los resultados.

Page 19: 12404687 Manual Power Builder

-19-

Power Builder 9.0

FUNCIONES APLICADAS A CONTROL DATA WINDOWS

Estructura de un Datawindows

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.

Edit Control

Page 20: 12404687 Manual Power Builder

-20-

Power Builder 9.0

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:

Page 21: 12404687 Manual Power Builder

-21-

Power Builder 9.0

DwnSoftware.InsertRow(0)

Retrieve()

Recupera todas las filas de una tabla de la BDD en un control DataWindow, Si incluyen

argumentos, estos son usados por los argumentos de recuperacion de la sentencia SQL

SELECT del objeto DataWindow. Retorna el 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

Page 22: 12404687 Manual Power Builder

-22-

Power Builder 9.0

SetItem

Establece el valor en una fila y columna especificada, un valor dentro del datawindow,

retorna -1 si ocurre un error.

Sintaxis DwnSoftware.Setitem (Fila, columna/campo, valor)

Ejemplo:

Dwn.SetItem(5, "sueldo",670)

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

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.

Page 23: 12404687 Manual Power Builder

-23-

Power Builder 9.0

Int edad

Dec Sbas

Date Fenac

Edad= DwnEmpleado.GetItemNumber(3,"emp_Edad")

Sbas= DwnEmpleado.GetItemDecimal(3, "emp_Sbas")

Fenac=DwnEmpleado.GetItemDate(3,"emp_Fenac")

Nombre del campos en la tabla.

Gettext

Obtiene el valor de un control de edicion en la fila y columna actuales, antes que este sea

aceptado.

Sintaxis dwn.Gettext ()

Por ejemplo si este radio button se encuentra dentro del DataWindow, y al seleccionar

una de estas opciones se desea saber su valor seleccionado basta emplear:

String Tmoneda

Tmoneda = DwnSalario.Gettext()

Setsort

Especifica, el criterio de ordenamiento para un DataWindow, retorna 1 si tuvo éxito y -1 si

se encontro un error.

Sintaxis Dwn.SetSort (campo1 [A|D])

Ejemplo:

DwnEmpleado.setsort()

Dwn.Sort()

Page 24: 12404687 Manual Power Builder

-24-

Power Builder 9.0

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)

Page 25: 12404687 Manual Power Builder

-25-

Power Builder 9.0

ScrollToPriorRow

Se desliza a la fila previa, sin cambiar la columna activa

Sintaxis Dwn.ScrollPriorRow(fila)

ScrollNextRow

Se desliza a la siguiente fila.

Sintaxis Dn.ScrollNextRow(fila)

DeleteRow

Suprime la fila especificada del control DataWindow, se actualiza directamente la tabla

enlazada al control.

Sintaxis Dwn.DeleteRow(fila)

Si la fila es igual a cero, elimina la fila activa donde se encuentra el puntero, cada vez que

se emplee esta sentencia, se tiene que actualizar el DataWindow ejemplo:

Dwn.deleteRow(8) // elimina la fila 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()

Page 26: 12404687 Manual Power Builder

-26-

Power Builder 9.0

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.

A

A

B

Page 27: 12404687 Manual Power Builder

-27-

Power Builder 9.0

Pasos 1.- La BDD VENTA.DB puede estar en cualquier motor de Base de dato,

para este caso se hace uso del AnyWhere del SYSBASE (entorno del

PowerBuilder)

TABLAS

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

continuación:

FACTURA VENDEDOR

Paso 2.- Diseñar el DataWindow - (File-New-DataWindow)

- Se elige el estilo de Presentación: (Elegir el Tipo Tabular)

Estructura:Vendedor:Codv Char 4 Null(no)Nomv varchar 30Sbas Numeric 8,2

FacturaNfac char 6Codv char 4Impor Numeric 8,2Tipov char 1

Page 28: 12404687 Manual Power Builder

-28-

Power Builder 9.0

Presentación DescripciónComposite 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, yotras opciones.

Rich Text Permite definir una carta con combinación de campos delOrigen de Datos fijado. Se pueden utilizar todas lascaracterísticas del formato de texto RTF.

Tabular Presenta el Origen de Datos en forma columnada pero sinajuste total. Permite una mayor libertad en el diseño.

Page 29: 12404687 Manual Power Builder

-29-

Power Builder 9.0

Modos de trabajo: (Seleccione SQl Select)

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

Modo DescripciónQuick Select Nos presenta las tablas en forma gráfica, y solo permite las

sentencias ordinarias de SQL (Sort y Criteria). La primera parasentencia sirve para poder ordenar por el campo específico y lasegunda sentencia para indicar registros a mostrar dependiendode un valor condicional (Ejemplo: <39)

Sql Select Presenta las tablas en forma gráfica, y permite trabajar contodas 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 elArea de Trabajo Query; esta consulta queda almacenada comoun objeto de PowerBuilder; Ud. debe seleccionar la consulta quedesee 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 delos ya existentes, el botón Insert le permitirá insertar un campoentre otros y el botón Delete le permitirá eliminar el campoactual.

StoredProcedure

El Origen de Datos es un procedimiento que ha sidoalmacenado en la Base de Datos. Seleccione uno si lo hacreado, o créelo previamente.

Page 30: 12404687 Manual Power Builder

-30-

Power Builder 9.0

Al seleccionar SQL SELECT mostrara la siguiente pantalla:

Seleccione las tablas a usar y precione el boton Open, de inmediato apareceran lasatablas 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)

Page 31: 12404687 Manual Power Builder

-31-

Power Builder 9.0

Teniendo opción a validar cada campo de ingreso o de salida a traves de suspropiedades.

Proceda a grabar el objeto DataWindow (almacene en la biblioteca creada y asignarle uncomentario, para determinar cuando se debe de usar dicho DW), tendremos la siguiente

vista:

Color de fondodel DW

Color del textodel DW

Color de lasCabeceras del DWEstilo de lascabecera del DW

Estilo del textodel DW

Preview

Diseño

Propiedades

Columns Specification

Page 32: 12404687 Manual Power Builder

-32-

Power Builder 9.0

Una vez Grabado colocarlo en el formulario: (File-New-Project-Window)A traves de la caja de herramientas.Controles DataWindows (dw_1, dw_2), como se observa acontinuación:

Dw_1

Dw_2

ddplb_1

Page 33: 12404687 Manual Power Builder

-33-

Power Builder 9.0

Objeto DataWindow Control (Caja de Herramientas)

El Objeto DataWindow Control se selecciona del listado de objetos que se pueden

insertar en una ventana, simplemente haga un clic sobre el siguiente icono .Luego haga un clic en la posición de la ventana, donde desea poner elDataWindow Control.

Paso 4.- En el control ddplb ingresamos los siguientes ítems:

Paso 5.- Codificar en el control ventana1, evento open(), lo siguiente

//establece las conexiones con los Objetos DataWindowsdw_1.settransobject(sqlca)dw_2.settransobject(sqlca)

//carga los datos en el bufferdw_1.retrieve()dw_2.retrieve()

Nombre por defecto del ControlDataWindow.

Seleccionar el Objeto DataWindow,previamente creado.

Propiedades complementarias alcontrol DataWindow.

Page 34: 12404687 Manual Power Builder

-34-

Power Builder 9.0

//ordena el DataWindow por el campo nombre ascendentemente.dw_1.setsort ("#1 a")dw_1.sort()

//establece las posiciones de orden, segun el TABULADORsle_1.taborder=0ddplb_1.taborder=1sle_2.taborder=2cb_1.taborder=3dw_1.taborder=4dw_2.taborder=5

//limpia las cajas de textosle_1.text=""sle_2.text=""

//establece el foco del cursorsle_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 variablesstring buscaint nf,r

//preguntamos si se ha escrito algúna letra en el control sle_1If 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)

Page 35: 12404687 Manual Power Builder

-35-

Power Builder 9.0

end ifend if

Paso 7.- Codificar en el control sle_1, evento modify(), lo siguiente

STRING cad

// la funcion Trim suprime los blancoscad = "Sbas " + trim(ddplb_1.text) + " " + trim(sle_2.text)dw_2.setfilter(cad)dw_2.filter()

Paso 8.- Codificar en el cb_1, evento clicked(), lo siguienteint r

r=dw_1.getrow()dw_1.selectrow(0,false)dw_1.selectrow(r,true)

Script a Nivel de la Aplicación:

// Profile VentaSQLCA.DBMS = "ODBC"SQLCA.AutoCommit = FalseSQLCA.DBParm = "Connectstring='DSN=venta'"//nos conectamos con la Base de Datosconnect;//preguntamos si ha ocurrido un error en la conexiónIf Sqlca.Sqlcode<>0 then Messagebox ("Error de Conexión",Sqlca.SqlErrText) Haltelse

//abrimos la ventana 1 de nuestro proyecto open(ventana01)end if

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

Page 36: 12404687 Manual Power Builder

-36-

Power Builder 9.0

Clic en elsiguiente iconoy obtendremosla siguienteventana

Clic en el boton Edit….

Clic en la siguiente pestañaObtendremos la siguiente vista

Page 37: 12404687 Manual Power Builder

-37-

Power Builder 9.0

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

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

Page 38: 12404687 Manual Power Builder

-38-

Power Builder 9.0

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

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

Observe el grafico

Luego Pulse ctrl. + W

Nombre de la VariableTipo de dato querecibirála variable

Page 39: 12404687 Manual Power Builder

-39-

Power Builder 9.0

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

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

1 2 3

Page 40: 12404687 Manual Power Builder

-40-

Power Builder 9.0

Para ver como esta saliendo el diseño puede comprobarlo mediante la opción Row delmenú principal y seleccionando Retrieve, para ello le pedirá ingresar un código devendedor.

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

Page 41: 12404687 Manual Power Builder

-41-

Power Builder 9.0

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

Codificar la siguiente sentencia, para determinar la comisión del empleado, si tipo deempleado 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 pagototal.

Page 42: 12404687 Manual Power Builder

-42-

Power Builder 9.0

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 seleccionarInsert-Control-Computed Field y editar la siguiente expresión.

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

Grabarlo como Data01.

Page 43: 12404687 Manual Power Builder

-43-

Power Builder 9.0

Paso 8.- Luego Inserte un formulario o ventana para colocar el DataWindow, lapresentació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 CadCad=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 VentaSQLCA.DBMS = "ODBC"SQLCA.AutoCommit = FalseSQLCA.DBParm = "Connectstring='DSN=venta"connect;

Page 44: 12404687 Manual Power Builder

-44-

Power Builder 9.0

If Sqlca.Sqlcode<>0 then Messagebox ("Error de Conexión",Sqlca.SqlErrText) Haltelse open(ventana01)end if

Mantenimiento de una BDD

Utilizar la tabla vendedor agregando los campos feing (fecha de ingreso) y grado (gradode estudios).

Realizar también las validaciones correspondientes en cada campo:

Paso 1.- crear una función a nivel de la aplicación (file-new-project-Function)

Page 45: 12404687 Manual Power Builder

-45-

Power Builder 9.0

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

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.

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.

Page 46: 12404687 Manual Power Builder

-46-

Power Builder 9.0

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

Paso 3.- Diseñar el siguiente Formulario:

Nombre de la Ventana: Ventana02

Page 47: 12404687 Manual Power Builder

-47-

Power Builder 9.0

Nombre de la Ventana: Ventana03

Script Open for aplicación

// Profile VentaSQLCA.DBMS = "ODBC"SQLCA.AutoCommit = FalseSQLCA.DBParm = "Connectstring='DSN=venta"connect;If Sqlca.Sqlcode<>0 then Messagebox ("Error de Conexión",Sqlca.SqlErrText) Haltelse open(ventana02)end if

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

Page 48: 12404687 Manual Power Builder

-48-

Power Builder 9.0

Script clicked for pb_antDw_1.ScrollPriorRow()Dw_1.Setfocus()

Script clicked for pb_SgteDw_1.ScrollNextRow()Dw_1.Setfocus()

Script clicked for pb_Ultlong nfnf=dw_1.rowcount()dw_1.scrolltorow(nf)dw_1.setfocus()

Script clicked for Cb_NuevoInt Nflong nfnf=dw_1.insertrow(0)dw_1.scrolltorow(nf)dw_1.setfocus()dw_1.setcolumn("codv")cb_graba.enabled=true

Script clicked for Cb_grabaint resres=dw_1.update()if res=1 then commit using sqlca; //cd_recupera.enabled=falseelse rollback using sqlca;end ifcb_recupera.triggerevent(clicked!)cb_graba.enabled=falseEnd if

Script clicked for Cb_Anulalong nfnf=dw_1.getrow()if nf>0 then dw_1.deleterow(nf) dw_1.update() dw_1.scrolltorow(1)end ifcb_recupera.triggerevent(clicked!)cb_anula.enabled=false

Script clicked for Cb_RecuperaDw_1.Retrieve()

Page 49: 12404687 Manual Power Builder

-49-

Power Builder 9.0

cb_graba.enabled=falsecb_recupera.enabled=false

Script clicked for Cb_Buscaopen(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_SalirHalt

Paso 4.- En la ventana 03 codificar los siguientes script

Script Load for Ventana03sle_1.text=""sle_1.setfocus()

Script Modify for sle_1string cadlong nfnf=ventana02.dw_1.getrow()cad="codv = '" + trim(sle_1.text) + "'"ventana02.dw_1.setfilter(cad)ventana02.dw_1.filter()

if ventana02.dw_1.rowcount()=0 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

Page 50: 12404687 Manual Power Builder

-50-

Power Builder 9.0

Elaboracion de una factura

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

Los Script para cada evento1.- W_Factura Opendw_1.settransobject(sqlca)dw_fac.Settransobject(Sqlca)dw_1.retrieve(" ")

Cb_Nueva Clickedint fselect max(Nfac) into :xfac from fac_cab;if isnull(xfac) then

Page 51: 12404687 Manual Power Builder

-51-

Power Builder 9.0

xfac=0end ifxfac++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 Itemint filafila=dw_1.getrow()

Page 52: 12404687 Manual Power Builder

-52-

Power Builder 9.0

if fila>0 thendw_1.deleterow(fila)dw_1.update()end if

Cb_Totaliza Clickeddec tot,igv,netotot=dw_1.getitemnumber(1,"totgen")igv=tot*0.18 ; neto=tot+igvst_venta.text=string(tot,"##,###.00")st_igv.text=string(igv,"#,###.00")st_neto.text=string(neto,"###,###.00")

Cb_Graba 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 rr=dw_fac.Update()if r=1 then commit;else Rollback;end if// Grabacion del detalle Facturar=dw_1.update()if r=1 then Commit;Else Rollback;End if// Actualizar La tabla Stockint Fila,xcanString XcodFor Fila=1 to Dw_1.Rowcount()Xcod=Dw_1.GetItemString(fila,"codpro")Xcan=Dw_1.GetItemNumber(Fila,"can")

Update Fac_detaSet Stock = Stock - :Xcan Where Codpro= :Xcod;NextCommit;

Dw_pro Activate ( en la ventana de consulta de productos)sle_1.setfocus()dw_1.retrieve()

Dw_pro Opendw_1.settransobject(sqlca)

Page 53: 12404687 Manual Power Builder

-53-

Power Builder 9.0

Dw_1 Tecla(Keycode Key, UnsignedLong KeyFlags)

int rdec precioif key=keyenter! thenr=dw_1.getrow()cad=dw_1.getitemstring(r,1)precio=dw_1.getitemNUmber(r,"puni")W_factura.dw_1.setitem(W_factura.dw_1.getrow(),"codpro",cad)W_factura.dw_1.setitem(W_factura.dw_1.getrow(),"puni",precio)W_factura.dw_1.setcolumn(4)close(parent)end ifif key=keyescape! then dw_1.setfilter("") dw_1.filter() sle_1.text="" sle_1.setfocus()end if

Sle_1 Modified

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

Page 54: 12404687 Manual Power Builder

-54-

Power Builder 9.0

Aplicacion

Considerando que tenemos el mantenimiento de la tabla cursos, al realizar un click en elboton Alumnos, se carga la ventana de alumnos, pero solo se mostrarán los datos deaquellos alumnos de dicho curso (Fila activa de la Tabla Cursos).Para la Ventana alumnos elaboramos:

Un Objeto DataWindowData Source SQL SelectStyle TabularNombre 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 campoutilizado como argumento.

Paso 3.- En la Ficha Where se debe especificar, la relacion entre el campo y la variable

Page 55: 12404687 Manual Power Builder

-55-

Power Builder 9.0

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

File – New – pestaña PB Object - Structure.

En la venta de dialago, especifique: Codigo_Curso de tipo String Nombre_Curso de Tipo de string

Se debe almacenar como S_curso

Paso 5.- En la ventana alumnos (VenAlumnos)Declarar una variable de instanciaString 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 decursos).La ventana VenAlumnos debe recibir el parametro (código del curso), que se envia desdela Ventana VenCursos.

Paso 7Script -Clicked for Cb_alumnos (W_cursos)long nfS_curso Origen //asignamos una variable llamada origen de tipo S_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 8Script -Open for (VenAlumnos)

S_curso Destino

Destino=message.powerobjectparmvi_codcur=Destino.codcurthis.title=vi_codcur + " - " + Destino.nomcurcb_graba.enabled=falsedw_1.SETTRANSOBJECT(sqlca)dw_1.retrieve(vi_codcur)Dw_Alumnos.SetRowFocusIndicator(Hand!)

if dw_1.rowcount()<>0 then dw_1.modify("alu_pro.color='0~tif(alu_pro>=11,RGB(0,0,255),RGB(255,0,0))'")

Paso 9.- Codificacion de los botones de desplazamiento

Page 56: 12404687 Manual Power Builder

-56-

Power Builder 9.0

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

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

Script clicked for pb_UltInt nfNf=dw_1.RowCount()Dw_1.Scrolltorow(Nf)Dw_1.Setfocus()

Script clicked for Cb_Nuevolong nfnf=dw_1.insertrow(0)dw_1.scrolltorow(nf)dw_1.setitem(nf,"cur_cod",vi_codcur)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_grabalong resres=dw_1.update()if res=1 then commit using sqlca;// cb_graba.enebled=falseelse rollback using sqlca;end ifdw_1.retrieve(vi_codcur)dw_1.scrolltorow(1)

Script clicked for Cb_Anulalong nfnf=dw_1.getrow()if nf>0 then dw_1.deleterow(nf)

Page 57: 12404687 Manual Power Builder

-57-

Power Builder 9.0

dw_1.scrolltorow(1)end if

Script clicked for Cb_Recuperadw_1.retrieve(vi_codcur)cb_graba.enabled=false

Script RowFocusChanged For Dw_1// evento que se activa cada vez que se enfoca un nuevo registrolong nfilas,factnfilas=dw_alumnos.Rowcount()fact= dw_alumnos.GetRow()st_mensaje1.text="Fila" +String(fact)+" de"+string(nfilas)

Script ItemFocusChanged For Dw_alumnos// Este evento se dispara cada vez que nos situamos en un nuevo campo o columnaint ncnc=dw_1.getcolumn()st_mensaje2.text="Columna " + string(nc)

Script ItemChanged For Dw_1

/* se activa cada vez que realizamos cualquier cambio dentro de la ventana */

dec nota,n1,n2,n3,n4,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 ifend if

Page 58: 12404687 Manual Power Builder

-58-

Power Builder 9.0

Script ItemError For Dw_alumnosReturn 1

PRIMERA PRÁCTICA CALIFICADA

1. Especificaciones de la aplicaciónCreadas las tablas con sysbase SQL Anywhere para almacenar las facturas de losclientes

• Productos (Clave principal cod_Prod)• Clientes (Clave principal Cod_Cli)• Facturas (Clave Principal Num_Fact,

Clave Foranea Codigo del Cliente)• Deta_Factura (Clave Principal Num_fact,Cod_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 lossiguientes 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 totalgeneral.

3.4 La ventana (VConFacturas) tendra un boton Detalle donde permite visualizar enotra ventana( VFacDetalle) el detalle de la factura

3.5 Ventana (VFacDetalle) debe mostrar todos los campos de la tabla detalle facturacon el campo descripcion del producto (tabla producto).

Page 59: 12404687 Manual Power Builder

-59-

Power Builder 9.0

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 yactualizar el saldo en el archivo ahorro.

Page 60: 12404687 Manual Power Builder

-60-

Power Builder 9.0

Script open for aplicación:

// Profile conexion con sqlserverSQLCA.DBMS = "MSS Microsoft SQL Server 6.x"SQLCA.Database = "BDBANCO"SQLCA.ServerName ="(local)"SQLCA.LogId = "SA"SQLCA.AutoCommit = FalseSQLCA.DBParm = ""CONNECT; if sqlca.sqlcode<>0 then messagebox("Error de coneccion",sqlca.sqlerrtext) haltend if

open(Venahorro)

Script modified for Sle_1int r,vnro,fila,xnro,nfstring 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

Page 61: 12404687 Manual Power Builder

-61-

Power Builder 9.0

Script Itemchanged for Dw_2

string nomcolint filadec monchar tpfila=this.getrow()nomcol=this.getcolumnname()mon=this.getitemnumber(fila,"monto")choose case Lower(nomcol) case "tipoopr" //tp=trim(this.getitemstring(fila,"topr")) //valor obtenido en el 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 rstring cadcad=dw_1.getitemstring(dw_1.getrow(),"numcta")

// Actualizacion en el archivo ahorro//modo 1//dw_1.setitem(1,"saldo",nsal)//dw_1.update()//modo 2Update ahorroset saldo = :nsalwhere numcta=:cad;

r=dw_2.update()if r=1 then commit;else rollback;end if// borrar el contenido de los control data windowdw_2.reset()dw_1.reset()

Page 62: 12404687 Manual Power Builder

-62-

Power Builder 9.0

SEGUNDA PRÁCTICA CALIFICADA

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

Tablas:

Rutas tipo Long Texto

Cod_rut Char 4 Codígo de rutaNom_rut Varchar 15 Nombre de rutaPago_cho Numeric 6 1 pago por viaje al chofer

Viajes tipo Long Texto

Nro_via Char 6 Nro de ViajeCod_rut Char 4 Codigo de rutaFsal_via Date Fecha de salidaHsal_via Time Hora de SalidaCos_via Numeric 6 1 Costo del ViajeNro_vac Numeric 3 Nro de vacantesCod_cho Char 4 Codigo del ChoferFlag Char 1 S(si) N(no) viaje realizado

Pasajeros tipo Long Texto

Nbol Numeric 5 Numero de BoletoNrovia Char 6 Nro de ViajeNom_pas Varchar 25 Nombre del pasajeroTipo Char 1 (E)studiante (A)dulto (N)iñoPago Numeric 6 1

Chofer tipo Long TextoCod_cho Char 4 Codigo del ChoferNom_cho Varchar 25 Nombre del choferSba_cho Numeric 6 1 Sueldo basico

Realizar:

1.- Colocar las claves principales y foráneas para cada tabla, cuando relacione cada tablaconformar la opcion:

• Delete any Dependent Rows (CASCADE), por ejmplo cuando se anule un registro enviaje anule a todos los pasajeros.

2.- La aplicación debe permitir realizar el manteniemiento para cada tabla

Page 63: 12404687 Manual Power Builder

-63-

Power Builder 9.0

3.- En el mantenimiento del archivo de viajes debe tener un botón de Pasajeros de talmodo que permita visualizar solo los pasajeros de ese viaje en otra ventana (adicion,anulacion y modificacion), en la adicion se trae el campo nro de viaje y costo de laventana anterior(ambos de estilo tabular), el pasajero tendra un descuento de acuerdoal tipo :

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 debeincorporarse un DataWindow para cada uno, para que su selección sea más explícita.

• El número de Boleto se genera a partir del 00001 de manera correlativa

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

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

5.- Consulta de viajes por rutas. En esta ventana; al elegir una ruta (en un controlDataWindow) debe mostrar todos los viajes programados (en otro control data) alseleccionar el viaje debe mostrar la relacion de pasajeros.

6.- Consulta de viajes por fecha, en esta ventana se debe ingresar dos fechas: fechainicial y final en caso que solo se ingrese la fecha inicial se debe tomar hasta la últimafecha de viaje, mostrando en un control DataWindow las siguientes columnas:

NroViaje,Nombre de ruta , Nombre del pasajero y tipo

7.- Elabore un menú para relacionar cada opcion con las tareas pedidas.

8.- El diseño y presentación de cada ventana es de acuerdo a criterio del alumno.

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

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

Page 64: 12404687 Manual Power Builder

-64-

Power Builder 9.0

Objetos de Usuario

Tema Custom Clases Visuales

Por ejemplo se desea realizar el siguiente evento de usuario:

Paso 1.- En New seleccionar PB OBJECT

Seleccionar Custom Visual

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

ST_1ST_2

Page 65: 12404687 Manual Power Builder

-65-

Power Builder 9.0

St_pg (para ver el porcentaje)

Codificación del uo_progresoDeclare Instancia Int Ir_alfinal

Functions Uf_iniciar(int vini) return noneir_alfinal=vinist_2.width=0

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

Page 66: 12404687 Manual Power Builder

-66-

Power Builder 9.0

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 através de Vscroll

d) Colocando dos listBox , al desplazarse en uno de ellos que se encuentresincronizado

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 elcontrol DataWindow y el número de columna.

b) Un evento que permita centrar una ventana, se pasa como valor una ventana.

c) Una función que permita generar un código, se pasa como dato un controlDataWindow, el valor inicial del código, el código puede empezar con una letra onúmero.

d) Un evento que permita cambiar el color de una columna de un controlDataWindow, pasar como dato el control DataWindow y el número de columna.

Page 67: 12404687 Manual Power Builder

-67-

Power Builder 9.0

Capitulo de Graficos en Power Builder

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

Pasos para crear un grafico.

Page 68: 12404687 Manual Power Builder

-68-

Power Builder 9.0

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

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

Datawindow Tablas Campos Category Values RetrievalArguments

Datag01 Departamentoy Salarios

Nom_dept,Cod_emp

Nom_dept Count(Cod_emp)

Datag02 Departamentoy Salarios

Cod_emp,sueldo Cod_emp Sueldo Nom_dept

Datag03 Empleado Todos Cod_emp

Data01 y Data02 son estilos graficos, mientras Data03 estilo freeform

Page 69: 12404687 Manual Power Builder

-69-

Power Builder 9.0

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

LauraMoreno Lee

Page 70: 12404687 Manual Power Builder

-70-

Power Builder 9.0

Script open for Aplicacion

// Coneccion con la Base de Datos// Profile conexion con sqlserverSQLCA.DBMS = "MSS Microsoft SQL Server 6.x"SQLCA.Database = "Empresa"SQLCA.ServerName ="(local)"SQLCA.LogId = "SA"SQLCA.AutoCommit = FalseSQLCA.DBParm = ""connect;open(VenEstadistica1)

Script open for ventana VenEstadistica1

dw_1.settransobject(sqlca)dw_2.settransobject(sqlca)dw_1.retrieve()

Script Cliked for dw_1 (VenEstadistica1)

GrObjectType ClickedObjectstring nomdept,nomgraf="gr_1"int v_series,v_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 ClickedObjectstring nomgraf='gr_1'int v_series,v_categoriastring id_emp

ClickedObject=This.ObjectAtPointer(nomgraf,v_series,v_categoria)

Page 71: 12404687 Manual Power Builder

-71-

Power Builder 9.0

if ClickedObject=Typedata! or ClickedObject=TypeCategory! then id_emp= this.CategoryName(nomgraf,v_categoria) openwithparm(venfichae,id_emp)Else Messagebox(parent.title,"Click en departamento para ver Detalle de empleado")end if

Open for VenFichaEmpstring coddw_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 ventanaw_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 queseran empleados, por las otras ventanas descendientes (w_alumnos y W_cursos);ademas se han elaborado las funciones de objeto usuario con la finalidad de generalizarlas tareas de los eventos.

1.- Para crear un objeto usuario siga los pasos del profesor:a)b)c)

2.- Crear un menu (menu01) con todas las opciones descritas:

Page 72: 12404687 Manual Power Builder

-72-

Power Builder 9.0

2.1 Crear un menu02 heredado(inheret) del menu01

3.- Elaborar las siguientes Ventanas:3.1 Ventana W_frame aquel que va a contener el menu01 y el objeto de Usuario

Creado en el punto 13.2 Ventana W_sheet_dw ventana padre que contiene un control datawindow(dw_1)

sin relacionar a ningun objeto datawindow3.3 Ventana W_alumno heredado de la ventana (W_sheet_dw) y relacionarlo con el

menu023.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 InstanciaDatawindow idw_udo

4.2 Funcion de Objeto de usuarioUf_setdw(datawindow dw_parm)idw_udo=dw_parm

4.3 Script Clicked for Cb1idw_udo.scrolltorow(1)idw_udo.setfocus()

4.4 Script Clicked for Cb2idw_udo.scrollnextrow()idw_udo.setfocus()

4.5 Script Clicked for Cb3idw_udo.scrollPriorRow()idw_udo.setfocus()

4.6 Script Clicked for Cb4int nfnf=idw_udo.rowcount()idw_udo.scrolltorow(nf)idw_udo.setfocus()

4.7 Script Clicked for Cb5idw_udo.retrieve()idw_udo.triggerEvent(rowfocusChanged!)idw_udo.setfocus()

4.8 Script Clicked for Cb6int nfnf=idw_udo.insertrow(0)idw_udo.scrolltorow(NF)idw_udo.setfocus()

Page 73: 12404687 Manual Power Builder

-73-

Power Builder 9.0

4.9 Script Clicked for Cb7 int r r=idw_udo.update() if r=1 then commit; else rollback; end if

5.- Eventos para la ventana W_frame Script Risize for w_frame

int nX, nY, nWidth, nHeight

/*nX = WorkSpaceX (this)nY = WorkSpaceY (this) */

nWidth = this.WorkSpaceWidth( )nHeight = this.WorkSpaceHeight( )

nHeight = nHeight - (uo_1.y + uo_1.height)nHeight = nHeight - mdi_1.MicroHelpHeight

mdi_1.Move (0, uo_1.y + uo_1.height)mdi_1.Resize (nWidth, nHeight + 4)

6.- Evento para la ventana W_sheet_dw declarar la Variable Instancia w_frame iw_frame

integer i_row

6.1 Script activate for w_sheet_dwiw_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_dwiw_frame.arrangeSheets(tile!)

6.5 Script Ue_totalw for w_sheet_dw iw_frame.arrangeSheets(layer!)

6.6 Script Ue_vertical for w_sheet_dwiw_frame.arrangeSheets(tilehorizontal!)

6.7 Script rowfocuschanged for dw_1

Page 74: 12404687 Manual Power Builder

-74-

Power Builder 9.0

i_row=this.getrow()if i_row<1 then returnthis.selectrow(0,false)this.selectrow(i_row,true)

7.- Eventos para el menu017.1 Script m_alumnos for dw_1

window lw_winopensheet(lw_win,"w_alu",parentwindow,0,layered!)

7.2 Script m_cursos for dw_1window lw_winopensheet(lw_win,"w_cursos",parentwindow,0,layered!)

7.3 Script m_vertical for menu01parentwindow.triggerEvent("ue_vertical")

7.4 Script m_horizontal for menu01parentwindow.triggerEvent("ue_horizontal")

7.5 Script m_cascada for menu01parentwindow.triggerEvent("ue_cascada")

7.6 Script m_totalw for menu01 parentwindow.triggerEvent("ue_totalw")

7.7 Script m_close for menu01close(parentwindow)

7.8 Script m_salir for menu01Halt

TERCERA PRÁCTICA CALIFICADA

Elaborar la BDD Matriculas DB, cuyas tablas son:

ALUMNOS

Campo Tipo DescripciónCodal C(6) CódigoNomAl C(15) NombreApe C(15) ApellidoFemat Date Fecha de Matricula

CURSOSCampo Tipo DescripciónCodCur C(4) Cod. CursoNomCur C(15) AsignaturaNHrCur N Nro de Horas

Page 75: 12404687 Manual Power Builder

-75-

Power Builder 9.0

NOTAS

Campos Tipo DescripcionCodal C(6) Código AlumnoCodcur C(4) CursoExp N Ex. ParcialExf 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 esde Peso Doble.

2) Hacer una consulta por apellido , para ello digitara solo los primeros caracteres deun apellido y en un DataWindow de tipo tabular mostrara a todos los alumnos quecomienzan con esos caracteres

3) Consulta por curso, Se ingresara por teclado El código o Nombre de Curso luegoen un DataWindow mostrara a todos los alumnos que llevaron dicho cursoordenado por promedio de manera descendente, los promedios menores a 11mostrarlos con rojo de lo contrario con azul.

Page 76: 12404687 Manual Power Builder

-76-

Power Builder 9.0

4) consulta por fechas, para ello se ingresara dos fechas por teclado la fecha inicial yla Fecha final, en caso de no ingresar la fecha final se tomara en cuenta hasta lafecha actual del sistema. Y mostrara en un DataWindow la relación de alumnosmatriculados en ese rango.

5) Repita el Proceso 1 haciendo una consulta en Cascada, es decir en un formulariohabrá dos DataWindow, en el primer DataWindow mostrara la relación de alumnosy en el segundo todos los cursos que ese alumno ha llevado con su promediorespectivo, de tal modo que al hacer un ClicK o cambiar la fila del DataWindowalumno cambiara automáticamente el segundo DataWindow.

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

CUARTA PRÁCTICA CALIFICADA

De La BDD del Demo de Power Builder Considerar las siguientes Tablas y campos paracada una de llas:

Customer Clientes Sales_Order Orden dePedidoID (N)Fname ( C )Lname ( C )Company_name ( C)State ( C)

Identificación del CliePrimer NombreUltimo NombreNombre _CompañíaRstado

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

Nro de PedidoIdentificación del ClieFecha de pedido

Sales_Order_Items ( detalle del Orden) Product ProductoID ( N )Line_Id (N)Prod_IDQuantyShip_Date

Nro de PedidoNro de ItemCodigo de ProductoCantidadFecha de Envio

ID ( N)DescriptionUnit_Price

Codigo de Prod.DescripciónPrecio Unitario

Las Tablas ya tienen datos consistentes:Realizar:

1) Seleccionando un año en un combo (1996 - 1999) muestre la cantidad de pedidospor Mes durante ese año , los meses deben ser Enero,febre,... (10 Puntos)

2) En una Ventana Muestre la siguiente consulta en Cascada:

Page 77: 12404687 Manual Power Builder

-77-

Power Builder 9.0

ClientesCodigo 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 ocuando se copia emplear controles ole.

Cb_graba Clickedole_1.insertfile("c:\Iamgenes\filecopy.avi")ole_1.activation=activateongetfocus!ole_1.setfocus()

Cb_anula Clicked

ole_1.insertfile("c:\Imagenes\filedel.avi")

Control Ole , insertcontrol Avi

Page 78: 12404687 Manual Power Builder

-78-

Power Builder 9.0

ole_1.activation=activateongetfocus!ole_1.setfocus()int rsOLEObject ole1ole1 = create OLEObjectrs = ole1.SetAutomationTimeOut(10000)

.DataWindow Dinamicos

Sin utilizar objetos datawindow se puede mostrar en un control dartawindow resultados deuna instrucción SQL.

SyntaxFromSql Genera datawindow fuente, basado en instrucciones SQL.

Syntax

transaction.SyntaxFromSQL (sqlselect, presentation, err)Argument Descriptiontransaction Objeto de Transaccionnsqlselect Una Cadena que contiene instrucciones SQLpresentation 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, tabularerr Una cadena donde se va a recepccionar . el mensaje de error en caso quelo hubiera.

Ejemplo:

La siguiente sentencia crea un Datawindow grid en dw_1 desde la fuente generada porla función SyntaxFromSQL Si ocurre un error, la cadena ERRORS podría contenercualquier mensaje de error que es generada, mostrando un mensaje al usuario. Observeque debe efectuarse a través del Objeto SQLCA:

Utilizando la tabla empleados

Page 79: 12404687 Manual Power Builder

-79-

Power Builder 9.0

Cb_Carga Clicked

string ERRORS, sql_syntaxstring presentation_str, dwsyntax_strsql_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) RETURNEND IF

dw_1.Create( dwsyntax_str, ERRORS)IF Len(ERRORS) > 0 THEN MessageBox("Caution", "Create cause these errors: " + ERRORS) RETURNEND IFdw_1.settransobject(sqlca)dw_1.retrieve()

Envio de e-m@il

Si se tiene instalado el Outlook se debe de configurar

ddlb_destinatario

Alberto Moreno Cueva

Bayona Ramos

Page 80: 12404687 Manual Power Builder

-80-

Power Builder 9.0

Pb_1 Clickedstring docname, namedinteger valuevalue = 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 mSesmailReturnCode mRetmailMessage mMsgmailFileDescription mAttach[]string ls_ret, ls_syntax, ls_name, ls_open_pathname,ls_filenamestring ls_attach_name='c:\pbl\error.psr'int li_index, li_nret, li_nrecipients, li_nfileboolean lb_noerrors

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

sle_titulo

mle_texto

Pb_1lb_archivos

Page 81: 12404687 Manual Power Builder

-81-

Power Builder 9.0

If mRet <> mailReturnSuccess! Then MessageBox ("Mail Logon", 'Return Code <> mailReturnSuccess!' ) mSes.mailLogoff() returnEnd IfSetPointer(HourGlass!)mMsg.notetext = mle_texto.text // Mensaje a adjuntar ficheros a enviarlong tt,hayhay=lb_archivos.totalitems()for tt=1 to 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 = mAttachnext

mMsg.Recipient[1].name = ddlb_destinatario.text // destinatariomMsg.Subject=sle_titulo.text // subjectSetPointer(HourGlass!)mRet = mSes.mailsend ( mMsg )mSes.mailLogoff()

APIS DE EN POWERDeclaración de Funciones externas

DescripciónLas funciones externas son escritas en diferentes lenguajes y almacenadas en librerias dinamicascon la extensión DLL, antes de utilizar estas funciones primero debe declararse definiendo su tipo.

Global external functions Estos son disponibles en toda la aplicaciónLocal external functions Estos son definidos a nivel de ventana u objeto de usuario

External function syntax Usa la siguiente sintaxis:

Mostrar la Barra deestado

Ver el Nombre de la maquina

Page 82: 12404687 Manual Power Builder

-82-

Power Builder 9.0

{ access } FUNCTION returndatatype name ( { { REF } datatype1 arg1, ..., { REF } datatypen argn } ) LIBRARY "libname" ALIAS FOR "extname"

Paso1.- Primero declarar las funciones externas ya sea a través del visor Apis o digitarlosdirectamente

cb_ocultar Clicked

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

Cb_Mostrar Clickedonstant Long SW_SHOW = 5// Nombres del shell de Windows que deberiamos buscarString ls_NullLong HBar, ll_HDeskTopHBar = FindWindowExA( 0, 0, "Shell_TrayWnd", ls_Null )ShowWindow( HBar, SW_SHOW )// Muestra el escritorioll_HDeskTop = FindWindowExA( 0, 0, "Progman", ls_Null )ShowWindow( ll_HDeskTop, SW_SHOW )

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

Ubicar la clase dentro de la DLL

Page 83: 12404687 Manual Power Builder

-83-

Power Builder 9.0

Control Trreview y procesos de arrastre

Aplicación: Cambio de empleados en otro departament

Objetos a emplear:1.-estructura (stremp)

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

Control Tv_1

Page 84: 12404687 Manual Power Builder

-84-

Power Builder 9.0

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

DragWithin Ocurre cuando el usuario esta arrastrando con el control.

DragDrop.- Ocurre cuando el usuario arrastra un objeto sobre el control y libera el botondel mouse y deja el objeto.

Itempopulate.-Ocurre cuando un item delTreview llena los demas items hijos

Occurs when the user presses the left mouse button on a label in the TreeView controland begins dragging.

Ven01 openidsource=create Datastoreidsource.dataobject="Datemp"idsource.settransobject(sqlca)triggerEvent("ue_populate")

ven01 ue_populate()

TreeviewItem Vitem

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

Page 85: 12404687 Manual Power Builder

-85-

Power Builder 9.0

tv_1 begindrag(long handle ) return long//Inicio del ArrastreTreeViewItem t_SourceGetitem(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_pendlong li_newitemtreeviewitem lt_target,lt_source,lt_parent,lt_newif getitem(r_droptarget,lt_target)=-1 then returnif 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_overlong a,bif getitem(handle,t_over)=-1 then // si estamos en el primer nivel setDropHighlight(0) r_droptarget=0 returnend if

Page 86: 12404687 Manual Power Builder

-86-

Power Builder 9.0

if t_over.level=1 then // resalta el departamento que va ser arrastrado if handle<>r_droptarget then setDropHighlight(handle) r_droptarget=handle else setDropHighlight(0) r_droptarget=0 end if

else r_droptarget=finditem(parenttreeItem!,handle)

if r_droptarget<>r_dragparent then setDropHighlight(r_droptarget) else setDropHighlight(0) r_droptarget=0 end ifend if

tv_1 itempopulate(long handle)int nf,cfTreeViewItem tvidep, tvempif getitem(Handle,tvidep)=-1 then returnsetPointer(hourglass!)idsource.reset()nf=idsource.retrieve(tvidep.data)tvemp.pictureIndex=6tvemp.selectedpictureIndex=6tvemp.children=falsefor 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

Page 87: 12404687 Manual Power Builder

-87-

Power Builder 9.0

.

Trucos en Power

01 - Cambiar el color alternativamente en las filas de una datawindowPara que las filas de una DataWindow tengan el aspecto de papel de impresoraañade la siguiente expresión en el color de la banda de detalle.IF (Mod(GetRow(),2)=0, RGB(0,255,0), RGB(255,255,255))Estos colores de fondo no aparecerán cuando se imprima el informe.Si quieres imprimir este efecto tienes que añadir un rectangulo o un campo de textoen blanco detrás de las columnas de detalle y poner la expresión anterior.

02.- Ordenar una DropDown Datawindow pulsando la cabecera

Una característica que tienen los DataWindow es que te permiten ordenar lascolumnas pulsando en la cabecera de la columna. La función Sort te permiteespecificar el nombre de la columna o el número de columna por la cual se ordenaráel dataWindow. Funciona para la mayoría de columnas y tipo de datos, pero nofunciona bien cuando la columna pertenece a una DropDown DataWindow

El problema es que la función Sort ordena los datos por detrás de la DataWindow nolos valores que el usuario está viendo en pantalla.Para solucionar esto puedes usar el comando LookUpDisplay.Esta función devuelve la visualización de los datos de la columna. Poniendo elnombre de la columna dentro de esta función y usándola para ordenar los datos, elusuario podrá ver los datos ordenados.Por ejemplo:

dw_1.SetSort( 'LookUpDisplay( dept_id )' )dw_1.Sort()

03.- Ordenar un DataWindow pulsando en la cabeceraPor ejemplo: El nombre de la cabecera de la columna tiene que tener el mismonombre que en la base de datos y acabado en '_t'Nombre de la columna: 'emp_id' = Nombre de la cabecera: 'emp_id_t'Sólo se puede ordenar por una columna cada vez.

String ls_old_sort, ls_column

Page 88: 12404687 Manual Power Builder

-88-

Power Builder 9.0

Char lc_sort

/* Chequea cuando el usuario hace click en la cabecera */IF Right(dwo.Name,2) = '_t' THENls_column = LEFT(dwo.Name, LEN(String(dwo.Name)) - 2)

/* Guarda la última ordenación, si hubiera alguna*/ls_old_sort = dw_1.Describe("Datawindow.Table.sort")

/* Chequea cuando préviamente se ordenó una columna y en la que se hace clickactualmente es la misma o no. Si es la misma, entonces se chequea el orden deordenación del ordenamiento anterior (A - Ascendente, D - Descendente) y locambia. Si las columnas odenadas no son las mismas, las ordena en ordenascendente. */IF ls_column = LEFT(ls_old_sort, LEN(ls_old_sort) - 2) THENlc_sort = RIGHT(ls_old_sort, 1)IF lc_sort = 'A' THENlc_sort = 'D'

ELSElc_sort = 'A'END IFdw_1.SetSort(ls_column+" "+lc_sort)ELSEdw_1.SetSort(ls_column+" A")END IFdw_1.Sort()END IF

04.- Determinar el uso de memoria de una datawindowA menudo es necesario saber cuanta memoria esta usando una DataWindow odatastore para prevenir un "out of memory" o para facilitar la depuración.

Cuando se sabe la memoria que se está usando, el proceso de datos o larecuperación de los mismos, puede ser detenida cuando se llegue a un límitemáximo.Para deteminar la cantidad de memoria virtual que está usando una DataWindow odatastore, se usa el atributo Storage.

Este puede ser invocado desde cualquiera de de los dos métodos siguientes:Notación DOT: dw_control.Object.DataWindow.StorageDescribe: dw_control.Describe("DataWindow.Storage")En ambos caso devuelve una cadena con el valor utilizado en bytes.

05.- Pasar el contenido de una Datawindow a otra ventanaLlamar a la segunda ventana pasándole como referencia la DataWindow:OpenWithParm( w_window, dw_1 )Entonces en el evento OPEN de la ventana escribe:

datastore lds_parmlds_parm = Message.PowerObjectParm

Page 89: 12404687 Manual Power Builder

-89-

Power Builder 9.0

dw_1.DataObject = lds_parm.DataObjectlds_parm.ShareData(dw_1)

Y en el evento CLOSE:dw_1.ShareDataOff()

06.- Copiar datos de un Grid Datawindow al portapapeles de WindowsLos DataWindow grid tienen la capacidad única de dejarte seleccionar un número deceldas en el DataWindow (o la totalidad de filas o de columnas de datos).Este ejemplo ilustra como proporcionar soporte de copia para los datosseleccionados desde un DataWindow de tipo grid.Asumimos que un nuevo elemento de menu llamado m_SpecialCopy ha sidoañadido bajo el menu m_Edit .Añadir el siguiente código para determinar si el elemento Special Copy deberá serhabilitado.GraphicObject lg_ObjectDataWindow lg_DWstring ls_SelectedTextlg_Object = GetFocus ()CHOOSE CASE TypeOf (lg_Object)CASE DataWindow!lg_DW = lg_ObjectThis.m_SpecialCopy.Enabled = (lg_DW.dwDescribe ("datawindow.selected.data") <>'')END CHOOSE==============================Codifica lo siguiente en m_SpecialCopy o en un evento disparado porm_SpecialCopy):graphicobject lg_Objectdatawindow lg_DWlg_Object = GetFocus ()CHOOSE CASE TypeOf (lg_Object)CASE DataWindow!lg_DW = lg_ObjectClipBoard (lg_DW.dwDescribe ("datawindow.selected.data"))END 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 quelas han creado. Esto se puede hacer fácilmente usando expresiones de columna enel DataWindow.

Añade esta expresión en el campo "background color" de la columna clave. Estocambiará el color de la columna y mostrará que la columna no es editable:if ( IsRowNew(), 1090519039, Long(Describe("Datawindow.Color")))Añade esta expresión en el campo "protect" de la columna clave:if ( isRowNew(), 0, 1)Si usas el modo consulta (query mode) utiliza esta expresión:

Page 90: 12404687 Manual Power Builder

-90-

Power Builder 9.0

- Background Colourif ( Describe("Datawindow.QueryMode") = "yes" or isRowNew(), 1090519039,ong(Describe("Datawindow.Color")))- Protectif ( Describe("Datawindow.QueryMode") = "yes" or isRowNew(), 0, 1)

8.- Cargar un array con los nombres de cada columnas en una Datawindowint colNum, numColsstring colName[]numCols = Integer(dw_control.Describe("Datawindow.Column.Count"))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 directorioPuedes usar las API's de Windows:

Function ulong GetWindowsDirectoryA (ref string dirtext, ulong textlen) library"KERNEL32.DLL"ls_dir = space(lul_size)lul_rc = GetWindowsDirectoryA(ls_dir, lul_size)La cual retornará una cadena conteniendo todos los ficheros que hay en esedirectorio, o también puedes usar la función DirList()listboxname.DirList ( filespec, filetype {, statictext } )La cual mostrará un ListBox con los ficheros que coincidan con el criterio especificado.Si no quieres que el usuario vea estos ficheros, tienes que hacer el ListBox invisible.

10.- Obtener una lista de las impresoras instaladasPor Réal GagnonEn este truco abriremos un listbox con una lista de las impresoras instaladas:string printers[]int rtn, i, nbPrintersrtn =RegistryKeys("HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Print\Printers", printers)nbPrinters = UpperBound(printers)FOR i = 1 TO nbPrinterslb_1.addItem(printers[i])NEXT

11.- Detectar la versión de PowerBuilderstring ls_PBverenvironment envGetEnvironment(env)ls_PBver = string(env.pbmajorrevision) + '.' + string(env.pbminorrevision) + '.' +string(env.pbfixesrevision)

Page 91: 12404687 Manual Power Builder

-91-

Power Builder 9.0

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

13.- Realizar un "Mouse Over" sobre un componenteSuponte que tienes un Static Text sobre una ventana. Cuando el puntero del ratónpasa por encima, el color del texto del Static Text cambia a color rojo. Cuando elpuntero del ratón sale del Static Text, el color del texto es negro.[Evento mousemove de la ventana]// Simplemente para visualizar algost_1.text = string(xpos) + ", " + string(ypos)IF xpos >= st_1.X AND (xpos <= st_1.x + st_1.Width) AND ypos >= st_1.y AND (ypos<= st_1.y + st_1.Height) THENst_1.textcolor = 255ELSEst_1.textcolor = 0END IF

14.- Centrar una ventana (útil si es de tipo response). Por Adolfo Chairez.Long ll_screenWidth,ll_screenHeightenvironment lenv_displayif GetEnvironment(lenv_display) = 1 thenll_screenWidth = PixelsToUnits(lenv_display.screenwidth,XPixelsToUnits!)ll_screenHeight = PixelsToUnits(lenv_display.screenheight,YPixelsToUnits!)this.x = (ll_screenWidth - this.width) / 2this.y = (ll_screenHeight - this.height) / 2end if

15.- Mostrar lo que tarda en ejecutarse una parte de códigoPara testear el tiempo que tarda una parte determinada de código de nuestraaplicación usaremos la función CPU()long ll_start, ll_elapsedll_Start = CPU ( )/*

Page 92: 12404687 Manual Power Builder

-92-

Power Builder 9.0

** El código que quieres testear

*/ll_elapsed = CPU ( ) - ll_Start

Sugerencias:

[email protected]@ucss.edu.pe