ENTRENAMIENTO EN POWER BUILDER Ing. Ismael Castañeda Fuentes Departamento de Ingenieía de Sistemas UNIVERSIDAD NACIONAL DE COLOMBIA Bogotá, Diciembre de 2000 Ê ENTRENAMIENTO EN POWER BUILDER PowerBuilder es una herramienta computacio nal que permite la elaboración de aplicaciones cliente/servidor utilizando principalmente elementos gráficos. Las aplicaciones desarrolladas con PowerBuilder se almacenan en una librería (PowerBuilder Library, archivos caracterizados con el tipo *.PBL ). Una vez desarrollada una aplicación PowerBuilder, se crea un archivo tipo *.EXE para que los usuarios ejecuten la aplicación desde Windows cuando lo deseen. La versión 7.0 del entorno integrado para desarrollo de aplicaciones empresariales ofrece mejoras significativas en rendimiento y productividad, y un amplio soporte para componentes estándar, basados en Web. Con el Nuevo Web DataWindow, usted puede desplegar sus aplicaciones en cualquier browser comercial. La completa integración con Enterprise Application Server 3.0, tanto en la etapa de desarrollo, como en la fase de implantación, proporciona alta confiabilidad, disponibilidad y escalabilidad para aplicaciones PowerBuilder desarrolladas para la Web. COMPONENTES DE UNA APLICACIÓN POWERBUILDER. w Objetos. Un objeto es una forma de comunicación con el usuario, por ejemplo una ventana o un menú. Nombres de objetos PowerBuilder: F F F F F F F F F F w Application object Window DataWindow Menu Global functions Queries Structures User objects Libreries Projetcs 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. ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 1 de 55 Algunos de los eventos más comunes son: F F F F F F F F w Clic (clicked) Doble clic (DoubleClicked) Modificación (Modified) Abrir (Open) Cerrar (Close) Tomar el foco (GetFocus) Perder el foco (LoseFocus) Cambiar la selección (SelectionChanged) Scripts. Un script es un conjunto de órdenes escritas en lenguaje PowerScript que se deben ejecutar al ocurrir un evento. COMPONENTES DE UNA VENTANA. w Controles. Un control es un objeto colocado en una ventana. Los controles son: F F F F F F F F F F F F F F F F F F F F F F F F F F CheckBox CommandButton DataWindow DropDownListBox DropDownPictureListBox EditMask Graph GroupBox HscrollBar Line ListBox ListView MultiLineEdit OLEcontrol OLECustomControl Oval Picture PictureButton PictureListBox RadioButton Rectangle RichTextEdit RoundRectangle SingleLineEdit StaticText Tab ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 2 de 55 F F F w TreeView UserObject VscrollBar Focus. Identifica el lugar de la pantalla donde va a suceder la siguiente acción. Para establecer el foco en un sitio deseado, el usuario puede: F F Mover con el ratón el apuntador a un control y hacer clic. Presionar la tecla del tabulador hasta el control deseado. Un control puede perder el foco cuando el usuario: F F F w Hace clic en otro control. Hace clic en otra ventana donde no hay controles. Presiona la tecla del tabulador y pasa a otro control. Atributos. Los objetos y controles tienen atributos que definen su: F F Apariencia. Comportamiento. LENGUAJE POWERSCRIPT Es un lenguaje de alto nivel basado en objetos con el cual se pueden construir scripts. PowerScript tiene: w w w w w Comandos, por ejemplo IF ... THEN. 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. Las funciones regresan un valor (return value) que puede ser utilizado o ignorado. Proposiciones SQL, por ejemplo SELECT, INSERT, UPDATE. Variables: F F F Locales en un script. A nivel de una ventana/objeto. Globales. Convenciones aconsejadas por PowerBuilder para dar nombre a los objetos: OBJETO PREFIJO EJEMPLO C heckBo x cbx_ cbx_caja_para_control C o mmandButto n cb_ cb_boton_para_comando DataWindo w C o ntro l dw_ dw_ventana_para_datos_tabulares DataWindo w Object d_ d_objeto_para_datos_tabulares ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 3 de 55 Dro pDo w nListBo x ddlb_ ddlb_caja_para_escoger_opciones Dro pDo w nPictureListBo x ddplb_ ddplb_lista_de_dibujos EditMask em_ em_formato_para_datos Functio n f_ f_nombre_de_funcion Graph gr_ gr_grafico Gro upBo x gb_ gb_caja_para_agrupar Hscro llBar hsb_ hsb_deslizamiento_horizontal Line ln_ ln_linea ListBo x lb_ lb_caja_para_presentacion ListView lv_ lv_despliegue_de_lista Menu m_ m_menu MultiLineEdit mle_ mle_multiples_lineas OLEco ntro l ole_ ole_a_ms_word Oval oval_ Oval_ovalo Picture p_ p_dibujo PictureButto n pb_ pb_boton_grafico PictureListBo x plb_ plb_caja_con_graficos Pro ject p_ p_proyecto Radio Butto n rb_ rb_boton_exclusivo Rectangle r_ r_rectángulo RichTextEdit rte_ rte_texto_enriquecido Ro undRectangle rr_ rr_rectangulo_bordes_redondeados SingleLineEdit Sle_ sle_linea_para_edicion StaticText st_ st_titulos Tab tab_ tab_carpetas TreeView tv_ tv_explorador Structure s_ s_estructura UserObject u_ u_objeto_del_usuario Vscro llBar vsb_ vsb_deslizamiento_vertical Windo w w_ w_nombre_de_ventana Cuando se están creando los objetos, PowerBuilder sugiere un nombre para el objeto utilizando el prefijo de la tabla anterior y un número. Ellos aconsejan cambiar este número por algo significativo para el usuario que está elaborando el aplicativo. ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 4 de 55 EJERCICIO PRÁCTICO El ejercicio deben hacerlo de forma individual y presentarlo funcionando perfectamente, desde ejecutable y desde PowerBuilder. En grupo deben presentar un informe, indicando sus comentarios sobre este documento, errores encontrados, sugerencias para mejorarlo y utilidad al realizar el ejercicio. 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: Los pasos indicados a continuación corresponden a un procedimiento que se puede seguir utilizando PowerBuilder 7.02 y Sistema Operativo Windows 98 (de forma similar en Windows 95, NT y 2000): 1. Entrar a Windows. 2. Escoger un directorio exclusivo para dejar todos los archivos del ejercicio (recomendado). 3. Copiar en este directorio: ü Tres (3) archivos tipo *.bmp ü Tres (3) archivos tipo *.ico 4. Activar PowerBuilder. ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 5 de 55 5. Crear una aplicación: 5.1. Crear una nueva aplicación: 5.2. ü En barra de herramientas F New F Start Wizards F Application, o, ü En menú F File F New F Start Wizards F Application Llenar los datos de la ventana “Specify New Application and Library”, así: ü ü 5.3. “Application Name” Escribir el nombre del archivo donde va a quedar la Librería. “Library” Seleccionar el directorio donde se van a dejar los archivos del ejercicio. F “Finish”. Automáticamente PowerBuilder genera un archivo con extensión .pbl y una aplicación con el mismo nombre del archivo. Si se quieren colocar comentarios a la aplicación creda, y/o crear una aplicación con otro nombre, se abre y al guardar, se coloca el nuevo nombre y/o se escriben los comentarios deseados, así: ü En barra de herramientas F Open nombre de la aplicación F OK ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es F Object Type: Application FSeleccionar el Página 6 de 55 ü ü F File F Save as F Seleccionar archivo F Guardar F “Save Application” F Aparece nombre de la aplicación y directorio seleccionado (aquí se puede colocar otro nombre a la aplicación, entonces Power Builder crea otra aplicación con el nombre actual) F Comments: Escribir un comentario significativo relacionado con la aplicación F OK 5.4. Escritorio de la Aplicación: Mediante la opción “Library” de la Barra de Herramientas se puede tener un explorador (similar al Explorador de Windows) en el cual se pueden visualizar y seleccionar: los directorios, las librerias .pbl existentes y los objetos respectivos. ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 7 de 55 5.5. Se debe tener en cuenta que estando una aplicación activa para abrir otra aplicación se debe antes cerrar todos los objetos de ella abiertos y luego seleccionar la aplicación mediante la opción del menú o de la barra de herramientes “Select Application”. 5.6. Seleccionar propiedades de la aplicación: ü En escritorio de aplicación: Oprimir botón derecho del ratón 5.7. 6. 6.1. F Properties... Regresar a la ventana inicial (cerrar ventanas abiertas): ü En barra de herramientas F Close, o ü En menú F File F Close, o ü Ctrl + W Elaborar una ventana como la siguiente: En barra de herramientas ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es F New F Object F Window F OK. Página 8 de 55 6.2. Para manejar el objeto creado PowerBuilder 7.02 abrirá por omisión cuatro vistas básicas en una ventana: “Layout” (donde podrá visualizar la forma del objeto), “Script”, “Control” y “Properties”; en este caso las propiedades de una ventana son agrupadas bajo tres grupos de características: “General”, “Scroll”, “Toolbar” y “Other”. Mirar, comprobar y/o modificar características de la ventana: Si se quieren observar y/o modificar las características de la ventana, situándose en la vista de “Layout” y no está activa la vista de “Properties”, con el botón derecho F Properties... 6.3. Para la ventana “Window” en el tipo de características “General” colocar: ü Identificación o título deseado (“Title”: ICF – Pantalla para búsqueda) ü Elementos activos (“Control Menu, Maximize Box, Minimize Box, ...) ü Tipo de ventana (“Window Type”): popup! ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 9 de 55 En la serie de características “Other” ü Dentro de “ Position” se puede colocar la ubicación y tamaño dentro de la pantalla 6.4. F OK 6.5. Colocar los objetos deseados dentro de la ventana y darle sus características. 6.5.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 6.5.2. En la ventana, hacer clic en el sitio donde se desea ubicar el control seleccionado. 6.5.3. Mirar, comprobar y/o modificar seleccionado el control deseado): las características del control (hay que tener ü En barra de herramientas F Properties, o, ü En la vista de “Properties”..., o ü Con botón derecho dentro del control F Properties..., o ü Doble clic dentro del control 6.5.4. En la vista de “Properties”, las características de un ComandButton están agrupadas en: “General”, “Font” y “Other”. Dar al control CommandButton dar las características del control, tales como: ü Nombre del control (cb_salir). ü Texto deseado dentro del control. (Salir) ü Características de aparición. ü Características de las fuentes. ü Posición dentro de la ventana. 6.5.5. F OK ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 10 de 55 6.5.6. Grabar el trabajo adelantado (Salvar la ventana en la librería): ü ü ü ü 6.5.7. En ü ü 6.5.8. En barra de herramientas F Save, o En menú F File F Save, o En menú F File F Save as..., o Ctrl + S la ventana “Save Window” escribir: Nombre de la ventana (por ejemplo, w_icf_basica). Un comentario. F OK 6.5.9. Para ver cómo va quedando el diseño de la pantalla: ü En barra de herramientas F Preview, o ü En menú F Design F Preview, o ü Ctrl + Shift + P 7. Elaborar una ventana como la siguiente: Esta ventana debe heredar las propiedades de la ventana anterior (ICF -Pantalla básica). Por lo tanto se puede seguir un procedimiento similar, con las siguientes particularidades: 7.1. Cierre la ventana anterior y Cree la nueva ventana: ü ü En el menú F File F Inherit... (si la ventana de la cual hereda está abierta está selección no funcionará) En la ventana “Inherit From Window” seleccionar la ventana que da las características a heredar. ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 11 de 55 7.2. 7.3. ü F OK Mirar y/o cambiar las características de la ventana heredada. Añadir los otros RadioButton). controles mostrados en la figura (un CommandButton y un 7.4. Cambiar el texto del CommandButton heredado “Salir ” por “Cancelar”. 7.5. Los controles deben quedar con las características de visible y enabled 7.6. Grabar el trabajo adelantado (Salvar la ventana en la librería; nombre sugerido: w_icf_busqueda) 7.7. Ver cómo va quedando el diseño y si es necesario hacer las modificaciones que estime convenientes. 8. Elaborar una ventana como la siguiente: Esta ventana debe heredar las propiedades de la ventana anterior (ICF - Pantalla básica para búsqueda), con las siguientes particularidades: 8.1. Mirar y/o cambiar las características de la ventana heredada. Cambiar el texto del RadioButton heredado “Otro” por “Todos” 8.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 ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 12 de 55 Para agregar la lista de Departamentos, en la vista “Properties” del DropDownListBox en el grupo de características: “Items” 8.3. Dos RadioButton, para “Por Nombre” y “Por Departamento”. Un GroupBox, para “Buscar”. Un PictureButton para Imprimir. Escoger de la lista de archivos *.BMP una figura para el caso que esté disponible el servicio de impresión y otra figura para el caso que no esté disponible. ü Un DataWindow, identificado como “Datos de los Empleados”. Allí se mostrarán los resultados de consulta a la base de datos (posteriormente se harán las asociaciones necesarias con los DataWindows object que acceden a la base de datos). Dar las demás características deseadas, tanto a la ventana como a los controles. 8.4. Grabar el trabajo adelantado. (nombre sugerido: w_icf_pordepto_nom) 8.5. Ver cómo va quedando el diseño y si es necesario, hacer las modificaciones que estime convenientes. ü ü ü 9. Elaborar una ventana como la siguiente: El objetivo es tener una calculadora en la cual se va a obtener un resultado aritmético dados dos operandos. 9.1. Crear la ventana y colocar sus características (ventana tipo popup). 9.2. Colocar los objetos y sus características, así: ü Dos SingleLineEdit, para primer y segundo operando. ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 13 de 55 ü Cuatro StaticText, uno para colocar el resultado de la operación aritmética (el cual no tendrá texto) y tres para colocar los textos: “Primer Operando”, “Segundo Operando” y “Resultado”. ü Cuatro CommandButton, uno para cada operación: suma, resta, multiplicación y división. ü Dos Rectangle, uno para encerrar el resultado CommandButton de las operaciones aritméticas. y otro para encerrar los 9.3. Grabar el trabajo adelantado. 9.4. Ver cómo va quedando el diseño y (si es necesario) hacer las modificaciones que estime convenientes. 10. Colocar el punto de entrada del aplicativo (inicio de ejecución). Inicialmente direccionar directamente a la Calculadora. 10.1. En barra de herramientas de la aplicación F OK F Open F Object Type: Application FSeleccionar el nombre Al abrir el objeto Application PowerBuilder abre por omisión tres vistas básicas: “Script”, “Declare instance variables” y “Non Visual Object List” Para programar el evento inicial de la aplicación, escribir el programa (script) para abrir la ventana con el cual inicia el aplicativo; en esta primera etapa será la ventana donde está el diseño de la calculadora. ü En la vista de “Script” de la aplicación seleccionar el evento “open” (abrir) ü Elaborar un programa asociado con el evento open, similar al siguiente: ü 10.2. // open icf_1 // Punto inicial del aplicativo. open (w_icf_calculadora) //Nombre de la ventana que se desea activar. Sugerencia: Cuando se está escribiendo el programa y se necesita el nombre de un objeto o una variable, este nombre se puede traer directamente (no hay necesidad de tipearlo) utilizando las ventanas desplegables: “Paste Windows”, “Paste Global” y “Paste Instance” haciendo la selección apropiada. También se pueden utilizar las otras facilidades que se proporcionan a través de las barras de herramientas y opciones de los menús. ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 14 de 55 10.3. Compilarlo (paso opcional): 10.4. ü En barra de herramientas: F Compile, o ü En menú: F Edit F Compile, o ü Ctrl + L Volver a la ventana principal de PowerBuilder: En barra de herramientas: F Close Si no hizo el paso de compilación, confirmar (compilar y grabar) o descartar los cambios realizados, en la ventana de diálogo “Application”: F Sí, o F No, o F Cancelar. 11. Probar que la aplicación se puede ejecutar: ü ü ü En barra de herramientas: F Run, o ü En menú: F File F Run, o ü Ctrl + R 12. Escribir las demás acciones que se desean tener al utilizar la calculadora. 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. 12.1. Seleccionar la ventana de la calculadora. 12.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 Para el control que recibe el segundo operando, escribir un programa similar al que recibe el primer operando. 12.3. 12.4. 12.5. 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) Elaborar programas similares para las operaciones de resta, multiplicación y división. 12.6. Dejar el resultado en blanco, cuando se pase el cursor al campo que recibe el primer o segundo operando (programar el evento getfocus: st_resultado_n.text = “”). 12.7. Probar la aplicación. 13. Seleccionar el botón Salir de la ventana básica: w_icf_basica y asociarle un programa que cierre la ventana (programar el evento clicked), con un programa como el siguiente: ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 15 de 55 // clic cb_salir If MessageBox("Salir", "Cerrar esta ventana?", Question!, YesNo! ) = 1 then Close( Parent ) End If 14. Correr la ventana para probar su funcionamiento: ü En barra de herramientas F File F Run/Preview nombre de la ventana, en este caso: w_icf_basica F Object Type: Windows F Object: F OK 15. Seleccionar la ventana donde se pueden hacer búsquedas. 15.1. 15.2. 15.3. 15.4. 15.5. 15.6. Seleccionar el control “Todos” (RadioButton) y elaborar un programa para que cuando este control sea el seleccionado, desactive los controles que piden datos. Puede ser un programa como el siguiente: // Ventana: w_icf_pordepto_nom, Objeto: rb_todos, Heredado de: w_icf_busqueda:rb_otro // Evento: Clicked 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 Correr la ventana para probar su funcionamiento. 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 = false sle_nombre.visible = true sle_primer_apellido.visible = true st_nombre.visible = true st_primer_apellido.visible = true st_departamento.visible = false dw_datos_empleados.visible = false Correr la ventana para probar su funcionamiento. Seleccionar el control “Por Departamento” (RadioButton). Escribir un programa para que active el control que pide el dato de Departamento. Puede ser un script como el siguiente: // Ventana: w_icf_pordepto_nom, Objeto: rb_departamento // 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 Correr la ventana para probar su funcionamiento. 16. Crear una función que sirva para ejecutar las cuatro operaciones básicas aritméticas: sumar, restar, multiplicar y dividir. 16.1. En barra de herramientas o en el menú seleccionar: 16.2. Llenar los datos solicitados: F NEW F Object F Function. 16.2.1. Valor a retornar (Return Type): string. 16.2.2. Nombre de la función. ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 16 de 55 16.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) 17. 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 IF arg_operando1 = "" OR arg_operando2 = "" THEN Messagebox ("Error","Los operandos deben ser aritméticos",StopSign!, OK!) return "" END IF oper1 = Double(arg_operando1) oper2 = Double(arg_operando2) Choose Case arg_operador Case 1 oper3 = oper1 + oper2 Case 2 oper3 = oper1 - oper2 Case 3 oper3 = oper1 * oper2 Case 4 If oper2 = 0 Then Return "División por cero" Else oper3 = oper1 / oper2 End If Case else Return "Operación no válida" End Choose Return String (oper3) 18. Cambiar los programas asociados con los botones de operaciones de la ventana de la calculadora para que utilicen la función anterior. 18.1. 18.2. 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 ) Proceder de manera similar para la suma, multiplicación y división. 18.3. Probar su funcionamiento. 18.4. Comprobar el funcionamiento de la Calculadora para valores con punto decimal. En caso que no funcione, hacer las modificaciones necesarias. 19. Crear una base de datos que implemente lo mostrado en la siguiente figura: ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 17 de 55 19.1. Crear localmente una nueva base de datos. Dejar el archivo físico en el directorio donde se están dejando todos los archivos de este ejercicio: ü En barra de herramientas: F Database, o, ü En el menú: F File F New F Database F Database Painter, o, F Window F Database Painter, o, ü Shift + F7 ü Se crea una base de datos local: w En Database Painter aparece la vista de “Objects”, en el árbol Installed Database Interfaces F ODBC F Utilities F Create ASA Database. ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 18 de 55 ü Aparece la ventana “Create Adaptive Server Anywhere Database”, se deben llenar los datos allí pedidos: w Database Name: Camino y nombre del archivo en Windows donde se va a guardar el archivo físico. Se sugiere: F Browse, Llegar al directorio deseado, y Dar el nombre al archivo. w User ID: Identificación del usuario. Valor por omisión: DBA w Password: Clave. Valor por omisión: SQL. w F OK 20. Es bueno comprobar lo siguiente: ü En Windows Inicio (32 bits): ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es F Configuración F Panel de Control F Fuentes de datos ODBC Página 19 de 55 w w ü En ventana “Administrador de Orígenes de Datos ODBC”: F DSN de usuario en donde aparece ahora una nueva entrada ODBC con el nombre del perfil creado ante la base de datos, cuyo controlador será Adaptive Server Anywhere 6.0. Al dar doble click sobre dicha entrada ODBC se aprecia la ventana “ODBC Configuration for Adaptive Server Anywhere”: en el tab de ODBC aparece el nombre de la fuente de datos (“Data Source Name”); en el tab de Login los datos proporcionados de User ID y Password; y en el tab de Database el nombre y la ubicación de la base de datos creada. Retornando a PowerBuilder, en la vista de “Database Painter” o en la vista de “Database Profiles” (las dos opciones de la barra de herramientas) se encuentra ahora la conexión activa (indicada por un chulo sobre el perfil) a la base de datos creada. Al dar con el ratón click derecho sobre el perfil seleccionado F Properties: se puede ver la ventana “Database Profile Setup – ODBC”: w En el tab Connection se encuentra: el nombre de la fuente de datos (“Data Source Name”) y del perfil (“Profile Name”), además de los datos de User ID y Password; en el tab Preview se observa la sintaxis de la conexión a la base de datos perteneciente al perfil creado. ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 20 de 55 En caso de algún problema, hay que arreglarlo o sino la base de datos queda inalcanzable. En casos extremos: borrar la base de datos recién creada, revisar la Configuración ODBC, revisar los Profile, y ver las entradas que puedan estar causando conflicto (si es del caso borrarlas F Remove). 21. 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: F Create Table, o, ü En la barra de herramientas ü Conectarse a la base de datos, click para desplegar sus componentes dentro de ellos se encuentran Tables y mediante click derecho con el ratón F New Table F Definir las columnas F Save Table as 22. Seleccionada una tabla: ü ü ü ü ü ü Definir llave primaria: click derecho sobre la cualidad Primary key F New Primary key Crear índices: click derecho sobre la cualidad Index F New Index Crear llaves foráneas: click derecho sobre la cualidad Foreign key F New Foreign key Llenarla de datos: w Click derecho sobre la tabla F Edit Data (grid, tabular o freeform) w F Insert Row w Digitar los datos w F Save Changes 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 posicionadndose sobre la tabla y mediante click derecho con el ratón escoger la opción F Alter table. ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 21 de 55 23. 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: 23.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 23.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 23.2. En ventana “Select Tables”, seleccionar las tablas Empleado y Departamento F Open 23.3. En tabla Empleado: Código del empleado, Nombre del empleado, Apellido del empleado. 23.4. En tabla Departamento: 23.5. En carpeta “Sort”: â Apellido del empleado (hacer “drag and drop”). Si se quiere cambiar algo en la sintaxis del código SQL, esto se puede ver con la opción del menú F Design F Convert to sintax. 23.6. Pasar a diseño de la salida: En barra de herramientas: ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es F Nombre del departamento F Return Página 22 de 55 23.7. En la ventana “Select color and border settings” se escogen las opciones de borde y color para el datawindow. En la ventana “Ready to create Tabular Datawindow” aparecen las selecciones dadas con opción de Regresar (para cambiar alguna opción) o Finalizar. 23.8. A continuación aparece la vista de diseño “Design” del datawindow acompañada (por omisión) de la vista de propiedades “Properties” y de la vista de controles “Control List”, apareceran los datos de las tablas seleccionados. En la vista de diseño se puede colocar encabezados apropiados, cambiar color de fondo y otras cuantas propiedades. Tener en cuenta de que a pesar de haber seleccionado el código del empleado, no se desea en la salida!! ü 23.9. Si se quiere volver a la ventana de “Select” correspondiente, escoger en barra de herramientas F SQL (icono que dice SQL) Ver resultado del diseño. En el menú File F Run/Preview 23.10. Hacer modificaciones al diseño. 23.11. Probar inserciones, borrados y modificaciones a la base de datos. 23.12. Grabar el trabajo adelantado: En barra de herramientas: F Save 23.13. En ventana “Save DataWindow”: 23.14. Colocar el nombre de la ventana (d_...) 23.15. Escribir un comentario significativo 23.16. F OK 24. De manera similar elaborar un DataWindows donde se muestre el listado de personas, dado el código del Departamento donde trabajan. ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 23 de 55 24.1. Seguir un procedimiento similar a la creación del anterior DataWindows. Adicionalmente, en la ventana donde se seleccionan campos de las tablas (donde también aparecen las carpetas Sort, Where, Group, Having, Compute y Syntax), dar la información del argumento: 24.1.1. En menú: F Design F Retrieval Arguments... 24.1.2. En ventana “Specify Retrieval Arguments”: escribir el nombre del argumento (por ejemplo departamento) y seleccionar el tipo de dato (por ejemplo Number) 24.1.3. F OK 24.2. En carpeta Where, especificar la condición deseada, por ejemplo: 25. Elaborar un tercer DataWindows que muestre los empleados que tengan el Nombre y/o el Apellido digitado por el usuario. 25.1. Seguir un procedimiento similar a la elaboración del DataWindows anterior. En este caso es necesario especificar dos argumentos (por ejemplo: nombre de tipo String y apellido de tipo String). 25.2. F OK 25.3. En carpeta Where: especificar la condición deseada, por ejemplo: Column Operator Value Logical "empleado"."empl_nombre" = :nombre Or "empleado"."empl_apellido" = :apellido 26. Elaborar un DataWindows que muestre toda la información contenida en la base de datos relacionada con un empleado. En este caso el argumento de búsqueda puede ser el código del empleado y el estilo de presentación puede ser Freeform. 27. Cambiar el Punto de Inicio del Aplicativo, para que active la ventana que muestra las opciones de búsqueda de personal y adicionalmente conecte la base de datos que se va a utilizar. Elaborar un programa similar al siguiente (evento abrir la aplicación): // open icf_1 // Punto inicial del aplicativo. // -----------------------------------------------------------------------------------------------------------------// CONEXIÓN AL MOTOR DE BASE DE DATOS // Conexión a un motor de Base de Datos SQL Anywhere con ODBC sqlca.DBMS = "ODBC" sqlca.DbParm="ConnectString='DSN=Entrenamiento;UID=dba;PWD=sql'" MessageBox ("Motor de Base de Datos conectado:",sqlca.dbparm) connect; // Prueba para ver si quedó conectado if sqlca.sqlcode <> 0 then MessageBox ("No se pudo Conectar a la Base de Datos", & "Mensaje enviado por el sistema:~n~r'"+sqlca.sqlerrtext+"'") return end if // -----------------------------------------------------------------------------------------------------------------open (w_icf_pordepto_nom) //Nombre de la ventana que se desea activar, en este caso la de búsqueda 28. Correr la aplicación y comprobar que funciona el nuevo punto de entrada. ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 24 de 55 29. En la ventana donde se presentan las opciones de búsqueda, programar el botón de “Buscar” para que de acuerdo con la selección hecha (Todos, Por Nombre o Por Departamento), muestre el resultado de la búsqueda. 29.1. Seleccionar el evento clic del botón Buscar y elaborar un programa como el siguiente: // clic para cb_buscar IF rb_otro.checked THEN // Seleccionado todos dw_datos_empleados.visible=true dw_datos_empleados.dataobject='d_lista_empleados' dw_datos_empleados.SetTransObject(SQLCA) dw_datos_empleados.retrieve () END IF 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 pasarselo como entrada al datawindow: dw_datos_empleados.retrieve(DOUBLE(ddlb_departamento.selectitem(ddlb_departamento.text,1))) END IF 29.2. Correr la aplicación y comprobar su correcto funcionamiento. 30. Programar el evento doble click “doubleclicked” para el DataWindows Control de la ventana que permite búsqueda. Por ejemplo: // doble click para dw_datos_empleados integer l_codigo, l_casos 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 l_codigo=GetItemNumber(row,1) //Supone que en los DataWindows la primera Columna //corresponde al código del trabajador!!!!!!!!!!!! dw_datos_empleados.dataobject='d_detalle_empleado' dw_datos_empleados.SetTransObject(SQLCA) l_casos=dw_datos_empleados.retrieve (l_codigo) IF l_casos > 0 THEN dw_datos_empleados.retrieve (l_codigo) ELSE MessageBox ("De la Base de Datos","El empleado no tiene tareas asignadas") w_icf_pordepto_nom.cb_buscar.postevent(Clicked!) END IF END IF 31. Crear una ventana, que sea el nuevo punto de entrada y exhiba en menús las posibilidades que presenta el aplicativo, ver las siguientes cinco figuras: ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 25 de 55 31.1. Para hacer el menú, se puede seguir un procedimiento similar al siguiente: 31.2. En Barra de herramientas o en menú: 31.3. Crear los menús y submenús, junto con sus características, para ello: F New F Object F Menu F Insert F Submenu item, o, ü En el menú ü Ctrl+Shift+S, o, ü Click derecho con el ratón sobre untiled() en la vista “untiled()” activa y seleccionar: F Insert Submenu item F Save 31.4. En barra de herramientas: 31.5. En ventana “Save Menu”: Dar Nombre y Comentarios. 32. Escribir los programas asociados con el evento clic para cada una de las opciones de los menús, por ejemplo: 32.1. Para: F Calculadora // click m_servicios.m_calculadora open ( w_icf_calculadora ) 32.2. Para: F Terminar // click m_servicios.m_terminar If MessageBox("Salir","Salir del aplicativo?",Question!,YesNo!)=1 then Close( ParentWindow ) // Cerrar la ventana donde se encuentra el menu End If //No toma accion en caso negativo 32.3. Para: F Buscar F Todos ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 26 de 55 // Click m_personal.m_buscar.m_todos open ( w_icf_pordepto_nom) w_icf_pordepto_nom.rb_otro.setfocus() w_icf_pordepto_nom.cb_buscar.postevent(Clicked!) 32.4. Para: F Buscar F Por Nombre // Clic m_personal.m_buscar.m_pornombre open ( w_icf_pordepto_nom) w_icf_pordepto_nom.rb_nombre.setfocus() 32.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() 33. A la nueva ventana creada (w_aplicativo_entrenamiento) en la vista de “Properties” F General: colocar nombre, asociar el menú recién elaborado en Menu Name, seleccionar un icono en Icon (desde que los icoconos e imágenes estén en la misma ruta en que se encuentra el aplicativo, no hay necesidad de dejarle la ruta, esto para mayor portabilidad de equipo a equipo). 34. Modificar el punto de Inicio para arranque con la ventana recién diseñada. 35. Agregar facilidades de menú a la ventana de la calculadora, ver ejemplo presentado en las siguientes tres gráficas: ü Si desea colocar separadores entre los submenus como aparece en las figuras, en “Properties” F General del submenu: colocar en Text: “-“ y seleccionar la opción Default. ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 27 de 55 36. Escribir los programas asociados con el evento clic para cada una de las opciones de los menús, por ejemplo: 36.1. Para: F Archivo F Cerrar Ventana // click m_archivo.m_cerrarventana Close( ParentWindow ) 36.2. Para: F Archivo F Salir del Aplicativo // click m_archivo.m_salirdelaplicativo Close ( w_aplicativo_entrenamiento ) //Ventana principal del aplicativo 36.3. Para: F Editar F Borrar Todo // click m_editar.m_borrartodo w_icf_calculadora.sle_operando1.text = "" w_icf_calculadora.sle_operando2.text = "" w_icf_calculadora.st_resultado_n.text = "" 36.4. Para: F Editar F Resultado a Memoria // click m_editar.m_resultadoamemoria // Objetivo: Llevar el resultado al clipboard clipboard ( w_icf_calculadora.st_resultado_n.text ) 36.5. Para: F Editar F Memoria a Operando 1 // clic m_editar.m_memoriaaoperando1 // Copia el contenido del clipboard al Primer Operando w_icf_calculadora.sle_operando1.text = clipboard ( ) Para: F Ayuda F Temas // clic m_ayuda.m_temas ShowHelp ( "C:\Archivos de programa\Sybase\PB6\Help\pbhlp60.hlp", index! ) 37. Elaborar un ejecutable de la aplicación. 36.6. 38. Salir de PowerBuilder. 39. Correr desde Windows el ejecutable que contiene el aplicativo. ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 28 de 55 40. Crear una ventana como la siguiente: En esta ventana se utilizará un nuevo control (TabControl), y el DropDown DataWindow. El Drop Down DataW indow es útil en c as o de que s e requiera hac er referenc ia a datos de otras tablas . Ultima Fila Siguiente Fila Anterior Fila Primera Fila ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 29 de 55 La estructura de las páginas Departamentos y Niveles es la misma. 39.1. Crear una nueva ventana: ü En barra de herramientas F New F Object F Window, o, ü En menú F File F New F Object F Window Con el botón derecho sobre la nueva ventana, modificar las propiedades de la ventana “Properties”: 39.2. ü Window Type: Popup. ü Las opciones Resizable y Maximize Box no deberán seleccionarse. Insertar un control Tab en la ventana y darle el tamaño adecuado. ü ü En el menú Insert F Control F Tab, o, En la barra de herramientas F Create Tab Control Seleccionar el control insertado y hacer click con el botón derecho del mouse en el área superior que no está ocupada por el TabPage (Cada una de las páginas del control Tab recibe este nombre). En las propiedades generales del tabpage: “Properties” F General: Name: tab_actualizaciones Seleccionar Bold Selected Text (El texto de la página seleccionada se muestra en negrilla) ü OK 39.2.1. Hacer click con el botón derecho dentro de la primera página (la que tiene el texto none) y elegir propiedades generales, “Properties” F General : ü Name: tabpage_empleados ü Tab Text: Empleados ü OK 39.2.2. Insertar los demás controles en la ventana (como lo muestra la figura) ü ü ü Un DataWindow control (se usa el botón que se encuentra en la barra de herramientas junto con los demás controles. No confundir con el botón de DataWindow Object que se encuentra en la barra de herramientas superior o PowerBar).En las propiedades del nuevo DataWindow elegir name: dw_act_empleados y seleccionar VscrollBar. ü Los botones Nuevo (cb_nuevo), Borrar (cb_borrar), Actualizar (cb_actualizar), Cargar Datos (cb_cargar). ü Los botones para desplazarse por las filas del DataWindow: Primero (cb_primero), Siguiente (cb_siguiente), Anterior (cb_anterior), Ultimo (cb_ultimo). 39.2.3. Guardar el trabajo: File F Save. El nombre de la nueva ventana será w_actualizaciones. 39.2.4. Modificar la opción actualizar del menú, para que se abra la nueva ventana: ü ü ü ü ü ü En la barra de herramientas F Open F Object Type: Menu. Seleccionar el menú ya realizado (p.ej. m_entrenamiento) F OK Seleccionar la opción Actualizar en la ventana de edición del menú. Oprimir el botón Script en la barra de herramientas Escribir open(w_actualizaciones) Guardar las modificaciones hechas al menú. 39.2.5. Correr la aplicación y probar el funcionamiento del menú y la nueva ventana. 39.2.6. Crear un DataWindow Object en el que se relacionen el código y nombre de los departamentos. ü ü ü ü ü En la barra de herramientas F New F DataWindow: Grid w Data Source F SQL Select F Next En la ventana Select Tables seleccionar la tabla departamento. FOpen Seleccionar las columnas código de departamento y nombre de departamento. Pasar a diseño de salida o vista de diseño: F Return Seleccionar colores y bordes F Aceptar selecciones F Finalizar ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 30 de 55 Colocar los encabezados apropiados. File F Save. En la ventana Save DataWindow: w Name: ddd_depto (será utilizado como DropDownDatraWindow) w OK w Cerrar la ventana de edición del DataWindow 39.2.7. Crear un DataWindow Object para actualizar los datos relacionados con los empleados. ü ü ü ü ü ü ü ü ü ü ü En la barra de herramientas F New F DataWindow: Grid w Data Source F SQL Select F Next En la ventana Select Tables seleccionar la tabla Empleado FOpen Seleccionar todas las columnas de la tabla empleado. Pasar a diseño de salida o vista de diseño: F Return Seleccionar colores y bordes F Aceptar selecciones F Finalizar Elegir “Properties” (con el botón derecho sobre el datawindow, vista de diseño) w En la página General: Color F ButtonFace Para los encabezados de todas las columnas, en la página general: Border F Raised Text F modificar el texto Para la columna dept_id (código de departamento): Elegir “Properties” : w En la página General: Borde F Lowered. w En la página Font: Background F WndBkrnd. w En la página Edit: Ø Style 4DropDownDW Ø DataWindow 4dd_depto (el que se creó en el paso 40.2.6.) Ø Display Column 4dept_nombre (nombre de departamento) Ø Data Colum 4dept_id (códigode departamento) Ø Width of DropDown (ancho del DropDown) 4300% Ø Seleccionar VscrollBar w OK File4Save. En la ventana Save DataWindow: w Name: d_act_empleados w OK w Cerrar la ventana de edición del DataWindow 39.2.8. Seleccionar el DataWindow dw_act_empleados en la página Empleados. Hacer click con el botón derecho y seleccionar la opción properties del menú poup. ü DataWindow Object Name4browse... 4d_act_empleados (el que se creó en el apartado anterior:39.2.7) ü OK 39.3. Para agregar una nueva página al control Tab, se hace click con el botón derecho sobre el control. En el menú popup 4Insert Tab Page 39.3.1. Hacer click con el botón derecho dentro de la nueva página (la que tiene el texto none) y elegir propiedades generales, “Properties” F General en el menú poup: ü Name: tabpage_actividades ü Tab Text: Actividades ü OK 39.3.2. Insertar los demás controles en la ventana (como lo muestra la figura) ü Un DataWindow control. En las propiedades del nuevo DataWindow elegir name: dw_act_actividades y seleccionar VscrollBar. ü Los botones Nuevo (cb_nuevo_a), Borrar (cb_borrar_a), Actualizar (cb_actualizar_a), Cargar Datos (cb_cargar_a). Los nombres de los botones deben ser diferentes a los utilizados en la página Empleados. ü Los botones para desplazarse por las filas del DataWindow: Primero (cb_primero_a), Siguiente (cb_siguiente_a), Anterior (cb_anterior_a), Ultimo (cb_ultimo_a). ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 31 de 55 39.3.3. Crear un DataWindow Object en el que se relacionen el código y nombre de los empleados. (se usa el botón DataWindow de la barra de herramientas PowerBar) ü ü ü ü ü ü ü En la barra de herramientas F New F DataWindow: Grid w Data Source F SQL Select F Next En la ventana Select Tables seleccionar la tabla Empleado FOpen Seleccionar las columnas código de empleado, nombre y apellido del empleado. Pasar a diseño de salida o vista de diseño: F Return Seleccionar colores y bordes F Aceptar selecciones F Finalizar Colocar los encabezados apropiados. File F Save. En la ventana Save DataWindow: w Name: ddd_empleado (será utilizado como DropDownDatraWindow) w OK w Cerrar la ventana de edición del DataWindow 39.3.4. Crear un DataWindow Object en el que se relacionen el código y nombre de los niveles. ü ü ü ü ü ü ü En la barra de herramientas F New F DataWindow: Grid w Data Source F SQL Select F Next En la ventana Select Tables seleccionar la tabla nivel. FOpen Seleccionar las columnas código de nivel y nombre de nivel. Pasar a diseño de salida o vista de diseño: F Return Seleccionar colores y bordes F Aceptar selecciones F Finalizar Colocar los encabezados apropiados. File F Save. En la ventana Save DataWindow: w Name: ddd_nivel (será utilizado como DropDownDatraWindow) w OK w Cerrar la ventana de edición del DataWindow 39.3.5. Crear un DataWindow Object para actualizar los datos relacionados con los actividades de los empleados. ü ü ü ü ü ü ü ü ü En la barra de herramientas F New F DataWindow: Tabular w Data Source F SQL Select F Next En la ventana Select Tables seleccionar la tabla Actividad. FOpen Seleccionar todas las columnas de la tabla Actividad. Pasar a diseño de salida o vista de diseño: F Return Seleccionar colores y bordes F Aceptar selecciones F Finalizar Elegir Properties en el menu poup (con el botón derecho sobre el DataWindow): w En la página General: Color F ButtonFace Para los encabezados de todas las columnas: Elegir Properties en el menu poup (con el botón derecho): w En la página General: Borde F 3D Raised. Text F modificar el texto w En la página Font: Background F ButtonFace. w OK Para la columna emp_id (código del empleado): Elegir Properties en el menu poup (con el botón derecho): w En la página General: Borde F 3D Lowered. w En la página Font: Background F WndBkrnd. w En la página Edit: Ø Style 4DropDownDW Ø DataWindow 4ddd_empleado (el que se creó en el paso 40.3.3.) Ø Display Column 4emp_id (código del empleado) Ø Data Colum 4emp_id (código del empleado) Ø Width of DropDown (ancho del DropDown) 4400% Ø Seleccionar VscrollBar OK ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 32 de 55 ü ü ü Para la columna niv_id (código del nivel): Elegir Properties en el menu poup (con el botón derecho): w En la página General: Borde F 3D Lowered. w En la página Font: Background F WndBkrnd. w En la página Edit: Ø Style 4DropDownDW Ø DataWindow 4ddd_nivel (el que se creó en el paso 40.3.3.) Ø Display Column4niv_id (código del nivel) Ø Data Colum 4niv_id (código del nivel) Ø Wdth of DropDown (ancho del DropDown) 4250% Ø Seleccionar VscrollBar OK File F Save. En la ventana Save DataWindow: w Name: d_act_actividades w OK w Cerrar la ventana de edición del DataWindow 39.3.6. Seleccionar el DataWindow dw_act_actividades en la página Empleados. Hacer click con el botón derecho y seleccionar la opción properties del menú poup. ü DataWindow Object Name4browse... 4d_act_actividades (el que se creó en el apartado anterior: 39.3.5) ü OK 39.4. El procedimiento utilizado para agregar las dos páginas restantes (Departamentos y Niveles) es bastante similar al descrito anteriormente. 39.5. Hasta ahora no se han escrito los programas (scripts) para ninguno de los eventos de los controles creados. 39.5.1. En la ventana w_actualizar, seleccionar la página Empleados (tabpage_empleados) ü Hacer click con el botón derecho sobre la página y seleccionar la opción script en el menú popup. En el editor, seleccionar el evento constructor del listbox de la parte superior izquierda de la ventana. El siguiente es el código para dicho evento: //-------Evento: constructor-------------//-------Control: tabpage_empleados------//Se selecciona el Transaction Object, que proporciona la //información para la comunicación con la base de datos y se //deshabilitan los botones de borrar y actualizar. 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---------dw_act_empleados.SetFocus() // El datawindow toma el foco dw_act_empleados.ScrollToRow(1) // Se desplaza hasta la fila No. 1 dw_act_empleados.SetColumn(1) // Se selecciona la primera columna ü Para el botón de desplazamiento a la siguiente fila (cb_siguiente), evento clicked: -------Evento: clicked--------------------Control: cb_siguiente---------long l_fila_actual ü ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 33 de 55 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 seleccona 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 //seleccionada actualmente dw_act_empleados.ScrollToRow(l_fila_actual - 1) //se desplaza a la //fila anterior dw_act_empleados.SetColumn(1) //se seleccona la primera columna ü Para el botón que de desplazamiento hasta la ultima fila (cb_ultimo), evento clicked: -------Evento: clicked--------------------Control: cb_ultimo---------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 //se recibe la información de la base de datos en el datawindow // tab_actualizaciones.tabpage_empleados.dw_act_empleados tab_actualizaciones.tabpage_empleados.dw_act_empleados.retrieve() l_numfilas=tab_actualizaciones.tabpage_empleados.dw_act_empleados.RowCount() tab_actualizaciones.tabpage_empleados.dw_act_empleados.ScrollToRow(l_numfilas) //Si el número de filas en el datawindow es 0 entonces se deshabilita //el botón de borrar, de lo contrario, se habilita. if l_numfilas = 0 then cb_borrar.enabled = false else cb_borrar.enabled = true end if ü Para el botón de insertar un nuevo empleado (cb_nuevo), evento clicked: //-------Evento: clicked-------------//-------Control: cb_nuevo-----------tab_actualizaciones.tabpage_empleados.dw_act_empleados.SetTransObject(SQLCA) long fila_nueva //la nueva filase inserta al final del datawindow fila_nueva = tab_actualizaciones.tabpage_empleados.dw_act_empleados.InsertRow(0) ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 34 de 55 //el datawindow toma el foco tab_actualizaciones.tabpage_empleados.dw_act_empleados.SetFocus() //se desplaza hasta la nueva fila tab_actualizaciones.tabpage_empleados.dw_act_empleados.ScrollToRow(fila_nueva) tab_actualizaciones.tabpage_empleados.dw_act_empleados.SetColumn(1) cb_actualizar.enabled = true ü Para el botón de borrar un empleado (cb_borrar), evento clicked: //-------Evento: clicked-------------//-------Control: cb_borrar----------long l_fila_actual tab_actualizaciones.tabpage_empleados.dw_act_empleados.SetRedraw (false) //se guarda el número de la fila seleccionada, que es la que se //eliminará l_fila_actual = tab_actualizaciones.tabpage_empleados.dw_act_empleados.getrow() //se elimina la fila seleccionada tab_actualizaciones.tabpage_empleados.dw_act_empleados.DeleteRow (l_fila_actual) //si después de borrarla no quedan filas en el datawindow, //se deshabilita el botón de borrar if tab_actualizaciones.tabpage_empleados.dw_act_empleados.RowCount()=0 then cb_borrar.enabled = false else tab_actualizaciones.tabpage_empleados.dw_act_empleados.SetColumn(1) tab_actualizaciones.tabpage_empleados.dw_act_empleados.SetFocus() end if cb_actualizar.enabled = true tab_actualizaciones.tabpage_empleados.dw_act_empleados.SetRedraw (true) ü Para el botón de actualización de datos, después de haber realizado inserciones y/o borrados (cb_actualizar), evento clicked: //-------Evento: clicked-------------//-------Control: cb_actualizar----------tab_actualizaciones.tabpage_empleados.dw_act_empleados.SetRedraw (false) //si la actualización de la base de datos no es exitosa, se dehacen //todos los cambios con la orden rollback. //De locontrario, se realizan todos los cambios con la orden commit. if tab_actualizaciones.tabpage_empleados.dw_act_empleados.Update() = -1 then rollback; else commit; end if tab_actualizaciones.tabpage_empleados.dw_act_empleados.SetRedraw (true) //Si después de actualizar la base de datos no quedan filas en el //datawindow, se deshabilita el botón de actualizar. if tab_actualizaciones.tabpage_empleados.dw_act_empleados.RowCount() = 0 then cb_actualizar.enabled = false else cb_actualizar.enabled = true end if ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 35 de 55 39.6. Los scripts para los eventos de los controles de las páginas restantes (actividades, niveles y departamentos) son similares a los descritos en el apartado anterior: 39.5, modificando los nombres de los controles y los datawindows. 39.7. Se agregará un nuevo botón, que permitirá exportar los datos del datawindow a diferentes formatos. La apariencia de la ventana será la siguiente: Agregar un nuevo botón, hacer click derecho sobre él y elegir la opción “Properties” del menú popup. w Name F cb_exportar w Text F Exportar. w OK ü Hacer click derecho sobre el botón Exportar y elegir la opción Script del menú popup. ü Elegir el evento clicked en la parte superior izquierda de la ventana del editor y escribir el siguiente programa: //--Evento clicked--//--cb_exportar-----ü integer i_tab i_tab = tab_actualizaciones.SelectedTab //la función SelectedTab retorna el número del tabpage seleccionado. CHOOSE CASE i_tab CASE 1 //el tabpage seleccionado es el 1 (empleados) tab_actualizaciones.tabpage_departamentos.dw_act_departamentos.SaveAs("", EXCEL!, TRUE) ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 36 de 55 //la función SaveAs permite guardar los datos que están en un datawindow //en diferentes formatos de archivo. Esta función utiliza el cuadro de //diálogo "guardar archivo" y permite al usuario elegir el formato al que //desea exportar los datos. En este caso el formato por defecto es el de //la hoja de cálculo EXCEL CASE 2 //el tabpage seleccionado es el 2 (actividades) tab_actualizaciones.tabpage_actividades.dw_act_actividades.SaveAs("", EXCEL!, TRUE) CASE 3 //el tabpage seleccionado es el 3 (departamentos) tab_actualizaciones.tabpage_departamentos.dw_act_departamentos.SaveAs("", EXCEL!, TRUE) CASE 4 //el tabpage seleccionado es el 4 (niveles) tab_actualizaciones.tabpage_niveles.dw_act_niveles.SaveAs("", EXCEL!, TRUE) END CHOOSE 39.8. De manera similar, agregar un botón adicio nal para cerrar la ventana de actualizaciones (w_actualizaciones) ü Properties F Name F cb_cancelar ü Properties F Text F Cancelar ü OK ü El script para el evento clicked de este botón es: Close (parent) 40. Crear una ventana como la siguiente: 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 ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 37 de 55 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 empleados. 40.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”: ü ü 40.2. Window Type F Popup. Las opciones Resizable y Maximize Box no deberán seleccionarse. 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 4tv_depto_empleado w Seleccionar la opción Lines at Root w Indent410 w OK 40.2.1. Insertar los demás controles en la ventana (como lo muestra la figura) ü ü ü Tres botones: Expandir Todo (cb_expandir), Contraer todo (cb_contraer), Cerrar (cb_cerrar) 40.2.2. Guardar el trabajo: File F Save. El nombre de la nueva ventana será w_explorador. 40.2.3. Modificar la opción actualizar del menú, para que se abra la nueva ventana: ü En la barra de herramientas abrir el menu principal: Open FSeleccionar menu principal (p.ej. m_entrenamiento) F OK F Object Type:Menu ü Agregar la opción Explorar en el menú Personal ü Click derecho con el ratón sobre el treeview y seleccionar la opción Script ü Escribir open(w_explorador) ü Guardar las modificaciones hechas al menú. 40.2.4. Correr la aplicación y probar el funcionamiento del menú y la nueva ventana. 40.2.5. Crear un DataWindow Object en el que se relacionen el nombre de los departamentos. (se usa el botón DataWindow de la barra de herramientas PowerBar) ü En la barra de herramientas F New F DataWindow: Tabular w Data Source F SQL Select F Next ü En la ventana Select Tables seleccionar la tabla departamento FOpen ü Seleccionar las columnas código de departamento y nombre de departamento. ü Pasar a diseño de salida o vista de diseño: F Return ü Seleccionar colores y bordes F Aceptar selecciones F Finalizar ü Colocar los encabezados apropiados. ü File F Save. En la ventana Save DataWindow: w Name: d_depto w OK w Cerrar la ventana de edición del DataWindow 40.2.6. Crear un DataWindow Object en el que se relacionen el nombre de los empleados de un departamento determinado. (se puede usar uno de los ya existentes si cumple con esta condición). ü En la barra de herramientas ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es F New F DataWindow: Tabular Página 38 de 55 Data Source F SQL Select F Next En la ventana Select Tables seleccionar la tabla empleado FOpen Seleccionar las columnas código de empleado, apellido y nombre de empleado. Pasar a diseño de salida o vista de diseño: F Return Seleccionar colores y bordes F Aceptar selecciones F Finalizar Colocar los encabezados apropiados. En el menú Design elegir la opción Retrieval Arguments... En la ventana Specify Retrieval Arguments: name 4dept_id, type4number OK Oprimir el Tab "Where" en la parte inferior de la pantalla: w Column 4"empleado"."dept_id" (Al hacer click en el espacio en blanco se puede elegir la columna deseada) w Operator 4= (Al hacer click en el espacio en blanco se puede elegir el operador deseado) w Value : Hacer click con el boton derecho sobre el espacio en blanco, elegir arguments en el menú popup, y luego elegir :dept_id, que es el mismo argumento que se definión en Retrieva Arguments. Pasar a diseño de salida: En la barra de herramientas es el ícono que dice "SQL" File F Save. En la ventana Save DataWindow: w Name: d_empleados_por_depto w OK w Cerrar la ventana de edición del DataWindow w ü ü ü ü ü ü ü ü ü ü ü 40.2.7. Crear un DataWindow Object en el que se puedan almacenar las actividades de un empleado dado. (se puede usar uno de los ya existentes si cumple con esta condición) ü En la barra de herramientas F New F DataWindow: Tabular w Data Source F SQL Select F Next ü En la ventana Select Tables seleccionar la tabla actividad y la tabla empleado F Open ü Seleccionar las columnas código de empleado (de la tabla empleado), y descripción de la actividad (de la tabla actividad). ü En el menú Design elegir la opción Retrieval Arguments... ü En la ventana Specify Retrieval Arguments: name4emp_id (código del empleado), type 4number ü OK ü Oprimir el Tab "Where" en la parte inferior de la pantalla: w Column 4"empleado"."emp_id" (Al hacer click en el espacio en blanco se puede elegir la columna deseada) w Operator 4= (Al hacer click en el espacio en blanco se puede elegir el operador deseado) w Value : Hacer click con el boton derecho sobre el espacio en blanco, elegir arguments en el menú popup, y luego elegir :emp_id, que es el mismo argumento que se definión en Retrieva Arguments ü Pasar a diseño de salida: En la barra de herramientas es el ícono que dice "SQL" ü File F Save. En la ventana Save DataWindow: w Name: d_activ_por_empleado w OK w Cerrar la ventana de edición del DataWindow ü Guardar el trabajo adelantado hasta el momento File F Save. 40.3. Declaración de variable de instancia ids_datos ü En la vista de “Scipt” del treeview desplegar la lista de objetos y seleccionar (Declare) y aparecerá al lado derecho Instance Variables. ü Escribir: datastore ids_datos[4]. ü OK ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es F Página 39 de 55 La variable ids_datos es un array de cuatro posiciones de tipo DataStore, en el que se almacenarán los datos de cada nivel del TreeView. Estos datos se obtendrán de los DataWindow creados en 40.2.6. y 40.2.7. 40.4. Crear las Funciones: ü lf_agregar_items ü lf_config_item 40.4.1. Función lf_agregar_items ü ü ü En la vista de “Scipt” del treeview desplegar la lista de objetos y seleccionar F (Functions) Aparecerá debajo un espacio como el que se muestra en la figura para que sea declarada la función y las variables respectivas. La nueva función tiene las siguientes especificaciones: w Name4lf_agregar_items w Access 4Public w Return 4Integer w Arguments: Ø Name4al_parent, Ttype4Long, Pass By4Value4 Oprimir Add Ø Name4ai_nivel, Type4Integer, Pass By4Value4Oprimir Add Ø Nam4ai_filas, Type4Integer, Pass By4Value ü Colocar el siguiente código para esta función: ////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Función para agregar los items al TreeView usando los datos en el // DataStore // Los argumentos de la función son: // - long al_parent // - integer ai_nivel (el nivel en el que se agregarán los items) // - integer ai_filas (el número de items que se agregarán) ////////////////////////////////////////////////////////////////////////////////////////////////////////////// ü Integer li_Cont //se declara un objeto TreeViewItem para manipular los valores del item //que se agregará TreeViewItem ltvi_Nuevo // Se agrega cada item For li_Cont = 1 To ai_filas // Se llama a la función lf_config_item para asignar los valores //del nuevo item a partir de los datos almacenados en el ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 40 de 55 //DataStore lf_config_item(ai_nivel, li_Cont, ltvi_Nuevo) // Se agrega el item después del último hijo If tv_depto_empleado.InsertItemLast(al_Parent, ltvi_Nuevo) < 1 Then // Si hay Error MessageBox("Error", "Error al insertar item", & Exclamation!) Return -1 End If Next Return ai_filas ü ü Cerrar la ventana del editor y guardar el trabajo adelantado Nota: Si se quieren modificar los argumentos de una función ya declarada, se debe en la vista de “Script” desplegar la lista de objetos, elegir el objeto function y escoger la función a modificar. 40.4.2. Función lf_config_item En la vista de “Scipt” del treeview desplegar la lista de objetos y seleccionar F (Functions) ü Aparecerá debajo un espacio (como el que se mostró en la figura) para que sea declarada la función y las variables respectivas. ü La nueva función tiene las siguientes especificaciones: w Name4lf_config_item w Access 4Public w Return 4 (None) w Arguments: Ø Name4ai_nivel, Type4Integer, Pass By4Value 4 Oprimir Add Ø Name 4ai_fila, Type4Integer, Pass By4Value 4Oprimir Add Ø Name 4atvi_nuevo, Type4TreeViewItem, Pass By4Reference 4OK ü El código para esta función es el siguiente: //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // Se configuran los atributos para el nuevo item a partir de los datos // en el DataStore. // Los atributos de TreeViewItem que se usan son: // Label (el texto que se despliega en el TreeView) // Data (es la información que contiene dicho item) // Los argumentos de esta función son: // integer ai_nivel = el nivel del TreeViewItem en el TreeView // integer ai_fila = # de la fila del DataStore de la que se obtendrá // la información // atvi_nuevo = TreeViewItem que se agrega al TreeView. Los valores de // sus atributos. (Label y Data) son los que se determinan a // continuación // //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ü Choose Case ai_nivel Case 1 // El único item de primer nivel tiene como Label la // palabra "empresa", en este caso no se usa niungún // DataStore ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 41 de 55 atvi_nuevo.Label = "Empresa" atvi_nuevo.Data = "Empresa" Case 2 // Label = nombre del departamento // Data = codigo de departamento atvi_nuevo.Label= ids_datos[2].Object.dept_nombre[ai_fila] atvi_nuevo.Data = ids_datos[2].Object.dept_id[ai_fila] Case 3 // Label = apellido + nombre del departamento // Data = codigo de empleado atvi_nuevo.Label = ids_datos[3].Object.emp_apellido[ai_fila]& + ", " + ids_datos[3].Object.emp_nombre[ai_fila] atvi_nuevo.Data = ids_datos[3].Object.emp_id[ai_fila] Case 4 // Label = descripción de la actividad // Data = código del empleado atvi_nuevo.Label = ids_datos[4].Object.actividad_act_descripcion[ai_fila] atvi_nuevo.Data = ids_datos[4].Object.empleado_emp_id[ai_fila] End Choose If ai_nivel < 4 Then atvi_nuevo.Children = True Else // Si el nivel es 4 (actividades) los items no tienen hijos) atvi_nuevo.Children = False End If atvi_nuevo.PictureIndex = ai_nivel atvi_nuevo.SelectedPictureIndex = ai_nivel ü Guardar el trabajo adelantado 40.5. Escribir los scripts para los controles creados. 40.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 evento 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 // ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //d_depto se hace mediante un select a la tabla departamento. //En este datawindow se almacena la lista de los departamentos //de la empresa. Estos datos aparecerán en el segundo nivel //del treeview. ids_datos[2] = Create DataStore ids_datos[2].DataObject = "d_depto" ids_datos[2].SetTransObject(sqlca) //d_empleados_por_depto contiene los empleados que trabajan en un //departamento. Para esto, se debe escoger la columna código //de departamento (dept_id) como argumento de recuperación (retrieval //arguments) //Los datos aquí recuperados serán los del tercer nivel del treeview ids_datos[3] = Create DataStore ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 42 de 55 ids_datos[3].DataObject = "d_empleados_por_depto" ids_datos[3].SetTransObject(sqlca) //d_activ_por_empleado contiene las actividades asignadas a un //empleado. De forma similar, el retrieval argument para este //datawindow es la columna código de empleado (emp_id) //Los datos aquí recuperados serán los del cuarto nivel del treeview ids_datos[4] = Create DataStore ids_datos[4].DataObject = "d_activ_por_empleado" ids_datos[4].SetTransObject(sqlca) //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). 40.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 ///////////////////////////////////////////////////////////////////////////////////////////////////////////// ü Integer li_nivel, li_parametro, li_DeptID, li_EmpID, li_filas // Se declara un TreeViewItem para el item actual TreeViewItem ltvi_actual SetPointer(HourGlass!) // Se determina el nivel del item que se encuentra seleccionado // actualmente en el TreeView GetItem(handle, ltvi_actual) li_nivel = ltvi_actual.Level + 1 // Departamentos if li_nivel = 2 then ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 43 de 55 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 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 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. 40.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 ll_handle = tv_depto_empleado.FindItem ( RootTreeItem!, 0 ) tv_depto_empleado.ExpandAll ( ll_handle ) ü Compilar el script: en el menú Edit F Compile Script (Ctrl+L). 40.5.4. En el botón Contraer Todo (cb_contraer): ü Hacer click con el botón derecho sobre cb_contraer 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_contraer--------Long ll_handle ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 44 de 55 ll_handle = tv_depto_empleado.FindItem ( RootTreeItem!, 0 ) tv_depto_empleado.CollapseItem ( ll_handle ). ü Compilar el script: en el menú Edit F Compile Script (Ctrl+L). ü Cerrar la ventana del editor. 40.5.5. Para el botón Cerrar (cb_cerrar) -------Evento: clicked--------------------Control: cb_cerrar--------close(w_explorador) ü Compilar el script: en el menú Edit F Compile Script (Ctrl+L). 40.6. Guardar el trabajo adelantado y correr la aplicación para comprobar el funcionamiento del TreeView. 41. Modificar la ventana creada en el paso 40 de la siguiente forma: El control que se añadirá se denomina ListView. Un ListView muestra información en forma de lista al usuario. Cada ítem del ListView consiste de texto y un dibujo. En este caso, el ListView mostrará los ítems del nivel inferior al que se encuentre seleccionado en el árbol. Los botones “Lista”, “Detalles” e “Iconos Grandes”, cambian la forma de presentación de los ítems en el ListView. Cuando el usuario haga doble click sobre uno de los ítems del ListView, se desplegarán los ítems del nivel inferior, y se expandirá la porción correspondiente en el árbol. Los ítems se ordenarán de acuerdo cuando el usuario oprima las cabeceras de las columnas, de forma similar a como ocurre, por ejemplo, en el explorador de windows. 41.1. Insertar un control ListView en la ventana y darle el tamaño adecuado. Seleccionar el nuevo control y hacer click con el botón derecho del mouse sobre él. Con las siguientes especificaciones: ü Name 4lv_dept_empleados ü Seleccionar la opción Show header ü View 4Report (Detalles) ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 45 de 55 ü Sort 4Unsorted ü OK 41.1.1. Insertar los demás controles en la ventana (como lo muestra la figura) ü Tres botones: Lista (cb_lista), Detalles (cb_detalles), Iconos Grandes (cb_grandes) 41.1.2. Guardar el trabajo adelantado: File 41.2. 41.3. F Save. Declaración de variable de instancia ii_columnas ü En la vista de “Scipt” del treeview desplegar la lista de objetos y seleccionar F (Declare) y aparecerá al lado derecho Instance Variables. ü Escribir: integer ii_columnsas. ü OK ü La variable ii_columnas es un entero que se utilizará para contar el número de columnas que se agregan al ListView dependiendo del nivel actual del árbol. Crear las Funciones lf_agregar_items y lf_config_item De ahora en adelante se utilizarán los DataWindow y DataStore creados durante el paso 40 en los nuevos scripts. (ids_datos[], d_depto, d_empleados_por_depto y d_activ_por_empleado) 41.3.1. Función wf_agregar_lv_items En la vista de “Scipt” del treeview desplegar la lista de objetos y seleccionar F (Functions) ü Aparecerá debajo un espacio (como el que se mostró en la figura) para que sea declarada la función y las variables respectivas. ü La nueva función tiene las siguientes especificaciones: w Name4wf_lv_agregar_items w Access 4Public w Return 4Integer w Arguments: Ø Name4ai_nivel, Type4Integer, Pass By 4Value 4 Oprimir Add Ø Name 4ai_filas, Type4Integer, Pass By 4Value 4OK ü En la vista de “Script” colocar el siguiente código para esta función: -------función wf_agregar_lv_items-------------////////////////////////////////////////////////////////////////////////////////// // //Función para agregar items al ListView //usando los datos del DataStore // // Argumentos: // integer ai_nivel (el nivel en que se insertará) // integer ai_filas (número de items a insertar) // ////////////////////////////////////////////////////////////////////////////////// ü Integer li_Cont ListViewItem llvi_nuevo // Se borran todas las columnas existentes en el // ListView For li_Cont = 1 To ii_columnas lv_dept_empleados.DeleteColumn(1) Next // Se agregan las columnas al ListView Choose Case ai_nivel Case 2 lv_dept_empleados.AddColumn("Nombre", Left!, 500) lv_dept_empleados.AddColumn("ID", Right!, 150) ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 46 de 55 ii_columnas = 2 Case 3 lv_dept_empleados.AddColumn("Apellido", Left!, 700) lv_dept_empleados.AddColumn("Nombre", Left!, 700) lv_dept_empleados.AddColumn("ID", Right!, 150) ii_columnas = 3 Case 4 lv_dept_empleados.AddColumn("Descripción", Left!, 900) lv_dept_empleados.AddColumn("ID Nivel", Right!, 250) ii_columnas = 2 End Choose // Se agrega cada item al ListView For li_Cont = 1 To ai_filas // Se llama a la fución para configurar los valores de los // items del ListView a partir de los datos del DataStore wf_config_lv_item(ai_nivel, li_Cont, llvi_nuevo) // Se agrega cada item after the last child If lv_dept_empleados.AddItem(llvi_nuevo) < 1 Then MessageBox("Error", "Error al agregar item", Exclamation!) Return -1 End If Next Return ai_filas ü Compilar el script (Ctrl + L). 41.3.2. Función wf_config_lv_item En la vista de “Scipt” del treeview desplegar la lista de objetos y seleccionar F (Functions) ü Aparecerá debajo un espacio (como el que se mostró en la figura) para que sea declarada la función y las variables respectivas. ü La nueva función tiene las siguientes especificaciones: w Name4wf_config_lv_item w Access 4Public w Return 4 (None) w Arguments: Ø Name4ai_nivel, Type4Integer, Pass By 4Value4Oprimir Add Ø Name4ai_fila, Type4Integer, Pass By 4Value4Oprimir Add Ø Name4alvi_nuevo, Type4ListViewItem, Pass By4Reference w OK ü En la vista de “Script” colocar el siguiente código para esta función: -------función wf_config_lv_item-------------/////////////////////////////////////////////////////////////////////////////////////////////////// // Se configuran los atributos Label y Data para el nuevo // item del ListView a partir de los datos en el DataStore. // // Argumentos: // integer ai_nivel (el nivel del ítem a configurar) // integer ai_fila (el número del item a configurar) // listviewitem alvi_nuevo (el item a configurar) /////////////////////////////////////////////////////////////////////////////////////////////////// Choose Case ai_nivel ü Case 2 // Label = nombre del departamento | código dedepartamento ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 47 de 55 // Data = codigo de departamento alvi_nuevo.Label = ids_datos[2].Object.dept_nombre[ai_fila]+"~t"+ & string(ids_datos[2].Object.dept_id[ai_fila]) alvi_nuevo.Data = ids_datos[2].Object.dept_id[ai_fila] Case 3 // Label = apellido empleado | nombre empleado | código empleado // Data = codigo de empleado alvi_nuevo.Label = ids_datos[3].Object.emp_apellido[ai_fila]+"~t"+ & ids_datos[3].Object.emp_nombre[ai_fila] + "~t" + & string (ids_datos[3].Object.emp_id[ai_fila]) alvi_nuevo.Data = ids_datos[3].Object.emp_id[ai_fila] Case 4 // Label = descripción de actividad | código del nivel // Data = codigo de empleado (no se utiliza) alvi_nuevo.Label = ids_datos[4].Object.actividad_act_descripcion[ai_fila] + "~t" + & string(ids_datos[4].Object.actividad_niv_id[ai_fila]) alvi_nuevo.Data = ids_datos[4].Object.empleado_emp_id[ai_fila] End Choose alvi_nuevo.PictureIndex = ai_nivel ü Compilar el script (Ctrl + L) y guardar el trabajo adelantado. 41.4. Escribir los scripts para los nuevos controles. 41.4.1. 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 selectionchanged. El siguiente es el código para dicho evento: -------control: tv_depto_empleado----------------evento: selectionchanged-------------//////////////////////////////////////////////////////////////////////////////////// // Este evento se ejecuta cuando cambia el ítem // selecionado en el árbol. // Se cargan los datos desde el DataStore y // se agregan los items del nivel inferior al // ListView //////////////////////////////////////////////////////////////////////////////////// Integer li_nivel, li_DeptID, li_EmpID, li_filas // Se declara un TreeViewItem para el item actual TreeViewItem ltvi_actual SetPointer(HourGlass!) // Se determina el nivel del item que se // encuentra seleccionado actualmente en el TreeView GetItem(newhandle, ltvi_actual) li_nivel = ltvi_actual.Level + 1 // Departamentos if li_nivel = 2 then ids_datos[li_nivel].SetTransObject(sqlca) ids_datos[li_nivel].Reset() ids_datos[li_nivel].SetTransObject(sqlca) ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 48 de 55 // 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 // Se borran todos los items del ListView lv_dept_empleados.DeleteItems() // La función wf_agregar_lv_items agrega un número // de items igual a "li_filas" en el ListView, que // pertenecen al nivel "li_nivel" wf_agregar_lv_items(li_nivel, li_filas) ü Cerrar la ventana del editor y guardar el trabajo adelantado 41.4.2. 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 doubleclicked. El siguiente es el código para dicho evento: -------control: lv_dept_empleados----------------evento: doubleclicked--------------Long ll_Padre, ll_Item Boolean lb_Encontrado TreeViewItem ltvi_Item ListViewItem llvi_Actual If index <= 0 Then Return // Error // Se toma el ítem sobre el que se hizo doble click If GetItem(index, llvi_Actual) = -1 Then Return // Se toma el item actualmente seleccionado en el TreeView. // Este debe ser el padre del item seleccionado en el ListView ll_Padre = tv_depto_empleado.FindItem(CurrentTreeItem!, 0) tv_depto_empleado.GetItem(ll_Padre, ltvi_Item) ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 49 de 55 tv_depto_empleado.ExpandItem(ll_Padre) // Se busca el item del ListView en el árbol lb_Encontrado = False ll_Item = tv_depto_empleado.FindItem(ChildTreeItem!, ll_Padre) Do Until (lb_Encontrado Or ll_Item < 1) tv_depto_empleado.GetItem(ll_Item, ltvi_Item) If Pos(ltvi_Item.Label, llvi_Actual.Label) > 0 Then // Se ha encontrado el item lb_Encontrado = True Else // Se revisa el siguiente item ll_Item = tv_depto_empleado.FindItem(NextTreeItem!, ll_Item) End If Loop 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). 41.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----------------// Los items en el ListView se ordenan ascendentemente // por la columna presionada por el usuario // "column" es el argumento del evento columnclick // es el número de la columna sobre la que se ha hecho click lv_dept_empleados.SetRedraw(false) lv_dept_empleados.Sort(Ascending! , column) lv_dept_empleados.SetRedraw(true) ü Compilar el script (Ctrl + L). 41.4.4. En el botón “Lista” (cb_lista): ü Hacer click con el botón derecho sobre el botón 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_lista-----------// Muestra los ítems del ListView en forma de una lista sencilla lv_dept_empleados.view = ListViewList! ü Compilar el script: en el menú Edit F Compile Script (Ctrl+L). ü Cerrar la ventana del editor. ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 50 de 55 41.4.5. En el botón “Detalles” (cb_detalles): ü Hacer click con el botón derecho sobre cb_detalles 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_detalles--------// Muestra los ítems del ListView en forma de una lista detallada. // Esta es la forma de presentación por defecto que se escogió al // crear el control ( en propiedades de lv_dept_empleados: view = // report ) lv_dept_empleados.view = ListViewReport! ü Compilar el script: en el menú Edit F Compile Script (Ctrl+L). 41.4.6. En el botón “Iconos grandes” (cb_grandes): ü ü Hacer click con el botón derecho sobre cb_grandes 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_grandes--------// Muestra los items del ListView en forma de íconos grandes lv_dept_empleados.view = ListViewLargeIcon! ü Compilar el script: en el menú Edit F Compile Script (Ctrl+L). ü Cerrar la ventana del editor. 42. Correr la aplicación y probar su funcionamiento. ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 51 de 55 ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 52 de 55 43. Crear un ejecutable de la aplicación creada. ü Crear un proyecto: w En la barra de herramientas F New F Project F Aplication Wizard w “About the Aplication Wizard”: Información acerca de la ayuda prestada por el wizard para construir el proyecto de la aplicación. F Next w “Specify Destination Library”: Aparece la ruta o directorio donde se van a almacenar los objetos generados. F Next ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 53 de 55 w “Specify Project”: aparece un nombre sugerido por convención debe ser p_nombre_proyecto, puede cambiar el nombre o aceptar el sugerido F Next w “Specify Executable and Resource Files”: Aquí usted debe proporcionar el nombre que dara al ejeutable y la ruta o directorio donde quedará; es opcional que seleccione “Resource Files” (archivos fuente) o .pbr. F Next “Specify Build Options”: Opciones de construcción seleccionar: F Full F Next “Generate Machine Code”: No (sugerido) F Next “Specify dynamic library options”: paso opcional (no seleccionar sugerido) w w w F Next w w “Ready to create application”: Aparecen las opciones seleccionadas, si se quiere cambiar algo retroceda sino F Finish Ahora en su .pbl aparecerá un nuevo objeto que es el proyecto que acaba de crear: p_nombre_proyecto ü Construir el proyecto para generar el ejecutable: w De doble click sobre el proyecto recién creado w Seleccione la forma de construir el proyecto para generar el ejecutable: Ø En la ventana del proyecto seleccione incremental o full (sugerida), y luego en la barra de herramientas F Build Ø En el menu Design F Incremental Build o, F Full Build (sugerida) ü Crear un acceso directo para el ejecutable: w En el explorador de windows situése en el directorio donde quedó el ejecutable, ahora con el click derecho elija crear nuevo acceso directo, elija como destino: la ruta donde está el ejecutable y en iniciar en coloque la ruta donde se encuentran los recursos compartidos de Sybase para PowerBuilder, en este caso: "C:\Archivos de programa\Sybase\Shared\PowerBuilder". (Ver imagen que aparece a continuación) w Pruebe que dando click sobre este acceso directo funciona la aplicación. ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 54 de 55 ENTRENA MIENTO EN POWERBUILDER 7.02 Ing. Ismae l Cast añeda F uent es Página 55 de 55