Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Entrenamiento PowerBuilder 9
Entrenamiento PowerBuilder 9
La versión 9.0 del entorno integrado para desarrollo de aplicaciones empresariales ofrece
mejoras significativas en rendimiento y productividad, un amplio soporte para componentes
estándar, basados en Web y muchas características orientadas al uso de XML. Algunas de las
nuevas características son:
Esta característica permite exportar e importar las filas de datos del DataWindow a y de
Lenguaje Extensible de Marcado (XML) Usted puede especificar la estructura lógica de
cómo las filas iteran dentro del elemento raíz del documento XML. Esto ser realiza por
medio de objetos plantilla XML que están encapsulados en objetos DataWindow y
construidos gráficamente en una nueva vista del DataWindow Painter.
• Destinos JSP:
PowerBuilder 9 provee un ambiente de desarrollo para creación de JSP fácil de usar que
automatiza varias tareas de desarrollo y permite el desarrollo de aplicaciones Web
compatibles con JSP 1.2. Un modelo de objetos JSP duplica —con muy pocas
modificaciones—la funcionalidad de servidor disponible anteriormente para destinos web
ASP y PowerDynamo, incluyendo la extensión de modelo de eventos 4GL para
aplicaciones PowerDynamo.
Usted puede utilizar servicios Web en páginas JSP generando etiquetas (tags)
personalizadas para estos. PowerBuilder 9 provee un asistente que crea una etiqueta
personalizada con la información necesaria para llamar un servicio Web en un JSP.
Una aplicación PowerBuilder puede actuar como un cliente de un componente EJB que se
ejecuta en un servidor de aplicaciones que es compatible con J2EE. Se probaron los
servidores incluyen Sybase EAServer 4.1, IBM WebSphere 4.0, y BEA WebLogic 6.1 y
7.0.
• El lenguaje OrcaScript:
OrcaScript permite escribir guiones (scripts) por lotes para procesar aplicaciones y
archivos PowerBuilder sin utilizar el ambiente de desarrollo de PowerBuilder.
• Mejoras en el DataWindow:
• Mejoras en el depurador
• Objetos.
Un objeto es una forma de comunicación con el usuario, por ejemplo una ventana o un menú.
Nombres de objetos PowerBuilder:
F Application object
F Window
F DataWindow
F Menu
F Global functions
F Queries
F Structures
F User objects
F Libraries
F Projects
• Eventos.
Un evento puede ocurrir cuando un usuario ejecuta una acción con el ratón, el teclado, por una
orden del lenguaje PowerScript de PowerBuilder o por el mismo sistema.
LENGUAJE POWERSCRIPT
Es un lenguaje de alto nivel basado en objetos con el cual se pueden construir scripts.
PowerScript tiene:
w Comandos, por ejemplo IF ... THEN.
w Funciones predefinidas para manipular objetos, números, textos, para procesar
fechas y datos de tiempo, imprimir reportes, ejecutar DDE (Dynamic Data
Exchange), manejar archivos; por ejemplo SHOW, MOVE, OPEN, MAX, HIDE.
w Las funciones regresan un valor (return value) que puede ser utilizado o ignorado.
w Proposiciones SQL, por ejemplo SELECT, INSERT, UPDATE.
w Variables:
F Locales en un script.
F A nivel de una ventana/objeto.
F Globales.
Convenciones aconsejadas por PowerBuilder para dar nombre a los objetos:
Elaborar una Aplicación sencilla, que permita manipular información del personal de una
empresa así: a) Listar todos los empleados, b) Buscar los empleados que concuerden con el
nombre y/o el primer apellido digitado por el usuario, c) Buscar los empleados de un
determinado Departamento. Una vez obtenida la lista, al hacer la selección de un empleado ver
sus datos detallados. La aplicación también debe estar en capacidad de ejecutar las acciones de
impresión, adición, modificación y borrado de datos de empleados. Como un servicio adicional de
la Aplicación, se debe proporcionar una Calculadora que esté en capacidad de ejecutar las cuatro
operaciones aritméticas básicas: suma, resta, multiplicación y división de dos valores dados por
el usuario.
Estructura de la aplicación:
VENTANA
PRINCIPAL
Los pasos indica dos a continuación corresponden a un procedimiento que se puede seguir
utilizando PowerBuilder 9.0 y Sistema Operativo Windows 98 (de forma similar en Windows 95,
NT, 2000 y XP):
1. Entrar a Windows.
2. Escoger un directorio exclusivo para dejar todos los archivos del ejercicio
(recomendado).
4. Activar PowerBuilder.
Target
Library
Application
Árbol de Sistema
Árbol de
sistema
9.2. Para manejar el objeto creado PowerBuilder 9.0 abrirá por omisión dos vistas básicas en
una ventana: “Layout” (donde podrá visualizar la forma del objeto) y “Properties”. Por
medio de unas solapas ubicadas en la parte inferior de las dos vistas básicas mencionadas
es posible acceder a otras vistas tales como script (en el diagrama aparece como open),
Event List, Control List; en este caso las propiedades de una ventana son agrupadas bajo
tres grupos de característica s: “General”, “Scroll”, “Toolbar” y “Other”.
9.4. Colocar los objetos deseados dentro de la ventana y darle sus características.
9.4.1. Insertar el control CommandButton en la ventana, así:
ü En el menú: F Insert F Control F CommandButton
ü En barra de herramientas: F Control F CommandButton
Esta ventana debe heredar las propiedades de la ventana anterior (ICF - Pantalla básica
para búsqueda), con las siguientes particularidades:
11.1. Mirar y/o cambiar las características de la ventana heredada.
Cambiar el texto del RadioButton heredado “&Otro” por “&Todos”
11.2. Añadir los otros controles mostrados en la figura:
ü Dos SingleLineEdit, uno para Nombre y otro para Primer Apellido.
ü Tres StaticText: “Nombre”, “Primer Apellido” y “Departamento”.
ü Un DropDownListBox, con la lista de los siguientes Departamentos:
• Contabilidad
• Personal
• Ventas
• Mercadeo
• Desarrollo
• Recursos
• Administración
• Sistemas
En el tipo de características (solapa) “General” colocar: ShowList y VScrollBar.
ENTRENAMIENTO EN P OWERB UILDER 9.0
Página 15 de 16
Ing. Ismael Castañeda Fuentes
Agregar la lista de Departamentos, en la vista “Properties” del DropDownListBox en el
grupo de características: “Items”.
// open icf_1
15. Escribir las demás acciones que se desean tener al utilizar la calculadora.
ENTRENAMIENTO EN P OWERB UILDER 9.0
Página 18 de 19
Ing. Ismael Castañeda Fuentes
Se sugiere que la calculadora efectúe por lo menos las operaciones aritméticas básicas
(suma, resta, multiplicación y división) y permita algunas facilidades de manejo de
memoria.
15.1. Seleccionar la ventana de la calculadora.
15.2. Elaborar un programa, asociado con el evento modified (modificar), del control que recibe
el primer operando, similar al siguiente:
// modified sle_operando1
If not IsNumber(This.text) Then
MessageBox ("Error", "Se debe dar un número", StopSign!, OK!)
This.text = ""
This.SetFocus()
End if
15.3. Para el control que recibe el segundo operando, escrib ir un programa similar al que recibe
el primer operando.
15.4. Elaborar un programa, asociado con el evento clicked, del botón que va a ejecutar la
operación de suma, similar al siguiente:
// clic cb_suma
Double oper1, oper2, oper3
oper1 = Double(sle_operando1.text)
oper2 = Double(sle_operando2.text)
oper3 = oper1 + oper2
st_resultado_n.text = String(oper3)
15.5. Elaborar programas similares para las operaciones de resta, multiplicación y división.
15.6. Dejar el resultado en blanco, cuando se pase el curs or al campo que recibe el primer o
segundo operando (programar el evento getfocus: st_resultado_n.text = “”).
15.7. Probar la aplicación.
ddlb_departamento.visible = false
sle_nombre.visible = false
sle_primer_apellido.visible = false
st_nombre.visible = false
st_primer_apellido.visible = false
st_departamento.visible = false
dw_datos_empleados.visible = false
18.2. Correr la ventana para probar su funcionamiento.
18.3. Seleccionar el control “Por Nombre” (RadioButton). Escribir un programa para que active
los campos que piden los datos de nombre. Puede ser un programa como el siguiente:
// Ventana: w_icf_pordepto_nom, Objeto: rb_nombre
// Evento: Clicked
ddlb_departamento.visible = true
sle_nombre.visible = false
sle_primer_apellido.visible = false
st_nombre.visible = false
st_primer_apellido.visible = false
st_departamento.visible = true
dw_datos_empleados.visible = false
18.6. Correr la ventana para probar su funcionamiento.
19. Crear una función que sirva para ejecutar las cuatro operaciones básicas
aritméticas: sumar, restar, multiplicar y dividir.
19.1. En barra de herramientas o en el menú seleccionar: F New F PB Object
F Function.
19.2. Llenar los datos solicitados:
19.2.1. Valor a retornar (Return Type): string.
19.2.2. Nombre de la función.
19.2.3. Dar los argumentos: primer operando (“arg_operando1”, tipo string, paso por valor),
segundo operando (“arg_operando2”, tipo string, paso por valor) y operador
(“arg_operador”, tipo integer, paso por valor)
20. Escribir las instrucciones que van a conformar la función. Puede ser un programa
como el siguiente:
// Nombre de la funcion: f_operaciones
// Objetivo: Hacer un cálculo aritmético
// Parámetro 1: Primer operando
// Parámetro 2: Segundo operando
// Parámetro 3: Operación a realizar así:
// 1 Sumar
// 2 Restar
// 3 Multiplicar
// 4 Dividir
Double oper1, oper2, oper3
21. Cambiar los programas asociados con los botones de operaciones de la ventana de
la calculadora para que utilicen la función anterior.
21.1. Para el botón de Resta (-) puede ser un programa como el siguiente (para el evento clic):
// clic para cb_resta
st_resultado_n.text = f_operaciones ( sle_operando1.text, sle_operando2.text, 2 )
21.2. Proceder de manera similar para la suma, multiplicación y división.
21.3. Probar su funcionamiento.
21.4. Comprobar el funcionamiento de la Calculadora para valores con punto decimal. En caso
que no funcione, hacer las modificaciones necesarias.
22. Crear una base de datos que implemente lo mostrado en la siguiente figura:
24. Crear las tablas (Estando la base de datos activa) Definir las columnas y sus
características: nombre, tipo de datos, aceptación o no de nulos, valor por
omisión.
Colocar letreros significativos para encabezamientos de columnas, rótulos identificadores de
campos y comentarios a nivel de tabla y columna. Para ello:
ü En la barra de herramientas F Create Table, o,
ü Conectarse a la base de datos, clic para desplegar sus componentes dentro de ellos
se encuentran Tables y me diante clic derecho con el ratón F New Table F Definir
las columnas F Save Table as
25. Seleccionada una tabla: definir la llave primaria, crear los índices y llenar datos.
ü Definir llave primaria: clic derecho sobre la cualidad Primary key F New Primary
key
ü Crear índices: clic derecho sobre la cualidad Index F New Index
ü Crear llaves foráneas: clic derecho sobre la cualidad Foreign key F New Foreign
key, en la solapa General F Columns seleccionar la columna que es llave foránea y
en la solapa Primary Key seleccionar la tabla y las columnas que están asociadas con
la llave foránea.
ü Llenarla de datos:
w Clic derecho sobre la tabla F Edit Data (grid, tabular o freeform)
ü Una vez creadas y llenas todas las tablas de la base de datos cerrar la vista de
“DataBase Painter”, en barra de herramientas F Close o, en el menú, F File
F Close.
ü Si se le quiere hacer un cambio posterior a la tabla es posible posicionándose sobre la
tabla y mediante clic derecho con el ratón escoger la opción F Alter table.
26. Preparar el sitio donde se van a mostrar los datos de los empleados. Para ese fin,
definir los DataWindows Object necesarios. Como primer paso definir un DataWindows que
presente en forma tabular los siguientes datos: Nombre y Apellido del empleado y nombre
del Departamento donde trabaja. La salida se debe presentar en orden alfabético por
Apellido del empleado. Se puede seguir un procedimiento similar al siguiente:
26.1. En barra de herramientas : F New F DataWindow F Tabular F OK, o,
En menú: F File F New F DataWindow F Tabular F OK
26.1.1. En la ventana “Choose Data Source for Tabular DataWindow” (selección de la fuente de
datos para el DataWindow escogido): F SQL Select F Next
26.2. En ventana “Select Tables”, seleccionar las tablas Empleado y Departamento F Open
26.3. En tabla Empleado: Código del empleado (id), Nombre del empleado, Apellido del
empleado.
26.4. En tabla Departamento: F Nombre del departamento
26.5. En la solapa “Sort”: è Apellido del empleado (hacer “drag and drop”).
28. Elaborar un tercer DataWindow que muestre los empleados que tengan el Nombre
y/o el Apellido digitado por el usuario.
28.1. Seguir un procedimiento similar a la elaboración del DataWindow anterior. En este caso es
necesario especificar dos argumentos (por ejemplo: nombre de tipo String y apellido de
tipo String).
28.2. F OK
28.3. En carpeta Where: especificar la condición deseada, por ejemplo:
open (w_icf_pordepto_nom)
//Nombre de la ventana que se desea activar, en este caso la de búsqueda
IF rb_nombre.checked THEN
// Seleccionado Por Nombre
dw_datos_empleados.visible=true
dw_datos_empleados.dataobject='d_empleados_dado_nombre'
dw_datos_empleados.SetTransObject(SQLCA)
dw_datos_empleados.retrieve (sle_nombre.text,sle_primer_apellido.text)
END IF
IF rb_departamento.checked THEN
// Seleccionado Por Departamento
dw_datos_empleados.visible=true
dw_datos_empleados.dataobject='d_empleados_depto'
dw_datos_empleados.SetTransObject(SQLCA)
// Obtener el dato numérico xxx de la instrucción para pasárselo como entrada al
// datawindow:
dw_datos_empleados.retrieve(DOUBLE(ddlb_departamento.selectitem(
ddlb_departamento.text,1)))
END IF
32.2. Correr la aplicación y comprobar su correcto funcionamiento.
IF dw_datos_empleados.dataobject='d_lista_empleados' OR &
dw_datos_empleados.dataobject='d_empleados_dado_nombre' OR &
dw_datos_empleados.dataobject='d_empleados_depto' THEN
35. Escribir los programas asociados con el evento clic para cada una de las opciones
de los menús, por ejemplo:
35.1. Para: F Calculadora
// click m_servicios.m_calculadora
open ( w_icf_calculadora )
open ( w_icf_pordepto_nom)
w_icf_pordepto_nom.rb_otro.setfocus()
w_icf_pordepto_nom.cb_buscar.postevent(Clicked!)
open ( w_icf_pordepto_nom)
w_icf_pordepto_nom.rb_nombre.setfocus()
35.5. Para: F Buscar F Por Departamento
// Clic m_personal.m_buscar.m_pordepto
open ( w_icf_pordepto_nom)
w_icf_pordepto_nom.rb_departamento.setfocus()
37. Modificar el punto de Inicio para arranque con la ventana recién diseñada.
39. Escribir los programas asociados con el evento clic para cada una de las opciones
de los menús, por ejemplo:
39.1. Para: F Archivo F Cerrar Ventana
// click m_archivo.m_cerrarventana
Close( ParentWindow )
w_icf_calculadora.sle_operando1.text = ""
w_icf_calculadora.sle_operando2.text = ""
w_icf_calculadora.st_resultado_n.text = ""
39.4. Para: F Editar F Resultado a Memoria
// click m_editar.m_resultadoamemoria
40.1.2. F Next
40.1.3. Si no está seleccionado el archivo pbl correcto seleccionarlo F Next
40.1.4. Escribir el nombre del proyecto, o utilizar el por defecto F Next
40.1.5. Escribir la dirección y el nombre del archivo ejecutable que se generará F Next
40.1.6. Asegurarse de que la opción Incremental Build esté seleccionada F Next
El DropDown
DataWindow es útil en
caso de que se
requiera hacer
referencia a datos de
otras tablas.
Última Fila
Siguiente Fila
Anterior Fila
Primera Fila
tab_actualizaciones.tabpage_empleados.dw_act_empleados.SetTransObject(SQLCA)
tab_actualizaciones.tabpage_empleados.cb_borrar.enabled = false
tab_actualizaciones.tabpage_empleados.cb_actualizar.enabled = false
ü Para compilar el script: en la barra de herramientas F Compile; o Ctrl+L; o
F Edit F Compile; o también al guardar, se compila automáticamente.
ü Para el botón que de desplazamiento hasta la primera fila (cb_primero), evento
clicked:
//-------Evento: clicked--------------
//-------Control: cb_primero----------
long l_fila_actual
dw_act_empleados.SetFocus()
l_fila_actual = dw_act_empleados.getrow() //el número de la fila
//seleccionada actualmente
dw_act_empleados.ScrollToRow(l_fila_actual + 1) //se desplaza a la
//fila siguiente
dw_act_empleados.SetColumn(1) //se selecciona la primera columna
ü Para el botón de desplazamiento a la fila anterior(cb_anterior), evento clicked:
//-------Evento: clicked--------------
//-------Control: cb_anterior----------
long l_fila_actual
dw_act_empleados.SetFocus()
l_fila_actual = dw_act_empleados.getrow() //el número de la fila
long l_numfilas
dw_act_empleados.SetFocus()
l_numfilas = dw_act_empleados.RowCount() //se obtiene el número de
//filas en el datawindow
dw_act_empleados.scrolltorow(l_numfilas) //se desplaza hasta la última
dw_act_empleados.setcolumn(1) //se selecciona la primera columna
ü Para el botón Cargar Datos (cb_cargar), evento clicked:
//-------Evento: clicked--------------
//-------Control: cb_cargar----------
long l_numfilas
tab_actualizaciones.tabpage_empleados.dw_act_empleados.SetTransObject(SQLCA)
long fila_nueva
long l_fila_actual
tab_actualizaciones.tabpage_empleados.dw_act_empleados.SetRedraw (false)
tab_actualizaciones.tabpage_empleados.dw_act_empleados.SetRedraw (false)
tab_actualizaciones.tabpage_empleados.dw_act_empleados.SetRedraw (true)
integer i_tab
i_tab = tab_actualizaciones.SelectedTab
Explorador
En esta ventana se utilizará un nuevo control: TreeView. El TreeView es un control que permite
desplegar información jerarquicamente. Cada item en un TreeView consiste de texto y una
imagen, los cuales pueden ser manipulados durante una rutina de programa.
El aspecto de la ventana será similar al siguiente:
Como puede verse, este TreeView tendrá cuatro niveles. El primer nivel solo constará de un ítem
con el texto empresa. Los ítems del segundo nivel corresponden a los departamentos de la
empresa, el tercero a los empleados de cada departamento, y el cuarto a las actividades
asignadas a los emp leados.
44.1. En la barra de herramientas:
ü File F New F Object F Window
Con el botón derecho sobre la nueva ventana, modificar las propiedades de la ventana vista de
“Properties”:
ü Window Type F Popup.
ü Las opciones Resizable y Maximize Box no deberán seleccionarse.
44.2. Insertar un control TreeView en la ventana y darle el tamaño adecuado. Seleccionar el
control insertado y hacer click con el botón derecho del mouse sobre él.
ü En la barra de herramientas: Desplegar controles y seleccionar: F Treeview
ü En el menu Insert FControl F Treeview
w Name Ftv_depto_empleado
w Seleccionar la opción Lines at Root
w Indent F10
Integer li_Cont
atvi_nuevo.PictureIndex = ai_nivel
atvi_nuevo.SelectedPictureIndex = ai_nivel
ü Guardar el trabajo adelantado
44.5. Escribir los scripts para los controles creados.
44.5.1. En la ventana w_explorador:
ü Hacer click con el botón derecho sobre la ventana y seleccionar la opción script en el
menú popup.
ü En el editor, seleccionar el e vento open del listbox de la parte superior izquierda de la
ventana. El siguiente es el código para dicho evento:
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Se crean los DataStore que contendrán los //
// datos almacenados en los datawindows espacificados //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Se agrega el primer item (el único) del primer nivel del treeview.
//Los parámetros que se pasan son: parent = 0, nivel = 1, filas = 1
lf_agregar_items(0, 1, 1)
ü Compilar el script: en el menú Edit F Compile Script (Ctrl+L).
ü Seleccionar el evento close. El script para este evento es:
-------Evento: close--------------
-------Control: w_explorador------
Integer li_Cont
// Se destruyen los DataStores usados en el ejemplo
For li_Cont = 1 To 4
Destroy ids_datos[li_Cont]
Next
Show(w_principal)
ü Compilar el script (Ctrl + L).
44.5.2. En el TreeView tv_depto_empleado:
ü Hacer click con el botón derecho sobre el TreeView y seleccionar la opción script en el
menú popup.
ü En el editor, seleccionar el evento itempopulate. El siguiente es el código para dicho
evento:
-------Evento: itempopulate--------------
-------Control: tv_depto_empleado--------
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Se expande el árbol con los hijos de cada item.
// p.ej. los hijos de un item de departamento son los nombres de los
// empleados
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Departamentos
if li_nivel = 2 then
ids_datos[li_nivel].SetTransObject(sqlca)
ids_datos[li_nivel].Reset()
ids_datos[li_nivel].SetTransObject(sqlca)
// Se cargan los datos en el DataStore
li_filas = ids_datos[li_nivel].Retrieve()
End if
// Empleados X Departamento
if li_nivel = 3 Then
li_DeptID = Integer(ltvi_actual.Data)
ids_datos[li_nivel].Reset()
ids_datos[li_nivel].SetTransObject(sqlca)
// Se cargan los datos en el DataStore usando el argumento código de
//departamento
// Actividades X Empleado
If li_nivel = 4 Then
li_EmpID = Integer(ltvi_actual.Data)
ids_datos[li_nivel].Reset()
ids_datos[li_nivel].SetTransObject(sqlca)
// Se cargan los datos en el DataStore usando el argumento código
// de empleado
li_filas = ids_datos[li_nivel].Retrieve(li_EmpID)
End If
lf_agregar_items(handle, li_nivel, li_filas)
ü Compilar el script (Ctrl + L) y cerrar la ventana del editor.
44.5.3. En el botón Expandir Todo (cb_expandir):
ü Hacer click con el botón derecho sobre cb_expandir y seleccionar la opción script en
el menú popup.
ü En el editor, seleccionar el evento clicked. El siguiente es el código para dicho
evento:
-------Evento: clicked--------------
-------Control: cb_expandir---------
Long ll_handle
Long ll_handle
close(w_explorador)
ü Compilar el script: en el menú Edit F Compile Script (Ctrl+L).
44.6. Guardar el trabajo adelantado y correr la aplicación para comprobar el funcionamiento
del TreeView.
Integer li_Cont
ListViewItem llvi_Nuevo
// Departamentos
if li_nivel = 2 then
ids_datos[li_nivel].SetTransObject(sqlca)
ids_datos[li_nivel].Reset()
ids_datos[li_nivel].SetTransObject(sqlca)
// Se cargan los datos del DataStore
li_filas = ids_datos[li_nivel].Retrieve()
End if
// Empleados X Departamento
if li_nivel = 3 Then
li_DeptID = Integer(ltvi_actual.Data)
ids_datos[li_nivel].Reset()
ids_datos[li_nivel].SetTransObject(sqlca)
// Se cargan los datos del DataStore usando
//el argumento código de departamento
li_filas = ids_datos[li_nivel].Retrieve(li_DeptID)
End if
// Actividades X Empleado
If li_nivel = 4 Then
li_EmpID = Integer(ltvi_actual.Data)
ids_datos[li_nivel].Reset()
ids_datos[li_nivel].SetTransObject(sqlca)
// Se cargan los datos del DataStore usando
// el argumento código de empleado
li_filas = ids_datos[li_nivel].Retrieve(li_EmpID)
End If
If lb_Encontrado Then
// Al cambiar el elemento seleccionado en el TreeView,
// se ejecuta el código del evento SelectionChanged
// para el TreeVier tv_depto_empleado
tv_depto_empleado.SelectItem(ll_Item)
End If
ü Compilar el script (Ctrl + L).
45.4.3. En el ListView lv_dept_empleados:
ü Hacer click con el botón derecho sobre el ListView y seleccionar la opción script en el
menú popup.
ü En el editor, seleccionar el evento columnclick. El siguiente es el código para dicho
evento:
-------control: lv_dept_empleados----------
-------evento: columnclick-----------------