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

AS/400e

Programacin con VisualAge para RPG


V ersin 4.5.1 para Windows

SC10-3067-04

AS/400e

Programacin con VisualAge para RPG


V ersin 4.5.1 para Windows

SC10-3067-04

Importante Antes de utilizar esta informacin y el producto al que hace referencia, asegrese de leer la informacin general en Avisos en la pgina 451.

Quinta edicin (Abril 2000) Esta edicin corresponde a la Versin 4, Release 5, Nivel de modificacin 1, de IBM WebSphere Development Tools para AS/400 (Programa 5769-CL3) y a todos los releases y modificaciones posteriores hasta que se indique lo contrario en nuevas ediciones. Esta edicin sustituye a la publicacin SC10-3067-03. Los cambios o adiciones realizados en el texto o en las ilustraciones se indican mediante una lnea vertical a la izquierda del cambio o adicin. Haga sus pedidos de publicaciones a travs de su representante de IBM o de la sucursal de IBM de su localidad. En la direccin que figura ms abajo no hay existencias de publicaciones. IBM agradece sus comentarios. Puede enviar los comentarios a: IBM, S.A. National Language Solutions Center Avda. Diagonal, 571 08029 Barcelona Espaa Tambin puede enviar sus comentarios por fax: Desde Espaa: 933 216 134 Desde otros pases: 34 933 216 134 Si tiene acceso a Internet, puede enviar sus comentarios electrnicamente a: hojacom@vnet.ibm.com Consulte el apartado Cmo enviar comentarios en la pgina xi para ver una descripcin de los mtodos. Cuando enva informacin a IBM, otorga a IBM un derecho no exclusivo de utilizar o distribuir la informacin de cualquier manera que considere adecuada, sin incurrir en ninguna obligacin hacia usted. Copyright International Business Machines Corporation 1994, 2000. Reservados todos los derechos.

Contenido
Acerca de este manual . . . . . . . . ix
A quin va dirigido este manual . . . Prerrequisitos e informacin relacionada . Cmo utilizar este manual . . . . . La biblioteca VisualAge RPG . . . . . Cmo enviar comentarios . . . . . . Acceso a la informacin en lnea . . . Utilizacin de manuales en lnea . . Publicaciones en formato PDF . . . Utilizacin de ayuda en lnea . . . . ix . ix . ix . . . . x . . . . xi . . . . xii . . . . xii . . . . xii . . . . xii . . . . . . . . . Mantener informados a los usuarios . Utilizar un estilo coherente . . . . Anticipar cuestiones de traduccin . . . . . . . . . . . . . . 21 . 22 . 22

Parte 2. Cmo trabajar con componentes . . . . . . . . . . . 23


Captulo 3. Programacin con componentes . . . . . . . . . . . . 25
Obtencin y establecimiento de atributos de componente . . . . . . . . . . . . . . Referencia a componentes en el programa . . . Respuesta a eventos . . . . . . . . . . . Atributos de sistema . . . . . . . . . . . Cmo trabajar con atributos de evento y de sistema Codificacin de los componentes texto esttico y campo de entrada . . . . . . . . . . . . Creacin y recuperacin de componentes campo de entrada . . . . . . . . . . . . . . Cdigos de operacin para componentes de ventana. . . . . . . . . . . . . . . Utilizacin de cdigos de operacin de ventana en componentes con nombres idnticos . . . . 25 25 26 27 27 29 29 30 30

Novedades de este Release. . . . . . xv

Parte 1. Introduccin a las aplicaciones cliente/servidor . . . . 1


Captulo 1. Creacin de una aplicacin Cliente/Servidor . . . . . . . . . . . 3
Acerca de la aplicacin de ejemplo . . . . . . Construccin de la aplicacin de ejemplo . . . . Decisin sobre lo que se mostrar al usuario. . . Bienvenidos al Catlogo de vdeos . . . . . Examinar por categora . . . . . . . . . Bsqueda de ttulos concretos . . . . . . Previsualizacin de ttulos . . . . . . . . Modificacin y generacin de pedidos . . . . Generacin de pedidos . . . . . . . . . Diseo de ventanas de alto nivel . . . . . . Creacin de la ventana Comedy . . . . . . . Creacin de la GUI . . . . . . . . . . Cmo establecer los atributos . . . . . . . Adicin de lgica de programa . . . . . . Creacin de la ventana Preview. . . . . . . Creacin de la GUI . . . . . . . . . . Establecimiento de atributos en el momento del diseo . . . . . . . . . . . . . . Establecimiento de atributos en tiempo de ejecucin . . . . . . . . . . . . . Adicin de lgica de programa . . . . . . Creacin de mensajes . . . . . . . . . . Creacin de la ayuda en lnea . . . . . . . Ayuda segn contexto . . . . . . . . . Creacin de pulsadores de ayuda . . . . . Repaso de la programacin visual . . . . . . 3 3 5 5 5 6 6 6 6 6 7 7 8 9 . 11 . 11 . 12 . . . . . . . 12 12 15 15 15 16 17 . . . . . . . . . . . . . .

Captulo 4. Programas de ejemplo para VisualAge RPG . . . . . . . . . . . 33


Antes de empezar . . . . . Construccin de los ejemplos Ejecucin de los ejemplos. . Acceso a un sistema AS/400. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 34 34 34

Captulo 5. Atributos comunes . . . . 35


Atributo PartName . . . . . Atributo ParentName . . . . Atributo PartType . . . . . Atributos de color . . . . . Atributo Enabled . . . . . Atributos de tamao y posicin Atributo Visible . . . . . . Atributo Focus . . . . . . Atributo UserData . . . . . Atributo Label . . . . . . Sustitucin de etiqueta . . Consejos sobre la traduccin. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 35 35 37 37 37 38 38 39 39 39 40

Captulo 2. Planificacin de la aplicacin . . . . . . . . . . . . . 19


Habilitacin de aplicaciones seguras de Java Decidir qu funciones se van a proporcionar Ayuda a los usuarios . . . . . . . . Mantener un diseo de ventana sencillo . . Nmero de ventanas . . . . . . . Contenido de cada ventana . . . . . Planificar el cdigo con eficacia. . . . .
Copyright IBM Corp. 1994, 2000

. . . . . . .

. . . . . . .

. . . . . . .

19 19 19 20 20 20 21

Captulo 6. Utilizacin de transferencia de datos . . . . . . . . . . . . . . 41


Una situacin de transferencia de datos habitual Componentes que soportan la transferencia de datos Habilitacin de componentes para la transferencia de datos . . . . . . . . . . . . . . . Ejemplo de transferencia de datos . . . . . . . 41 41 41 42

iii

Captulo 7. Utilizacin de componentes 45


ActiveX. . . . . . . . . . . . . . . . Adicin de controles ActiveX . . . . . . . Establecimiento de propiedades . . . . . . Llamada a mtodos. . . . . . . . . . . Respuesta a eventos . . . . . . . . . . Control de animacin . . . . . . . . . . . Calendario. . . . . . . . . . . . . . . Determinar la fecha que el usuario ha seleccionado . . . . . . . . . . . . . Utilizar atributos de ndice de fecha . . . . . Lienzo . . . . . . . . . . . . . . . . Recuadro de seleccin . . . . . . . . . . . Establecimiento del estado de un componente recuadro de seleccin . . . . . . . . . . Establecimiento de un nemotcnico . . . . . Sealizacin de eventos . . . . . . . . . Recuadro de combinacin . . . . . . . . . Seleccin del tipo de recuadro de combinacin . Adicin y establecimiento de la secuencia inicial de elementos . . . . . . . . . . . . . Adicin de elementos en tiempo de ejecucin . . Actualizacin de elementos de una lista . . . . Establecimiento del principio de la lista . . . . Eliminacin de elementos. . . . . . . . . Seleccin y deseleccin de elementos . . . . . Recuperacin de un elemento seleccionado por usuario . . . . . . . . . . . . . . . Utilizacin de claves . . . . . . . . . . Establecimiento del texto del campo de entrada Sealizacin de eventos . . . . . . . . . Referencia a componente lgico . . . . . . . Referencia a atributos de componente en otros componentes lgicos . . . . . . . . . . Supervisin de eventos en otro componente lgico . . . . . . . . . . . . . . . Contenedor . . . . . . . . . . . . . . Adicin de columnas a un contenedor . . . . Adicin de registros a un contenedor . . . . . Actualizacin de columnas de contenedor . . . Eliminacin de registros de un contenedor . . . Cambio de la vista de contenedor . . . . . . Cliente DDE . . . . . . . . . . . . . . Campo de entrada . . . . . . . . . . . . Utilizacin del atributo InsertMode . . . . . Utilizacin del atributo Text . . . . . . . . Obtencin y establecimiento de informacin para una ventana . . . . . . . . . . . . . Comprobacin de validez. . . . . . . . . Cmo evitar la entrada de datos por parte del usuario . . . . . . . . . . . . . . . Enmascarado de los datos confidenciales . . . Grfica . . . . . . . . . . . . . . . . Enviar datos al grfico. . . . . . . . . . Pulsador grfico . . . . . . . . . . . . . Definicin de la imagen . . . . . . . . . Asignacin de teclas de mandato . . . . . . Sealizacin de eventos . . . . . . . . . Recuadro de grupo . . . . . . . . . . . . Etiquetado de un recuadro de grupo . . . . . Agrupacin de botones de seleccin . . . . . 46 47 47 48 49 50 51 51 52 53 55 56 56 56 57 58 58 58 59 59 59 59 59 60 61 61 62 62 63 64 64 65 66 67 67 71 72 73 73 73 73 74 74 75 75 77 78 78 78 79 79 79

Barra de desplazamiento horizontal . . . . . . 80 Imagen . . . . . . . . . . . . . . . . 81 Creacin del componente de imagen . . . . . 82 Establecimiento del nombre de archivo . . . . 82 Control del panel de ampliacin . . . . . . 82 Ejemplo de imagen . . . . . . . . . . . 83 Bean Java . . . . . . . . . . . . . . . 87 Adicin de beans al proyecto . . . . . . . 87 Ubicacin de los archivos JAR de bean . . . . 88 Establecimiento de la classpath de JAR . . . . 88 Establecimiento/Obtencin de las propiedades del JavaBean e invocacin de mtodos . . . . 89 Recuadro de lista . . . . . . . . . . . . 90 Adicin y establecimiento de la secuencia inicial de elementos . . . . . . . . . . . . . 90 Adicin de elementos en tiempo de ejecucin . . 91 Actualizacin de elementos de una lista . . . . 91 Establecimiento del principio de la lista . . . . 91 Eliminacin de elementos. . . . . . . . . 91 Seleccin y deseleccin de elementos . . . . . 91 Tipos de seleccin . . . . . . . . . . . 91 Recuperacin de elementos de la lista . . . . 92 Utilizacin de las teclas . . . . . . . . . 92 Sealizacin de eventos . . . . . . . . . 92 Ejemplo de recuadro de lista . . . . . . . 93 Ejemplo de bsqueda . . . . . . . . . . 96 Medios . . . . . . . . . . . . . . . . 99 Especificacin de un nombre de archivo . . . . 99 Establecimiento de AudioMode . . . . . . 100 Establecimiento de Volume . . . . . . . . 100 Establecimiento de Position. . . . . . . . 100 Utilizacin del componente Panel de medios 100 Sealizacin de eventos . . . . . . . . . 100 Panel de medios . . . . . . . . . . . . 101 Creacin de un componente panel de medios 101 Enlace con otros componentes . . . . . . . 101 Sealizacin de eventos . . . . . . . . . 102 Barra de mens . . . . . . . . . . . . 103 Creacin de mens desplegables . . . . . . 103 Elemento de men . . . . . . . . . . . 104 Colocacin de una marca de seleccin junto a una opcin de men . . . . . . . . . . 104 Establecimiento del texto de men . . . . . 104 Establecimiento de un nemotcnico . . . . . 104 Habilitacin de elementos de men . . . . . 105 Sealizacin de eventos . . . . . . . . . 105 Subarchivo de mensajes . . . . . . . . . . 106 Visualizacin de mensajes predefinidos . . . . 106 Visualizacin de texto suministrado en el programa. . . . . . . . . . . . . . 106 Utilizacin de variables de sustitucin . . . . 106 Eliminacin de mensajes. . . . . . . . . 107 Ejemplo de subarchivo de mensajes . . . . . 108 Edicin de mltiples lneas . . . . . . . . . 110 Obtencin y establecimiento del texto . . . . 110 Manipulacin de lneas de texto en un componente de edicin de mltiples lneas . . 110 Manipulacin de caracteres en un componente de edicin de mltiples lneas . . . . . . . 111 Manipulacin de partes seleccionadas del texto en un componente edicin de mltiples lneas . 111

iv

Programacin con VisualAge RPG

Cambio de color . . . . . . . . . . Eleccin de fonts . . . . . . . . . . Cmo evitar la entrada de datos por parte del usuario . . . . . . . . . . . . . Ejemplo de edicin de mltiples lneas . . . Cuaderno. . . . . . . . . . . . . . Cambio del nfasis del font. . . . . . . Pgina de cuaderno . . . . . . . . . . Mostrar el texto del separador . . . . . . Establecimiento de un nemotcnico . . . . Pgina de cuaderno con lienzo . . . . . . Interfaz ODBC/JDBC . . . . . . . . . . Conexin a una base de datos ODBC . . . Creacin de un conjunto de registros . . . Acceso a los datos de una tabla . . . . . Tipos de datos . . . . . . . . . . . Recuperacin de las filas de una tabla . . . Actualizacin de los datos de una fila . . . Supresin de una fila . . . . . . . . . Ejemplo de componente Interfaz ODBC/JDBC Recuadro de contorno . . . . . . . . . Valores de altura (Height) y anchura (Width) especiales. . . . . . . . . . . . . Men emergente . . . . . . . . . . . Barra de progreso . . . . . . . . . . . Ejemplo de barra de progreso . . . . . . Pulsador . . . . . . . . . . . . . . Establecimiento de un pulsador por omisin Establecimiento de un nemotcnico . . . . Asignacin de teclas de mandato . . . . . Sealizacin de eventos . . . . . . . . Botn de seleccin. . . . . . . . . . . Establecimiento de un nemotcnico . . . . Agrupacin de botones de seleccin . . . . Establecimiento del estado de un botn de seleccin . . . . . . . . . . . . . Sealizacin de eventos . . . . . . . . Graduador . . . . . . . . . . . . . Obtencin y establecimiento del valor del graduador . . . . . . . . . . . . Sealizacin de eventos . . . . . . . . Ejemplo de graduador . . . . . . . . Selector cclico . . . . . . . . . . . . Establecimiento de valores del selector cclico Obtencin del valor del selector cclico . . . Cmo evitar la entrada de datos por parte del usuario . . . . . . . . . . . . . Ejemplo de selector cclico . . . . . . . Texto esttico . . . . . . . . . . . . Cambio del texto de un componente texto esttico . . . . . . . . . . . . . Obtencin de valores de texto esttico . . . Obtencin y establecimiento de informacin para una ventana . . . . . . . . . . Edicin de la salida . . . . . . . . . Barra de estado. . . . . . . . . . . . Ejemplo de Barra de estado . . . . . . Subarchivo . . . . . . . . . . . . . Creacin de un componente subarchivo . . Nmero mximo de campos por subarchivo .

. 111 . 111 . . . . . . . . . . . . . . . . 111 112 115 115 116 116 116 117 118 119 119 120 121 121 122 122 123 . 131 131 132 133 133 134 134 134 135 135 136 136 136

. . . . . . . . . . .

. 138 . 138 . 139 . . . . 139 140 140 145 145 . 146

Cdigos de operacin para manipular componentes subarchivo . . . . . . Carga de un subarchivo . . . . . . . Determinacin del tamao de subarchivo . Obtencin de la cuenta de registros . . . Lectura y actualizacin de registros . . . Cambio de campos de subarchivo . . . Campos ocultos . . . . . . . . . Formato de campos de subarchivo . . . Habilitacin de la tabulacin . . . . . Ejemplo de subarchivo . . . . . . . Sealizacin de eventos . . . . . . . Submen . . . . . . . . . . . . . Temporizador . . . . . . . . . . . Visualizacin del icono Temporizador . . Establecimiento del intervalo . . . . . Generacin de eventos Tick. . . . . . Obtencin del valor de temporizador . . Control del temporizador utilizando modalidades de temporizador . . . . . Ejemplo de temporizador . . . . . . Barra de desplazamiento vertical . . . . . Ventana . . . . . . . . . . . . . Ventana con lienzo . . . . . . . . . Visualizacin de una ventana . . . . . Cambio del tamao de una ventana . . . Establecimiento del foco . . . . . . . Lista de ventanas . . . . . . . . . Terminacin de un programa . . . . . Borrado de campos en una ventana . . . Ejemplo de un componente ventana . . . *Component . . . . . . . . . . . . Utilizacin del componente *component . Visualizar un dilogo Abrir/Guardar como Archivo . . . . . . . . . . . . Seleccionar una impresora . . . . . . Utilizacin de conectores . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . de . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

153 153 153 154 154 154 155 155 155 155 165 166 167 167 167 168 168 168 168 174 175 176 176 178 181 181 182 183 183 184 184

. 184 . 185 . 185

Parte 3. Cmo trabajar con datos AS/400 . . . . . . . . . . . . . . 187


Captulo 8. Conectividad con AS/400 189
189 189 190 190 190 191 192 196 196 196 197 197 Definicin de la informacin de AS/400 . . . . Consideraciones sobre el cuaderno . . . . . Configuracin de un servidor . . . . . . . . Establecimiento de un servidor en tiempo de diseo . . . . . . . . . . . . . . . Establecimiento de un servidor en tiempo de ejecucin . . . . . . . . . . . . . . Utilizacin de reas de datos . . . . . . . . Utilizacin de archivos de base de datos de AS/400 Comprobacin de nivel . . . . . . . . . Bloqueo de archivos de base de datos de AS/400 . . . . . . . . . . . . . . Alteracin temporal de archivos de base de datos . . . . . . . . . . . . . . . Consideraciones de E/S de base de datos de AS/400 . . . . . . . . . . . . . . . Utilizacin de bloques de registros para mejorar el rendimiento . . . . . . . . . . . .
Contenido

. 146 . 146 . 149 . 149 . 149 . . . . . . . 150 150 151 151 152 153 153

Servidores utilizados en el AS/400 . . . . Utilizacin del archivo de seguridad para los applets . . . . . . . . . . . . .

. .

. 198 . 198

Captulo 9. Reutilizar aplicaciones AS/400 . . . . . . . . . . . . . . 201


Situacin de reutilizacin . . . . . . . . Importacin de archivos de pantalla de AS/400 Conversin de archivos de pantalla . . . . Reutilizar ayuda UIM . . . . . . . . . Funciones UIM e IPF que utilizan los mismos cdigos . . . . . . . . . . . . . Funciones UIM e IPF equivalentes que utilizan cdigos distintos . . . . . . . . . . Funciones UIM sin equivalentes IPF . . . . Reutilizar el fuente RPG . . . . . . . . . . 201 206 . 207 . 212 . 212 . 213 . 214 . 214

Decisin del tipo de ayuda que se va a proporcionar . . . . . . . . . Adicin de ayuda segn el contexto . Creacin de un pulsador de ayuda . Creacin de enlaces de hipertexto .

. . . .

. . . .

. . . .

. . . .

236 236 236 237

Captulo 14. Consejos para la creacin y utilizacin de ayuda Windows . . . . . . . . . . . . . 239


Establecimiento del ID de recurso . . . Escritura del texto de ayuda . . . . . Creacin del archivo del proyecto de ayuda Compilacin del programa VARPG . . . Prueba de la ayuda . . . . . . . . Creacin de un archivo de contenido . . . . . . . . . . . . . . . . . . . . 240 240 241 242 242 242

Parte 4. Temas avanzados. . . . . 215


Captulo 10. Depuracin de la aplicacin . . . . . . . . . . . . . 217
Arranque del depurador. . . . . . . . . . Visualizacin del cdigo ensamblador . . . . . Carga de la aparicin de DLL . . . . . . . . Entrada de informacin de arranque de la depuracin . . . . . . . . . . . . . . Establecimiento de un punto de interrupcin . . . Ejecucin con puntos de interrupcin . . . . . Utilizacin del ratn o del teclado para iniciar funciones de depuracin . . . . . . . . . Seleccin de opciones desde la barra de herramientas . . . . . . . . . . . . . Visualizacin y modificacin de variables, matrices y estructuras . . . . . . . . . . . . . Modificacin del contenido de un campo o de una estructura . . . . . . . . . . . . . . Modificacin de la representacin . . . . . . Modificacin de la representacin por omisin . . Visualizacin de punteros y almacenamiento . . . Modificacin de las vistas del depurador . . . . Establecimiento de fonts. . . . . . . . . . 217 218 218 219 219 221 221 222 223 224 224 225 225 226 227

Captulo 15. Consejos para la creacin de JavaHelp . . . . . . . . 243


Creacin Creacin Creacin Creacin de un archivo HelpSet de un archivo Map . del archivo TOC . . del archivo JAR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244 245 245 246

Captulo 16. Trabajar con mensajes


Definicin de texto para etiquetas de sustitucin Creacin de un nuevo mensaje . . . . . . Edicin de un mensaje . . . . . . . . . Supresin de un mensaje . . . . . . . . Bsqueda de un mensaje . . . . . . . . Utilizacin de mensajes con la lgica . . . . Conversin de archivos de mensajes. . . . . Cambio manual de archivos de mensajes . . Utilizacin de mensajes y etiquetas . . . . .

247
. . . . . . . . 247 248 249 249 249 250 250 251 251

Captulo 17. Comunicacin entre objetos . . . . . . . . . . . . . . 253


Enlace de componentes . . . . . . . . . . Utilizacin de una aplicacin VisualAge RPG como servidor DDE . . . . . . . . . . . . . AppName . . . . . . . . . . . . . Topic . . . . . . . . . . . . . . . Item . . . . . . . . . . . . . . . DDEAddLink . . . . . . . . . . . . DDEMode . . . . . . . . . . . . . Comunicacin entre componentes lgicos . . . . Realizacin de llamadas locales . . . . . . . Utilizacin de la operacin CALLB . . . . . Llamada a programas locales utilizando CALLP Llamada a programas locales utilizando START Inicio de componentes utilizando START . . . Llamada a programas remotos . . . . . . . Llamada a programas AS/400 . . . . . . . Inicio de programas de estacin de trabajo desde el AS/400 . . . . . . . . . . . Utilizacin de mltiples procedimientos . . . . Llamadas de prototipo . . . . . . . . . Consideraciones sobre el procedimiento . . . Implicaciones del procedimiento . . . . . . 253 254 254 254 254 255 255 255 255 255 258 259 260 261 262 263 264 264 266 267

Captulo 11. Edicin de la salida . . . 229


Cdigos de edicin . . . . . . Palabras de edicin . . . . . . Partes de una palabra de edicin . . . . . . . . . . . . . . 229 . 230 . 231

Captulo 12. Utilizacin de archivos de imgenes, de sonido y de vdeo . . . 233


Creacin de iconos para Windows . . . . . Conversin de iconos OS/2 a formato Windows . 234 234

Captulo 13. Consejos para crear ayuda en lnea con IPF . . . . . . . 235
Creacin de ayuda en lnea . . . . . Utilizacin de IPF . . . . . . . . Soporte de ayuda para otros idiomas . Adicin de grficos a la ayuda en lnea. . . . . . . . . . . . . . . . . 235 235 235 236

vi

Programacin con VisualAge RPG

Captulo 18. Cmo invocar mtodos Java desde programas VisualAge RPG . . . . . . . . . . . . . . . 269
El tipo de datos de objeto y la palabra clave CLASS . . . . . . . . . . . . . . Cmo realizar el prototipo de un mtodo Java . Ejemplos de cmo realizar el prototipo de un mtodo Java . . . . . . . . . . . . Cmo crear objetos . . . . . . . . . . Cmo invocar mtodos Java . . . . . . . Otras consideraciones . . . . . . . . . . 269 . 270 . . . . 271 273 273 276

Captulo 23. Fusin de cdigo en la aplicacin . . . . . . . . . . . . . 367 Captulo 24. Conectores de proveedor 371
Adicin de conectores de proveedor . . . Invocacin de un conector de proveedor . Gestin de conectores de proveedor . . . . . . . . . . 371 . 371 . 371

Captulo 25. Creacin de conectores


Creacin de conectores mediante VisualAge RPG Creacin del archivo .plg . . . . . . . Plantilla de archivo .plg y ejemplo . . . . Creacin del archivo .EXE . . . . . . . Empaquetado de la aplicacin . . . . . . Consideraciones al crear conectores con VisualAge para C++ . . . . . . . . . . . . . . Consideraciones al crear conectores con REXX .

373
. . . . 373 373 379 381 395

Captulo 19. Consideraciones al compilar para Java . . . . . . . . . 277


Convenio de denominacin del archivo de proyecto . . . . . . . . . . . . Directivas de compilacin condicional . . Restricciones del cdigo fuente Java . . . Cambios posibles en el cdigo VARPG . . Diferencias de tiempo de ejecucin . . . Restricciones de applet . . . . . . . Problemas de impresin de J2SDK 1.2 . . . . . . . . . . . . . . . . . . . . . . . 277 277 277 278 280 281 281

. 395 . 395

Parte 5. Distribucin de la aplicacin . . . . . . . . . . . . 397


Captulo 26. Cmo empaquetar el cdigo de tiempo de ejecucin y las aplicaciones . . . . . . . . . . . . 399
Antes de empezar . . . . . . . . . . . Cmo empaquetar el cdigo de tiempo de ejecucin y las aplicaciones de VisualAge RPG . Inicio de la herramienta de empaquetado . . Cmo empaquetar aplicaciones Windows para Windows NT/95/98 . . . . . . . . . Cmo empaquetar aplicaciones Java para Windows NT/95/98 . . . . . . . . . Cmo empaquetar aplicaciones Java para otras plataformas . . . . . . . . . . . . . 399 . 399 . 400 . 401 . 403 . 404

Captulo 20. Llamada a funciones del sistema al compilar para Java . . . . 283
Una llamada sencilla . . . . . . . . . . Paso y recepcin de parmetros . . . . . . Tipos de parmetro . . . . . . . . . Paso de matrices . . . . . . . . . . Devolucin de un valor de tipo carcter . . Devolucin de un valor de tipo decimal con zona . . . . . . . . . . . . . . Devolucin de un valor de tipo empaquetado Devolucin de un valor de tipo binario. . . Devolucin de un valor de tipo entero . . . Devolucin de un valor entero sin signo . . Devolucin de un valor de fecha, hora o indicacin de la hora . . . . . . . . . Devolucin de un valor de tipo flotante . . Devolucin de un valor de tipo carcter de longitud variable . . . . . . . . . . Devolucin de valores de matriz . . . . . . . . . . 283 285 285 306 322

. 323 325 . 327 . 328 . 329 . 331 . 331 . 332 . 333

Captulo 27. Instalacin del cdigo de tiempo de ejecucin y las aplicaciones para Windows NT/95/98 . 407
Instalacin del cdigo de tiempo de ejecucin . Nota acerca del SQL incorporado. . . . . Instalacin de una aplicacin . . . . . . . Mantenimiento del cdigo de tiempo de ejecucin y las aplicaciones . . . . . . . . . . . Instalacin desde la LAN . . . . . . . . Instalacin silenciosa desde la LAN . . . . . . 407 . 407 . 407 . 407 . 408 . 408

Captulo 21. Cmo crear programas no GUI en VisualAge RPG . . . . . . 357


Cmo crear programas VARPG autnomos Cmo crear archivos DLL . . . . . . Excepciones . . . . . . . . . . . Cmo depurar aplicaciones. . . . . . Procedimientos de depuracin. . . . . . . . . . . . . . . . . . . . 357 358 361 361 361

Parte 6. Apndices . . . . . . . . 411


Apndice A. Archivos de aplicacin 413

Captulo 22. Consideraciones sobre DBCS . . . . . . . . . . . . . . . 363


Soporte de VisualAge RPG para tipos DBCS . . . . . . . . . . . Tipo de datos Slo DBCS . . . Tipo de datos DBCS cualquiera . Tipo de datos DBCS mixto . . . Consideraciones sobre DBCS puro de . . . . . datos . . . . . . . . . . . . . . . . . . . . 363 364 365 365 365

Apndice B. Cmo escribir aplicaciones de cliente ligero . . . . 417


Cmo implementar el modelo de aplicacin VARPG ligera . . . . . . . . . . . Aplicacin de ejemplo que utiliza llamadas remotas . . . . . . . . . . . . . El programa cliente . . . . . . . . . . . . 417 . 418 . 419

Contenido

vii

El programa servidor . . . . . . . . . . Aplicaciones de ejemplo que utilizan colas de datos La aplicacin de cliente . . . . . . . . . El programa servidor . . . . . . . . . . Otras implementaciones posibles . . . . . . . Ejemplo de programa servidor reutilizable . . .

421 422 423 427 429 429

Glosario

. . . . . . . . . . . . . 437

Bibliografa . . . . . . . . . . . . 449 Avisos . . . . . . . . . . . . . . 451


Informacin de interfaz de programacin . Marcas registradas y marcas de servicio . . . . . . 452 . 452

Apndice C. Creacin y compilacin de programas no GUI desde MS-DOS . 433


Acceso a un sistema AS/400 . . . . . . . . 434

ndice. . . . . . . . . . . . . . . 453

viii

Programacin con VisualAge RPG

Acerca de este manual


Este manual es una gua para utilizar VisualAge para RPG al objeto de desarrollar aplicaciones cliente/servidor. Describe los pasos que tiene que seguir en cada fase del ciclo de desarrollo de aplicaciones, desde el diseo al empaquetado y la distribucin. Se incluyen ejemplos de programacin para aclarar los conceptos y el proceso.

A quin va dirigido este manual


Este manual est escrito para programadores que utilizan VisualAge RPG para desarrollar aplicaciones cliente/servidor. En l se presupone que est familiarizado con el desarrollo de aplicaciones RPG en sistemas AS/400.

Prerrequisitos e informacin relacionada


Utilice el centro de informacin de AS/400 como punto de partida para consultar o buscar informacin tcnica del AS/400. Puede acceder al Information Center desde el CD-ROM AS/400e Information Center (versin en espaol: SK3T-1330-02 (SK3T-2027-03), o desde una de las pginas Web siguientes:
http://www.as400.ibm.com/infocenter http://publib.boulder.ibm.com/pubs/html/as400/infocenter.htm

El centro de informacin de AS/400 contiene temas importantes como, por ejemplo, particiones lgicas, sistemas en cluster, Java, TCP/IP, servidores Web y redes seguras. Tambin contiene enlaces de Internet a pginas Web como AS/400 Online Library y AS/400 Technical Studio. En el centro de informacin hay un enlace que describe a grandes rasgos las diferencias de informacin entre el centro de informacin y la biblioteca en lnea. Para obtener una versin en soporte software de las publicaciones de AS/400, consulte la publicacin CD-ROM AS/400e Biblioteca en soporte software, SK3T-1325-04 (SK3T-0118-04).

Cmo utilizar este manual


Nota: Antes de utilizar este manual, lea Iniciacin a VisualAge RPG y CODE/400. Le proporcionar una introduccin rpida a VisualAge RPG. Este manual se compone de las siguientes partes: Introduccin a las aplicaciones cliente/servidor Esta parte del manual describe los pasos que deben llevarse a cabo para crear una aplicacin cliente/servidor con VisualAge RPG. Le gua a lo largo del diseo y el desarrollo de una aplicacin de ejemplo y analiza cuestiones relativas al diseo de una aplicacin. Cmo trabajar con componentes Esta parte del manual contiene consejos para crear una interfaz grfica de usuario con componentes de VisualAge RPG y escribir la lgica de programa para controlar esos componentes. No describe cmo utilizar cada cdigo de operacin ni cules son los detalles de cada atributo o evento.

Copyright IBM Corp. 1994, 2000

ix

Para obtener esta informacin, consulte los manuales VisualAge RPG Manual de consulta del lenguaje y VisualAge RPG Manual de consulta de componentes. Cmo trabajar con datos de AS/400 Esta parte del manual trata sobre cmo configurar la aplicacin para poder acceder a datos en un servidor AS/400 y sobre cmo volver a utilizar aplicaciones AS/400 existentes convirtindolas a aplicaciones VisualAge RPG que se ejecutan en una estacin de trabajo programable (PWS). Temas avanzados Esta parte del manual resalta las numerosas caractersticas que puede aadir a la aplicacin VisualAge RPG. Es la seccin a la que debe dirigirse si desea informacin sobre temas tales como imprimir desde la aplicacin, editar la salida, utilizar el depurador, utilizar archivos de imgenes y sonido, crear ayuda en lnea, aadir mensajes y ejecutar la aplicacin en un sistema DBCS. Tambin describe las diversas formas en que las aplicaciones VisualAge RPG pueden compartir datos y comunicarse. Distribucin de la aplicacin Esta parte del manual analiza cmo empaquetar el cdigo de tiempo de ejecucin de VisualAge RPG y la aplicacin. Tambin describe cmo instalar el cdigo de tiempo de ejecucin y la aplicacin en la PWS de un usuario.

La biblioteca VisualAge RPG


*Nota: Se han actualizado todas las versiones en lnea de las publicaciones de WebSphere Development Tools para AS/400. Las publicaciones cuyo ttulo est marcado con un asterisco (*) no se han vuelto a imprimir en este release. La biblioteca VisualAge RPG contiene las publicaciones siguientes: *Iniciacin a VisualAge RPG y CODE/400 Utilice esta publicacin para familiarizarse con los conceptos y la interfaz de VisualAge RPG y como consulta de tareas al utilizar VisualAge RPG. *Programacin con VisualAge para RPG Esta publicacin contiene informacin especfica acerca de la creacin de aplicaciones con VisualAge RPG. Describe los pasos a seguir en cada fase del ciclo de desarrollo de aplicaciones, desde el diseo al empaquetado y la distribucin. Se incluyen ejemplos de programacin para aclarar los conceptos y el proceso del desarrollo de aplicaciones de VisualAge RPG. *VisualAge RPG Manual de consulta de componentes Esta publicacin proporciona informacin sobre los componentes, atributos de componente, eventos de componente y atributos de evento de VisualAge RPG. Es un manual de consulta para todos aquellos que desarrollan aplicaciones con VisualAge RPG. *VisualAge RPG Manual de consulta del lenguaje

Programacin con VisualAge RPG

Esta publicacin proporciona informacin acerca del lenguaje RPG IV tal como se implementa en el compilador VisualAge RPG. Contiene: v Conceptos bsicos del lenguaje como el juego de caracteres, nombres simblicos y palabras reservadas, directivas del compilador e indicadores. v Tipos y formatos de datos v Manejo de errores y de excepciones v Especificaciones v Funciones incorporadas, expresiones y cdigos de operacin. Para obtener una lista de publicaciones relacionadas, consulte la bibliografa al final de esta publicacin. Gua de aprendizaje de VA RPG y CODE/400 Hay disponible una gua de aprendizaje en formato HTML en el URL siguiente:
http://www.ibm.com/software/ad/varpg/download/#interactive

Esta gua de aprendizaje interactiva registra la evolucin del usuario para poder volver fcilmente al ltimo ejercicio realizado. Hay unas pruebas al final de cada leccin que sirven de ayuda para comprobar los conocimientos adquiridos en la unidad. Nota: Para poder utilizar esta gua de aprendizaje, necesitar un navegador que admita marcos, Java y Javascript. Tambin necesitar una herramienta de extraccin de archivos, como WinZip, que pueda tratar nombres largos de archivos. Tambin puede encontrar la informacin ms reciente sobre VA RPG y CODE/400 en la siguiente fuente en lnea: La pgina de presentacin de VisualAge RPG y CODE/400 http://www.ibm.com/software/ad/varpg/

Cmo enviar comentarios


Sus opiniones son importantes para ayudarnos a proporcionar la informacin ms exacta y de la mayor calidad posible. IBM agradece todos los comentarios relativos a esta publicacin o a cualquier otra documentacin del AS/400. v Si prefiere enviar los comentarios por correo, puede utilizar la direccin siguiente: IBM S.A. National Language Solutions Center Avda. Diagonal, 571 08029 Barcelona Espaa Si enva una hoja de comentarios sobre la publicacin desde un pas que no sea Espaa, puede entregarla a la sucursal IBM local o al representante de IBM. v Si prefiere enviar los comentarios por fax, puede utilizar el nmero siguiente: Desde Espaa: 933 216 134 Desde otros pases: 34 933 216 134 v Si prefiere enviar los comentarios por correo electrnico, puede utilizar una de las direcciones siguientes: Comentarios sobre publicaciones: hojacom@vnet.ibm.com IBMLink: to toribm(torrcf)
Acerca de este manual

xi

Comentarios sobre el centro de informacin de AS/400: RCHINFOC@us.ibm.com Asegrese de indicar lo siguiente: v El ttulo del libro v El nmero de la publicacin v El nmero de pgina o el tema al que hace referencia el comentario.

Acceso a la informacin en lnea


VisualAge RPG tiene varios manuales en lnea y ayuda en lnea. Puede acceder a la ayuda mientras utiliza el producto, y puede visualizar los manuales tanto si utiliza el producto como si no.

Utilizacin de manuales en lnea


Para visualizar un manual en lnea,realice una de las acciones siguientes: v Seleccione el nombre del manual desde el men desplegable Ayuda del Diseador GUI de VisualAge RPG o de la ventana del editor. v Puede acceder a las publicaciones desde el men Inicio. Seleccione Programas VisualAge RPG y CODE400. Despus, seleccione Informacin de VARPG y CODE400.

Publicaciones en formato PDF


Todas las publicaciones de VA RPG y CODE/400 se incluyen como parte de la ayuda habitual para el producto. Adems del formato normal, el producto tambin contiene la versin PDF de las publicaciones. Nota: Debe disponer del programa Adobe Acrobat Reader, Versin 3.01 o superior para Windows, para ver el formato PDF de las publicaciones en la estacin de trabajo. Si no dispone de dicho programa, puede descargar una copia de la pgina Web de Adobe Systems (http://www.adobe.com). En la ayuda en lnea estn disponibles las siguientes publicaciones en formato PDF: v Iniciacin a VisualAge RPG y CODE/400 v Programacin con VisualAge para RPG v VisualAge RPG Manual de consulta de componentes v VisualAge RPG Manual de consulta del lenguaje Nota: Se han actualizado todas las versiones en lnea de las publicaciones de WebSphere Development Tools para AS/400.

Utilizacin de ayuda en lnea


Hay ayuda en lnea disponible para todas las reas de VisualAge RPG. Para obtener ayuda para una ventana determinada, un recuadro de dilogo o el cuaderno de propiedades, seleccione el pulsador Ayuda (si est disponible). Nota: Para ver la ayuda que est en formato HTML, la estacin de trabajo debe tener un navegador Web que soporte marcos como, por ejemplo Netscape Navigator 4.04 o superior, o Microsoft Internet Explorer 4.01 o superior. (El navegador recomendado es Netscape Navigator 4.6 o Internet Explorer 5.0)

Utilizacin de ayuda segn el contexto


Para recibir ayuda sensible al contexto en cualquier momento, pulse F1. La ayuda que aparece es especfica del rea de la interfaz que tiene foco de entrada. El foco

xii

Programacin con VisualAge RPG

de entrada puede estar en elementos de men, ventanas, recuadros de dilogo y cuadernos de propiedades, o en componentes especficos de los mismos. Para obtener ayuda segn contexto en los recuadros de dilogo, pulse el botn sobre el signo de interrogacin (si est disponible) en el extremo superior derecho de la ventana. Aparece un signo de interrogacin al lado de la flecha del ratn. Pulse el botn sobre una palabra o un campo y aparecer la informacin de ayuda sobre ese determinado campo.

Utilizacin de hipertexto
Algunas ventanas contienen palabras, frases o grficos que aparecen resaltados. Son enlaces de hipertexto que llevan de un tema a otro. Para visualizar ayuda especfica de un tema resaltado, pulse en l. Cuando siga un enlace de hipertexto, puede aparecer un botn Sincronizar en la esquina superior derecha del tema de ayuda. (Quizs deba retroceder pginas para verlo). Si pulsa el botn Sincronizar, la lista de temas del marco izquierdo se renueva a fin de mostrarle el lugar que ocupa el tema actual en la tabla de contenido general.

Utilizacin de la tabla de contenido de la ayuda


Cuando se visualice la ventana de Ayuda, pulse el botn Sincronizar (cuando est disponible) para visualizar la seccin Componentes en el marco de la izquierda. Pulse los smbolos ms + y menos para expandir y contraer la seccin correspondiente al componente deseado. Para ver un tema, pulse en l.

Utilizacin del recurso de bsqueda


El sistema de ayuda VisualAge RPG y CODE/400 utiliza un motor de bsqueda avanzado de texto completo, que devuelve aciertos o coincidencias HTML basados en la peticin de bsqueda. Para buscar un tema: 1. Escriba una palabra, frase o pregunta (no incluya los interrogantes) en el rea de texto situada junto a las +Opciones de bsqueda. Pulse Intro. 2. Si la palabra o frase no se encuentra, se visualiza informacin acerca del intento de bsqueda. De lo contrario, aparece la pgina Resultado de la bsqueda con una lista de temas en los que se ha encontrado la palabra o frase. Pulse el enlace que desee ver. 3. Puede utilizar las +Opciones de bsqueda para especificar el nmero de documentos que debe devolverse. Si desea obtener consejos para refinar las bsquedas, puede ver el tema Cmo buscar informacin en la ayuda en lnea.

Utilizacin de ayuda segn el lenguaje


Para recibir ayuda segn el lenguaje, pulse F1 en una ventana de edicin. Si el cursor est en un cdigo de operacin, recibir ayuda para ese cdigo de operacin; de lo contrario, recibir ayuda para la especificacin actual.

Acerca de este manual

xiii

xiv

Programacin con VisualAge RPG

Novedades de este Release


Las siguientes funciones nuevas de VisualAge RPG se han aadido en este release de IBM VisualAge RPG y CODE (Cooperative Development Environment) para AS/400: v Los campos de subarchivo soportan la palabra clave VALUE. v Se dispone de un nuevo atributo StartAt en el componente subarchivo. Ahora puede forzarse que la operacin READC empiece en el registro especificado. v El carcter de sustitucin de etiqueta (|) se soporta ahora en las cabeceras de columna de los subarchivos. v Puede establecerse una parada de tabulador en el componente subarchivo. v Se ha aadido la validacin y formato automticos en los campos de entrada. v Los componentes subarchivo, contenedor y recuadro de lista soportan los eventos KeyPress y VKeyPress. v El atributo Tablabel de la pgina de cuaderno ahora tambin es de lectura. v Un nuevo atributo ShowTabs para el componente Cuaderno permite ocultar las pestaas. v Un valor nuevo del dilogo Preferencias del usuario determina si deben mostrarse todas las pestaas en los cuadernos de propiedades. v Se soportan posibilidades adicionales de espaciado de los componentes, en relacin con una rea circundante. v El componente Lienzo ahora soporta el atributo Enabled. v El nuevo atributo de componente *component, Platform, devuelve el entorno en el que se ejecuta la aplicacin (Java o Windows). v La posibilidad de especificar el tamao y la posicin de un componente dentro de una ventana. v La posibilidad de invocar mandatos de usuario en el ltimo paso de construccin. v La ayuda en lnea se visualiza ahora en formato HTML. (Deber tener instalado un navegador en la estacin de trabajo para ver la ayuda). v Se da soporte a Personal Communications (PCOMM) para Windows. v Un nuevo dilogo Seas de identidad del Diseador GUI proporciona informacin sobre el proyecto y VARPG. v Se ha aadido el nuevo componente Bean Java a la paleta de componentes. Ahora pueden utilizarse componentes JavaBean en la aplicacin. v Las opciones de men dan soporte a la ayuda Qu es esto? en las aplicaciones Java. v Los componentes Campo de entrada y Edicin de mltiples lneas proporcionan un nuevo valor que conserva la seleccin de texto aunque la ventana en la que estn pierda el foco. v Se ha aadido un botn Buscar en el dilogo Empaquetar componente. v Para cada proyecto puede especificarse el directorio TEST.

Copyright IBM Corp. 1994, 2000

xv

xvi

Programacin con VisualAge RPG

Parte 1. Introduccin a las aplicaciones cliente/servidor


Captulo 1. Creacin de una aplicacin Cliente/Servidor en la pgina 3 Le gua a lo largo del diseo y la implantacin de una aplicacin cliente/servidor. Captulo 2. Planificacin de la aplicacin en la pgina 19 Le ayuda a planear y disear una interfaz grfica de usuario para la nueva aplicacin cliente/servidor.

Copyright IBM Corp. 1994, 2000

Programacin con VisualAge RPG

Captulo 1. Creacin de una aplicacin Cliente/Servidor


Este captulo describe cmo crear una aplicacin cliente/servidor utilizando VisualAge RPG. Se utiliza una aplicacin de ejemplo para describir las fases siguientes del proceso de desarrollo: 1. Diseo de lo que el usuario ver y har con la aplicacin. 2. Creacin de la interfaz grfica de usuario (GUI). 3. Establecimiento de atributos para los componentes de la GUI. 4. Escritura de la lgica de programa para controlar la GUI. 5. Escritura de los mensajes y la ayuda en lnea para la aplicacin.

Acerca de la aplicacin de ejemplo


La aplicacin de ejemplo, denominada Video Store Catalog, se cre con VisualAge RPG y se encuentra en la carpeta Aplicaciones de ejemplo de VisualAge RPG. Proporciona un catlogo en lnea que los clientes pueden utilizar para comprar vdeos y tiene un componente lgico de visualizacin previa que permite a los clientes ver secuencias del vdeo antes de hacer el pedido. La informacin acerca de los vdeos est almacenada en una base de datos en el sistema AS/400. Los clientes que utilizan el Video Store Catalog (Catlogo de vdeos) estn viendo en realidad los datos almacenados en el sistema AS/400. La informacin que proporcionan los clientes, como su nombre y su nmero de telfono, tambin se almacena en el sistema principal. Nota: El Cajero de vdeo-club, otra aplicacin de ejemplo, accede a la misma base de datos del sistema principal. Utiliza la informacin de los pedidos de los clientes para actualizar el inventario de la tienda y para facturar a los clientes. El Cajero de vdeo-club no se analiza en este captulo. Para obtener informacin acerca de su construccin y ejecucin, vea los comentarios en el archivo CASHIER.VPG en la carpeta del proyecto Cajero de vdeo-club.

Construccin de la aplicacin de ejemplo


La aplicacin Video Store Catalog requiere que los archivos que se definen en la especificacin F se hallen presentes en un sistema AS/400. El subdirectorio adtswin\samples\vidcust tiene el archivo de salvar VIDEOSTORE.sav de la biblioteca con los archivos necesarios. Para subir los archivos necesarios y crear la aplicacin y su componente asociado de visualizacin previa, siga los pasos que se indican a continuacin: 1. Asegrese de que tanto VisualAge RPG como los ejemplos de VisualAge RPG estn instalados. Si desea ms informacin, consulte la publicacin Instalacin de VisualAge RPG y CODE/400 para AS/400. 2. Suba el archivo VIDEOSTORE.sav y resturelo en el sistema AS/400 tal como se indica a continuacin: a. En el sistema AS/400, cree un archivo de salvar denominado VIDEOSTORE en cualquier biblioteca como, por ejemplo, USER. b. En la estacin de trabajo, cambie el directorio actual por el de vidcust y emita el siguiente mandato FTP:
c:\adtswin\samples\vidcust>ftp HOSTNAME

Copyright IBM Corp. 1994, 2000

c: es la unidad en la que ha instalado el producto y HOSTNAME es el nombre del sistema AS/400 en el que ha creado el archivo de salvar. (En lugar del nombre, puede utilizar la direccin TCP/IP del AS/400). c. Entre el ID de usuario del AS/400 cuando as se lo solicite. d. Entre la contrasea cuando as se lo solicite. e. Una vez haya iniciado la sesin, haga que USER sea la biblioteca actual. Entre:
ftp>cd user

f. Especifique una transferencia binaria de archivos. Entre:


ftp>binary

Aparecer el mensaje 200 Representation type is binary IMAGE. g. Transfiera el archivo de salvar. Entre:
ftp>put VIDEOSTORE.sav

El mensaje File transfer completed successfully. indica que se ha subido el archivo VIDEOSTORE.sav. h. Entre: ftp>quit El archivo de salvar VIDEOSTORE debe estar ahora en la biblioteca USER del sistema AS/400. i. Utilice el mandato RSTLIB para restaurar la biblioteca y conservar el mismo nombre, VIDEOSTORE, en el sistema AS/400. De lo contrario, cambie el parmetro REMOTE_FILE_NAME del archivo Catalog.rst por el nombre con el que ha restaurado el archivo de salvar. j. En el archivo Catalog.rst file, cambie el parmetro REMOTE_LOCATION_NAME de modo que apunte al nombre de la ubicacin remota del sistema AS/400. 3. Cree la aplicacin de ejemplo Video Store Catalog. Seleccione Construir>Windows NT/95/98 o Construir>Java en el men emergente de la carpeta del proyecto Video Store Catalog de la carpeta Proyectos de ejemplo de VisualAge RPG. Cuando se construye satisfactoriamente el proyecto, se crea un programa ejecutable, CATALOG.EXE para Windows, o CATLAOG.CLASS para Java, en la carpeta del proyecto Video Store Catalog. 4. Construya el componente Preview asociado. Seleccione Construir>Windows NT/95/98 o Construir>Java en el men emergente de la carpeta del proyecto Preview. Cuando el proyecto se construye satisfactoriamente, se crea una biblioteca de enlace dinmico (COMMON.DLL) para Windows, o bien un archivo COMMON.CLASS para Java. Utilice uno de los mtodos siguientes para ejecutar la aplicacin Catlogo de vdeos: v Seleccione Ejecutar>Windows NT/95/98 o Ejecutar>Java en el men emergente de la carpeta del proyecto Video Store Catalog. v Abra la carpeta de proyecto Catlogo de vdeos y efecte una doble pulsacin en el icono CATALOG.EXE. v Escriba catalog en una lnea de mandatos. Notas: 1. Los aspectos multimedia de esta aplicacin requieren un hardware y un software adicionales. Para ejecutar el audio en la previsualizacin, debe tener una tarjeta de sonido en el sistema. Para ejecutar la secuencia de vdeo en la previsualizacin, debe tener instalado Media Player. Las aplicaciones Java deben tener instalada la API JMF (Java Media Framework). 2. Las secuencias de vdeo son archivos AVI (para Windows) o bien MOV (para Java) que estn almacenados en la carpeta Preview.

Programacin con VisualAge RPG

3. Para construir y ejecutar aplicaciones Java, debe tener instalado el Java 2 Software Development Kit (J2SDK) Versin 1.2, o superior, de Sun, en la estacin de trabajo. Si no tiene el J2SDK, puede bajarlo de Sun Microsystems en el URL siguiente:
http://www.javasoft.com/products/

Tras instalar el J2SDK, establezca la variable de entorno PATH de modo que apunte a la ubicacin tanto del compilador Java como del Java Runtime Environment (JRE). Por ejemplo, si el directorio inicial de J2SDK es c:\jdk1.2, aada la siguiente sentencia en la variable PATH: c:\jdk1.2\bin

Decisin sobre lo que se mostrar al usuario


Un paso clave al crear la aplicacin es el de decidir qu desea que haga el usuario con la aplicacin, y luego determinar lo que le tiene que proporcionar en la aplicacin para que pueda realizarlo. Durante las fases de planificacin de la aplicacin Catlogo de vdeos, se ha decidido que los clientes deberan poder listar los vdeos de un tipo en particular (como Action/Adventure o Comedy). Tambin deben poder listar los vdeos realizados por su director favorito, los protagonizados por su actor preferido, o los que estn entre los 10 ms vendidos en la tienda. Para ayudarles a decidir si desean comprar un vdeo en particular o no, deben poder tener una previsualizacin del mismo. Una vez que han encontrado el vdeo que desean comprar, pueden hacer su pedido y pagar la compra en el mostrador de caja. Ahora que hemos identificado lo que los clientes deben poder hacer con la aplicacin, podemos disear lo que vern cuando visualicen el catlogo de vdeos. ste es el momento de empezar a disear el contenido, el nmero y el orden de las ventanas de la aplicacin.

Bienvenidos al Catlogo de vdeos


La ventana principal, o punto de entrada de la aplicacin, es la ventana Video Catalog Welcome. Define lo que los clientes pueden hacer con el catlogo. Para utilizar el catlogo, los clientes deben accionar un pulsador grfico para seleccionar entre las opciones siguientes:
Browse by Category... New releases... Top 10 Best Sellers... Search for Specific Titles... Help Catalog

Al seleccionar Help Catalog se visualiza la ventana Get Help on using the Catalog. Si acciona uno de los otros pulsadores, se visualiza otra ventana desde la que podr realizar otras acciones, tales como ver listas, previsualizar secuencias del vdeo o generar un pedido de compra.

Examinar por categora


Al seleccionar Browe by Category, se visualiza la ventana Video Catalog Categories. Esta ventana presenta una lista de categoras de vdeos en la que puede elegirse una:

Captulo 1. Creacin de una aplicacin Cliente/Servidor

Action/Adventure Children Science Fiction Comedy

Horror Western Romance Classics

Para seleccionar una categora, el cliente acciona su pulsador asociado. Esto hace que se visualice la ventana Video Titles, que lista los ttulos de esa categora. Los clientes pueden visualizar previamente algunos de los ttulos, aadir un ttulo a su pedido, suprimirlo del pedido si han cambiado de opinin, y someter su pedido al cajero.

Bsqueda de ttulos concretos


La ventana Video Catalog Search permite a los clientes buscar un vdeo segn su categora, ttulo, director o actor. Tras especificar los criterios de bsqueda y accionar el pulsador Search para iniciar una bsqueda en la base de datos de AS/400, el resultado se visualiza en la ventana Video Titles.

Previsualizacin de ttulos
Los clientes pueden tener informacin previa de un vdeo que est en la lista leyendo un resumen del mismo o, si tienen el hardware y el software apropiados, pueden ver una secuencia del vdeo con el audio asociado.

Modificacin y generacin de pedidos


La ventana Video Catalog Review/Order My Selections permite a los clientes modificar sus pedidos. Pueden suprimir vdeos de la lista, cambiar el nmero de copias que desean comprar y cambiar el tipo de soporte en el que desean que est (cinta o disco lser). Esta ventana se visualiza cuando los clientes seleccionan un vdeo de una lista en una ventana Video Titles y accionan el pulsador Review/submit order. Una vez entrada toda la informacin para su pedido, los clientes pueden someter su pedido desde esta ventana.

Generacin de pedidos
Cuando los clientes generan sus pedidos, deben proporcionar su nombre, direccin y nmero telefnico en la ventana Video Catalog Order Reference. Esta informacin se almacena en una base de datos en el AS/400.

Diseo de ventanas de alto nivel


Analizar cmo crear cada una de las ventanas del Catlogo de vdeos est fuera del mbito de este captulo. Las secciones siguientes describen cmo podra utilizar el Diseador GUI para crear dos ventanas que se parezcan a las ventanas Comedy y Preview, modificar algunos de sus atributos de componente y escribir una parte de la lgica de programa asociada. Encontrar estas ventanas a lo largo de la aplicacin Catlogo de vdeos:
Video Catalog Welcome Al accionar el pulsador Browse by Category en la ventana Video Catalog Welcome se visualiza la ventana Video Catalog Categories.

Programacin con VisualAge RPG

Video Catalog Categories

Al accionar el pulsador Comedy en la ventana Video Catalog Categories se visualiza la ventana Video Catalog Comedy.

Video Catalog Comedy

Al pulsar el botn Preview despus de seleccionar un ttulo en la ventana Video Catalog Comedy se visualiza una ventana Preview.

Video Catalog Preview

La previsualizacin se ejecuta en esta ventana.

Si desea ver el diseo de la aplicacin de ejemplo, seleccione Editar en el men emergente de la carpeta del proyecto Video Store Catalog en la carpeta Proyectos de ejemplo de VisualAge RPG. Esta accin visualiza la ventana de proyecto de la aplicacin y la paleta de componentes. La ventana de proyecto muestra todas las ventanas definidas en la aplicacin. Efecte una doble pulsacin en cualquier entrada para ver su ventana de diseo con los componentes asociados. Para ver el cdigo fuente VARPG del proyecto, seleccione Proyecto>Editar cdigo fuente en la ventana del proyecto.

Creacin de la ventana Comedy

Figura 1. La ventana Comedy

La ventana Comedy visualiza la lista de vdeos de comedias que los clientes pueden adquirir. Esta seccin describe cmo puede crear una ventana que se parezca a sta.

Creacin de la GUI
Seleccione una ventana con componente lienzo desde la paleta de componentes con el botn derecho del ratn, mueva el icono del puntero sobre la vista de proyecto del Diseador GUI, y vuelva a pulsar el botn derecho del ratn. Se convierte en la ventana de diseo, en la que situar los siguientes componentes de la paleta: recuadro de grupo, pulsador, texto esttico y subarchivo.
Captulo 1. Creacin de una aplicacin Cliente/Servidor

Alineacin de los componentes


Puede utilizar las herramientas de alineacin del Diseador GUI para definir el tamao, la alineacin y los espacios de los componentes de forma que se parezcan a los que se muestran en la Figura 1 en la pgina 7. Si desea obtener informacin sobre la utilizacin de estas herramientas, puede consultar la ayuda en lnea o el tutorial HTML.

Cmo establecer los atributos


Despus de colocar y posicionar un componente en la ventana, puede modificar los valores por omisin para los atributos del componente mediante los cuadernos de propiedades. Para hacerlo, pulse con el botn derecho del ratn en el componente y seleccione Propiedades en el men emergente del componente. Algunos atributos de componente que puede modificar se describen ms adelante.

Atributos de ventana
Puede seleccionar los elementos que desea que aparezcan en la ventana (tales como el men del sistema, la barra de ttulo y los botones de minimizar y maximizar) y configurar el borde de la ventana. Por omisin, la ventana utiliza el font del sistema y tiene un fondo blanco. Puede cambiar el font y el color.

Atributos de lienzo
Por omisin, el componente lienzo utiliza el font del sistema, y el fondo es el mismo que el de la carpeta. Puede cambiar el font y el color de fondo del componente lienzo. Tambin puede colocar un grfico en el componente lienzo.

Atributos de subarchivo
Por omisin, el componente subarchivo se crea sin columnas. Si conoce los nombres de campo de base de datos, puede crear campos de entrada de subarchivo mediante el Diseador GUI. De lo contrario, puede hacer referencia a los campos existentes en la base de datos de AS/400 siguiendo estos pasos: 1. Seleccione Definir campos de referencia del men Servidor. Aparece la ventana Definir campos de referencia. 2. Especifique la informacin de AS/400 y biblioteca para ver la informacin de campos de base de datos. 3. Seleccione los campos adecuados del recuadro de lista Campos con el botn derecho del ratn, mueva el icono del puntero sobre el componente subarchivo de la ventana de diseo, y vuelva a pulsar el botn derecho del ratn. El nuevo campo de entrada de subarchivo hereda los atributos del campo original: Length se establece en la anchura de columna y Type en el tipo de datos. Establezca el estilo y el tipo de datos para un campo de entrada de subarchivo mediante el cuaderno de propiedades adecuado. Por ejemplo, puede establecer la longitud o el tipo de datos.

Atributos de pulsador
Etiquete cada uno de los pulsadores para indicar al usuario la finalidad del pulsador. Para crear un carcter nemotcnico para cada pulsador, coloque el identificador del nemotcnico antes de dicho carcter en la etiqueta. En Windows NT, utilice el smbolo &. Observe que se han puesto unos puntos suspensivos ( ... ) en la etiqueta del pulsador Review/submit order con el fin de que los usuarios sepan que deben proporcionar ms informacin despus de pulsar el botn para generar el pedido.

Programacin con VisualAge RPG

Para cada pulsador, especifique qu accin se producir cuando un usuario lo accione. Por ejemplo, para el pulsador Preview se realizar una subrutina de accin; para el pulsador Help, se visualizar ayuda para la ventana. Puede establecer esta informacin en el separador Accin del cuaderno de propiedades del pulsador. (Consulte Creacin de la ayuda en lnea en la pgina 15 para obtener informacin relacionada.)

Adicin de lgica de programa


Se requiere lgica de programa para dirigir ciertas funciones GUI. Esta seccin describe una parte de la lgica de programa de Catlogo de vdeos. (El archivo fuente, VisualAge RPG, est en la carpeta Catlogo de vdeos.) Nota: Puede escribir la lgica de programa para un evento en particular invocando una sesin de edicin del Diseador GUI. Por ejemplo, para aadir lgica de programa al evento Press para un pulsador en particular, seleccione EventosPress del men emergente del pulsador.

Visualizacin de la ventana Comedy


Para hacer que la ventana Comedy aparezca cuando el usuario acciona el pulsador Comedy en la ventana Video Titles Categories, puede hacer lo siguiente: 1. Escribir una subrutina de accin para manejar el evento Press para el pulsador Comedy. Se ha escrito la subrutina de accin COMEDYGPB (que se muestra en la Figura 2) para manejar este evento. Cuando el usuario acciona el pulsador, la subrutina COMEDYGPB llama a la subrutina de usuario brComedy. Esta subrutina lee la base de datos de AS/400 y llama a otra subrutina de usuario, dspbrowse, para comprobar si la base de datos est vaca. Si est vaca, se visualiza un mensaje. Si no est vaca, el control vuelve a la subrutina de usuario brComedy, el ttulo de la ventana cambia y se visualiza el resultado de la bsqueda de la base de datos.
********************************************************************* ** ** ** Subrutinas de enlace de accin de la ventana de categoras ** ** ** ** ** ********************************************************************* * * Esta rutina se ejecuta cuando se acciona el pulsador del grfico Comedy de * la ventana de categoras. * C COMEDYGPB BEGACT PRESS CATW C z-add 0 srchdir C z-add 0 srchact C exsr brComedy C ENDACT

Figura 2. Manejo del evento PRESS

2. Escriba la lgica de programa para leer los ttulos de vdeos de comedia de la base de datos de AS/400 y rellene el componente subarchivo con la lista de ttulos. Llame a la subrutina dspbrowse para comprobar si la base de datos est vaca o no. Si la base de datos no est vaca, establezca el ttulo de la ventana de examinar para que visualice los ttulos de comedias encontrados. De lo contrario, visualice el nmero de mensaje MSG0001 para informar al usuario de que no se ha encontrado ninguna coincidencia en la base de datos. Consulte Figura 3 en la pgina 10.
Captulo 1. Creacin de una aplicacin Cliente/Servidor

********************************************************************* * * * Subrutina de usuario: brComedy * * Descripcin : Mostrar ventana Browse con vdeo Comedy * * * ********************************************************************* C C C C C C C C C C C C C C . . . ********************************************************************* * * * Subrutina de usuario: dspbrowse * * Descripcin : Comprobar si el subarchivo de examinar est * * vaco. Si es as, mostrar mensaje MSG00001. * * * ********************************************************************* C C C C C C C C C dspbrowse items *MSG0001 BEGSR eval ifeq dsply else eval eval endif ENDSR items=%getatr('BROWSEW':'BROWSESF':'Count') 0 msgrsp 9 0 %setatr('BROWSEW': 'BROWSEW': 'VISIBLE')=1 %setatr('BROWSEW': 'BROWSEW': 'FOCUS')=1 BEGSR clear browsesf Obtener registros de vil0004, el archivo lgico en el AS/400 para vdeos de tipo Comedy. *start setll vil0004 read vil0004 61 *IN61 doweq '0' exsr ckcriteria read vil0004 61 end exsr dspbrowse Las siguientes tres lneas definen el texto de la barra de ttulo de la ventana Browse. movel *blanks vdocatstl movel stlcmdy vdocatstl eval %setatr('browsew':'browsew':'Label') = vdocatttl ENDSR brComedy

* *

* *

Figura 3. Lectura de la base de datos AS/400 y visualizacin de la ventana Resultados

Visualizacin de la ventana Preview


Se ha escrito una subrutina de accin (consulte Figura 4 en la pgina 11) see para manejar el evento PRESS para el pulsador Preview en la ventana Comedy. Cuando el usuario acciona el pulsador, se llama a la subrutina de accin PREVIEWPB para iniciar el componente lgico comn que visualiza la ventana Preview.

10

Programacin con VisualAge RPG

********************************************************************* * Cuando se selecciona el pulsador Preview de la ventana Browse, se inicia * el componente comn. Este componente muestra la ventana Preview * de un vdeo. * * C PREVIEWPB BEGACT PRESS BROWSEW C READS BROWSESF 55 C *IN55 ifeq '0' C start 'common' C parm brsfpart C endif C ENDACT

Figura 4. Subrutina de accin para visualizar la ventana Preview

Creacin de la ventana Preview

Figura 5. La ventana Preview

La ventana Preview utiliza las posibilidades multimedia del sistema operativo para proporcionar a los clientes una visualizacin breve de una secuencia del vdeo. Esta seccin describe cmo puede crear una ventana que se parezca a sta. Nota: Para ejecutar el audio en la previsualizacin, debe tener una tarjeta de sonido en el sistema. Para ejecutar la secuencia de vdeo, debe tener instalado Media Player. Las aplicaciones Java deben tener instalada la API JMF (Java Media Framework).

Creacin de la GUI
Seale y pulse los siguientes componentes a un componente ventana con lienzo para crear una ventana que se parezca a la ventana Preview: v Componente medios v Componente edicin de mltiples lneas v Componentes pulsador v Componentes texto esttico
Captulo 1. Creacin de una aplicacin Cliente/Servidor

11

Establecimiento de atributos en el momento del diseo


Despus de colocar y situar los componentes en la ventana, puede establecer los atributos de componente mediante los cuadernos de propiedades respectivos. Algunos de los atributos que pueden establecerse estn descritos ms adelante.

Atributos del componente medios


Los componentes pulsador se utilizan para controlar la reproduccin de la secuencia de vdeo: Play (Reproducir), Pause (Pausa), Record (Grabar) y Stop (Detener). El atributo AudioMode establece la modalidad de operacin del componente medios.

Atributos de texto esttico


Puede cambiar el atributo de font de un componente texto esttico para que destaque del resto de texto en la pantalla. Cambie el tamao del componente texto esttico de manera que sea lo bastante grande para contener el texto ms largo. (Es aconsejable dejar un poco de espacio adicional por si se traduce la aplicacin en el futuro).

Componente edicin de mltiples lneas


En el cdigo establecemos el componente edicin de mltiples lneas (MLE) denominado ABSTMLE para aceptar texto. En el cuaderno de propiedades del componente, se ha indicado que el componente es de slo lectura.

Establecimiento de atributos en tiempo de ejecucin


Para cambiar el ttulo de la ventana visualizada en tiempo de ejecucin, hemos utilizado el cdigo de operacin SETATR para establecer el atributo Label (vea la Figura 6 en la pgina 13).

Adicin de lgica de programa


Tiene que proporcionar una parte de la lgica de programa para controlar ciertas funciones GUI en la ventana Preview. Esta seccin describe parte de la lgica de programa (vea la Figura 6 en la pgina 13) para el componente lgico Preview.

Especificacin de vdeo para su previsualizacin


El vdeo seleccionado en la ventana Comedy determina qu previsualizacin de vdeo se reproduce. La subrutina de accin previeww lee qu vdeo va a utilizarse y luego determina el nombre del archivo de vdeo propiamente dicho.

Control del vdeo


Puede escribir cdigo para controlar el vdeo utilizando el componente medios. En nuestro ejemplo, el componente medios se utiliza para reproducir un archivo de vdeo digital asociado al vdeo seleccionado. Los pulsadores con el atributo AudioMode asociado controlan la reproduccin del archivo de vdeo: 1 2 3 4 Pausa Reproducir Grabar Parar

A continuacin encontrar el cdigo para el componente Preview:

12

Programacin con VisualAge RPG

********************************************************************* * Fvideo if e k disk remote BLOCK(*YES) * DFlg s 1 inz(*OFF) DFldx s 12 * ********************************************************************* * C *entry PLIST C parm partno 5 0 * ********************************************************************* * Subrutinas de enlace de accin para PREVIEWW * ********************************************************************* * C PREVIEWW BEGACT CREATE PREVIEWW C partno setll video 50 C N50*msg0001 DSPLY msgrsp 9 0 C read video 51 C *IN51 IFEQ '0' C 'TITLEST' SETATR vititle 'label' C 'DIRST' SETATR vidirect 'label' * C viactr1 CAT viactr2:1 actors 41 C 'ACTST' SETATR actors 'label' * C 'ABSTMLE' SETATR vireview 'text' * * Si es para Java, utilizar el archivo .mov /If defined(COMPILE_JAVA) * C vibitmap CAT '.mov':0 videofil 13 * Si no es para Java, utilizar el archivo .avi /else C vibitmap CAT '.avi':0 videofil 13 /EndIf C endif *significa que videofil no se ha cargado todava en Audio C move 'N' loaded * C ENDACT * *

Figura 6. El componente Preview (Pieza 1 de 2)

Captulo 1. Creacin de una aplicacin Cliente/Servidor

13

********************************************************************* * C PBPLAY BEGACT PRESS PREVIEWW * C if loaded='N' C eval %setatr('previeww':'audo':'FileName') C =videofil C move 'Y' loaded 1 C endif * C eval %setatr('previeww':'audo':'audioMode')=2 * C ENDACT * * ********************************************************************* * C PBPAUSE BEGACT PRESS PREVIEWW * C eval %setatr('previeww':'audo':'audioMode')=1 C ENDACT * * ********************************************************************* * C PBRECORD BEGACT PRESS PREVIEWW * C eval %setatr('previeww':'audo':'audioMode')=3 C ENDACT * * ********************************************************************* * C PBSTOP BEGACT PRESS PREVIEWW * C eval %setatr('previeww':'audo':'audioMode')=4 C ENDACT * * ********************************************************************* * C CANCELPB BEGACT PRESS PREVIEWW * C move *on Flg C STOP C ENDACT * * ********************************************************************* * C PREVIEWW BEGACT CLOSE PREVIEWW * C if Flg=*ON C eval Fldx='*DEFAULT' C else C eval Fldx='*NODEFAULT' C endif C ENDACT Fldx *

Figura 6. El componente Preview (Pieza 2 de 2)

14

Programacin con VisualAge RPG

Creacin de mensajes
Para aadir mensajes, seleccione ProyectoDefinir mensajes en el Diseador GUI. Aparecer la ventana Definir mensajes. Seleccione Create, y luego seleccione el tipo de mensaje que desea crear (por ejemplo, informacin o aviso). Escriba el texto del mensaje y cualquier informacin adicional o ayuda de segundo nivel en los espacios que se proporcionan. VisualAge RPG genera automticamente un ID de mensaje para el mensaje que crea. Haga referencia a ese ID de mensaje en el cdigo. Por ejemplo, en la Figura 3 en la pgina 10, el cdigo de operacin DSPLY utiliza MSG0001.

Creacin de la ayuda en lnea


Hemos aadido distintos tipos de ayuda a la aplicacin Catlogo de vdeos. Las siguientes secciones describen cmo puede reproducirse parte de esta ayuda.

Ayuda segn contexto


Aada ayuda segn el contexto al componente pulsador grfico Bsqueda por categora seleccionando Help text del men emergente del componente. Esto inicia una sesin de edicin que ya contiene informacin similar a la que se muestra en la Figura 7.
:h1 res=01.PSB0000C :p.Ayuda

Figura 7. Sesin de edicin para aadir ayuda en lnea

:h1 res=01. es un cdigo de cabecera que contiene un identificador de recurso. El identificador de recurso se genera automticamente no edite este texto. La cabecera aparece justo despus de este cdigo; se utiliza en el panel de ayuda y se lista en el ndice de ayuda en tiempo de ejecucin. Por omisin, el nombre del componente para el que se aade texto se utiliza como cabecera. Debe sustituirlo por una cabecera que identifique el propsito del panel de ayuda y que sea ms significativa para los usuarios. Escriba el texto de ayuda despus del cdigo :p. Por omisin aparece la palabra Ayuda en la sesin de edicin. En la Figura 8 se muestra un ejemplo de texto de ayuda de la aplicacin Catlogo de vdeos. El panel de ayuda que se genera a partir de ese cdigo fuente y se visualiza en tiempo de ejecucin se muestra en la Figura 9 en la pgina 16.
:h1 res=12.Browse by Category :p.Seleccione esto para buscar vdeos por categoras.

Figura 8. Ayuda para el pulsador grfico Bsqueda por categora

Captulo 1. Creacin de una aplicacin Cliente/Servidor

15

Figura 9. Ejemplo de panel de ayuda en lnea segn el contexto

Creacin de pulsadores de ayuda


Para crear el pulsador grfico de ayuda en la parte inferior de la ventana Preview o de la ventana Comedy, seleccione un pulsador grfico desde la paleta de componentes con el botn derecho del ratn, mueva el puntero sobre la ventana de diseo y vuelva a pulsar con el botn derecho. En el cuaderno de propiedades, especifique la imagen que va a visualizarse en el pulsador grfico y que desea visualizar ayuda cuando se produzca el evento Press. La Figura 10 muestra el fuente para el pulsador que proporciona ayuda para la ventana Welcome. El cdigo :link se utiliza para enlazar fragmentos de informacin de ayuda relacionados de manera que los usuarios puedan encontrar la informacin adecuada de manera rpida y fcil. Coloque este cdigo al principio y al final del texto relacionado con el texto de ayuda de otro panel. El texto que est entre :link. y :elink. se resalta en la aplicacin en tiempo de ejecucin (vea la Figura 11 en la pgina 17). Al seleccionar el texto resaltado, el usuario salta al panel de ayuda destino relacionado. El id del recurso (resid) del panel destino es un parmetro del cdigo de enlace.
:h1 res=22.Get Help on using the Catalog :p.Select one of the graphic push buttons. :p. :link reftype=hd res=12.Browse by Category:elink. Press this button to browse by categories. :p. :link reftype=hd res=19.New Releases:elink. Press this button to view the new video releases. :p. :link reftype=hd res=20.Top 10 Bestsellers:elink. Press this button to view the 10 best ranked. :p. :link reftype=hd res=21.Search for Specific Titles:elink. Press this button to search for specific titles.

Figura 10. Ayuda para la ventana Welcome

16

Programacin con VisualAge RPG

Figura 11. Ejemplo de ayuda para una ventana que contiene un enlace de hipertexto

Si desea obtener ms informacin acerca de la creacin de ayuda en lnea para la aplicacin, puede consultar los siguientes temas: v Captulo 13. Consejos para crear ayuda en lnea con IPF en la pgina 235 v Captulo 14. Consejos para la creacin y utilizacin de ayuda Windows en la pgina 239 v Captulo 15. Consejos para la creacin de JavaHelp en la pgina 243

Repaso de la programacin visual


Los pasos descritos en las secciones anteriores son similares a los que se realizarn al crear una aplicacin propia mediante VisualAge RPG. Estos pasos son: 1. Decisin sobre lo que se mostrar al usuario Antes de empezar a crear una aplicacin nueva, debe decidir cul es la finalidad de la aplicacin, cmo se presentar al usuario y cmo se comunicar con otras aplicaciones. 2. Creacin de la GUI utilizando el Diseador GUI Despus de haber diseado la aplicacin, puede utilizar el Diseador GUI para crear la interfaz grfica de usuario. VisualAge RPG proporciona un catlogo de componentes de GUI entre los que elegir, y le proporciona la capacidad de crear componentes definidos por el usuario para ajustarse a sus necesidades. Puede seleccionar los componentes que desea que ver en la interfaz y seleccionar sus posiciones en una ventana de diseo. Personalice los componentes como sea necesario. Consulte el manual Iniciacin a VisualAge RPG y CODE/400 y la ayuda en lnea para obtener informacin acerca de cmo crear ventanas, aadir componentes a la ventana, alinearlas y personalizarlas. 3. Obtencin y establecimiento de atributos Puede establecer algunos atributos de componente durante el diseo mediante el cuaderno de propiedades del componente. Tambin puede utilizar los cdigos de operacin GETATR y SETATR, o las funciones incorporadas %getatr y %setatr, para cambiar o recuperar los atributos para algunos componentes en tiempo de ejecucin. Al obtener o establecer atributos de componente, puede hacer referencia a un componente utilizando el nombre definido a este efecto en el Diseador GUI. Para obtener ms informacin acerca de los componentes y de cmo puede obtenerlos y establecerlos, consulte el manual VisualAge RPG Manual de consulta de componentes. 4. Escritura de la lgica de programa
Captulo 1. Creacin de una aplicacin Cliente/Servidor

17

Cada componente responde a un conjunto de eventos predefinidos. Habitualmente, los eventos se generan como resultado de una interaccin del usuario con la GUI. Por ejemplo, seleccionar un pulsador seala un evento Press. El programa tambin puede generar eventos. Por ejemplo, el componente cliente DDE genera un evento Timeout si no puede iniciar una conversacin con un programa servidor dentro de un perodo de tiempo predeterminado. Responda a eventos en el programa codificando los cdigos de operacin BEGACT (iniciar accin) y ENDACT (finalizar accin). El cdigo entre estos cdigos de operacin, denominado subrutina de accin, se ejecuta para un evento en particular. Si no codifica una subrutina de accin, no se emprende ninguna accin cuando se produce el evento. 5. Adicin de mensajes y ayuda en lnea Adems de crear la GUI y escribir parte de la lgica de programa para que se ejecute, puede aadir mensajes y ayuda en lnea a la aplicacin.

18

Programacin con VisualAge RPG

Captulo 2. Planificacin de la aplicacin


En esta seccin se analiza el trabajo que debe realizar antes de empezar a codificar una nueva aplicacin o convertir una aplicacin OS/400* existente en una aplicacin VisualAge RPG. Si est creando una aplicacin nueva, ste es el momento en que tiene que decidir sobre el propsito de su aplicacin, cmo se presentar al usuario y cmo se comunicar con otras aplicaciones. Si piensa reutilizar una aplicacin OS/400 existente, ste es el momento de evaluar las antiguas pantallas de caracteres y decidir cmo mejorarlas mediante la potencia de los componentes de interfaz grfica de usuario. (Para obtener ms informacin acerca de reutilizar las aplicaciones existentes, vea Parte 3. Cmo trabajar con datos AS/400 en la pgina 187.) La informacin de esta seccin le ayudar a disear una aplicacin que satisfaga las necesidades del usuario y sea prctica para implantar.

Habilitacin de aplicaciones seguras de Java


Si tiene intencin de desplegar aplicaciones Java para su uso en la World Wide Web, tenga en cuenta que nicamente los sistemas AS/400 que se ejecuten en OS/400, Versin 4 Release 4, o posterior, dan soporte a la especificacin Capa de Sockets Segura (SSL). El flujo de datos entre las aplicaciones de estacin de trabajo y los servidores AS/400 que ejecutan versiones anteriores de OS/400 no ser seguro. Si desea obtener informacin sobre la configuracin del soporte de SSL para VisualAge RPG, puede consultar el manual Instalacin de VisualAge RPG y CODE/400 para AS/400. Si las aplicaciones VARPG van a ejecutar applets que utilicen el archivo de seguridad cliente, consulte la publicacin Utilizacin del archivo de seguridad para los applets en la pgina 198.

Decidir qu funciones se van a proporcionar


En primer lugar, determine cul es el propsito principal de la aplicacin y qu funciones debe proporcionar para llevarlo a cabo. Despus de determinar las funciones esenciales, aborde las funciones avanzadas, tales como el intercambio dinmico de datos (DDE) y la impresin.

Ayuda a los usuarios


Los usuarios tendrn grados diversos de experiencia con las GUI. Piense en proporcionar ayuda en lnea adecuada para el nivel de conocimientos de un usuario tpico. VisualAge RPG le facilita aadir ayuda en lnea a la GUI. Se pueden aadir cuatro tipos de ayuda: Ayuda segn contexto Informacin de ayuda que se adapta al contexto actual de una opcin, un objeto o un grupo de opciones u objetos.

Copyright IBM Corp. 1994, 2000

19

Ayuda para tareas Informacin acerca de tareas que el usuario puede realizar con la aplicacin. Ayuda para herramientas Globos de ayuda acerca de las herramientas disponibles para el usuario. Ayuda a nivel de ventana Informacin acerca del contenido de una ventana. Tambin se puede ayudar a los usuarios proporcionndoles toda la informacin que necesitan para completar una tarea y suministrar solicitudes y etiquetas con significado en los componentes de GUI. Puede utilizar puntos suspensivos (...) para indicar que se necesita ms informacin antes de poder realizar una accin determinada. (Por ejemplo, utilice Visualizar... para que los usuarios sepan que se les solicitar ms informacin antes de que se lleve a cabo la accin de visualizar). No utilice puntos suspensivos en una etiqueta si la accin se realizar inmediatamente despus de pulsar el botn. Por ejemplo, el botn Ayuda no necesita puntos suspensivos en la etiqueta, porque la informacin de ayuda se visualiza en cuanto se pulsa el botn. Tambin puede proporcionar ayuda en forma de un campo de texto esttico que se actualiza cuando el puntero del ratn se mueve sobre diferentes componentes de la interfaz. Puede minimizar la cantidad de informacin que los usuarios tienen que proporcionar estableciendo valores por omisin. Por ejemplo, puede utilizar un recuadro de combinacin para dar a los usuarios la opcin de seleccionar elementos en una lista de opciones utilizadas habitualmente. Esto evita errores de tecleo durante la ejecucin.

Mantener un diseo de ventana sencillo


Hay dos aspectos bsicos en un buen diseo de ventana: v El nmero y la estructura de las ventanas en la aplicacin v El contenido de cada ventana

Nmero de ventanas
Es aconsejable tener una ventana principal desde la que el usuario pueda iniciar todas las tareas principales. Proporcione ventanas secundarias para obtener informacin adicional que los usuarios deben especificar para completar una tarea. Evite que haya muchas ventanas anidadas, porque demasiadas capas hacen que una tarea sencilla parezca compleja. Recuerde tambin que demasiadas ventanas llenarn toda la pantalla del usuario, especialmente si ste est ejecutando ms de una aplicacin. Los usuarios tambin pueden desorientarse si tienen muchas ventanas en la pantalla. Intente minimizar el nmero de componentes de cada ventana. Esto aumentar el rendimiento cuando se visualicen ventanas. Una aplicacin con muchas ventanas y pocos componentes por ventana funcionar mejor que la misma aplicacin con pocas ventanas y muchos componentes por ventana.

Contenido de cada ventana


Agrupe toda la informacin relacionada en un solo lugar. Utilice el componente recuadro de grupo y el componente recuadro de contorno para indicar visualmente qu botones de seleccin estn relacionados.

20

Programacin con VisualAge RPG

Utilice imgenes grficas e iconos para identificar tareas o para complementar las palabras de la ventana. Asegrese de que todo el texto est escrito correctamente. Site los componentes en las ventanas de una manera ordenada y lgica. No es preciso que planifique la posicin de algunos componentes, porque su posicin est predeterminada. Por ejemplo, un componente barra de mens siempre se ubica justo debajo de la barra de ttulo de una ventana. Si las ventanas tienen componentes comunes, debe visualizar esos componentes en una ubicacin coherente. Esto facilita a los usuarios encontrar informacin comn.

Planificar el cdigo con eficacia


Despus de disear la GUI, debe decidir qu cdigo se necesita para soportar las acciones que realizarn los usuarios de la aplicacin. VisualAge RPG le ayuda a crear la GUI sin escribir mucho cdigo; realiza las tareas rutinarias en su lugar. Todos los componentes tienen atributos por omisin, que pueden modificarse mediante el Diseador GUI o en el programa. Tiene que establecer explcitamente otros atributos. Por ejemplo, si desea que los usuarios puedan ver grficos accionando un pulsador con la etiqueta Visualizar..., debe hacer algo ms que sealar y pulsar el componente pulsador de la paleta en la ventana de diseo: por lo menos debe establecer el atributo de etiqueta para que ponga Visualizar... y escribir la lgica para buscar y visualizar los datos.

Mantener informados a los usuarios


Utilice mensajes para proporcionar informacin particularmente importante o urgente al usuario. D mensajes detallados, pero no excesivamente complicados, que describan el problema y, si es posible, que expliquen cmo corregirlo. VisualAge RPG proporciona tres maneras de visualizar mensajes y debe elegirse el mtodo ms apropiado para el tipo de informacin que se desee visualizar: Ventana Para proporcionar informacin urgente que el usuario debe conocer; por ejemplo, un proceso que no se ha completado de manera satisfactoria. Subarchivo de mensajes Para proporcionar informacin acerca de una opcin, o para contener un mensaje acerca de la realizacin de una accin o un proceso. Ayuda de mensaje de segundo nivel Para proporcionar un nivel extra de detalle que puede no ser necesario en todas las ocasiones para todos los usuarios; por ejemplo, describir un curso de accin que los usuarios novatos tal vez no conozcan. Puede que desee aadir un indicador de progreso para los procesos ms largos, con el fin de mantener informado al usuario. Planifique proporcionar indicaciones de texto, visuales o auditivas a los usuarios para presentar excepciones. Por ejemplo, puede mostrar a un usuario que un pulsador no est disponible atenuando el texto en el botn. No se pueden planificar todas las posibles acciones de los usuarios, por lo que debe planificar tambin cmo informar la aplicacin a los usuarios de que hay acciones que no puede interpretar. Por ejemplo, puede visualizar un mensaje en una ventana si un usuario intenta salir de un archivo sin guardar los cambios efectuados durante una sesin de edicin.

Captulo 2. Planificacin de la aplicacin

21

Utilizar un estilo coherente


Utilice trminos coherentes para minimizar las confusiones. Por ejemplo, si utiliza Inicio de sesin en una ventana, no utilice ID de usuario para referirse al mismo concepto en otro lugar. Utilice nemotcnicos coherentes en todas las ventanas de la aplicacin. Un nemotcnico es una tecla de letra que puede pulsarse para seleccionar una eleccin o realizar una accin. La tecla de letra corresponde a la letra subrayada de una opcin en un pulsador o en un men. Por ejemplo, si utiliza Guardar para representar la funcin de guardar en un pulsador de una ventana, utilcelo en todas las ventanas que tengan ese pulsador.

Anticipar cuestiones de traduccin


Aunque sus planes actuales no incluyan la traduccin de la aplicacin a otro idioma, debe disear y crear la aplicacin de tal manera que pueda traducirse con facilidad en el futuro. Si lo hace, tendr menos trabajo de reacondicionamiento cuando surja la necesidad de traducirla. No olvide mantener el cdigo ejecutable separado del texto. De esta manera puede utilizar el texto en el idioma adecuado sin el cdigo ejecutable estndar. Nota: Hay otras razones por las que debe pensar en separar el texto del cdigo. Puede corregir errores en el texto y efectuar cambios en la terminologa con mayor facilidad en releases futuros. Puede crear archivos de mensajes separados para cada idioma y asignar distintas extensiones de archivo a cada uno de ellos. Cada uno de los archivos de mensajes deben tener nmeros de mensaje idnticos, pero el texto estar escrito en un idioma distinto. Puede construir un archivo EXE para todos los idiomas utilizando el archivo de mensajes adecuado. Por ejemplo, la versin inglesa del archivo de mensajes compilado podra denominarse SAMPLEENG; y la versin alemana, SAMPLEGER. Puede indicar a los usuarios que redenominen el archivo de mensajes correspondiente a SAMPLEMSG antes de ejecutar la aplicacin. Para obtener ms informacin, vea el Captulo 16. Trabajar con mensajes en la pgina 247. Tenga tambin en cuenta que la traduccin puede cambiar los requisitos de tamao del texto (como las etiquetas), los campos de entrada, el almacenamiento intermedio y las ventanas. Al definir el tamao de un componente en el Diseador GUI que tendr una etiqueta de sustitucin, tenga en cuenta que el texto traducido puede ser ms largo que el original. Si utiliza nemotcnicos, recuerde que el carcter nemotcnico puede ser diferente para distintos idiomas.

22

Programacin con VisualAge RPG

Parte 2. Cmo trabajar con componentes


Captulo 3. Programacin con componentes en la pgina 25 Proporciona una visin general de las tareas de programacin generales que debe realizar para controlar los componentes GUI. Captulo 4. Programas de ejemplo para VisualAge RPG en la pgina 33 Describe cmo utilizar programas de ejemplo para algunos componentes VisualAge RPG. Captulo 5. Atributos comunes en la pgina 35 Describe atributos que son comunes a la mayora de los componentes y cmo puede utilizarlos. Captulo 6. Utilizacin de transferencia de datos en la pgina 41 Describe cmo puede utilizar la transferencia de datos para manipular el valor de algunos componentes. Captulo 7. Utilizacin de componentes en la pgina 45 Contiene sugerencias tiles acerca de la utilizacin de componentes VisualAge RPG.

Copyright IBM Corp. 1994, 2000

23

24

Programacin con VisualAge RPG

Captulo 3. Programacin con componentes


En esta seccin se describen algunos consejos para programar con componentes. Los temas tratados incluyen cmo obtener y establecer atributos de componente, hacer referencia a componentes del programa, responder a eventos y atributos del sistema, trabajar con atributos de evento y del sistema, y codificar componentes de texto esttico y de campo de entrada.

Obtencin y establecimiento de atributos de componente


Puede establecer algunos atributos de componente durante el tiempo de diseo mediante el cuaderno de propiedades del componente. Tambin puede utilizar los cdigos de operacin GETATR y SETATR, o las funciones incorporadas %getatr y %setatr, para cambiar o recuperar los atributos para algunos componentes en tiempo de ejecucin. Para obtener ms informacin acerca de los atributos y dnde puede establecerlos, consulte el manual VisualAge RPG Manual de consulta de componentes. GETATR y SETATR son cdigos de operacin fijos que pueden utilizarse para hacer referencia a componentes en la misma ventana como el componente que ha generado el evento. Por ejemplo, si el componente que ha generado el evento est en WINDOW1, los cdigos de operacin fijos slo pueden hacer referencia a componentes en WINDOW1. Si un cdigo de operacin GETATR o SETATR hace referencia a un componente en otra ventana, se producen errores de tiempo de compilacin para las subrutinas de accin de enlace nico, porque el compilador verifica que el componente referenciado exista en esa ventana. Se producen errores en tiempo de ejecucin para las subrutinas de accin de mltiples enlaces. Para hacer referencia a componentes en distintas ventanas, debe utilizar las funciones incorporadas %getatr y %setatr. Puede utilizar estas funciones incorporadas para especificar el nombre de ventana y el nombre de componente. Consulte el manual VisualAge RPG Manual de consulta del lenguaje, para obtener informacin acerca de la utilizacin de estos cdigos de operacin y funciones incorporadas.

Referencia a componentes en el programa


Al obtener o establecer atributos de componente, puede hacer referencia a un componente utilizando el nombre definido a este efecto en el Diseador GUI. El nombre debe seguir los convenios de denominacin del sistema AS/400. Especficamente, el nombre: v No debe exceder de 10 caracteres de longitud. Slo se permiten caracteres SBCS. Los caracteres deben ser letras de la A a la Z, nmeros del 0 al 9 o los smbolos @, #, $ o _ (subrayado). v Debe empezar por las letras de la A a la Z, o por los smbolos @, #, o $. v Puede entrarse en maysculas o en minsculas. v No debe contener blancos intercalados. v No debe ser un nombre ampliado (es decir, no debe estar encerrado entre comillas). Nota: Cuando est ejecutndose el programa, slo puede hacer referencia a componentes que se han creado. Los componentes se crean cuando tambin
Copyright IBM Corp. 1994, 2000

25

se crea la ventana donde estn. Al crear una ventana o un componente, se carga en la memoria. Cualquier intento de hacer referencia a un componente que todava no se ha creado da como resultado un mensaje Componente no encontrado.

Respuesta a eventos
Cada componente responde a un conjunto de eventos predefinidos. Puede utilizar uno de los siguientes mtodos para obtener una lista de eventos predefinidos: 1. Consulte el manual VisualAge RPG Manual de consulta de componentes si desea ver una lista completa. 2. Pulse F1 cuando el foco est en el componente de la paleta o del catlogo para obtener una descripcin general del componente y una lista de los atributos y eventos asociados con ese componente. 3. En el Diseador GUI, invoque el men emergente para el componente y seleccione el elemento Eventos. Habitualmente, los eventos se generan como resultado de alguna interaccin con la interfaz de usuario. Por ejemplo, al accionar un pulsador se seala un evento Press. El programa tambin puede generar eventos. Por ejemplo, el componente cliente DDE genera un evento Timeout si no puede iniciar una conversacin con un programa servidor dentro de un perodo de tiempo predeterminado. Si el programa cambia el valor del texto de un componente campo de entrada, el campo de entrada seala un evento Change. Responda a eventos en el programa codificando los cdigos de operacin BEGACT (iniciar accin) y ENDACT (finalizar accin). El cdigo entre estos cdigos de operacin, denominado subrutina de accin, se ejecuta para un evento en particular. Cuando se crea una subrutina de accin para un evento especfico, se define un enlace de accin. Si no codifica una subrutina de accin para un evento en particular, no se emprende ninguna accin cuando se produce el evento. El cdigo en una subrutina de accin se ejecuta hasta que se alcanza el cdigo de operacin ENDACT. Por consiguiente, si ha codificado cdigos de operacin EXSR dentro de una subrutina de accin, estas subrutinas (denominadas subrutinas de usuario) tambin se ejecutan. No puede invocar una subrutina de accin utilizando el cdigo de operacin EXSR. Sin embargo, puede invocar una subrutina de accin en particular mediante ms de una accin. Por ejemplo, puede tener un cdigo que se ejecuta cuando se acciona un pulsador o cuando se selecciona un elemento de men. Puede revisar los eventos que tienen subrutinas de accin y modificar eventos de enlace a subrutinas de accin en la ventana Subrutinas de accin. Para visualizar la ventana Subrutinas de accin: 1. Seleccione Editar cdigo fuente del men Proyecto en el Diseador GUI. Esto inicia una sesin de edicin. 2. Desde la sesin de edicin, seleccione EditarSubrutinas de accin. Aparece la ventana Subrutinas de accin. Los atributos de evento contienen datos que son relevantes para un evento. Por ejemplo, el evento MouseMove almacena las coordenadas X e Y para indicar dnde estaba ubicado el ratn cuando se produjo el evento. Antes de que pueda utilizar atributos de evento en el programa, deben definirse en especificaciones de definicin. El nombre del atributo de evento es el nombre de la entidad en la especificacin de definicin. Dado que el compilador no verifica la longitud de la variable y algunos atributos tienen longitudes variables, asegrese de especificar una longitud lo bastante grande para contener el valor esperado.

26

Programacin con VisualAge RPG

Nota: El programa no puede cambiar los atributos de evento. Por consiguiente, no pueden aparecer en un campo de resultado como el campo destino para una operacin EVAL. En el manual VisualAge RPG Manual de consulta de componentes se describen todos los atributos de evento. El siguiente ejemplo muestra cmo los atributos de evento %MouseX y %MouseY pueden definirse y utilizarse en un programa.
* * Definir atributos de evento de coordenadas x e y del ratn * DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords++++++++++++++++++++++++ D%MouseX S 4P 0 D%MouseY S 4P 0 * * Comprobar si las coordenadas del ratn estn en el rango: * CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq... CSRN01Factor1+++++++Opcode(E)+Extended-factor2++++++++++++++++++++++++++ C %MouseX ifgt 100 C %MouseY andgt 100 C .. C endif * ***** Fin de fuente

Atributos de sistema
Los atributos de sistema pertenecen a la aplicacin y no a un componente especfico. Como sucede con los atributos de evento, los atributos de sistema deben definirse en una especificacin de definicin. El programa no puede modificar los atributos de sistema. VisualAge RPG soporta los siguientes atributos de sistema:
Tabla 1. Atributos de sistema
Atributo %DspHeight Descripcin Tipo Longitud 4

Devuelve la altura de Numrico la pantalla, en tiempo de ejecucin, en pixels. Devuelve la anchura de la pantalla, en tiempo de ejecucin, en pixels. Numrico

%DspWidth

Cmo trabajar con atributos de evento y de sistema


Cada atributo de evento es vlido para un evento en particular y slo puede utilizarse en subrutinas de accin que estn enlazadas con dicho evento. Por ejemplo, si utiliza un atributo de evento para el evento MouseMove dentro de una subrutina de accin que est enlazada con el evento ReSize, se emite un error de tiempo de ejecucin. La comprobacin de tipos en los atributos de evento slo se

Captulo 3. Programacin con componentes

27

realiza en tiempo de ejecucin. Si define un campo de tipo carcter para un atributo de evento numrico, este error slo se detecta en tiempo de ejecucin. Los atributos del sistema pueden utilizarse en cualquier lugar del programa, porque no estn enlazados con ningn evento en particular. La comprobacin de tipos en los atributos de evento se realiza en tiempo de compilacin. Los atributos de evento y de sistema deben definirse en una especificacin de definicin antes de que puedan utilizarse en todo el componente lgico VisualAge RPG. El compilador los trata como campos de slo lectura en el almacenamiento automtico. Cualquier subrutina de accin anidada y activa tiene su propia copia de un atributo de evento. Por ejemplo, suponga que la subrutina de accin ENT0000A+CHANGE+WIN1 est enlazada a la ventana WIN1, al componente campo de entrada ENT0000A y al evento CHANGE.
CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq.. CSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++ C ENT0000A BEGACT CHANGE WIN1 C . C . C %PART dsply boxid reply * Se visualiza 'ENT0000A'. C . C . C endact

Suponga tambin que la subrutina PSB0000A+PRESS+WIN1 est enlazada a la ventana WIN1, al componente pulsador PSB0000A y al evento PRESS.
CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq.. CSRN01Factor1+++++++Opcode(E)+Extended-factor2++++++++++++++++++++++++ C PSB0000A BEGACT PRESS WIN1 C . C %PART dsply boxid reply * Se visualiza 'PSB0000A'. C . C ENT0000A SETATR 10 TEXT * Desencadena el evento CHANGE para el campo de entrada ENT0000A * que hace que se invoque la subrutina de accin ENT0000A+CHANGE+WIN1. * C . C . C %PART dsply boxid reply * Se visualiza 'PSB0000A'. C . C . C endact

Cuando se acciona el pulsador PSB0000A, se invoca la subrutina de accin PSB0000A+PRESS+WIN1. Cuando se ejecuta la operacin SETATR, se desencadena el evento CHANGE para el componente campo de entrada ENT0000A. Esto invoca la subrutina de accin ENT0000A+CHANGE+WIN1. Cada subrutina de accin tiene su propio almacenamiento para %PART porque los campos de atributo de evento estn en el almacenamiento automtico: v En la subrutina de accin PSB0000A+PRESS+WIN1, %PART contiene PSB0000A. v En la subrutina de accin ENT0000A+CHANGE+WIN1, %PART contiene ENT0000A.

28

Programacin con VisualAge RPG

v Cuando se completa la subrutina de accin ENT0000A+CHANGE+WIN1 y la subrutina de accin PSB0000A+PRESS+WIN1 sigue ejecutndose, %PART contiene PSB0000A, no ENT0000A.

Codificacin de los componentes texto esttico y campo de entrada


La siguiente seccin contiene algunos consejos para codificar componentes texto esttico y campo de entrada.

Creacin y recuperacin de componentes campo de entrada


Nota: Esta seccin tambin se aplica a componentes texto esttico. Para simplificar, en el texto slo se mencionan los componentes campo de entrada. Cuando se ejecuta una operacin READ, dnde almacena VisualAge RPG el valor recuperado? Cuando se ejecuta una operacin WRITE, qu valor utiliza VisualAge RPG para establecer el valor? Para cada componente campo de entrada, VisualAge RPG crea un campo con el mismo nombre que el componente. Este campo se define para que coincida con la definicin del atributo Text (o el atributo Label para los componentes texto esttico). Por ejemplo, si hay un componente campo de entrada denominado ENT00012, y el atributo Text est definido como de 20 caracteres, VRPG define automticamente un campo de 20 caracteres denominado ENT00012. Puede utilizar este campo en el programa. Puede alterar temporalmente la definicin del campo en una especificacin de definicin, definiendo un campo del mismo nombre. No obstante, la definicin del campo debe cumplir las reglas de VisualAge RPG respecto a la compatibilidad de tipo y longitud. Por ejemplo, el campo debe tener la misma longitud que la definicin de atributo. Para los campos numricos, el campo no ha de tener el mismo tipo que la definicin de atributo. Cuando se ejecuta la aplicacin, el valor de un campo de entrada se inicializa con el valor suministrado en el Diseador GUI. No obstante, puede sobreescribir este valor estableciendo la palabra clave INZ en la especificacin de definicin o moviendo un valor al campo de programa. En estos casos, el valor almacenado en cada uno de estos campos no coincide necesariamente con el valor que ver en la pantalla para el componente correspondiente. Si almacena un valor diferente en un campo en una subrutina de usuario o de accin, VisualAge RPG no refleja ese nuevo valor en la pantalla. Por consiguiente, el valor almacenado en el campo es diferente del visualizado en la pantalla. Para reflejar el valor almacenado en la pantalla, debe utilizar una operacin WRITE o una operacin SETATR. Lo mismo es vlido para SHOWWIN. Cuando una ventana se abre por primera vez, los valores que aparecen en la pantalla corresponden a los valores suministrados para los componentes del Diseador GUI. Si cambia el valor almacenado para un campo VisualAge RPG correspondiente antes de mostrar la ventana, el valor del campo no coincidir con lo que se ve en la pantalla. Para que los dos valores sean idnticos, tiene que realizar una operacin WRITE o una operacin de establecer atributos en una subrutina de accin enlazada al evento Create para la ventana. Esto sincroniza el valor almacenado en el campo con el valor de la pantalla y el usuario slo ve el nuevo valor cuando se muestra la ventana.
Captulo 3. Programacin con componentes

29

En general, es aconsejable utilizar una subrutina de accin enlazada al evento Create para establecer valores que deben aparecer en la pantalla cuando se abre una ventana.

Cdigos de operacin para componentes de ventana


Se han ampliado varios cdigos de operacin en VisualAge RPG para que funcionen en ventanas y sus componentes: READ, WRITE, CLEAR y RESET. Estos cdigos de operacin pueden utilizarse en ventanas y afectan a los componentes texto esttico y campo de entrada. READ Ejecuta operaciones de obtener atributos en todos los componentes texto esttico y campo de entrada afectados. WRITE Ejecuta operaciones de establecer atributos en todos los componentes texto esttico y campo de entrada afectados. CLEAR Establece todos los componentes campo de entrada numrico en cero y todos los componentes campo de entrada de tipo carcter en blancos. (No funciona en los componentes texto esttico.) RESET Establece de nuevo los componentes texto esttico y campo de entrada en sus valores iniciales. Los cdigos de operacin de ventana utilizan estos atributos: Text Label Atributo de los componentes campo de entrada que se utiliza para ejecutar operaciones READ, WRITE, CLEAR y RESET. Atributo de componentes texto esttico que se utiliza para ejecutar operaciones READ, WRITE y RESET.

Utilizacin de cdigos de operacin de ventana en componentes con nombres idnticos


Puede tener dos campos de entrada con el mismo nombre, dos componentes texto esttico con el mismo nombre, o incluso un componente campo de entrada que tenga el mismo nombre que un componente texto esttico, siempre y cuando los componentes pertenezcan a ventanas diferentes. Esta seccin describe cmo evitar establecer el valor de uno de estos componentes como valor de otro de manera inadvertida. Slo se crea un campo de programa para un nombre de componente determinado. Si hay un componente campo de entrada en la ventana W1 denominado MYPART, y un componente campo de entrada en la ventana W2 denominado MYPART, se crea un campo VisualAge RPG denominado MYPART. El compilador crea la definicin de manera que coincida con una de las definiciones de componente. Si tiene ms de un componente con el mismo nombre, el compilador emitir un mensaje de error si los componentes no tienen definiciones compatibles. Los componentes son compatibles si aceptan el mismo tipo de datos (numrico o de tipo carcter), tienen la misma longitud y (si son numricos) tienen el mismo nmero de posiciones decimales. Si los componentes que comparten un campo tienen valores iniciales diferentes, el valor inicial del campo se establece segn el componente que el compilador encuentre primero al crear los campos internos para componentes campo de

30

Programacin con VisualAge RPG

entrada. Esto puede variar de una construccin a otra, de manera que cuando varios componentes comparten el mismo campo, no debe dependerse del campo que tenga un valor inicial especfico, a menos que se establezcan todos los valores iniciales como iguales. Ejecutar una operacin en una de las ventanas que contiene uno de estos componentes, o en uno de los componentes, da como resultado que el campo de entrada contenga un valor que coincida con el valor de pantalla del componente implicado en la operacin. No obstante, el campo contiene un valor que probablemente no coincide con los valores de pantalla de los otros componentes en otras ventanas que comparten este campo. Aunque varios componentes comparten el mismo campo, una operacin en cualquiera de estos componentes slo afecta al componente especificado en la operacin o contenido en la ventana especificada en la operacin. Los otros componentes que comparten el campo no se ven afectados.

Ejemplo
El siguiente ejemplo muestra lo que puede suceder cuando se establece el valor de uno de los componentes en un valor de otro componente cuando stos comparten un campo. 1 Definicin de los campos: El campo de entrada A01 en la ventana W1 se define como de 10 caracteres, al igual que en la ventana W2. El valor en la pantalla para W1 es 78893, y el valor en la pantalla para W2 es 885364. El campo A01 contiene el valor 0000000000. Estos son los valores iniciales.

W1
A01
78893

W2
A01
885364

Pr ogr am Fi el d
A01
0000000000

2 Ejecucin de una operacin READ en W1: El campo A01 contiene ahora 78893. Coincide con el campo de entrada A01 en W1.

W1
A01
78893

W2
A01
885364

Pr ogr am Fi el d
A01
78893

3 Ejecucin de una operacin WRITE en W2: El valor de pantalla del campo de entrada A01 en W2 es ahora 78893.

W1
A01
78893

W2
A01
78893

Pr ogr am Fi el d
A01
78893

4 Ejecucin de una operacin CLEAR en W2: El campo A01 contiene ahora blancos. Coincide con el campo de entrada A01 en W2. Campo de entrada A01 en W1 - el valor en pantalla es 78893. Campo de entrada A01 en W2 - el valor en pantalla es un blanco.

Captulo 3. Programacin con componentes

31

W1
A01
78893

W2
A01

Pr ogr am Fi el d
A01

5 Ejecucin de una operacin GETATR en el campo de entrada A01 de W1 con el campo destino A01: El campo A01 contiene ahora 78893. Coincide con el campo de entrada A01 en W1.

W1
A01
78893

W2
A01

Pr ogr am Fi el d
A01
78893

Si desea que todos los componentes que comparten un campo visualicen el mismo valor, tiene que ejecutar operaciones SETATR en todos los componentes utilizando el campo como valor fuente, o ejecutar operaciones WRITE en todas las ventanas que contengan uno de estos componentes. Es recomendable dar nombres exclusivos a todos los componentes campo de entrada en el componente lgico, para impedir que se establezca accidentalmente el valor de uno de los componentes como el valor de otro.

32

Programacin con VisualAge RPG

Captulo 4. Programas de ejemplo para VisualAge RPG


La carpeta Ejemplos (de la carpeta de proyectos de VisualAge RPG) contiene el cdigo fuente y la versin de tiempo de ejecucin de las aplicaciones de ejemplo analizadas en esta parte del manual. La Tabla 2 lista los programas de ejemplo.
Tabla 2. Programas de ejemplo para VisualAge RPG
Programa Animation Bean Calendar Component Reference Part Container Customer Maintenance* DDE Client DDE Hotlink Drag and Drop Graph Image* Listbox Message Subfile Multiline Edit Notebook Odbcceld Popup Menu Progress Resize Scroll Slider** Spin Button Subfile* Timer VARPG Plug-in Video Store Cashier* Video Store Catalog* Welcome Descripcin Ejemplo de componente control de animacin Ejemplo de componente bean Java Ejemplo de componente calendario Ejemplo de referencia del componente Ejemplo del componente contenedor Ejemplo de mantenimiento de clientes Ejemplo de componente cliente DDE Ejemplo de enlace dinmico DDE Ejemplo de transferencia de datos Ejemplo de componente grfico Ejemplo de componente imagen Ejemplo de componente recuadro de lista Ejemplo de componente subarchivo de mensajes Ejemplo de componente edicin de mltiples lneas Ejemplo del componente cuaderno Ejemplo de componente interfaz ODBC/JDBC Ejemplo del componente men emergente Ejemplo de componente barra de progreso Ejemplo de ajuste de tamao Ejemplo de componente barra de desplazamiento Ejemplo de componente graduador Ejemplo de componente selector cclico Ejemplo de componente subarchivo Ejemplo de componente temporizador Ejemplo de conector de proveedor Ejemplo de cajero de tienda de vdeos Ejemplo de catlogo de vdeos Ejemplo de bienvenida

Copyright IBM Corp. 1994, 2000

33

Notas: 1. * Este ejemplo requiere datos en un sistema AS/400. 2. ** Tambin muestra cmo utilizar los atributos BackMix y ForeMix.

Antes de empezar
Antes de ejecutar e instalar las aplicaciones de ejemplo, debe instalar VisualAge RPG. Consulte el manual Instalacin de VisualAge RPG y CODE/400 para AS/400, para obtener informacin y ejemplos de instalacin. Antes de utilizar los ejemplos, lea los comentarios del programa de ejemplo. Estos comentarios contienen consejos y requisitos, as como posibles restricciones. Para construir y ejecutar aplicaciones Java, debe tener instalado el Java 2 Software Development Kit (J2SDK) Versin 1.2, o superior, de Sun, en la estacin de trabajo. Si no tiene el J2SDK, puede bajarlo de Sun Microsystems en el URL siguiente:
http://www.javasoft.com/products/

Tras instalar el J2SDK, establezca la variable de entorno PATH de modo que apunte a la ubicacin tanto del compilador Java como del Java Runtime Environment (JRE). Por ejemplo, si el directorio inicial de J2SDK es c:\jdk1.2, aada la siguiente sentencia en la variable PATH: c:\jdk1.2\bin

Construccin de los ejemplos


Puede ejecutar la mayora de los ejemplos sin construirlos porque se proporciona una versin de tiempo de ejecucin. Para construir uno de los programas de ejemplo, visualice el men emergente de la carpeta del ejemplo y seleccione Construir>Windows NT/95/98 o Construir>Java.

Ejecucin de los ejemplos


Para ejecutar un programa de ejemplo, visualice el men emergente del programa y seleccione Ejecutar>Windows NT/95/98 o Ejecutar>Java.

Acceso a un sistema AS/400


Algunos programas de ejemplo, como el ejemplo de subarchivo, acceden a datos en un sistema AS/400. Los archivos de datos de AS/400 utilizados por estos programas no se envan con VisualAge RPG. No obstante, la seccin de comentario de archivos fuente describe el diseo de archivo para ese ejemplo. Debe crear los archivos de datos en el sistema AS/400 y suministrar datos. Para ejecutar estos ejemplos, debe iniciar el Diseador GUI en el programa ejemplo y utilizar el cuaderno Definir informacin de AS/400 en el men desplegable Servidores para realizar lo siguiente: 1. Cambie el parmetro de ubicacin remota para que apunte al sistema AS/400 al que desee acceder. 2. Cambie el parmetro de nombre de archivo remoto de tal manera que pueda acceder al archivo de datos adecuado para el ejemplo. Vea el Captulo 8. Conectividad con AS/400 en la pgina 189 para obtener ms informacin sobre la definicin de informacin de AS/400.

34

Programacin con VisualAge RPG

Captulo 5. Atributos comunes


En esta seccin se describen los atributos que son comunes a la mayora de los componentes y cmo puede utilizarlos.

Atributo PartName
Todos los componentes tienen un nombre. VisualAge RPG genera automticamente este nombre cuando se crea el componente. Puede cambiar el nombre del componente en su cuaderno de propiedades o editndolo directamente en la vista de rbol de la ventana de proyecto del Diseador GUI. El nombre de componente *componente lgico no puede editarse. Nota: No puede cambiar el nombre de componente en tiempo de ejecucin. Cada ventana debe tener un nombre exclusivo y todos los componentes en una ventana dada deben tener un nombre exclusivo. Los componentes de ventanas diferentes pueden tener el mismo nombre, salvo los nombres de componente subarchivo, que deben ser exclusivos en todo el componente lgico. Implcitamente, el compilador define un nombre de campo para el campo de entrada y los componentes texto esttico mediante el atributo PartName. Puede utilizar ese nombre en el programa si desea referirse al valor de estos componentes. Para obtener ms informacin, vea el Captulo 3. Programacin con componentes en la pgina 25. Si cambia el nombre de un componente, debe cambiar todas las referencias a ese componente en el fuente del programa. Si intenta hacer referencia al nombre antiguo de un componente que se ha redenominado, obtendr errores de compilacin o un error de tiempo de ejecucin indicando que no ha podido encontrarse el componente.

Atributo ParentName
El atributo ParentName devuelve el nombre del componente padre. El padre es la ventana donde se coloca un componente. Para un componente ventana, el padre es la misma ventana.

Atributo PartType
Puede utilizar el atributo PartType para determinar el tipo de componente en el programa. PartType devuelve el tipo del componente tal como lo define VisualAge RPG. El valor devuelto para los componentes VisualAge RPG consiste en la serie FVDES seguida del tipo de componente. Por ejemplo, para un componente campo de entrada el tipo de componente sera FVDESEntryField. Una excepcin es el componente referencia a componente lgico, que tiene el prefijo FVDESV. La Tabla 3 en la pgina 36 resume el valor del atributo PartType para cada componente VisualAge RPG.

Copyright IBM Corp. 1994, 2000

35

Tabla 3. El atributo PartType de VisualAge para componentes de RPG


Atributo PartType FVDESOCX FVDESAnimationControl FVDESCalendar FVDESCanvas FVDESCheckBox FVDESComboBox FVDESContainerControl FVDESVComponentReference FVDESDDEClient FVDESEntryField FVDESGraph FVDESGraphicPushButton FVDESGroupBox FVDESHScrollBar FVDESImage FVDESJavaBean FVDESListBox FVDESAudio FVDESMediaPanel FVDESMenuItem FVDESMessageSubfile FVDESMultiLineEdit FVDESNotebook FVDESNotebookPage FVDESODBCInterface FVDESOutlineBox FVDESPopUpMenu FVDESProgressBar FVDESPushButton FVDESRadioButton FVDESSlider FVDESSpinButton FVDESStaticText FVDESStatusBar FVDESSubfile FVDESSubmenu FVDESTimer FVDESVScrollBar FVDESFrameWindow Componente VisualAge RPG ActiveX Control de animacin Calendario Lienzo Recuadro de seleccin Recuadro de combinacin Contenedor Referencia a componente lgico Cliente DDE Campo de entrada Grfica Pulsador grfico Recuadro de grupo Barra de desplazamiento horizontal Imagen Bean Java Recuadro de lista Medios Panel de medios Elemento de men Subarchivo de mensajes Edicin de mltiples lneas Cuaderno Pgina de cuaderno Interfaz ODBC/JDBC Recuadro de contorno Men emergente Barra de progreso Pulsador Botn de seleccin Graduador Selector cclico Texto esttico Barra de estado Subarchivo Submen Temporizador Barra de desplazamiento vertical Ventana

36

Programacin con VisualAge RPG

Atributos de color
Puede cambiar el color de la mayora de componentes mediante los atributos BackColor y ForeColor. Los valores de atributo son nmeros que representan colores especficos. El compilador proporciona un conjunto de constantes representativas, tales como *RED y *GREEN, que pueden utilizarse para establecer los colores. Puede dirigirse a la publicacin VisualAge RPG Manual de consulta del lenguaje si desea consultar estos nombres. Puede especificar una mezcla de colores para el componente mediante los atributos ForeMix y BackMix. El valor de estos atributos representa una mezcla de los colores primarios rojo, verde y azul. Suele hacerse referencia a esto como el valor de color RGB. Este valor RGB es una serie que se compone de tres valores separados por signos de dos puntos (:). Cada valor representa la intensidad de rojo, verde y azul, por este orden. El valor de cada color est entre 0 y 255. En el siguiente ejemplo de cdigo, la mezcla de colores de fondo de un componente texto esttico se establece en un tono medio de azul:
CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq.. * C 'ST1' setatr '000:000:128' 'BackMix'

Para ver un ejemplo ms detallado sobre cmo especificar los atributos ForeMix y BackMix, vea Graduador en la pgina 139.

Atributo Enabled
Cuando se habilita un componente, puede responder a la interaccin del usuario y generar eventos. Por ejemplo, cuando se acciona un pulsador habilitado, genera un evento Press que, a continuacin, el programa puede manejar. Puede que no desee que se habilite un componente hasta que exista una cierta condicin. En caso del pulsador, puede que desee que el usuario pueda pulsarlo slo cuando se ha seleccionado un elemento en un recuadro de lista. Cuando un componente no est habilitado, no responde a la interaccin de usuario y su etiqueta se atena. Para habilitar un componente, establezca su valor de atributo Enabled en 1. Si no desea que un componente est habilitado, establezca este valor en 0.

Atributos de tamao y posicin


Puede utilizar los atributos Height y Width para indicar el tamao, en pixels, de la mayora de componentes. Tambin puede utilizar los atributos Left, Bottom y Top para especificar la posicin del componente en el componente que lo contiene (generalmente una ventana). El valor de posicin tambin se expresa en pixels. Al posicionar un componente, los valores son relativos a la esquina superior izquierda. Estos atributos son tiles porque cambian dinmicamente el tamao y la posicin de los componentes en tiempo de ejecucin. Por ejemplo: v Si un usuario puede cambiar el tamao de una ventana, puede que desee codificar una subrutina de accin que maneje el evento ReSize y altere la
Captulo 5. Atributos comunes

37

posicin de los componentes en esa ventana, de manera que sigan centrados dentro de la misma. Si no lo hace, los componentes seguirn siendo relativos a la esquina superior izquierda de la ventana. v Si la aplicacin se ejecuta en sistemas que utilizan monitores con resoluciones diferentes, puede utilizar los atributos del sistema %DspWidth y %DspHeight para asegurar que las ventanas sean visibles sin importar la resolucin de pantalla. Puede que desee situar la ventana en el centro de la pantalla o en otra coordenada. ste es un clculo que puede realizarse en el evento Create para una ventana. Este ejemplo calcula las coordenadas adecuadas para centrar una ventana denominada Window1 y luego mueve la ventana a una nueva coordenada antes de visualizarla en la pantalla.
* DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++ * * Declarar atributos de sistema de tamao de pantalla D%DspHeight S 4P0 D%DspWidth S 4P0 * CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq * * Manejar evento de crear para Window1. * Obtiene tamao de pantalla y calcula coordenadas de pixels * para situar la ventana en el centro de la pantalla. * C WINDOW1 BEGACT CREATE WINDOW1 * * Obtener dimensiones de las ventanas: C 'Window1' GETATR 'Width' winWidth 4 0 C 'Window1' GETATR 'Height' winHeight 4 0 * * Calcular nuevas coordenadas para centrar la ventana C %DspWidth SUB winWidth newLeft 4 0 C %DspHeight SUB winHeight newBottom 4 0 C newLeft DIV 2 newLeft C newBottom DIV 2 newBottom * * Centrar la ventana y hacerla visible C 'Window1' SETATR newLeft 'Left' C 'Window1' SETATR newBottom 'Bottom' C 'Window1' SETATR 1 'Visible' C ENDACT *

Atributo Visible
Puede utilizar el atributo Visible para especificar cundo desea que se visualice un componente o una ventana. Por ejemplo, puede que desee que aparezca un pulsador en la pantalla solamente en tiempo de ejecucin. Para ello, al crear el pulsador en el Diseador GUI, vaya al cuaderno de propiedades del componente y desactive el distintivo de visible. Luego, en tiempo de ejecucin, establezca el valor de atributo Visible en 1 cuando desee que aparezca el pulsador.

Atributo Focus
El rea de una ventana donde un usuario puede interactuar con la interfaz tiene el foco de entrada. El componente que tiene el foco de entrada debe habilitarse para responder a las acciones del usuario, tales como pulsar una tecla o un botn.

38

Programacin con VisualAge RPG

Hay ocasiones en que desear que el foco est en un componente del programa para que el usuario pueda utilizarlo de inmediato. Por ejemplo, si marca varios campos de entrada y requiere que el usuario vuelva a entrar informacin en un campo de entrada en particular, establecer el valor de atributo de Focus en 1 para ese campo de entrada. Cuando establezca el atributo, el cursor aparecer en el lugar donde el usuario pueda empezar a escribir datos en el campo de entrada. Adems de proporcionar un foco a un componente concreto, puede determinar si un componente ha obtenido el foco. Un componente obtiene el foco cuando el usuario lo selecciona, avanzado hasta el mismo con el tabulador o seleccionndolo con el ratn. Cuando esto ocurre, se genera un evento GotFocus para el componente. Y viceversa, se genera un evento LostFocus cuando un componente pierde el foco.

Atributo UserData
Todos los componentes soportan el atributo UserData. Utilice este atributo para asignar cualquier serie de texto a un componente. Esta serie no tiene efecto en el valor de cualquier otro atributo del componente y no se visualiza. El atributo UserData puede contener un mximo de 65.535 caracteres.

Atributo Label
Varios componentes tienen un atributo Label. Es texto descriptivo que explica el propsito del componente. El texto que aparece en un pulsador es un ejemplo de este atributo. Los siguientes componentes tienen un atributo Label: v Recuadro de seleccin v Contenedor v Recuadro de grupo v Elemento de men v Pulsador v Botn de seleccin v Texto esttico v Ventana v Ventana con lienzo

Sustitucin de etiqueta
Puede sustituir el texto de una etiqueta utilizando un smbolo cuando establezca los atributos Label, TabLabel o InfoLabel. Esto es particularmente til si est desarrollando aplicaciones para utilizarlas con otros idiomas, porque le permite traducir las etiquetas y los mensajes que ha definido en el Diseador GUI. Cuando especifique la sustitucin de etiquetas para un componente, se realizar una entrada en el archivo de mensajes del componente. Varios componentes pueden utilizar la misma sustitucin de etiqueta (por ejemplo, |OK). Se utiliza la misma entrada de archivo de mensajes para todas las referencias. Defina una etiqueta de sustitucin para un componente en su cuaderno de propiedades, especificando una serie, sin blancos intercalados, precedida del smbolo (|). Esto aade un mensaje al archivo de mensajes. Seleccione ProyectoDefinir mensajes... para invocar el editor de mensajes y aada el texto de mensaje con que desea sustituir el atributo Label cuando se ejecute la aplicacin.
Captulo 5. Atributos comunes

39

Consejos sobre la traduccin


Al definir el tamao de un componente en el Diseador GUI que tendr una etiqueta de sustitucin, tenga en cuenta que el texto traducido puede ser ms largo que el original. Si utiliza nemotcnicos, recuerde que el carcter nemotcnico puede ser diferente para otros idiomas. Puede tener ms de un archivo de mensajes traducido en los subdirectorios de tiempo de ejecucin asignando distintas extensiones de archivo a cada uno. Por ejemplo, la versin inglesa del archivo de mensajes compilado podra denominarse SAMPLEENG y la versin alemana, SAMPLEGER. Puede indicar al usuario que copie el archivo de mensajes correspondiente a SAMPLEMSG antes de ejecutar la aplicacin.

40

Programacin con VisualAge RPG

Captulo 6. Utilizacin de transferencia de datos


En esta seccin se describe cmo se puede utilizar la transferencia de datos para manipular el valor de algunos componentes. Nota: La transferencia de datos no est soportada para las aplicaciones Java.

Una situacin de transferencia de datos habitual


El usuario selecciona un componente (denominado componente origen) con el ratn, lo arrastra a otro componente (denominado componente destino) y suelta el botn para soltar el valor en el componente destino. Esto transfiere informacin desde el componente origen al componente destino, y entonces el componente destino puede actuar sobre esa informacin. Nota: El propio componente no se desplaza con la transferencia de datos. Es el valor del componente que est transfirindose.

Componentes que soportan la transferencia de datos


La siguiente tabla lista los componentes que soportan la transferencia de datos y los datos sobre los que acta cada uno.
Tabla 4. Componentes VisualAge RPG que soportan la transferencia de datos
Componente Recuadro de combinacin Datos transferidos El valor de la porcin de campo de entrada del recuadro de combinacin, o el elemento seleccionado para un tipo de lista desplegable de recuadro de combinacin El valor del atributo Text El elemento seleccionado El mensaje seleccionado El valor del atributo Text El valor del atributo Label

Campo de entrada Recuadro de lista Subarchivo de mensajes Edicin de mltiples lneas Texto esttico

Habilitacin de componentes para la transferencia de datos


Si desea que un componente sea un componente origen, establezca el atributo DragEnable correspondiente en el valor 1; y si desea que sea un componente destino, establezca el atributo DropEnable en el valor 1. Puede establecer estos atributos en el cuaderno de propiedades del componente o en el programa. No puede volver a establecer estos atributos durante el tiempo de ejecucin: una vez que se habilita un componente para la transferencia de datos, permanece establecido. Despus de haber establecido los atributos DragEnable y DropEnable, puede arrastrar el componente origen y soltarlo en el componente destino. Esto hace que se produzca el evento Drop para el componente destino. Nota: Los atributos DragEnable y DropEnable no estn soportados en las aplicaciones Java.
Copyright IBM Corp. 1994, 2000

41

Ejemplo de transferencia de datos


En el siguiente ejemplo, una ventana tiene dos campos de entrada denominados EF1 y EF2. El atributo DragEnable se establece para EF1 y el atributo DropEnable se establece para EF2. Entonces, el valor de texto de EF1 puede arrastrarse y soltarse en EF2. El campo de entrada EF2 slo permite ciertos valores. En el evento Drop para este componente, la subrutina de accin comprueba que el valor soltado es vlido. Si el valor no es vlido, se aade un mensaje al componente subarchivo de mensajes.
********************************************************************* * * * ID de program. : DragDrop * * * * Descripcin . : Programa de ejemplo que muestra cmo responder * * al evento DROP y acceder a datos transferidos. * * * * Nota: Java no da soporte a la funcin arrastrar y soltar * * * ********************************************************************* * * Definir el atributo de evento de datos DROP D%Data S 5A ********************************************************************* * * * Ventana. . : MAIN * * * * Componente : PB_EXIT * * * * Evento . . : PRESS * * * * Descripcin: Finalizar el programa * * * ********************************************************************* * C PB_EXIT BEGACT PRESS MAIN * C move *on *inlr * C ENDACT

Figura 12. Cdigo de ejemplo de arrastrar y soltar (Pieza 1 de 2)

42

Programacin con VisualAge RPG

********************************************************************* * * * Ventana. . : MAIN * * * * Componente : EF2 * * * * Evento . . : DROP * * * * Descripcin: Esta subrutina de accin obtendr el control cuando * * se ha transferido un valor al campo de entrada EF2 * * Al comprobar el atributo de evento %Data, * * determinar si se permite el valor transferido para * * el campo de entrada y aadir el mensaje * * correspondiente al componente subarchivo de * * mensajes. * * * ********************************************************************* * C EF2 BEGACT DROP MAIN * * Borrar el subarchivo de mensajes C 'Msg1' setatr 0 'RemoveMsg' * * Comprobar que el valor transferido est permitido * C if %Data <> 'Yes ' and C %Data <> 'No ' and C %Data <> 'Maybe' * C 'Msg1' setatr 1 'AddMsgID' C endif * C ENDACT ********************************************************************* * * * Ventana. . : MAIN * * * * Componente : EF2 * * * * Evento . . : CHANGE * * * * Descripcin: * * * ********************************************************************* * C EF2 BEGACT CHANGE MAIN * C ENDACT

Figura 12. Cdigo de ejemplo de arrastrar y soltar (Pieza 2 de 2)

Captulo 6. Utilizacin de transferencia de datos

43

44

Programacin con VisualAge RPG

Captulo 7. Utilizacin de componentes


Esta seccin contiene sugerencias tiles acerca de la utilizacin de los componentes de VisualAge RPG. La descripcin de cada componente contiene una lista de los atributos y eventos que se aplican al componente. Los siguientes componentes se describen detalladamente. v ActiveX en la pgina 46 v Control de animacin en la pgina 50 v Calendario en la pgina 51 v Lienzo en la pgina 53 v Recuadro de seleccin en la pgina 55 v Recuadro de combinacin en la pgina 57 v Referencia a componente lgico en la pgina 62 v Contenedor en la pgina 64 v Cliente DDE en la pgina 71 v Campo de entrada en la pgina 72 v Grfica en la pgina 75 v Pulsador grfico en la pgina 77 v Recuadro de grupo en la pgina 79 v Barra de desplazamiento horizontal en la pgina 80 v Imagen en la pgina 81 v Bean Java en la pgina 87 v Recuadro de lista en la pgina 90 v Medios en la pgina 99 v Panel de medios en la pgina 101 v Barra de mens en la pgina 103 v Elemento de men en la pgina 104 v Subarchivo de mensajes en la pgina 106 v Edicin de mltiples lneas en la pgina 110 v Cuaderno en la pgina 115 v Pgina de cuaderno en la pgina 116 v Pgina de cuaderno con lienzo en la pgina 117 v Interfaz ODBC/JDBC en la pgina 118 v Recuadro de contorno en la pgina 131 v Men emergente en la pgina 132 v Barra de progreso en la pgina 133 v Pulsador en la pgina 134 v Botn de seleccin en la pgina 136 v Graduador en la pgina 139 v Selector cclico en la pgina 145 v Texto esttico en la pgina 149 v Barra de estado en la pgina 151 v Subarchivo en la pgina 152 v Submen en la pgina 166 v Temporizador en la pgina 167 v Barra de desplazamiento vertical en la pgina 174 v Ventana en la pgina 175 v Ventana con lienzo en la pgina 176 v *Component en la pgina 184 Nota: Los componentes no se presentan en el orden en que debe utilizarlos. Debe utilizar el componente ventana o el componente ventana con lienzo en

Copyright IBM Corp. 1994, 2000

45

primer lugar para iniciar la construccin de la aplicacin y luego para aadir otros componentes a medida que sea necesario. Si desea obtener ms informacin acerca de los atributos de componente, eventos y atributos de evento, puede consultar el tema VisualAge RPG Manual de consulta de componentes. Para aprender consejos de programacin adicionales, vea el Captulo 3. Programacin con componentes en la pgina 25.

ActiveX

* Restriccin: Este componente no est soportado en las aplicaciones Java. Utilice el componente ActiveX para aadir objetos de control ActiveX al proyecto. Las aplicaciones podrn acceder a los atributos y supervisar los eventos. (Otros proveedores se encargan del desarrollo y suministro de los controles ActiveX.) Debe estar familiarizado con los controles ActiveX que aade. El Diseador GUI de VARPG no puede controlar las funciones que proporcionan estos componentes. Nota: VARPG slo trabaja con controles ActiveX que tengan interfaces escritas en C++. Consulte con su suministrador de controles ActiveX para asegurarse de que VARPG funcionar con el control ActiveX que desea utilizar.

46

Programacin con VisualAge RPG

Atributos de componente
Activate HasPrpPage OCXProp PartType Top AddEvent Height OCXValue Refresh UserData Bottom Left ParentName RmvEvent Visible DeActivate Method PartName ShowProp Width

Eventos a los que puede aplicarse


Create Destroy OCXEvent

Adicin de controles ActiveX


Para aadir un control ActiveX al proyecto, pulse el componente ActiveX en la paleta de componentes. Pulse el puntero del ratn en el lugar de la ventana de diseo en el que desea colocar el componente ActiveX. Aparecer un dilogo Insertar objeto. Seleccione el control ActiveX con el que desea trabajar. Un control ActiveX puede contener propiedades, mtodos y eventos que un programador puede manipular, llamar y responder respectivamente. El trmino control ActiveX hace referencia al componente ActiveX real que se est utilizando. Ejemplos de ellos son un control de grfico, calendario u hoja de clculo. El trmino componente ActiveX hace referencia al componente ActiveX que se encuentra en la paleta de componentes de VARPG.

Establecimiento de propiedades
Puede establecer las propiedades de un control ActiveX en tiempo de construccin o ejecucin. Para establecer propiedades durante el tiempo de construccin, abra el cuaderno de propiedades del componente ActiveX en la ventana de diseo. Pulse con el botn derecho del ratn en el icono de ActiveX en la ventana de diseo y seleccione Propiedades. Si est disponible un editor de propiedades para el control ActiveX, tambin se visualizar. A continuacin, puede editar directamente los valores de las propiedades. Las propiedades, mtodos y eventos del control ActiveX aparecen en la pgina Informacin del cuaderno de propiedades del componente ActiveX. Seleccione el botn de seleccin apropiado para ver las opciones disponibles. El establecimiento u obtencin de una propiedad durante el tiempo de ejecucin requiere dos pasos. En primer lugar, establezca el atributo OCXProp del componente ActiveX en la propiedad Name del control ActiveX que est utilizando. Utilice el atributo OCXValue para establecer u obtener la propiedad. El siguiente ejemplo establece la propiedad Depth de un control de diagrama circular ActiveX:
C C 'PieChart' 'PieChart' Setatr Setatr 'Depth' DepthValue 'OCXProp' 'OCXValue'

Nota: El atributo OCXValue toma un valor de tipo serie. El tiempo de ejecucin de VisualAge RPG manejar las conversiones adecuadas antes de reenviar el valor al control ActiveX.

Captulo 7. Utilizacin de componentes

47

Llamada a mtodos
El IDE de VisualAge para RPG intenta compilar una lista de mtodos disponibles para el control ActiveX. Esta lista est disponible en la pgina Informacin del cuaderno de propiedades del componente ActiveX. Para cada mtodo, los parmetros se muestran entre corchetes que contienen IN para un parmetro de entrada, OUT para un parmetro de salida o nada si no se dispone de informacin. Nota: Quizs no sea posible para el constructor descubrir todos los mtodos disponibles del control ActiveX. Consulte la documentacin del control para obtener una lista completa. La llamada a los mtodos de un control ActiveX se realiza en tiempo de ejecucin estableciendo el atributo Method del componente ActiveX. El atributo Method toma un valor de tipo serie que contiene el nombre del mtodo, seguido de cero o ms valores de parmetro separados mediante una coma. La sintaxis es:
nombre_mtodo, valor1, valor2, ...

El siguiente ejemplo llama al mtodo AboutBox de un control de grfico circular ActiveX. El mtodo no utiliza parmetros.
C 'PieChart' Setatr 'AboutBox' 'Method'

El siguiente ejemplo llama al mtodo AddData de un control de grfico circular ActiveX. Este mtodo acepta dos parmetros: una etiqueta de tipo serie y un valor de tipo flotante.
D datax C 'PieChart' C Setatr datax const('AddData, ItemX, 3.0') 'Method'

48

Programacin con VisualAge RPG

Respuesta a eventos
VisualAge RPG puede responder a todos los eventos generados por el control ActiveX que se est utilizando. VisualAge para RPG acepta los eventos del control ActiveX como un OCXEvent. Puede utilizar el evento %RealName para recuperar el nombre real del evento. Para recibir un evento desde un control ActiveX, primero debe registrar el evento en el tiempo de ejecucin de VisualAge RPG. Establezca el atributo AddEvent del componente ActiveX en el nombre de tipo serie del evento que debe recibirse. Tambin puede establecer el atributo AddEvent en *ALL para recibir todos los eventos que genere el control ActiveX. Para eliminar el registro de un evento, establezca el atributo RmvEvent en el nombre de tipo serie del evento.
* Declarar el atributo del evento D %RealName s 20a C C C * Registrar el evento en el tiempo de ejecucin de VisualAge para RPG 'DataQ' Setatr 'Click' 'AddEvent'

* Responder a OCXEvent DATAQ BEGACT OCXEVENT FRA000000B if %RealName = 'Click' * Realizar las acciones oportunas C endif

Captulo 7. Utilizacin de componentes

49

Control de animacin

En las aplicaciones de Windows, el componente control de animacin reproduce los archivos de vdeo con la extensin AVI. Este componente se distingue del componente medios en que el vdeo se reproduce independientemente de la lgica del programa. Un uso habitual de este componente es visualizar un archivo AVI que muestre un progreso como, por ejemplo, un archivo que se traspasa de una carpeta a otra. El componente control de animacin reproduce archivos de vdeo sin sonido. El archivo AVI no puede estar en formato comprimido a menos que se haya comprimido con el mtodo RLE (Running-Length Encoded). En las aplicaciones Java, el componente control de animacin se utiliza para reproducir una secuencia de archivos GIF utilizando el atributo NbrOfImage. Atributos de componente |
FileName Mode PartType FrameRate NbrOfImage Top Handle* ParentName UserData Left PartName Visible

*Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Create Destroy

50

Programacin con VisualAge RPG

Calendario

El componente calendario representa un calendario por meses. Al efectuar una pulsacin sobre una de las flechas de los meses, el usuario puede navegar por el calendario y desplazarse al mes anterior o posterior. Tambin tiene un control del programa absoluto sobre el calendario para desplazarse hasta una fecha especfica, determinar qu fecha ha seleccionado el usuario y aadir breves comentarios de texto a das individuales en el calendario. Atributos de componente
Border ClearMonth ColorMix DateUnder DayNumPos FontArea FontSize Handle* Month OutlineRcl Refresh Top WeekDay YearIdx Bottom ClearYear Date Day DayNumRect FontBold FontStrike* Height MonthArrow ParentName ShowRects UserData WeekDayIdx YearLen ClearAll Color DateIdx DayIdx DayStart FontItalic FontUnder* HRule MonthIdx PartName ShowText Visible Width ClearDate ColorArea DateText DayLen Enabled FontName FrmtString Left MonthLen PartType TipText VRule Year

* Nota:: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Click MouseDown MouseUp Create MouseEnter MthChange Destroy MouseExit YearChange DblClick MouseMove

Determinar la fecha que el usuario ha seleccionado


El atributo DateUnder puede utilizarse para determinar sobre qu fecha se encuentra el puntero del ratn. En el siguiente ejemplo, la fecha se recupera cuando el usuario pulsa en el calendario. Fjese que estamos comprobando que el valor DateUnder no est en blanco. Esto es debido a que el evento click se produce sin importar donde se encuentra el ratn. Si el ratn no est encima de una fecha determinada, el atributo DateUnder estar en blanco. Fjese tambin que la fecha es devuelta como una cadena de caracteres en el formato AAAAMMDD:

Captulo 7. Utilizacin de componentes

51

C * C

'Cal1'

Getatr

'DateUnder'

AAAAMMDDA

* Si el ratn est sobre un da... If AAAAMMDDA <> *Blanks * * Ponga la fecha en nmeros C Move AAAAMMDDA AAAAMMDD * * Procese la fecha * ... * ... C EndIf *

8 0

Figura 13. Ejemplo del componente calendario

Utilizar atributos de ndice de fecha


Se proporcionan varios atributos que le permiten acceder al calendario sin afectar a lo que se est visualizando en ese momento. En este ejemplo, se aade un comentario a un da determinado del calendario.
* * Establezca ndice a la fecha para consulta C 'Cal1' Setatr '19971210' 'DateIdx' * * Establezca comentario del da C 'Cal1' Setatr 'Vacation' 'DateText' *

Figura 14. Aadir un comentario

52

Programacin con VisualAge RPG

Lienzo

Utilice el componente lienzo con una ventana o una pgina de cuaderno si desea incluir ms de un componente en la ventana o en la pgina. Puede colocar diversos componentes en el lienzo sealndolos y pulsando el botn del ratn y cambiarlos de posicin para crear una interfaz grfica de usuario. El componente lienzo ocupa el rea de cliente de una ventana o de una pgina de cuaderno. Si en la ventana o en la pgina de cuaderno no hay lienzo, slo puede colocar un componente en el rea de cliente, a menos que sean extensiones de la ventana, como barras de mens y subarchivos de mensajes. A menudo crear ventanas y pginas de cuaderno que contendrn ms de un componente. En este caso, deber utilizar la pgina de cuaderno y la ventana con el componente lienzo. De este modo se ahorrar un paso, ya que estos componentes ya contienen el lienzo. A la hora de construir, tambin puede incluir una imagen de bitmap a modo de fondo del lienzo; para ello, especifique el atributo FileName. Esta imagen puede ponerse en mosaico estableciendo el atributo Tile. En las aplicaciones Java, puede incluir imgenes GIF o JPG como fondo. Notas: 1. Los componentes lienzo, ventana (sin lienzo) y pgina de cuaderno (sin lienzo) se encuentran en el catlogo de componentes, no en la paleta de componentes. Si va a utilizarlos con frecuencia, puede trasladarlos del catlogo a la paleta de componentes. 2. Si los componentes situados en un componente lienzo tienen especificado el valor de font por omisin (Font del sistema por omisin), heredarn la definicin de font especificada en el componente lienzo. Para aplicar un font determinado a la mayor parte de componentes de un lienzo, especifique ese font en el componente lienzo en lugar de hacerlo en cada componente individual. Para obtener informacin relacionada, consulte el apartado: v Ventana en la pgina 175 v Ventana con lienzo en la pgina 176 v Pgina de cuaderno en la pgina 116 v Pgina de cuaderno con lienzo en la pgina 117.

Captulo 7. Utilizacin de componentes

53

Atributos de componente
BackColor FileName FontSize Height PartType Top* BackMix FontBold FontStrike* Left ReadOnly UserData Bottom* FontItalic FontUnder* ParentName Refresh Width Enabled FontName Handle* PartName Tile

* Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Click MouseDown Create MouseMove DblClick MouseUp Destroy Popup

54

Programacin con VisualAge RPG

Recuadro de seleccin

Utilice el componente recuadro de seleccin si desea que el usuario elija entre dos estados claramente diferenciados; por ejemplo, activado y desactivado. Una etiqueta asociada con el recuadro de seleccin describe el valor del mismo cuando se selecciona. Normalmente, se utiliza un grupo de recuadros de seleccin para proporcionar una lista de opciones. El usuario puede seleccionar uno, varios o ningn recuadro. Las opciones no se excluyen mutuamente; por lo tanto, al marcar un recuadro de seleccin, el resto de recuadros de seleccin de la ventana no resulta afectado. Si desea que el usuario pueda seleccionar slo una opcin de un grupo de dos o ms, es necesario utilizar botones de seleccin. Consulte el apartado Botn de seleccin en la pgina 136 para obtener ms informacin. Para definir el estado de un recuadro de seleccin, el usuario puede pulsar el botn del ratn en el mismo, pulsar la barra espaciadora cuando el recuadro tenga el foco o pulsar la tecla correspondiente al nemotcnico (si le ha asignado una). Atributos de componente
AddLink* Bottom FontBold FontStrike* Handle* Left Refresh Top AllowLink* Checked FontItalic FontUnder* Height ParentName RemoveLink* UserData BackColor Enabled FontName ForeColor Highlight* PartName ShowTips Visible BackMix Focus FontSize ForeMix Label PartType TipText Width

*Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Create MouseMove Destroy Popup MouseEnter Select MouseExit

Captulo 7. Utilizacin de componentes

55

Establecimiento del estado de un componente recuadro de seleccin


Establezca el atributo Checked en uno de los siguientes valores para describir el estado del recuadro de seleccin: 1 0 El recuadro de seleccin est establecido y el estado es activado. El recuadro de seleccin no est establecido y el estado es desactivado.

El recuadro de seleccin contiene una marca de seleccin cuando su estado es activado.

Establecimiento de un nemotcnico
Nota: Los nemotcnicos no estn soportados en las aplicaciones Java. Para especificar una clave nemotcnica para el recuadro de seleccin, coloque el identificador nemotcnico delante de un carcter en la etiqueta del recuadro de comprobacin. En Windows NT/95/98, se utiliza el smbolo &. Este carcter es la clave nemotcnica y se visualizar en la interfaz con un subrayado (por ejemplo, Visible). El subrayado informa a los usuarios que pueden seleccionar el recuadro de seleccin pulsando la tecla subrayada en el teclado.

Sealizacin de eventos
Cuando el usuario selecciona un recuadro de seleccin para activar o desactivar el estado, se seala un evento Select.

56

Programacin con VisualAge RPG

Recuadro de combinacin

Un recuadro de combinacin ofrece al usuario la opcin de escribir informacin especfica o de seleccionarla en una lista de opciones utilizadas con frecuencia. Consiste en un campo de entrada con un recuadro de lista asociado que presenta una lista de valores que el usuario puede seleccionar. Si el usuario selecciona uno de estos valores, el valor aparecer en el campo de entrada y sustituir al texto que hubiese previamente. Tambin puede escribir un valor, que no ha de coincidir con ninguno de los que estn en la lista, directamente en el campo de entrada. Los recuadros de combinacin tienen diferentes estilos. Puede seleccionar el estilo que desee en el cuaderno de propiedades del componente. Para obtener informacin relacionada, consulte los apartados: v Recuadro de lista en la pgina 90 v Campo de entrada en la pgina 72 Atributos de componente
AddItemEnd Bottom DeSelect* FieldExit FontItalic FontUnder* Handle* ItemKey PartType Search* Sequence* SizeToFit* UseDelim AutoScroll* Case* DragEnable* FirstSel FontName ForeColor Height Left ReadOnly SearchType* SetItem Text UserData BackColor Count DropEnable* Focus FontSize ForeMix Index ParentName Refresh Selected SetTop* TipText Visible BackMix DelimChar Enabled FontBold FontStrike* GetItem InsertItem* PartName RemoveItem SelectItem Showtips Top Width

*Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones.

Captulo 7. Utilizacin de componentes

57

Eventos a los que puede aplicarse


Change DropDown* LostFocus Popup Create Enter MouseEnter Select Destroy GotFocus MouseExit VKeyPress Drop* KeyPress MouseMove

*Nota: Consulte la descripcin del evento si desea saber cules son las restricciones.

Seleccin del tipo de recuadro de combinacin


En el cuaderno de propiedades del recuadro de combinacin, puede elegir el tipo de recuadro de combinacin que desea crear: Recuadro de combinacin Visualiza la parte de campo de entrada y la parte de recuadro de lista del recuadro de combinacin. Recuadro de combinacin desplegable Visualiza la parte de campo de entrada. La parte de recuadro de lista est oculta hasta que se pulsa la flecha hacia abajo (). Recuadro de combinacin de lista desplegable Visualiza la parte de campo de entrada. La parte de recuadro de lista est oculta hasta que se pulsa la flecha hacia abajo (). El campo de entrada no acepta texto; slo se utiliza para visualizar la seleccin de la parte del recuadro de lista. Nota: Todos los tipos de recuadros de combinacin soportan la operacin arrastrar desde la parte de campo de entrada. Slo el recuadro de combinacin simple soporta la operacin arrastrar desde la parte de recuadro de lista. Todos los tipos soportan la operacin soltar elementos en la parte de campo de entrada, no en la parte de recuadro de lista.

Adicin y establecimiento de la secuencia inicial de elementos


Puede utilizar el cuaderno de propiedades del recuadro de combinacin para colocar una lista inicial de elementos en un recuadro de combinacin en el momento del diseo. Por omisin, los elementos se visualizan en el recuadro de combinacin en el orden en que se aaden. Si desea que se visualicen siguiendo un orden ms preciso, establezca el atributo Sequence en ascendente, descendente o ndice, antes de aadirlos. Con ello, los elementos se ordenan segn la secuencia de clasificacin ASCII a medida que se van aadiendo. No puede utilizar el atributo Sequence para cambiar el orden de los elementos que ya estn en el recuadro de combinacin.

Adicin de elementos en tiempo de ejecucin


Puede insertar elementos en un recuadro de combinacin en tiempo de ejecucin mediante el atributo InsertItem. El orden en que los elementos se visualizan se determina mediante el atributo Sequence.

58

Programacin con VisualAge RPG

Actualizacin de elementos de una lista


Puede actualizar elementos que ya estn en la lista. Utilice el atributo Index para indicar qu elemento desea cambiar y el atributo SetItem para especificar los datos modificados. Nota: El atributo SetItem vuelve a situar un elemento en su ubicacin original en una lista, sin importar el valor que se establezca en el atributo Sequence. Por ejemplo, si establece el atributo Sequence en orden ascendente antes de rellenar el recuadro de combinacin, los elementos aparecen en el recuadro de combinacin en orden ascendente; sin embargo, si a continuacin recupera un elemento, cambia su valor y utiliza el atributo SetItem para sustituirlo en el recuadro de combinacin, el elemento se inserta en la misma posicin que ocupaba anteriormente. Por consiguiente, la lista puede estar o no en orden ascendente despus del cambio.

Establecimiento del principio de la lista


Utilice el atributo SetTop para especificar qu elemento la de lista debe aparecer en la parte superior del recuadro de combinacin. El establecimiento de este elemento no reordena los elementos en la lista; desplaza la lista de manera que el elemento que se selecciona se visualiza al principio de la lista, seguido de los elementos que vienen despus.

Eliminacin de elementos
Utilice el atributo RemoveItem y el valor Index del elemento que desea eliminar. Los valores de Index comienzan en el 1. Cuando se elimina un elemento de la lista, todos los elementos que siguen al elemento eliminado ascienden una posicin en la lista. Si desea eliminar todos los elementos de la lista, especifique el valor 0 en Index.

Seleccin y deseleccin de elementos


El usuario puede seleccionar y deseleccionar elementos utilizando el ratn o el teclado. Puede seleccionar y deseleccionar elementos utilizando los atributos Selected y DeSelect en el programa. Antes de utilizar estos atributos, establezca el atributo Index.

Recuperacin de un elemento seleccionado por usuario


Cuando un usuario selecciona un elemento de la lista en un recuadro de combinacin, el elemento se coloca en el campo de entrada. Puede utilizar el atributo Text para obtener el elemento. Adems, puede utilizar el atributo FirstSel para determinar el ndice del elemento que se ha seleccionado.

Captulo 7. Utilizacin de componentes

59

El usuario tambin puede escribir un valor en la parte de campo de entrada del recuadro de combinacin. Este valor no tiene que ser necesariamente uno de los valores de la lista. Si desea que el usuario pueda seleccionar slo aquellos elementos que estn en la lista, establezca el valor 0 en el atributo ReadOnly. Puede utilizar el atributo Count para determinar si hay elementos que recuperar.

Utilizacin de claves
Tanto el recuadro de lista como el recuadro de combinacin le permiten aadir elementos a la lista que constan de una parte clave y de una parte de datos. Cuando se aaden elementos a la lista, slo se visualiza la parte de datos del elemento. Si el usuario selecciona un elemento, podr recuperar mediante el programa la parte clave del elemento. Para habilitar las claves de una lista, deber seleccionar el recuadro de seleccin Utilizar separador en la pgina Separador del cuaderno de valores de los componentes y especificar un carcter separador. El carcter separador por omisin es el punto y coma (;). Los elementos de la lista constan de la parte clave, seguida de un separador, seguida de la parte de datos. Por ejemplo:
01;Envo

Como ejemplo, supongamos que desea mostrar una lista de departamentos en una lista que permita al usuario hacer una seleccin. En la base de datos, almacenar los departamentos como un campo de 2 caracteres, sin embargo quiere que el usuario pueda ver la descripcin. Deber aadir los siguientes datos a la lista: v 01;Envo v 02;Fabricacin v 03;Nminas v 04;Distribucin Nota: Con el recuadro de combinacin podr aadir la lista por omisin en la pgina Datos de su cuaderno de valores. Cuando el usuario hace una seleccin de la lista, podr utilizar el siguiente cdigo para obtener la parte clave del elemento.
C C C 'Combo1' 'Combo1' 'Combo1' Getatr Setatr Getatr 'FirstSel' X 'ItemKey' X 'Index' Key 2 0

60

Programacin con VisualAge RPG

Establecimiento del texto del campo de entrada


Cuando un recuadro de combinacin se visualiza por primera vez, el campo de entrada est en blanco. Si desea colocar uno de los elementos de lista en el campo de entrada, defina el valor del atributo SelectItem como el ndice del elemento que se va a utilizar.

Sealizacin de eventos
El evento Select se seala cuando: v Un usuario selecciona un elemento que est en un recuadro de combinacin. v Se selecciona un elemento de la lista en el programa. v El usuario selecciona un elemento que ya ha sido seleccionado. El evento Enter se seala cuando: v El usuario efecta una doble pulsacin sobre un elemento que est en el recuadro de combinacin. v Se pulsa la tecla Intro cuando el recuadro de lista tiene el foco y se ha seleccionado un elemento. En la subrutina de accin de estos eventos, puede utilizar el atributo Selected para determinar qu elemento se ha seleccionado.

Captulo 7. Utilizacin de componentes

61

Referencia a componente lgico

El componente referencia a componente lgico permite que un componente lgico de VARPG se comunique con otro. Utilice el componente referencia a componente lgico para afectar a un componente del otro componente lgico. El componente lgico al que se hace referencia debe estar ejecutndose en la misma aplicacin que el componente referencia a componente lgico. El componente referencia a componente lgico tambin supervisa un evento especificado en el otro componente lgico. Cuando se produce el evento supervisado, el componente referencia a componente lgico seala un evento Notify. Atributos de componente |
AddSrcEvt Left ParentName RefParent Visible AttrValue NotSrcEvt PartName RefPart Bottom NotSrcPart PartType RmvSrcEvt CompName NotSrcWin RefAttr UserData

Eventos a los que puede aplicarse


Create Destroy Notify

Referencia a atributos de componente en otros componentes lgicos


Hay dos mtodos que puede utilizar para hacer referencia a un atributo de un componente en otro componente lgico: 1. Definir el atributo en el cuaderno propiedades del componente referencia a componente lgico. 2. Establecer los atributos de componente referencia a componente lgico en tiempo de ejecucin. Para poder hacer referencia a atributos de componente en otro componente lgico, debe asegurarse de que est ejecutndose el otro componente lgico. Utilice el cdigo de operacin START para iniciar otro componente lgico. El siguiente fragmento de cdigo muestra cmo un componente referencia a componente lgico en un componente lgico puede cambiar el valor de un atributo de componente en otro componente lgico. En este ejemplo, el atributo FileName de un componente imagen (IMG1) en la ventana WIN01 del componente lgico COMPB se actualiza con un nuevo valor.

62

Programacin con VisualAge RPG

* * Cambiar el bitmap para el componente imagen IMG1 en * la ventana WIN01 del componente lgico COMPB C 'CR1' Setatr 'COMPB' 'CompName' C 'CR1' Setatr 'WIN01' 'RefParent' C 'CR1' Setatr 'IMG1' 'RefPart' C 'CR1' Setatr 'FILENAME' 'RefAttr' C 'CR1' Setatr 'D:\PIC.BMP' 'AttrValue' *

Supervisin de eventos en otro componente lgico


Puede utilizar el componente referencia a componente lgico en un componente lgico para supervisar un evento que se produce en otro componente lgico que se ejecuta en la misma aplicacin. Defina el evento a supervisar en el cuaderno de propiedades del componente referencia a componente lgico, o en tiempo de ejecucin estableciendo los atributos adecuados. Cuando se produce el evento que est supervisndose en el otro componente lgico, el componente referencia a componente lgico seala un evento Notify. El siguiente fragmento de cdigo muestra cmo puede establecerse en tiempo de ejecucin un componente referencia a componente lgico para un evento en otro componente lgico. En este ejemplo, el evento que est supervisndose es el evento Press para un pulsador denominado PB1 en la ventana WIN01 del componente lgico COMPB.
* * Supervisar el evento PRESS del pulsador * PB1 de la ventana WIN01 del componente COMPB C 'CR1' Setatr 'COMPB' 'CompName' C 'CR1' Setatr 'PRESS' 'NotSrcEvt' C 'CR1' Setatr 'PB1' 'NotSrcPart' C 'CR1' Setatr 'WIN01' 'NotSrcWin' *

Captulo 7. Utilizacin de componentes

63

Contenedor

Utilice el componente contenedor para almacenar registros relacionados. Los registros se pueden mostrar en una vista de iconos, de rbol, de rbol de texto o de detalles. Atributos de componente
AddRcd BlankChar Collapsed EditItem Focus FontSize ForeMix GetRcdText Label ParentList ReadOnly Selected SetRcdText SortDesc View* Width Arrange Bottom ColNumber Enabled FontBold FontStrike* GetNewID Handle* Left ParentName RecordID SelectRcd SetTop* TipText Visible BackColor ChildCount Count ExtSelect* FontItalic FontUnder* GetRcdFld Height MiniIcon PartName Refresh SetRcdFld ShowTips Top VisTitle BackMix ChildList DeSelect FirstSel FontName ForeColor GetRcdIcon InUse* ParentId PartType RemoveRcd SetRcdIcon SortAsc UserData VisTitlSep

*Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Click DblClick GotFocus MouseEnter Popup Collapsed Destroy KeyPress MouseExit Select ColSelect Enter LostFocus MouseMove VKeyPress Create Expanded MouseDown MouseUp

Adicin de columnas a un contenedor


En una vista de detalle, un registro corresponde a una fila en el componente contenedor, y cada columna en esa fila corresponde a un campo en ese registro. Antes de aadir un registro a un contenedor, debe aadir las columnas necesarias para visualizar los campos mediante el cuaderno de propiedades del componente contenedor. Tiene que especificar cul de los siguientes cuatro tipos de columnas desea crear: Texto de objeto Una columna de texto de objeto visualiza el texto descriptivo que se especifica cuando se crea el registro. Puede cambiar el texto en tiempo de ejecucin con el atributo SetRcdText. Los usuarios pueden cambiar este

64

Programacin con VisualAge RPG

texto en tiempo de ejecucin pulsando la tecla Alt y seleccionando el campo con el ratn. Para obtener el valor de esta columna, utilice el atributo GetRcdText. Icono de objeto Una columna de icono de objeto visualiza el archivo de icono que se especifica cuando se crea el registro. Puede cambiar el nombre de archivo de icono en tiempo de ejecucin mediante el atributo SetRcdIcon. Texto El texto es una serie que contiene informacin adicional. Una columna de texto puede contener cualquier serie de caracteres. El texto no puede contener espacios en blanco. Si desea que aparezca un blanco en tiempo de ejecucin, utilice en la serie el carcter de subrayado ( _ ). Utilice el atributo SetRcdFld para cambiar este texto en tiempo de ejecucin. Los usuarios pueden cambiar el texto en tiempo de ejecucin pulsando la tecla Alt y seleccionando el campo con el ratn. Para obtener el valor de esta columna, utilice el atributo GetRcdFld. Un icono muestra informacin de registro grfico adicional. Una columna de icono visualiza un archivo de icono. Utilice SetRcdIcon para cambiar el nombre del archivo de icono en tiempo de ejecucin.

Icono

Puede aadir un mximo de veinte columnas a un componente contenedor. De ellas, quince como mximo pueden ser una combinacin de texto de objeto y de columnas de texto, y cinco como mximo pueden ser de icono de objeto y de icono. Tenga en cuenta que, en Windows, slo la primera columna puede contener un icono. El nmero de columnas y de tipos de columna no puede cambiarse en tiempo de ejecucin. Si aade registros que tienen ms campos que el nmero de columnas en el contenedor, se pasan por alto los campos extra.

Adicin de registros a un contenedor


En el cdigo, utilice el atributo AddRcd para aadir registros a un contenedor. Este atributo es una serie que consta de lo siguiente:
ID Texto NombreArchivo IDPadre {datos_campo datos_campo ...}

Los blancos se utilizan como delimitadores. Los parmetros son: ID Un valor numrico exclusivo que se da a un registro. Este nmero debe ser mayor que cero. Para asegurarse de que se asigna un ID exclusivo a cada registro que se cree, utilice el atributo GetNewID. El texto que se visualiza con el icono de objeto. Puede cambiarse en tiempo de ejecucin mediante el atributo SetRcdText.

Texto

FileName El nombre de un archivo que contiene la imagen de icono para una columna de icono de objeto. Este icono se visualiza en las vistas de iconos y de rbol del contenedor. Puede cambiar el nombre de archivo de icono en tiempo de ejecucin mediante el atributo SetRcdIcon. ParentID El ID exclusivo del registro bajo el que aparecer este registro. Si este registro no tiene un registro padre, coloque un 0 en este campo. Datos_campo Informacin adicional para un registro que se visualiza en una columna de texto o de icono. Cada valor de datos_campo actualiza la columna
Captulo 7. Utilizacin de componentes

65

correspondiente en el componente contenedor. Si desea tener una columna de contenedor de icono o de texto vaca, debe especificar un subrayado ( _ ) en el parmetro datos_campo. El siguiente fragmento de cdigo muestra los parmetros que se especifican para aadir un registro de ejemplo a un contenedor. En este ejemplo no se aaden datos de columna. Utilice el atributo Count para determinar cuntos registros hay en un contenedor.
* * No es un registro hijo C Eval Parent = '0' * * Utilizar texto de icono especificado en Diseador GUI C Eval IconText = '_' * * Establecer nombre de archivo de icono a utilizar para este registro C Eval IconFile = '.\\TOM.ICO' * * Obtener nuevo ID de registro de contenedor y hacerlo de caracteres C 'CT1' Getatr 'GetNewId' NextIDN 6 0 C Move NextIDN NextID 6 * * Crear estructura de registro de contenedor C Eval NextRcd = NextID + ' ' + C IconText + ' ' + C IconFile + ' ' + C Parent * * Aadir el registro al contenedor C 'CT1' Setatr NextRcd 'AddRcd' *

Actualizacin de columnas de contenedor


Una vez que un registro se ha aadido a un contenedor, se visualizan los datos de los campos de registro en las columnas correspondientes del contenedor. Puede actualizar datos en columnas de texto de contenedor individuales actualizando los campos de registro. Nota: Puede actualizar slo los datos en las columnas; no puede cambiar el nmero de columnas en el contenedor. El nmero de columnas se establece al crear el contenedor en el Diseador GUI. Para actualizar una columna, establezca el atributo RecordID en el registro que corresponde a esa columna, y establezca el atributo ColNumber en el campo en aquel registro que contiene los datos actualizados. El siguiente fragmento de cdigo muestra cmo actualizar la tercera columna en un contenedor:
* * Establecer id de registro al que hacer referencia C 'CT1' Setatr NextIDN 'RecordID' * * Hacer referencia a tercera columna del registro C 'CT1' Setatr 3 'ColNumber' * * Actualizar la columna con los nuevos datos C 'CT1' Setatr 'Larry' 'SetRcdFld' *

66

Programacin con VisualAge RPG

Si desea que el nuevo valor de columna contenga blancos intercalados, utilice el carcter de subrayado para representar cada blanco. Los caracteres de subrayado se sustituyen por blancos cuando se actualiza la columna. Por ejemplo:
* * 'New data' se establece en la columna C 'CT1' Setatr 'New_data' *

'SetRcdFld'

Utilice el atributo GetRcdFld para recuperar el contenido de un campo de registro. Establezca el atributo RecordID en el ID exclusivo del registro y el atributo ColNumber en el nmero de columna deseado.

Eliminacin de registros de un contenedor


Utilice el atributo RemoveRcd para eliminar registros de un componente contenedor y para eliminar el ID de registro que identifica ese registro de manera exclusiva. Para eliminar todos los registros del contenedor, establezca el valor cero en el ID de registro. El siguiente fragmento de cdigo muestra cmo se elimina un registro de un contenedor:
* * Obtener ID del primer registro seleccionado C 'CT1' Getatr 'FirstSel' TmpID 6 0 * * Si se ha seleccionado un registro, eliminarlo del contenedor C If TmpID <> 0 C 'CT1' Setatr TmpID 'RemoveRcd' C EndIf *

Cambio de la vista de contenedor


Para cambiar la vista, utilice el atributo View. El componente contenedor puede visualizar las siguientes vistas de los datos: iconos, rbol de iconos, rbol de texto y detalles.

Vista de iconos
En una vista de iconos, cada registro se representa mediante un icono con texto por debajo. Los registros hijos no se visualizan en la vista de iconos. Debe especificar el nombre de archivo de icono y el texto descriptivo en la estructura de registro cuando aada el registro al contenedor. Puede cambiar el icono y el texto de icono en tiempo de ejecucin utilizando los atributos SetRcdIcon y SetRcdText. Para visualizar los iconos en filas en el contenedor, establezca el valor 1 en el atributo Arrange. Para utilizar mini iconos, establezca el atributo MiniIcon en 1 o seleccione el recuadro Mini icono de la pgina Estilo del cuaderno de propiedades.

Captulo 7. Utilizacin de componentes

67

Figura 15. Ejemplo de vista de iconos

Vista de rbol
En una vista de rbol, los registros se presentan en forma jerrquica. La vista rbol de iconos muestra cada registro con su icono y el texto de icono a su lado. Si un registro tiene registros hijos, se visualiza un signo ms junto al icono. Al seleccionar el signo ms se muestran todos los registros relativos a este registro. El rbol de texto muestra registros de la misma forma que la vista de rbol de iconos, pero slo en modalidad de texto, sin iconos. Se dibujan lneas de conexin entre registros relacionados para mostrar su relacin.

68

Programacin con VisualAge RPG

Figura 16. Ejemplo de vista de rbol

Vista de detalles
En una vista de detalles, los registros se muestran de uno en uno visualizndose cada columna (de manera similar a un subarchivo). Los registros hijos no se visualizan en este tipo de vista.

Captulo 7. Utilizacin de componentes

69

Figura 17. Ejemplo de vista de detalles

Si el contenedor no es lo bastante grande para visualizar todos los registros a la vez, se aaden automticamente barras de desplazamiento. Para cambiar la vista, utilice el atributo View.

Miniiconos
Esta opcin permite al programador especificar si los iconos que hay dentro del componente contenedor se visualizarn como iconos normales o mini. Slo afecta a la vista de iconos; las vistas de rbol y de detalles no sufrirn cambio alguno.

70

Programacin con VisualAge RPG

Cliente DDE

* Restriccin: Este componente no est soportado en las aplicaciones Java. Utilice el componente cliente DDE para intercambiar datos con otras aplicaciones (por ejemplo, hojas de clculo), que den soporte al protocolo de intercambio dinmico de datos (DDE). Este intercambio recibe el nombre de conversacin DDE. La aplicacin que inicia la conversacin es el cliente y la aplicacin que responde es el servidor. Para determinar si una aplicacin da soporte a DDE, consulte la documentacin que se ha entregado con ella. El componente cliente DDE da soporte a las conversaciones de enlace esttico y enlace dinmico. Una conversacin de enlace esttico consta de un programa cliente que realiza peticiones explcitas al programa servidor. Una conversacin de enlace dinmico consta de un programa servidor que actualiza automticamente el programa cliente cuando se modifican sus datos. Puede configurar conversaciones de enlace esttico o dinmico en el cuaderno de propiedades del componente cliente DDE y en la lgica del programa. Atributos de componente
AppName DDERmvLink Left Poke Topic Bottom Execute ParentName Request UserData DDEAddLink Format PartName TimeOut Visible DDEMode Item PartType Top

Eventos a los que puede aplicarse


Create PokeAck Data Terminate Destroy TimeOut ExecuteAck

Captulo 7. Utilizacin de componentes

71

Campo de entrada

Utilice el componente campo de entrada si desea que el usuario pueda especificar valores que no se pueden predecir. Un campo de entrada es un rea en la que el usuario puede escribir o colocar texto. Sus lmites suelen estar indicados. El usuario puede desplazarse por el texto del campo de entrada si hay ms informacin disponible de la que resulta visible. Puede configurar el componente campo de entrada para que acepte datos de tipo carcter, numricos o de doble byte (DBCS). Tambin puede hacer que el campo de entrada sea de slo lectura, para que el usuario no pueda modificar la informacin que contiene directamente. Puede sealar y pulsar un componente campo de entrada en la paleta de componentes y despus pulsar el botn del ratn en el componente subarchivo para crear un campo de entrada de subarchivo. Atributos de componente
AddLink* AutoSelect CapsLock DataType Enabled FontItalic FontUnder* Height ParentName ReadOnly Text TextStart Visible Alignment BackColor Copy Delete FieldExit FontName ForeColor InsertMode* PartName Refresh TextEnd TipText Width AllowLink* BackMix CsrAtEnd DragEnable* Focus FontSize ForeMix Left PartType RemoveLink* TextLength Top AutoScroll* Bottom Cut DropEnable* FontBold FontStrike* Handle* Masked Paste ShowTips TextSelect UserData

*Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones.

72

Programacin con VisualAge RPG

Eventos a los que puede aplicarse


Change Destroy Link* MouseExit VKeyPress Click Drop LostFocus MouseMove Create GotFocus MouseDown MouseUp DblClick KeyPress MouseEnter Popup

*Nota: Consulte la descripcin del evento si desea saber cules son las restricciones.

Utilizacin del atributo InsertMode


En Windows la modalidad de insercin siempre est activada. No puede desactivarse.

Utilizacin del atributo Text


Utilice el atributo Text para obtener o establecer el valor de un campo de entrada. El campo que se utiliza para obtener o establecer el valor de un campo de entrada debe definirse como del mismo tipo que el campo de entrada. Por ejemplo, si est obteniendo el valor de un campo de entrada numrico, el campo que recibe el valor tambin debe definirse como numrico.

Obtencin y establecimiento de informacin para una ventana


Durante la compilacin, el compilador define de manera implcita los campos del programa con el mismo nombre que el componente campo de entrada y con el mismo tipo de datos y longitud. Mediante los cdigos de operacin READ y WRITE con un nombre de ventana especificado en el factor 2, el valor del atributo Text se copia automticamente en estos campos o desde ellos. Los cdigos de operacin READ y WRITE son muy tiles si se tienen muchos campos de entrada en la interfaz de usuario, para que no se tenga que establecer los atributos y obtener un valor de forma repetitiva. Consulte el Captulo 3. Programacin con componentes en la pgina 25 si desea ms informacin.

Comprobacin de validez
Puede utilizar el cuaderno de propiedades para especificar que un campo de entrada slo debe aceptar los datos que satisfagan los criterios que especifique. Para asegurar que los datos coinciden con ciertos valores, establezca los valores de Compare. Para asegurar que los datos estn comprendidos en un intervalo de valores predefinidos, establezca los valores de Range. Nota: VisualAge RPG utiliza el orden de clasificacin ASCII para la comprobacin de validez. En esto difiere del sistema AS/400, que utiliza el orden de clasificacin EBCDIC. Por consiguiente, los resultados pueden variar entre los sistemas. Para que se realice la comprobacin de validez, debe tener por lo menos un pulsador o un pulsador grfico en la ventana que tenga establecido el atributo Validate. Cuando se acciona el pulsador, se realiza la comprobacin de validez para cada campo de entrada que tenga definida la comprobacin de validez. Si la comprobacin de validez es anmala en algn campo de entrada, se visualiza una ventana de mensaje y no se seala ningn evento de pulsar en el programa.
Captulo 7. Utilizacin de componentes

73

Tambin puede utilizar el campo que hay en la parte superior del cuaderno de propiedades para establecer el mensaje que se visualizar si falla la comprobacin de validez. Entre el texto del mensaje que ha de visualizarse o bien el nombre del archivo de mensajes (como, por ejemplo, *MSG0001) que contiene el mensaje correspondiente. Si se deja en blanco este texto, cuando falle la comprobacin de validez se visualizar el mensaje por omisin del sistema. Nota: Este campo tiene un lmite mximo de 15 caracteres.

Cmo evitar la entrada de datos por parte del usuario


Para evitar que el usuario entre datos en el campo de entrada, realice una de las acciones siguientes: v Establezca el valor 1 en el atributo ReadOnly. Despus de establecerlo, todava puede cambiar el valor del campo de entrada en el programa. v Establezca el valor 0 en el atributo Enabled. Despus de establecerlo, el campo de entrada no responde a eventos y el usuario no puede acceder al campo con el tabulador.

Enmascarado de los datos confidenciales


Si el campo de entrada contiene datos confidenciales, como por ejemplo, una contrasea o un nmero de cuenta, establezca el valor 1 en el atributo Masked. Una vez establecido, el carcter asterisco ( * ) aparece en el campo de entrada por cada carcter que se escribe. Los datos reales que se leen en el campo de entrada no se ven afectados por ello.

74

Programacin con VisualAge RPG

Grfica

El componente grfica le permite crear y disear un grfico en el proyecto. Durante la ejecucin podr enviar datos al grfico y modificar los atributos de grfico y el tipo de grfico. El componente grfica da soporte a los tipos de grfica circular, de lneas, de barras y de lneas y barras. Los tipos de grfica de barras y de lneas permiten utilizar el control de texto ToolTip. Si est habilitado, al mover el ratn sobre un punto de datos se visualiza el control de texto de ayuda flotante. Para utilizar este soporte en la lgica del programa, debe establecer el valor del punto en el atributo TipText y activar el atributo ShowTips para la ventana que contiene el componente grfica. Atributos de componente
AutoInc ColorArea DataValue FontBold FontStrike* GraphType Height Left PartType Title UseData XAxisLabel BarLabel ColorMix Enabled FontItalic FontUnder* GroupLabel HitItem* LegendType Refresh TitlePlace UserData YAxisLabel Bottom DataGroup FillStyle* FontName GnEqGrpCol GrphHiLite HlitPoints* ParentName StartNew Top Visible YInc Color DataPoint FontArea FontSize GnEqPntCol Handle* LabelPlace PartName TipText UnderPoint* Width

*Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Click MouseDown MouseUp Create MouseEnter Destroy MouseExit DblClick MouseMove

Enviar datos al grfico


Antes de enviar datos al grfico deber indicar qu DataGroup y qu DataPoint va a recibir el valor. El atributo DataPoint representa el elemento posicional del grfico que representa el valor. En un grfico de barras, ser una barra. En un grfico de lneas, un punto, y en un grfico circular, una de las porciones. El atributo DataGroup es opcional. Este atributo indicar que existen grupos de datos para transformar en grficos. El valor por omisin de DataGroup es uno. Al establecer el atributo DataValue se establece el valor del elemento seleccionado. Como ejemplo de un atributo DataGroup, supongamos que desea trazar las temperaturas mxima y mnima de cada mes de un ao determinado. Este grfico tendra dos grupos de datos. El primero representara la temperatura mnima de un mes y el segundo la temperatura mxima de ese mes. Por lo que al grfico se refiere, en primer lugar establezca el atributo DataGroup en 1. A continuacin, en
Captulo 7. Utilizacin de componentes

75

un bucle, establezca el DataValue de todos los DataPoint en el valor de la temperatura mnima. Para completar el grfico repita los mismos pasos para las temperaturas mximas estableciendo DataGroup en 2. Enviar datos al grfico no lo actualiza. Deber establecer el atributo UseData para visualizar los datos. El siguiente fragmento de cdigo muestra cmo hacerlo:
C C C C C C C C C C C C * * * * 'Graph1' 'Graph1' 'Graph1' 'Graph1' * * * 'Graph1' Do Setatr Do Setatr If Setatr Else Setatr Endif EndDo EndDo Setatr 1 'UseData' 2 Group 12 Point Group = 1 Low(Point) High(Point) Group 'DataGroup' Point 'DataPoint' 'DataValue' 'DataValue' 2 0 2 0

Figura 18. Enviar datos al grfico

Si se trata de un grfico circular, cada grupo est representado en crculos distintos.

76

Programacin con VisualAge RPG

Pulsador grfico

Utilice pulsadores grficos para proporcionar un acceso fcil a las acciones utilizadas con frecuencia. El pulsador grfico proporciona la misma funcin que un pulsador. Indica una accin que se iniciar cuando el usuario lo seleccione, pero en lugar de visualizar una etiqueta que describa su funcin, muestra una imagen. El atributo FileName especifica el nombre de la imagen que debe utilizarse. Los formatos vlidos de imgenes de Windows son: v Bitmaps de Windows y OS/2 (BMP, VGA, BGA, RLE, DIB, RL4, RL8) v Icono (ICO) v TIF, TIFF (Formato de Archivo de Imagen Codificada) de Microsoft/Aldus v GIF (Formato de Intercambio de Grficos) de CompuServe v PCX (Formato de Archivo de Imagen) de ZSoft PC Paintbrush v TGA, VST, AFI (Bitmap Targa/Vista) de Truevision v IFF, ILBM (Formato de Bitmap Intercalado) de Amiga v XBM (Bitmap) de X Windows v PSE, PSEG, PSEG38PP, PSEG3820 (Segmento de Pgina de Impresora) de IBM Los formatos vlidos de imgenes Java son: v GIF (Formato de Intercambio de Grficos) de CompuServe v Formato Joint Photographic Experts Group (JPG, JPEG) Para obtener informacin relacionada, consulte el apartado Pulsador en la pgina 134.

Captulo 7. Utilizacin de componentes

77

Atributos de componente
Bottom Handle* Left Refresh UserData Enabled Height ParentName ShowTips Validate FileName HelpEnable PartName TipText Visible Focus HighLight PartType Top Width

* Nota:: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Create MouseEnter Press Destroy MouseExit GotFocus MouseMove LostFocus Popup

Definicin de la imagen
Para definir la imagen que se visualiza en un pulsador grfico, utilice el atributo FileName y especifique un nombre de archivo de bitmap (.BMP) o de icono (.ICO) vlido. Debe almacenar los archivos de icono y de bitmap especficos del sistema en el directorio de tiempo de ejecucin adecuado. Si desea ms informacin, consulte Captulo 12. Utilizacin de archivos de imgenes, de sonido y de vdeo en la pgina 233.

Asignacin de teclas de mandato


Puede asignar una tecla de mandato a un pulsador grfico. Para hacerlo, abra el cuaderno de propiedades y seleccione una de las teclas de mandato de la lista disponible. Cuando el usuario pulsa la tecla de mandato en tiempo de ejecucin, tiene el mismo efecto que si hubiese pulsado el botn de ratn o una tecla en el teclado. Un evento Press se seala en el programa.

Sealizacin de eventos
Cuando se acciona el pulsador, se seala un evento Press en el programa.

78

Programacin con VisualAge RPG

Recuadro de grupo

Utilice un recuadro de grupo para distinguir visualmente un grupo de componentes de una ventana. Un recuadro de grupo es un rectngulo trazado alrededor de un grupo de componentes para indicar que estn relacionados. Por lo general, es recomendable poner una etiqueta a un recuadro de grupo. Si no se precisa una etiqueta, puede utilizar un recuadro de contorno. Atributos de componente
Bottom FontName ForeColor Label PartType Visible Enabled FontSize ForeMix Left Refresh Width FontBold FontStrike* Handle* ParentName Top FontItalic FontUnder* Height PartName UserData

Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Create Destroy

Etiquetado de un recuadro de grupo


Utilice el atributo Label para especificar la serie que debe utilizarse para la etiqueta de recuadro de grupo.

Agrupacin de botones de seleccin


Vea Agrupacin de botones de seleccin en la pgina 136 para obtener informacin relacionada.

Captulo 7. Utilizacin de componentes

79

Barra de desplazamiento horizontal

Utilice el componente barra de desplazamiento horizontal para poder desplazarse por un panel de informacin de izquierda a derecha o viceversa. La informacin puede ser una lista de archivos, los registros de una base de datos, las columnas de un documento y otros elementos. Puede utilizar el atributo Range para representar el nmero total de los objetos por los que se efectuar el desplazamiento y el atributo PageSize para determinar el nmero de objetos que pueden visualizarse en una pgina. Atributos de componente
Bottom Height PageSize Position Top Enabled Left ParentName PrevLine UserData Focus NextLine PartName PrevPage Visible Handle* NextPage PartType Range Width

*Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Create Destroy Scroll

80

Programacin con VisualAge RPG

Imagen

Utilice el componente imagen para visualizar dibujos. El atributo FileName especifica el nombre de la imagen que debe utilizarse. Los formatos vlidos de imgenes de Windows son: v Bitmaps de Windows y OS/2 (BMP, VGA, BGA, RLE, DIB, RL4, RL8) v Icono (ICO) v TIF, TIFF (Formato de Archivo de Imagen Codificada) de Microsoft/Aldus v GIF (Formato de Intercambio de Grficos) de CompuServe v PCX (Formato de Archivo de Imagen) de ZSoft PC Paintbrush v TGA, VST, AFI (Bitmap Targa/Vista) de Truevision v IFF, ILBM (Formato de Bitmap Intercalado) de Amiga v XBM (Bitmap) de X Windows v PSE, PSEG, PSEG38PP, PSEG3820 (Segmento de Pgina de Impresora) de IBM Los formatos vlidos de imgenes Java son: v GIF (Formato de Intercambio de Grficos) de CompuServe v Formato Joint Photographic Experts Group (JPG, JPEG) Estos archivos residen en la estacin de trabajo programable (PWS), no en el sistema principal. Debe almacenar los archivos de bitmap y de icono especficos del sistema en el directorio de tiempo de ejecucin adecuado (RT_JAVA o RT_WIN32) para que el programa de utilidad de empaquetado los incluya al crear el paquete de la aplicacin. Nota: El componente imagen slo se puede soltar en una pgina de cuaderno con lienzo o en una ventana con lienzo.

Captulo 7. Utilizacin de componentes

81

Atributos de componente
AddLink* Border Handle* Panel Print TipText Width AllowLink* Bottom Height ParentName Refresh Top BackColor Enabled Left PartName RemoveLink* UserData BackMix FileName Magnify PartType ShowTips Visible

* Nota:: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Click Link* Create MouseEnter DblClick MouseExit Destroy MouseMove

* Nota:: Consulte la descripcin del evento si desea saber cules son las restricciones.

Creacin del componente de imagen


El componente imagen slo puede crearse en un componente lienzo.

Establecimiento del nombre de archivo


Para visualizar una imagen en el componente imagen, establezca el atributo FileName con el nombre del archivo que contiene la imagen. En aplicaciones Windows, el archivo debe contener una imagen de bitmap o icono vlida. En aplicaciones Java, el archivo debe contener una imagen GIF o JPG vlida. Puede que la imagen aparezca de manera diferente en estaciones de trabajo determinadas dependiendo del controlador de dispositivo de pantalla. Si especifica un nombre de archivo que no es vlido, no se visualizar ninguna imagen. Puede borrar el componente imagen estableciendo el atributo FileName en blancos. Si obtiene un error (como Archivo no encontrado) al utilizar el cdigo de operacin SETATR para establecer un nombre de archivo, se activa el indicador de error. Si desea ms informacin, consulte Captulo 12. Utilizacin de archivos de imgenes, de sonido y de vdeo en la pgina 233.

Control del panel de ampliacin


Por omisin, se crea el componente imagen con un panel de ampliacin. Puede eliminar el panel de ampliacin inhabilitndolo en el cuaderno de valores del componente imagen. Tambin puede habilitar o inhabilitar el panel de ampliacin mediante el atributo Panel en el programa. Si establece el atributo Panel en 0, no se visualiza el panel de ampliacin y puede mostrarse una parte mayor de la imagen. Si establece el atributo Panel en 1, se visualiza el panel de ampliacin y queda menos espacio para que se muestre la imagen. Puede establecer la cantidad de ampliacin en el programa. El valor de ampliacin se representa con un porcentaje entre 25 y 200. Especificar un valor 0 dar como resultado un ajuste mejor, en el que la imagen se ajustar en la ventana de imagen mientras se mantiene la constante de proporcin entre horizontal y vertical.

82

Programacin con VisualAge RPG

Ejemplo de imagen
En este ejemplo, se lee un archivo del sistema AS/400. Cada registro del archivo contiene un campo de nmero de componente, que se inserta en el recuadro de lista a medida que se lee cada registro. Cuando el usuario selecciona un nmero de componente en el recuadro de lista y acciona el pulsador Ver, el nmero de componente se concatena con la serie .BMP para formar un nombre de archivo. Entonces se utiliza el nombre de archivo para establecer el atributo FileName del componente imagen para visualizar la imagen. El atributo Label del componente texto esttico PINFO se actualiza para indicar el resultado de establecer el atributo de nombre de archivo. Accione el pulsador Close para terminar el programa.

Captulo 7. Utilizacin de componentes

83

********************************************************************* * * * ID de program. : IMAGE * * * * Descripcin . : Ejemplo del componente imagen * * * * Este programa de ejemplo muestra cmo puede * * implementarse el componente imagen en VARPG * * Client. * * * * El ejemplo da por supuesto que hay un archivo * * en el sistema principal AS/400 denominado PARTS. * * Ese formato de archivo se compone de un campo * * denominado PARTNO. * * * * Cuando se inicie la aplicacin, se invoca el * * evento Create para la ventana WIN1, que lee * * todos los registros del archivo e inserta el * * valor de campo PARTNO en el recuadro de lista LB1* * * * Cuando el usuario accione el pulsador View, * * el nombre de archivo de imagen se construir * * y se utilizar para establecer el atributo * * FILENAME del componente imagen IMG1. * * * ********************************************************************* *

* Definir el archivo PARTS * FPARTS IF E * DPath C dnopic C *

DISK

REMOTE '' 'Picture not available'

Figura 19. Ejemplo en el que se utiliza el componente imagen (Pieza 1 de 3)

84

Programacin con VisualAge RPG

********************************************************************* * * * Ventana . : WIN1 * * * * Componente : Close * * * * Evento . . : Press * * * * Descripcin: Terminar el programa * * * ********************************************************************* * C CLOSE BEGACT PRESS WIN1 * C move *on *inlr * C ENDACT ********************************************************************* * * * Ventana . : WIN1 * * * * Componente : WIN1 * * * * Evento . . : Create * * * * Descripcin: Esta subrutina de accin se ejecuta cuando se crea * * la ventana WIN1. * * Rellenar el recuadro de lista con los valores de * * nmero de componente del archivo PARTS. * * * ********************************************************************* * C WIN1 BEGACT CREATE WIN1 * * Rellenar el componente recuadro de lista con elementos de la base * de datos C read produc1 9999 * C *in99 doweq *off C 'LB1' setatr partno 'InsertItem' C read produc1 9999 C enddo * C ENDACT *

Figura 19. Ejemplo en el que se utiliza el componente imagen (Pieza 2 de 3)

Captulo 7. Utilizacin de componentes

85

********************************************************************* * * * Ventana . : WIN1 * * * * Componente : VIEW * * * * Evento . . : PRESS * * * * Descripcin: Visualizar la imagen para el componente seleccionado * * * ********************************************************************* * C VIEW BEGACT PRESS WIN1 * * Obtener ndice del elemento seleccionado C 'LB1' getatr 'FirstSel' x 4 0 * * Si se ha seleccionado un elemento, construya el nombre de archivo * de bitmap C x ifgt *zero C 'LB1' setatr x 'Index' C 'LB1' getatr 'GETITEM' tmp20 20 C movel tmp20 part 5 C endif * C move *blanks fullpath 64 C move *blanks tmp64 64 C path cat part:0 tmp64 C tmp64 cat '.gif':0 fullpath * * Establecer el nombre de archivo en el atributo FILENAME * de imagen para visualizar la imagen C 'IMG1' setatr fullpath 'FILENAME' 80 * * Si el indicador 80 es "on", la operacin de establecer el nombre * del archivo de imagen es fallida, es decir, no se ha encontrado el * archivo. * Establecer el atributo Label del componente de texto esttico PINFO * para indicar el estado C *in80 ifeq *on C 'PINFO' setatr nopic 'Label' * C else C 'PINFO' setatr *BLANKS 'Label' C endif * C ENDACT *

Figura 19. Ejemplo en el que se utiliza el componente imagen (Pieza 3 de 3)

86

Programacin con VisualAge RPG

Bean Java

* Restriccin: Este componente no est soportado en las aplicaciones Windows. Utilice el componente bean Java para aadir beans JavaBeans al proyecto. Los beans Java sirven para llamar de forma directa a mtodos Java. Si desea obtener ms informacin sobre las llamadas a mtodos Java, consulte la publicacin Captulo 18. Cmo invocar mtodos Java desde programas VisualAge RPG en la pgina 269. Para desarrollar aplicaciones que utilicen el componente bean Java, debe tener instalado Java 2 Software Development Kit (J2SDK), Standard Edition, versin 1.2 o superior, de JavaSoft, en la estacin de trabajo. Si no tiene el J2SDK, puede bajarlo de Sun Microsystems en el URL siguiente:
http://www.javasoft.com/products/

Tras instalar el J2SDK, establezca la variable de entorno PATH de modo que apunte a la ubicacin tanto del compilador Java como de jvm.dll, que forma parte del J2SDK y del JRE (Java Runtime Environment). Por ejemplo, si el directorio inicial de J2SDK es x:\jdk1.2, aada las siguientes sentencias en la variable PATH:
x:\jdk1.2\bin x:\jdk1.2\jre\bin\classic

Atributos de componente
AddEvent Left RmvEvent Visible Bottom ParentName ShowProp Width Enabled PartName Top Height PartType UserData

Eventos a los que puede aplicarse


Create Destroy BeanEvent

Adicin de beans al proyecto


Para aadir un bean al proyecto, pulse el componente bean Java en la paleta de componentes. Pulse el puntero del ratn en el lugar de la ventana de diseo en el que desea colocar el bean. Aparecer un dilogo Abrir archivo. Seleccione el archivo JAR que contiene el bean (o los beans) con el que desea trabajar. Aparecer una ventana con una lista de todos los beans disponibles en el archivo JAR. Tras seleccionar un bean de la lista, se crear una instancia del bean. Se mostrar en una ventana distinta junto con el dilogo de hojas de propiedades asociado y el personalizador de bean, si est disponible. (Puede modificar las propiedades del bean mediante el dilogo de hojas de propiedades y el personalizador de bean). Para mostrar las propiedades, mtodos y eventos de un bean, abra el cuaderno de propiedades del camponente bean Java en la ventana de diseo. Pulse con el botn derecho del ratn en el icono bean Java en la ventana de diseo y seleccione

Captulo 7. Utilizacin de componentes

87

Propiedades. Las propiedades, mtodos y eventos de un bean aparecen en la pgina Informacin. Elija el botn de seleccin apropiado para ver las opciones disponibles. No todos los eventos del bean se soportan. Los eventos soportados por VARPG se marcan con un asterisco (*) en la lista de Eventos.

Ubicacin de los archivos JAR de bean


Todos los archivos JAR relacionados con el bean del proyecto deben estar en el directorio de beans interno, x:\adtswin\beans, donde x:\adtswin es el directorio inicial en el que se ha instalado VARPG. Este directorio tambin debe incluir todos los archivos JAR dependientes de bean. Por ejemplo, si el BeanA se encuentra en BeanA.jar y requiere los archivos de clases de beanclass.jar, tanto BeanA.jar como beanclass.jar deben copiarse en el directorio de beans interno. Mientras edita un proyecto, puede seleccionar un bean de un archivo JAR que no se encuentre en el directorio de beans interno. Este archivo JAR se copiar al directorio de beans interno tras construir el proyecto. No obstante, an seguir teniendo que copiar todos los archivos JAR dependientes del bean en este directorio. Elimine todos los archivos JAR no utilizados del directorio de beans interno. De este modo se evitar la carga de archivos JAR innecesarios que no forman parte del proyecto.

Establecimiento de la classpath de JAR


El programa de utilidad de empaquetamiento de VARPG no maneja la configuracin de la classpath para los archivos JAR. Deber establecer la variable classpath de modo que incluya todos los archivos JAR que utilicen los beans del proyecto. Por ejemplo, si el BeanA utiliza BeanA.jar y depende de beanclasses.jar, debe establecer la classpath tal como se indica a continuacin:
SET CLASSPATH=x:\beandir\BeanA.jar;x:\beandir\beanclasses.jar;%CLASSPATH%;

donde x:\beandir es la va de acceso de los archivos JAR del bean.

88

Programacin con VisualAge RPG

Establecimiento/Obtencin de las propiedades del JavaBean e invocacin de mtodos


VARPG soporta la invocacin directa de mtodos Java. (Consulte el Captulo 18. Cmo invocar mtodos Java desde programas VisualAge RPG en la pgina 269 para obtener ms detalles). El tiempo de ejecucin de VARPG proporciona una clase accesora de Java para acceder a los objetos JavaBean de los proyectos. La clase accesora, com.ibm.varpg.parts.VarpgBeanPart, se encuentra en el archivo varpg.jar. Esta clase le permite recuperar los objetos de bean cuyas instancias crea el tiempo de ejecucin de VARPG. Estos objetos de bean son componentes del proyecto de VARPG. El mtodo para obtener el objeto de bean es:
public static Object getBeanObject(String strComponentName, String strParentName, String strPartName );

dondestrComponentName es el nombre del componente que contiene el componente de bean, strParentName es el nombre de la ventana que contiene el componente de bean y strPartName es el nombre del componente de bean. El llamador debe comprobar las posibles referencias nulas que pueda devolver el mtodo, para asegurarse de que la llamada sea satisfactoria. Para encontrar la especificacin de mtodo real para el establecimiento u obtencin de las propiedades e invocacin de mtodos, consulte la documentacin de los beans que proporciona el proveedor o consulte la pgina Informacin del cuaderno de propiedades del componente bean Java.

Captulo 7. Utilizacin de componentes

89

Recuadro de lista

Utilice el componente recuadro de lista para proporcionar al usuario una lista de elementos de los que se pueden seleccionar uno o ms. Un recuadro de lista consta de elementos de slo lectura. Un elemento de un recuadro de lista es una serie de caracteres. Las barras de desplazamiento verticales y horizontales permiten al usuario ver partes de la lista que no estn visualizadas. Puede configurar el recuadro de lista de modo que el usuario pueda seleccionar un solo elemento o varios. Puede utilizar los atributos Search, SearchType y Case para buscar fcilmente en la lista un elemento determinado. Atributos de componente
AddItemEnd BackMix DelimChar Enabled FontBold FontStrike* GetItem InsertItem* NbrOfSel Refresh SearchType* Sequence* SizeToFit UserData AddLink* Bottom DeSelect ExtSelect* FontItalic FontUnder* Handle* ItemKey ParentName RemoveItem Selected SetItem TipText Visible AllowLink* Case* DragEnable* FirstSel FontName ForeColor Height Left PartName RemoveLink* SelectItem SetTop Top Width BackColor Count DropEnable* Focus FontSize ForeMix Index MultSelect PartType Search* SelectList ShowTips UseDelim

* Nota:: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Create GotFocus MouseExit VKeyPress Destroy KeyPress MouseMove Drop* LostFocus Popup Enter* MouseEnter Select

* Nota:: Consulte la descripcin del evento si desea saber cules son las restricciones.

Adicin y establecimiento de la secuencia inicial de elementos


Por omisin, los elementos se insertan en un recuadro de lista en el orden en que se aaden. Si desea que se visualicen siguiendo un orden ms preciso, establezca el

90

Programacin con VisualAge RPG

atributo Sequence en ascendente, descendente o ndice, antes de aadirlos. Con ello, los elementos se ordenan segn la secuencia de clasificacin ASCII a medida que se van aadiendo. No puede utilizar el atributo Sequence para cambiar el orden de los elementos que ya estn en el recuadro de lista.

Adicin de elementos en tiempo de ejecucin


Puede insertar elementos en un recuadro de lista en tiempo de ejecucin mediante el atributo InsertItem. El orden en que los elementos se visualizan se determina mediante el atributo Sequence.

Actualizacin de elementos de una lista


Puede cambiar elementos que ya estn en la lista. Utilice el atributo Index para indicar qu elemento desea cambiar, y el atributo SetItem para especificar los datos modificados. Nota: Cuando un elemento se cambia utilizando el atributo SetItem, el elemento permanece en su ubicacin original, sin importar el valor del atributo Sequence. Por ejemplo, si estableci el atributo Sequence en orden ascendente cuando cre la lista, los elementos aparecen en el recuadro de lista en orden ascendente; sin embargo, si a continuacin recupera un elemento, cambia su valor y utiliza el atributo SetItem para sustituirlo en el cuadro de lista, el elemento se inserta en la misma posicin en la que estaba antes. Por consiguiente, la lista puede estar o no en orden ascendente despus del cambio.

Establecimiento del principio de la lista


Utilice el atributo SetTop para especificar qu elemento de la lista debe aparecer en la parte superior del recuadro de lista. Al establecer este elemento se desplaza la lista. Cambia la visualizacin en el recuadro de lista, pero no reordena los elementos en la lista.

Eliminacin de elementos
Utilice el atributo RemoveItem para eliminar elementos de la lista. Utilice el valor de ndice para especificar el elemento que va a eliminarse. Los valores de Index comienzan en el 1. Cuando se elimina un elemento de la lista, todos los elementos que siguen al elemento eliminado ascienden una posicin en la lista. Para eliminar todos los elementos de la lista, especifique un valor de Index de 0.

Seleccin y deseleccin de elementos


El usuario puede seleccionar o deseleccionar elementos utilizando el ratn o el teclado. Puede seleccionar y deseleccionar elementos estableciendo los atributos Selected y DeSelect en el programa. Para utilizar estos atributos, establezca primero el atributo Index.

Tipos de seleccin
Puede utilizar atributos para especificar cmo se seleccionan los elementos en un recuadro de lista. Estn disponibles la seleccin nica, mltiple y ampliada. Seleccin nica La seleccin nica (el valor por omisin) slo permite que se seleccione un
Captulo 7. Utilizacin de componentes

91

elemento de una lista a la vez. Si un elemento ya est seleccionado, se deseleccionar cuando se seleccione otro elemento. Seleccin mltiple El usuario puede seleccionar cualquier nmero de objetos o no seleccionar ninguno. Seleccin ampliada Este tipo de seleccin es el adecuado para la seleccin de un slo objeto, pero si es necesario el usuario puede ampliar la seleccin a ms de un objeto.

Recuperacin de elementos de la lista


Para recuperar un elemento de un recuadro de lista, utilice el atributo GetItem. Primero establezca el atributo Index para indicar qu elemento desea recuperar. Normalmente recupera elementos de la lista que ha seleccionado el usuario. Para determinar qu elementos de un recuadro de lista se han seleccionado, utilice el atributo FirstSel o Selected. El atributo FirstSel devuelve el valor de ndice del primer elemento seleccionado de la lista. Si tiene que comprobar elementos seleccionados adicionales, asegrese de que utiliza el atributo DeSelect para deseleccionar este elemento; de lo contrario, el atributo FirstSel devuelve el mismo elemento. Para determinar si se ha seleccionado un elemento especfico, utilice el atributo Selected. El atributo Selected utiliza el valor de atributo Index para determinar si se ha seleccionado ese elemento. Puede utilizar el atributo Count para determinar si hay elementos que recuperar.

Utilizacin de las teclas


Tanto el recuadro de lista como el recuadro de combinacin le permiten aadir elementos a la lista que constan de una parte clave y de una parte de datos. Cuando se aaden elementos a la lista, slo se visualiza la parte de datos del elemento. Si el usuario selecciona un elemento, podr recuperar mediante el programa la parte clave del elemento. Consulte el apartado Utilizacin de claves en la descripcin del componente recuadro de combinacin para obtener ms informacin.

Sealizacin de eventos
El evento Select se seala cuando: v Un usuario selecciona un elemento que est en un recuadro de lista. v Se selecciona un elemento de la lista en el programa. v El usuario selecciona un elemento que ya ha sido seleccionado. El evento Enter se seala cuando: v Un usuario efecta una doble pulsacin sobre un elemento que est en el recuadro de lista. v Un usuario pulsa la tecla Intro cuando el recuadro de lista tiene el foco y se ha seleccionado un elemento. En la subrutina de accin para estos eventos, puede utilizar el atributo Selected o FirstSel para determinar qu elemento se ha seleccionado.

92

Programacin con VisualAge RPG

Ejemplo de recuadro de lista


Accione el pulsador Aadir para insertar en la lista el valor de texto del componente campo de entrada. Accione el pulsador Borrar para borrar la lista, el pulsador Seleccionar para seleccionar un elemento de la lista y el pulsador Eliminar para eliminar el elemento seleccionado de la lista. Pulse Cerrar para finalizar el programa.

Captulo 7. Utilizacin de componentes

93

********************************************************************* * * * ID de programa : LISTBOX * * * * Descripcin . : Programa de ejemplo que muestra el componente * * cuadro de lista. * * * ********************************************************************* * ********************************************************************* * * * Ventana. . : MAIN * * * * Componente : CLEAR * * * * Evento . . : PRESS * * * * Descripcin: Borrar el recuadro de lista y el campo de entrada. * * Poner el foco en el componente campo de entrada. * * * ********************************************************************* * C CLEAR BEGACT PRESS MAIN * C 'LB1' setatr 0 'RemoveItem' C 'EF1' setatr *blanks 'Text' C 'EF1' setatr 1 'Focus' * C ENDACT ********************************************************************* * * * Ventana . : FRA0000B * * * * Componente : CLOSE * * * * Evento . . : PRESS * * * * Descripcin: Terminar el programa * * * ********************************************************************* * C CLOSE BEGACT PRESS MAIN * C move *on *INLR * C ENDACT

Figura 20. Ejemplo de codificacin utilizando el componente Cuadro de lista (Pieza 1 de 3)

94

Programacin con VisualAge RPG

********************************************************************* * * * Ventana. . : MAIN * * * * Componente : REMOVE * * * * Evento . . : PRESS * * * * Descripcin: Eliminar el elemento seleccionado del recuadro de * * lista. Se utiliza el atributo 'FirstSel' para * * determinar el ndice del primer elemento * * seleccionado. * * * ********************************************************************* * C REMOVE BEGACT PRESS MAIN * C 'LB1' getatr 'FirstSel' Index 3 0 * C Index ifgt *zero C 'LB1' setatr Index 'RemoveItem' C endif * C ENDACT ********************************************************************* * * * Ventana . : FRA0000B * * * * Componente : ADD * * * * Evento . . : PRESS * * * * Descripcin: Aade el valor del componente campo de entrada como * * nuevo elemento al componente recuadro de lista. * * * ********************************************************************* * C ADD BEGACT PRESS MAIN * C 'EF1' getatr 'TEXT' tmp 30 * C tmp ifne *blanks C 'LB1' setatr tmp 'InsertItem' C 'EF1' setatr *blanks 'Text' C 'EF1' setatr 1 'Focus' C endif * C ENDACT

Figura 20. Ejemplo de codificacin utilizando el componente Cuadro de lista (Pieza 2 de 3)

Captulo 7. Utilizacin de componentes

95

********************************************************************* * * * Ventana. . : MAIN * * * * Componente : SELECT * * * * Evento . . : PRESS * * * * Descripcin: Recupera el elemento seleccionado del recuadro de * * lista y lo copia en el campo de entrada. * * * ********************************************************************* * C SELECT BEGACT PRESS MAIN * C 'LB1' getatr 'FirstSel' x 3 0 * C x ifgt *zero C 'LB1' setatr x 'Index' C 'LB1' getatr 'GetItem' temp 20 C 'EF1' setatr temp 'Text' C endif * C ENDACT ********************************************************************* * * * Ventana. . : MAIN * * * * Componente : EF1 * * * * Evento . . : CHANGE * * * * Descripcin: Para sucesos notify en ejemplos CRP * * * ********************************************************************* * C EF1 BEGACT CHANGE MAIN * C ENDACT *

Figura 20. Ejemplo de codificacin utilizando el componente Cuadro de lista (Pieza 3 de 3)

Ejemplo de bsqueda
Puede utilizar los atributos Search, SearchType y Case para buscar un elemento concreto de la lista. Es ms rpido utilizar estos atributos que leer cada elemento en el programa y comparar para encontrar valores especficos. El ejemplo siguiente muestra cmo localizar un nombre de cliente en un recuadro de lista escribiendo un nombre en el campo de entrada. La ventana se denomina MAIN, el recuadro de lista es LB1 y el campo de entrada es EF1. La interfaz de usuario es la siguiente:

96

Programacin con VisualAge RPG

En el evento Create de la ventana, el atributo Case del recuadro de lista se establece en 0 para indicar que la bsqueda no es sensible a las maysculas y minsculas. El atributo SearchType se establece en 1 para indicar que slo queremos comparar el nmero de caracteres de la serie de bsqueda con los primeros caracteres del elemento de la lista. El resto del cdigo consiste en rellenar el recuadro de lista con registros de la base de datos del sistema AS/400.
C C C C C C C C C C * * * 'LB1' * * MAIN 'LB1' 'LB1' BEGACT Setatr Setatr Read DoW Setatr Read EndDo Setatr ENDACT CREATE 0 1 Custom01 NOT *in99 CustNa Custom01 1 'AddItemEnd' MAIN 'Case' 'SearchType' 99

99

'LB1'

'SelectItem'

El cdigo siguiente es la subrutina de acciones para el evento Change del campo de entrada EF1. Cada vez que se escribe un carcter en el campo de entrada, se invoca a esta subrutina de acciones. Se recupera el valor del atributo Text del campo de entrada y, si no est en blanco, se utiliza ese valor como la serie de bsqueda para el atributo Search del recuadro de lista. Si se encuentra una coincidencia (el atributo Index es mayor que 0), se selecciona el elemento encontrado y se mueve al principio del recuadro de lista con el atributo SetTop .
C C C C * * * EF1 'EF1' 'LB1' BEGACT Getatr If Setatr CHANGE 'Text' MAIN Search 40

Search <> *Blanks Search 'Search'

Captulo 7. Utilizacin de componentes

97

C C C C C C C C C C C C

If Eval Eval * 'LB1' 'LB1' 'LB1' EndIf Else Setatr Setatr Setatr EndIf ENDACT

%Getatr('Main':'LB1':'Index')<>0 %Setatr('Main':'LB1':'SelectItem')= %Getatr('Main':'LB1':'Index') %Setatr('Main':'LB1':'SetTop')= %Getatr('Main':'LB1':'Index')

* *

1 1 1

'SetTop' 'SelectItem' 'Index'

Si el campo de entrada est en blanco, se mueve el primer elemento del recuadro de lista al principio y se selecciona. El atributo INDEX se establece en 1 para que las bsquedas siguientes empiecen al principio de la lista.

98

Programacin con VisualAge RPG

Medios

Utilice el componente medios para reproducir o grabar informacin de audio o para reproducir archivos de vdeo. El componente medios ofrece a los programas la posibilidad de procesar archivos de ondas (.WAV), MIDI (.MID) y QuickTime Movie (.MOV). Si desea utilizar estos archivos de audio, el PC debe estar equipado con una tarjeta de sonido que pueda procesar estos archivos. Para grabar un archivo de sonido, necesitar un micrfono o algn otro dispositivo de entrada soportado por la tarjeta de sonido. Los archivos MIDI no pueden grabarse con el componente medios. Las aplicaciones Java deben tener instalada la API JMF (Java Media Framework). El componente medios slo permite reproducir los archivos de audio y de vdeo en el entorno Java. Los formatos de archivo de vdeo que se pueden procesar son: MPEG (*.mpg), QUICKTIME Movie (*.mov), *.dat y *.avi de Microsoft Video para Windows en Windows NT/95/98. Para reproducir estos archivos de vdeo, el sistema debe tener los controladores adecuados. Atributos de componente
AddLink* Bottom Left PartName Top Volumen AllowLink* FileName Length PartType Treble* AudioMode Handle* Panel Position UserData Bass* InPlace ParentName RemoveLink* Visible

*Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Complete Create Destroy Link*

*Nota: Consulte la descripcin del evento si desea saber cules son las restricciones.

Especificacin de un nombre de archivo


Utilice el valor del atributo FileName para especificar el nombre del archivo que desea procesar. Si desea ms informacin, consulte el Captulo 12. Utilizacin de archivos de imgenes, de sonido y de vdeo en la pgina 233. Nota: Algunos archivos de ondas se suministran en formato comprimido. El componente medios slo procesa los archivos de ondas sin comprimir.

Captulo 7. Utilizacin de componentes

99

Establecimiento de AudioMode
Para procesar un archivo, establezca el atributo AudioMode en uno de los valores siguientes: Valor 1 2 3 4 Descripcin Pausa Suspende el proceso del archivo Reproducir Reproduce el archivo Grabar Graba un archivo Parar Detiene el proceso del archivo

Establecimiento de Volume
Utilice el atributo Volume para establecer el volumen del componente medios y la salida de ondas y el sintetizador del sistema.

Establecimiento de Position
Utilice el atributo Position para determinar la posicin inicial del archivo que va a procesarse. Exprese el valor del atributo en milisegundos.

Utilizacin del componente Panel de medios


Puede utilizar el componente panel de medios para controlar el componente medios. En el cuaderno de propiedades del componente panel de medios, establezca el nombre de componente medios del atributo AddLink y habilite el atributo AllowLink. De este modo, el usuario puede controlar el componente medios con slo pulsar el botn adecuado en el panel de medios. Consulte el apartado Panel de medios en la pgina 101 si desea ms informacin.

Sealizacin de eventos
Cuando un componente medios ha procesado un archivo por completo, se seala un evento Complete.

100

Programacin con VisualAge RPG

Panel de medios

Nota: Este componente no se utiliza en las aplicaciones Java. Utilice el componente panel de medios para proporcionar un acceso rpido a las acciones ms utilizadas. Tambin puede utilizarlo para dar al usuario control sobre otros componentes sin necesidad de crear lgica de programa. Por ejemplo, puede utilizarlo para crear pulsadores o controles de graduador que controlen el volumen o la modalidad de un componente medios. En el cuaderno de propiedades del componente panel de medios, puede indicar lo siguiente: v Qu botones, de un grupo definido, contendr el panel de medios v Si los graduadores de posicin y volumen se visualizarn Nota: El componente panel de medios slo se puede soltar en una pgina del cuaderno con lienzo o en una ventana con lienzo. Atributos de componente
AddLink Bottom Left PartName Top Width AllowLink Enabled PanelItem PartType UserData BackColor Handle PanelMode Position Visible BackMix Height ParentName RemoveLink Volume

Eventos a los que puede aplicarse


Change MouseEnter Press Create MouseExit Destroy MouseMove Link Popup

Creacin de un componente panel de medios


Un componente panel de medios slo puede crearse en un componente lienzo.

Enlace con otros componentes


Hay dos mtodos de enlazar un componente panel de medios con otro componente: uno es mediante el cuaderno de propiedades, mientras que con el otro se ha de escribir la lgica del programa. El primer mtodo es el ms sencillo. El nico caso en que tiene que escribir la lgica del programa es si desea que se establezca el enlace durante el tiempo de ejecucin y luego establecer los atributos AddLink y AllowLink. Un ejemplo tpico sera enlazar el panel de medios con un componente medios. Cuando se cambia un control en el panel de medios, el mecanismo de enlace afecta automticamente al componente medios.

Captulo 7. Utilizacin de componentes

101

Cuando se crea un enlace desde el componente panel de medios con otro componente, slo ciertos botones se habilitan en el componente panel de medios. Para habilitar todos los botones, tambin debe crear un enlace desde el otro componente hasta el componente panel de medios. Consulte la descripcin de AddLink de la publicacin VisualAge RPG Manual de consulta de componentes, SC10-3065-02 (SC09-2450-02) para obtener ms informacin sobre los componentes que puede enlazar con un componente panel de medios.

Sealizacin de eventos
Cuando se mueve el graduador de volumen o el graduador de posicin, se seala un evento Change. Utilice el atributo PanelItem para determinar el graduador que se cambi. Utilice el atributo Volume para determinar el valor del graduador de volumen y el atributo Position para determinar el valor del graduador de posicin. Cuando se acciona un pulsador en el panel de medios, se seala un evento Press. Utilice el valor numrico devuelto por el atributo PanelItem para determinar qu botn caus el evento Press. Consulte la publicacin VisualAge RPG Manual de consulta de componentes, SC10-3065-02 (SC09-2450-02) para ver la lista de los valores posibles.

102

Programacin con VisualAge RPG

Barra de mens

Utilice el componente barra de mens para proporcionar a los usuarios acceso a los mens desplegables. Puede aadir componentes submen y opcin de men a la barra de mens. Las barras de mens aparecen en la parte superior del marco de la ventana, debajo de la barra de ttulo. Cuando el usuario selecciona un men en ella, aparece un men desplegable con todas sus opciones. Al seleccionar una de ellas se inicia inmediatamente la accin que describe. Nota: Las propiedades, los eventos y otros elementos de este componente slo se pueden manipular desde su men emergente de la vista de rbol de proyectos. Para obtener informacin relacionada, consulte el apartado: v Elemento de men en la pgina 104 v Submen en la pgina 166 v Men emergente en la pgina 132 Atributos de componente
PartType PartName ParentName UserData

Eventos a los que puede aplicarse


Create Destroy

Creacin de mens desplegables


No se puede abrir el cuaderno de propiedades de una barra de mens, submen u opcin de men pulsando dos veces con el ratn en ellos ni a travs de mens emergentes. Debe hacerlo en la vista de rbol.

Captulo 7. Utilizacin de componentes

103

Elemento de men

Utilice las opciones de men para crear mens desplegables o emergentes. Una opcin de men describe una accin que se inicia cuando el usuario selecciona esa opcin. Para crear un men: 1. Suelte un componente submen en una barra de mens o en un men emergente. 2. Suelte opciones de men en el submen. Nota: Las propiedades, los eventos y otros elementos de este componente slo se pueden manipular desde su men emergente de la vista de rbol de proyectos. Para obtener informacin relacionada, consulte el apartado: v Barra de mens en la pgina 103 v Men emergente en la pgina 132 v Submen en la pgina 166 Atributos de componente
Checked ParentName Enabled PartName FileName PartType Label UserData

Eventos a los que puede aplicarse


Create Destroy MenuSelect

Colocacin de una marca de seleccin junto a una opcin de men


Un smbolo de marca de seleccin junto a una opcin de men informa al usuario que la accin representada por la opcin de men est seleccionada. Por ejemplo, si aparece una marca de seleccin junto al elemento de men Mostrar cuadrcula, se visualizar una cuadrcula. Para visualizar una marca de seleccin junto a un elemento de men, establezca el atributo Checked en 1. Para eliminar la marca de seleccin, establezca el atributo en 0.

Establecimiento del texto de men


Utilice el atributo Label para establecer el texto para un elemento de men.

Establecimiento de un nemotcnico
Nota: Las aplicaciones Java no soportan nemotcnicos.

104

Programacin con VisualAge RPG

Para especificar una clave nemotcnica para el elemento de men, coloque el identificador nemotcnico delante de un carcter en el texto del atributo Label. En Windows NT/95/98, se utiliza el smbolo &. El carcter al que se ha asignado la clave nemotcnica se visualiza en la interfaz con un subrayado, por ejemplo, Visualizar. El subrayado informa a los usuarios que pueden seleccionar el elemento de men pulsando la tecla del carcter subrayado en el teclado.

Habilitacin de elementos de men


Puede controlar si se emite un evento MenuSelect o no, cuando un usuario selecciona un elemento de men. Por omisin, el elemento de men queda habilitado al crearlo. Un elemento de men habilitado genera un evento MenuSelect cuando se selecciona. Establezca el atributo Enabled en 0 si no desea tener habilitado un elemento de men. Cuando no est habilitado, el elemento de men aparece en una tonalidad atenuada en la pantalla y no genera un evento MenuSelect al seleccionarse.

Sealizacin de eventos
Cuando el usuario selecciona un elemento de men, se seala un evento MenuSelect. Nota: Slo los elementos de men sealan un evento MenuSelect. Los submens (como los mens en cascada), que estn asociados a otros mens no lo sealan.

Captulo 7. Utilizacin de componentes

105

Subarchivo de mensajes

Utilice el componente subarchivo de mensajes para visualizar mensajes predefinidos o para visualizar texto proporcionado en la lgica del programa: por ejemplo, informacin de error o de estado. Este componente est situado siempre en la parte inferior de la ventana y ocupa la anchura de la ventana. No se puede cambiar la anchura de este componente; sin embargo, s se puede cambiar la altura para que se visualicen ms mensajes. En tiempo de ejecucin, los usuarios pueden utilizar las barras de desplazamiento para ver todos los mensajes. Atributos de componente
AddMsgID DropEnable* FontItalic FontUnder* Handle* NbrOfSel RemoveMsg UserData AddMsgText Enabled FontName ForeColor Height ParentName Selected Visible Count FirstSel FontSize ForeMix Index PartName ShowTips DragEnable* FontBold FontStrike* GetItem MsgSubText PartType TipText

* Nota:: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Create MouseEnter Select Destroy MouseExit Drop MouseMove Enter Popup

Visualizacin de mensajes predefinidos


Para visualizar mensajes que ya estn definidos en el Diseador GUI, establezca el atributo AddMsgId en el nmero de ID del mensaje que desee visualizar. Utilice la parte numrica del identificador de mensaje.

Visualizacin de texto suministrado en el programa


Para visualizar texto que no forme parte de un mensaje predefinido, utilice el atributo AddMsgText en el programa y suministre una serie de texto o un literal como valor del mensaje.

Utilizacin de variables de sustitucin


El componente subarchivo de mensajes soporta variables de sustitucin. Una variable de sustitucin se define cuando se crea el mensaje escribiendo el carcter de porcentaje ( % ) seguido de un valor numrico (por ejemplo, %123). Esta variable de sustitucin se sustituye con datos que proporciona el programa antes

106

Programacin con VisualAge RPG

de que el usuario aada el mensaje. Los datos de sustitucin del mensaje se aplican a los atributos AddMsgID y AddMsgText. Los datos de sustitucin de mensaje son una serie de palabras separadas por blancos. Cada palabra de sustitucin sustituye a la variable de sustitucin correspondiente antes de que se aada el mensaje al componente subarchivo de mensajes. Para establecer los datos de sustitucin del mensaje, utilice el atributo MsgSubText antes de establecer el atributo AddMsgID. Nota: Los datos de sustitucin siguen vigentes hasta que se utiliza otro atributo MsgSubText.

Eliminacin de mensajes
Utilice el atributo RemoveMsg para eliminar un mensaje del componente subarchivo de mensajes. Especifique el nmero de ndice del mensaje que se va a eliminar. Para eliminar todos los mensajes, utilice un valor de ndice 0.

Captulo 7. Utilizacin de componentes

107

Ejemplo de subarchivo de mensajes


En este ejemplo se solicita al usuario que entre un nmero de componente para procesar. El nmero de componente debe ser mayor que cero y menor que 2000. Cuando se accione el pulsador Aceptar, el programa comprobar si el valor est en el rango necesario. Si el valor no est dentro del rango, se aade un mensaje al componente subarchivo de mensajes.

********************************************************************* * * * ID de programa : MESSAGE * * * * Descripcin . : Programa de ejemplo que muestra el componente * * subarchivo de mensajes. * * * ********************************************************************* * ********************************************************************* * * * Ventana. . : MAIN * * * * Componente : PB_CLOSE * * * * Evento . . : PRESS * * * * Descripcin: Terminar el programa * * * ********************************************************************* * C PB_CLOSE BEGACT PRESS MAIN * C move *on *inlr * C ENDACT

Figura 21. Ejemplo de cdigo en el que se utiliza el componente subarchivo de mensajes (Pieza 1 de 2)

108

Programacin con VisualAge RPG

********************************************************************* * * * Ventana. . : MAIN * * * * Componente : PB_OK * * * * Evento . . : PRESS * * * * Descripcin: Comprobar que el valor entrado est permitido. De lo * * contrario, aada un mensaje al componente subarchivo * * de mensajes. * * * * Se utiliza el valor entrado como texto de * * sustitucin en el mensaje. * * * ********************************************************************* * C PB_OK BEGACT PRESS MAIN * * Borrar el subarchivo de mensajes * C 'Msg1' setatr 0 'RemoveMsg' * * Obtener el nmero de componente * C 'PartNum' getatr 'Text' tmp4 4 0 * * Si el nmero de componente no es vlido, aada un mensaje * al componente mensaje. El nmero de componente entrado por * el usuario se utiliza como texto de sustitucin. * Dado que el texto de sustitucin debe ser una serie, mueva * el valor numrico de nmero de componente a un campo de * caracteres y utilcelo como texto de sustitucin. C tmp4 ifle *zero C tmp4 orgt 1999 C move tmp4 char4 4 C 'Msg1' setatr char4 'MsgSubText' C 'Msg1' setatr 1 'AddMsgID' * * Dar FOCO al campo de entrada PartNum para que el cursor * regrese al mismo. C 'PartNum' setatr 1 'Focus' * * El nmero de componente est bien, seguir procesando C else * ... * ... * ...

Figura 21. Ejemplo de cdigo en el que se utiliza el componente subarchivo de mensajes (Pieza 2 de 2)

Captulo 7. Utilizacin de componentes

109

Edicin de mltiples lneas

Utilice el componente edicin de mltiples lneas si desea que el usuario pueda escribir varias lneas de texto. El componente edicin de mltiples lneas tiene lmites definidos. A veces no se visualiza todo el texto que contiene. El usuario puede desplazar el texto vertical y horizontalmente para ver la parte que no se visualiza. Atributos de componente
AddLineEnd Bottom CsrLine DragEnable* FontBold FontStrike* Handle* Left ParentName ReadOnly TextEnd TextString Undo WordWrap AddOffset CanUndo CsrPos DropEnable* FontItalic FontUnder* Height LineNumber PartName Refresh TextLength TipText UserData BackColor CharOffset Cut Enabled FontName ForeColor InsertLine LineText PartType ShowTips TextSelect Top Visible BackMix Copy Delete Focus FontSize ForeMix InsertText NbrOfLines Paste Text TextStart TopLine Width

* Nota:: Consulte la descripcin del atributo para conocer las restricciones. Eventos a los que puede aplicarse
Change Destroy LostFocus MouseMove Click Drop MouseDown MouseUp Create GotFocus MouseEnter Popup DblClick KeyPress MouseExit VKeyPress

Obtencin y establecimiento del texto


Utilice el atributo Text para obtener o establecer el texto del componente edicin de mltiples lneas. Nota: El texto por omisin entrado en el cuaderno de propiedades para el componente edicin de mltiples lneas no se guarda. El texto para un componente edicin de mltiples lneas slo puede establecerse en el tiempo de ejecucin.

Manipulacin de lneas de texto en un componente de edicin de mltiples lneas


Para insertar lneas nuevas en un componente edicin de mltiples lneas:

110

Programacin con VisualAge RPG

1. Establezca el atributo LineNumber en el nmero de lnea despus del cual desea insertar texto. 2. Utilice el atributo InsertLine. El texto se inserta despus de la lnea que se especifica. Cualquier lnea que est por debajo de la lnea que ha especificado se desplazar hacia abajo para dejar espacio para el texto insertado.

Manipulacin de caracteres en un componente de edicin de mltiples lneas


Para insertar una serie de caracteres en un componente edicin de mltiples lneas: 1. Establezca el atributo CharOffset para especificar dnde desea que se inserte el texto nuevo. El texto que sigue al valor CharOffset se sustituye por el texto nuevo. 2. Utilice el atributo AddOffset para aadir texto en CharOffset.

Manipulacin de partes seleccionadas del texto en un componente edicin de mltiples lneas


Puede utilizar varios atributos para manipular partes seleccionadas del texto en un componente edicin de mltiples lneas. Para devolver slo el texto seleccionado, utilice el atributo TextSelect. Si no se selecciona texto, el atributo TextSelect devuelve una serie nula y el campo de resultado que debe recibir el texto permanece invariable. Utilice los atributos TextStart y TextEnd para devolver las posiciones de caracteres inicial y final del texto seleccionado.

Cambio de color
Si existe un componente edicin de mltiples lneas en un componente lienzo con el color de fondo establecido en el valor por omisin del sistema, cambia al color de fondo del lienzo que el componente edicin de mltiples lneas heredar. Los componentes edicin de mltiples lneas adicionales aadidos al lienzo no heredarn el color de fondo del lienzo. Para corregirlo, difiera el establecimiento del color de fondo del lienzo hasta que haya colocado todos los componentes edicin de mltiples lneas en el lienzo. Como alternativa, puede hacer que los componentes edicin de mltiples lneas hereden el color estableciendo el color del lienzo en el valor por omisin del sistema, y luego otra vez en el valor del color RGB predefinido. Si arrastra y suelta un color en la barra de desplazamiento de un componente edicin de mltiples lneas, ese color no se guardar. El componente edicin de mltiples lneas cambiar al nuevo color, pero cuando se cierre la ventana y vuelva a abrirse, el color volver a ser el original.

Eleccin de fonts
No todos los fonts estn soportados por el componente edicin de mltiples lneas. Despus de seleccionar un font para este componente, se ajustar para visualizar la coincidencia ms prxima para el font seleccionado.

Cmo evitar la entrada de datos por parte del usuario


Puede evitar que el usuario entre texto en el componente edicin de mltiples lneas, realizando una de las acciones siguientes:
Captulo 7. Utilizacin de componentes

111

v Establezca el atributo ReadOnly en 0. v Establezca el atributo Enabled en 0. (Esto tambin impide que el componente edicin de mltiples lneas responda a eventos tales como Change y GotFocus.) Sigue siendo posible cambiar el valor del componente edicin de mltiples lneas en el programa.

Ejemplo de edicin de mltiples lneas


En este ejemplo, al accionar el pulsador Copiar se copia el texto seleccionado desde la edicin de mltiples lneas hasta el campo de entrada. Al accionar el pulsador Cerrar finaliza el programa.

112

Programacin con VisualAge RPG

********************************************************************* * * * ID de programa : MLE * * * * Descripcin . : Programa de ejemplo que muestra el componente * * edicin de mltiples lneas. * * * ********************************************************************* ********************************************************************* * * * Ventana. . : MAIN * * * * Componente : PB_CLOSE * * * * Evento . . : PRESS * * * * Descripcin: Terminar el programa * * * ********************************************************************* * C PB_CLOSE BEGACT PRESS MAIN * C move *on *inlr * C ENDACT ********************************************************************* * * * Ventana. . : MAIN * * * * Componente : PB_COPY * * * * Evento . . : PRESS * * * * Descripcin: Copiar el texto seleccionado en el MLE al componente * * edicin de mltiples lneas. * * * ********************************************************************* * C PB_COPY BEGACT PRESS MAIN * C 'EF1' setatr *blanks 'Text' C 'MLE1' getatr 'TextStart' start 5 0 C 'MLE1' getatr 'TextSelect' selected 128 * C start ifgt *zero C 'ef1' setatr selected 'Text' C endif * C ENDACT

Figura 22. Ejemplo de cdigo en el que se utiliza el componente edicin de mltiples lneas (Pieza 1 de 2)

Captulo 7. Utilizacin de componentes

113

********************************************************************* * * * Ventana . : Main * * * * Componente : Top * * * * Evento . . : Press * * * * Descripcin: Establecer la 5 lnea del componente edicin de * * mltiples lneas como lnea superior * * * * Cambios . : * * * ********************************************************************* * C TOP BEGACT PRESS MAIN * C eval %setatr('MAIN':'MLE1':'TOPLINE') = 5 C ENDACT ********************************************************************* * * * Ventana . : Main * * * * Componente : Bottom * * * * Evento . . : Press * * * * Descripcin: Establecer la parte inferior * * * ********************************************************************* * C BOTTOM BEGACT PRESS MAIN * C eval %setatr('MAIN':'MLE1':'TOPLINE') = 0 C ENDACT

Figura 22. Ejemplo de cdigo en el que se utiliza el componente edicin de mltiples lneas (Pieza 2 de 2)

114

Programacin con VisualAge RPG

Cuaderno

Utilice el componente cuaderno para presentar datos que se pueden agrupar lgicamente por temas: por ejemplo, informacin de cliente dividida en categoras tales como Nombre, Direccin de envo, Pedidos y Crditos. Un componente cuaderno es una representacin grfica en forma de cuaderno. (En aplicaciones Windows, recibe el nombre de control de separadores). Puede aadir pginas al cuaderno y agruparlas en secciones separadas por separadores. Si la pgina de cuaderno tiene lienzo, puede aadir ms de un componente a la misma. Si no tiene lienzo, slo se puede aadir un componente. El usuario puede pasar las pginas de un cuaderno para ir de una pgina a otra o ir directamente a una seccin del cuaderno pulsando el botn del ratn sobre la pestaa. Puede aadir pginas de cuaderno del modo siguiente: v Utilizando el cuaderno de propiedades del componente cuaderno v Sealando y pulsando (o arrastrando y soltando) una pgina de cuaderno o una pgina de cuaderno con lienzo en el componente cuaderno. Para obtener informacin relacionada, consulte el apartado: v Pgina de cuaderno en la pgina 116 v Pgina de cuaderno con lienzo en la pgina 117 Atributos de componente
BackColor Enabled FontName ForeColor Left PartType UserData BackMix Focus FontSize ForeMix PageNumber Refresh Visible Bottom FontBold FontStrike* Handle* ParentName ShowTabs* Width Count FontItalic FontUnder* Height PartName Top

*Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Create Destroy

Cambio del nfasis del font


Al cambiar el nfasis del font para un componente cuaderno a subrayado o tachadura, el texto de estado adopta el nuevo nfasis, pero no as el texto de los separadores.

Captulo 7. Utilizacin de componentes

115

Pgina de cuaderno

Utilice el componente pgina de cuaderno para aadir pginas a un cuaderno. Solamente puede aadir un componente a una pgina de cuaderno; el tamao del mismo se adaptar a la pgina. Si desea aadir ms de un componente en una pgina, debe colocar un componente lienzo en la pgina de cuaderno. Tambin puede utilizar el componente pgina de cuaderno con lienzo para ahorrarse un paso. Nota: Las propiedades, los eventos y otros elementos de este componente slo se pueden manipular desde su men emergente de la vista de rbol de proyectos. El usuario puede pulsar las teclas de flecha izquierda y derecha para ir de una pgina a otra. Para obtener informacin relacionada, consulte el apartado v Cuaderno en la pgina 115 v Pgina de cuaderno con lienzo en la pgina 117 Atributos de componente
Enabled Refresh Visible ParentName TabImage PartName TabLabel PartType UserData

Eventos a los que puede aplicarse


Create Destroy PageSelect

Mostrar el texto del separador


En una mquina DBCS, puede que el separador de un cuaderno no muestre todo el texto cuando se utiliza el font MINCHO Proportional. Esto se soluciona cambiando el font por otro estilo, como MINCHO Normal o MINCHO System.

Establecimiento de un nemotcnico
Para especificar una clave nemotcnica para el elemento de men, coloque el identificador nemotcnico delante de un carcter en el texto del atributo Label. El carcter al que se ha asignado la clave nemotcnica se visualiza en la interfaz con un subrayado (por ejemplo, Visualizar). Tenga en cuenta que para Windows NT/95/98, las claves nemotcnicas se visualizan, pero no funcionan en pginas del cuaderno. Nota: Las aplicaciones Java no soportan nemotcnicos

116

Programacin con VisualAge RPG

Pgina de cuaderno con lienzo

Utilice la pgina de cuaderno con lienzo para aadir pginas a un componente cuaderno. El componente lienzo ocupa el rea de cliente de un componente pgina de cuaderno. Si se aaden componentes al lienzo se puede crear una interfaz grfica de usuario. Si slo desea aadir un componente a la pgina, puede utilizar el componente pgina de cuaderno en lugar del componente pgina de cuaderno con lienzo. Puesto que dicho componente no tiene lienzo, el tamao del componente que se aada se ajustar automticamente. Para obtener informacin relacionada, consulte el apartado: v Pgina de cuaderno en la pgina 116 v Cuaderno en la pgina 115 Atributos de componente
Enabled TabImage ParentName TabLabel PartName UserData PartType Visible

Eventos a los que puede aplicarse


Create Destroy PageSelect

Captulo 7. Utilizacin de componentes

117

Interfaz ODBC/JDBC

El componente Interfaz ODBC/JDBC proporciona la posibilidad de procesar archivos de base de datos que den soporte a la API ODBC de Windows o la API JDBC de JavaSoft. Foxpro, Access y Paradox son ejemplos de estos tipos de archivos de base de datos. Para desarrollar aplicaciones que puedan utilizar el componente Interfaz ODBC/JDBC, debe estar familiarizado con SQL y tener instalado el SDK ODBC de Windows o el Java 2 Software Development Kit (J2SDK), Standard Edition, de JavaSoft en la estacin de trabajo. Si no tiene el SDK ODBC, puede bajarlo de Microsoft en el URL siguiente:
http://www.microsoft.com/odbc/download.htm

El soporte de JDBC forma parte del Java 2 Software Development Kit (J2SDK) Versin 1.2 para Windows. Si no tiene el J2SDK, puede bajarlo de Sun Microsystems en el URL siguiente:
http://www.javasoft.com/products/

Las aplicaciones que acceden y manipulan datos de una base de datos JDBC necesitan el controlador de conformidad con JDBC 2.0 adecuado. Puede encontrar el controlador JDBC y ms informacin en el URL siguiente:
http://java.sun.com/products/jdbc/

Nota: JDBC no se puede utilizar en applets. Una base de datos ODBC o JDBC se compone de una o varias tablas. Los datos se almacenan en una tabla como una serie de filas. Cada fila, o registro, contiene un nmero de columnas con datos. El programa puede someter sentencias SQL junto con los atributos del componente Interfaz ODBC/JDBC para manipular filas, o para traspasar datos entre campos del programa y columnas de tablas. Para poder procesar una base de datos existente, el programa VARPG debe conectarse antes a la base de datos e indicar a qu tabla hace referencia. Para manipular las filas de una tabla, el programa debe crear un conjunto de registros que identifique los registros que el componente interfaz ODBC/JDBC debe devolver y mantener. Para acceder a los datos de una fila, debe enlazar cada una de las columnas utilizadas en la fila de la tabla con un campo del programa. En las aplicaciones Java no se pueden utilizar los punteros. Una columna est enlazada a un componente; para enlazar slo se pueden utilizar los componentes texto esttico y campo de entrada. Si crea una aplicacin Java que utiliza el componente Interfaz ODBC/JDBC, los usuarios finales que ejecuten la aplicacin deben instalar el archivo varpgjdb.jar en sus estaciones de trabajo y aadir su ubicacin en la sentencia classpath. El programa de utilidad de empaquetamiento no incluye este archivo JAR. El archivo JAR est ubicado en el subdirectorio adtswin\java.

118

Programacin con VisualAge RPG

Atributos de componente
AllowChg* BufferLen* Column Columnas ConnectStr Fetch Handle* Left Refresh SQLQuery UserData BindPart BufferPtr* ColumnDec ColumnType CurrentRow FetchNext Height ParentName Rows* Top Visible Bottom BufferType* ColumnLen Connect DeleteRow FetchPrior InsertRow PartName SQLError UnBind Width BufferDec* CharData ColumnName Connected ExecuteSQL GetTables IsData PartType SQLMsgBox UpdateRow

*Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Create Destroy

Conexin a una base de datos ODBC


Para poder procesar una base de datos existente, el programa VARPG debe conectarse antes a la base de datos e indicar a qu tabla hace referencia. Nota: El componente Interfaz ODBC/JDBC de VARPG slo se puede conectar a las tablas de una en una. Si esa tabla tiene dependencias o relaciones con otras tablas, el programa no podr actualizar ni suprimir registros de la base de datos. Para conectarse a una base de datos, antes debe establecer el atributo ConnectStr en la serie de conexin necesaria para la base de datos. Despus, utilice el atributo Connect para efectuar la conexin. En Windows, si establece el atributo ConnectStr en *BLANKS, el gestor ODBC visualizar el dilogo Seleccionar fuente de datos donde podr seleccionar la tabla a la que conectarse. Una vez realizada la conexin, el atributo Connected se establecer en 1. Si la conexin no se consigue realizar, el atributo Connected se establece en 0. Al ejecutarse el fragmento de cdigo siguiente, se visualizar el dilogo Seleccionar fuente de datos. Si se ha seleccionado una tabla, el atributo ConnectStr contendr la serie de conexin. El atributo Connect se establece para efectuar la conexin.
C C C C C C C 'ODBC' 'ODBC' Setatr Setatr If ... Else ... EndIf *Blanks 'ConnectStr' 1 'Connect' %Getatr('Main':'ODBC':'Connected')=1

Creacin de un conjunto de registros


Una vez conectado a una base de datos, debe crear un conjunto de registros para poder acceder a los datos de la base de datos. Para crear un conjunto de registros, debe someter una sentencia SELECT para el componente Interfaz ODBC/JDBC

Captulo 7. Utilizacin de componentes

119

utilizando los atributos SQLQuery y ExecuteSQL. La sentencia SELECT identifica cul es la tabla de la base de datos a la que se accede y cul es el grupo de registros de la tabla que se va a procesar. El segmento de cdigo siguiente es un ejemplo de creacin de un conjunto de todos los registros de la tabla CUSTOMERS:
D SelAll * C 'ODBC' C 'ODBC' C Setatr Setatr SelAll 1 'Select * From "Customers"' 'SQLQuery' 'ExecuteSQL'

Acceso a los datos de una tabla


Los datos se almacenan en una tabla como una serie de filas. Cada fila contiene un nmero de columnas con datos. Las filas de una tabla se pueden manipular con atributos del componente Interfaz ODBC/JDBC como, por ejemplo, FetchNext, FetchPrior, UpdateRow, etc. Sin embargo, para acceder a los datos de una fila, debe enlazar cada una de las columnas de la fila de la tabla con un campo del programa. Una vez establecido este enlace, el componente Interfaz ODBC/JDBC puede traspasar datos entre los campos del programa y las columnas de la tabla. Para enlazar el campo del programa, debe utilizar los atributos del componente Interfaz ODBC/JDBC siguientes: Column Establece cul es la columna de la tabla que se enlazar. BufferPtr Contiene la direccin del campo del programa que se enlaza a la columna. BufferDec Especifica el nmero de posiciones decimales de la columna de almacenamiento intermedio. BufferLen Especifica la longitud del campo del programa. BufferType Indica el tipo de datos del campo del programa. En el ejemplo siguiente, se enlazan 2 campos definidos en las especificaciones D a las columnas 1 y 2 de una tabla:
D first D last * D fptr D lptr * C 'ODBC1' C 'ODBC1' C 'ODBC1' C 'ODBC1' * C 'ODBC1' C 'ODBC1' C 'ODBC1' C 'ODBC1' S S S S Setatr Setatr Setatr Setatr Setatr Setatr Setatr Setatr 20 30 * * 1 20 fptr 1 2 30 lptr 1 INZ(%Addr(first)) INZ(%Addr(last)) 'Column' 'BufferLen' 'BufferPtr' 'BufferType' 'Column' 'BufferLen' 'BufferPtr' 'BufferType'

Tambin puede utilizar el %ADDR incorporado directamente en las especificaciones C para evitar codificar las especificaciones D para definir los punteros:

120

Programacin con VisualAge RPG

Eval

%Setatr(Main':'ODBC1':'BufferPtr')=%Addr(first)

Tipos de datos
Utilice el atributo BufferType para indicar el tipo de datos del campo de programa al que hace referencia el atributo BufferPtr. El componente Interfaz ODBC/JDBC utiliza el atributo BufferType para realizar la conversin de datos correcta al traspasar datos entre el campo del programa y la columna de la tabla. Es importante establecer correctamente este atributo, ya que no se comprueba si los tipos de campo son adecuados. Establezca el atributo Column antes de utilizar el atributo BufferType. Si el campo de programa est asociado a un componente de la interfaz, el atributo DataType se puede utilizar para obtener el tipo de almacenamiento intermedio. Utilice el siguiente diagrama para establecer el tipo de datos VARPG en el correspondiente tipo de datos SQL soportado. Especifique los atributos BufferLen y BufferDec slo como se listan en el diagrama. Para los tipos de datos carcter, entero o entero pequeo, especifique slo el atributo BufferLen. Tenga en cuenta que los tipos de datos doble, flotante y real pueden definirse en VARPG, como flotante (F) o decimal con zona. Si los define como decimal con zona, el tiempo de ejecucin de VARPG slo utilizar el nmero de posiciones decimales que especifica el atributo BufferDec cuando traslade datos de la columna. Esto puede provocar una prdida de precisin si el origen de datos tiene ms posiciones decimales que las especificadas por el atributo BufferDec. Si define estos campos como flotantes (F), NO especifique los atributos BufferLen ni BufferDec.
Tipo de datos SQL Tipo de datos VARPG Especifica la longitud del campo de programa (utilice BufferLen) X X X X X X X X X X Especifica las posiciones decimales de la columna del almacenamiento intermedio (utilice BufferDec)

Carcter Decimal Entero Entero pequeo Doble Doble Coma flotante Coma flotante Real Real

CHAR Decimal con Decimal con Decimal con 8F Decimal con 4F Decimal con 4F Decimal con

zona zona zona zona zona zona

Si una columna contiene un tipo de datos que el componente Interfaz ODBC/JDBC no soporta, establezca el atributo AllowChg en 0 para esa columna. El componente Interfaz ODBC/JDBC no traspasar datos entre ningn campo de programa y la columna. No se efectuar ningn cambio en los datos.

Recuperacin de las filas de una tabla


Para procesar las filas de una tabla, antes debe crear un conjunto de registros. Un conjunto de registros es un grupo de registros que devuelve y mantiene el componente Interfaz ODBC/JDBC. El programa somete una sentencia SELECT
Captulo 7. Utilizacin de componentes

121

para el componente Interfaz ODBC/JDBC utilizando los atributos SQLQuery y ExecuteSQL. Primero, el atributo SQLQuery se establece en la sentencia SQL que se ejecutar. Despus, el atributo ExecuteSQL se establece en 1 para ejecutar la consulta. En el ejemplo siguiente, todos los registros se seleccionan de la tabla Customers:
D SelAll * C 'ODBC1' C 'ODBC1' C Setatr Setatr SelAll 1 'Select * From "Customers"' 'SQLQuery' 'ExecuteSQL'

Para determinar el nmero de filas que se han devuelto como resultado de un atributo SQLQuery, puede comprobar el valor del atributo Rows. Una vez devuelto el conjunto de registros, se puede procesar cada una de las filas utilizando los atributos FetchNext y FetchPrior. Establezca el atributo FetchNext en 1 para devolver la fila siguiente del conjunto de registros. Establezca el atributo FetchPrior en 1 para devolver la fila anterior del conjunto de registros. Para determinar si un atributo FetchNext o FetchPrior ha devuelto correctamente una fila, compruebe el valor del atributo IsData. El valor 1 indica que se han devuelto datos. De lo contrario, el valor de IsData se establece en 0. En el ejemplo siguiente, se leen todos los registros de un conjunto de registros y se aade el valor de la columna 1 (primer campo) al recuadro de lista LB1.
C C C C C C * 'ODBC1' 'ODBC1' 'LB1' 'ODBC1' Setatr Getatr DoW Setatr Getatr EndDo 1 'IsData' Temp = 1 first 'IsData' 'FetchNext' Temp 'AddItemEnd' Temp 1 0

Actualizacin de los datos de una fila


Para actualizar los datos de una fila, utilice el atributo UpdateRow para especificar la fila que debe actualizarse. Tenga en cuenta que el atributo UpdateRow actualizar todas las filas. No es necesario buscar antes la fila. Sin embargo, lo normal es actualizar una fila que se acaba de buscar. En este caso, se utilizar el atributo CurrentRow. Este atributo contiene el nmero de la fila que se acaba de buscar. En el segmento de cdigo siguiente, se supone que se ha ledo una fila y que se ha visualizado la informacin en una ventana. El usuario pulsa el botn Actualizar despus de efectuar los cambios.
C C C C C * PB_Update 'ODBC1' 'ODBC1' BEGACT Read Getatr Setatr ENDACT PRESS Main 1 0 'Main' 'CurrentRow' Row Row 'UpdateRow'

Supresin de una fila


Los pasos para suprimir una fila son semejantes a los pasos para actualizarla. (Consulte Actualizacin de los datos de una fila.) Utilice el atributo DeleteRow para especificar la fila que se va a suprimir. Al igual que con el atributo UpdateRow, DeleteRow suprimir todas las filas del conjunto. No es necesario buscar antes la fila.

122

Programacin con VisualAge RPG

En el ejemplo siguiente, el usuario ha pulsado Suprimir para suprimir un registro que se acaba de buscar y que aparece visualizado en una ventana.
C C C C * * PB_Delete 'ODBC1' 'ODBC1' BEGACT Getatr Setatr ENDACT PRESS Main 1 0 'CurrentRow' Row Row 'DeleteRow'

Ejemplo de componente Interfaz ODBC/JDBC


En el ejemplo siguiente se utiliza una base de datos creada con Microsoft Access. La base de datos tiene una tabla denominada CUSTOMERS. Este programa de consulta simple visualiza una ventana que contiene los detalles de un cliente. Se proporcionan pulsadores que permiten ir a los registros siguiente y anterior, y actualizar y suprimir el registro actual. La figura siguiente muestra la ventana de consulta:

El cdigo de este ejemplo es el siguiente:

Captulo 7. Utilizacin de componentes

123

* D ConnectStr C D D D * Variables de trabajo DRow S 6 0 * * Definir punteros a almacenamientos * DP_001 S * DP_002 S * DP_003 S * DP_004 S * DP_005 S * DP_006 DP_007 DP_008 DP_009 DP_010 DP_011 S S S S S S * * * * * *

'DSN=MS Access 97 Database;DBQ=D:\data\help\odbc\CelDial.mdb;DefaultDir=D:\data\help\odbc;DriverId=25;FIL=MS Access;MaxBufferSiz'

intermedios de campos Nmero Nombre Nmero rep. Contacto Telfono Fax Direccin Ciudad Pas Cdigo postal Localidad postal

* * Seleccionar todos los registros * DSelAll C *

'Select * From "Customers"'

Figura 23. Cdigo para el ejemplo de consulta ODBC/JDBC (Pieza 1 de 7)

124

Programacin con VisualAge RPG

********************************************************************* * * * Ventana . : Main * * * * Componente : Main * * * * Evento . . : Create * * * * Descripcin: Enlazar campos de programa a columnas y conectar con * * tabla de base de datos CUSTOMERS * * * ********************************************************************* * C Main BEGACT CREATE Main * * Enlazar campos a columnas * Enlazar columna: Nmero * C 'ODBC' SetAtr 1 'Column' C 'ODBC' SetAtr 7 'BufferLen' C 'ODBC' SetAtr 1 'BufferType' C Eval P_001=%Addr(Number) C 'ODBC' SetAtr P_001 'BufferPtr' * * Enlazar columna: Nombre * C 'ODBC' SetAtr 2 'Column' C 'ODBC' SetAtr 40 'BufferLen' C 'ODBC' SetAtr 1 'BufferType' C Eval P_002=%Addr(Name) C 'ODBC' SetAtr P_002 'BufferPtr' * * Enlazar columna: Nmero rep. * C 'ODBC' SetAtr 3 'Column' C 'ODBC' SetAtr 5 'BufferLen' C 'ODBC' SetAtr 1 'BufferType' C Eval P_003=%Addr(Rep_number) C 'ODBC' SetAtr P_003 'BufferPtr' * * Enlazar columna: Contacto * C 'ODBC' SetAtr 4 'Column' C 'ODBC' SetAtr 30 'BufferLen' C 'ODBC' SetAtr 1 'BufferType' C Eval P_004=%Addr(Contact) C 'ODBC' SetAtr P_004 'BufferPtr' *

Figura 23. Cdigo para el ejemplo de consulta ODBC/JDBC (Pieza 2 de 7)

Captulo 7. Utilizacin de componentes

125

* * Enlazar columna: * C 'ODBC' C 'ODBC' C 'ODBC' C C 'ODBC' * * Enlazar columna: * C 'ODBC' C 'ODBC' C 'ODBC' C C 'ODBC' * * Enlazar columna: * C 'ODBC' C 'ODBC' C 'ODBC' C C 'ODBC' * * Enlazar columna: * C 'ODBC' C 'ODBC' C 'ODBC' C C 'ODBC' * * Enlazar columna: * C 'ODBC' C 'ODBC' C 'ODBC' C C 'ODBC' * * Enlazar columna: * C 'ODBC' C 'ODBC' C 'ODBC' C C 'ODBC' *

Telfono SetAtr SetAtr SetAtr Eval SetAtr Fax SetAtr SetAtr SetAtr Eval SetAtr Direccin SetAtr SetAtr SetAtr Eval SetAtr Ciudad SetAtr SetAtr SetAtr Eval SetAtr Pas SetAtr SetAtr SetAtr Eval SetAtr 9 'Column' 20 'BufferLen' 1 'BufferType' P_009=%Addr(Country) P_009 'BufferPtr' 8 'Column' 30 'BufferLen' 1 'BufferType' P_008=%Addr(City) P_008 'BufferPtr' 7 'Column' 40 'BufferLen' 1 'BufferType' P_007=%Addr(Address) P_007 'BufferPtr' 6 'Column' 17 'BufferLen' 1 'BufferType' P_006=%Addr(Fax) P_006 'BufferPtr' 5 'Column' 17 'BufferLen' 1 'BufferType' P_005=%Addr(Phone) P_005 'BufferPtr'

Cdigo postal SetAtr SetAtr SetAtr Eval SetAtr 10 'Column' 10 'BufferLen' 1 'BufferType' P_010=%Addr(Zip_Postal) P_010 'BufferPtr'

Figura 23. Cdigo para el ejemplo de consulta ODBC/JDBC (Pieza 3 de 7)

126

Programacin con VisualAge RPG

* * Enlazar columna: Localidad postal * C 'ODBC' SetAtr 11 'Column' C 'ODBC' SetAtr 5 'BufferLen' C 'ODBC' SetAtr 1 'BufferType' C Eval P_011=%Addr(Zip_loc) C 'ODBC' SetAtr P_011 'BufferPtr' C 'ODBC' SetAtr ConnectStr 'ConnectStr' * * Conectar a la base de datos y seleccionar todos los registros * C 'ODBC' SetAtr 1 'Connect' C 'ODBC' SetAtr SelAll 'SQLQuery' C 'ODBC' SetAtr 1 'ExecuteSQL' * * Buscar la primera fila de datos y visualizarla en la ventana * C 'ODBC' SetAtr 1 'FetchNext' C Write 'Main' * C ENDACT ********************************************************************* * * * Ventana . : Main * * * * Componente : PB_Prev * * * * Evento . . : Press * * * * Descripcin: Buscar la fila anterior y visualizarla * * * ********************************************************************* * C PB_PREV BEGACT PRESS Main * C 'ODBC' SetAtr 1 'FetchPrior' C Write 'Main' * C ENDACT *

Figura 23. Cdigo para el ejemplo de consulta ODBC/JDBC (Pieza 4 de 7)

Captulo 7. Utilizacin de componentes

127

********************************************************************* * * * Ventana . : Main * * * * Componente : PB_Next * * * * Evento . . : Press * * * * Descripcin: Buscar la fila siguiente y visualizarla * * * ********************************************************************* * C PB_NEXT BEGACT PRESS Main * C 'PB_Next' Setatr 0 'Enabled' C 'ODBC' SetAtr 1 'FetchNext' C Write 'Main' C 'PB_Next' Setatr 1 'Enabled' * C ENDACT * ********************************************************************* * * * Ventana . : Main * * * * Componente : PB_Insert * * * * Evento . . : Press * * * * Descripcin: * * * ********************************************************************* * C PB_INSERT BEGACT PRESS Main * C Read 'Main' C 'ODBC' SetAtr 1 'InsertRow' * C ENDACT *

Figura 23. Cdigo para el ejemplo de consulta ODBC/JDBC (Pieza 5 de 7)

128

Programacin con VisualAge RPG

********************************************************************* * * * Ventana . : Main * * * * Componente : PB_Delete * * * * Evento . . : Press * * * * Descripcin: Suprimir la fila actual * * * ********************************************************************* * C PB_DELETE BEGACT PRESS Main * * Confirmar supresin de fila C *MSG0001 Dsply mRC 9 0 * C If mRC=*YesButton C 'ODBC' GetAtr 'CurrentRow' Row C 'ODBC' SetAtr Row 'DeleteRow' C EndIf * C ENDACT * ********************************************************************* * * * Ventana . : Main * * * * Componente : PB_Update * * * * Evento . . : Press * * * * Descripcin: Actualizar la fila actual * * * ********************************************************************* * C PB_UPDATE BEGACT PRESS Main * C Read 'Main' C 'ODBC' GetAtr 'CurrentRow' Row C 'ODBC' SetAtr Row 'UpdateRow' * C ENDACT *

Figura 23. Cdigo para el ejemplo de consulta ODBC/JDBC (Pieza 6 de 7)

Captulo 7. Utilizacin de componentes

129

********************************************************************* * * * Ventana . : Main * * * * Componente : PB_Close * * * * Evento . . : Press * * * * Descripcin: Finalizar el programa * * * ********************************************************************* * C PB_CLOSE BEGACT PRESS Main * C Move *ON *INLR * C ENDAC *

Figura 23. Cdigo para el ejemplo de consulta ODBC/JDBC (Pieza 7 de 7)

130

Programacin con VisualAge RPG

Recuadro de contorno

Utilice un recuadro de contorno alrededor de un grupo de componentes para indicar que estn relacionados. Un recuadro de contorno no tiene etiqueta. Si en el recuadro debe aparecer una etiqueta, utilice el componente recuadro de grupo en lugar de ste. Para obtener informacin relacionada, consulte el apartado Recuadro de grupo en la pgina 79. Atributos de componente
Bottom ParentName Top Handle* PartName UserData Height PartType Visible Left Refresh Width

Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Create Destroy

Valores de altura (Height) y anchura (Width) especiales


Puede crear lneas utilizando dos atributos de recuadro de contorno. Establezca el atributo Width en 1 para crear una lnea vertical, y el atributo Height en 1 para crear una lnea horizontal.

Captulo 7. Utilizacin de componentes

131

Men emergente

Utilice el componente men emergente para visualizar las opciones que pertenecen a un componente determinado de la interfaz. Puede aadir opciones de men y submens a los mens emergentes. Este men se llama emergente porque aparece cuando el usuario pulsa la tecla o el botn del ratn adecuados. Nota: Las propiedades, los eventos y otros elementos de este componente slo se pueden manipular desde su men emergente de la vista de rbol de proyectos. Para obtener informacin relacionada, consulte el apartado: v Barra de mens en la pgina 103 v Elemento de men en la pgina 104 v Submen en la pgina 166 Atributos de componente
Handle* PartName X InvName PartType Y InvPName UserData ParentName Visible*

*Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse No hay eventos para este componente.

132

Programacin con VisualAge RPG

Barra de progreso

Utilice el componente barra de progreso para indicar de forma grfica el progreso de un proceso como, por ejemplo, copiar archivos, cargar una base de datos, etc. Por ejemplo, para mostrar el progreso de copiar 100 archivos, puede establecer el atributo PBRange en 100 y el atributo PBStepSize en 10. El cdigo podra supervisar el proceso de copiar archivos y el indicador de barra de progreso avanzara en pasos por cada diez archivos copiados. En las aplicaciones Java, si el ancho de la barra de progreso es menor que la altura, la barra de progreso ser vertical. Atributos de componente
Bottom ParentName PBSetPos UserData Handle* PartName PBStep Visible Height PartType PBStepSize Width Left PBRange Top

*Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Create Destroy

Ejemplo de barra de progreso


En el siguiente ejemplo, el indicador de barra de progreso se actualiza cada vez que se produce una operacin de lectura:
*...1....+....2....+....3....+....4....+....5....+....6....+....7....+....8 CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq---* C EVAL %setatr('win01':'WIN1':'PBRange')=10 C EVAL %setatr('win01':'WIN1':'PBStepSize')=1 C DO 10 C Read Input C EVAL %setatr('win01':'WIN1':'PBStep')=1 C EndDo *

Captulo 7. Utilizacin de componentes

133

Pulsador

Utilice pulsadores para proporcionar acceso a las acciones ms utilizadas. Cada componente pulsador controla una accin determinada. Cuando el usuario lo pulsa, la accin se inicia inmediatamente. La etiqueta de texto del pulsador describe la accin que ste realiza. Comprese con el apartado Pulsador grfico en la pgina 77. Atributos de componente
BackColor Enabled FontName ForeColor HelpEnable ParentName ShowTips Validate BackMix Focus FontSize ForeMix HighLight PartName TipText Visible Border* FontBold FontStrike* Handle* Label PartType Top Width Bottom FontItalic FontUnder* Height Left Refresh UserData

*Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Create MouseEnter Press Destroy MouseExit GotFocus MouseMove LostFocus Popup

Establecimiento de un pulsador por omisin


En el cuaderno de propiedades de un componente pulsador, puede especificar que desea que el pulsador sea el pulsador por omisin para la ventana que se est diseando. El pulsador por omisin se visualiza con un borde negro grueso y su accin asociada se lleva a cabo cuando el usuario pulsa la tecla Intro. Nota: Slo puede definir un pulsador por omisin por ventana. Si define ms de uno, VisualAge RPG elegir uno de ellos.

Establecimiento de un nemotcnico
Nota: Las aplicaciones Java no soportan nemotcnicos. Para cada pulsador, utilice el atributo Label para asociar el texto a un pulsador especfico. Ese texto aparece en el botn. Para especificar una clave nemotcnica para el elemento de men, coloque el identificador nemotcnico delante de un carcter en el texto del atributo Label. En Windows NT/95/98, se utiliza el smbolo &. El carcter al que se ha asignado la

134

Programacin con VisualAge RPG

clave nemotcnica se visualiza en la interfaz con un subrayado (por ejemplo, Cancelar). El subrayado informa a los usuarios que pueden seleccionar el pulsador presionando la tecla del carcter subrayado en el teclado.

Asignacin de teclas de mandato


Puede asignar una tecla de mandato a un pulsador. Para hacerlo, abra el cuaderno de propiedades y seleccione una de las teclas de mandato de la lista disponible. Cuando el usuario pulsa la tecla de mandato en tiempo de ejecucin, tiene el mismo efecto que si hubiese pulsado el botn de ratn o una tecla en el teclado. Un evento Press se seala en el programa.

Sealizacin de eventos
Un evento Press se seala en el programa cuando: v el usuario selecciona un pulsador. v el usuario pulsa la tecla Intro si se ha definido un pulsador por omisin. v el usuario pulsa una tecla de mandato que se ha asignado a un pulsador.

Captulo 7. Utilizacin de componentes

135

Botn de seleccin

Utilice botones de seleccin si desea que el usuario seleccione slo una opcin de un grupo de opciones relacionadas pero que se excluyen mutuamente. Cuando el usuario efecta una seleccin, la opcin seleccionada anteriormente en el grupo se deselecciona. Un botn de seleccin tiene forma circular y a su lado hay texto. Cuando est seleccionado, contiene un punto. No utilice botones de seleccin si desea que el usuario pueda seleccionar ms de una opcin al mismo tiempo. En este caso, consulte el apartado Recuadro de seleccin en la pgina 55. Atributos de componente
BackColor Enabled FontName ForeColor HighLight* PartName ShowTips Visible BackMix Focus FontSize ForeMix Label PartType TipText Width Bottom FontBold FontStrike* Handle* Left Refresh Top Checked FontItalic FontUnder* Height ParentName SelectIdx UserData

*Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Create MouseExit Destroy MouseMove Enter Popup MouseEnter Select

Establecimiento de un nemotcnico
Para especificar una clave nemotcnica para el pulsador, coloque el identificador nemotcnico delante de un carcter en el texto del atributo Label. En Windows NT/95/98, se utiliza el smbolo &. El carcter al que se ha asignado la clave nemotcnica se visualiza en la interfaz con un subrayado (por ejemplo, Azul). El subrayado informa a los usuarios que pueden seleccionar el botn de seleccin pulsando la tecla del carcter subrayado en el teclado. Nota: Las aplicaciones Java no soportan nemotcnicos.

Agrupacin de botones de seleccin


Cuando se crean botones de seleccin, se agrupan lgicamente de manera que la seleccin de un botn slo afecta al estado de los botones del grupo de ese botn. Por ejemplo, suponga que tiene cuatro botones de seleccin en una ventana de diseo. RB1 (Botn 1) y RB2 (Botn 2) se excluyen el uno al otro, al igual que RB3 (Botn 3) y RB4 (Botn 4). Debe agrupar estos botones en dos grupos lgicos. La

136

Programacin con VisualAge RPG

figura siguiente muestra cmo se pueden agrupar estos botones de seleccin en la ventana de diseo :

Para organizar los botones de seleccin en grupos lgicos: 1. Organice los botones de seleccin como desee y, opcionalmente, coloque un recuadro de grupo alrededor de cada grupo. (Consulte el apartado Recuadro de grupo en la pgina 79.) 2. Seleccione el componente lienzo en la ventana de diseo y pulse el botn 2 del ratn. 3. Seleccione Tabuladores y Grupos... del men emergente. Aparece la ventana Personalizar tabuladores y grupos mostrando una lista de todos los componentes de la ventana de diseo. Si es necesario, cambie el tamao de esta ventana para ver todos los componentes. 4. Pulse el botn 1 del ratn para seleccionar el botn de seleccin que ser el primer botn del primer grupo. En este ejemplo, RB1 es el primer botn de seleccin del grupo 1. 5. Pulse el botn 2 del ratn para obtener el men emergente para este componente botn de seleccin, y seleccione Marca de grupo. Aparece una marca de verificacin X junto al botn de seleccin bajo la columna Marca de grupo. Nota: Tambin puede establecer la marca de grupo en el cuaderno de propiedades para el componente. 6. Utilice Control+Flecha arriba y Control+Flecha abajo para colocar RB2 despus de RB1. Tenga en cuenta que tambin puede colocar estos botones dentro de la vista de rbol o utilizando los elementos de men mover arriba y mover abajo. Asegrese de que el atributo Group mark no se ha establecido para RB2. Esto especifica que RB2 es el segundo botn de seleccin del grupo 1. 7. Pulse Aceptar para cerrar la ventana. Nota: No cierre la ventana utilizando el men del sistema, o no se guardarn los cambios.

Captulo 7. Utilizacin de componentes

137

Ahora se considera que RB1 y RB2 forman parte de un grupo, de forma que seleccionar uno de ellos slo afectar al otro. Repita el mismo proceso para RB3 y RB4. La siguiente figura muestra la ventana Personalizar tabuladores y grupos despus de haber agrupado los componentes:

Nota: Los topes de tabulador y las marcas de grupo tambin pueden establecerse para componentes concretos desde el cuaderno de propiedades de un componente.

Establecimiento del estado de un botn de seleccin


En el cuaderno de propiedades del botn de seleccin, puede indicar si el botn de seleccin debe estar seleccionado inicialmente o no. Slo puede seleccionarse un botn de seleccin de un grupo al mismo tiempo. Si selecciona ms, slo permanecer seleccionado el ltimo del grupo. Por omisin, al crear un botn de seleccin, el atributo Checked se establece en 0. Esto quiere decir que el botn de seleccin no se establece y el estado pasa a desactivado. El botn de seleccin se visualiza con el crculo vaco. Si desea crear un botn de seleccin que est establecido y que el estado sea activado, debe establecer el atributo Checked en 1. En este caso, el botn de seleccin se visualiza con el crculo parcialmente rellenado. Puede establecer el atributo Checked en el cuaderno de propiedades o en el programa.

Sealizacin de eventos
Cuando el usuario selecciona un elemento de men, se seala un evento Select.

138

Programacin con VisualAge RPG

Graduador

Utilice el componente graduador si desea que el usuario visualice, establezca o modifique un valor moviendo el eje del graduador. Los graduadores suelen utilizarse para valores con incrementos habituales, como los segundos o los grados, o con el fin de mostrar qu porcentaje se ha realizado de una tarea. Por omisin, el graduador se sita horizontalmente en el centro de un recuadro con su eje en el lado izquierdo. Se puede visualizar una escala para mostrar las unidades de medida del graduador. Utilice el cuaderno de propiedades del componente graduador para: v Definir el rango de valores que un graduador puede devolver. v Colocar el graduador en posicin vertical u horizontal en una ventana. v Proporcionar una escala para indicar la unidad de medida del graduador. Atributos de componente
AddLink* Bottom FontItalic FontUnder* Height ParentName RemoveLink* TipText Visible AllowLink* Enabled FontName ForeColor Left PartName ShowTips Top Width BackColor Focus FontSize ForeMix Maximum PartType TickLabel UserData BackMix FontBold FontStrike* Handle* Minimum Refresh TickNumber Value

*Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Change Link* MouseMove Create LostFocus Popup Destroy MouseEnter GotFocus MouseExit

*Nota: Consulte la descripcin del evento si desea saber cules son las restricciones.

Obtencin y establecimiento del valor del graduador


Puede obtener o establecer el valor del graduador utilizando el atributo Value. Cuando obtenga el atributo Value de un graduador, asegrese de que ha definido un campo de resultado lo bastante grande para contener el valor devuelto.

Captulo 7. Utilizacin de componentes

139

Sealizacin de eventos
El evento Change se seala cuando cambia la posicin del nivel del graduador. Si utiliza botones de incremento para desplazar el nivel del graduador, el evento Change se seala continuamente mientras permanezcan pulsados los botones. Si utiliza el ratn para desplazar el nivel del graduador, se produce el evento Change despus de haber soltado el botn del ratn.

Ejemplo de graduador
Este ejemplo muestra cmo el componente graduador puede utilizarse para controlar el color de otros componentes utilizando el atributo BackMix. A medida que se desplaza cada graduador, se utiliza su valor para determinar la mezcla de color de fondo y su componente texto esttico correspondiente, para mostrar la intensidad de dicho color. El color de fondo del texto esttico con la etiqueta Ejemplo se actualiza para mostrar la mezcla de color combinado de los tres colores.

140

Programacin con VisualAge RPG

********************************************************************* * * * ID de programa : SLIDER * * * * Descripcin . : Programa de ejemplo que muestra el componente * * graduador. * * * * Al mover cada nivel del graduador, se seala un * * evento CHANGE para ese graduador. * * La subrutina de accin CHANGE recupera el valor * * del graduador y actualiza la mezcla de color de * * fondo de su componente texto esttico * * correspondiente para mostrar la intensidad de * * ese color. * * * * La mezcla de color de fondo del componente * * texto esttico 'SAMPLE' tambin se actualiza * * para mostrar el resultado de mezclar todos los * * valores de colores. * * * ********************************************************************* *

* ********************************************************************* * * * Ventana. . : MAIN * * * * Componente : PB_EXIT * * * * Evento . . : PRESS * * * * Descripcin: Terminar el programa * * * ********************************************************************* * C PB_EXIT BEGACT PRESS MAIN * C move *on *inlr * C ENDACT

Figura 24. Ejemplo de cdigo en el que se utiliza el componente graduador (Pieza 1 de 4)

Captulo 7. Utilizacin de componentes

141

********************************************************************* * * * Ventana. . : MAIN * * * * Componente : GREEN * * * * Evento . . : CHANGE * * * * Descripcin: Actualizar el valor de color verde. * * * ********************************************************************* * C GREEN BEGACT CHANGE MAIN * C 'green' getatr 'Value' val 3 0 C move val grnmix 3 C move *blanks mix 11 C movel '000:' mix C mix cat grnmix:0 mix C mix cat ':000':0 mix C 'STGreen' setatr mix 'BackMix' C exsr update * C ENDACT ********************************************************************* * * * Ventana. . : MAIN * * * * Componente : BLUE * * * * Evento . . : CHANGE * * * * Descripcin: Actualizar el valor de color azul. * * * ********************************************************************* * C BLUE BEGACT CHANGE MAIN * C 'blue' getatr 'Value' val C move val blumix 3 C move *blanks mix C movel '000:000:' mix C mix cat blumix:0 mix C 'STBlue' setatr mix 'BackMix' C exsr update * C ENDACT

Figura 24. Ejemplo de cdigo en el que se utiliza el componente graduador (Pieza 2 de 4)

142

Programacin con VisualAge RPG

********************************************************************* * * * Subrutina . . : UPDATE * * * * Descripcin . : Actualiza la mezcla de color de fondo del * * componente de texto esttico 'Sample' para * * mostrar el resultado de combinar los valores * * de colores de los tres graduadores. * * * ********************************************************************* * C UPDATE BEGSR * C move *blanks smpmix 11 C movel redmix smpmix C smpmix cat ':':0 smpmix C smpmix cat grnmix:0 smpmix C smpmix cat ':':0 smpmix C smpmix cat blumix:0 smpmix C 'Sample' setatr smpmix 'BackMix' * C ENDSR ********************************************************************* * * * Ventana. . : MAIN * * * * Componente : RED * * * * Evento . . : CHANGE * * * * Descripcin: Actualizar el valor de color rojo. * * * ********************************************************************* * C RED BEGACT CHANGE FRA0000B * C 'red' getatr 'Value' val C move val redmix 3 C move *blanks mix C movel redmix mix C mix cat ':000:000':0 mix C 'STRed' setatr mix 'BackMix' C exsr update * C ENDACT

Figura 24. Ejemplo de cdigo en el que se utiliza el componente graduador (Pieza 3 de 4)

Captulo 7. Utilizacin de componentes

143

********************************************************************* * * * Ventana. . : MAIN * * * * Componente : MAIN * * * * Evento . . : CREATE * * * * Descripcin: Inicializar la mezcla de color * * * ********************************************************************* * C MAIN BEGACT CREATE MAIN * C move '000' grnmix C move '000' blumix C move '000' redmix * C ENDACT

Figura 24. Ejemplo de cdigo en el que se utiliza el componente graduador (Pieza 4 de 4)

144

Programacin con VisualAge RPG

Selector cclico

Utilice el componente selector cclico para visualizar, de forma secuencial, un grupo de opciones relacionadas, pero que se excluyen mutuamente, que tienen un orden consecutivo lgico; por ejemplo, los meses del ao. Las opciones se visualizan como si estuvieran organizadas en forma de anillo. El usuario puede mover (o girar) las opciones pulsando la flecha hacia arriba para ir al valor superior siguiente o la flecha hacia abajo para ir al valor inferior siguiente. Tambin puede escribir una opcin directamente en el campo de entrada del selector cclico. Atributos de componente
AddItemEnd Bottom FontItalic FontUnder* Height ParentName Refresh TipText Visible Alignment* Enabled FontName ForeColor Left PartName RemoveItem Top Width BackColor Focus FontSize ForeMix Maximum PartType ShowTips UserData BackMix FontBold FontStrike* Handle* Minimum ReadOnly Text Value

*Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Change Link* MouseMove SpinUp Create LostFocus Popup Destroy MouseEnter SpinDown GotFocus MouseExit SpinEnd

*Nota: Consulte la descripcin del evento si desea saber cules son las restricciones.

Establecimiento de valores del selector cclico


El tipo de datos del selector cclico determina el mtodo utilizado para establecer los valores del selector cclico. Para especificar los valores permitidos para un selector cclico, establezca los atributos Maximum y Minimum. Para establecer los valores iniciales de la lista de selectores cclicos de un botn de selector cclico de caracteres, establezca el atributo AddItemEnd para cada elemento que desee aadir. Aada los elementos en el orden en que desea que aparezcan, porque los elementos del selector cclico de caracteres no se clasifican automticamente.

Captulo 7. Utilizacin de componentes

145

Obtencin del valor del selector cclico


El atributo que se utiliza para recuperar el valor que se selecciona en un selector cclico depende del tipo de selector cclico. v Para los selectores cclicos de caracteres, utilice el atributo Text. v Para los selectores cclicos numricos, utilice el atributo Value. Este atributo devuelve un valor entre los valores mnimo y mximo inclusive especificados para el selector cclico.

Cmo evitar la entrada de datos por parte del usuario


Puede impedir que el usuario escriba un valor directamente en el campo asociado al selector cclico estableciendo el atributo ReadOnly en el cuaderno de propiedades del selector cclico o estableciendo este atributo en 1 en el programa.

Ejemplo de selector cclico


Este ejemplo muestra cmo establecer y obtener los valores para un selector cclico numrico y de caracteres. Cuando se inicia el programa, se inserta una lista inicial en cada selector cclico. Cuando se selecciona el pulsador Copiar, el valor de cada selector cclico se copia al componente campo de entrada asociado. Accione el pulsador Cerrar para terminar el programa.

146

Programacin con VisualAge RPG

********************************************************************* * * * ID de programa : SPIN * * * * Descripcin . : Programa de ejemplo que muestra el componente * * selector cclico. * * * * Se utiliza un selector cclico de caracteres y * * otro numrico para mostrar cmo se inicializan * * y cmo se recuperan sus valores. * * * ********************************************************************* *

* DDAY S 10A DIM(7) PERRCD(1) CTDATA * ********************************************************************* * * * Ventana. . : MAIN * * * * Componente : PB_COPY * * * * Evento . . : PRESS * * * * Descripcin: Copiar el valor de cada botn selector cclico a * * su componente campo de entrada correspondiente. * * * ********************************************************************* * C PB_COPY BEGACT PRESS MAIN * C 'SPB1' Getatr 'Value' tmp2N 2 0 C 'EF1' Setatr tmp2N 'Text' * C 'SPB2' Getatr 'Text' tmp 10 C 'EF2' Setatr tmp 'Text' * C ENDACT

Figura 25. Ejemplo de cdigo en el que se utiliza el componente selector cclico (Pieza 1 de 2)

Captulo 7. Utilizacin de componentes

147

********************************************************************* * * * Ventana. . : MAIN * * * * Componente : MAIN * * * * Evento . . : CREATE * * * * Descripcin: Centrar la ventana en la pantalla e * * inicializar los selectores cclicos. * * * ********************************************************************* * C MAIN BEGACT CREATE MAIN * * Inicializar el selector cclico de caracteres con los das * de la semana a partir de la matriz DAY C Do 7 I 2 0 C 'SPB2' Setatr day(i) 'AddItemEnd' C EndDo * * Inicializar el selector cclico numrico C 'SPB1' Setatr 1 'Minimum' C 'SPB1' Setatr 10 'Maximum' * C ENDACT ********************************************************************* * * * Ventana. . : MAIN * * * * Componente : PB_EXIT * * * * Evento . . : PRESS * * * * Descripcin: Terminar el programa * * * ********************************************************************* * C PB_EXIT BEGACT PRESS MAIN * C Move *On *INLR * C ENDACT **CTDATA DAY Domingo Lunes Martes Mircoles Jueves Viernes Sbado

Figura 25. Ejemplo de cdigo en el que se utiliza el componente selector cclico (Pieza 2 de 2)

148

Programacin con VisualAge RPG

Texto esttico

Utilice el componente texto esttico como etiqueta de otros componentes, por ejemplo, como solicitud de un componente campo de entrada. Los componentes texto esttico no aceptan la entrada de datos por parte del usuario. En las aplicaciones Java, el texto esttico se visualiza nicamente en una sola lnea. Atributos de componente
Alignment DataType FontBold FontStrike* Handle* ParentName ShowTips Visible BackColor DragEnable* FontItalic FontUnder* Height PartName TipText Width BackMix DropEnable* FontName ForeColor Label PartType Top Bottom Enabled FontSize ForeMix Left Refresh UserData

*Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Click Drop MouseExit Create Link* MouseMove DblClick MouseDown MouseUp Destroy MouseEnter Popup

*Nota: Consulte la descripcin del evento si desea saber cules son las restricciones.

Cambio del texto de un componente texto esttico


El componente texto esttico es un rea rectangular en la que se coloca el texto. Utilice el atributo Label para cambiar el texto de un elemento de texto esttico. Si cambia el texto de tal manera que sea ms largo que el texto original, el nuevo texto se recortar en los bordes del rectngulo que lo rodea. El texto tambin se recortar si cambia los atributos FontName y FontSize a un font o tamao mayor. Cuando cambie el texto del programa, asegrese de que el componente texto esttico en el Diseador GUI es lo bastante grande para mostrar el texto nuevo.

Obtencin de valores de texto esttico


Para obtener el valor de un componente de texto esttico, debe especificar el atributo Label. Si est obteniendo el valor de un componente texto esttico numrico, el campo que recibe el valor tambin debe definirse como numrico.

Captulo 7. Utilizacin de componentes

149

Obtencin y establecimiento de informacin para una ventana


Durante la compilacin, el compilador define de manera implcita los campos del programa con el mismo nombre que el componente texto esttico y con el mismo tipo de datos y longitud. Mediante los cdigos de operacin READ y WRITE con un nombre de ventana especificado en el factor 2, el valor del atributo Label se copia automticamente en estos campos o desde ellos. Los cdigos de operacin READ y WRITE son muy tiles si se tienen muchos componentes texto esttico en la interfaz de usuario, para que no tenga que establecer los atributos y obtener un valor de forma repetitiva. Consulte el Captulo 3. Programacin con componentes en la pgina 25 si desea ms informacin.

Edicin de la salida
Puede editar el contenido de un componente texto esttico si el tipo de datos es numrico. Consulte el Captulo 11. Edicin de la salida en la pgina 229 para obtener una descripcin de la edicin.

150

Programacin con VisualAge RPG

Barra de estado

Utilice el componente barra de estado para proporcionar informacin adicional sobre un proceso o una accin de la ventana. Puede crear hasta cinco paneles para la barra de estado. El componente barra de estado proporciona al componente ventana mayor flexibilidad que el atributo StatusBar. Por omisin, la barra de estado se crea en la parte inferior de la ventana. No obstante, puede utilizar el cuaderno de propiedades para colocarla en la parte superior. Tambin puede establecer el estilo del borde, el nmero de paneles y la alineacin del texto. Atributos de componente
Handle* SBIndex Visible ParentName SBLabel PartName SBPanes PartType UserData

*Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Create Destroy

Ejemplo de Barra de estado


En el siguiente ejemplo, la etiqueta de la barra de estado se actualiza mientras se lleva a cabo el proceso inicial:
*...1....+....2....+....3....+....4....+....5....+....6....+....7....+....8 CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq---* C STBAR BEGACT CREATE MAIN C 'STBAR' SETATR 'Wait...' 'SBLABEL' * * Efectuar un proceso. * C DO C ... C ENDDO * * Borrar la etiqueta de barra de estado. * C 'STBAR' SETATR *BLANKS 'SBLABEL' C ENDACT *

Captulo 7. Utilizacin de componentes

151

Subarchivo

Utilice el componente subarchivo para visualizar una lista de registros, cada uno de los cuales consta de uno o ms campos. La funcin del componente subarchivo es similar a la de un subarchivo de AS/400 . El usuario puede desplazar el contenido de la lista en sentido horizontal o vertical utilizando las barras de desplazamiento del subarchivo. Para crear un campo de entrada de subarchivo, aada un campo de la ventana Definir campos de referencia o de la paleta de componentes en el componente subarchivo. Tambin puede aadir campos utilizando el cuaderno de propiedades. Nota: El componente subarchivo slo se puede colocar en una pgina de cuaderno con lienzo o en una ventana con lienzo. Atributos de componente
AddItemEnd BackMix ButtonTip CellFGClr ColFGClr Count ExtSelect* FontBold FontStrike* Handle* HdgFGMix Hidden Left PageSize RemoveItem RowFGMix SelectList SizeToFit TopRecord Width AllowEdit Bottom CapsLock CellFGMix ColFGMix DeSelect FirstSel FontItalic FontUnder* HdgBGClr HdgIdx HRule MultSelect ParentName RowBGClr Scale SetTop StartAt UserData AutoSelect ButtonIdx CellBGClr ColBGClr ColNumber EnableBtn Focus FontName ForeColor HdgBGMix HdgText Index NbrOfSel PartName RowBGMix Selected SflNxtChg TipText Visible BackColor Buttons CellBGMix ColBGMix ColWidth Enabled FontArea FontSize ForeMix HdgFGClr Height ItemCount OpenEdit PartType RowFGClr SelectItem ShowTips Top VRule

* Nota:: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Change Enter LastRec MouseMove PageTop Select ColSelect FirstRec LostFocus NextRec PageUp VKeyPress Create GotFocus MouseEnter PageDown Popup Destroy KeyPress MouseExit PageEnd PrevRec

152

Programacin con VisualAge RPG

Creacin de un componente subarchivo


Slo puede crear un componente subarchivo en un componente lienzo.

Nmero mximo de campos por subarchivo


Puede definir un mximo de 99 campos para un subarchivo.

Cdigos de operacin para manipular componentes subarchivo


Adems de utilizar atributos para controlar un subarchivo, puede utilizar varios cdigos de operacin que afecten al componente subarchivo. Especifique el nombre del subarchivo en el factor 2. No lo ponga entre comillas. Estn soportados los siguientes cdigos de operacin. Para obtener una descripcin completa de cada uno de ellos, consulte la publicacin VisualAge RPG Manual de consulta del lenguaje, SC10-3066-01 (SC09-2451-01), o la ayuda dependiente de lenguaje. Cdigo Operacin CHAIN Lee un registro de un subarchivo especificando un ndice. CLEAR Borra todos los registros del subarchivo. DELETE Suprime un registro del subarchivo. Todos los registros que siguen al registro suprimido ascienden una posicin. READC Lee un registro si ha cambiado el valor de cualquiera de los campos de entrada del registro. READS Lee un registro seleccionado del subarchivo. Los usuarios pueden seleccionar un registro mediante el ratn o el teclado. Una vez ledo el registro, se deselecciona. UPDATE Actualiza un registro de subarchivo existente. Debe haberse ledo un registro antes de que pueda utilizarse este cdigo de operacin. WRITE Aade un registro nuevo al subarchivo.

Carga de un subarchivo
Para visualizar informacin en un componente subarchivo, la informacin se graba de registro en registro en el componente subarchivo. Los campos de subarchivo que se definieron en el Diseador GUI para el componente subarchivo se establecen en los valores deseados, y la operacin WRITE se realiza en el formato de registro de subarchivo.

Determinacin del tamao de subarchivo


A diferencia del subarchivo AS/400, el componente subarchivo no tiene tamaos de pgina de subarchivo. El nmero de registros que un subarchivo puede contener est limitado por la cantidad de memoria en la estacin de trabajo. El
Captulo 7. Utilizacin de componentes

153

tamao de pgina de subarchivo (es decir, el nmero de registros que se muestran a la vez) se determina al crear el subarchivo en el Diseador GUI.

Obtencin de la cuenta de registros


Para determinar cuntos registros estn en un archivo actualmente, utilice el atributo Count.

Lectura y actualizacin de registros


Los registros de un componente subarchivo pueden actualizarse o suprimirse. Para actualizar registros, primero debe situar el subarchivo en el registro que desea actualizar. Puede situar el subarchivo mediante una operacin CHAIN, READC o READS. Estas operaciones hacen que los valores de campo del registro recuperado se asignen a los campos de programa correspondientes para el formato de registro de subarchivo. Luego, el programa puede modificar los valores de campo. Una operacin UPDATE ejecutada en el componente subarchivo enva a continuacin los valores actuales de los campos asociados devueltos al subarchivo. Utilice CHAIN para seleccionar registros segn la posicin relativa en un subarchivo, READC para seleccionar registros que el usuario ha modificado en la pantalla de subarchivo, y READS para los registros que el usuario ha seleccionado. El ejemplo siguiente muestra cmo la operacin READS efecta un bucle para obtener todos los registros seleccionados en un subarchivo y cmo los procesa y actualiza, uno a uno. Se codifica en una subrutina de accin para el evento Press para un pulsador denominado Informe.
. . .

C C C

* * * * * * * * * *

REPORT

BEGACT READS

PRESS SUBF1 *OFF

WIN1 99

*IN99

DOWEQ

Para el registro seleccionado, procesarlo y marcarlo como 'Informado' en la pantalla de subarchivo. MOVEL UPDATE READS END ENDACT '(Reported)' SUBF1 SUBF1 99 SF1NAME

C C C C C

Figura 26. Ejemplo de codificacin de lectura y modificacin de registros

Cambio de campos de subarchivo


Nota: El usuario no puede cambiar un campo de subarchivo si se establece como de slo lectura. Antes de que el usuario pueda cambiar un campo en un subarchivo, el usuario de la aplicacin o usted en el programa debe abrirlo:

154

Programacin con VisualAge RPG

1. El usuario selecciona el campo con el puntero del ratn y pulsa el botn 1 del ratn mientras mantiene pulsada la tecla Alt. A continuacin, el usuario puede utilizar las teclas de tabulador y retroceso de tabulador para desplazarse por diferentes campos en el mismo registro, y utilizar las teclas de flecha arriba y flecha abajo para desplazarse a registros distintos. 2. Para abrir un campo para editarlo en el programa: a. Utilice el atributo Index para indicar qu registro contiene el campo que va a editarse. b. Establezca el atributo ColNumber para indicar el nmero de columna del campo que va a editarse. c. Establezca el valor del atributo OpenEdit en 1 para abrir el campo con el propsito de editarlo. (Puede establecer este valor del atributo en 0 para cerrar cualquier campo que est abierto actualmente para editarse.) Utilice la operacin READC para determinar si el usuario ha cambiado algn campo en el subarchivo.

Campos ocultos
En el cuaderno de propiedades del componente subarchivo, puede establecer que campos de subarchivo estn Ocultos para que no se visualicen. Por ejemplo, un registro de subarchivo puede contener informacin de clave de registro en un campo oculto. El campo oculto no puede verse, pero se devuelve al programa con el registro de subarchivo.

Formato de campos de subarchivo


Los campos de un subarchivo pueden resaltarse de varias maneras. Pueden establecerse colores de primer plano y de fondo tanto para cabeceras de subarchivo como para campos de subarchivo concretos. Pueden colocarse separadores de lnea horizontal o vertical en un subarchivo. Vaya a Captulo 11. Edicin de la salida en la pgina 229 para obtener ms informacin.

Habilitacin de la tabulacin
Utilice el dilogo Personalizar tabuladores y grupos para habilitar la tabulacin en un componente subarchivo. Pulse con el botn derecho del ratn en el componente lienzo de la ventana que contiene el componente subarchivo. Seleccione Tabuladores y grupos en el men emergente. Aparecer el dilogo Personalizar tabuladores y grupos. Para establecer o borrar el valor de tabulacin, pulse con el botn derecho del ratn en el nombre del componente y seleccione la opcin de men Tabulador.

Ejemplo de subarchivo
En el siguiente ejemplo, se utiliza un componente subarchivo para visualizar registros de un archivo de base de datos en un sistema AS/400. En lugar de rellenar el subarchivo con todos los registros de la base de datos, se proporcionan pulsadores de navegacin (FirstRec, LastRec, PageTop, PageUp, PageDown, PrevPage, NextPage) con el fin de controlar el desplazamiento por los registros dentro del subarchivo. Cuando accione el pulsador Select, se utiliza el cdigo de operacin READS para determinar qu registro se ha seleccionado, y el valor del campo CUSTNO se visualiza en el componente texto esttico. Adems se abre el primer campo del registro para editarlo.
Captulo 7. Utilizacin de componentes

155

Seleccione el elemento de men Exit para finalizar el programa.

H FCUSTOMER IF E DISK REMOTE INFDS(INFDS) BLOCK(*Yes) * * INFDS para el archivo de base de datos. FileSize contendr * el nmero de registros en el archivo cuando ste se abri. DINFDS DS DFileSize 156 159B 0 * ********************************************************************* * * * Subrutina . . : *INZSR * * * * Descripcin . : Inicializar las variables de trabajo. * * * ********************************************************************* * C *INZSR BEGSR * C Z-Add 10 PageSize 2 0 C Z-Add 1 CurRec 6 0 C FileSize Sub PageSize LastPage 6 0 C Add 1 LastPage * C ENDSR * *

********************************************************************* * * * ID de programa : SUBFILE * * * * Descripcin . : Programa de ejemplo que muestra el componente * * subarchivo. * * * * Este programa de ejemplo requiere un archivo * * fsico de base de datos en el AS/400 * * denominado CUSTOMER. * * * ********************************************************************* *

Figura 27. Ejemplo de codificacin utilizando el componente subarchivo (Pieza 1 de 10)

156

Programacin con VisualAge RPG

********************************************************************* * * * Subrutina . . : NEXTPAGE * * * * Descripcin . : Obtener la pgina siguiente de los registros * * de la base de datos. * * * ********************************************************************* * C NEXTPAGE BEGSR * C add PageSize CurRec * C CurRec IfGt FileSize C Sub PageSize CurRec * C Else C Exsr FillPage C 'SFl1' setatr 2 'BUTTONIDX' C 'SFL1' setatr 1 'ENABLEBTN' C EndIf * C ENDSR

Figura 27. Ejemplo de codificacin utilizando el componente subarchivo (Pieza 2 de 10)

Captulo 7. Utilizacin de componentes

157

********************************************************************* * * * Subrutina . . : PREVPAGE * * * * Descripcin . : Devolver la pgina anterior de registros de la * * base de datos. * * * ********************************************************************* * C PREVPAGE BEGSR * C Sub PageSize CurRec * C CurRec IfLe *zero C Add PageSize CurRec * C Else C Exsr FillPage C 'SFl1' setatr 5 'BUTTONIDX' C 'SFL1' setatr 1 'ENABLEBTN' C EndIf * C ENDSR ********************************************************************* * * * Subrutina . . : FILLPAGE * * * * Descripcin . : Rellenar el componente subarchivo con una pgina * * de registros de la base de datos. * * * ********************************************************************* * C FILLPAGE BEGSR * C Clear Sfl1 C CurRec Setll customer C Z-Add 1 count 2 0 C Read customer 9999 * C *in99 DoWeq *off C count AndLE PageSize C Write Sfl1 * C If %Getatr('Main':'HILITE':'Checked')=1 C 'SFL1' Setatr Count 'Index' C 'SFL1' Setatr 1 'ColNumber' C 'SFL1' Setatr *DarkGreen 'CellFGClr' C 'SFL1' Setatr 2 'ColNumber' C 'SFL1' Setatr *DarkPink 'CellFGClr' C 'SFL1' Setatr 3 'ColNumber' C 'SFL1' Setatr *DarkBlue 'CellFGClr' C EndIf

Figura 27. Ejemplo de codificacin utilizando el componente subarchivo (Pieza 3 de 10)

158

Programacin con VisualAge RPG

C C C C C C C C C C C C C C C C C C C C C C C C C C

* * CurRec 'SFl1' 'SFL1' 'SFl1' 'SFL1' 'SFl1' 'SFL1' 'SFl1' 'SFL1' *in99 CurRec 'SFl1' 'SFL1' 'SFl1' 'SFL1' 'SFl1' 'SFL1' 'SFl1' 'SFL1'

Add Read EndDo Read ifeq setatr setatr setatr setatr setatr setatr setatr setatr endif ifeq oreq setatr setatr setatr setatr setatr setatr setatr setatr endif ENDSR

1 customer customer 1 1 0 2 0 5 1 6 1 *on LastPage 1 1 2 1 5 0 6 0

count

9999 9999

'BUTTONIDX' 'ENABLEBTN' 'BUTTONIDX' 'ENABLEBTN' 'BUTTONIDX' 'ENABLEBTN' 'BUTTONIDX' 'ENABLEBTN'

'BUTTONIDX' 'ENABLEBTN' 'BUTTONIDX' 'ENABLEBTN' 'BUTTONIDX' 'ENABLEBTN' 'BUTTONIDX' 'ENABLEBTN'

* ********************************************************************* * * * Ventana. . : MAIN * * * * Componente : MAIN * * * * Evento . . : CREATE * * * * Descripcin: Obtener la primera pgina de los registros. * * * ********************************************************************* * C MAIN BEGACT CREATE MAIN * C Exsr FillPage * C 'SFL1' Setatr *Green 'HdgBGClr' C 'SFL1' Setatr *Black 'HdgFGClr' C 'SFL1' Setatr 1 'ColNumber'

Figura 27. Ejemplo de codificacin utilizando el componente subarchivo (Pieza 4 de 10)

Captulo 7. Utilizacin de componentes

159

C C C C C C C C C C C C C C C C

ENDACT * * ********************************************************************* * * * Ventana. . : MAIN * * * * Componente : PB_SELECT * * * * Evento . . : PRESS * * * * Descripcin: Leer el registro de subarchivo seleccionado. * * Se actualiza el componente de texto esttico * * 'Selected' para mostrar el nmero de cliente * * seleccionado. * * Se abre el primer campo del subarchivo para su * * edicin. * * * ********************************************************************* * C PB_SELECT BEGACT PRESS MAIN * C Reads sfl1 27 * C *in27 IfEq *off C 'Selected' Setatr custno 'Label' C 'SFL1' Setatr 1 'ColNumber' C 'SFL1' Setatr 1 'OpenEdit' C EndIf * C ENDACT

'MAIN' 'SFL1' 'SFL1' 'SFL1' 'SFL1' 'SFL1' 'SFL1' 'SFL1' 'SFL1' 'SFL1' 'SFL1' 'SFL1' 'SFL1' 'SFL1' 'SFL1'

Setatr Setatr Setatr Setatr Setatr Setatr Setatr Setatr Setatr Setatr Setatr Setatr Setatr Setatr Setatr

1 1 '*MSG0001' 0 2 '*MSG0002' 0 3 0 4 0 5 '*MSG0004' 6 '*MSG0005'

'Visible' 'BUTTONIDX' 'BUTTONTIP' 'ENABLEBTN' 'BUTTONIDX' 'BUTTONTIP' 'ENABLEBTN' 'BUTTONIDX' 'ENABLEBTN' 'BUTTONIDX' 'ENABLEBTN' 'BUTTONIDX' 'BUTTONTIP' 'BUTTONIDX' 'BUTTONTIP'

Figura 27. Ejemplo de codificacin utilizando el componente subarchivo (Pieza 5 de 10)

160

Programacin con VisualAge RPG

********************************************************************* * * * Ventana. . : MAIN * * * * Componente : HRULE * * * * Evento . . : MENUSELECT * * * * Descripcin: * * * ********************************************************************* * C HRULE BEGACT MENUSELECT MAIN * C If %Getatr('Main':'HRULE':'Checked')=1 C 'SFL1' Setatr 0 'HRule' C 'HRULE' Setatr 0 'Checked' * C Else C 'SFL1' Setatr 1 'HRule' C 'HRULE' Setatr 1 'Checked' C EndIf * C ENDACT ********************************************************************* * * * Ventana. . : MAIN * * * * Componente : VRULE * * * * Evento . . : MENUSELECT * * * * Descripcin: * * * ********************************************************************* * C VRULE BEGACT MENUSELECT MAIN * C If %Getatr('Main':'VRULE':'Checked')=1 C 'SFL1' Setatr 0 'VRule' C 'VRULE' Setatr 0 'Checked' * C Else C 'SFL1' Setatr 1 'VRule' C 'VRULE' Setatr 1 'Checked' C EndIf * C Exsr FillPage * C ENDACT

Figura 27. Ejemplo de codificacin utilizando el componente subarchivo (Pieza 6 de 10)

Captulo 7. Utilizacin de componentes

161

********************************************************************* * * * Ventana. . : MAIN * * * * Componente : HILITE * * * * Evento . . : MENUSELECT * * * * Descripcin: * * * ********************************************************************* * C HILITE BEGACT MENUSELECT MAIN * C If %Getatr('Main':'HILITE':'Checked')=1 C Eval %Setatr('Main':'HILITE':'Checked')=0 * C Else C Eval %Setatr('Main':'HILITE':'Checked')=1 C EndIf * C Exsr FillPage * C ENDACT ********************************************************************* * * * Ventana. . : MAIN * * * * Componente : SFL1 * * * * Evento . . : PAGETOP * * * * Descripcin: * * * ********************************************************************* * C SFL1 BEGACT PAGETOP MAIN * C Z-Add 1 CurRec C Exsr FillPage * C ENDACT

Figura 27. Ejemplo de codificacin utilizando el componente subarchivo (Pieza 7 de 10)

162

Programacin con VisualAge RPG

********************************************************************* * * * Ventana. . : MAIN * * * * Componente : SFL1 * * * * Evento . . : PAGEUP * * * * Descripcin: * * * ********************************************************************* * C SFL1 BEGACT PAGEUP MAIN * C exsr PrevPage * C ENDACT * ********************************************************************* * * * Ventana. . : MAIN * * * * Componente : SFL1 * * * * Evento . . : LASTREC * * * * Descripcin: * * * ********************************************************************* * C SFL1 BEGACT LASTREC MAIN * C FileSize Sub PageSize CurRec C Add 1 CurRec * C CurRec IfLt 1 C Z-Add 1 CurRec C EndIf * C Exsr FillPage * C 'SFL1' setatr 1 'BUTTONIDX' C 'SFL1' setatr 1 'ENABLEBTN' C 'SFL1' setatr 2 'BUTTONIDX' C 'SFL1' setatr 1 'ENABLEBTN' C 'SFL1' setatr 5 'BUTTONIDX' C 'SFL1' setatr 0 'ENABLEBTN' C 'SFL1' setatr 6 'BUTTONIDX' C 'SFL1' setatr 0 'ENABLEBTN' C ENDACT

Figura 27. Ejemplo de codificacin utilizando el componente subarchivo (Pieza 8 de 10)

Captulo 7. Utilizacin de componentes

163

********************************************************************* * * * Ventana. . : MAIN * * * * Componente : SFL1 * * * * Evento . . : PAGEDOWN * * * * Descripcin: * * * ********************************************************************* * C SFL1 BEGACT PAGEDOWN MAIN * C Exsr NextPage * C ENDACT ********************************************************************* * * * Ventana. . : MAIN * * * * Componente : SFL1 * * * * Evento . . : FIRSTREC * * * * Descripcin: * * * ********************************************************************* * C SFL1 BEGACT FIRSTREC MAIN * C Z-Add 1 CurRec C Exsr FillPage * C 'SFL1' setatr 1 'BUTTONIDX' C 'SFL1' setatr 0 'ENABLEBTN' C 'SFL1' setatr 2 'BUTTONIDX' C 'SFL1' setatr 0 'ENABLEBTN' C 'SFL1' setatr 5 'BUTTONIDX' C 'SFL1' setatr 1 'ENABLEBTN' C 'SFL1' setatr 6 'BUTTONIDX' C 'SFL1' setatr 1 'ENABLEBTN' C ENDACT

Figura 27. Ejemplo de codificacin utilizando el componente subarchivo (Pieza 9 de 10)

164

Programacin con VisualAge RPG

********************************************************************* * * * Ventana. . : MAIN * * * * Componente : EXIT * * * * Evento . . : MENUSELECT * * * * Descripcin: * * * ********************************************************************* * C EXIT BEGACT MENUSELECT MAIN * C Move *on *inlr * C ENDACT

Figura 27. Ejemplo de codificacin utilizando el componente subarchivo (Pieza 10 de 10)

Sealizacin de eventos
El evento Select se seala cuando: v Un usuario selecciona un elemento que ya est en un subarchivo. v Selecciona un elemento de la lista en el programa. v Un usuario selecciona un elemento que ya ha sido seleccionado. El evento Enter se seala cuando: v Un usuario efecta una doble pulsacin sobre un elemento que est en el subarchivo. v Un usuario pulsa la tecla Intro cuando el subarchivo tiene el foco y se ha seleccionado un elemento. En la subrutina de accin para estos eventos, puede utilizar el cdigo de operacin READS para determinar qu elemento se ha seleccionado.

Captulo 7. Utilizacin de componentes

165

Submen

Utilice un submen para: v Iniciar un men en cascada nuevo a partir de una opcin de men de un men ya existente. v Iniciar un men desplegable a partir de una opcin de men de la barra de mens. Tras crear un submen, puede aadirle opciones de men colocando componentes opcin de men, pero solamente en la vista de rbol. Nota: Las propiedades, los eventos y otros elementos de este componente slo se pueden manipular desde su men emergente de la vista de rbol de proyectos. Para obtener informacin relacionada, consulte el apartado Elemento de men en la pgina 104. Atributos de componente
ParentName PartName PartType UserData

Eventos a los que puede aplicarse


Create Destroy

166

Programacin con VisualAge RPG

Temporizador

Utilice el componente temporizador si el programa debe realizar determinadas operaciones en intervalos de tiempo preestablecidos. Por ejemplo, puede utilizarlo para cerrar una ventana o para finalizar una aplicacin despus de un periodo determinado de inactividad. El componente temporizador cuenta unidades de tiempo, hace un seguimiento del intervalo de tiempo preestablecido que transcurre entre dos eventos y desencadena el segundo evento cuando haya pasado el tiempo necesario. Cuando se crea un componente temporizador en el constructor GUI, el componente aparece en forma de icono en la ventana de diseo. Sin embargo, en el cuaderno de propiedades de un componente temporizador, puede especificar que no desea que el icono se visualice mientras el programa se ejecuta. Nota: No utilice el componente temporizador cuando precise un control exacto del tiempo. El evento Tick puede no producirse en el intervalo exacto que ha especificado, ya que hay otros programas ejecutndose en el sistema. Atributos de componente
AddLink* Left PartType Top AllowLink* Multiplier RemoveLink* UserData Bottom ParentName TimerMode Visible Interval PartName TimerTicks

* Nota:: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Create Destroy Link* Tick

* Nota:: Consulte la descripcin del evento si desea saber cules son las restricciones.

Visualizacin del icono Temporizador


Por omisin, el atributo Visible se establece en 1 de tal manera que el icono de temporizador se visualiza mientras est ejecutndose el programa. Si no desea que este icono se visualice, establezca este atributo en 0.

Establecimiento del intervalo


El intervalo del temporizador se expresa en milisegundos. Cuando ha transcurrido el intervalo se seala un evento Tick de temporizador. Puede establecer este intervalo en el cuaderno de propiedades del componente temporizador. Tambin puede establecerse en el programa utilizando el atributo Interval. Nota: El intervalo mnimo del temporizador es de 100 milisegundos.
Captulo 7. Utilizacin de componentes

167

El componente temporizador tiene un atributo Multiplier. Al establecer este atributo, puede determinar cuntas veces transcurre el valor del intervalo antes de que se genere un evento Tick de temporizador. El valor de multiplicador se establece en 1, de manera que el temporizador genere un evento Tick al final de cada intervalo.

Generacin de eventos Tick


Cuando se inicia un temporizador su valor de intervalo se restablece a cero. Cuando se alcanza el valor de intervalo, el temporizador genera un evento Tick y actualiza el valor del intervalo.

Obtencin del valor de temporizador


Cada vez que el temporizador genere un evento Tick, su valor se incrementa en uno. Utilice el atributo Value para obtener el valor actual del temporizador. Puede establecer el valor del temporizador en el cuaderno de propiedades o en el programa.

Control del temporizador utilizando modalidades de temporizador


Utilice el atributo TimerMode para controlar el temporizador. Establezca TimerMode en 1 para iniciar el temporizador. Iniciar el temporizador hace que empiece a generar eventos Tick, y su atributo Value se incrementa cuando se alcanza el valor del intervalo. Establezca TimerMode en 2 para detener el temporizador. Cuando se pare el temporizador, cesar de generar eventos Tick y no se actualizar su valor.

Ejemplo de temporizador
En este ejemplo, un componente texto esttico se desplaza en la ventana para cada evento Tick de temporizador. Al accionar el pulsador Start, la modalidad de temporizador se establece en 1. Esto inicia el temporizador y genera eventos Tick. Durante el proceso del evento Tick, se calculan nuevas coordenadas para el componente texto esttico y el componente se establece en la nueva ubicacin. Cuando accione el pulsador Detener, TimerMode se establecer en 2. Esto detiene el temporizador. Accione el pulsador Close para terminar el programa.

168

Programacin con VisualAge RPG

********************************************************************* * * * ID de programa : TIMER * * * * Descripcin . : Programa de ejemplo que muestra el componente * * temporizador moviendo un componente texto * * esttico en una ventana cada vez que se produce * * un 'Tick' en el temporizador. * * * ********************************************************************* *

* * Declarar atributos de sistema de tamao de pantalla D%DspHeight S 4 0 D%DspWidth S 4 0 * * Declarar nuevos atributos de evento de tamao D%NewHeight S 4 0 D%NewWidth S 4 0 * * Definir variables de trabajo DminX S 4 0 INZ(0) DmaxX S 4 0 DminY S 4 0 DmaxY S 4 0 DxChange S 4 0 INZ(5) DyChange S 4 0 INZ(5) *

Figura 28. Ejemplo de cdigo en el que se utiliza el componente temporizador (Pieza 1 de 6)

Captulo 7. Utilizacin de componentes

169

********************************************************************* * * * Ventana . : FRA0000B * * * * Componente : FRA0000B * * * * Evento . . : CREATE * * * * Descripcin: Centrar la ventana en la pantalla. * * * * Calcular los valores iniciales. * * Dado que el atributo de altura del componente * * ventana incluye la barra de ttulo, restamos la * * altura de la barra de ttulo para que el componente * * texto esttico permanezca dentro del marco de la * * ventana. * * * * Para SVGA, este valor es de unos 20 pixels. * * Puede ajustarse para otras resoluciones. * * * ********************************************************************* * C FRA0000B BEGACT CREATE FRA0000B * * Obtener altura y anchura de ventana inicial C 'FRA0000B' getatr 'Height' winHeight 4 0 C 'FRA0000B' getatr 'Width' winWidth 4 0 * * Centrar la ventana en la pantalla C eval %setatr('FRA0000B': C 'FRA0000B': C 'Left')=(%DspWidth-winWidth)/2 * C eval %setatr('FRA0000B': C 'FRA0000B': C 'Bottom')=(%DspHeight-winHeight)/2 * * Obtener coordenadas iniciales del componente texto esttico C 'ST1' getatr 'Left' picX 4 0 C 'ST1' getatr 'Bottom' picY 4 0 * * Obtener las dimensiones del componente texto esttico C 'ST1' getatr 'Height' picHeight 4 0 C 'ST1' getatr 'Width' picWidth 4 0 * * Calcular las coordenadas Y mnimas y mximas C 'Start' getatr 'Height' startH 4 0 C 'Start' getatr 'Bottom' startB 4 0 C eval minY = startB + startH C eval maxY = winHeight - picHeight - 20 *

Figura 28. Ejemplo de cdigo en el que se utiliza el componente temporizador (Pieza 2 de 6)

170

Programacin con VisualAge RPG

* Calcular la coordenada X mxima eval maxX = winWidth - picWidth * C ENDACT ********************************************************************* * * * Ventana . : FRA0000B * * * * Componente : START * * * * Evento . . : PRESS * * * * Descripcin: Iniciar el temporizador. * * * ********************************************************************* * C START BEGACT PRESS FRA0000B * C 'Timer1' setatr 1 'TimerMode' * C ENDACT ********************************************************************* * * * Ventana . : FRA0000B * * * * Componente : STOP * * * * Evento . . : PRESS * * * * Descripcin: Detener el temporizador. * * * ********************************************************************* * C STOP BEGACT PRESS FRA0000B * C 'Timer1' setatr 2 'TimerMode' * C ENDACT C

Figura 28. Ejemplo de cdigo en el que se utiliza el componente temporizador (Pieza 3 de 6)

Captulo 7. Utilizacin de componentes

171

********************************************************************* * * * Ventana . : FRA0000B * * * * Componente : CLOSE * * * * Evento . . : PRESS * * * * Descripcin: Terminar el programa * * * ********************************************************************* * C CLOSE BEGACT PRESS FRA0000B * C eval *inlr = *on * C ENDACT ********************************************************************* * * * Ventana . : FRA0000B * * * * Componente : TIMER1 * * * * Evento . . : TICK * * * * Descripcin: Responder a los eventos tick del temporizador * * moviendo el componente texto esttico de la ventana. * * * * Si el componente texto esttico se mueve fuera del * * marco de la ventana, sus valores xChange e yChange * * se multiplican por -1 para invertir la direccin. * * * *********************************************************************

Figura 28. Ejemplo de cdigo en el que se utiliza el componente temporizador (Pieza 4 de 6)

172

Programacin con VisualAge RPG

TIMER1 BEGACT TICK FRA0000B * * Calcular nuevas coordenadas de texto esttico C eval picX = picX + xChange C eval picY = picY + yChange * * Comprobar que el texto esttico permanece dentro de la ventana C select * C picX whenlt 0 C eval xChange = xChange * -1 C eval picX = minX + xChange * C picX whengt maxX C eval xChange = xChange * -1 C eval picX = maxX + xChange * C picY whenlt minY C eval yChange = yChange * -1 C eval picY = minY + yChange * C picY whengt maxY C eval yChange = yChange * -1 C eval picY = maxY + yChange * C endsl * * Mover el texto esttico a nuevas coordenadas C 'ST1' setatr picX 'Left' C 'ST1' setatr picY 'Bottom' * * C ENDACT

Figura 28. Ejemplo de cdigo en el que se utiliza el componente temporizador (Pieza 5 de 6)


********************************************************************* * * * Ventana . : FRA0000B * * * * Componente : FRA0000B * * * * Evento . . : RESIZE * * * * Descripcin: Obtener el tamao de la ventana despus de haber * * ajustado su tamao para que el componente esttico * * utilice toda la ventana. * * * ********************************************************************* * C FRA0000B BEGACT RESIZE FRA0000B * C eval maxY = %NewHeight - picHeight - 20 C eval maxX = %NewWidth - picWidth * C ENDACT

Figura 28. Ejemplo de cdigo en el que se utiliza el componente temporizador (Pieza 6 de 6)

Captulo 7. Utilizacin de componentes

173

Barra de desplazamiento vertical

Utilice el componente barra de desplazamiento vertical para poder desplazarse por un panel de informacin de arriba abajo. La informacin puede ser una lista de archivos, los registros de una base de datos, las columnas de un documento, y otros elementos. Puede utilizar el atributo Range para representar el nmero total de los objetos por los que se efectuar el desplazamiento y el atributo PageSize para determinar el nmero de objetos que pueden visualizarse en una pgina. Atributos de componente
Bottom Height PageSize Position Top Enabled Left ParentName PrevLine UserData Focus NextLine PartName PrevPage Visible Handle* NextPage PartType Range Width

*Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Create Destroy Scroll

174

Programacin con VisualAge RPG

Ventana

Las ventanas son el medio primordial que tiene el usuario de interactuar con el programa. Las aplicaciones deben contener al menos una ventana. Slo puede aadir un componente al rea de cliente de una ventana, con la excepcin de los componentes que son extensiones del marco de la ventana, como las barras de mens, los mens emergentes y los subarchivos de mensajes. El tamao del componente que aada se ajusta automticamente al rea de cliente. Si desea que una ventana contenga ms de un componente, deber aadirle un componente lienzo. El componente ventana con lienzo sirve tambin para ahorrarse un paso. Nota: El componente ventana se encuentra en la seccin Marcos del catlogo de componentes, no en la paleta de componentes. Para obtener informacin relacionada, consulte el apartado: v Lienzo en la pgina 53 v Ventana con lienzo en la pgina 176 Atributos de componente |
Bottom Focus* FontSize* Height MouseIcon* PartType PBStepSize SBLabel StatusBar Width Center FontBold* FontStrike* IconHandle* MouseShape* PBRange Print SBPosition Top WindowMode* Enabled FontItalic* FontUnder* Label ParentName PBSetPos ProgresBar SBStyle UserData FileName* FontName* Handle* Left PartName PBStep Refresh ShowTips Visible

*Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Activate Destroy ReSize Close LClickTray ShutDown Create Moved DeActivate RClickTray

Captulo 7. Utilizacin de componentes

175

Ventana con lienzo

Las ventanas son el medio primordial que tiene el usuario final de interactuar con el programa. El lienzo, en un componente ventana con lienzo, le permite aadir varios componentes a la ventana. Puede colocar diversos componentes en el lienzo sealndolos y pulsando el botn del ratn y cambiarlos de posicin para crear una interfaz grfica de usuario. Tambin puede aadir componentes que sean extensiones del marco de la ventana, como barras de mens, mens emergentes y subarchivos de mensajes. Si slo precisa colocar un componente en el rea de cliente de la ventana, no necesita el componente ventana con lienzo: en lugar de ste, debe usar el componente ventana (que se encuentra en la seccin Marcos del catlogo de componentes). Sin lienzo, el tamao del componente aadido se ajusta automticamente al rea de cliente. Para obtener informacin relacionada, consulte los apartados: v Lienzo en la pgina 53 v Ventana en la pgina 175 Atributos de componente |
Bottom Focus* FontSize* Height MouseIcon* PartType PBStepSize SBLabel StatusBar Width Center FontBold* FontStrike* IconHandle* MouseShape* PBRange Print SBPosition Top WindowMode* Enabled FontItalic* FontUnder* Label ParentName PBSetPos ProgresBar SBStyle UserData FileName* FontName* Handle* Left PartName PBStep Refresh ShowTips Visible

*Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse
Activate Destroy ReSize Close LClickTray ShutDown Create Moved DeActivate RClickTray

Visualizacin de una ventana


Por omisin, todas las ventanas se marcan con Visible y Open Immediately cuando se crean en el Diseador GUI. Debe decidir qu ventana desea que el usuario vea en primer lugar. Esa ventana se denomina ventana principal o primaria y debe establecer los atributos Visible y

176

Programacin con VisualAge RPG

Open Immediately de acuerdo a esto. Si no cambia los valores por omisin, aparecern todas las ventanas cuando el usuario inicie la aplicacin.

Establecimiento del atributo Open Immediately


Establezca este atributo en tiempo de diseo si desea que la ventana se cree cuando se inicie la aplicacin. Al crear una ventana, sta se carga en memoria: dado que se produce una actividad general asociada a esta carga, debe decidir qu ventanas tienen que cargarse cuando se inicia la aplicacin. (Es posible hacer que las otras ventanas se carguen ms adelante.) Puede utilizar el cdigo de operacin SHOWWIN para visualizar las ventanas que no se visualizan muy a menudo (como por ejemplo, la ventana que visualiza los derechos de propiedad intelectual de un producto ), en lugar de establecerlas para que se abran inmediatamente. Nota: El atributo Open Immediately no controla si una ventana se visualiza realmente en la pantalla. Para visualizar una ventana, debe establecer en el programa el valor 1 en el atributo Visible de dicha ventana, o debe marcarla con Visible en el cuaderno propiedades.

Utilizacin del cdigo de operacin SHOWWIN


Puede cargar una ventana en el programa especificando el nombre de la ventana en el Factor 2 del cdigo de operacin SHOWWIN. Este cdigo de operacin carga la ventana en la memoria. Nota: La operacin SHOWWIN no controla si una ventana se visualiza realmente en la pantalla. Para visualizar una ventana, debe establecer en el programa el valor 1 en el atributo Visible de dicha ventana, o debe marcarla con Visible en el cuaderno propiedades. Los atributos de una ventana slo pueden establecerse una vez que se ha cargado. Para cargar una ventana, seleccione el recuadro de seleccin Open Immediately en la pgina Inicio del cuaderno del componente o utilice el cdigo de operacin SHOWWIN en el programa. Si una ventana est definida como Open Immediately y en el programa se emite el cdigo de operacin SHOWWIN para esa ventana, se recibir un error de tiempo de ejecucin indicando que la ventana ya se ha cargado. Puede evitar este error de tiempo de ejecucin codificando un indicador de error en el cdigo de operacin SHOWWIN y comprobando el indicador de error en el programa. Si el indicador est activado, la ventana ya est cargada y es preciso activar el atributo Visible. As la ventana se visualizar y el error no se emitir.

Referencia
Los componentes de una ventana se crean cuando se crea la ventana. Por consiguiente, si intenta hacer referencia a algn componente de una ventana que no se ha cargado o a un atributo de ventana antes de que se cree la ventana, obtendr el mensaje Componente no encontrado.

Captulo 7. Utilizacin de componentes

177

Sugerencia Si se visualiza una ventana y no puede pulsar el botn en la barra de ttulo de dicha ventana, utilice este mtodo para moverla: 1. Site el cursor del ratn en un lugar de la parte visible de la ventana. 2. Pulse y suelte el botn 1 del ratn. 3. Pulse la combinacin de teclas Alt-espacio. A continuacin pulse M. 4. Utilice las teclas con flecha para volver a situar la ventana. 5. Cuando la ventana est en la posicin deseada, pulse Intro.

Cambio del tamao de una ventana


Puede hacer dos cosas para crear la aplicacin de manera que el usuario tenga una o ms formas de cambiar el tamao de una ventana: v En el Diseador GUI, establezca que el borde de una ventana es Modificable. Este valor permite al usuario seleccionar el borde de la ventana con el botn del ratn y cambiar el tamao de dicho borde mientras mantiene pulsado el botn del ratn. En cuanto se suelta el botn del ratn, se seala el evento ReSize. v Aada a la ventana los botones Maximizar y Minimizar. Esto permite al usuario cambiar el tamao de la ventana seleccionando uno de estos botones. Puede situar componentes en la ventana de tal manera que mantengan su posicin y tamao relativos dentro de los lmites de la ventana despus de haber modificado el tamao de sta. Para ello, utilice el evento ReSize con los atributos de evento %NewHeight y %NewWidth. En el ejemplo de codificacin siguiente, un componente pulsador con la etiqueta PB1 est ubicado en la esquina superior derecha de una ventana. Al cambiar el tamao de la ventana, la subrutina de accin ReSize calcula unos nuevos valores de los atributos Left (Izquierda) y Bottom (Inferior) para asegurar que el pulsador permanezca dentro de los lmites de la ventana.

178

Programacin con VisualAge RPG

********************************************************************* * * * ID de programa : ReSize * * * * Descripcin . : Programa de ejemplo que muestra cmo asegurar * * que los componentes permanecen en una ventana * * despus de haber ajustado su tamao. * * * * Se pone un pulsador en la esquina superior * * derecha de la ventana. Si se reduce el tamao * * de la ventana, el pulsador dejar de ser * * visible, ya que todos los componentes mantienen * * su relacin con la esquina inferior izquierda * * de la ventana. * * El evento RESIZE se utiliza para asegurar que * * el pulsador tambin mantiene su posicin en * * relacin con la esquina superior derecha de * * la ventana. * * * ********************************************************************* *

* * Declarar atributos de sistema de tamao de pantalla D%DspHeight S 4 0 D%DspWidth S 4 0 *

Figura 29. Comprobacin de que los componentes se visualizan correctamente tras ajustar el tamao de una ventana (Pieza 1 de 3)

Captulo 7. Utilizacin de componentes

179

* Declarar los atributos de evento %NewHeight y %NewWidth. * Contendrn la anchura y la altura de la ventana despus de haber * ajustado su tamao. D%NewHeight S 4 0 D%NewWidth S 4 0 ********************************************************************* * * * Ventana . : FRA0000B * * * * Componente : FRA0000B * * * * Evento . . : RESIZE * * * * Descripcin: Asegurar que el componente pulsador 'PB1' sigue * * visible. * * * ********************************************************************* * C FRA0000B BEGACT RESIZE FRA0000B * C %NewWidth sub HOffset NewLeft 4 0 C %NewHeight sub VOffset NewBottom 4 0 C 'PB1' setatr NewLeft 'Left' C 'PB1' setatr NewBottom 'Bottom' * C ENDACT ********************************************************************* * * * Ventana . : FRA0000B * * * * Componente : PSB0000D * * * * Evento . . : PRESS * * * * Descripcin: Terminar el programa * * * ********************************************************************* * C PSB0000D BEGACT PRESS FRA0000B * C move *on *inlr * C ENDACT

Figura 29. Comprobacin de que los componentes se visualizan correctamente tras ajustar el tamao de una ventana (Pieza 2 de 3)

180

Programacin con VisualAge RPG

********************************************************************* * * * Ventana . : FRA0000B * * * * Componente : FRA0000B * * * * Evento . . : CREATE * * * * Descripcin: Centrar la ventana en la pantalla. * * Obtener la coordenada actual del pulsador PB1 y su * * desplazamiento desde la esquina superior derecha * * de la ventana. * * * ********************************************************************* * C FRA0000B BEGACT CREATE FRA0000B * C 'FRA0000B' getatr 'Height' winHeight 4 0 C 'FRA0000B' getatr 'Width' winWidth 4 0 C %DspWidth sub winWidth diffWidth 4 0 C %DspHeight sub winHeight diffHeight 4 0 * C eval %setatr('FRA0000B': C 'FRA0000B': C 'Left') = diffWidth / 2 * C eval %setatr('FRA0000B': C 'FRA0000B': C 'Bottom') = diffHeight / 2 * * Calcular los desplazamientos del componente pulsador 'PB1' * desde la esquina superior derecha de la ventana. Estos valores * se utilizan para mantener este desplazamiento si se ajusta el * tamao de la ventana. C 'PB1' getatr 'Left' PBLeft 4 0 C 'PB1' getatr 'Bottom' PBBottom 4 0 C 'FRA0000B' getatr 'Width' WinWidth 4 0 C 'FRA0000B' getatr 'Height' WinHeight 4 0 C WinWidth sub PBLeft HOffset 4 0 C WinHeight sub PBBottom VOffset 4 0 * C ENDACT

Figura 29. Comprobacin de que los componentes se visualizan correctamente tras ajustar el tamao de una ventana (Pieza 3 de 3)

Establecimiento del foco


Determine con qu ventana desea que el usuario trabaje en primer lugar y utilice el atributo Focus para poner el foco en esa ventana. Si no lo hace, VisualAge RPG determina qu ventana tendr el foco cuando se carga la aplicacin. Por omisin, la ventana que tiene el foco es la ltima ventana creada que tenga establecido el atributo Visible.

Lista de ventanas
En el cuaderno de propiedades para un componente ventana, puede indicar si la ventana debe aparecer en la lista de ventanas. Esta lista aparece cuando pulsa Control+Alt+Delete en Windows NT/95/98. Por omisin, los componentes de ventana no aparecen en la lista de ventanas. Debe establecer como mnimo la ventana principal para que aparezca en la lista de ventanas. Puede utilizar la lista de tareas para volver a visualizar la ventana.
Captulo 7. Utilizacin de componentes

181

Terminacin de un programa
Si el usuario selecciona la opcin Cerrar del men del sistema en una ventana, el sistema operativo cierra la ventana pero no termina necesariamente el programa. Para evitar que esto suceda, puede realizar una de las acciones siguientes: v Seleccione el recuadro de seleccin Terminar al cerrar en la segunda pgina de Estilo del cuaderno de propiedades de la ventana. Esto terminar el programa cuando el usuario cierre la ventana. v En la primera pgina de Estilo del cuaderno propiedades de la ventana, deseleccione el recuadro de seleccin Men del sistema para que las ventanas se creen sin un Men del sistema. (Por omisin, todas las ventanas se crean con un men del sistema.) v Utilice el evento Close. Este evento se seala cuando el usuario selecciona Cerrar en el men del sistema. En la subrutina de accin del evento Close, puede activar el indicador LR o solicitar al usuario que confirme que debe cerrarse esta ventana y establecer el punto de retorno ENDACT de acuerdo a ello. Por ejemplo, al establecer el valor de retorno en *NODEFAULT, la peticin de cerrar se pasa por alto y la ventana no se cierra.
* * Definir variables del recuadro de mensajes Dstyle M button(*yesbutton: *nobutton) D style(*WARN) Dmsg M msgtext('Are sure you want to exit?') * ********************************************************************* * * * Ventana . : FRA0000B * * * * Componente : FRA0000B * * * * Evento . . : CLOSE * * * * Descripcin: Manejar el evento Close desde el men del sistema * * para ver si el usuario desea cerrar esta ventana. * * * ********************************************************************* * C FRA0000B BEGACT CLOSE FRA0000B * * Solicitud para cerrar C msg dsply style rc 9 0 * * Si Yes, terminate program, se puede cerrar C rc ifeq *YESBUTTON C move *on *inlr C movel '*DEFAULT 'return 12 * * Else no cierra esta ventana C else C movel '*NODEFAULT 'return C endif * C ENDACT return

182

Programacin con VisualAge RPG

Borrado de campos en una ventana


Si tiene varios campos de entrada en una ventana, puede utilizar el cdigo de operacin CLEAR. Esto borrar todos los valores de los campos de entrada y los devolver a sus valores por omisin. Los campos numricos se borran con ceros y los campos de tipo carcter se borran con blancos.

Ejemplo de un componente ventana


El componente ventana que se muestra ms abajo tiene un men del sistema, un botn de minimizar y un botn de maximizar.

Captulo 7. Utilizacin de componentes

183

*Component
Este componente permite a los programadores acceder y utilizar atributos de componente lgico y del sistema. Un componente *component es la representacin del componente del componente lgico. Para cada componente lgico se crea un componente *component; no se ve y no est en la paleta. Atributos de componente
Active* ClipBoard DlgOwner FileName MsgFile* OS Platform PlugRC* ShData ShowMsgID Alarm CurrentDir DoEvents* HelpWindow MsgID Parent PlugCmd* PlugResult* ShDataLen SwitchTo* AppData Dialog DspHeight LookNFeel* MsgText PartCount PlugDLL* Printer* ShDataName WrkStnName* Button DIRName* DspWidth MsgData Name PartList PlugID* SelPrinter* ShDataPos

*Nota: Consulte la descripcin del atributo si desea saber cules son las restricciones. Eventos a los que puede aplicarse Este componente no tiene eventos asociados.

Utilizacin del componente *component


El componente *component permite que los programadores accedan y utilicen atributos de componente lgico y de sistema. Un componente *component es la representacin de componente del componente lgico. Se crea automticamente un componente *component para cada componente lgico; no es visible y no se encuentra en la paleta de componentes.

Visualizar un dilogo Abrir/Guardar como de Archivo


Los atributos Button, FileName, Dialog y DlgOwner del componente *component se utilizan para visualizar el dilogo comn de Windows Abrir o Guardar como de Archivo. El atributo de dilogo determina qu tipo de dilogo se visualizar. Establzcalo en 1 para visualizar un dilogo Abrir o en 2 para visualizar un dilogo Guardar como. DlgOwner designa qu componente es el propietario del dilogo. Una vez establecido el atributo, el propietario depende del dilogo. Esto significa que el propietario ni puede responder a los eventos hasta que el dilogo no sea rechazado. Al establecer el atributo FileName se visualiza el dilogo abrir de archivo. Para determinar qu botn ha utilizado el usuario para rechazar el dilogo, recupere el valor del atributo Button. En el siguiente ejemplo, se visualiza un dilogo Abrir de Archivo. Fjese que el atributo FileName puede establecerse para visualizar nicamente archivos con cierta extensin:

184

Programacin con VisualAge RPG

* * Visualizar el dilogo Abrir de Archivo C '*Component' Setatr 1 * * Esta ventana es el propietario C '*Component' Setatr 'Main Main' * * Mostrar slo los archivos .DAT C '*Component' Setatr '*.DAT' * * Pulsar el botn C '*Component' Getatr 'Button' * * Utilizar el pulsador Aceptar C If Button = 1 * * Usuario cancelado C Else * C EndIf

'Dialog' 'DlgOwner' 'Filename' Button 1 0

Figura 30. Visualizar un dilogo Abrir de Archivo

Seleccionar una impresora


Si la aplicacin imprime en una impresora conectada a la estacin de trabajo, puede utilizar los atributos SelPrinter y Printer para permitir que el usuario seleccione a qu impresora enviar la salida. Si establece el atributo SelPrinter en 1 ver el dilogo Imprimir de Windows que se visualizar. Cuando el usuario selecciona una impresora desde ese dilogo, la salida impresa de la aplicacin se enviar a dicha impresora.

Utilizacin de conectores
Los atributos PlugDLL, PlugID, PlugCmd, PlugRC y PlugResult le darn la posibilidad de ampliar la funcionalidad del Diseador GUI. Proporcione la funcionalidad complementaria a un programa que haya desarrollado. Una vez la aplicacin est registrada en el Preparador GUI mediante el men Proveedor, la aplicacin puede interactuar con el Diseador GUI. Consulte el captulo 20 para conocer ms detalles sobre cmo crear conectores.

Consultar los componentes de un componente lgico


Los atributos Parent, PartCount y PartList pueden utilizarse durante la ejecucin para consultar los nombres de los componentes de un componente lgico. Por ejemplo, podra utilizar estos atributos para ajustar el tamao de los componentes y volver a situarlos en una ventana si el tamao de la ventana ha sido ajustado de nuevo.

Captulo 7. Utilizacin de componentes

185

186

Programacin con VisualAge RPG

Parte 3. Cmo trabajar con datos AS/400


Captulo 8. Conectividad con AS/400 en la pgina 189 Describe cmo configurar una conexin entre la aplicacin y un AS/400. Captulo 9. Reutilizar aplicaciones AS/400 en la pgina 201 Describe cmo importar archivos de pantalla existentes, ayuda de UIM y fuente RPG desde aplicaciones AS/400 existentes.

Copyright IBM Corp. 1994, 2000

187

188

Programacin con VisualAge RPG

Captulo 8. Conectividad con AS/400


Si se utiliza un servidor AS/400 mientras se est desarrollando la aplicacin (por ejemplo, importando archivos de pantalla de AS/400) o mientras se est ejecutando la aplicacin (por ejemplo, al acceder a archivos de base de datos de AS/400 para E/S), debe definir la informacin de AS/400 utilizada por la aplicacin. Esta informacin se almacena por separado de la aplicacin, de manera que pueda actualizarse sin cambiar la propia aplicacin. En esta seccin se tratan los siguientes temas: v Definicin de la informacin de AS/400 v Configuracin de un servidor AS/400 en tiempo de diseo y en tiempo de ejecucin v Utilizacin de reas de datos v Utilizacin de archivos de base de datos AS/400 v Consideraciones sobre E/S de base de datos

Definicin de la informacin de AS/400


Durante el desarrollo de la aplicacin, puede utilizar el cuaderno de propiedades Definir informacin de AS/400 para definir pseudnimos (nombres de alteracin temporal) para la siguiente informacin de AS/400: v Servidores v Archivos v Programas v reas de datos v Nivel de bloqueo Una vez que haya desarrollado una aplicacin y est listo para instalarla en la estacin de trabajo del usuario, tiene que asegurarse de que: v Para las comunicaciones SNA, se haya configurado lo siguiente: Debe definirse un direccionador mediante Client Access. Este nombre de direccionador tambin se utiliza como Nombre de ubicacin remota. v Para las comunicaciones TCP/IP, se haya configurado lo siguiente: Utilice el nombre de sistema principal definido para el AS/400 como Nombre de ubicacin remota. Tambin puede consultar en el manual Iniciacin a VisualAge RPG y CODE/400, los pasos necesarios para definir la informacin de AS/400.

Consideraciones sobre el cuaderno


Si las pginas del cuaderno de propiedades Definir informacin de AS/400 no contienen el nombre de alteracin temporal del programa, el rea de datos o el archivo de base de datos, ocurre lo siguiente: 1. Se utiliza el nombre del programa, rea de datos o archivo de base de datos del programa. 2. Si el nombre del programa, rea de datos o archivo de base de datos est cualificado por biblioteca en el programa, se utiliza esta biblioteca. 3. Si el nombre del programa o el archivo de base de datos no est cualificado por biblioteca en el programa, se busca en la lista de bibliotecas (*LIBL) en el servidor AS/400. 4. Se utiliza el primer servidor listado en la pgina de servidores.
Copyright IBM Corp. 1994, 2000

189

Nota: El primer servidor listado en la pgina de servidores del cuaderno Definir informacin de AS/400 se conoce como servidor por omisin. Se requiere por lo menos un servidor por cada programa que utilice un servidor AS/400.

Configuracin de un servidor
Debe configurar un servidor cuando est desarrollando la aplicacin, de manera que pueda acceder al servidor mientras se edita, compila y depura la aplicacin. Cuando empaquete y distribuya la aplicacin a otras estaciones de trabajo, tambin tendr que configurar un servidor si la aplicacin en ejecucin accede a un servidor distinto del utilizado durante el tiempo de diseo. Siempre que configure un servidor, asegrese de que la lista de bibliotecas del trabajo de servicio contiene el recurso remoto con el que desea trabajar.

Establecimiento de un servidor en tiempo de diseo


Si tiene que utilizar un servidor mientras est desarrollando la aplicacin, debe definir la informacin del servidor en la ventana Definir conexin a servidores y en el cuaderno Definir informacin de AS/400. Consulte Iniciacin a VisualAge RPG y CODE/400 si desea ms informacin. Tambin debe definir una descripcin de trabajo de AS/400 para configurar la lista de bibliotecas. Puede asociar una lista de bibliotecas con una descripcin de trabajo en el servidor AS/400. Luego, esta descripcin de trabajo puede asociarse a un perfil de usuario. Utilice el ID de usuario de este perfil de usuario cuando el VisualAge RPG le solicite que inicie una sesin en un servidor. El trabajo de servicio AS/400 contiene la lista de bibliotecas correcta.

Establecimiento de un servidor en tiempo de ejecucin


Si tiene que acceder a un servidor mientras est ejecutando la aplicacin, debe verificar que la informacin de AS/400 indique el servidor correcto. Utilice el programa de utilidad Definir informacin de AS/400 para invocar el cuaderno Definir informacin de AS/400. Tambin debe configurar la lista de bibliotecas cambiando la descripcin de trabajo o utilizando los mandatos CL QCMDDDM o QCMDEXC.

Definicin de una descripcin de trabajo para configurar una lista de bibliotecas


Puede asociar una lista de bibliotecas con una descripcin de trabajo en el servidor AS/400. Luego, esta descripcin de trabajo puede asociarse a un perfil de usuario. Utilice el ID de usuario de este perfil de usuario cuando el VisualAge RPG le solicite que inicie una sesin en un servidor. El trabajo de servicio AS/400 contiene la lista de bibliotecas correcta.

Cambio de la lista de bibliotecas


Si un programa VisualAge RPG llama a mandatos CL de AS/400: v Especifique una operacin CALL a QCMDDDM si el mandato CL emite mandatos para archivos AS/400. v Especifique CALL a QCMDEXC si el mandato CL emite mandatos a programas AS/400 o a reas de datos AS/400. Pueden emitirse mandatos CL para ejecutarlos en el trabajo de servicio DDM AS/400 mediante el cdigo de operacin CALL. Debe llamarse a un programa

190

Programacin con VisualAge RPG

especial para que se ejecute el mandato CL en el trabajo de servicio DDM AS/400. El programa especial es QCMDDDM. Esta interfaz es la misma que la interfaz para llamar a QCMDEXC. La diferencia entre QCMDEXC y QCMDDDM es que QCMDEXC se ejecuta en un trabajo AS/400 distinto que se utiliza para dar servicio a peticiones de llamada remota y peticiones de rea de datos. Puede utilizarse QCMDDDM para cambiar la lista de bibliotecas del trabajo de servicio DDM para asegurar que la biblioteca que contenga los archivos de base de datos AS/400 est presente en la lista de bibliotecas del trabajo DDM.

Utilizacin de reas de datos


Antes de que la aplicacin pueda utilizar reas de datos, debe configurar el servidor. Si la aplicacin accede a un rea de datos de AS/400, el nombre de sta puede ser el nombre del rea de datos de AS/400 o un nombre de alteracin temporal. Puede definir el nombre de alteracin temporal en el Diseador GUI utilizando la pgina rea de datos del cuaderno Definir informacin de AS/400. Vea Consideraciones sobre el cuaderno en la pgina 189 si la pgina del cuaderno no contiene un nombre de alteracin temporal para el rea de datos. La Tabla 5 y la Figura 31 en la pgina 192 muestran cmo acceder a un rea de datos utilizando un nombre de alteracin temporal.
Tabla 5. Entrar esta informacin en la pgina rea de datos del cuaderno Definir informacin de AS/400
Nombre de alteracin temporal de rea de datos: Nombre de rea de datos remota: Pseudnimo del servidor: DTAARA (debe entrarse en maysculas) REMDTAARA SERVER01

Asegrese de que se ha inicializado el rea de datos antes de intentar utilizarla. Se emite una excepcin de tiempo de ejecucin si un rea de datos en el servidor no contiene un valor decimal empaquetado vlido al intentar recuperarlo en una estructura de datos de rea de datos con un subcampo decimal empaquetado en un programa VisualAge RPG.

Captulo 8. Conectividad con AS/400

191

********************************************************************* * * * Id. de programa: dtaaraex.vpg * * * * Descripcin . : Segmento de cdigo para obtener el contenido de * * un rea de datos de AS/400. * ********************************************************************* * D dtaara S 6P 0 DTAARA ********************************************************************* * * * Ventana. . : WIN1 * * * * Componente : PSB0000C * * * * Evento . . : PRESS * * * * Descripcin: Obtener el contenido del rea de datos de AS/400. * ********************************************************************* * C PSB0000C BEGACT PRESS WIN1 C IN dtaara C ENDACT

Figura 31. Acceso a un rea de datos de AS/400

Utilizacin de archivos de base de datos de AS/400


Antes de que la aplicacin pueda acceder a archivos de base de datos de AS/400, debe configurar el servidor. Los nombres de archivos DISK remotos utilizados en los programas VisualAge RPG pueden ser un nombre de archivo AS/400 o un nombre pseudnimo de archivo. Puede definir un nombre pseudnimo de archivo mediante la pgina Archivo del cuaderno Definir informacin de AS/400. Vea Consideraciones sobre el cuaderno en la pgina 189 para obtener informacin acerca de lo que sucede si la pgina de cuaderno no contiene un pseudnimo de archivo para el archivo AS/400. Las peticiones de apertura emitidas por la aplicacin VisualAge RPG pasan por alto las alteraciones temporales de archivo de base de datos de AS/400 emitidas en el trabajo DDM de AS/400 remoto. Las peticiones de apertura efectuadas por programas AS/400 que se ejecutan en el trabajo de servicio DDM pueden optar por pasar por alto o aplicar las alteraciones temporales de archivo. El VisualAge RPG soporta la alteracin temporal de nombre de biblioteca, nombre de archivo y nombre de miembro de AS/400, utilizando la pgina Archivo del cuaderno Definir informacin de AS/400. El cuaderno Definir informacin de AS/400 se utiliza cuando est construyndose la aplicacin y mientras sta est ejecutndose. En el tiempo de construccin, la pgina Archivo se utiliza durante las extracciones de archivos para buscar las descripciones externas de los archivos. Tambin se utiliza para una estructura de datos descrita externamente cuando as se especifique en una especificacin de definicin.

192

Programacin con VisualAge RPG

En el tiempo de ejecucin de la aplicacin, la pgina Archivo se utiliza para localizar los archivos de base de datos de AS/400 remotos que estn utilizndose realmente. El nombre pseudnimo de archivo utilizado en el programa VisualAge RPG se usa para buscar una entrada adecuada en la pgina Archivo. Si no existe ninguna entrada en la pgina Archivo, se utiliza la lista de bibliotecas del primer servidor definido en la pgina del servidor para buscar un archivo con el mismo nombre que el archivo del programa VisualAge RPG. Mantener el nombre de archivo real separado del nombre de archivo utilizado en el programa VisualAge RPG le permite cambiar el destino del archivo real. Puede dirigirlo a un archivo diferente en el mismo sistema AS/400 o en un sistema AS/400 diferente sin modificar el programa VisualAge RPG. La Figura 32 en la pgina 194 contiene un ejemplo que muestra: v La asociacin de nombres de archivo con entradas de archivo en la pgina Archivo en el cuaderno Definir informacin de AS/400. v Nombres de componente coincidentes con campos. Nota: La informacin sobre NAME (NOMBRE) y ADDRESS (DIRECCIN) debe entrarse en la ventana de la aplicacin. La informacin se entra en la base de datos de AS/400 cuando se acciona el pulsador Aceptar.

Captulo 8. Conectividad con AS/400

193

********************************************************************* * * * Id. de programa: ioex.vpg * * * * Descripcin . : Crear registros con datos de la ventana. * * * * Archivos . . . : FILE1 * * * ********************************************************************* * FFILE1 UF A E DISK REMOTE USROPN ********************************************************************* * * * Ventana. . : WIN1 * * * * Componente : *INZSR * * * * Evento . . : Rutina de inicializacin * * * * Descripcin: Abrir archivo de base de datos (FILE1). * * * ********************************************************************* * C *INZSR BEGSR C OPEN FILE1 C ENDSR ********************************************************************* * * * Ventana. . : WIN1 * * * * Componente : PSB0000D * * * * Evento . . : PRESS * * * * Descripcin: Fin de creacin de registros. Fin de aplicacin. * * * ********************************************************************* * C PSB0000D BEGACT PRESS WIN1 C SETON LR C ENDACT

Figura 32. Ejemplo de archivo de base de datos (Pieza 1 de 2)

194

Programacin con VisualAge RPG

********************************************************************* * * * Ventana. . : WIN1 * * * * Componente : PSB0000C * * * * Evento . . : PRESS * * * * Descripcin: Leer informacin de campo de la pantalla y aadir * * registro a archivo de base de datos de AS/400. * * * * * ********************************************************************* * C PSB0000C BEGACT PRESS WIN1 C READ 'WIN1' C WRITE FORMAT1 C ENDACT

Figura 32. Ejemplo de archivo de base de datos (Pieza 2 de 2)

FILE1 en la especificacin de archivo se utiliza como pseudnimo de archivo, ya que existe una entrada en la pgina Archivo del cuaderno Definir informacin de AS/400 asociado. Durante la apertura de archivo se utiliza el primer miembro de FILE1 de la biblioteca LIB1 en el servidor TORAS180. FILE1 en el nombre remoto no tiene que coincidir con el nombre de alteracin temporal en la entrada de archivo. El nombre de alteracin temporal representa un enlace entre la entrada de archivo en la pgina Archivo y el nombre de archivo utilizado en el programa VisualAge RPG. Los nombres de componente de los dos campos de entrada son NAME y ADDRESS. VisualAge RPG crea campos con los mismos nombres y los mismos atributos. En este ejemplo, NAME y ADDRESS son campos de 20 caracteres. El archivo de base de datos de AS/400 tambin contiene dos campos denominados NAME y ADDRESS, ambos de 20 caracteres. A continuacin ver las DDS correspondientes a estos campos:
A A R RECORD100 NAME ADDRESS 20A 20A

Cuando coinciden los nombres de campo con sus atributos, slo se crea un campo. En este ejemplo se leen los datos de la ventana.
C* N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq.. C READ 'WIN1'

Cuando se ejecuta este READ, los datos se mueven automticamente de la pantalla a los dos campos NAME y ADDRESS. Dado que los datos estn ahora en los campos adecuados, estos datos pueden escribirse directamente en la base de datos de AS/400 sin ningn otro movimiento de campo.
C* N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq.. C WRITE FORMAT1

Captulo 8. Conectividad con AS/400

195

En este ejemplo, los datos de los dos campos NAME y ADDRESS se mueven al almacenamiento intermedio de salida antes de emitir el mandato de escribir a la base de datos de AS/400.

Comprobacin de nivel
VisualAge RPG soporta la comprobacin de nivel entre un programa VisualAge RPG y los archivos de base de datos de AS/400 que estn utilizndose. El compilador siempre proporciona la informacin que la comprobacin de nivel necesita. La comprobacin de nivel se produce sobre la base de formato de registro cuando el archivo se abre, a menos que se especifique LVLCHK(*NO) al crear o cambiar el archivo de base de datos de AS/400. Nota: Si se produce una comprobacin de nivel, se trata como un error de E/S. Si desea ms informacin, consulte la publicacin VisualAge RPG Manual de consulta del lenguaje.

Bloqueo de archivos de base de datos de AS/400


El sistema OS/400 permite que se coloque un estado de bloqueo (exclusivo, exclusivo con permiso para leer, compartido para actualizar, compartido sin actualizar, o compartido para leer) en un archivo utilizado durante la ejecucin de un trabajo. Los programas que estn dentro de un trabajo no se ven afectados por los estados de bloqueo de los archivos. Un estado de bloqueo de archivo se aplica slo cuando un programa de otro trabajo intenta utilizar el archivo de manera concurrente. El estado de bloqueo de archivo puede asignarse con el mandato CL ALCOBJ (Asignar Objeto). Si desea obtener ms informacin acerca de la asignacin de recursos y los estados de bloqueo, puede consultar la seccin CL and APIs de la categora Programming del Information Center situado en el sitio Web http://publib.boulder.ibm.com/pubs/html/as400/infocenter.htm. El sistema OS/400 coloca los siguientes estados de bloqueo en archivos de base de datos cuando abre los archivos: v Abierto para INPUT: Estado de bloqueo Compartido para leer v Abierto para UPDATE: Estado de bloqueo Compartido para actualizar v Abierto para ADD: Estado de bloqueo Compartido para actualizar v Abierto para OUTPUT: Estado de bloqueo Compartido para actualizar

Alteracin temporal de archivos de base de datos


Para alterar temporalmente el nombre de archivo o biblioteca de un archivo de base de datos AS/400, utilice el mandato QCMDDDM tal como se indica en el siguiente ejemplo:
D QCMDDDM C OvrMenufl C BEGSR 'QCMDDDM' Linkage(*Server) QCMDDDM_Parm1 = 'OVRDBF FILE(MENUFL)' +

' ' ' '

C Eval C TOFILE(SYSLIBT/MENUFL)' + C MBR(' + MemberName + ')' + C OVRSCOPE(*JOB)' + C OPNSCOPE(*JOB)' C Exsr C ENDSR

CallExecDDM

196

Programacin con VisualAge RPG

C C C C C C

CallExecDDM

BEGSR EVAL Call Parm Parm ENDSR QCMDDDM_Parm2 = %LEN(QCMDDDM_Parm1) QCMDDDM QCMDDDM_Parm1 QCMDDDM_Parm2

Consideraciones de E/S de base de datos de AS/400


En general, todas las operaciones de E/S de base de datos VisualAge RPG disponibles en el lenguaje ILE RPG/400 tambin lo estn en el lenguaje VisualAge RPG y son equivalentes semnticamente. Consulte el manual VisualAge RPG Manual de consulta del lenguaje para obtener ms informacin, incluyendo los cdigos de operacin que soportan el acceso local, el acceso remoto o ambos.

Utilizacin de bloques de registros para mejorar el rendimiento


Si la aplicacin lee datos de un AS/400, puede mejorar el rendimiento de la aplicacin mediante bloques de registros. Crear bloques de registros significa que las operaciones de E/S del archivo se realizan en varios registros secuenciales (en bloques de registros) en lugar de hacerse de registro en registro. VisualAge RPG ofrece el bloqueo de registros por omisin si se cumple cualquiera de las condiciones siguientes: v El archivo es de slo salida y nicamente contiene un formato de registro. v El archivo es un archivo combinado. v El archivo es de slo entrada, nicamente contiene un formato de registro y slo utiliza los cdigos de operacin OPEN, CLOSE, FEOD y READ. v La palabra clave RECNO no est especificada en la especificacin de descripcin de archivo. Adems, puede realizar bloqueos de registros explcitos en archivos que cumplen los criterios siguientes: v La entrada Adicin de archivo (posicin 20) est en blanco. v La palabra clave RECNO no se utiliza en el archivo. v El archivo slo tiene un formato de registro. v En el archivo se utilizan los cdigos de operacin CHAIN, SETLL o SETGT. v Los cdigos de operacin READE, READP o READPE no se utilizan en el archivo. Si un archivo cumple los criterios antedichos, puede habilitar la creacin de bloques de registros actualizando el programa con BLOCK(*YES) en la descripcin de archivo y volviendo a compilar el programa. La Figura 33 en la pgina 198 muestra un ejemplo que utiliza la opcin de palabra clave BLOCK.

Captulo 8. Conectividad con AS/400

197

FFILE1 F . . . . . . C C FLD2

IF

K DISK

BLOCK(*YES) REMOTE

SETLL READ

REC1 REC1 10

Figura 33. Ejemplo de utilizacin de la opcin de palabra clave BLOCK

Si utiliza BLOCK(*NO) en una descripcin de archivo y vuelve a compilar el programa, no se crearn bloques de registros, ni siquiera los bloques de registros por omisin que VisualAge RPG soporta.

Servidores utilizados en el AS/400


Si utiliza TCP/IP, los servidores Central optimizado y Mandato remoto deben estar activados. Utilice el mandato STRHOSTSVR para iniciar estos servidores. Consulte la publicacin Client Access Express for Windows Host Servers. Estos servidores son necesarios para desarrollar las aplicaciones. Adems, al ejecutar las aplicaciones, el servidor DDM de TCP/IP debe estar activo. Utilice el mandato STRTCPSRV para iniciar el servidor.

Utilizacin del archivo de seguridad para los applets


Cuando una aplicacin VARPG necesita un recurso del AS/400 como, por ejemplo, un archivo de base de datos, se requiere un ID de usuario y una contrasea vlidos para conectarse al sistema AS/400. En VARPG, el ID de usuario y la contrasea se almacenan en un archivo de seguridad ubicado en la estacin de trabajo cliente. No obstante, por omisin, los applets no pueden acceder a ningn archivo de la estacin de trabajo cliente. En consecuencia, el sistema solicitar al usuario un ID de usuario y una contrasea cada vez que se ejecute un applet. Si desea utilizar el archivo de seguridad al ejecutar applets y evitar esta solicitud, deber dar a cada applet permiso para leer el archivo de seguridad. Puede otorgar estos permisos utilizando el programa de utilidad PolicyTool que forma parte del J2SDK de Sun Microsystem. En la seccin relativa a la documentacin de la herramienta de la documentacin del J2SDK 1.2 encontrar ms informacin sobre cmo utilizar PolicyTool. Nota: El procedimiento que aqu se describe slo funciona para los clientes Windows. 1. Cree el archivo de seguridad en la estacin de trabajo cliente. Si an no lo ha hecho, instale la unidad de ejecucin de VARPG en la estacin de trabajo cliente. En el men Inicio, elija Programas>VisualAge para RPG Tiempo de ejecucin>Definir conexin a servidores. Aparecer el dilogo Definir conexin a servidores. Aada el ID de usuario y la contrasea de un sistema AS/400 determinado para almacenarlos en el archivo de seguridad. 2. Cree los permisos necesarios. Los permisos son necesarios para que la VM Java pueda leer el archivo de seguridad. Para crear los permisos, realice las siguientes acciones: a. En un indicador del DOS, escriba PolicyTool y pulse Intro. Aparecer el dilogo Policy Tool. Si es la primera vez que utiliza PolicyTool, tambin se mostrar un mensaje indicando que no puede encontrarse el archivo de polticas en un cierto

198

Programacin con VisualAge RPG

directorio. Anote el nombre y el directorio del archivo de polticas que aparece en el mensaje. sta ser la ubicacin donde guardar el archivo de polticas en un paso posterior. b. En el dilogo Policy Tool, pulse el botn Add Policy Entry. Aparecer el dilogo Policy Entry. En el campo de entrada CodeBase, escriba:
"http://xxxx/-",

donde xxxx es el URL y el directorio que contiene el applet que debe recibir permisos para el archivo de seguridad. c. Pulse el botn Add Permission. Complete el dilogo Permissions tal como se indica a continuacin: v En el recuadro combinado Permissions, elija RuntimePermission. v En el recuadro combinado Target, elija loadLibrary.<nombre biblioteca>. v En el campo de entrada situado inmediatamente a la derecha del recuadro combinado Target, cambie loadLibrary.<nombre biblioteca> por loadLibrary.fvdcjava. v Pulse OK para regresar al dilogo Policy Entry. d. En el dilogo Policy Entry, vuelva a pulsar el botn Add Permission. Complete el dilogo Permissions tal como se indica a continuacin: v En el recuadro combinado Permissions, elija FilePermission. v En el campo de entrada situado inmediatamente a la derecha del recuadro combinado Target, escriba el nombre del archivo de seguridad. Este archivo se encuentra ubicado en el subdirectorio ibmcom del directorio de Windows. Por ejemplo:
c:\windows\ibmcom\fvdcsec.txt

donde el directorio de Windows es c:\windows. v En el recuadro combinado desplegable Actions, elija read. v Pulse OK para regresar al dilogo Policy Entry. v Pulse Done para regresar al dilogo Policy Tool. e. En el dilogo Policy Tool, elija File y, a continuacin, Save as en el men. Guarde el archivo de polticas que acaba de crear en el nombre de archivo y directorio que anot en el paso 2a en la pgina 198. Ahora elija File y, a continuacin, Exit para salir de PolicyTool. Si todava se le solicita el ID de usuario y la contrasea, vuelva a utilizar PolicyTool para verificar que ha especificado correctamente todos los parmetros.

Captulo 8. Conectividad con AS/400

199

200

Programacin con VisualAge RPG

Captulo 9. Reutilizar aplicaciones AS/400


Al desarrollar una aplicacin VisualAge RPG, tal vez desee reutilizar otra aplicacin AS/400 existente o diversos fragmentos de esta aplicacin. Esta seccin describe algunas cosas que debe tener en cuenta al reutilizar aplicaciones AS/400.

Situacin de reutilizacin
Puede utilizar VisualAge RPG para modificar aplicaciones que se ejecutan en el AS/400 de manera que se ejecuten en una PWS, acceder a datos en el sistema principal y tener una interfaz grfica de usuario. Esta seccin proporciona una visin general de los pasos relacionados en el proceso. Importacin de archivos de pantalla: El programa de utilidad de Importacin convierte los archivos de pantalla AS/400 existentes en una interfaz grfica de usuario en una PWS. Despus de importar un archivo de pantalla, los formatos de registro se convierten en componentes definidos por usuario y se almacenan en la pgina Importado del catlogo de componentes. Puede mover los componentes a la paleta de componentes mientras trabaja en la aplicacin, y luego almacenarlos en el catlogo de componentes cuando termine de trabajar en la aplicacin, hasta que vuelva a necesitarlos. Por ejemplo, si importa la pantalla 5250 que se muestra en la Figura 34 en la pgina 202 obtendr como resultado la GUI que se muestra en la Figura 35 en la pgina 203. Los registros se convierten en un grupo de componentes, los campos se convierten en componentes campo de entrada y las constantes se convierten en componentes texto esttico. Todas las teclas de mandato se convierten en componentes pulsador y las etiquetas de pulsador reflejan la palabra clave de tecla de mandato original.

Copyright IBM Corp. 1994, 2000

201

OOO OO OOOO

OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO

Status: OOOOOOO

Purchase Order Header Maintenance P.O. Number: 666666 -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-. Vendor Number: 99999 OOOOOOOOOOOOOOOOOOOOOOOOO OOOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOO 66666666-666-6666 OOOOOOOOOOOOOOOOO OOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO Print : B (Y,N) Ship Via: BBBBBBBBBB Date Entered: OOO OO OOOO F.O.B.: BBBBBBBBBBBBBBB Date Revised: OOO OO OOOO Terms Code : BBBB OOOOOOOOOOOOOOO OOO OO OOOO Password : Originator : OOOOOOOOOOOOOOO Prep./Collect/Chg : B (P,C,X) Confirm./Orig. : B (C,O) Warehouse: BB OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO Requested by: BBBBBBBBBBBBBBB Work Order #: 9999999 -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-. Cmd1 Exit Cmd3 PO Notes Cmd4 Lookup Cmd5 Material Status Cmd9 Vendor Maint. Cmd11 Delete Cmd15 Vendor Notes Cmd16 Vendor Quotes Ship to: 9999

Figura 34. Pantalla 5250 de ejemplo de una aplicacin Purchase Order

202

Programacin con VisualAge RPG

Figura 35. Resultado de importar la pantalla Purchase Order

Nota: Los nuevos componentes conservan los nombres de campo originales, pero el usuario puede redenominarlos si lo desea. Conservar el mismo nombre de campo mejora la productividad al manipular la lgica de programa para una nueva utilizacin. Tal vez desee personalizar los componentes importados para aprovechar los temas de diseo bsico analizados en el Captulo 2. Planificacin de la aplicacin en la pgina 19. Personalizacin de la GUI:

Captulo 9. Reutilizar aplicaciones AS/400

203

Figura 36. GUI personalizada para la aplicacin Purchase Order

La Figura 36 muestra qu aspecto podra tener la ventana importada si efecta los siguientes cambios en la interfaz: v Sustituya las teclas de mandato con una barra de mens y los elementos de men asociados. Por ejemplo, un men Vendor (Proveedor) contiene acciones que originalmente se convirtieron en pulsadores. Esto da a los usuarios acceso libre a las acciones realizadas con frecuencia y lanza ventanas relacionadas. v Agrupe la informacin relacionada mediante componentes recuadro de grupo para proporcionar una gua visual a los usuarios. Por ejemplo, un recuadro de grupo con la etiqueta Shipment Information (Informacin de envo) contiene campos de entrada que pertenecen a la informacin de envo. v Utilice los botones de seleccin agrupados para obtener informacin que requiera que un usuario seleccione entre varias opciones conocidas. Por ejemplo, slo son posibles tres mtodos de pago (prepago, cobro y cargo); por consiguiente, los usuarios slo tienen que seleccionar un botn de seleccin para indicar el mtodo que est utilizndose. Los botones de seleccin estn en un recuadro de grupo con la etiqueta Payment (Pago). Estos cambios aprovechan las posibilidades grficas que ofrece VisualAge RPG. Reutilizacin de la ayuda en lnea: Cuando vuelva a utilizar una aplicacin, tal vez tambin desee usar de nuevo la ayuda del User Interface Manager (UIM) existente. Tendr que modificarla un poco para reflejar el aspecto de la nueva GUI; no obstante, podra ahorrarle el trabajo necesario para crear ayudas desde cero. Puede personalizar la ayuda de UIM convertida y aadir nuevos tipos de ayuda utilizando IPF (Recurso de Presentacin de Informacin). Puede escribir ayuda para cada ventana y ayuda segn contexto para cada componente, y puede enlazar la informacin de ayuda creando enlaces de hipertexto en el fuente de ayuda. Vea

204

Programacin con VisualAge RPG

Reutilizar ayuda UIM en la pgina 212 y Captulo 13. Consejos para crear ayuda en lnea con IPF en la pgina 235 para obtener ms informacin. Cmo escribir lgica de programa: Puede reutilizar la lgica escrita en RPG IV porque el compilador est basado en ese lenguaje. Basta con que corte y pegue el cdigo existente para reutilizarlo. Tambin tiene que escribir lgica de programa adicional utilizando la programacin dirigida por eventos. Para cada evento asociado a un componente, hay una subrutina de accin que describe cmo el programa responde a un evento. Los cdigos de operacin de procedimiento para el control de programa no son necesarios; el control del programa est implcito. Algunos cdigos de operacin de VisualAge RPG exclusivos de las aplicaciones VisualAge RPG son: BEGACT Empieza una subrutina de accin ENDACT Finaliza una subrutina de accin SETATR Establece el valor de un atributo de componente GETATR Recupera el valor de un atributo de componente SHOWWIN Visualiza una ventana CLSWIN Cierra una ventana La Figura 37 en la pgina 206 contiene una subrutina de accin de una aplicacin de ejemplo de pedidos de compra. Cuando se llama a SHOWWIN desde una ventana determinada para visualizar la ventana PUR570R2, se codifica una subrutina de accin para el evento Create con el fin de preparar la ventana para la siguiente accin de un usuario. Si es un pedido de compra nuevo (#PONUM = 0), los elementos de men change, delete, print y fax se establecen para no responder al evento MENUSELECT. Para cada uno de los elementos de men, se utiliza la funcin %setatr para establecer el atributo enabled en 0. El cdigo de operacin BEGACT indica el inicio de la subrutina de accin y ENDACT indica su final.

Captulo 9. Reutilizar aplicaciones AS/400

205

********************************************************************* ********************************************************************* * * Ventana . : PUR570R2 PO Header Maintenance * * * ********************************************************************* ********************************************************************** C PUR570R2 BEGACT CREATE PUR570R2 c* c* C if #PONUM = 0 C eval %setatr('pur570r2':'m2_change':'enabled')=0 C eval %setatr('pur570r2':'m2_delete':'enabled')=0 C eval %setatr('pur570r2':'m2_print':'enabled')=0 C eval %setatr('pur570r2':'m2_fax':'enabled')=0 C end C exsr POCHECK C write 'PUR570R2' C ENDACT *********************************************************************-

Figura 37. Ejemplo de subrutina de accin

Conexin al sistema principal: Si la aplicacin utiliza campos de base de datos de AS/400 o importa archivos de pantalla de AS/400 cuando se est construyendo la aplicacin, debe definir el sistema AS/400 que utiliza. Puede comunicar con el sistema principal en cualquier momento, siempre y cuando la informacin de conexin a servidores est definida de la manera adecuada. Consulte el manual Iniciacin a VisualAge RPG y CODE/400 para obtener ms informacin acerca de la definicin de informacin de servidor.

Importacin de archivos de pantalla de AS/400


Si tiene un archivo de pantalla de AS/400 que contiene formatos de registro que desea incluir en una ventana de diseo, puede importar dichos formatos de registro desde un sistema AS/400 al entorno VisualAge RPG. Despus de completar la importacin, el registro se convierte en un componente definido por usuario y se almacena en la pgina Importado del catlogo de componentes. Para poder importar un archivo de pantalla de AS/400: v Defina el servidor (sistema AS/400) al que acceder. Consulte el apartado Iniciacin a VisualAge RPG y CODE/400, SC10-3287-01 (SC09-2625-01). v Debe tener un mnimo de autorizacin *USE para estos archivos de pantalla de AS/400. Para importar un archivo de pantalla: 1. Elija ServidorImportar archivo de pantalla en el Diseador GUI. 2. Seleccione un archivo de pantalla utilizando uno de los mtodos siguientes: v Escriba el nombre completo del archivo de pantalla (<servidor>biblioteca/archivo) en el campo de entrada Nombre del archivo y pulse Intro mientras el cursor est en el campo. v Haga lo siguiente: a. Seleccione uno de los servidores que se visualizan. Se visualiza una lista de bibliotecas debajo del nombre del servidor. b. Seleccione uno de estos nombres de biblioteca. Aparecer una lista de objetos de archivo de pantalla. c. Seleccione uno de estos objetos de archivo de pantalla. Se visualiza una lista de registros del archivo. 3. Seleccione el registro que desea importar.

206

Programacin con VisualAge RPG

4. Si no desea utilizar el nombre de componente por omisin, teclee un nombre de componente en el campo de entrada Nombre de componente. 5. Si no desea utilizar el icono por omisin, puede accionar el pulsador Find para utilizar la ventana Find an Icon. 6. Seleccione uno de los elementos siguientes para indicar dnde desea que resida el componente: Catlogo solamente El componente se aade a la pgina importada del catlogo. Catlogo y paleta El componente se aade a la pgina Importado del catlogo y el icono del componente importado aparece en la paleta. 7. Elija Importar.

Conversin de archivos de pantalla


Al importar un archivo de pantalla, se convierten los formatos de registro, campos y palabras clave que tienen atributos o componentes equivalentes y stos pueden utilizarse como se utilizara cualquier otro componente. Los formatos de registro, los campos y las palabras clave sin componentes equivalentes no se convierten. En general, v Los formatos de registro se convierten en una ventana de VisualAge RPG o en un grupo de componentes, dependiendo del tipo de registro. v Los campos se convierten en campos de entrada. v Las constantes se convierten en componentes texto esttico. v Las opciones de indicador de condicionamiento no se tienen en cuenta. Nota: Los campos cuya longitud sea superior a 64 bytes pasan a ser de 64 bytes en la GUI; no obstante, el atributo de longitud del cuaderno de propiedades queda establecido en la longitud original.

Formatos de registro
La siguiente lista describe cmo los formatos de registro de pantalla se convierten en componentes. MNUBAR El formato de registro MNUBAR se convierte en un componente de barra de mens que puede soltarse en una ventana con lienzo. PULLDOWN El formato de registro PULLDOWN se utiliza con el formato de registro MNUBAR para crear un componente submen. El formato de registro PULLDOWN se convierte en componentes opcin de men para el formato de registro MNUBAR al que hace referencia. RECORD El formato de registro RECORD se convierte en un grupo de componentes que pueden soltarse en una ventana con lienzo. SFL, SFLCTL Estos formatos de registro se convierten en un componente subarchivo que puede soltar en una ventana con lienzo. Las constantes de los registros SFL no se convierten. WINDOW El formato de registro de definicin WINDOW se convierte en un

Captulo 9. Reutilizar aplicaciones AS/400

207

componente ventana con lienzo. El formato de registro de referencia WINDOW se convierte en un grupo de componentes que pueden soltarse en una ventana con lienzo. Los registros de formato que no se convierten son: ERRSFL, PDNSFL, SFLMSG, USRDFN y WDWSFL.

Entradas de posicin
La siguiente tabla describe de qu manera las entradas de posicin de DDS utilizadas para crear un archivo de pantalla determinan cmo se convierten los formatos y los campos.
Tabla 6. Entradas de posicin y conversin
Columnas 8-16 Significado Indicadores Entrada y resultados de la conversin No se convierten

17

Tipo de registro

R H

Se convierte segn lo descrito en Formatos de registro No se convierten

19-28

Nombre

Si es un campo con nombre, se utiliza como nombre del componente

29

Referencia

No se convierten

30-34

Longitud

Establece la longitud de los datos

35

Modalidad de teclado

A E G I J O

Se convierte a carcter Tipo de datos establecido como DBCS cualquiera Tipo de datos establecido como Slo DBCS Slo lectura, inhabilitado Tipo de datos establecido como Slo DBCS Tipo de datos establecido como DBCS mixto

DFMNSWXY No se convierten 36-37 Decimales

Determina el nmero de posiciones decimales del componente convertido. Si se especifica, establece el tipo de datos como Numrico.

208

Programacin con VisualAge RPG

Tabla 6. Entradas de posicin y conversin (continuacin)


Columnas 38 Significado Uso Entrada y resultados de la conversin IB MP O H Habilitado No se convierten Slo lectura, habilitado Se convierte si el campo es de subarchivo

39-41

Ubicacin

Determina la posicin del componente en la ventana

45-80

Palabras clave

Constante Crea un componente texto esttico

Palabras clave de archivos de pantalla


La siguiente lista describe cmo las palabras clave de archivo de pantalla se convierten en componentes. Las opciones que se utilizan con estas palabras clave pueden determinar si las palabras clave se convierten o no. CFnn, CAnn Estas palabras clave se convierten en pulsadores que tienen una etiqueta idntica al nombre de la palabra clave. CHOICE Vea MLTCHCFLD y SNGCHCFLD. CNTFLD La palabra clave CNTFLD se convierte en un componente edicin multilnea. COLOR La palabra clave COLOR determina el atributo de color de fondo del componente. Si hay ms de una palabra clave COLOR, se utiliza la ltima. COMP La palabra clave COMP se utiliza para establecer los atributos de comparacin en el cuaderno de propiedades del componente. DATE La palabra clave DATE se convierte en un componente texto esttico. DFT El texto asociado con DFT se convierte en la etiqueta del componente. v Si el campo que est convirtindose es un campo de constante, en la etiqueta se utiliza valor de DFT. v Si el campo que est convirtindose est especificado en un campo con nombre, el valor de la palabra clave DFT se convierte en el texto por omisin del componente.

DFTVAL El valor de la palabra clave DFTVAL se convierte al valor por omisin del componente. DSPATR Si el atributo de pantalla DSPATR es: v HI, el color de fondo se vuelve ms brillante.
Captulo 9. Reutilizar aplicaciones AS/400

209

v ND, el campo convertido se establece como no visible. v PR, el campo convertido se establece como inhabilitado. Los dems atributos de pantalla no se convierten. HELP La palabra clave HELP se convierte en un pulsador con la etiqueta HELP. La funcin de ayuda no se convierte. MLTCHCFLD Si se utiliza la palabra clave MLTCHCFLD en un registro PULLDOWN, cada una de las palabras clave CHOICE asociadas con ella se convierte en un componente opcin de men de un componente submen. La parte de opcin de men convertida tendr una marca de seleccin para indicar que est activa. Si la palabra clave MLTCHCFLD se utiliza fuera de un registro PULLDOWN, cada palabra clave CHOICE se convierte en un componente recuadro de seleccin. Los recuadros de seleccin se colocan en sentido horizontal, dejando entre ellos el mismo espacio. No se agrupan. MNUBAR El formato de registro MNUBAR se convierte en un componente men. MNUBARCHC Cada MNUBARCHC se convierte en un elemento de men. PRINT La palabra clave PRINT se convierte en un pulsador con la etiqueta PRINT. La funcin de impresin no se convierte. PSHBTNCHC, PSHBTNFLD La palabra clave PSHBTNFLD se convierte en un componente pulsador. El texto asociado con la palabra clave PSHBTNCHC se convierte en la etiqueta de un componente pulsador. PULLDOWN El formato de registro PULLDOWN se utiliza con el formato de registro MNUBAR para crear un componente submen. El formato de registro PULLDOWN se convierte en los componentes elemento de men del formato de registro MNUBAR al que hace referencia. RANGE La palabra clave RANGE se convierte en el atributo de rango del componente. SFL, SFLCTL Estos formatos de registro se convierten en un componente subarchivo. SFLPAG Ejerce influencia en la altura inicial del componente subarchivo. SNGCHCFLD Si se utiliza la palabra clave SNGCHCFLD dentro de un registro PULLDOWN, cada palabra clave CHOICE asociada con ella se convierte en un componente elemento de men de un componente submen. Si la palabra clave SNGCHCFLD se utiliza fuera de un registro PULLDOWN, cada palabra clave CHOICE asociada con ella se convierte en un componente recuadro de seleccin. Los botones de seleccin se disponen horizontalmente, dejando entre ellos el mismo espacio. No se agrupan.

210

Programacin con VisualAge RPG

SYSNAME La palabra clave SYSNAME se convierte en un componente texto esttico. TIME La palabra clave TIME se convierte en un componente texto esttico. USER La palabra clave USER se convierte en un componente texto esttico. VALUES La palabra clave VALUES hace que el campo se convierta en un componente recuadro de combinacin desplegable. Los valores asociados con la palabra clave VALUES se utilizan en la lista desplegable. WDWTITLE La palabra clave WDWTITLE se utiliza para determinar la etiqueta y los atributos de un componente ventana con lienzo. v Si el texto del ttulo se asigna a un campo de programa a sistema, no se convierte. v Si el texto del ttulo se asigna a un campo literal, este texto se asigna a la etiqueta del componente ventana con lienzo. WINDOW El formato de registro de definicin WINDOW se convierte en un componente ventana con lienzo. El formato de registro de referencia WINDOW se convierte en un grupo de componentes que pueden soltarse en una ventana con lienzo. No se convierten ms palabras clave.

Conversin del color


Los campos de entradas del monitor basado en caracteres se convierten en componentes campos de entrada codificados por colores. Nota: No todos los monitores dan soporte a dichos colores. En monitores VGA, por ejemplo, los campos de entrada convertidos sern de color blanco. El color de cada campo de entrada convertido depende del tipo y de los atributos definidos en el archivo de pantalla:
Tabla 7. Atributos de campo originales y convertidos
Tipo de campo E/S* Atributos de campo Atributos GUI ReadOnly: Desactivado Enabled: Activado Color: Amarillo claro ReadOnly: Activado Enabled: Activado Color: Verde claro ReadOnly: Desactivado Enabled: Activado Color: Azul claro Protegido ReadOnly: Desactivado Enabled: Desactivado Color: Rojo claro ReadOnly: Activado Enabled: Activado Color: Rojo intermedio

Salida

Entrada

Entrada o E/S

Entrada o E/S

Teclado inhibido

Captulo 9. Reutilizar aplicaciones AS/400

211

Tabla 7. Atributos de campo originales y convertidos (continuacin)


Entrada o E/S Teclado inhibido Protegido ReadOnly: Activado Enabled: Desactivado Color: Rosa oscuro

Nota: E/S = entrada y salida La codificacin por colores le permite determinar visualmente los atributos establecidos para el componente campo de entrada. Por ejemplo, si se visualiza un campo de entrada verde claro, sabr que lo utiliza el programa para visualizar datos y que no puede recibir ninguna entrada de usuario. Si se visualiza un campo rojo claro, sabr que puede recibir entradas de usuario pero que no est habilitado porque se trata de un campo protegido de la aplicacin original.

Reutilizar ayuda UIM


Puede reutilizar la ayuda de AS/400 que se escribi utilizando el Gestor de Interfaz de Usuario (UIM) aunque los archivos de ayuda de VisualAge RPG se escriben utilizando el Recurso de Presentacin de Informacin (IPF). Los formatos UIM y IPF utilizan principios de Lenguaje de Marcacin General (GML) y son altamente intercambiables. Para obtener informacin detallada acerca de la utilizacin de IPF, consulte el manual Information Presentation Facility Guide and Reference (disponible en lnea). Tambin debe consultar el documento en lnea titulado Restricciones de IPF. Este documento proporciona informacin detallada sobre el subconjunto de cdigos IPF que le son restringidos en un entorno de Windows. Para reutilizar archivos de ayuda de UIM en un sistema AS/400: 1. Utilice el editor para copiar y pegar los miembros AS/400 que contengan la ayuda UIM. 2. Cambie los cdigos UIM por los cdigos IPF correspondientes. En las secciones siguientes se comparan algunos de los cdigos UIM e IPF.

Funciones UIM e IPF que utilizan los mismos cdigos


Hay funciones en UIM e IPF que son equivalentes y se codifican exactamente de la misma manera. En estos casos puede utilizar los cdigos UIM literalmente.
Tabla 8. Cdigos UIM e IPF idnticos
Cdigo UIM :DL. :FIG. :HP1. :HP2. :HP3. :HP4. :HP5. :HP6. :HP7. :HP8. Funcin cdigo Lista de definiciones Figura Frase resaltada Frase resaltada Frase resaltada Frase resaltada Frase resaltada Frase resaltada Frase resaltada Frase resaltada Cdigo IPF :dl. :fig. :hp1. :hp2. :hp3. :hp4. :hp5. :hp6. :hp7. :hp8.

212

Programacin con VisualAge RPG

Tabla 8. Cdigos UIM e IPF idnticos (continuacin)


Cdigo UIM :HP9. :LINES. :LI. :LP. :NT. :OL. :P. :PARML. :P :PT. :SL. :UL. :XMP. &AMP. &COLON. &period. &SLR. Funcin cdigo Frase resaltada Lneas Elemento de lista Componente de lista Nota Lista ordenada Prrafo Lista de parmetros Descripcin de parmetro Trmino de parmetro Lista sencilla Lista no ordenada Ejemplo Ampersand (&) Dos puntos (:) Punto (.) Barra inclinada (/) Cdigo IPF :hp9. :lines. :li. :lp. :nt. :ol. :p. :parml. :pd. :pt. :sl. :ul. :xmp. &amp. &colon. &period. &slr.

Funciones UIM e IPF equivalentes que utilizan cdigos distintos


Hay funciones en UIM e IPF que son equivalentes pero se codifican de manera distinta. En esta situacin, cambie la codificacin UIM por la codificacin IPF equivalente.
Tabla 9. Cdigos UIM e IPF equivalentes
Cdigo UIM :CIT. :H1. :H2. :H3. :H4. :HELP. :ISCH. :ISCHSYN. :PK. :PK. con :DEF. :PV. Funcin Cita Cabecera Cabecera Cabecera Cabecera Cabecera Elemento ndice Sinnimo de ndice Palabra clave de programacin Palabra clave de prog. por omisin Variable de programacin Cdigo IPF :hp5. :h2. :h3. :h4. :h5. :help. :i1. :isyn. :hp2. :hp7. :hp5.

Captulo 9. Reutilizar aplicaciones AS/400

213

Funciones UIM sin equivalentes IPF


Hay funciones disponibles en UIM que no estn disponibles en IPF. En esta situacin, suprima la funcin o busque otra manera de implantar la funcin utilizando la codificacin IPF.
Tabla 10. Cdigos UIM sin equivalentes IPF
Cdigo UIM :HP0. :PC. :RT. :XH1. Funcin Sin resaltado Continuacin de prrafo Texto inverso Cabecera de ayuda general Sustitutos IPF sugeridos No utilice ningn cdigo :hpn alrededor del texto. No utilice ningn cdigo. Contine con el texto del prrafo. Utilice un tipo diferente de resaltado utilizando un cdigo :hpn. No hay ayuda general en IPF. Utilice un cdigo :link. para crear un enlace de hipertexto a otra ventana de ayuda (:h1.) donde se proporcione ayuda general. No hay ayuda general en IPF. Utilice un cdigo :link. para crear un enlace de hipertexto a otra ventana de ayuda (:h1.) donde se proporcione ayuda general. No hay ayuda general en IPF. Utilice un cdigo :link. para crear un enlace de hipertexto a otra ventana de ayuda (:h1.) donde se proporcione ayuda general. No hay ayuda general en IPF. Utilice un cdigo :link. para crear un enlace de hipertexto a otra ventana de ayuda (:h1.) donde se proporcione ayuda general.

:XH2.

Cabecera de ayuda general

:XH3.

Cabecera de ayuda general

:XH4.

Cabecera de ayuda general

Reutilizar el fuente RPG


Para reutilizar el cdigo fuente RPG de un sistema AS/400: 1. Si el cdigo fuente no est en sintaxis RPG IV, convirtalo en sintaxis RPG IV utilizando la herramienta de conversin de ILE RPG/400 (CVTRPGSRC) en el sistema AS/400. 2. Utilice el editor para copiar y pegar los miembros AS/400 que contengan el fuente RPG y subrutinas utilizadas habitualmente. 3. El comprobador de sintaxis resalta los cdigos de operacin que no estn soportados por el compilador. Consulte el manual VisualAge RPG Manual de consulta del lenguaje para obtener una descripcin de los cdigos de operacin soportados. Nota: Adems de las diferencias entre cdigos de operacin, existen otras diferencias entre el lenguaje RPG IV y el compilador VisualAge RPG que hay que tener en cuenta antes de reutilizar el fuente RPG. Para obtener una descripcin de las diferencias entre el lenguaje RPG IV y el lenguaje VisualAge RPG, consulte el manual VisualAge RPG Manual de consulta del lenguaje.

214

Programacin con VisualAge RPG

Parte 4. Temas avanzados


Captulo 10. Depuracin de la aplicacin en la pgina 217 Describe cmo depurar una aplicacin. Captulo 11. Edicin de la salida en la pgina 229 Describe cmo formatear la salida. Captulo 12. Utilizacin de archivos de imgenes, de sonido y de vdeo en la pgina 233 Describe la utilizacin de archivos de imgenes y sonido en la aplicacin. Captulo 13. Consejos para crear ayuda en lnea con IPF en la pgina 235 Describe cmo crear y utilizar ayuda en lnea en la aplicacin. Captulo 14. Consejos para la creacin y utilizacin de ayuda Windows en la pgina 239 Describe cmo crear y utilizar ayuda de Windows en la aplicacin. Captulo 15. Consejos para la creacin de JavaHelp en la pgina 243 Describe cmo crear y utilizar JavaHelp en la aplicacin. Captulo 16. Trabajar con mensajes en la pgina 247 Describe cmo crear y utilizar archivos de mensajes en la aplicacin. Captulo 17. Comunicacin entre objetos en la pgina 253 Describe cmo establecer comunicacin entre objetos de la aplicacin. Captulo 18. Cmo invocar mtodos Java desde programas VisualAge RPG en la pgina 269 Describe como invocar mtodos Java. Captulo 19. Consideraciones al compilar para Java en la pgina 277 Describe las restricciones de fuente RPG, cambios de fuente que puedan requerirse y diferencias en el tiempo de ejecucin para aplicaciones de Java. Captulo 20. Llamada a funciones del sistema al compilar para Java en la pgina 283 Describe cmo llamar a procedimientos externos mediante la Interfaz Nativa de Java (JNI). Captulo 21. Cmo crear programas no GUI en VisualAge RPG en la pgina 357 Describe cmo crear aplicaciones no GUI. Captulo 22. Consideraciones sobre DBCS en la pgina 363 Describe cmo preparar la aplicacin para su traduccin. Captulo 23. Fusin de cdigo en la aplicacin en la pgina 367 Describe cmo fusionar parte del cdigo en la aplicacin.

Copyright IBM Corp. 1994, 2000

215

216

Programacin con VisualAge RPG

Captulo 10. Depuracin de la aplicacin


El depurador proporcionado con VisualAge RPG le ayuda a detectar y diagnosticar errores en la aplicacin. Puede utilizarse para depurar aplicaciones en las que se han utilizado varios lenguajes. Puede: v Gestionar la ejecucin de aplicaciones y DLL. v Establecer y controlar puntos de interrupcin. v Visualizar y modificar estados del programa utilizando almacenamiento, registros, variables y ventanas de pilas de llamadas. En esta seccin se muestran algunas de estas caractersticas cuando se utiliza un programa VisualAge RPG. Para depurar cdigo Java generado por VARPG, necesitar Windows NT y el Distributed Debugger.

Arranque del depurador


Para arrancar el depurador, seleccione el elemento de men Depurar del men Proyecto. Aparecen dos ventanas. La ventana Control de sesin de depuracin y la ventana Fuente VisualAge RPG. La Figura 38 muestra estas dos ventanas.

Figura 38. Las ventanas Fuente VisualAge RPG y Control de sesin de depuracin

Cuando se arranca el depurador, ste busca el miembro fuente VisualAge RPG y lo visualiza en la ventana Fuente. Una vez que el fuente se ha visualizado, puede efectuar tareas de depuracin. Nota: Un nmero de lnea resaltada indica la posicin actual del programa en ejecucin. Aqu est resaltada la primera lnea del miembro fuente.

Copyright IBM Corp. 1994, 2000

217

Visualizacin del cdigo ensamblador


Si el depurador no encuentra el fuente VisualAge RPG, carga el programa y visualiza el cdigo fuente ensamblador en lugar del cdigo fuente VisualAge RPG. La ventana que se visualiza es parecida a la que se visualiza en la Figura 39.

Figura 39. La ventana Desensamblar.

Para corregir este problema, asegrese de que el cdigo fuente VisualAge RPG (archivo .VPG) reside en la estacin de trabajo.

Carga de la aparicin de DLL


Si se visualiza el cdigo fuente ensamblador significa que no se puede encontrar el miembro fuente VisualAge RPG. Para solucionar este problema, seleccione Establecer aparicin de carga en el men desplegable Puntos de interrupcin. Se visualiza la ventana Punto de interrupcin de aparicin de carga (Figura 40 en la pgina 219). Desde esta ventana, puede cargar la aparicin de DLL. Escriba la informacin siguiente y seleccione Bien:
nombre_aplicacin.DLL

Esto le devuelve a la sesin de depuracin. Cuando la vista del fuente ensamblador se visualice de nuevo, pulse la tecla R para reanudar la ejecucin del programa. Cuando la DLL se carga, el sistema visualiza un mensaje y el nombre de la aplicacin se visualiza en la ventana de control. Ahora puede pulsar el botn en la aplicacin para que el fuente se visualice. Si el fuente no se visualiza significa que lo ha perdido o eliminado.

218

Programacin con VisualAge RPG

Figura 40. Establecimiento del punto de interrupcin de la carga de la aparicin.

Si la aplicacin utiliza el cdigo de opcin START para iniciar otro componente, tendr que utilizar este procedimiento para cargar la DLL del otro componente. Esto le permitir establecer puntos de interrupcin dentro de otros componentes.

Entrada de informacin de arranque de la depuracin


Si no se puede localizar el archivo ejecutable, el depurador visualiza una ventana parecida a la de la Figura 41 de ms abajo. En esta ventana puede volver a entrar el nombre y los parmetros del programa.

Figura 41. Informacin de arranque.

Establecimiento de un punto de interrupcin


Estableciendo puntos de interrupcin puede controlar la manera en que su programa se ejecuta. Un punto de interrupcin detiene la ejecucin del programa en una ubicacin especfica o cuando se produce un evento especfico. Para establecer un punto de interrupcin, mueva el cursor al nmero de lnea en el que desea efectuar la interrupcin y efecte una doble pulsacin con el botn 1 del ratn. El depurador resalta el nmero de lnea mediante una marca roja. Puede repetir este proceso siempre que quiera marcar todas las lneas necesarias en las que desea efectuar la interrupcin. La Figura 42 en la pgina 220 muestra el aspecto de la pantalla despus de haber establecido varios puntos de interrupcin. Puede visualizar todos los puntos de interrupcin en la ventana Lista de puntos de interrupcin.

Captulo 10. Depuracin de la aplicacin

219

Figura 42. Establecimiento de varios puntos de interrupcin.

Seleccione Puntos de interrupcinLista para visualizar esta ventana. Para cada punto de interrupcin se proporciona la siguiente informacin: v El estado de habilitacin v El tipo de punto de interrupcin v La posicin del punto de interrupcin v La condicin debido a la que se activa el punto de interrupcin

Figura 43. La ventana Lista de puntos de interrupcin.

220

Programacin con VisualAge RPG

Ejecucin con puntos de interrupcin


Al pulsar la tecla R se ejecuta el programa. Cuando encuentra el primer punto de interrupcin se para. Cuando el depurador encuentra un punto de interrupcin, se para y resalta toda la lnea, tal como se muestra en la Figura 44 de ms abajo. Esto indica la posicin en la que se ha detenido el programa en ejecucin.

Figura 44. Ejecucin con puntos de interrupcin.

Utilizacin del ratn o del teclado para iniciar funciones de depuracin


La mayora de funciones de depuracin pueden iniciarse utilizando el ratn o el teclado. Por ejemplo, para establecer una ubicacin de punto de interrupcin, efecte una doble pulsacin con el botn 1 del ratn en un nmero de lnea. Tambin puede establecer dicha ubicacin seleccionando Lnea en el men desplegable Puntos de interrupcin. Cuando selecciona Lnea, se visualiza la ventana Puntos de interrupcin de lnea. A continuacin debe entrar el nmero de lnea. Cuando entra el nmero de lnea y pulsa Intro, la lnea que ha seleccionado se resalta en rojo.

Captulo 10. Depuracin de la aplicacin

221

Figura 45. La ventana Puntos de interrupcin de lnea.

Tambin puede reanudar la ejecucin del programa de maneras diferentes. Realice una de las acciones siguientes: v Pulse la letra R. v Mueva el ratn al men desplegable Ejecutar y seleccione Ejecutar. v Mueva el ratn al icono de ejecucin en la barra de herramientas y efecte una sola pulsacin con el botn 1 del ratn.

Seleccin de opciones desde la barra de herramientas


La tabla siguiente lista todas las opciones disponibles en la barra de herramientas y explica brevemente cada una.

Figura 46. Opciones de la barra de herramientas.

Icono

Funcin

Recorrer principal Ejecuta la lnea actual (resaltada) en el programa, pero no entra en ninguna funcin llamada. Recorrer todo Ejecuta la lnea actual (resaltada) en el programa y entra en cualquier programa o funcin llamados. Recorrer depuracin Ejecuta la lnea actual (resaltada) en el programa. El depurador efecta una ejecucin de pasos externos en cualquier funcin para la que no hay informacin de depuracin disponible, y efecta una ejecucin de pasos internos en cualquier funcin para la que hay informacin de depuracin disponible.

222

Programacin con VisualAge RPG

Retorno de recorrido Ejecuta de forma automtica las lneas de cdigo hasta la sentencia de retorno inclusive de la funcin actual. Ejecutar Empieza la ejecucin del programa en la lnea actual (resaltada). Detener Para la ejecucin del programa. Vistas Conmuta a la vista siguiente. Supervisar expresin Visualiza una variable o una expresin en una ventana de supervisin. Pila de llamadas Visualiza las funciones activas de la pila de llamadas de una lnea de ejecucin. Registros Visualiza los registros de las lneas de ejecucin en la ventana de registros. Almacenamiento Visualiza el contenido del almacenamiento en la ventana de almacenamiento. Puntos de interrupcin Lista todos los puntos de interrupcin que se han establecido. Control de sesin de depuracin Visualiza la ventana de control de sesin de la depuracin.

Visualizacin y modificacin de variables, matrices y estructuras


La visualizacin de una variable, matriz u otra estructura VisualAge RPG vlida durante la depuracin es una funcin utilizada habitualmente. La manera ms sencilla de hacerlo consiste en mover el ratn a cualquier especificacin en la que se permitan campos y efectuar una doble pulsacin con el botn 1 del ratn. Por ejemplo, mueva el ratn al indicador de condicionamiento, al factor 1, al factor 2, al campo de resultado y/o a los indicadores de resultado y efecte una doble pulsacin. Esto hace que se visualice el contenido de la especificacin. Nota: Si la variable es un operando para el cdigo de operacin EVAL, seleccione la variable que desea visualizar resaltndola con el ratn y a continuacin efecte una doble pulsacin. Si el campo o la estructura que desea visualizar o modificar est en la vista, la manera ms sencilla para visualizar su contenido es utilizar el ratn y efectuar una doble pulsacin en dicho campo o estructura. Sin embargo, si est utilizando una programa de gran tamao y no puede localizar una variable o una estructura determinada con facilidad, seleccione Supervisar expresin del men desplegable Supervisores (esto es lo mismo que pulsar Control-M). En la ventana Supervisar expresin, que se muestra en la Figura 47 en la pgina 224, escriba la expresin, campo o estructura que desea visualizar y a continuacin pulse Intro.

Captulo 10. Depuracin de la aplicacin

223

Figura 47. La ventana Supervisar expresin.

Despus de pulsar Intro, el campo o la estructura de VisualAge RPG se visualiza en la ventana Supervisor de programa, tal como se muestra en la Figura 48.

Figura 48. La ventana Supervisor de programa.

Modificacin del contenido de un campo o de una estructura


Una vez que se ha visualizado un campo o una estructura de VisualAge RPG, puede modificar su contenido. Para hacerlo, efecte una doble pulsacin en el valor en la ventana Supervisor de programa, escriba el valor nuevo y pulse la tecla Intro.

Modificacin de la representacin
El depurador le permite modificar la representacin de cualquier variable visualizada en el supervisor del programa. Los tipos de representacin de una variable o de una estructura pueden ser decimal, hexadecimal, binaria o de serie. Para modificar la representacin, seleccione una variable en la ventana Supervisor de programa. A continuacin, seleccione una representacin en el men EditarRepresentacin. El contenido de la variable se visualiza ahora en la representacin que ha seleccionado.

224

Programacin con VisualAge RPG

Modificacin de la representacin por omisin


Las variables tienen tipos de representacin por omisin. Por ejemplo, un campo de tipo carcter se visualizara en la ventana Supervisor de programa como caracteres, no como hexadecimales. El depurador le permite alterar este comportamiento. Tiene la opcin de establecer la representacin por omisin para cada tipo de datos. Para modificar la representacin por omisin de un campo, seleccione OpcionesValores de depuradorRepresentacin de datos por omisinSistema. Se visualiza la ventana Representacin de datos por omisin.

Visualizacin de punteros y almacenamiento


Entre los tipos de datos que VisualAge RPG soporta estn los punteros. La Figura 49 muestra un ejemplo de visualizacin de un valor de puntero utilizando la ventana Almacenamiento. Seleccione Supervisor>Almacenamiento para visualizar la ventana Almacenamiento.

Figura 49. Visualizacin de un valor de puntero.

Captulo 10. Depuracin de la aplicacin

225

Modificacin de las vistas del depurador


En la mayora de ejemplos de esta seccin se muestra la vista Fuente de VisualAge RPG. El depurador tambin visualiza otras vistas: como la vista fragmentada y la vista combinada. Para modificar vistas, seleccione una opcin del men Ver, tal como se muestra en Figura 50.

Figura 50. Modificacin de vistas de depuracin.

226

Programacin con VisualAge RPG

Establecimiento de fonts
Existen muchas opciones disponibles en el depurador que le permiten personalizar la sesin de depuracin. Por ejemplo, puede establecer los fonts que desee. La Figura 51 visualiza la ventana de fonts. Para visualizar la ventana de fonts, seleccione OpcionesValores de ventanaFonts. En la ventana de fonts, seleccione el font, el estilo y el tamao que desee, y a continuacin seleccione Bien. El font modifica la visualizacin en la sesin de depuracin.

Figura 51. Establecimiento de fonts.

Captulo 10. Depuracin de la aplicacin

227

228

Programacin con VisualAge RPG

Captulo 11. Edicin de la salida


El compilador soporta posibilidades de edicin que determinan cmo estn formateados los datos cuando se visualizan en los componentes campo de entrada y texto esttico. Para editar la salida, puede establecer cdigos de edicin o palabras de edicin en el cuaderno de propiedades para estos componentes. Los cdigos de edicin le permiten formatear datos de acuerdo con formatos predefinidos, mientras que las palabras de edicin le permite definir el formato que desee. Slo puede especificar un cdigo de edicin o una palabra de edicin para un componente: no puede especificar ambos. Los cdigos y palabras de edicin slo se pueden especificar para los componentes campo de entrada y texto esttico numricos. Cuando se leen datos de un campo de entrada formateado se lee en el programa, el compilador elimina todos los caracteres de edicin antes de devolver los datos al programa. Nota: Las entradas de cdigos de edicin en la especificacin de control de la aplicacin se pasan por alto; no tienen ningn efecto en la salida de estos cdigos de edicin.

Cdigos de edicin
Estn soportados varios cdigos de edicin para formatear los datos en formatos predefinidos. Estos formatos insertan los separadores de millares y decimales adecuados y determinan cmo se visualiza un nmero negativo, proporcionando un signo menos fijo o flotante, o el smbolo CR (Crdito). Opcionalmente, puede especificar proteccin por asteriscos o un smbolo de moneda flotante con los cdigos de edicin. Cuando se especifica la proteccin por asteriscos, se visualiza un asterisco por cada cero que se suprime. Cuando se especifica el smbolo de moneda flotante, dicho smbolo aparece a la izquierda del primer dgito significativo. El smbolo no visualiza un saldo cero cuando se utiliza un cdigo de edicin que suprime el saldo cero. El sistema operativo determina los caracteres reales que se van a utilizar para los separadores de millares y decimales y para el smbolo de moneda cuando se ejecuta la aplicacin.

Copyright IBM Corp. 1994, 2000

229

La siguiente tabla resume los cdigos de edicin soportados y la edicin que proporcionan, y muestra algunos ejemplos. Nota: El compilador no soporta cdigos de edicin definidos por usuario. Los cdigos de edicin definidos por usuario se definen y se almacenan en el sistema AS/400 y no estn disponibles para los programas VisualAge RPG.
Tabla 11. Cdigos de edicin VisualAge RPG
Cd. edic. Punto Signo para saldo Ejemplo de Comas decimal negativo nmero positivo S S S S S S S S S S S S S S S S S S Sin signo Sin signo Sin signo Sin signo CR CR CR CR -(menos) -(menos) -(menos) -(menos) -(menos flotante) -(menos flotante) -(menos flotante) -(menos flotante) 0123456789 124,567.89 124,567.89 124567.89 124567.89 124,567.89 124,567.89 124567.89 124567.89 124,567.89 124,567.89 124567.89 124567.89 124,567.89 124,567.89 124567.89 124567.89 1984-12-25 No Sin signo 1234567 1234567 Ejemplo de Saldo nmero negativo cero 0123456789124,567.89 124,567.89 124567.89 124567.89 124.567,89CR 124.567,89CR 124567,89CR 124567,89CR 124.567,89124.567,89124567,89124567,89-124.567,89 -124.567,89 -124567,89 -124567,89 .00 .00 .00 .00 .00 .00 .00 .00

ning. No 1 2 3 4 A B C D J K D M R O EC T Q Y (2.) Z (3.) No S S No No S S No No S S No No S S No No

Notas: 1. Todos los cdigos de edicin suprimen los ceros iniciales 2. El cdigo de edicin Y se utiliza para editar campos de fecha. El campo de fecha debe definirse como campo numrico. La salida de este cdigo de edicin tiene el formato nnnn-nn-nn. Este formato no puede modificarse. El sistema operativo determina el carcter de separador de fecha cuando se ejecuta la aplicacin. 3. El cdigo de edicin Z elimina los signos + o .

Palabras de edicin
Puede utilizar palabras de edicin si ninguno de los cdigos de edicin suministrados satisface sus requisitos de edicin. Una palabra de edicin es un modelo que se aplica a los datos antes de colocarlos en el componente. Con las palabras de edicin, puede especificar: v Supresin de ceros iniciales v Asteriscos iniciales

230

Programacin con VisualAge RPG

v El smbolo de moneda fijo/flotante v La posicin de los separadores de millares y decimales. Nota: Cuando utilice palabras de edicin, asegrese de que especifica correctamente los smbolos de moneda, decimales y de millares. Si los smbolos no coinciden con la palabra de edicin, obtendr una salida formateada incorrectamente, pero ningn error de tiempo de ejecucin. Estos smbolos se sustituyen por los valores del sistema operativo de tiempo de ejecucin cuando se ejecuta la aplicacin.

Partes de una palabra de edicin


Una palabra de edicin se compone del cuerpo, el estado y la expansin. Estas partes se muestran en el siguiente ejemplo:
x x x . x x $ 0 , x x & C R * x T O T A L | || || | |------------cuerpo-------------||-estado-||----expansin-----| donde BLANCO SMBOLO DE MONEDA SEPARADOR MILLARES SMBOLO DECIMAL = = = = x $ . ,

Cuerpo de una palabra de edicin


El cuerpo es el espacio para los dgitos transferidos desde el campo de datos al componente. Comienza en la posicin situada ms a la izquierda de la palabra de edicin. Contiene varios blancos ms un cero o asterisco y el total equivale al nmero de dgitos del campo de datos que ha de editarse. Los caracteres siguientes tienen significados especiales cuando se utilizan en el cuerpo de una palabra de edicin: Blanco Un blanco se sustituye por el dgito de la posicin correspondiente del campo de datos. Smbolo & El smbolo & causa un blanco en la pantalla editada. Cero Un cero detiene la supresin de ceros. El cero es, por s mismo, una posicin de dgito. Se visualizan los ceros que haya en el campo de datos a la derecha del carcter de detener supresin de ceros. Cada cero que se suprime se sustituye por un blanco.

Asterisco Puede utilizarse un asterisco en lugar de un cero como carcter de detener supresin de ceros. Esto se denomina proteccin por asteriscos y cada cero que se suprime se sustituye por un asterisco. Cualquier asterisco o cero situado a la derecha del carcter de detener supresin de ceros es una constante y se visualizar tal cual. Smbolo de modeda Si codifica un smbolo de moneda inmediatamente a la izquierda del carcter de detener supresin de ceros, se insertar un smbolo de moneda en la posicin situada a la izquierda del primer dgito significativo. Se denomina smbolo de moneda flotante cuando se utiliza de esta manera. Si codifica un smbolo de moneda en la posicin situada ms a la izquierda de la palabra de edicin, es fijo y se visualiza siempre en la misma ubicacin. Se denomina smbolo de moneda fijo.

Captulo 11. Edicin de la salida

231

Separador de millares y separadores decimales Los separadores de millares y decimales se visualizan en las mismas posiciones relativas en las que se codificaron en la palabra de edicin. Todos los dems caracteres se visualizan si estn a la derecha de los dgitos significativos de la palabra de edicin. Si estn a la izquierda del dgito significativo de orden alto en la palabra de edicin, se rellenan con blancos o se sustituyen por un asterisco si est utilizndose la proteccin por asteriscos.

Estado de una palabra de edicin


Las posiciones de estado visualizan el signo de los datos. El estado contina a la derecha del cuerpo con un smbolo de crdito ( CR ) o menos ( - ). Estos dos smbolos slo se visualizan cuando el campo es negativo. El smbolo ( & ) se utiliza para visualizar un blanco.

Expansin de una palabra de edicin


Las operaciones de edicin no cambian las posiciones de expansin. La posicin de expansin comienza en la primera posicin situada a la derecha del estado (o cuerpo, si el estado no est especificado). La expansin no puede contener blancos. Si se requiere un blanco, utilice un smbolo & en la palabra de edicin.

232

Programacin con VisualAge RPG

Captulo 12. Utilizacin de archivos de imgenes, de sonido y de vdeo


Los componentes control de animacin, lienzo, pulsador grfico, imagen, medios y elemento de men le permiten visualizar imgenes en las ventanas al especificar un nombre de imagen vlido en el atributo FileName. Los formatos vlidos de imgenes de Windows son: Bitmaps de OS/2 y Windows Las extensiones de archivo .BMP, .VGA, .BGA, .RLE, .DIB, .RL4 y .RL8 se reconocen como bitmaps de OS/2 o Windows. Formato de icono La extensin de archivo .ICO se reconoce como un archivo de icono. Formato de Intercambio de Grficos de CompuServe La extensin de archivo .GIF se reconoce como un archivo GIF. Formato de Archivo de Imgenes de ZSoft PC Paintbrush La extensin de archivo .PCX se reconoce como un archivo Paintbrush. Formato de Archivo de Imgenes de Microsoft/Aldus Las extensiones de archivo .TIF y .TIFF se reconocen como archivos TIFF. Bitmap Targa/Vista de Truevision Las extensiones de archivo .TGA, .VST y .AFI se reconocen como archivos Targa/Vista. Esta clase slo soporta imgenes de 8 y 24 bits por plano. Formato de Bitmap Intercalado IFF/ILBM de Amiga Las extensiones de archivo .IFF y .LBM se reconocen como archivos de bitmap intercalado. Bitmap X de Windows La extensin de archivo .XBM se reconoce como un archivo Bitmap X. Esta clase soporta bitmaps X10 y X11 de 1bpp. Algunos archivos .XBM que contienen texto tienen el aspecto de sombras o iconos y no estn soportados. Segmento de Pgina de Impresora IBM Las extensiones de archivo .PSE, .PSEG, .PSEG38PP y .PSEG3820 se reconocen como archivos PSEG. Los archivos PSEG se utilizan para incluir datos de imgenes en documentos BookMaster. Los archivos PSEG slo contienen 1 bit por plano, que siempre es negro sobre blanco. Los formatos vlidos de imgenes Java son: v GIF (Formato de Intercambio de Grficos) de CompuServe v Formato Joint Photographic Experts Group (JPG, JPEG) Adems puede aadir sonido y vdeo mediante el componente medios, que da soporte a los archivos WAV, .MID, .MPG, .MOV, .DAT y .AVI. Al desarrollar una aplicacin VisualAge RPG que incluya imgenes, sonido o vdeo, evite la codificacin del atributo FileName para los componentes. Probablemente el usuario instalar la aplicacin en un directorio diferente de donde se desarroll.

Copyright IBM Corp. 1994, 2000

233

Para asegurarse de que estos archivos estn localizables en tiempo de ejecucin, utilice la serie Directorio actual (\): un punto y una barra inclinada invertida seguida del nombre de archivo. En tiempo de ejecucin, el archivo se encuentra en el directorio actual desde el que se ejecuta la aplicacin. Por ejemplo, en el cuaderno de propiedades para un pulsador grfico, especifique lo siguiente como nombre de archivo para un icono denominado EXIT.ICO, de tal manera que se encuentre en tiempo de ejecucin en el directorio actual.
.\\EXIT.ICO

Nota: Para las aplicaciones que se ejecutan en Windows, debe especificarse el directorio actual en el archivo AUTOEXEC.BAT. Durante el tiempo de construccin, debe copiar los archivos de imgenes al directorio de tiempo de construccin para acceder a estos archivos. Antes de empaquetar la aplicacin para su distribucin, copie todos los archivos de imgenes y sonido asociados en el subdirectorio de tiempo de ejecucin adecuado (RT_JAVA o RT_WIN32) del proyecto, porque es este directorio el que se empaqueta y distribuye a otros usuarios. Vea Parte 5. Distribucin de la aplicacin en la pgina 397 para obtener instrucciones sobre el empaquetado de la aplicacin.

Creacin de iconos para Windows


Si tiene VisualAge para C++ para Windows, puede utilizar el programa de utilidad Resource Workshop para crear iconos de Windows.

Conversin de iconos OS/2 a formato Windows


VisualAge RPG incluye un programa de utilidad para convertir iconos y bitmaps de OS/2 a versiones de Windows. Para obtener informacin especfica sobre este programa de utilidad y sus parmetros, vaya al indicador del DOS y teclee IBMPCNV -H.

234

Programacin con VisualAge RPG

Captulo 13. Consejos para crear ayuda en lnea con IPF


Puede utilizar el Recurso de Presentacin de Informacin (IPF) para crear y gestionar archivos de ayuda en lnea para la aplicacin. Tambin puede utilizar IPF para crear guas de aprendizaje y documentacin en lnea. Con VisualAge RPG, la ayuda en lnea creada ser ayuda de Windows nativa. En esta seccin se introduce IPF y se dan algunos consejos para crear ayuda en lnea para la aplicacin. Para obtener informacin detallada acerca de la utilizacin de IPF, consulte el manual Information Presentation Facility Guide and Reference (disponible en lnea). Tambin debe consultar el documento en lnea titulado Restricciones de IPF. Este documento proporciona informacin detallada sobre el subconjunto de cdigos IPF que le son restringidos en un entorno de Windows. Tambin puede reutilizar el cdigo fuente de ayuda UIM de un sistema AS/400. Consulte el apartado Reutilizar ayuda UIM en la pgina 212.

Creacin de ayuda en lnea


Para aadir ayuda en lnea a un componente de la aplicacin: 1. Visualice el men emergente del componente. 2. Elija Texto de ayuda. Se abre una sesin de edicin. 3. Teclee el texto de ayuda segn contexto para el componente. 4. Codifique el texto de ayuda utilizando el lenguaje de codificacin de IPF. 5. Guarde la ayuda seleccionando Guardar en el men Archivo.

Utilizacin de IPF
El fuente de los mdulos de ayuda de aplicaciones VisualAge RPG est en formato IPF. IPF le permite crear informacin en lnea, especificar cmo aparecer en la pantalla, conectar varias partes de la informacin y proporcionar informacin de ayuda que el usuario puede solicitar. Las caractersticas del IPF incluyen: v Un lenguaje de codificacin que formatea texto, proporciona maneras de conectar unidades de informacin y personaliza ventanas. v Un compilador que crea documentos en lnea y ventanas de ayuda. v Un programa que visualiza documentos en lnea formateados.

Soporte de ayuda para otros idiomas


Puede copiar y editar manualmente el archivo .VPF utilizando cualquier editor de textos. Sin embargo, no haga ninguna de las acciones siguientes: v Modifique o elimine el nmero que aparece despus del texto res=. Ese nmero es el identificador de recurso y el Diseador GUI lo genera cuando usted crea la ayuda para un componente. El identificador de recurso se utiliza para localizar el texto de ayuda adecuado. Si suprime o cambia un identificador de recurso, no se localizar el texto de ayuda perteneciente al mismo. v Elimine la informacin de cabecera. Puede sustituir la informacin de cabecera con el texto traducido.

Copyright IBM Corp. 1994, 2000

235

Adicin de grficos a la ayuda en lnea


Utilice :artwork. para intercalar grficos en los archivos fuente, como sea necesario. Los grficos deben estar en formato bitmap (archivos .BMP).

Decisin del tipo de ayuda que se va a proporcionar


Los usuarios pueden acceder a la ayuda de tres maneras diferentes en la aplicacin VisualAge RPG: Ayuda segn contexto Informacin de ayuda que se adapta al contexto actual de una opcin o componente. El usuario puede acceder a este tipo de ayuda pulsando F1 cuando una opcin o un componente tiene foco. Puede proporcionar esta ayuda a travs del men emergente del componente. Ayuda a nivel de ventana Informacin acerca del propsito de una ventana. El usuario puede acceder a este tipo de ayuda accionando un pulsador de ayuda. Puede proporcionar esta ayuda creando el pulsador Ayuda y aadiendo la informacin de ayuda asociada. Ayuda para tareas Informacin acerca de tareas que el usuario puede realizar con la aplicacin. El usuario puede acceder a este tipo de ayuda enlazando con otra informacin de ayuda desde un panel de ayuda. Puede suministrar esta informacin creando informacin en lnea y creando un enlace de hipertexto con ella desde el nivel de ventana o la ayuda segn el contexto. Un enlace de hipertexto permite a un usuario saltar de un panel de ayuda a otro, o del texto seleccionado de un panel de ayuda a la informacin relacionada. Ayuda para herramientas Informacin al estilo de globos de ayuda acerca de las herramientas que pueden utilizarse. Para crear esta ayuda, vaya a la pgina general del cuaderno de propiedades de un componente y escriba una descripcin de la herramienta (mximo de 15 caracteres) en el campo de entrada. Tambin se puede utilizar un identificador de mensaje, como por ejemplo, *MSG0001, para especificar el texto de ayuda.

Adicin de ayuda segn el contexto


Para aadir ayuda segn el contexto para un componente, seleccione Texto de ayuda del men emergente del componente. Esto inicia una sesin de edicin que contiene informacin similar a la que se muestra en la Figura 52.
:h1 res=01.PSB0000C :p.Ayuda

Figura 52. Sesin de edicin para aadir ayuda en lnea

:h1 res=01 es un identificador de recurso que se genera automticamente. No edite este texto. Escriba una cabecera despus de este cdigo que identifique el propsito del panel de ayuda y escriba el texto de ayuda despus del cdigo :p..

Creacin de un pulsador de ayuda


Para crear el pulsador Ayuda, seleccione un pulsador desde la paleta de componentes con el botn derecho del ratn, mueva el puntero del ratn sobre la

236

Programacin con VisualAge RPG

ventana de diseo y vuelva a pulsar el botn derecho del ratn. Seleccione Texto de ayuda en el men emergente del pulsador para editar la informacin de ayuda. Establezca el atributo Help Enable para ese pulsador y el atributo Label para la palabra Ayuda.

Creacin de enlaces de hipertexto


Para enlazar fragmentos de informacin de ayuda relacionados de manera que los usuarios puedan encontrar la informacin adecuada de forma rpida y fcil, utilice un cdigo de enlace en el texto de ayuda. Puede crear enlaces para un panel de ayuda utilizando un idrec o idref. Para enlazar con el panel de ayuda definido con un id=:
:link reftype=hd refid=search.Ventana Buscar:elink.

Para enlazar con el panel de ayuda definido con un res=:


:link reftype=hd res=15433.Pulsador Buscar:elink.

Captulo 13. Consejos para crear ayuda en lnea con IPF

237

238

Programacin con VisualAge RPG

Captulo 14. Consejos para la creacin y utilizacin de ayuda Windows


Una de las caractersticas de VisualAge RPG es la posibilidad de crear ayuda sensible al cursor para las aplicaciones. Puede crear la ayuda pulsando el botn derecho del ratn en un componente de la ventana de diseo y eligiendo Texto de ayuda. Esta accin inicia el editor. El texto de la ayuda se escribe utilizando el lenguaje de marcas Information Presentation Facility (IPF). Durante el proceso de la construccin, el cdigo fuente de la ayuda se compila para crear el archivo HLP. El lenguaje de marcas IPF se convierte en un archivo de ayuda con un aspecto OS/2 notable. Esta seccin explica cmo crear ayuda autntica de Windows para la aplicacin. Elementos necesarios Se necesitan dos herramientas para crear un archivo de ayuda Windows: v Un procesador de textos que pueda guardar archivos en formato Rich Text Format (RTF) v El compilador de ayudas Windows El compilador de ayudas utiliza como entrada un archivo fuente de ayuda guardado en RTF. Son muchos los procesadores de texto que pueden guardar archivos en formato RTF; por ejemplo, Lotus WordPro, Microsoft Word y WordPerfect. Tenga en cuenta que el editor WordPad de Windows puede guardar archivos en formato RTF. Sin embargo, el formato RTF particular que utiliza no sirve para crear archivos de ayuda. No conserva muchas de las opciones de formato que necesita el compilador de ayudas para crear un archivo de ayuda. El Help Compiler Workshop es una herramienta disponible en Microsoft que consiste en un IDE para gestionar los archivos de ayuda, as como el compilador de ayudas. Puede bajarse del FTP del compilador de ayudas de Microsoft en el URL:
ftp://ftp.microsoft.com/softlib/mslfiles/hcwsetup.exe

En el mercado existen numerosas herramientas, tanto comerciales como shareware, que proporcionan entornos completos de montaje de ayudas. Adems, existen varios libros que describen cmo utilizar la herramienta Help Compiler Workshop. Muchos de estos libros incluyen un CD-ROM con el Help Compiler Workshop como, por ejemplo, Microsoft Windows 95 Help Authoring Kit ISBN1-55615-892-0. Pasos para la creacin de ayuda Windows Los pasos bsicos que deben seguirse para utilizar ayuda Windows en la aplicacin son los siguientes: 1. Establecer el ID de recurso para cada componente que tendr ayuda. 2. Escribir el texto de ayuda. 3. Crear el archivo de proyecto de la ayuda. 4. Compilar el archivo de ayuda.

Copyright IBM Corp. 1994, 2000

239

Establecimiento del ID de recurso


Cada componente como, por ejemplo, un campo de entrada, un pulsador o una ventana, tiene un identificador asignado al que habitualmente se le hace referencia como un ID de recurso. VisualAge RPG asigna los ID de recurso automticamente y no pueden modificarse. Para ver el ID de recurso de un componente, pulse con el botn derecho del ratn en el componente, en la ventana de diseo. Seleccione Propiedades para ver su cuaderno de propiedades. El ID de recurso es el nmero que aparece en la parte superior de la pgina General. En el siguiente ejemplo, es el nmero 19 situado junto al ID de componente:

Figura 53. Visualizar el ID de recurso

Durante el proceso de la construccin, VisualAge RPG genera una entrada de tabla de ID de recurso para cada componente para el que haya creado ayuda utilizando la opcin de men Texto de ayuda del men emergente del componente. El motor de ayuda de Windows utiliza esta tabla para determinar el ID de recurso del componente, a fin de poder visualizar la ayuda correcta. Para que el componente tenga ayuda Windows, debe crear el texto de ayuda de cada componente de esta forma. Actualmente, VisualAge RPG no crea automticamente esta entrada de tabla. Si sigue este proceso, no se visualizar ninguna ayuda y no se generar ningn mensaje de error.

Escritura del texto de ayuda


Antes de escribir la ayuda, deber conocer unos pocos trminos que utiliza la ayuda de Windows. Antes de crear un archivo de ayuda Windows (extensin HLP) son necesarios los siguientes archivos: Archivo de temas Este archivo contiene el texto de ayuda. El proyecto de ayuda puede consistir en uno o ms archivos de temas. Los archivos de temas contienen uno o ms temas. El archivo de temas se crea con el procesador de textos y se guarda en formato RTF (extensin RTF). Archivo de proyecto El archivo de proyecto contiene informacin acerca del archivo de ayuda. Contiene entre otras cosas los archivos de temas que deben incluirse. El archivo de proyecto lo mantiene el IDE de Help Workshop. Habitualmente, no se modifica directamente. Archivo de contenido Si desea tener una pestaa de Contenido cuando se visualice el archivo de ayuda, debe tener un archivo de contenido. El archivo de contenido tambin lo crea y lo mantiene el IDE de Help Workshop. El siguiente ejemplo muestra los pasos bsicos en la creacin de un archivo de temas con un tema. Tiene el texto de ayuda para el componente campo de entrada. Se ha utilizado Lotus WordPro para crear el archivo de temas. Cuando se abra el

240

Programacin con VisualAge RPG

documento nuevo en el procesador de textos, escriba un ttulo en la parte superior de la pgina como, por ejemplo, Ayuda para el campo de entrada. A continuacin del ttulo, escriba el cuerpo del texto de ayuda. Cada tema debe tener un ID de tema. Un ID de tema es una nota al pie con el smbolo #. A continuacin se indican los pasos para la creacin de la nota al pie necesaria en WordPro. Siga los pasos correspondientes a su procesador de textos para crear notas al pie con el smbolo #: 1. Coloque el cursor justo delante de la cabecera del tema. 2. Seleccione Crear-Nota al pie/Nota final... 3. En el dilogo Pies de nota, pulse Aceptar. 4. El cursor se colocar al final del documento en la seccin de notas al pie. 5. Escriba el ID de tema: HelpForEF. 6. Coloque el cursor al principio del ID de tema. 7. Pulse el botn derecho del ratn y seleccione Propiedades del texto en el men emergente. 8. En el dilogo Propiedades, seleccione la pestaa Vietas y nmeros. 9. Marque el recuadro de seleccin Editar en pgina. 10. Escriba un carcter # delante del ID de tema. 11. Cierre el dilogo Propiedades del texto. El documento debe tener un aspecto similar al siguiente. Los datos que aparecen a continuacin de la lnea es la nota al pie:
#Ayuda para el campo de entrada Esta es la ayuda para el componente campo de entrada. Ms texto ... ________________________________________ #HelpForEF

En un archivo de temas puede tener varios temas. Cada tema debe empezar en una pgina nueva. Una vez haya escrito el texto de ayuda, guarde el archivo de temas en formato RTF.

Creacin del archivo del proyecto de ayuda


A continuacin se indican los pasos bsicos para crear un archivo de proyecto mnimo. Inicie Microsoft Help Workshop y realice lo siguiente: 1. Cree un archivo de proyecto nuevo eligiendo File-New y seleccionando New project. Se crear un proyecto nuevo. 2. Pulse el botn Files. 3. En el dilogo Topic files, pulse Add... y aada el archivo de temas que acaba de crear. Pulse OK para cerrar el dilogo Topic files. 4. Pulse el botn Windows. 5. En el dilogo Windows Properties, pulse Add para visualizar el dilogo Add a New Window Type. 6. Cree una ventana denominada main y cierre todos los dilogos hasta regresar a Help Workshop. 7. Correlacione el ID de tema (HelpForEF) del archivo de temas con el ID de recurso del componente campo de entrada (12). 8. Pulse el botn Map. 9. En el dilogo Map, pulse Add.
Captulo 14. Consejos para la creacin y utilizacin de ayuda Windows

241

10. Cuando aparezca el dilogo Add Map Entry, escriba HelpForEF en el campo Topic ID y 12 en el campo de valor numrico Mapped. Pulse OK. 11. Pulse OK para cerrar el dilogo Map. 12. Guarde y compile el archivo de proyecto. De este modo se crear el archivo de ayuda (HLP). Copie el nuevo archivo HLP en el directorio RT_WIN32 del proyecto VARPG.

Compilacin del programa VARPG


Durante el proceso de la construccin, VisualAge RPG crea un archivo HLP en el directorio RT_WIN32. Este archivo, evidentemente, se grabar encima del archivo HLP que copi. Adems, se crear un archivo RTF en el directorio fuente del proyecto. Si ha guardado el archivo de temas con el mismo nombre, se grabar encima. Para evitarlo, abra el cuaderno de propiedades Opciones de la construccin del proyecto y dirjase a la pgina Archivo de ayuda. Desmarque el recuadro de seleccin Crear archivo de ayuda RTF. Ahora, VisualAge RPG no construir la ayuda ni crear los archivos RTF y HLP. Cada vez que aada ayuda a un componente, debe volver a compilar el programa VARPG.

Prueba de la ayuda
Inicie la aplicacin VARPG. Cuando aparezca la ventana, vaya al campo de entrada y pulse F1. La ayuda debe visualizarse en una ventana de ayuda Windows. Tambin puede visualizar la ayuda como ayuda Qu es esto?. Para ello, abra el cuaderno de propiedades de la ventana. En la pgina Estilo, marque el recuadro de seleccin Contexto. Deben quitarse las marcas de los recuadros de seleccin Minimizar y Maximizar. Para hacer que la ayuda se visualice en una ventana emergente en lugar de una ventana de ayuda, marque la opcin Emergente.

Creacin de un archivo de contenido


Si desea que la ayuda tenga un recuadro de dilogo Temas de ayuda, deber crear un Archivo de contenido. Un Archivo de contenido se crea en el IDE de Help Workshop cuando se selecciona Archivo-Nuevo y Archivo de contenido nuevo. D un nombre al archivo de contenido de la misma forma que ha hecho con el archivo de ayuda y gurdelo en el mismo directorio.

242

Programacin con VisualAge RPG

Captulo 15. Consejos para la creacin de JavaHelp


Una de las caractersticas de VisualAge RPG es la posibilidad de dar servicio a JavaHelp sensible al contexto para las aplicaciones Java de VARPG. (VisualAge RPG actualmente da soporte al release JavaHelp 1.1). Para construir y ejecutar aplicaciones Java de VARPG que incluyan JavaHelp, es necesario: v Un conocimiento bsico de los cdigos de HTML 3.2. v Archivos de metadatos de JavaHelp para la aplicacin: Datos para la navegacin - archivos de tablas de contenido (TOC) Datos HelpSet data - archivos HelpSet y Map Archivos de temas HTML v Una copia del Java 2 Software Development Kit, Standard Edition (J2SDK) versin 1.2, o superior, instalada en la estacin de trabajo. (El J2SDK est disponible en Sun, en el URL http://www.javasoft.com/products/) En esta seccin se resume la creacin de JavaHelp bsica sensible al contexto para las aplicaciones Java de VARPG. Si desea obtener informacin completa sobre el Sistema JavaHelp, puede consultar la JavaHelp System Users Guide. Toda la documentacin de JavaHelp est disponible en el Sistema JavaHelp, que puede bajar del URL http://java.sun.com/products/javahelp. Los siguientes pasos resumen la creacin e incorporacin de JavaHelp a la aplicacin: 1. Crear un HelpSet: v Crear los temas HTML. v Crear un archivo HelpSet. v Crear un archivo Map. v Crear un archivo de tabla de contenido (TOC). Opcionalmente, puede crear un archivo de ndice y una base de datos de bsqueda de texto completo. Consulte la JavaHelp System Users Guide para obtener detalles sobre estos temas y las herramientas necesarias para implementar la bsqueda. v Comprimir y encapsular los archivos de ayuda en un archivo JAR. 2. Tras crear la JavaHelp con todos los archivos necesarios y empaquetarlos en un archivo JAR, copie este archivo JAR en el subdirectorio RT_JAVA del proyecto. 3. Construir y ejecutar el proyecto. El sistema JavaHelp se basa en archivos - los temas estn dentro de archivos que se visualizan en un visor adecuado, un archivo a la vez. Es una buena idea agrupar temas relacionados entre s para tenerlos organizados y facilitar el enlace conjunto de los temas. Tambin es importante organizar los temas de modo que puedan empaquetarse fcilmente en un JAR comprimido para la aplicacin. Habitualmente lo mejor es organizar los temas en una jerarqua de carpetas que pueda despegar y colocar en el archivo JAR. La aplicacin Video Store Catalog contiene archivos JavaHelp de ejemplo. Estn ubicados en los subdirectorios javahelp y help del directorio adtswin\samples\vidcust. Puede utilizar estos archivos como plantillas para desarrollar sus ayudas JavaHelp personales. Nota: En Java, los nombres de archivo y carpeta son sensibles a las maysculas y minsculas. Escriba los nombres exactamente como se muestran en los ejemplos proporcionados.
Copyright IBM Corp. 1994, 2000

243

Creacin de un archivo HelpSet


Cuando la aplicacin inicia JavaHelp, lo primero que hace es leer el archivo HelpSet. El archivo HelpSet define el HelpSet para la aplicacin: el conjunto de datos que forman el sistema de ayuda. El archivo HelpSet incluye la siguiente informacin: Archivo Map El archivo Map, o de correlacin, asocia los ID de tema al URL o nombre de va de acceso de los archivos que contienen los temas HTML. Informacin de visualizacin Describe los navegadores que se utilizan en el HelpSet. Los navegadores estndares son: tabla de contenido, ndice y bsqueda de texto completo. Ttulo del HelpSet El nombre de la carpeta TOC de nivel superior. ID inicial El nombre del ID (por omisin) que se visualizar cuando se llame al visor de la ayuda sin especificar un ID. El archivo HelpSet (nombrearchivo.hs) se codifica en formato Extended Markup Language (XML). A continuacin se ofrece un ejemplo de archivo HelpSet:
<?xml version='1.0' encoding='ISO-8859-1' ?> <!DOCTYPE helpset PUBLIC "-//Sun Microsystems Inc.//DTD JavaHelp HelpSet Version 1.0//EN" "http://java.sun.com/products/javahelp/helpset_1_0.dtd"> <helpset version="1.0"> <!-- title --> <title>Video Store Catalog - Help</title> <!-- maps --> <maps> <homeID>11</homeID> <mapref location="Map.jhm"/> </maps> <!-- views --> <view> <name>TOC</name> <label>Table Of Contents</label> <type>javax.help.TOCView</type> <data>VIDCTOC.xml</data> </view> </helpset>

Donde: <title> Es el nombre del HelpSet. Corresponde al ttulo de la ventana de ayuda. <homeID> Especifica el nombre del ID (por omisin) que se visualiza cuando se llama a la ayuda sin especificar explcitamente un ID. <data> Especifica la va de acceso de los datos que utiliza el navegador. En nuestro ejemplo, la vista TOC. El nombre del archivo TOC est en maysculas y la extensin xml en minsculas. El archivo TOC debe existir en el directorio de la ayuda.

244

Programacin con VisualAge RPG

Creacin de un archivo Map


Cuando la aplicacin activa JavaHelp, lo primero que hace es leer el archivo HelpSet de la aplicacin. El siguiente paso consiste en leer el archivo Map que se indica en el archivo HelpSet. El archivo Map asocia los ID de tema con los URL (vas de acceso a los archivos que contienen los temas HTML). Por convenio, los nombres de archivo Map incluyen el sufijo jhm. El archivo Map est en formato XML. A continuacin se ofrece un ejemplo de archivo Map:
<?xml version='1.0' encoding='ISO-8859-1' ?> <!DOCTYPE map PUBLIC "-//Sun Microsystems Inc.//DTD JavaHelp Map Version 1.0//EN" "http://java.sun.com/products/javahelp/map_1_0.dtd"> <map version="1.0"> <mapID target="11" <mapID target="18" <mapID target="14" <mapID target="15" <mapID target="16" <mapID target="17" </map> url="help/welcome.htm" /> url="help/catalog.htm" /> url="help/browse.htm" /> url="help/new.htm" /> url="help/top10.htm" /> url="help/search.htm" />

target Especifica el ID del componente de VARPG. El ID de componente lo asigna automticamente el Diseador GUI al componente. Puede recuperarlo del cuaderno de propiedades del componente. url Especifica la va de acceso al archivo de temas HTML que contiene el texto de la ayuda. La va puede ser relativa o absoluta.

Creacin del archivo TOC


El archivo de tabla de contenido (TOC) describe el contenido y el diseo del TOC al navegador TOC. El archivo TOC est en formato XML. A continuacin se ofrece un ejemplo pequeo de archivo TOC:
<?xml version='1.0' encoding='ISO-8859-1' ?> <!DOCTYPE toc PUBLIC "-//Sun Microsystems Inc.//DTD JavaHelp TOC Version 1.0//EN" "http://java.sun.com/products/javahelp/toc_1_0.dtd"> <toc version="1.0"> <tocitem text="Video Store Catalog - help"> <tocitem <tocitem <tocitem <tocitem <tocitem <tocitem </tocitem> </toc> text="Welcome" target="11"/> text="Help" target="22"/> text="Browse" target="14"/> text="New" target="19"/> text="Top 10" target="20"/> text="Search" target="21"/>

Donde: tocitem La primera entrada TOC especifica el ttulo de la tabla de contenido. (Puede anidar entradas TOC dentro de una entrada de nivel superior). text Especifica el texto que debe utilizarse en las siguientes entradas TOC.

Captulo 15. Consejos para la creacin de JavaHelp

245

target Especifica el ID del tema HTML que debe visualizarse cuando el usuario elija esta entrada en el TOC. El ID corresponde al ID de componente que se identifica en el archivo Map.

Creacin del archivo JAR


Una vez haya creado todos los archivos de ayuda necesarios, utilice el mandato jar para encapsular y comprimir los archivos. El nombre del archivo jar debe ser el siguiente:
SOURCE_FILE_NAMEHS

Donde SOURCE_FILE_NAME es el nombre especificado en el campo Archivo fuente de la ventana Guardar como aplicacin - VisualAge para RPG. El nombre de archivo debe acabar en HS y debe escribirse en maysculas. La extensin jar debe estar en minsculas. Emita el mandato desde el directorio ms alto que contenga la jerarqua de la ayuda. Por ejemplo, si la estructura del directorio de la ayuda es la siguiente:
javahelp (directorio) Map.jhm CATALOG.hs VIDCTOC.xml help (subdirectorio) browse.htm catalog.htm new.htm search.htm top10.htm welcome.htm

Emita el mandato jar desde el directorio javahelp como se indica a continuacin:


jar -cf VIDCUSTHS.jar *.*

Copie el archivo jar resultante en el subdirectorio RT_JAVA del proyecto. Construya y ejecute el proyecto con la opcin Java (Construir>Java o Ejecutar>Java, respectivamente).

246

Programacin con VisualAge RPG

Captulo 16. Trabajar con mensajes


Puede crear, ver, editar y suprimir mensajes para la aplicacin VARPG. Puede ver y suprimir mensajes existentes directamente desde la ventana Definir mensajes. Utilice la ventana Definir mensajes para acceder a la ventana Editar mensaje, desde donde puede crear un mensaje nuevo o modificar uno ya existente. En VARPG los mensajes se dividen en dos grupos: aquellos a los que no se puede hacer referencia en el cdigo en la ejecucin y aquellos a los que s. El primer grupo consta de un mensaje de tipo etiqueta que se utiliza para reemplazar una etiqueta de sustitucin en un pulsador o una ventana, por ejemplo. El segundo grupo contiene cuatro tipo de mensajes: Accin, Grave, Informacin y Aviso. Estos mensajes pueden visualizarse en una ventana de mensaje o en un componente subarchivo de mensajes. Pueden utilizarse para actualizar texto de forma dinmica en la interfaz en tiempo de ejecucin; por ejemplo, para visualizar mensajes sobre el progreso de la instalacin.

Definicin de texto para etiquetas de sustitucin


Si tiene que asociar texto con una etiqueta de sustitucin: 1. Asegrese de que ha definido una etiqueta de sustitucin en el componente. Siga el procedimiento descrito en la publicacin Iniciacin a VisualAge RPG y CODE/400, SC10-3287-01 (SC09-2625-01). 2. Seleccione ProyectoDefinir mensajes en el Diseador GUI. Se abrir la ventana Definir mensajes. 3. Seleccione un mensaje de tipo etiqueta en la lista que se visualiza. 4. Elija el pulsador Editar. Se abre la ventana Editar mensaje, mostrando la etiqueta que se ha seleccionado. 5. En el campo Mensaje, teclee el texto de la etiqueta que se ha de sustituir. 6. Seleccione Guardar para conservar los cambios o Cancelar ( o efecte una doble pulsacin en el men del sistema de la ventana) para desecharlos. Nota: Al cambiar el tamao de un componente en el Diseador GUI que tenga una etiqueta de sustitucin, tenga presente que el texto traducido puede ser ms extenso que el original.

Copyright IBM Corp. 1994, 2000

247

Creacin de un nuevo mensaje


Para crear un mensaje nuevo: 1. Seleccione ProyectoDefinir mensajes en el Diseador GUI. Se abrir la ventana Definir mensajes. 2. Seleccione Crear. Se abrir la ventana Editar mensaje. 3. Seleccione un tipo de mensaje del recuadro desplegable Tipo. Puede elegir uno de estos cuatro tipos: Tipo de mensaje Significado Accin Utilice este tipo de mensaje siempre el usuario deba realizar alguna accin para corregir la situacin o elegir una accin alternativa. Grave Utilice este tipo de mensaje siempre el usuario deba realizar una accin inmediata para corregir la situacin o elegir una accin alternativa. Informacin Utilice este tipo de mensaje en situaciones en que simplemente desee informar al usuario de algo, pero en las que ste no ha de efectuar ninguna accin. Aviso Utilice este tipo de mensaje cuando el usuario pueda continuar con la solicitud original sin efectuar ninguna modificacin, aunque exista una situacin que el usuario debe tener en cuenta. Teclee el texto del mensaje en el campo Mensaje. Si desea facilitar ayuda para el mensaje, teclee la ayuda en el campo Ayuda para mensaje. Al crear una ayuda para mensaje y utilizar el cdigo de operacin DSPLY para visualizar el mensaje, aparece el pulsador Ayuda en la parte inferior de la ventana del mensaje. Cuando el usuario pulsa el botn en este pulsador, el texto de ayuda se visualizar como informacin adicional. Seleccione el recuadro de seleccin Movible si desea que el usuario pueda mover el mensaje hasta el fondo y seguir con otras tareas antes de realizar una accin con el mensaje. En el recuadro desplegable Botones, seleccione la combinacin de pulsadores que desea que se visualice en la parte inferior de la ventana de mensaje: Opcin Pulsadores que aparecern abortRetryIgnoreButton Interrumpir, Reintentar e Ignorar okButton Aceptar okCancelButton Aceptar y Cancelar retryCancelButton Reintentar y Cancelar yesNoButton S y No yesNoCancelButton S, No y Cancelar

4. 5.

6.

7.

248

Programacin con VisualAge RPG

8. Seleccione un pulsador por omisin seleccionando el botn de seleccin Botn 1, Botn 2 o Botn 3. Cuando se visualice la ventana de mensaje y el usuario pulse la tecla Intro, se realizar la accin asociada con el pulsador por omisin. Por ejemplo, si ha seleccionado enterCancelButton en el recuadro desplegable Pulsadores y desea que el botn por omisin sea Cancelar, debera seleccionar el botn de seleccin Botn 2. 9. Seleccione Guardar para conservar el mensaje o Cancelar para desecharlo. Nota: Los identificadores de mensaje (ID de mensaje) van de MSG0001 a MSG9999 y los asigna VisualAge RPG. Si se utilizan todos los ID de mensaje del rango, VisualAge RPG enva un error cuando se intenta crear un nuevo mensaje, y no se puede crear ningn mensaje nuevo hasta que suprime uno. Una vez que ha suprimido un mensaje, puede crear uno nuevo que utilice el ID de mensaje del suprimido.

Edicin de un mensaje
Para editar un mensaje: 1. Seleccione ProyectoDefinir mensajes en el Diseador GUI. Aparecer la ventana Definir mensajes. 2. Seleccione un mensaje de la lista que se visualiza. Si no encuentra el que desea, siga las instrucciones del apartado Bsqueda de un mensaje. 3. Elija Editar en la ventana Editar mensajes. Se abre la ventana Editar mensaje, mostrando el mensaje que se ha seleccionado. 4. Cambie la informacin sobre el tipo, el texto, la ayuda o la ventana de mensaje. 5. Seleccione Guardar para conservar los cambios o Cancelar para desecharlos.

Supresin de un mensaje
Para suprimir un mensaje: 1. Seleccione ProyectoDefinir mensajes en el Diseador GUI. Se abrir la ventana Definir mensajes. 2. Seleccione un mensaje de la lista que se visualiza. Si no encuentra el que desea, siga las instrucciones del apartado Bsqueda de un mensaje. 3. Elija el pulsador Suprimir.

Bsqueda de un mensaje
A continuacin se facilitan algunas sugerencias para localizar un mensaje: v Si sabe cul es el ID de mensaje, utilice la caracterstica Clasificar por ID de mensaje de la ventana Definir mensajes. Los mensajes se clasifican por ID de mensaje en orden ascendente. v Si sabe el tipo de mensaje que est buscando, utilice la funcin Clasificar por tipo de la ventana Definir mensajes. Los mensajes se clasifican por grupos y por ID de mensaje en orden ascendente: 1. Mensajes que se pueden establecer en la ejecucin: a. Informacin b. Aviso c. Accin d. Grave 2. Mensajes que no puede establecer durante la ejecucin (etiquetas de sustitucin).

Captulo 16. Trabajar con mensajes

249

Puede desplazarse por la lista de mensajes utilizando las teclas de flecha o las barras de desplazamiento. Si la lista de mensajes es extensa, la barra de desplazamiento es la forma ms rpida de encontrar lo que se busca.

Utilizacin de mensajes con la lgica


Es habitual que en tiempo de ejecucin se visualicen mensajes en ventanas de mensajes. Una vez que se ha creado un mensaje, ste puede visualizarse mediante el cdigo de operacin DSPLY y el atributo de componente de subarchivo de mensajes AddMsgID. Si desea informacin sobre el atributo AddMsgID, consulte el apartado VisualAge RPG Manual de consulta de componentes, SC10-3065-02 (SC09-2450-02) . Puede utilizar las palabras clave MSGDATA y MSGNBR en la especificacin de la definicin para definir mensajes con variables de sustitucin. Una variable de sustitucin se define cuando se crea el mensaje escribiendo el carcter de porcentaje ( % ) seguido de un valor numrico (por ejemplo, %1 %2 %3). La variable de sustitucin se sustituye por el campo correspondiente definido en la palabra clave MSGDATA. Por ejemplo, %1 se sustituira por el primer campo definido en MSGDATA, %2 por el segundo campo definido en MSGDATA, y as sucesivamente. La palabra clave MSGNBR debe contener un identificador de mensaje de 8 caracteres; por ejemplo, *MSG0001. Para utilizar la sustitucin de mensajes en el cdigo de operacin DSPLY, defina un tipo de datos de mensaje en la especificacin D. Por ejemplo:
DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++ * D notFound M MSGNBR(*MSG0001) D MSGDATA(cusno: file) *

Los campos CUSNO y FILE se definen en otro lugar del programa. Suponga que el texto del mensaje *MSG0001 es:
No se ha encontrado el nmero de cliente %1 en el archivo %2.

Para visualizar el mensaje con la operacin DSPLY y llevar a cabo la sustitucin, codifique lo siguiente en la especificacin C:
CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq C notFound DSPLY rc 9 0

Para obtener ms informacin sobre el cdigo de operacin DSPLY, consulte el manual VisualAge RPG Manual de consulta del lenguaje, SC10-3066-01 (SC09-2451-01).

Conversin de archivos de mensajes


No es preciso que vuelva a compilar la aplicacin para incorporar mensajes traducidos. Se puede tener ms de un archivo de mensajes en un directorio de tiempo de ejecucin; para ello, asigne una extensin diferente a cada archivo. Por ejemplo, una versin inglesa del archivo de mensajes compilado podra ser SAMPLE.ENG y una versin alemana podra denominarse SAMPLE.GER. Puede indicar al usuario de la aplicacin que redenomine el archivo de mensajes correspondiente a SAMPLE.MSG antes de ejecutar la aplicacin.

250

Programacin con VisualAge RPG

Cambio manual de archivos de mensajes


Puede editar manualmente el archivo ASCII TXM con el fin de traducirlo. Este archivo contiene los mensajes que ha creado para la aplicacin. Se crea en el directorio fuente que se especifica al crear la aplicacin. Un ejemplo del diseo de registros del archivo se muestra en la Figura 54.
MSG MSG0001I:Se ha guardado el archivo en el directorio de trabajo actual. MSG0002W:Otro usuario tiene abierto este archivo para editarlo.

Figura 54. Ejemplo de diseo de registros para un archivo TXM

Modifique nicamente el texto que figura detrs de los dos puntos ( : ). El primer registro identifica el prefijo de mensaje y cada uno de los registros siguientes identifica un mensaje de la aplicacin. Cada mensaje tiene un prefijo de mensaje, MSG, un identificador o nmero de ID de cuatro dgitos y una letra que describe el tipo de mensaje. En este ejemplo, el mensaje nmero 1 es un mensaje informativo y el mensaje nmero 2 es un mensaje de aviso. No haga lo siguiente: v Modificar el ID de mensaje. Si lo hiciese, los resultados seran imprevisibles. Sin un ID de mensaje, no puede visualizarse el mensaje. v Aadir un mensaje. El estilo del mensaje no se definir y ste nunca se visualizar en la ventana Definir mensajes. v Suprimir un mensaje. La ventana Definir mensajes seguir visualizndolo todo acerca del mensaje, excepto su texto de mensaje.

Utilizacin de mensajes y etiquetas


Puede establecer la etiqueta para cualquier componente que tenga un atributo LABEL del texto del mensaje en un archivo de mensajes. Cualquier etiqueta con el prefijo *MSG indica el texto del mensaje de un archivo de mensajes. En el ejemplo de la Figura 55, la etiqueta para el pulsador PB1 se ha establecido con el texto del nmero de mensaje 0001 en el archivo de mensajes.
C 'PB1' SETATR '*MSG0001' 'Label'

Figura 55. Establecimiento dinmico de una etiqueta de componente de un archivo de mensajes

Si el nmero del mensaje no puede encontrarse en el archivo de mensajes del componente, la aplicacin busca el archivo de mensajes indicado mediante el atributo MsgFile del *componente lgico para el nmero del mensaje. Si el nmero del mensaje no existe en el archivo de mensajes, el identificador del mensaje (MSG0001 en este ejemplo) aparece como el texto de la etiqueta.

Captulo 16. Trabajar con mensajes

251

252

Programacin con VisualAge RPG

Captulo 17. Comunicacin entre objetos


Con VisualAge RPG puede realizar diversas clases de comunicaciones entre objetos De componente a componente Puede enlazar componentes en VisualAge RPG de manera que un componente notifique a otro que ha cambiado, y que el componente destinatario emita un evento cuando se le notifique de este cambio. De aplicacin VisualAge RPG a otras aplicaciones de PWS Puede hacer que una aplicacin intercambie informacin con otra aplicacin que soporte el protocolo DDE. Una aplicacin VisualAge RPG puede ser el cliente o el servidor en el intercambio. Para obtener informacin sobre la funcin del cliente, vaya a Cliente DDE en la pgina 71. La funcin del servidor se describe en esta seccin. De componente lgico a componente lgico Puede hacer que un componente lgico se comunique con otro. Tambin puede utilizar cdigos de operacin para realizar lo siguiente: v Llamar a funciones locales v Llamar a programas locales v Iniciar y detener componentes lgicos v Llamar a programas remotos En esta seccin se proporcionan sugerencias tiles para cada tipo de comunicacin y ejemplos.

Enlace de componentes
Los siguientes componentes pueden enlazarse mediante VisualAge RPG: v Recuadro de seleccin v Campo de entrada v Imagen v Recuadro de lista v Medios v Panel de medios v Graduador v Temporizador Un componente que notifica a otro componente cuando se modifica se denomina componente origen y el componente que recibe la notificacin del cambio se denomina componente destino. Una manera de establecer comunicacin entre un componente fuente y un componente destino es utilizar la pgina Enlace del cuaderno de propiedades del componente origen. En los campos que se proporcionan debe escribir el nombre del componente destino y el nombre de la ventana en el que reside. Si desea que el destino emita un evento Link cuando recibe la notificacin del componente fuente, seleccione el recuadro de seleccin Habilitar destino de notificacin. Tambin puede configurar el enlace de comunicaciones en el programa estableciendo el atributo AddLink y el destino con el formato NombreVentana|NombreComponente. Si desea que el destino emita un evento Link,
Copyright IBM Corp. 1994, 2000

253

establezca el atributo AllowLink en 1. La Figura 56 muestra el cdigo de ejemplo utilizado para enlazar un componente panel de medios, MMP1, con un componente medios, AUDIO1.
C C * * 'MMP1' 'MMP1' SETATR SETATR 'WIN2|AUDIO1' 'AddLink' 1 'AllowLink'

Figura 56. Cdigo de ejemplo que muestra un componente enlazado con otro

Nota: Slo puede establecer un enlace para un componente origen en el Diseador GUI, pero puede establecer mltiples enlaces en el cdigo.

Utilizacin de una aplicacin VisualAge RPG como servidor DDE


Cualquier aplicacin VisualAge RPG puede ser un servidor en una conversacin DDE (intercambio dinmico de datos). Los componentes que pueden ser fuente de un evento LINK pueden producir datos DDE. Un componente cliente DDE puede obtener datos de un componente lgico de la misma aplicacin o una aplicacin diferente. Para obtener ms informacin acerca del componente cliente DDE, vea Cliente DDE en la pgina 71. Por ejemplo, suponga que est construyendo una aplicacin denominada CLIENT. Consiste en una ventana denominada WINDOW_C, un componente cliente DDE denominada DDECLI_C, y un componente texto esttico denominado STTEXT_C. Suponga que la aplicacin necesita datos de una aplicacin servidora denominada SERVER. Esta aplicacin servidora tiene una ventana denominada WINDOW_S y un componente campo de entrada denominado ENTRY_S. Siempre que se modifique el valor del campo de entrada de la aplicacin servidora, el componente texto esttico de la aplicacin cliente se actualiza para reflejar el cambio. Para establecer un enlace dinmico entre las aplicaciones cliente y servidor, debera especificar los siguientes atributos del componente cliente DDE DDECLI_C en la aplicacin cliente:

AppName
Es el nombre de la aplicacin servidor: SERVER.EXE.

Topic
Es el nombre del componente lgico servidor, seguido de una barra vertical, seguido del nombre de instancia de componente lgico. Para VisualAge RPG, en la mayora de los casos el nombre de componente lgico es el mismo que el nombre de instancia de componente lgico y que el nombre ejecutable. En este ejemplo, el nombre del componente lgico es SERVER|SERVER.

Item
Es el nombre del componente servidor. Para los programas VisualAge RPG es el nombre de la ventana, seguido de una barra vertical, seguido del nombre de componente. En este ejemplo, el valor del atributo del elemento es WINDOW_S|ENTRY_S.

254

Programacin con VisualAge RPG

DDEAddLink
Es el nombre del componente cliente. Se compone del nombre de la ventana, seguido de una barra vertical, seguido del nombre de componente. En este ejemplo, el atributo DDEAddLink es WINDOW_C|STTEXT_C.

DDEMode
Establezca DDEMode en 1 para empezar la conversacin e iniciar el enlace dinmico entre el servidor y el cliente. Para terminar la conversacin, establezca DDEMode en 2. Esto seala el evento Terminate en la aplicacin cliente.

Comunicacin entre componentes lgicos


Los componentes lgicos son proyectos en VisualAge RPG. Representan una o ms ventanas de aplicacin que se crearon con el Diseador GUI. Un ejemplo de componente lgico es una ventana que solicita a un usuario que entre el nombre de un archivo de imagen y luego visualiza la imagen. Para hacer que un componente lgico de VisualAge RPG se comunique con otro componente lgico, utilice un componente de referencia a componente lgico. Si desea ms informacin, consulte la publicacin Referencia a componente lgico en la pgina 62.

Realizacin de llamadas locales


En esta seccin se analizan las llamadas locales que puede realizar utilizando estos cdigos de operacin: Cdigo de operacin Propsito CALLB Llama a una funcin local. La funcin puede estar en un archivo de cdigo de objeto (OBJ) o exportarse desde una biblioteca de enlace dinmico (DLL). CALLP Llama a un programa o funcin local (procedimiento). La funcin debe exportarse desde una biblioteca de enlace dinmico (DLL). Si desea ms informacin, consulte la publicacin Utilizacin de mltiples procedimientos en la pgina 264. Es preferible utilizar CALLP que utilizar CALLB. START Inicia un componente nuevo en la aplicacin o llama a un programa local.

Utilizacin de la operacin CALLB


Utilice el cdigo de aplicacin CALLB para llamar a una funcin desde la aplicacin VisualAge RPG. Si est enlazando con un OBJ que se compil en un lenguaje distinto de RPG, asegrese de que el entorno de tiempo de ejecucin se inicializa y termina correctamente (vea la documentacin del compilador para obtener ms informacin). Los siguientes ejemplos ilustran las distintas maneras en que puede llamar a una funcin C utilizando CALLB. La Figura 57 en la pgina 256 contiene la funcin C de ejemplo que se llama.

Captulo 17. Comunicacin entre objetos

255

#include <stdio.h> * /*Las dos lneas siguientes slo son necesarias si se compila */ /*el OBJ con el compilador IBM C/C++. Estas lneas */ /*no son necesarias si la funcin se exporta desde una DLL. */ int _CRT_init(void); void _CRT_term(void); * /* imprimir los parmetros str y age en un archivo */ void MYFUNC(char *str, int *age) { FILE *fp; int j; * /*La lnea siguiente slo es necesaria si se compila */ /*el OBJ con el compilador IBM C/C++. Esta lnea */ /*no es necesaria si la funcin se exporta desde una DLL. */ _CRT_init(); * fp=fopen("myfunc.log", "a"); * /* imprimir los datos de caracteres en un archivo */ for (j=0; j<10; ++j) { fprintf(fp, "%c", str[j]); } * /* si se da el parmetro age, imprimir el valor */ if ( age == NULL ) { fprintf(fp, "no hay valor para age\n"); } else { fprintf(fp, "num = %d\n", *age); } * fclose(fp); * /*La lnea siguiente slo es necesaria si se compila */ /*el OBJ con el compilador IBM C/C++. Esta lnea */ /*no es necesaria si la funcin se exporta desde una DLL. */ _CRT_term(); }

Figura 57. Funcin C de ejemplo, MYFUNC

Llamada a funciones utilizando constantes con nombre o literales


Los siguientes ejemplos ilustran cmo llamar a una funcin utilizando una constante con nombre o un literal:

256

Programacin con VisualAge RPG

DConst1 C CONST('MYFUNC') Dwilma s 80a inz('misdatos') Dage s 9b 0 inz(32) * * C *inzsr begsr c*********************************************************************** c*********** *** CALLB en VRPG con una PLIST *** ***************** c*********************************************************************** C myplist plist C parm wilma C parm age C CALLB Const1 myplist C seton lr C endsr

Figura 58. Llamada a funciones utilizando una constante con nombre


* Dwilma Dage C *inzsr C C C C C

s s

begsr callb parm parm seton endsr

80a inz('misdatos') 9b 0 inz(32) 'MYFUNC' wilma age

lr

Figura 59. Llamada a funciones de biblioteca utilizando un literal

Llamada a funciones utilizando un puntero de procedimiento


El siguiente ejemplo ilustra cmo llamar a una funcin utilizando un puntero de procedimiento. Si se utiliza un puntero de procedimiento con CALLB, el campo *ROUTINE de la estructura de datos de estado de programa (PSDS) no se actualiza con el nombre de la funcin que est llamndose. El campo toma como valor espacios en blanco.
* Dp2 Dwilma Dage C *inzsr C C C C C s s s * procptr inz(%paddr('MYFUNC')) 80a inz('misdatos') 9b 0 inz(32) p2 wilma age

begsr callb parm parm seton endsr

lr

Figura 60. Llamada a funciones utilizando un puntero de procedimiento

Llamada a funciones sin los parmetros obligatorios


En el ejemplo siguiente se muestra cmo llamar a una funcin con un nmero de parmetros menor al obligatorio. Utilice el parmetro *OMIT que efecta una correlacin con un puntero NULL.

Captulo 17. Comunicacin entre objetos

257

* Dp2 Dwilma Dage C *inzsr C C C C C

s s s

begsr callb parm parm seton endsr

* procptr inz(%paddr('MYFUNC')) 80a inz('misdatos') 9b 0 inz(32) p2 wilma *OMIT

lr

Figura 61. Llamada a funciones sin los parmetros obligatorios

Llamada a programas locales utilizando CALLP


Utilice CALLP para realizar llamadas a programas locales de manera sncrona. Esto quiere decir que el programa llamado completa la ejecucin antes de que se ejecute la instruccin VisualAge RPG que sigue a CALLP. Cada programa al que llame utilizando CALLP requiere un prototipo. El prototipo define el nombre de sistema del programa llamado y el nmero y tipos de parmetros que el programa espera. Especifique este prototipo utilizando la especificacin de definicin de tipo PR, que consiste en: Columnas Descripcin 6 7-21 24-25 44-80 D El nombre del programa a utilizar en el programa VisualAge RPG PR palabra clave

Utilice la palabra clave CLTPGM con el nombre de sistema del programa como parmetro. Si el programa espera parmetros, utilice una especificacin de definicin para cada parmetro inmediatamente despus de la especificacin de definicin de PR. Estas especificaciones deben consistir en el nombre, la longitud y el tipo de parmetro. Especifique la precisin de los parmetros numricos. Especifique siempre la palabra clave VALUE. Tambin puede especificar las palabras clave ASC, DATFMT, DESC, DIM, LIKE, NOOPT, OPTIONS y TIMFMT en las definiciones de parmetros. La Figura 62 define pgm1 para VisualAge RPG. Pueden pasarse dos parmetros al programa; el segundo es optativo.
D pgm1 D parm1 D parm2 PR CLTPGM('testprog') 20A VALUE 6B 3 OPTIONS(*NOPASS) VALUE

Figura 62. Especificacin de parmetros de especificacin de definicin al llamar a programas locales

258

Programacin con VisualAge RPG

En la Figura 63, el cdigo de operacin CALLP llama a pgm1 con los parmetros f1d1 y 22,4.
C CALLP pgml(f1d1:224)

Figura 63. Llamada a programa local utilizando CALLP

Para obtener ms informacin sobre procedimientos, consulte Utilizacin de mltiples procedimientos en la pgina 264.

Llamada a programas locales utilizando START


Cuando utiliza el cdigo de operacin START para llamar a un programa, VisualAge RPG no espera a que el programa llamado acabe de ejecutarse, pero efecta la llamada y contina. A partir de ese punto, el programa llamado se ejecuta independientemente del programa VisualAge RPG que ha efectuado la llamada. Cuando se utiliza START, no es necesario establecer prototipos para programas locales. F2 puede ser un literal de tipo carcter, una constante con nombre o un nombre de variable. Si F2 es un literal de tipo carcter, se supone que es un componente. Si es un nombre de constante y se especifica LINKAGE(*CLIENT) en la definicin de la constante, se supone que es un programa local. Vea la Figura 64.
D test1 C D test2 C * *Para arrancar un componente: C START * *Para arrancar un componente: C START * *Arranca el programa local testprog.exe: C START 'component' 'testprog' 'xxx' test1 test2 LINKAGE(*CLIENT)

Figura 64. Ejemplo de utilizacin de START para llamar a programas locales

Si F2 es un nombre de variable, se supone que es el nombre de componente a menos que se defina la variable en una especificacin de definicin con LINKAGE(*CLIENT) indicado. Puede utilizarse cualquier variable definida de esta manera como cualquier otro campo RPG. En la Figura 65, el primer cdigo de operacin START intentar iniciar un componente y el segundo cdigo de operacin START intentar iniciar un programa local.
D name1 D name2 * C C S S START START 20A 20A name1 name2 LINKAGE(*CLIENT)

Figura 65. Definicin de nombres de variable para el cdigo de operacin START

Captulo 17. Comunicacin entre objetos

259

START puede seguir teniendo una PLIST especificada en el campo de resultado o puede ir seguido de una lista de PARMS. Estos PARMS se pasan al componente o al programa local.

RESTRICCIONES

PARA

CALLP

START

Tenga en cuenta estas restricciones al utilizar cdigos de operacin CALLP y START con programas locales: v La variable de entorno PATH se utiliza para encontrar el programa local si el nombre de programa no se especifica con el nombre de va de acceso completo. v El programa puede tener un mximo de 20 parmetros. En algunos casos, este mximo es menos de 20 porque la serie de mandato no debe exceder de 1024 bytes. (La serie de mandato se compone del nombre de programa y de los parmetros convertidos a caracteres.) v Los punteros y los punteros de procedimiento no estn permitidos como parmetros. Todos los parmetros deben pasarse por valor. v Cuando se utiliza START con un indicador de error para llamar a programas locales, el indicador de error se establece en ON si no puede iniciarse el programa local. v LINKAGE(*SERVER) no es vlido con el cdigo de operacin START. v Al especificar el nombre de un programa que va a llamar, incluya la extensin si es distinta de EXE. Si no proporciona una extensin, se supone que es EXE. Por ejemplo, CLTPGM(superc2) Llama a SUPERC2.EXE CLTPGM(rexxpgm) Llama a REXXPGM.EXE CLTPGM(rexxpgm.cmd) Llama a REXXPGM.CMD Esto se aplica al especificar el nombre de programa como una constante con nombre para START, o al pasar el nombre de programa como una variable.

Inicio de componentes utilizando START


Utilice el cdigo de operacin START para iniciar un componente nuevo en la aplicacin y el cdigo de operacin STOP para terminar su ejecucin. Para obtener una descripcin detallada de la sintaxis de estos dos cdigos de operacin, consulte el manual VisualAge RPG Manual de consulta del lenguaje. La siguiente seccin describe el funcionamiento de START y STOP con los componentes lgicos de la aplicacin.

Inicio de un componente
El cdigo de operacin START inicia un componente nuevo en la aplicacin. Cuando se realiza la operacin, tanto los componentes lgicos que se estn iniciando como los ya iniciados, junto con cualquier otro componente lgico activo de la aplicacin, estn listos para recibir acciones de usuario en todos los componentes actualmente habilitados por todos los componentes lgicos. El cdigo de operacin START es similar al cdigo de operacin CALL en lo siguiente: v Pueden pasarse parmetros a un componente lgico. v Los parmetros se correlacionan con los parmetros *ENTRY PLIST del componente lgico destino.

260

Programacin con VisualAge RPG

v En el componente origen, el factor 2 del cdigo de operacin PARM se copia al campo de resultado del mismo cdigo de operacin PARM. Cuando el control se devuelve al componente lgico de origen, el campo de resultado se copia en el factor 1. v En el componente lgico de destino, el campo de resultado se copia en el factor 1. Cuando el control se devuelve al componente lgico de origen, el factor 2 se copia en el campo de resultado si el componente lgico de destino completa un inicio satisfactorio. v No se realizan comprobaciones ni conversiones en los parmetros. El cdigo de operacin START es diferente del cdigo de operacin CALL en lo siguiente: v Los trminos llamado y de llamada se utilizan con el cdigo de operacin CALL. Un programa llamado es un programa cuya ejecucin se solicita desde otro programa. Un programa de llamada es un programa que solicita la ejecucin de otro programa. Con el cdigo de operacin START, se utilizan los trminos destino (llamado) y origen (de llamada). v CALL invoca un programa, lo ejecuta y luego vuelve al programa de llamada con el factor 1, factor 2 y el campo de resultado tal como se ha descrito anteriormente. START inicializa un componente lgico, ejecuta su *INZSR y vuelve al componente lgico origen con el factor 1, factor 2 y el campo de resultado copiado tal como se ha descrito anteriormente. La diferencia es que con el cdigo de operacin START, el factor 2 del programa destino se copia al campo de resultado al final de *INZSR (si *INZSR es satisfactorio), no al final del programa. v Una vez que la operacin START ha terminado de inicializar el componente lgico de destino, la subrutina de accin del componente lgico de origen contina ejecutndose y el componente lgico de destino permanece activo con sus subrutinas de accin habilitadas para recibir eventos. v Dado que los parmetros se pasan por direccin, los componentes lgicos de origen y de destino pueden acceder a los parmetros pasados despus de que la operacin START inicial ha finalizado. Esto quiere decir que los componentes lgicos de origen y de destino pueden continuar compartiendo informacin utilizando los campos de parmetro.

Finalizacin de un componente
El cdigo de operacin STOP termina la ejecucin de un componente lgico. Si no especifica el nombre del componente lgico en el factor 2, se termina el componente lgico que se ejecuta actualmente. Cuando se termina un componente lgico, los componentes hijos que puedan iniciarse son los primeros en terminar. Cuando se realiza una operacin STOP que afecta al componente lgico de ejecucin actual, no se ejecutan las operaciones que siguen a STOP. En otras palabras, el resultado de STOP es inmediato. Por ejemplo, si COMPA inicia COMPB, y COMPB es el componente lgico que se est ejecutando actualmente y emite un STOP para COMPA, en primer lugar finaliza COMPB y despus COMPA. No se realizan ms operaciones a continuacin de STOP. La finalizacin de un componente lgico con STOP se considera una terminacin normal y se invoca *TERMSR para cualquier proceso de usuario final.

Llamada a programas remotos


Esta seccin analiza cmo la aplicacin VisualAge RPG puede llamar a un programa AS/400 y cmo una aplicacin RPG que se ejecuta en un AS/400 puede llamar a una aplicacin VisualAge RPG.
Captulo 17. Comunicacin entre objetos

261

Llamada a programas AS/400


Antes de que la aplicacin pueda llamar a un programa AS/400, debe configurar el servidor. El nombre del programa llamado puede ser el nombre de programa AS/400 (opcionalmente calificado por biblioteca) o un nombre de alteracin temporal. Puede definir la alteracin temporal del programa mediante la pgina Programa del cuaderno Definir informacin de AS/400. Vea Consideraciones sobre el cuaderno en la pgina 189 para obtener informacin acerca de lo que sucede si la pgina de cuaderno no contiene un nombre de alteracin temporal para el rea de datos. La Tabla 12 y la Figura 66 en la pgina 263 muestran cmo llamar a un programa AS/400 utilizando un nombre de alteracin temporal. El programa de la Figura 66 en la pgina 263 llama a MYLIB/LOOKUP en SERVER01.
Tabla 12. Entre esta informacin en la pgina Programa
Nombre de alteracin temporal del programa: Nombre del programa remoto: Pseudnimo del servidor: REMPGM MYLIB/LOOKUP SERVER01

262

Programacin con VisualAge RPG

********************************************************************* * * * ID de programa : rcallex.vpg * * * * Descripcin . : Segmento de cdigo para llamar a un programa * * remoto en el AS/400. * * * ********************************************************************* * * REMPGM es el nombre de alias del programa remoto D as400pgm S 6A INZ('REMPGM') LINKAGE(*SERVER) * Las variables siguientes son parmetros que se pasan al programa * remoto * student_id - input * name - output D student_id S 6S 0 INZ(32533) D name S 20A ********************************************************************* * * * Ventana. . : WIN1 * * * * Componente : PSB0000C * * * * Evento . . : PRESS * * * * Descripcin: Llame a un programa remoto en el AS/400 para obtener * * el nombre de la persona asociada al id. de estudiante* * * ********************************************************************* * C PSB0000C BEGACT PRESS WIN1 C CALL as400pgm C PARM student_id C PARM name C ENDACT

Figura 66. Llamada a un programa AS/400

Nota: Si el programa que est en el AS/400 contiene un archivo de estacin de trabajo, causar una anomala cuando el sistema intente abrirlo. Dado que el mandato de llamada remota se realiza a travs del servidor DDM, el dispositivo de pantalla es desconocido para la gestin de datos de la estacin de trabajo. Un procedimiento que puede utilizar consiste en crear el archivo de estacin de trabajo en el servidor AS/400 con el valor de Dispositivo de pantalla establecido en el nombre de la sesin (OMXxxxx) y establecer el parmetro Nmero mximo de dispositivo en un valor mayor que 1. Esto permitir que puedan pasarse parmetros al programa AS/400. No intente obtener la sesin de manera explcita con una sentencia ACQ. Esto ocasionar un conflicto que producir un error. An no puede adquirir ningn dispositivo de pantalla de emulador 5250 en la estacin de trabajo, porque causar un punto muerto que slo puede finalizarse rearrancando la estacin de trabajo.

Inicio de programas de estacin de trabajo desde el AS/400


Si tiene una aplicacin RPG ejecutndose en el AS/400 y quiere iniciar una aplicacin VisualAge RPG en una estacin de trabajo Windows, utilice el mandato STRPCCMD.

Captulo 17. Comunicacin entre objetos

263

Utilizacin de mltiples procedimientos


La posibilidad de codificar ms de un procedimiento mejora considerablemente la posibilidad de codificar una aplicacin modular. Un programa de VisualAge RPG se compone de uno o ms mdulos. Un procedimiento es una parte de cdigo a la que puede llamarse mediante una llamada enlazada. VisualAge RPG tiene dos clases de procedimientos: procedimiento principal y subprocedimiento. Un procedimiento principal es un procedimiento que puede especificarse como el procedimiento de entrada del programa y recibe control cuando se le llama por primera vez. Tenga en cuenta que un procedimiento principal slo se produce cuando se crea un EXE. Un subprocedimiento es un procedimiento que se especifica despus de la seccin fuente principal. Se diferencia de un procedimiento principal bsicamente en que: v Los nombres que se han definido dentro de un subprocedimiento no son accesibles desde fuera del mismo. v La interfaz de llamadas debe ser de prototipo. v Las llamadas a subprocedimientos deben ser llamadas de procedimiento enlazadas. v Slo pueden utilizarse las especificaciones P, D y C. Los subprocedimientos pueden proporcionar independencia respecto a otros procedimientos porque los elementos de datos son locales. Los elementos de datos locales se guardan por lo general en almacenamiento automtico, lo que significa que un valor de una variable local no se conserva entre una llamada y otra al procedimiento. Los subprocedimientos proporcionan otra caracterstica. Puede pasar parmetros a un subprocedimiento por valor y puede llamar a un subprocedimiento de una expresin para que devuelva un valor.

Llamadas de prototipo
Para llamar a un subprocedimiento, debe utilizar una llamada de prototipo. Tambin puede llamar a cualquier programa o procedimiento que se haya escrito en cualquier lenguaje mediante una llamada de prototipo. Una llamada de prototipo es aquella en la que la interfaz de llamadas se comprueba en el tiempo de compilacin utilizando un prototipo. Un prototipo es una definicin de la interfaz de llamadas. Incluye la informacin siguiente: v Si la llamada es enlazada (procedimiento) o dinmica (programa). v La manera de buscar el programa o el procedimiento (el nombre externo). v El nmero y la naturaleza de los parmetros. v Los parmetros que deben pasarse y los que se pasan de manera opcional. v El tipo de datos del valor de devolucin, si hay alguno (para un procedimiento). El compilador utiliza el prototipo para llamar al programa o al procedimiento correctamente y para asegurarse de que el emisor pasa los parmetros correctos. La Figura 67 en la pgina 265 muestra un prototipo para el procedimiento FmtCust, que formatea varios campos de un registro de manera legible. Tiene dos parmetros de salida.

264

Programacin con VisualAge RPG

* Prototipo para el procedimiento FmtCust (Vea PR en la * especificacin de la definicin). Tiene dos parmetros. D FmtCust PR D Nombre 100A D Direccin 100A

Figura 67. Prototipo para el procedimiento FmtCust

Para producir los campos de salida formateados, FmtCust llama al procedimiento NumToChar. NumToChar tiene un parmetro de entrada numrico que se pasa por valor y devuelve un campo de tipo carcter. La Figura 68 muestra el prototipo para NumToChar.
* Prototipo para el procedimiento NumToChar * El valor devuelto es un campo de tipo carcter de * 31 caracteres de longitud. D NumToChar PR 31A * El parmetro de entrada se empaqueta con 30 dgitos y 0 * posiciones decimales y se pasa por valor. D NUMPARM 30P 0 VALUE

Figura 68. Prototipo para el procedimiento NumToChar

Si el programa o el procedimiento son de prototipo, y desea utilizar el valor de devolucin, debe invocarlos con CALLP o en una expresin. Al pasar parmetros de una lista, sta debe seguir al nombre del prototipo, por ejemplo: nombre (parm1 : parm2 : ...). La Figura 69 muestra una llamada a FmtCust. Tenga en cuenta que los nombres de los parmetros, que se muestran en la Figura 67, no coinciden con los de la sentencia de llamada. Los nombres de los parmetros de un prototipo slo se utilizan a efectos de documentacin. El prototipo sirve para describir los atributos de la interfaz de llamadas. La definicin real de los parmetros de llamada tienen lugar dentro del procedimiento mismo.
C CALLP FmtCust(RPTNAME : RPTADDR)

Figura 69. Llamada al procedimiento FmtCust

Utilizando llamadas de prototipo, puede llamar (con la misma sintaxis) a: v Programas que estn en el sistema en el tiempo de ejecucin. v Procedimientos exportados a otros mdulos. v Subprocedimientos del mismo mdulo. Al objeto de formatear el nombre y la direccin adecuadamente, FmtCust llama a NumToChar para convertir el nmero de cliente en un campo de tipo carcter. Puesto que FmtCust utiliza el valor de devolucin, la llamada a NumToChar tiene lugar en una expresin. La Figura 70 en la pgina 266 muestra la llamada.

Captulo 17. Comunicacin entre objetos

265

*-------------------------------------------------------------* CUSTNAME y CUSTNUM se han formateado para tener este aspecto: * A&P Electronics (Nmero de cliente 157) *-------------------------------------------------------------C EVAL Name = CUSTNAME + ' ' C + '(Nmero de cliente ' C + %trimr(NumToChar(CUSTNUM)) + ')'

Figura 70. Llamada al procedimiento NumToChar

La utilizacin de procedimientos para valores de devolucin, le permite escribir cualquier funcin definida por el usuario que necesite. Adems, utilizar una interfaz de llamadas de prototipo abre una serie de opciones para pasar parmetros. v Los parmetros de prototipo pueden pasarse de varias maneras: por referencia, por valor (slo para procedimientos) o por referencia de slo lectura. El mtodo por omisin para RPG es pasar por referencia. Sin embargo, pasar por valor o por referencia de slo lectura proporciona ms opciones para pasar parmetros. v Si el prototipo indica que est permitido para un parmetro determinado, puede efectuar una o ms de las acciones siguientes: Pasar *OMIT. Omitir un parmetro por completo. Pasar un parmetro ms corto del especificado (para parmetros de tipo carcter y grfico y para parmetros de matriz).

Consideraciones sobre el procedimiento


v No puede definir valores de devolucin para un procedimiento principal. Los parmetros deben pasarse por valor. v Un procedimiento principal slo est contenido en un EXE. para el que se ha especificado que su parmetro se pase por valor. v Cualquiera de las operaciones de clculo pueden codificarse en un subprocedimiento. Sin embargo, todos los archivos deben definirse globalmente, de manera que todas las especificaciones de entrada y salida deben definirse en la seccin fuente principal. De la misma manera, todas las reas de datos deben definirse en el procedimiento principal aunque puedan utilizarse en un subprocedimiento. v La especificacin de control slo puede codificarse en la seccin fuente principal ya que controla todo el mdulo. v Se puede llamar a un subprocedimiento de manera recursiva. Cada llamada recursiva hace que en la pila de llamadas se coloque una nueva invocacin del procedimiento. La nueva invocacin tiene ms almacenamiento para todos los elementos de datos del almacenamiento automtico, el cual no est disponible para otras invocaciones porque es local. (Un elemento de datos que se ha definido en un subprocedimiento utiliza almacenamiento automtico a menos que la palabra clave STATIC est especificada en la definicin). El almacenamiento automtico asociado con las primeras invocaciones no se ve afectado por las ms recientes. Todas las invocaciones comparten el mismo almacenamiento esttico, de manera que las invocaciones ms recientes pueden afectar al valor retenido por una variable en un almacenamiento esttico. v Respecto al tratamiento de excepciones hay una diferencia entre el procedimiento principal y el subprocedimiento, y es que ste no tiene manejadores de excepciones. Si se llamara al manejador por omisin para un procedimiento principal se obtendra una terminacin anormal del subprocedimiento.

266

Programacin con VisualAge RPG

v Los nombres de los procedimientos de VisualAge RPG estn en maysculas. Al llamar a estos procedimientos, debe asegurarse de especificar los nombres en mayscula.

Implicaciones del procedimiento


Como programador, tiene la opcin de producir tres objetos destino posibles: v Una DLL de VisualAge RPG (contiene cdigos de operacin de GUI) v Una DLL de utilidad que contiene slo subprocedimientos de RPG que no incluyen ningn cdigo de operacin de GUI. v Un EXE de RPG que no contiene ningn cdigo de operacin de GUI.

Consideraciones sobre las DLL de VisualAge RPG

v Los subprocedimientos DLL de VisualAge RPG no son externos. El compilador ha especificado que estos subprocedimientos son slo internos. Los puntos de entrada no son externos para otros mdulos. Cualquier intento de enlazar estos subprocedimientos ocasionar un error en el paso de enlace. v La palabra clave EXPORT no est permitida en especificaciones de procedimiento puesto que los procedimientos no pueden exportarse desde una DLL de VisualAge RPG.

Consideraciones sobre la DLL de utilidad


Esta DLL se crea cuando se proporciona la palabra clave NOMAIN en la especificacin de control. El compilador producir una DLL y un archivo LIB como resultado de la compilacin. El archivo LIB contendr todos los procedimientos que tienen la palabra clave EXPORT en su especificacin P inicial. El archivo LIB le permite enlazar a los subprocedimientos contenidos en la DLL. v La DLL se compone slo de procedimientos. Todas las subrutinas (BEGSR) deben ser locales para un procedimiento. v No se permiten cdigos de operacin GUI en el fuente. Esto incluye START, STOP, SETATR, GETATR, %SETATR, %GETATR, SHOWWIN, CLSWIN y READS. Puede utilizarse DSPLY, pero si se llama al procedimiento que lo contiene desde una DLL de VisualAge RPG, el cdigo de operacin DSPLY no realizar ninguna accin. v *inzsr y *termsr no estn permitidos. v *ENTRY parms no est permitido. v El tratamiento de excepciones se diferencia de la DLL de VisualAge RPG en lo siguiente: No se devuelve ninguna informacin sobre la excepcin al emisor si ste no reside en la DLL de utilidad. La manera ms adecuada para que un usuario trate excepciones en una DLL de utilidad es tener un indicador de errores, o un *PSSR local para cada rutina que devuelva un cdigo de devolucin apropiado al emisor. El manejador de excepciones por omisin no se invoca nunca desde una DLL de utilidad ya que no se invoca cuando se produce una excepcin en un procedimiento. Si se produce una excepcin en la DLL de utilidad y no hay ningn indicador de errores ni *PSSR, tiene lugar un exit() y la informacin sobre la excepcin se graba en el archivo FVDCERRS.LOG.

Consideraciones sobre el EXE

v El EXE se crea cuando se proporciona la palabra clave EXE en la especificacin de control. v El EXE se compone slo de procedimientos.

Captulo 17. Comunicacin entre objetos

267

v v

v v

Todas las subrutinas (BEGSR) deben ser locales para un procedimiento. El EXE debe contener un procedimiento cuyo nombre coincida con el nombre del archivo fuente. ste ser el punto de entrada principal para el EXE (por ejemplo, el procedimiento principal). No se permiten cdigos de operacin GUI en el fuente. Esto incluye START, STOP, SETATR, GETATR, %SETATR, %GETATR, SHOWWIN, CLSWIN y READS. Se puede utilizar DSPLY. *inzsr y *termsr no estn permitidos. *ENTRY parms no est permitido. Si hay parmetros de entrada, estn especificados en la definicin de parmetros del procedimiento principal y deben pasarse por VALUE (la palabra clave VALUE debe especificarse para cada parmetro). La palabra clave EXPORT no est permitida en la especificacin P Begin. El tratamiento de excepciones se diferencia de la DLL de VRPG. El manejador de excepciones por omisin no se invoca nunca desde un EXE. Si se produce una excepcin en el EXE y no hay ningn indicador de errores ni *PSSR, tiene lugar un exit() y la informacin sobre la excepcin se graba en el archivo FVDCERRS.LOG.

268

Programacin con VisualAge RPG

Captulo 18. Cmo invocar mtodos Java desde programas VisualAge RPG
Esta seccin describe cmo invocar mtodos Java desde programas VARPG que se han convertido a cdigo fuente Java, as como los elementos adicionales del lenguaje VARPG que dan soporte a estas funciones. Para invocar mtodos Java, el compilador VARPG necesita la siguiente informacin: v El nombre del mtodo v La clase que contiene el mtodo v La clase del objeto devuelto si el mtodo devuelve un objeto v Si el mtodo es esttico o no v Los tipos de datos de los parmetros pasado al mtodo Adems, si el mtodo no es esttico, debe crearse una instancia para un objeto para poder invocar el mtodo. Si el mtodo devuelve un objeto, el compilador debe tener dnde almacenarlo. Si el mtodo acepta un objeto como parmetro, debe haber alguna forma de crear ese objeto. Estos requisitos han conducido a los siguientes elementos adicionales en el lenguaje VARPG: v El tipo de datos de objeto v La palabra clave CLASS v La extensin de la palabra clave EXTPROC

El tipo de datos de objeto y la palabra clave CLASS


Los campos que pueden almacenar objetos se declaran utilizando el tipo de datos O. Para declarar un campo de tipo O, codifique O en la columna 40 de la especificacin D y utilice la palabra clave CLASS para proporcionar la clase del objeto. La palabra clave CLASS acepta dos parmetros:
CLASS(*JAVA:nombre de clase)

*JAVA identifica el objeto como objeto Java. El nombre de clase especifica la clase del objeto. Debe ser literal en los caracteres y el nombre de clase debe ser totalmente calificado. El nombre de clase es sensible a las maysculas y minsculas. Por ejemplo, para declarar un campo que contendr un tipo de objeto BigDecimal:
D bdnum S O CLASS(*JAVA:'java.math.BigDecimal')

Para declarar un campo que contendr un tipo de objeto String:


D string S O CLASS(*JAVA:'java.lang.String')

Observe que ambos nombres de clase estn totalmente calificados y que el uso de maysculas y minsculas coincide exactamente con el de la clase Java. Los campos de tipo O no pueden definirse como subcampos de estructuras de datos. Es posible disponer de matrices de campos de tipo O, pero no estn permitidas las tablas de tipo O porque deben cargarse en tiempo de ejecucin. Las palabras clave siguientes no pueden utilizarse con la palabra clave CLASS:

Copyright IBM Corp. 1994, 2000

269

ALIGN, ALT, ASCEND, BASED, BUTTON, CLTPGM, CONST, CTDATA, DATFMT, DESCEND, DTAARA, EXTFLD, EXTFMT, EXTNAME, FROMFILE, INZ, LINKAGE, MSGDATA, MSGNBR, MSGTEXT, MSGTITLE, NOOPT, NOWAIT, OCCURS, OPTIONS, OVERLAY, PACKEVEN, PERRCD, PREFIX, PROCPTR, STYLE, TIMFMT, TOFILE, VALUE, VARYING

Cmo realizar el prototipo de un mtodo Java


Al igual que los subprocedimientos, los mtodos Java deben ser prototipos para que puedan ser invocados correctamente. El compilador VARPG debe conocer el nombre del mtodo, la clase a la que pertenece, los tipos de datos de los parmetros y el tipo de datos del valor de retorno (si lo hubiera), as como si el mtodo es esttico o no. La palabra clave EXTPROC extendida puede utilizarse para especificar el nombre del mtodo y la clase a la que pertenece. Al hacer un prototipo de un mtodo Java, el formato de la palabra clave EXTPROC debe ser:
EXTPROC(*JAVA:nombre_clase:nombre_mtodo | *JAVARPG:nombre_clase:nombre_mtodo)

*JAVARPG identifica el mtodo como un mtodo Java generado por VARPG. *JAVA identifica el mtodo como un mtodo Java que ha sido generado de cdigo escrito inicialmente en Java y no generado por VARPG. Esta distincin es importante porque los mtodos generados a partir de *JAVARPG permitirn que ciertos tipos de datos sean pasados por referencia cuando normalmente no podran pasarse por referencia en Java. Ello permite que pueda utilizarse el mismo cdigo fuente al dirigirse a Windows y al generar cdigo fuente Java. Tanto el nombre de clase como el del mtodo deben ser literales en el uso de maysculas y minsculas. El nombre de clase debe ser un nombre de clase Java totalmente calificado y es sensible a las maysculas y minsculas. El nombre de mtodo debe ser el nombre del mtodo que debe invocarse y es sensible a las maysculas y minsculas. La forma extendida de la palabra clave EXTPROC slo puede utilizarse al invocar mtodos Java. Si se dirige a Windows, el uso de esta forma de la palabra clave EXTPROC dar como resultado un error del compilador. Los tipos de datos de los parmetros y el valor de retorno del mtodo estn especificados de la misma forma que la realizacin de un prototipo de un subproceso. La nica observacin al respecto es que los tipos de datos se correlacionan a tipos de datos Java. El compilador correlaciona tipos de datos VARPG a tipos de datos Java segn se muestra a continuacin:
Tipo de datos Java char[] boolean byte[] byte int short long float double Tipo de datos VARPG grfico o Unicode indicador (N) alfanumrico (A de cualquier longitud) entero (3I) entero (10I) entero (5I) entero (20I) coma flotante (4F) coma flotante (8F)

270

Programacin con VisualAge RPG

Tipo de datos Java cualquier objeto

Tipo de datos VARPG objeto (O)

Los tipos de datos con zona, empaquetados, binarios y sin signo no estn disponibles en Java. Si pasa un campo con zona, empaquetado, binario o sin signo como parmetro, el compilador realizar la conversin apropiada, pero es muy posible que provoque truncamiento y/o prdida de precisin. Si el mtodo que est invocando ha sido generado por VARPG, es decir, que ha sido especificado como primer parmetro de una palabra clave EXTPROC, entonces los tipos de datos con zona, empaquetados, binarios y sin signo pueden especificarse como tipo de datos de los parmetros y los valores de retorno. Los mtodos generados por cdigo escrito inicialmente en Java no pueden utilizar tipos de datos con zona, empaquetados, binarios y sin signo en el prototipo para parmetros o valores de retorno. Al invocar un mtodo, el compilador acepta matrices como parmetros si ste es un prototipo que utiliza la palabra clave DIM. En caso contrario, slo se aceptarn los campos escalares, las estructuras de datos y las tablas. Actualmente, no puede invocar mtodos que esperen estos tipos de datos de Java o que devuelvan estos tipos de valores: byte, char y long. Si el valor de retorno de un mtodo es un objeto, entonces usted debe proporcionar la clase del objeto codificando la palabra clave CLASS en el prototipo. El nombre de clase especificado ser el del objeto que se devuelve. Utilice la palabra clave EXTPROC para especificar la clase del mtodo que se invoca. Si el mtodo invocado es esttico, entonces debe especificar la palabra clave STATIC en el prototipo. En Java, los tipos de datos siguientes slo pueden pasarse por valor:
byte int short long float double

Estos tipos de parmetros deben tener asignada una especificacin de la palabra clave VALUE en el prototipo. Si el mtodo que est invocando ha sido generado por VARPG, es decir, que ha sido especificado como primer parmetro de una palabra clave EXTPROC, entonces estos tipos de datos pueden pasarse por referencia y la palabra clave VALUE no es necesaria. Observe que slo se puede pasar los objetos por referencia. La palabra clave VALUE no puede especificarse con tipo O. Debido a que java percibe las matrices como objetos, los parmetros que correlaciones a matrices deben tambin pasarse por referencia. Esto incluye a las matrices de bytes.

Ejemplos de cmo realizar el prototipo de un mtodo Java


Esta seccin presenta algunos ejemplos de prototipo de mtodos Java.
Captulo 18. Cmo invocar mtodos Java desde programas VisualAge RPG

271

Ejemplo 1
La clase Integer de Java contiene un mtodo esttico llamado toString, que acepta un parmetro int y devuelve un objeto String. Se declara en Java de la siguiente forma:
String Integer.toString(int)

Este mtodo podra realizarse en el siguiente prototipo:


D tostring D D D D D num PR EXTPROC(*JAVA: 'java.lang.Integer': 'toString') CLASS(*JAVA:'java.lang.String') STATIC 10I 0 VALUE O

La palabra clave EXTPROC identifica el mtodo como no generado por VARPG. Tambin indica que el nombre del mtodo es toString, y que se encuentra en la clase java.lang.Integer. El O en la columna 40 y la palabra clave CLASS informan al compilador de que el mtodo devuelve un objeto, cuya clase es java.lang.String. La palabra clave STATIC indica que el mtodo es esttico, es decir, que no es necesario un objeto Integer para invocar este mtodo. El tipo de datos del parmetro se especifica como 10I, que correlaciona al tipo de datos Java int. Al ser el parmetro un int, debe pasarse por valor, y se precisa la palabra clave VALUE.

Ejemplo 2
La clase Integer de Java contiene un mtodo esttico llamado getInteger, que acepta objetos String e Integer como parmetros y devuelve un objeto Integer. En Java se declara de la siguiente forma:
Integer Integer.getInteger(String, Integer)

Este mtodo podra realizarse en el siguiente prototipo:


D getint D D D D D string D num PR O EXTPROC(*JAVA: 'java.lang.Integer': 'getInteger') CLASS(*JAVA:'java.lang.Integer') STATIC CLASS(*JAVA:'java.lang.String') CLASS(*JAVA:'java.lang.Integer')

O O

Este mtodo acepta dos objetos como parmetros. O est codificado en la columna 40 de la especificacin D y la palabra clave CLASS especifica la clase de cada parmetro de objeto.

Ejemplo 3
La clase Integer de Java contiene un mtodo llamado shortValue, que devuelve la representacin corta del objeto Integer utilizado para invocar el mtodo. Se declara en Java de la siguiente forma:
short shortValue()

Este mtodo podra realizarse en el siguiente prototipo:


D shortval D D PR 5I 0 EXTPROC(*JAVA: 'java.lang.Integer': 'shortValue')

272

Programacin con VisualAge RPG

La palabra clave STATIC no se especifica porque el mtodo no es esttico. El mtodo no utiliza parmetros, por lo que no se codifica ninguno. El valor devuelto se especifica como 5I, que correlaciona al tipo de datos short de Java.

Ejemplo 4
La clase Integer de Java contiene un mtodo llamado equals, que acepta un objeto como parmetro y devuelve un valor booleano. Se declara en Java de la siguiente forma:
boolean equals(Object)

Este mtodo podra realizarse en el siguiente prototipo:


D equals D D D obj PR N O EXTPROC(*JAVA: 'java.lang.Integer': 'equals') CLASS(*JAVA:'java.lang.Object')

El valor devuelto se especifica como N, que correlaciona al tipo de datos boolean de Java.

Cmo crear objetos


Se precisa de un objeto para invocar un mtodo no esttico. La clase del objeto debe ser la misma que la clase que lo contiene. La creacin de objetos o de instancias de objeto se realiza invocando al constructor de la clase. El constructor de la clase no es un mtodo esttico, pero no requiere un objeto para llamarlo. El nombre de mtodo especial *CONSTRUCTOR se utiliza para realizar prototipos de constructor. Por ejemplo, para construir un objeto BigDecimal a partir de un valor float, el constructor que espera un parmetro float debe invocarse:
BigDecimal(float) devuelve un objeto BigDecimal

Este constructor podra realizarse en el siguiente prototipo:


D bdcreate D D D D dnum PR O EXTPROC(*JAVA: 'java.math.BigDecimal': *CONSTRUCTOR) CLASS(*JAVA:'java.math.BigDecimal') VALUE

4F

Observe que el parmetro debe pasarse por valor porque correlaciona al tipo de datos float de Java.

Cmo invocar mtodos Java


Los mtodos Java pueden invocarse utilizando cdigos de operacin CALLP (cuando no se espera un valor de retorno) y EVAL (cuando se espera un valor de retorno). No se necesita nueva sintaxis. Al invocar un mtodo esttico, no se necesita un objeto para realizar la operacin. Se precisa de un objeto para invocar un mtodo no esttico. El objeto que va a utilizarse debe codificarse como el primer parmetro de la llamada. Este parmetro no se especifica en el prototipo, pero est implcito para todos los mtodos no estticos. Esto significa que cuando se invoca un mtodo no esttico, debe especificarse al menos un parmetro.
Captulo 18. Cmo invocar mtodos Java desde programas VisualAge RPG

273

Ejemplo 1 En este ejemplo, el objetivo es aadir dos valores BigDecimal. Para llevarlo a cabo, deben crearse instancias para dos objetos BigDecimal invocando el constructor para la clase BigDecimal, deben declararse los campos para el almacenamiento de los objetos BigDecimal y debe invocarse el mtodo add() en la clase BigDecimal.
* * * * Prototipo del constructor BigDecimal que acepta un parmetro String. Devuelve un nuevo objeto BigDecimal.

D bdcreate1 PR O EXTPROC(*JAVA: D 'java.math.BigDecimal': D *CONSTRUCTOR) D CLASS(*JAVA:'java.math.BigDecimal') D str O CLASS(*JAVA:'java.lang.String') * * Prototipo del constructor BigDecimal que acepta un parmetro * doble. 8F correlaciona al tipo de datos double de Java y, por ello, * debe pasarse por VALUE. Devuelve un objeto BigDecimal. * D bdcreate2 PR O EXTPROC(*JAVA: D 'java.math.BigDecimal': D *CONSTRUCTOR) D CLASS(*JAVA:'java.math.BigDecimal') D double 8F VALUE * * Define los campos en los que almacenar los objetos BigDecimal. * D bdnum1 S O CLASS(*JAVA:'java.math.BigDecimal') D bdnum2 S O CLASS(*JAVA:'java.math.BigDecimal') * * * * * * * Ya que uno de los constructores que estamos utilizando requiere un objeto String, tambin necesitamos construir uno. Realice un prototipo del constructor String que acepta una matriz de bytes como parmetro. Devuelve un objeto String.

D makestring PR O EXTPROC(*JAVA: D 'java.lang.String': D *CONSTRUCTOR) D CLASS(*JAVA:'java.lang.String') D bytes 10A * * Define un campo en el que almacenar el objeto String. * D string S O CLASS(*JAVA:'java.lang.String') * * Prototipo del mtodo add BigDecimal. Acepta un objeto BigDecimal * como parmetro y devuelve un objeto BigDecimal (la suma del parmetro * y del objeto BigDecimal utilizado para invocar). * D add PR O EXTPROC(*JAVA: D 'java.lang.BigDecimal': D 'add') D CLASS(*JAVA:'java.math.BigDecimal') D bd1 O CLASS(*JAVA:'java.math.BigDecimal') * * Define un campo en el que almacenar el resultado de la suma. * D sum S O CLASS(*JAVA:'java.math.BigDecimal') D D double S 8F INZ(1.1) D fld1 S 10A

A continuacin, el cdigo que realiza la llamada.

274

Programacin con VisualAge RPG

C C* C* C* C* C* C C* C* C* C* C C* C* C* C* C C* C* C* C* C* C* C* C* C* C C* C*

MOVEL

'mystring'

fld1

10

Invoca al constructor para la clase String, para crear un objeto String desde fld1. Al estar invocando al constructor, no necesitamos pasar un objeto String como primer parmetro. EVAL string = makestring(fld1)

Invoca al constructor BigDecimal que acepta un parmetro String, utilizando el objeto String para el que acabamos de crear una instancia. EVAL bdnum1 = bdcreate1(string)

Invoca al constructor BigDecimal que acepta double como parmetro. EVAL bdnum2 = bdcreate2(double)

Sume los dos objetos BigDecimal invocando el mtodo add. El prototipo indica que add acepta un parmetro, pero al no ser add un mtodo esttico, tambin debemos pasar un objeto BigDecimal para realizar la llamada. Adems debe pasarse como primer parmetro. bdnum1 es el objeto que estamos utilizando para invocar y bdnum2 es el parmetro. EVAL sum = add(bdnum1:bdnum2) sum ahora contiene un objeto BigDecimal con el valor bdnum1 + bdnum2.

Ejemplo 2 Este ejemplo muestra cmo realizar un TRIM en Java utilizando el mtodo trim() como alternativa a la funcin %TRIM incorporada en VARPG. El mtodo trim() en la clase String no es un mtodo esttico, por lo que se necesita un objeto String para invocarlo.
* * * Define un campo en el que almacenar el objeto String que deseamos ajustar.

D str S O CLASS(*JAVA:'java.lang.String') * * Prototipo de constructor para la clase String. El * constructor espera una matriz de bytes. * D makestring PR O EXTPROC(*JAVA: D 'java.lang.String': D *CONSTRUCTOR) D CLASS(*JAVA:'java.lang.String') D parm 10A D * * Prototipo de mtodo String getBytes que convierte un String en una matriz * de bytes. A partir de ah, podremos almacenar esta matriz de bytes en un * campo alpha. * D makealpha PR 10A EXTPROC(*JAVA: D 'java.lang.String': D 'getBytes') * * Prototipo de mtodo String trim. No necesita parmetros, pero * al no ser un mtodo esttico, debe invocarse utilizando un objeto * String. * D trimstring PR O EXTPROC(*JAVA: D 'java.lang.String':
Captulo 18. Cmo invocar mtodos Java desde programas VisualAge RPG

275

D fld

'trim') S 10A INZ(' hello ')

La llamada se codifica de la forma siguiente:


C* C* C* C C* C* C* C* C C* C* C* C* C Invoca al constructor String EVAL str = makestring(fld)

Ajusta la serie invocando el mtodo String trim(). Volveremos a utilizar el campo str para almacenar el resultado. EVAL str = trimstring(str)

Vuelve a convertir la serie en una matriz de bytes y la almacena en fld. EVAL fld = makealpha(str)

Los mtodos estticos se invocan de la misma forma, excepto que no se necesita un objeto para realizar la llamada. Si el mtodo makealpha() mostrado ms arriba fuese esttico, la llamada sera:
C EVAL fld = makealpha()

Si el mtodo no devuelve un valor, utilice el cdigo de operacin CALLP.

Otras consideraciones
El compilador no intentar resolver las clases durante la compilacin. Si una clase no puede localizarse durante el tiempo de ejecucin, aparecer un error de ejecucin. ste indicar que se ha recibido un objeto UnresolvedLinkException del entorno Java. El compilador no escribe las comprobaciones de parmetros durante la compilacin. Si se produce un conflicto entre el prototipo y el mtodo que se invoca, se recibir un error durante la ejecucin. Es muy importante que se especifique *JAVARPG como primer parmetro de EXTPROC si el mtodo invocado no ha sido generado por VARPG. En caso contrario, es posible que se produzca una de las dos situaciones de error descritas ms arriba.

276

Programacin con VisualAge RPG

Captulo 19. Consideraciones al compilar para Java


Esta seccin describe las restricciones de fuente de VARPG, posibles cambios necesarios en su fuente VARPG y diferencias de comportamiento del tiempo de ejecucin al utilizar la opcin de construccin de Java para crear el fuente Java.

Convenio de denominacin del archivo de proyecto


El nombre del archivo de proyecto para una aplicacin Java debe ajustarse a los convenios de denominacin de Java. El primer carcter debe ser alfabtico. Si el nombre de su proyecto no es correcto, puede utilizar el programa de utilidad Renombrar proyecto para renombrarlo. (Seleccione Renombrar proyecto del men emergente en el icono del proyecto.)

Directivas de compilacin condicional


El compilador define dos directivas de compilacin condicional para ayudar a mantener un nico archivo fuente que pueda utilizarse para crear tanto componentes Windows como cdigo fuente Java. Estas directivas son: v COMPILE_WINDOWS definida por el compilador cuando se solicita una construccin de Windows. v COMPILE_JAVA definida por el compilador para una construccin Java. El compilador define estos dos nombres, por lo que no es necesario definirlos mediante la directiva /DEFINE.

Restricciones del cdigo fuente Java


Los siguientes elementos del lenguaje no estn soportados cuando se genera cdigo fuente Java: Palabras clave: v ALIGN v EXPROPTS v STATIC en definiciones de campo. STATIC est soportado para prototipos de mtodos Java. Cdigos de operacin: v ALLOC v CABxx v CALLB v DEALLOC v DSPLY (slo para NOMAIN y EXE; en caso contrario, est soportado) v GOTO v REALLOC v TAG Expansores de operacin: v M v R Elementos del lenguaje: v SQL incorporado Tipos de datos: v Tipo de datos de puntero
Copyright IBM Corp. 1994, 2000

277

Tipos de archivo: v SPECIAL Operaciones con archivos: v Grabar registros por nmero de registro relativo

Cambios posibles en el cdigo VARPG


Esta seccin resume los cambios que pueden ser necesarios en el fuente VARPG para generar el cdigo fuente Java. 1. La notacin Desde/Hasta debe utilizarse al definir subcampos del PSDS e INFDS para permitir al compilador validar las definiciones de subcampo. La definicin de subcampos en INFDS e PSDS debe coincidir con las definiciones especificadas en la publicacin Language Reference de VARPG. Se emitir un error de tiempo de compilacin si no coincide. 2. Una operacin LEAVE o ITER incondicional debe ser la ltima de un bucle o el compilador Java emitir un error. Si se da una operacin LEAVE o ITER incondicional en un bucle, todas las operaciones que aparezcan despus de ella en el bucle deben eliminarse, ya que no se ejecutaran nunca. 3. Al aadir y sustraer duraciones de fecha/hora/indicacin de hora, slo deben utilizarse valores entre maxint (2.147.483.647) y -maxint (-2.147.483.648). 4. Debido a que Java no permite pasar por referencia a los valores int (10I), short (5I), float (4F) y double (8F), el cdigo Java debe generarse en VARPG para mantener la posibilidad de convertir esta funcionalidad de subprocedimientos en Java. El cdigo generado para conseguirlo puede provocar errores del compilador java cuando el fuente VARPG contiene subprocedimientos con puntos de retorno mltiples y recibe parmetros enteros o de coma flotante pasados por referencia. Ejemplo de cdigo que podra provocar errores de compilacin en Java:
C C C C C C C IF ... RETURN ELSE ... RETURN ENDIF x = 1 1 0

El cdigo anterior debera cambiarse por:


C C C C C C C IF ... RETURN ELSE ... ENDIF RETURN x = 1 1

5. Los caracteres *, # y @ no pueden utilizarse en identificadores Java. Debido a ello, todas las apariciones de *, # y @ en nombre VARPG deber cambiarse a _. Es posible que esta conversin d como resultado nombre duplicados. 6. Si una operacin COMMIT o ROLBK est codificada en una aplicacin que carece de archivos, se emitir un mensaje de gravedad 30 (RNF7833). 7. A causa de la forma en que un *PSSR local se convierte a Java, no es posible invocar un *PSSR local. Observe tambin que, al no soportarse GOTO, la nica forma de dejar un *PSSR local y evitar el manejador por omisin es codificar una operacin RETURN. 8. No hay posibilidad de cortocircuitar expresiones lgicas. Esto significa que no puede preverse el orden en que se ejecutar una expresin lgica compuesta. 9. Los campos de longitud variable se implementan como una clase al convertir a Java. Ello significa que no se almacenan como documentados en la

278

Programacin con VisualAge RPG

10.

11. 12.

13.

14.

15.

publicacin VARPG Language Reference. El cdigo que depende de que estos campos se almacenen de una cierta forma no funcionar. Los subcampos de estructura de datos no se inicializarn a espacios en blanco si no se provee de un valor inicial, pero se inicializarn a un valor por omisin dependiendo del tipo de datos del subcampo. El valor por omisin es 0 para numricos, espacios en blanco para carcter y *LOVAL para fecha, hora e indicacin de la hora. La longitud de los campos de longitud variable se establecer en 0. Los valores *HIVAL y *LOVAL no se permiten en los campos de tipo grfico y UCS-2. Si se especifica una longitud para una estructura de datos, debe coincidir con la longitud total de los subcampos que contiene, en caso contrario el compilador emitir un mensaje de diagnstico de gravedad 30. Las subrutinas no pueden definirse en los subprocedimientos. La nica excepcin a ello que un *PSSR puede definirse en un subproceso. Todas las subrutinas contenidas en subprocedimientos deberan trasladarse fuera de ellos. Si la subrutina accede a campos locales en el subprocedimiento, entonces los campos deben convertirse en globales o bien la subrutina debe cambiarse a un subprocedimiento que acepte campos locales como parmetros. Sentencias incondicionales LEAVE en bucles DO no se soportan. Se producir un error del compilador Java si se da esta situacin. Un LEAVE incondicional en un bucle DO significa que el bucle se ejecutar una sola vez, por lo que LEAVE debera suprimirse y cambiarse el cdigo para eliminar los cdigos de la operacin de bucle. El uso de atributos de evento en instancias condicionales compuestas modificadas provoca errores de compilacin en Java. En su lugar, debiera utilizarse la expresin libre equivalente. Ejemplo de cdigo que podra provocar errores de compilacin en Java:
C C C C %mousex %mousey IFEQ ANDEQ ... ENDIF x y

El cdigo anterior debera cambiarse por:


C C C C IF ... ENDIF %mousex = x AND %mousey = y

16. Una operacin RETURN incondicional no puede codificarse a menos que sea la ltima instancia de una subrutina de usuario, una subrutina de accin o un subprocedimiento. En caso contrario, el compilador Java puede informar de errores. 17. Una operacin LEAVESR incondicional no puede codificarse a menos que sea la ltima sentencia de una subrutina de usuario o una subrutina de accin. En caso contrario, el compilador Java puede informar de errores. 18. Las instancias SELECT pueden provocar errores del compilador Java cuando aparecen en subprocedimientos, cuando contienen operaciones RETURN y no se ha codificado ningn RETURN en el cuerpo principal del subprocedimiento. Ejemplo de cdigo que podra provocar errores de compilacin en Java:
C C C C C C C C x x SELECT WHENEQ RETURN WHENEQ RETURN OTHER RETURN ENDSL y 1 z 2 0

Captulo 19. Consideraciones al compilar para Java

279

El cdigo anterior debera cambiarse por:


C C C C C C C x x SELECT WHENEQ RETURN WHENEQ RETURN ENDSL RETURN y 1 z 2 0

En general, una operacin RETURN debera codificarse para todas las posibles vas de acceso de cdigo de un subprocedimiento, en caso contrario, el compilador Java emitir errores. 19. Las matrices no pueden pasarse por valor a subprocedimientos.

Diferencias de tiempo de ejecucin


Debido a las diferencias entre los entornos Windows y Java, una aplicacin puede ejecutarse de forma diferente en Java de lo que lo hace en Windows. Las siguientes reas se ven afectadas: 1. La funcin incorporada %SCAN devolver un resultado entero. En Windows, devuelve un resultado sin signo. 2. La opcin de construccin de truncar valores numricos no es fiable, por lo que no debe dependerse de ella. 3. Cuando se produce una excepcin de E/S, el usuario no dispondr de la opcin de volver a intentar la operacin. 4. Las estructuras de datos no se tratan como un slo campo largo de caracteres cuando la aplicacin Java se est ejecutando. Si se las utiliza como tales, pueden producirse resultados imprevistos. 5. El formato de los tipos de datos binarios, enteros y sin signo se trata de forma diferente para los archivos locales. Al leer y escribir archivos locales, se presupone el formato Java, lo que significa que los bytes de mayor orden estn situados ms a la izquierda, mientras que en Windows estn situados ms a la derecha. 6. El tratamiento de excepciones para subprocedimientos tiene el mismo comportamiento que en las subrutinas de accin. Se invocar el gestor de errores por omisin si la operacin no tiene un *PSSR o INFSR local y no hay indicacin de error. 7. Si al leer o escribir un campo en un archivo se encuentra un valor errneo de fecha, de hora o de indicacin de la hora, el campo se establecer en el valor por omisin (*LOVAL). No se informar de ningn error. 8. Java slo puede tratar una porcin de milisegundos de 3 dgitos en las indicaciones de la hora. Al realizar clculos con indicaciones de la hora que utilizan 6 dgitos en la porcin de milisegundos (es decir, que no expresan los milisegundos mediante el formato 000xxx), los resultados pueden no ser los previstos. 9. Los resultados intermedios de las expresiones no estn limitados a 30 dgitos. De hecho, al procesar en el entorno VARPG, no se presta atencin a la precisin de los resultados intermedios. 10. No es posible compartir memoria entre componentes. Si un componente inicia otro mediante START, los cambios realizados en parmetros pasados no se reflejan en los componentes. 11. No se informar del desbordamiento o subdesbordamiento de integer. Se informar del desbordamiento o subdesbordamiento de float mediante el estado 9999. 12. Si se produce un error mientras se est ejecutando un subprocedimiento en una aplicacin NOMAIN o EXE, y no hay indicador de error o *PSSR,

280

Programacin con VisualAge RPG

entonces se informar del error al llamante y ser ste el que se encargue de l. Cuando se procesa en Windows, la aplicacin se interrumpir. 13. Nunca se emitir un error de estado 50 cuando se ejecuten aplicaciones Java. Java no proporciona mensajes de diagnstico para las conversiones de caracteres que no puede manejar. Java puede emitir un estado 100 para una conversin no satisfactoria o para una ArrayIndexOutOfBoundsException cuando se utiliza la serie convertida. 14. El posicionamiento de un archivo de sistema principal en registros con valores nulos cuando se ha especificado ALWNULL(*NO) da como resultado CPF5035.

Restricciones de applet
Los siguientes elementos del lenguaje no estn soportados cuando se ejecuta una applet VARPG y dar como resultado errores de Java en tiempo de ejecucin: v Archivos de impresora v Archivos locales v Llamadas a funciones C, subprocedimientos externo, archivos EXE. v Las aplicaciones NOMAIN y EXE no pueden ejecutarse como applets.

Problemas de impresin de J2SDK 1.2


Actualmente, el Java 2 Software Development Kit (J2SDK), versin 1.2 o superior, parece tener problemas al enviar texto a un dispositivo de impresora. Una solucin alternativa a este problema es ejecutar la aplicacin Java de la siguiente forma:
java -Djava2d.font.usePlatformFont=true -ms32m -mx32m <classname>

Sin embargo, el texto impreso puede no ser exactamente como se esperaba. Este problema se resolver cuando se arregle el problema con J2SDK 1.2, sin necesidad de actualizar VARPG.

Captulo 19. Consideraciones al compilar para Java

281

282

Programacin con VisualAge RPG

Captulo 20. Llamada a funciones del sistema al compilar para Java


El compilador de VisualAge RPG incluye soporte para la llamada a procedimientos externos implementados como puntos de entrada de funcin en Bibliotecas de Enlace Dinmico (DLL) en la plataforma Windows a travs de la Interfaz Nativa de Java (JNI). En esta seccin se expone el modo de utilizar este soporte. Debe consultar la seccin Java Native Interface (JNI) de la documentacin del Java 2 Software Development Kit (J2SDK) como lectura de requisito previo.

Una llamada sencilla


El primer ejemplo de cdigo muestra una llamada sencilla a un procedimiento externo sin parmetros ni valor de retorno. La aplicacin VisualAge RPG sencilla llama a un procedimiento externo de una biblioteca de enlace dinmico sencilla. La especificacin JNI dicta el nombre de funcin y la interfaz a la funcin nativa a la que debe llamarse. Se codificar una funcin y se compilar en una DLL nueva para que sea el destino de la llamada. Los siguientes ejemplos slo son una demostracin de las funciones nativas codificadas en lenguaje C, aunque los principios de codificacin que se ilustran tambin pueden aplicarse a implementaciones de otros lenguajes. Una vez la funcin nativa tiene el control, tiene total libertad para llamar a otras funciones nativas como, por ejemplo las API del sistema. Codifique un prototipo del procedimiento en VisualAge RPG, especificando la palabra clave DLL para proporcionar el nombre de la DLL que contendr la funcin nativa a la que debe llamarse. Puede codificarse opcionalmente la palabra clave EXTPROC para especificar un nombre de funcin distinto al nombre del procedimiento en el programa VisualAge RPG. Nota: El valor de la palabra clave EXTPROC es sensible a las maysculas y minsculas. Codifique una llamada al procedimiento en el cdigo fuente de VisualAge RPG.

Copyright IBM Corp. 1994, 2000

283

********************************************************************** * Archivo fuente: VCOMP1.VPG * * Demostracin de la llamada a un procedimiento externo mediante JNI. * ********************************************************************** * Declarar un procedimiento llamado 'sub1' que hace referencia a * una funcin llamada 'proc1' de la DLL 'VSUB.DLL' d sub1 pr dll('VSUB') extproc('proc1') dll('VSUB')

* Sin la palabra clave EXTPROC d sub2 pr C C C c C *INZSR BEGSR callp callp seton ENDSR sub1 sub2

lr

* Esta subrutina de accin se enlaza con un evento Create de la ventana. * Hace que el componente finalice tras ejecutar INZSR. C C C CREATE1 BEGACT seton ENDACT LR

Figura 71. Archivo de ejemplo VCOMP1.VPG

En la plataforma Windows, la funcin nativa se codifica de modo que utilice el enlace de programa StdCall. La funcin se codifica como funcin exportada en la DLL. El nombre de la funcin exportada debe coincidir con el nombre que dicta la especificacin JNI. El formato de la especificacin JNI es el siguiente:
Java_VARPGComponentName_ExternalProcedureName_OverloadedNativeMethods

Los nombres completos de las funciones nativas son Java_VCOMP1_proc1 y Java_VCOMP1_SUB2 en este ejemplo. El mtodo nativo sobrecargado no se necesita en este ejemplo. La interfaz JNI dicta los dos primeros parmetros: un puntero a interfaz y un puntero al objeto this. Los parmetros adicionales corresponden a los parmetros declarados de los procedimientos. El archivo de cabecera jni.h se incluye en el programa fuente de lenguaje C para proporcionar las definiciones de interfaz. Este archivo lo proporciona J2SDK. Quizs deba actualizar la variable de entorno INCLUDE en el compilador C para que incluya el directorio que contiene los archivos de cabecera de lenguaje C para J2SDK. Por ltimo, el archivo fuente C de ejemplo se compila en una DLL.

284

Programacin con VisualAge RPG

// Archivo fuente:

VSUB.C

// Aadir (d:\jdk12\include;d:\jdk12\include\win32) al valor INCLUDE para // poder encontrar jni.h al compilar. // Compilado con: IBM VisualAge(TM) para C++ para Windows(R), Versin 3.5 // Mandato de compilacin: icc /q /ss /ge- /fe vsub.dll vsub.c #include <stdio.h> #include <string.h> #include <jni.h> //--------------------------------------------------------------void _Export __stdcall { printf(" llamada a proc1 satisfactoria.\n"); } //--------------------------------------------------------------void _Export __stdcall { } Java_VCOMP1_SUB2( void *je , void *jc) Java_VCOMP1_proc1( void *je , void *jc)

printf(" llamada a SUB2 satisfactoria.\n");

Figura 72. Archivo de ejemplo VSUB.C

Paso y recepcin de parmetros


La especificacin JNI pasa directamente los tipos de datos primitivos de Java, pero VisualAge RPG procesa todos los tipos de datos de VARPG mediante clases. Esto significa que las llamadas de VARPG a las funciones nativas siempre involucrarn el paso de objetos. La especificacin JNI proporciona funciones de interfaz para la funcin nativa, con el fin de acceder a los valores de los objetos pasados. Debido a los distintos mtodos de clase que utiliza cada tipo de datos de VARPG, cada uno de ellos se expondr de forma individual.

Tipos de parmetro
Carcter
VisualAge RPG implementa los campos de tipo carcter como matrices de bytes en Java, incluyendo un campo de tipo carcter de longitud uno. La funcin GetByteArrayElements de la interfaz JNI devuelve el valor del parmetro de matriz de bytes. Puede modificarse el valor y devolverlo a la funcin que efecta la llamada mediante la funcin ReleaseByteArrayElements de la interfaz. Nota: Tras llamar a la funcin de liberacin no debe utilizarse el valor en la funcin nativa. El primer parmetro de la funcin nativa del fuente de lenguaje C se ha cambiado de un puntero void a un puntero JNIEnv. Apunta a una tabla de punteros de funcin para las funciones de la interfaz JNI. Los prototipos de los parmetros del
Captulo 20. Llamada a funciones del sistema al compilar para Java

285

procedimiento externo se aaden a los parmetros de la funcin nativa, despus de los dos punteros JNI estndares. Los parmetros de tipo carcter se declaran como tipos jbyteArray en la funcin nativa. Se utiliza la funcin GetByteArrayElements de la interfaz para obtener el valor de la matriz de bytes Java para el campo de tipo carcter de VARPG. Puede modificarse el valor obtenido y devolverse al llamador Java mediante la funcin ReleaseByteArrayElements de la interfaz. Una vez liberado, no debe accederse al valor obtenido. Nota: Es posible que el valor obtenido sea el valor real del objeto Java, no una copia en memoria. Los cambios efectuados en l pueden reflejarse en el llamador Java aunque no se llame a la funcin de liberacin. Consulte la funcin GetByteArrayElements en la documentacin de JNI para obtener ms informacin.

286

Programacin con VisualAge RPG

********************************************************************** * Archivo fuente: VCOMP1.VPG * * Demostracin de la llamada a un procedimiento externo mediante JNI. * ********************************************************************** * Declarar un procedimiento llamado 'sub1c' que hace referencia a * una funcin llamada 'proc1c' de la DLL 'VSUBC.DLL' * Con 1 parmetro de tipo carcter d sub1c pr d 1 dll('VSUBC') extproc('proc1c')

* Sin la palabra clave EXTPROC * Con 2 parmetros de tipo carcter d sub2c pr dll('VSUBC') d 4 d 10 d c1 d c4 d c10 d mb1 d rc C C C c c c C *INZSR s s s m s BEGSR callp callp sub1c(c1) sub2c(c4:c10) 9 0 1 4 10 inz('J') inz('blue') inz('abcdefghij') style(*info) button(*OK)

* Visualizar los valores cambiados por las llamadas c4 dsply mb1 rc c10 dsply mb1 rc seton ENDSR lr

* Esta subrutina de accin se enlaza con un evento Create de la ventana. * Hace que el componente finalice tras ejecutar INZSR. C C C CREATE1 BEGACT seton ENDACT LR

Figura 73. Archivo de ejemplo VCOMPC.VPG

Captulo 20. Llamada a funciones del sistema al compilar para Java

287

// Archivo fuente: VSUBC.C // Funcin nativa con parmetros de tipo carcter // Compilado con: IBM VisualAge(TM) para C++ para Windows(R), Versin 3.5 // Mandato de compilacin: icc /q /ss /ge- /fe vsubc.dll vsubc.c #include <stdio.h> #include <string.h> #include <jni.h> //--------------------------------------------------------------void _Export __stdcall { Java_VCOMPC_proc1c( JNIEnv *je , void *jc, jbyteArray p1)

char

*c1;

printf(" llamada a proc1c satisfactoria.\n"); c1 = (char *) (*je)->GetByteArrayElements( je, p1, NULL); printf(" c1 = \'%c\'\n", c1[0]); } //--------------------------------------------------------------void _Export __stdcall { char char *c4; *c10; Java_VCOMPC_SUB2C( JNIEnv *je , void *jc, jbyteArray p1, jbyteArray p2)

printf(" llamada a SUB2C satisfactoria.\n"); c4 = (char *) (*je)->GetByteArrayElements( je, p1, NULL); c10 = (char *) (*je)->GetByteArrayElements( je, p2, NULL); printf(" c4 = %.4s.\n", c4); printf(" c10 = %.10s.\n", c10); // Ahora cambiamos los valores memcpy( c4, "Gray", 4); memcpy(c10, ">Received<", 10); // Actualizar los valores y devolverlos al llamador Java // Cuarto parm. = 0 tambin hace que se libere el alm. de la variable, // por lo que no puede accederse a ellas tras llamar a esta funcin.

(*je)->ReleaseByteArrayElements( je, p1, (signed char *) c4, 0); (*je)->ReleaseByteArrayElements( je, p2, (signed char *) c10, 0);

Figura 74. Archivo de ejemplo VSUBC.C

288

Programacin con VisualAge RPG

Numrico con zona


********************************************************************** * Archivo fuente: VCOMPN.VPG * * Demostracin de la llamada a un procedimiento externo mediante JNI. * ********************************************************************** * Con un parmetro Zoned(4,0) d subz pr d * Con un parmetro Packed(9,2) d subp pr d 9P 2 dll('VSUBN')

4S 0

dll('VSUBN')

* Con parmetros Binary(4,0), Binary(9,0) d subb pr dll('VSUBN') d 4B 0 d 9B 0 d d d d z4 p92 b4 b9 s s s s m s *INZSR BEGSR 4S 9P 4B 9B 9 0 2 0 0 0 inz(1234) inz(1234567.89) inz(1234) inz(123456789) style(*info) button(*OK)

d mb1 d rc C C C C

callp subz(z4) callp subp(p92) callp subb(b4:b9) * Visualizar los valores cambiados por las llamadas c z4 dsply mb1 rc c p92 dsply mb1 rc c c c C b4 b9 dsply dsply seton ENDSR mb1 mb1 rc rc lr

* Esta subrutina de accin se enlaza con un evento Create de la ventana. * Hace que el componente finalice tras ejecutar INZSR. C C C CREATE1 BEGACT seton ENDACT LR

Figura 75. Archivo de ejemplo VCOMPN.VPG

Captulo 20. Llamada a funciones del sistema al compilar para Java

289

// Archivo fuente: //

VSUBN.C

Funcin nativa con parmetros de tipo carcter

// Aadir (d:\jdk12\include;d:\jdk12\include\win32) al valor INCLUDE para // poder encontrar jni.h al compilar. // Compilado con: IBM VisualAge(TM) para C++ para Windows(R), Versin 3.5 // Mandato de compilacin: icc /q /ss /ge- /fe vsubn.dll vsubn.c #include <stdio.h> #include <string.h> #include <jni.h> static void SwapBin2( short *b2); static void SwapBin4( int *b4); //--------------------------------------------------------------void _Export __stdcall { Java_VCOMPN_SUBZ( JNIEnv *je , void *jc, jobject p1)

jclass cls; jmethodID mid; jobject aryobj; char *zd; printf(" llamada a SUBZ satisfactoria.\n"); // p1: con zona // Llamar al mtodo para obtener el valor con zona cls = (*je)->GetObjectClass(je, p1); mid = (*je)->GetMethodID( je, cls, "zonedValue", "()[B"); if ( mid == NULL) { printf(" ERROR: GetMethod.\n"); return; } aryobj = (*je)->CallObjectMethod( je, p1, mid); zd = (char *) (*je)->GetByteArrayElements( je, aryobj, NULL); printf(" zd = %.4s.\n", zd);

Figura 76. Archivo de ejemplo VSUBN.C (Pieza 1 de 2)

290

Programacin con VisualAge RPG

// Ahora cambiamos los valores memcpy( zd, "9876", 4); // Devolver el parmetro con zona // 1. Actualizar el objeto matriz de bytes con el valor cambiado. (*je)->ReleaseByteArrayElements( je, aryobj, (signed char *) zd, 0); // 2. Preparar la llamada al mtodo desde la clase RpgNumeric que // toma un objeto de matriz de bytes y asigna su valor al // objeto RpgNumeric. Obtener el ID de mtodo. // cls = (*je)->GetObjectClass(je, p1); // (clS) sigue identificando el segundo parmetro. Reutilizar el valor mid = (*je)->GetMethodID( je, cls, "assignFromNative", "([BII)V"); if ( mid == NULL) { printf(" ERROR 2: GetMethod.\n"); return; } (*je)->CallVoidMethod( je, p1, mid, aryobj, (int) 1, // = Component.ZONED_TYPE 0 // precisin );

Figura 76. Archivo de ejemplo VSUBN.C (Pieza 2 de 2)

Como parmetro se pasa un objeto RpgZoned. Se utiliza el mtodo RpgZoned::zonedValue para obtener una matriz de bytes que contiene el valor numrico del objeto en formato decimal con zona. Una vez se obtiene la matriz de bytes en el lado Java de la interfaz, se llama a la funcin GetByteArrayElements de la interfaz JNI para acceder a la matriz de bytes en el lado nativo de la interfaz. Para invocar el mtodo zonedValue en el objeto, se utilizan las funciones GetObjectClass, GetMethodID y CallObjectMethod de la interfaz. Debe tenerse cuidado a la hora de especificar la firma de mtodo correcta en la llamada a GetMethodID. (Sin parmetros, y sin devolver una matriz de bytes en este caso). Para alterar el valor en el lado Java, se cambia el valor de la matriz de bytes, se invoca la funcin ReleaseByteArrayElements de la interfaz para establecer el cambio efectuado en la matriz de bytes en el lado Java y se invoca en el lado Java el mtodo de clase RpgZoned apropiado para establecer el valor del objeto RpgZoned en el valor representado por la matriz de bytes. En este caso, es el mtodo assignFromNative el que acepta una matriz de bytes y dos enteros como parmetros. (La clase RpgNumeric cuya referencia se resuelve en el cdigo de ejemplo es una clase padre de la clase RpgZoned).

Captulo 20. Llamada a funciones del sistema al compilar para Java

291

Numrico empaquetado
void _Export __stdcall { jclass cls; jmethodID mid; jobject aryobj; char *packednum; printf(" llamada a SUBP satisfactoria.\n"); // p1: empaquetado 9,2 // Llamar al mtodo para obtener el valor con zona cls = (*je)->GetObjectClass(je, p1); mid = (*je)->GetMethodID( je, cls, "packedValue", "()[B"); if ( mid == NULL) { printf(" ERROR: GetMethod.\n"); return; } aryobj = (*je)->CallObjectMethod( je, p1, mid); packednum = (char *) (*je)->GetByteArrayElements( je, aryobj, NULL); // Ahora cambiamos los valores memcpy( packednum, "\x98\x76\x54\x32\x1C", 5); Java_VCOMPN_SUBP( JNIEnv *je , void *jc, jobject p1) // P(9,2)

Figura 77. Archivo de ejemplo VSUBN.C (continuacin) (Pieza 1 de 2)

292

Programacin con VisualAge RPG

// Devolver el parmetro empaquetado // 1. Actualizar el objeto matriz de bytes con el valor cambiado. // Cuarto parm. = 0 tambin hace que se libere el alm. de la variable, // por lo que no puede accederse a ellas tras llamar a esta funcin. (*je)->ReleaseByteArrayElements( je, aryobj, (signed char *) packednum, 0); // 2. Preparar la llamada al mtodo desde la clase RpgNumeric que // toma un objeto de matriz de bytes y asigna su valor al // objeto RpgNumeric. Obtener el ID de mtodo. // cls = (*je)->GetObjectClass(je, p1); // (cls) sigue identificando el segundo parmetro. Reutilizar el valor mid = (*je)->GetMethodID( je, cls, "assignFromNative", "([BII)V"); if ( mid == NULL) { printf(" ERROR 2: GetMethod.\n"); return; } (*je)->CallVoidMethod( je, p1, mid, aryobj, (int) 2, // = Component.PACKED_TYPE 2 // precisin (Nm. de pos. decimales) );

Figura 77. Archivo de ejemplo VSUBN.C (continuacin) (Pieza 2 de 2)

El caso de un parmetro de tipo decimal empaquetado es similar al de decimal con zona. Slo se utilizan los mtodos apropiados para convertir un objeto RpgPacked en un valor de matriz de bytes y viceversa. Se utiliza el mtodo RpgPacked::packedValue para obtener una matriz de bytes que contiene el valor numrico del objeto del parmetro RpgPacked en formato decimal empaquetado nativo y, a continuacin, se invocan las funciones de la interfaz JNI para que la matriz de bytes java sea accesible desde el lado nativo de la interfaz. Tras alterar la matriz de bytes en el lado nativo e invocar la funcin ReleaseByteArrayElements de la interfaz para devolver la matriz de bytes al lado Java, se vuelve a invocar el mtodo assignFromNative para establecer el valor del objeto RpgPacked en la matriz de bytes Java.

Captulo 20. Llamada a funciones del sistema al compilar para Java

293

Binario
void _Export __stdcall { Java_VCOMPN_SUBB( JNIEnv *je , void *jc, jobject p1 // B(4,0) ,jobject p2) // B(9,0)

jclass jmethodID jobject jobject char char short int

cls; mid; aryobj; aryobj2; *binarynum; *b9; binary2; binary4;

printf(" llamada a SUBB satisfactoria.\n"); // p1: binario 4,0

// Llamar al mtodo para obtener el valor binario cls = (*je)->GetObjectClass(je, p1); mid = (*je)->GetMethodID( je, cls, "binaryValue", "()[B"); if ( mid == NULL) { printf(" ERROR: GetMethod.\n"); return; } aryobj = (*je)->CallObjectMethod( je, p1, mid); binarynum = (char *) (*je)->GetByteArrayElements( je, aryobj, NULL); // Debe invertirse el orden de bytes del valor recibido memcpy( &binary2, binarynum, 2); SwapBin2( &binary2); printf(" binary = %hd\n", (short ) binary2); // p2: binario 9,0 // Llamar al mtodo para obtener el valor binario cls = (*je)->GetObjectClass(je, p2); mid = (*je)->GetMethodID( je, cls, "binaryValue", "()[B"); if ( mid == NULL) { printf(" ERROR: GetMethod.\n"); return; } aryobj2 = (*je)->CallObjectMethod( je, p2, mid); b9 = (char *) (*je)->GetByteArrayElements( je, aryobj2, NULL);

Figura 78. Archivo de ejemplo VSUBN.C (continuacin) (Pieza 1 de 4)

294

Programacin con VisualAge RPG

// Debe invertirse el orden de bytes del valor recibido memcpy( &binary4, b9, 4); SwapBin4( &binary4); printf(" binary = %d.\n", (int ) binary4 ); // Ahora cambiamos los valores binary2 = 5; // Intercambiarlo de nuevo para devolver el valor Java SwapBin2( &binary2); memcpy( binarynum, &binary2, 2); // Devolver el parmetro // 1. Actualizar el objeto matriz de bytes con el valor cambiado. // Cuarto parm. = 0 tambin hace que se libere el alm. de la variable, // por lo que no puede accederse a ellas tras llamar a esta funcin. (*je)->ReleaseByteArrayElements( je, aryobj, (signed char *) binarynum, 0); // 2. Preparar la llamada al mtodo desde la clase RpgNumeric que // toma un objeto de matriz de bytes y asigna su valor al // objeto RpgNumeric. Obtener el ID de mtodo. cls = (*je)->GetObjectClass(je, p1); // (cls) sigue identificando el segundo parmetro. Reutilizar el valor mid = (*je)->GetMethodID( je, cls, "assignFromNative", "([BII)V"); if ( mid == NULL) { printf(" ERROR 2: GetMethod.\n"); return; } (*je)->CallVoidMethod( je, p1, mid, aryobj, (int) 3, // = Component.BINARY_TYPE 0 // precisin (Nm. de pos. decimales) );

Figura 78. Archivo de ejemplo VSUBN.C (continuacin) (Pieza 2 de 4)

Captulo 20. Llamada a funciones del sistema al compilar para Java

295

// Ahora cambiamos los valores binary4 = 19981999; // Intercambiarlo de nuevo para devolver el valor Java SwapBin4( &binary4); memcpy( b9, &binary4, 4); // Devolver el parmetro // 1. Actualizar el objeto matriz de bytes con el valor cambiado. // Cuarto parm. = 0 tambin hace que se libere el alm. de la variable, // por lo que no puede accederse a ellas tras llamar a esta funcin. (*je)->ReleaseByteArrayElements( je, aryobj2, (signed char *) b9, 0); // 2. Preparar la llamada al mtodo desde la clase RpgNumeric que // toma un objeto de matriz de bytes y asigna su valor al // objeto RpgNumeric. Obtener el ID de mtodo. cls = (*je)->GetObjectClass(je, p2); // (cls) sigue identificando el segundo parmetro. Reutilizar el valor mid = (*je)->GetMethodID( je, cls, "assignFromNative", "([BII)V"); if ( mid == NULL) { printf(" ERROR 2: GetMethod.\n"); return; } (*je)->CallVoidMethod( je, p2, mid, aryobj2, (int) 3, // = Component.BINARY_TYPE 0 // precisin (Nm. de pos. decimales) );

Figura 78. Archivo de ejemplo VSUBN.C (continuacin) (Pieza 3 de 4)

296

Programacin con VisualAge RPG

//------------------------------------------------------------------static void SwapBin2( short *b2) { char tmp; char *p; p = (char *) b2; tmp = p[0]; p[0] = p[1]; p[1] = tmp; } //------------------------------------------------------------------static void SwapBin4( int *b4) { char tmp; char *p; p = (char *) b4; tmp = p[0]; p[0] = p[3]; p[3] = tmp; tmp = p[1]; p[1] = p[2]; p[2] = tmp;

Figura 78. Archivo de ejemplo VSUBN.C (continuacin) (Pieza 4 de 4)

Este caso es similar al del decimal con zona. Slo se utilizan los mtodos apropiados para los objetos RpgBinary. La nica complicacin aadida es que la plataforma de la arquitectura Intel nativa almacena los enteros binarios en un formato bytes de menor orden a la izquierda, mientras que el lado Java trabaja con un formato bytes de menor orden a la derecha. Se emplean las funciones SwapBin2 y SwapBin4 para invertir el orden de los bytes al convertir los enteros binarios de dos y cuatro bytes de un lado al otro. Se utiliza el mtodo RpgBinary::binaryValue para obtener una matriz de bytes que contiene el valor numrico del objeto del parmetro RpgBinary en formato binario nativo. A continuacin, se invocan las funciones de la interfaz JNI para que la matriz de bytes Java sea accesible desde el lado nativo de la interfaz. Tras alterar la matriz de bytes en el lado nativo e invocar la funcin ReleaseByteArrayElements de la interfaz para devolver la matriz de bytes al lado Java, se vuelve a invocar el mtodo assignFromNative para establecer el valor del objeto RpgBinary en la matriz de bytes Java.

Captulo 20. Llamada a funciones del sistema al compilar para Java

297

Entero, sin signo

* Con parmetros: entero, sin signo d subiu pr dll('VSUBO') d 5i 0 d 10i 0 d 5u 0 d 10u 0

Figura 79. Ejemplo VJNIO.VPG


static void SwapBin2( char *); static void SwapBin4( char *); void _Export __stdcall Java_VJNIO_SUBIU( JNIEnv *je , void *jc, jobject p1, jobject p2, jobject p3, jobject p4) { jclass cls, cls2; jmethodID mid; jshort i2; jint i4; jobject aryobj3, aryobj4; unsigned short *u2; unsigned int *u4; printf(" llamada a SUBIU satisfactoria.\n"); // p1: entero, 2 bytes // Llamar al mtodo para obtener el valor cls = (*je)->GetObjectClass(je, p1); mid = (*je)->GetMethodID( je, cls, "getValue", "()S"); if ( mid == NULL) { printf(" ERROR: GetMethod.\n"); return; } i2 = (*je)->CallShortMethod( je, p1, mid); printf(" i2 = %hd\n", (short) i2); // p2: entero, 4 bytes // Llamar al mtodo para obtener el valor cls = (*je)->GetObjectClass(je, p2); mid = (*je)->GetMethodID( je, cls, "getValue", "()I");

Figura 80. Ejemplo VSUBO.C (Pieza 1 de 6)

298

Programacin con VisualAge RPG

if ( mid == NULL) { printf(" ERROR: GetMethod.\n"); return; } i4 = (*je)->CallIntMethod( je, p2, mid); printf(" i4 = %d\n", (short) i4); // p3: 2 bytes sin signo. // Llamar al mtodo para obtener el valor doble cls = (*je)->GetObjectClass(je, p3); mid = (*je)->GetMethodID( je, cls, "unsignedValue", "()[B"); if ( mid == NULL) { printf(" ERROR: GetMethod.\n"); } return;

aryobj3 = (*je)->CallObjectMethod( je, p3, mid); u2 = (unsigned short *) (*je)->GetByteArrayElements( je, aryobj3, NULL); // Debe invertirse el orden de bytes del valor recibido SwapBin2( (char *) u2); printf(" u2 = %hu\n", *u2 );

Figura 80. Ejemplo VSUBO.C (Pieza 2 de 6)

Captulo 20. Llamada a funciones del sistema al compilar para Java

299

// p4: 4 bytes sin signo. // Llamar al mtodo para obtener el valor doble cls = (*je)->GetObjectClass(je, p4); mid = (*je)->GetMethodID( je, cls, "unsignedValue", "()[B"); if ( mid == NULL) { printf(" ERROR: GetMethod.\n"); return; } aryobj4 = (*je)->CallObjectMethod( je, p4, mid); u4 = (unsigned int *) (*je)->GetByteArrayElements( je, aryobj4, NULL); // Debe invertirse el orden de bytes del valor recibido SwapBin4( (char *) u4); printf(" u4 = %u\n", *u4 );

// Ahora cambiamos los valores i2 = 99; i4 = 88; *u2 = 77; *u4 = 66; // Debe invertirse el orden de bytes del valor que se devuelve SwapBin2( (char *) u2); SwapBin4( (char *) u4); // Devolver la memoria de la matriz a Java. Usada posteriormente // para establecer los valores de retorno de los parmetros (*je)->ReleaseByteArrayElements( je, p3, (signed char *) u2, 0); (*je)->ReleaseByteArrayElements( je, p4, (signed char *) u4, 0);

Figura 80. Ejemplo VSUBO.C (Pieza 3 de 6)

300

Programacin con VisualAge RPG

// Devolver P1: entero 2 bytes // // // Invocar el mtodo RpgShortRef::setValue para establecer el valor del objeto en un valor de parmetro corto Obtener el ID de mtodo para poder invocarlo.

cls = (*je)->GetObjectClass(je, p1); mid = (*je)->GetMethodID( je, cls, "setValue", "(S)V"); if ( mid == NULL) { printf(" ERROR 5: GetMethod.\n"); return; } (*je)->CallVoidMethod( je, p1, mid, i2); // Devolver P2: entero 4 bytes // // // Invocar el mtodo RpgIntRef::setValue para establecer el valor del objeto en un valor de parmetro entero Obtener el ID de mtodo para poder invocarlo.

cls = (*je)->GetObjectClass(je, p2); mid = (*je)->GetMethodID( je, cls, "setValue", "(I)V"); if ( mid == NULL) { printf(" ERROR 6: GetMethod.\n"); return; } (*je)->CallVoidMethod( je, p2, mid, i4);

Figura 80. Ejemplo VSUBO.C (Pieza 4 de 6)

Captulo 20. Llamada a funciones del sistema al compilar para Java

301

// Devolver P3: 2 bytes sin signo // // Invocar el mtodo RpgNumeric::assignFromNative para establecer el valor del objeto en un valor de parmetro sin signo

// Obtener el ID de mtodo para poder invocarlo. cls = (*je)->GetObjectClass(je, p3); mid = (*je)->GetMethodID( je, cls, "assignFromNative", "([BII)V"); if ( mid == NULL) { printf(" ERROR 7: GetMethod.\n"); return; } // Pasar (aryobj3) como primer parmetro del mtodo, ya que ste // espera un objeto de matriz de bytes Java (*je)->CallVoidMethod( je, p3, mid, aryobj3, (int) 5, (int) 0); // Devolver P4: 4 bytes sin signo // // // Invocar el mtodo RpgNumeric::assignFromNative para establecer el valor del objeto en un valor de parmetro sin signo Obtener el ID de mtodo para poder invocarlo. // = Component.UNSIGNED_TYPE // 0 posiciones decimales

cls = (*je)->GetObjectClass(je, p4); mid = (*je)->GetMethodID( je, cls, "assignFromNative", "([BII)V"); if ( mid == NULL) { printf(" ERROR 8: GetMethod.\n"); return; } (*je)->CallVoidMethod( je, p4, mid, aryobj4, (int) 5, // = Component.UNSIGNED_TYPE (int) 0); // 0 posiciones decimales }

Figura 80. Ejemplo VSUBO.C (Pieza 5 de 6)

302

Programacin con VisualAge RPG

static void SwapBin2( char *p) { char tmp; tmp = p[0]; p[0] = p[1]; } p[1] = tmp;

static void SwapBin4( char *p) { char tmp; tmp = p[0]; p[0] = p[3]; p[3] = tmp; tmp = p[1]; p[1] = p[2]; p[2] = tmp;

Figura 80. Ejemplo VSUBO.C (Pieza 6 de 6)

Los enteros de 2 bytes utilizan los mtodos RpgShortRef::getValue y setValue para acceder a sus valores en valores cortos en el lado nativo. De forma similar, los enteros de 4 bytes utilizan los mtodos RpgIntRef::getValue y setValue methods para pasar valores enteros de lado nativo. El paso de parmetros sin signo se complica por la falta de una primitiva Java que coincida con un valor sin signo. Al valor del objeto sin signo se accede a travs de primitivas de matriz de bytes. El acceso al parmetro invoca el mtodo para obtener la matriz de bytes que representa el valor sin signo y, a continuacin, invoca la funcin GetByteArrayElements de la interfaz para acceder a los elementos de la matriz en el lado nativo. Es ms, en una plataforma Intel/Windows nativa, el valor del byte primero debe invertirse para convertirlo al formato bytes de orden bajo ms a la izquierda. Al devolver el parmetro se sigue un proceso inverso.

Flotante (4/8)

* Con parmetros: flotante 4, flotante 8 d subf pr dll('VSUBO') d 4f d 8f

Figura 81. Ejemplo VJNIO.VPG

Captulo 20. Llamada a funciones del sistema al compilar para Java

303

void _Export __stdcall { jclass jmethodID jfloat jdouble cls, cls2; mid; f4; f8;

Java_VJNIO_SUBF(

JNIEnv *je , void *jc, jobject p1, jobject p2)

// p1: Flotante // Llamar al mtodo para obtener el valor flotante cls = (*je)->GetObjectClass(je, p1); mid = (*je)->GetMethodID( je, cls, "getValue", "()F"); if ( mid == NULL) { printf(" ERROR: GetMethod.\n"); } return;

f4 = (*je)->CallFloatMethod( je, p1, mid); printf(" f4 = %f\n", (float) f4); // p2: Doble // Llamar al mtodo para obtener el valor doble cls2 = (*je)->GetObjectClass(je, p2); mid = (*je)->GetMethodID( je, cls2, "getValue", "()D"); if ( mid == NULL) { printf(" ERROR: GetMethod.\n"); return; } f8 = (*je)->CallDoubleMethod( je, p2, mid); printf(" f8 = %lf\n", (double) f8);

Figura 82. Ejemplo VSUBO.C (Pieza 1 de 2)

304

Programacin con VisualAge RPG

// Ahora cambiamos los valores f4 = 999.888; f8 = 98789.65456; // Devolver el parmetro flotante // // // Invocar el mtodo desde la clase RpgFloatRef, que asigna un valor de parmetro flotante al objeto Obtener el ID de mtodo para poder invocarlo.

mid = (*je)->GetMethodID( je, cls, "setValue", "(F)V"); if ( mid == NULL) { printf(" ERROR 2: GetMethod.\n"); } return;

(*je)->CallVoidMethod( je, p1, mid, f4); // Devolver el parmetro doble // // // Invocar el mtodo desde la clase RpgDoubleRef, que asigna un valor de parmetro doble al objeto Obtener el ID de mtodo para poder invocarlo.

mid = (*je)->GetMethodID( je, cls2, "setValue", "(D)V"); if ( mid == NULL) { printf(" ERROR 2: GetMethod.\n"); return; } } (*je)->CallVoidMethod( je, p2, mid, f8);

Figura 82. Ejemplo VSUBO.C (Pieza 2 de 2)

Los casos de parmetros flotante y doble son similares a los de los anteriores tipos de datos. Slo los mtodos para acceder a los valores del parmetro funcionan con los tipos de datos primitivos de Java, que se correlacionan con las correspondientes primitivas nativas, en lugar de las matrices de bytes habituales. Se utilizan las funciones de la interfaz JNI que trabajan con estas primitivas especficas para invocar los mtodos que sirven para acceder a los valores de los parmetros. Se utilizan los mtodos RpgFloatRef::getValue, setValue, RpgDoubleRef::getValue y setValue.

Captulo 20. Llamada a funciones del sistema al compilar para Java

305

Fecha, hora, indicacin de la hora


* Con parmetros: fecha, hora, indicacin de la hora d subdtz pr dll('VSUBO') d 10d d 8t d 26z d fd d ft d fts C s s s callp 10d 8t 26z inz(D'1999-12-31') inz(T'09.00.00') inz(Z'2001-01-01-08.01.01')

subdtz(fd:ft:fts)

Figura 83. Ejemplo VJNIO.VPG


void _Export __stdcall Java_VJNIO_SUBDTZ( JNIEnv *je , void *jc, jbyteArray p1, jbyteArray p2, jbyteArray p3) { char *fd, *ft, *fz; fd ft fz = (char *) (*je)->GetByteArrayElements( je, p1, NULL); = (char *) (*je)->GetByteArrayElements( je, p2, NULL); = (char *) (*je)->GetByteArrayElements( je, p3, NULL);

printf(" fd = %.10s.\n", fd); printf(" ft = %.8s.\n", ft); printf(" fz = %.26s.\n", fz); // Ahora cambiamos los valores memcpy( fd, "2000-01-01",10); memcpy( ft, "17.00.00", 8); memcpy( fz, "2222-22-22-02.02.02", 19); // Actualizar los valores y devolverlos al llamador Java // Cuarto parm. = 0 tambin hace que se libere el alm. de la variable, // por lo que no puede accederse a ellas tras llamar a esta funcin. (*je)->ReleaseByteArrayElements( je, p1, (signed char *) fd, 0); (*je)->ReleaseByteArrayElements( je, p2, (signed char *) ft, 0); (*je)->ReleaseByteArrayElements( je, p3, (signed char *) fz, 0); }

Figura 84. Ejemplo VSUBO.C

Los parmetros de fecha, hora e indicacin de la hora funcionan del mismo modo que los parmetros de tipo carcter, ya que en el lado Java se implementan como matrices de bytes.

Paso de matrices
El manejo de matrices de parmetros se realiza de dos modos, en funcin del tipo de datos. Debe invocarse la funcin GetObjectArrayElement de la interfaz para obtener la direccin de un elemento de objeto individual de la matriz y, a continuacin, procesarlo del mismo modo que los mtodos de parmetros escalares. En el caso de una matriz de primitivas Java, existen funciones especficas de la interfaz para acceder a ellas como matrices de primitivas nativas y, a

306

Programacin con VisualAge RPG

continuacin, devolverlas a Java y liberarlas.


d subca d d d c1 d c4 d c10 d subz d d subp d d subb d d d d d d z4 p92 b4 b9 pr pr 4 10 1 4 10 dll('VSUBA') dim(4) inz('J') inz('blue') inz('abcdefghij') dim(4)

s s s pr pr

dll('VSUBA') 4S 0 dim(4) dll('VSUBA') 9P 2 dim(4) dll('VSUBA') 4B 0 dim(4) 9B 0 dim(4) 4S 9P 4B 9B 0 2 0 0 dim(4) dim(4) dim(4) dim(4) dll('VSUBA') 4f 8f dim(4) dim(4)

s s s s pr

d subf d d

Figura 85. Ejemplo VJNIA.VPG (Pieza 1 de 2)

Captulo 20. Llamada a funciones del sistema al compilar para Java

307

d subdtz d d d d subiu d d d d d d d d d f4 f8 fd ft fts

pr

10d 8t 26z

dll('VSUBA') dim(4) dim(4) dim(4)

pr

dll('VSUBA') 5i 0 dim(4) 10i 0 dim(4) 5u 0 dim(4) 10u 0 dim(4)

s s s s s s s s s *INZSR BEGSR callp callp callp callp callp callp callp seton ENDSR

4f 8f 10d 8t 26z

dim(4) dim(4) dim(4) dim(4) dim(4)

inz(1234.56) inz(1111.2222) inz(D'1999-12-31') inz(T'09.00.00') inz(Z'2001-01-01-08.01.01')

d fi2 d fi4 d fu2 d fu4 C C C C C C C C c C

5i 0 dim(4) inz(1) 10i 0 dim(4) inz(2) 5u 0 dim(4) inz(3) 10u 0 dim(4) inz(4)

subca(c4:c10) subz(z4) subp(p92) subb(b4:b9) subf(f4:f8) subdtz(fd:ft:fts) subiu(fi2:fi4:fu2:fu4) lr

Figura 85. Ejemplo VJNIA.VPG (Pieza 2 de 2)

308

Programacin con VisualAge RPG

// Archivo fuente: VSUBA.C // Funcin nativa con parmetros de tipo carcter // Aadir (d:\jdk12\include;d:\jdk12\include\win32) al valor INCLUDE para // poder encontrar jni.h al compilar. // Compilado con: IBM VisualAge(TM) para C++ para Windows(R), Versin 3.5 // Mandato de compilacin: icc /q /ss /ge- /fe vsuba.dll vsuba.c #include <stdio.h> #include <string.h> #include <jni.h> static void SwapBin2( char *); static void SwapBin4( char *); void _Export __stdcall { Java_VJNIA_SUBCA( JNIEnv *je , void *jc, jbyteArray p1, jobjectArray p2) char *c4; char *c10; jobject p2e; // Resolver el segundo elemento del parmetro de matriz p2e = (*je)->GetObjectArrayElement( je, p2, 1); /* nd. matriz 1er elem. = 0. c4 = (char *) (*je)->GetByteArrayElements( je, p1, NULL); c10 = (char *) (*je)->GetByteArrayElements( je, p2e, NULL); printf(" c4 = %.4s.\n", c4);

*/

printf(" c10 = %.10s.\n", c10); // Ahora cambiamos los valores memcpy( c4, "Gray", 4); memcpy(c10, "Changed ", 10); // Actualizar los valores y devolverlos al llamador Java (*je)->ReleaseByteArrayElements( je, p1, (signed char *) c4, 0); (*je)->ReleaseByteArrayElements( je, p2e, (signed char *) c10, 0); Java_VJNIA_SUBZ( JNIEnv *je , void *jc, jobject p1)

void _Export __stdcall

Figura 86. Ejemplo VSUBA.C (Pieza 1 de 14)

Captulo 20. Llamada a funciones del sistema al compilar para Java

309

jclass cls; jmethodID mid; jobject aryobj; char *zd; jobject pe; // Resolver el elemento del parmetro de matriz pe = (*je)->GetObjectArrayElement( je, p1, 0); /* nd. matriz 1er elem. = 0. // p1: con zona // Llamar al mtodo para obtener el valor con zona cls = (*je)->GetObjectClass(je, pe); mid = (*je)->GetMethodID( je, cls, "zonedValue", "()[B"); aryobj = (*je)->CallObjectMethod( je, pe, mid); zd = (char *) (*je)->GetByteArrayElements( je, aryobj, NULL); printf(" zd = %.4s.\n", zd); // Ahora cambiamos los valores memcpy( zd, "9876", 4); // Devolver el parmetro con zona // 1. Actualizar el objeto matriz de bytes con el valor cambiado. (*je)->ReleaseByteArrayElements( je, aryobj, (signed char *) zd, 0);

*/

Figura 86. Ejemplo VSUBA.C (Pieza 2 de 14)

310

Programacin con VisualAge RPG

// 2. Preparar la llamada al mtodo desde la clase RpgNumeric que // // toma un objeto de matriz de bytes y asigna su valor al objeto RpgNumeric. Obtener el ID de mtodo.

// cls = (*je)->GetObjectClass(je, p1); // (clS) sigue identificando el segundo parmetro. Reutilizar el valor mid = (*je)->GetMethodID( je, cls, "assignFromNative", "([BII)V"); (*je)->CallVoidMethod( je, pe, mid, aryobj, (int) 1, // = Component.ZONED_TYPE 0 // precisin } void _Export __stdcall { ); Java_VJNIA_SUBP( JNIEnv *je , void *jc, jobject p1 // P(9,2) )

jclass cls; jmethodID mid; jobject aryobj; char *packednum; char tmp[80]; jobject pe;

// Para rastreo

// Resolver el elemento del parmetro de matriz pe = (*je)->GetObjectArrayElement( je, p1, 1); /* nd. matriz 1er elem. = 0. */

// p1: empaquetado 9,2 // Llamar al mtodo para obtener el valor con zona cls = (*je)->GetObjectClass(je, pe); mid = (*je)->GetMethodID( je, cls, "packedValue", "()[B"); aryobj = (*je)->CallObjectMethod( je, pe, mid); packednum = (char *) (*je)->GetByteArrayElements( je, aryobj, NULL);

Figura 86. Ejemplo VSUBA.C (Pieza 3 de 14)

Captulo 20. Llamada a funciones del sistema al compilar para Java

311

// Ahora cambiamos los valores memcpy( packednum, "\x98\x76\x54\x32\x1C", 5); // Devolver el parmetro empaquetado // 1. Actualizar el objeto matriz de bytes con el valor cambiado. // Cuarto parm. = 0 tambin hace que se libere el alm. de la variable, // por lo que no puede accederse a ellas tras llamar a esta funcin. (*je)->ReleaseByteArrayElements( je, aryobj, (signed char *) packednum, 0); // 2. Preparar la llamada al mtodo desde la clase RpgNumeric que // toma un objeto de matriz de bytes y asigna su valor al // objeto RpgNumeric. Obtener el ID de mtodo.

// cls = (*je)->GetObjectClass(je, p1); // (clS) sigue identificando el segundo parmetro. Reutilizar el valor mid = (*je)->GetMethodID( je, cls, "assignFromNative", "([BII)V"); (*je)->CallVoidMethod( je, pe, mid, aryobj, (int) 2, // = Component.PACKED_TYPE 2 // precisin (Nm. de pos. decimales) ); } //---------------------------------------------------------------

Figura 86. Ejemplo VSUBA.C (Pieza 4 de 14)

312

Programacin con VisualAge RPG

void _Export __stdcall

Java_VJNIA_SUBB( JNIEnv *je , void *jc, jobject p1 // B(4,0) ,jobject p2 // B(9,0) )

jclass cls; jmethodID mid; jobject aryobj; jobject aryobj2; char *binarynum; char *b9; short int jobject binary2; binary4; pe,p2e;

// Resolver el elemento del parmetro de matriz pe = (*je)->GetObjectArrayElement( je, p1, 2); /* nd. matriz 1er elem. = 0. // Resolver el elemento del parmetro de matriz p2e = (*je)->GetObjectArrayElement( je, p2, 3); /* nd. matriz 1er elem. = 0. // p1: binario 4,0 */ */

// Llamar al mtodo para obtener el valor binario cls = (*je)->GetObjectClass(je, pe); mid = (*je)->GetMethodID( je, cls, "binaryValue", "()[B"); aryobj = (*je)->CallObjectMethod( je, pe, mid); binarynum = (char *) (*je)->GetByteArrayElements( je, aryobj, NULL);

Figura 86. Ejemplo VSUBA.C (Pieza 5 de 14)

Captulo 20. Llamada a funciones del sistema al compilar para Java

313

// Debe invertirse el orden de bytes del valor recibido memcpy( &binary2, binarynum, 2); SwapBin2( (char *) &binary2); printf(" binary = %hd\n", (short ) binary2); // p2: binario 9,0 // Llamar al mtodo para obtener el valor binario cls = (*je)->GetObjectClass(je, p2e); mid = (*je)->GetMethodID( je, cls, "binaryValue", "()[B"); aryobj2 = (*je)->CallObjectMethod( je, p2e, mid); b9 = (char *) (*je)->GetByteArrayElements( je, aryobj2, NULL); // Debe invertirse el orden de bytes del valor recibido memcpy( &binary4, b9, 4); SwapBin4( (char *) &binary4); printf(" binary = %d.\n", (int ) binary4 ); // Ahora cambiamos los valores binary2 = 5; // Intercambiarlo de nuevo para devolver el valor Java SwapBin2( (char *) &binary2);

Figura 86. Ejemplo VSUBA.C (Pieza 6 de 14)

314

Programacin con VisualAge RPG

memcpy( binarynum, &binary2, 2); // Devolver el parmetro empaquetado // 1. Actualizar el objeto matriz de bytes con el valor cambiado. // Cuarto parm. = 0 tambin hace que se libere el alm. de la variable, // por lo que no puede accederse a ellas tras llamar a esta funcin. (*je)->ReleaseByteArrayElements( je, aryobj, (signed char *) binarynum, 0); // 2. Preparar la llamada al mtodo desde la clase RpgNumeric que // toma un objeto de matriz de bytes y asigna su valor al // objeto RpgNumeric. Obtener el ID de mtodo. cls = (*je)->GetObjectClass(je, pe); // (clS) sigue identificando el segundo parmetro. Reutilizar el valor mid = (*je)->GetMethodID( je, cls, "assignFromNative", "([BII)V"); (*je)->CallVoidMethod( je, pe, mid, aryobj, (int) 3, // = Component.BINARY_TYPE 0 // precisin (Nm. de pos. decimales) ); // Ahora cambiamos los valores binary4 = 19981999; // Intercambiarlo de nuevo para devolver el valor Java SwapBin4( (char *) &binary4); memcpy( b9, &binary4, 4);

Figura 86. Ejemplo VSUBA.C (Pieza 7 de 14)

Captulo 20. Llamada a funciones del sistema al compilar para Java

315

// Devolver el parmetro empaquetado // 1. Actualizar el objeto matriz de bytes con el valor cambiado. // Cuarto parm. = 0 tambin hace que se libere el alm. de la variable, // por lo que no puede accederse a ellas tras llamar a esta funcin. (*je)->ReleaseByteArrayElements( je, aryobj2, (signed char *) b9, 0); // 2. Preparar la llamada al mtodo desde la clase RpgNumeric que // toma un objeto de matriz de bytes y asigna su valor al // objeto RpgNumeric. Obtener el ID de mtodo.

cls = (*je)->GetObjectClass(je, p2e); // (clS) sigue identificando el segundo parmetro. Reutilizar el valor mid = (*je)->GetMethodID( je, cls, "assignFromNative", "([BII)V"); (*je)->CallVoidMethod( je, p2e, mid, aryobj2, (int) 3, // = Component.BINARY_TYPE 0 // precisin (Nm. de pos. decimales) } );

//---------------------------------------------------------------

Figura 86. Ejemplo VSUBA.C (Pieza 8 de 14)

316

Programacin con VisualAge RPG

void _Export __stdcall { jclass jmethodID jfloat jdouble jobject cls, cls2; mid; *f4; *f8; p1e,p2e;

Java_VJNIA_SUBF(

JNIEnv *je , void *jc, jfloatArray p1, jdoubleArray p2)

printf(" llamada a SUBF satisfactoria.\n"); f4 f8 = = (*je)->GetFloatArrayElements( je, p1, NULL); (*je)->GetDoubleArrayElements( je, p2, NULL);

printf(" f4 = %f\n", (float) f4[0]); // p2: Doble // Llamar al mtodo para obtener el valor doble printf(" f8 = %lf\n", (double) f8[0]); // Ahora cambiamos los valores f4[0] = 999.888; f8[1] = 98789.65456; // Devolver el parmetro flotante (*je)->ReleaseFloatArrayElements( je, p1, f4, 0); (*je)->ReleaseDoubleArrayElements( je, p2, f8, 0); }

Figura 86. Ejemplo VSUBA.C (Pieza 9 de 14)

Captulo 20. Llamada a funciones del sistema al compilar para Java

317

//--------------------------------------------------------------void _Export __stdcall Java_VJNIA_SUBDTZ( JNIEnv *je , void *jc, jbyteArray p1, jbyteArray p2, jbyteArray p3) { char *fd, *ft, *fz; jobject p1e, p2e, p3e; printf(" llamada a SUBDTZ satisfactoria.\n"); // Resolver el elemento del parmetro de matriz p1e = (*je)->GetObjectArrayElement( je, p1, 2); /* nd. matriz 1er elem. = 0. p2e = (*je)->GetObjectArrayElement( je, p2, 3); /* nd. matriz 1er elem. = 0. p3e = (*je)->GetObjectArrayElement( je, p3, 0); /* nd. matriz 1er elem. = 0. fd ft fz = (char *) (*je)->GetByteArrayElements( je, p1e, NULL); = (char *) (*je)->GetByteArrayElements( je, p2e, NULL); = (char *) (*je)->GetByteArrayElements( je, p3e, NULL); */

*/ */

printf(" fd = %.10s.\n", fd); printf(" ft = %.8s.\n", ft); printf(" fz = %.26s.\n", fz); // Ahora cambiamos los valores memcpy( fd, "2000-01-01",10); memcpy( ft, "17.00.00", 8); memcpy( fz, "2222-22-22-02.02.02", 19); // Actualizar los valores y devolverlos al llamador Java (*je)->ReleaseByteArrayElements( je, p1e, (signed char *) fd, 0); (*je)->ReleaseByteArrayElements( je, p2e, (signed char *) ft, 0); (*je)->ReleaseByteArrayElements( je, p3e, (signed char *) fz, 0); }

Figura 86. Ejemplo VSUBA.C (Pieza 10 de 14)

318

Programacin con VisualAge RPG

//--------------------------------------------------------------void _Export __stdcall Java_VJNIA_SUBIU( JNIEnv *je , void *jc, jshortArray p1, jintArray p2, jobject p3, jobject p4) { jclass cls, cls2; jmethodID mid; jshort *i2; jint *i4; jobject aryobj3, aryobj4; unsigned short *u2; unsigned int *u4; jobject p1e, p2e, p3e, p4e; printf(" llamada a SUBIU satisfactoria.\n"); // Resolver el elemento del parmetro de matriz i2 i4 = = (*je)->GetShortArrayElements( je, p1, NULL); (*je)->GetIntArrayElements( je, p2, NULL);

p3e = (*je)->GetObjectArrayElement( je, p3, 2); p4e = (*je)->GetObjectArrayElement( je, p4, 3); printf(" i2 = %hd\n", (short) i2[0]); printf(" i4 = %d\n", (short) i4[1]); // p3: 2 bytes sin signo. // Llamar al mtodo para obtener el valor doble cls = (*je)->GetObjectClass(je, p3e); mid = (*je)->GetMethodID( je, cls, "unsignedValue", "()[B"); aryobj3 = (*je)->CallObjectMethod( je, p3e, mid); u2 = (unsigned short *) (*je)->GetByteArrayElements( je, aryobj3, NULL);

Figura 86. Ejemplo VSUBA.C (Pieza 11 de 14)

Captulo 20. Llamada a funciones del sistema al compilar para Java

319

// Debe invertirse el orden de bytes del valor recibido SwapBin2( (char *) u2); printf(" u2 = %hu\n", *u2 ); // p4: 4 bytes sin signo. // Llamar al mtodo para obtener el valor doble cls = (*je)->GetObjectClass(je, p4e); mid = (*je)->GetMethodID( je, cls, "unsignedValue", "()[B"); aryobj4 = (*je)->CallObjectMethod( je, p4e, mid); u4 = (unsigned int *) (*je)->GetByteArrayElements( je, aryobj4, NULL); // Debe invertirse el orden de bytes del valor recibido SwapBin4( (char *) u4); printf(" u4 = %u\n", *u4 );

Figura 86. Ejemplo VSUBA.C (Pieza 12 de 14)

320

Programacin con VisualAge RPG

// Ahora cambiamos los valores i2[0] = 99; i4[1] = 88; *u2 = 77; *u4 = 66; // Debe invertirse el orden de bytes del valor que se devuelve SwapBin2( (char *) u2); SwapBin4( (char *) u4); // Devolver la memoria de la matriz a Java. Usada posteriormente // para establecer los valores de retorno de los parmetros (*je)->ReleaseByteArrayElements( je, p3e, (signed char *) u2, 0); (*je)->ReleaseByteArrayElements( je, p4e, (signed char *) u4, 0); (*je)->ReleaseShortArrayElements( je, p1, i2, 0); (*je)->ReleaseIntArrayElements( je, p2, i4, 0);

// Devolver P3: 2 bytes sin signo // // Invocar el mtodo RpgNumeric::assignFromNative para establecer el valor del objeto en un valor de parmetro sin signo

// Obtener el ID de mtodo para poder invocarlo. cls = (*je)->GetObjectClass(je, p3e); mid = (*je)->GetMethodID( je, cls, "assignFromNative", "([BII)V"); // Pasar (aryobj3) como primer parmetro del mtodo, ya que ste // espera un objeto de matriz de bytes Java (*je)->CallVoidMethod( je, p3e, mid, aryobj3, (int) 5, (int) 0);

// = Component.UNSIGNED_TYPE // 0 posiciones decimales

Figura 86. Ejemplo VSUBA.C (Pieza 13 de 14)

Captulo 20. Llamada a funciones del sistema al compilar para Java

321

// Devolver P4: 4 bytes sin signo // // // Invocar el mtodo RpgNumeric::assignFromNative para establecer el valor del objeto en un valor de parmetro sin signo Obtener el ID de mtodo para poder invocarlo.

cls = (*je)->GetObjectClass(je, p4e); mid = (*je)->GetMethodID( je, cls, "assignFromNative", "([BII)V"); (*je)->CallVoidMethod( je, p4e, mid, aryobj4, (int) 5, // = Component.UNSIGNED_TYPE (int) 0); // 0 posiciones decimales

static void SwapBin2( char *p) { char tmp; tmp = p[0]; p[0] = p[1]; p[1] = tmp;

static void SwapBin4( char *p) { char tmp;

tmp = p[0]; p[0] = p[3]; p[3] = tmp; tmp = p[1]; p[1] = p[2]; p[2] = tmp;

Figura 86. Ejemplo VSUBA.C (Pieza 14 de 14)

Devolucin de un valor de tipo carcter


d subrc d fc C pr s eval 10 10 dll('VSUBR') inz('ibm varpg ')

fc = subrc

Figura 87. Ejemplo VJNIR.VPG

322

Programacin con VisualAge RPG

jbyteArray _Export __stdcall { jbyteArray ba; char *p;

Java_VJNIR_SUBRC(

JNIEnv *je , void *jc)

printf(" llamada a SUBRC satisfactoria.\n"); // Crear un nuevo objeto de matriz de bytes para poder devolverlo. ba = (*je)->NewByteArray( je, 10 /* = longitud matriz bytes */ ); // Pinchar la memoria del elemento de la matriz de bytes para que // el lado nativo pueda acceder a ella. p = (char *) (*je)->GetByteArrayElements( je, ba, NULL); memcpy( p, "Satisfactorio ",10);

// Actualizar los valores y devolverlos al llamador Java // Cuarto parm. = 0 tambin hace que se libere el alm. de la variable, // por lo que no puede accederse a ellas tras llamar a esta funcin. (*je)->ReleaseByteArrayElements( je, ba, (signed char *) p, 0); } return ba;

Figura 88. Ejemplo VSUBR.C

La devolucin de un valor desde la funcin implica la obtencin del objeto Java apropiado y, despus, devolverlo. En este ejemplo, se crea un objeto nuevo (que coincide con un campo Character(10)) y, a continuacin, se asigna su valor. Ya que los campos de tipo carcter de RPG se implementan como matrices de bytes Java, se crea un objeto de matriz de bytes Java con una longitud de 10, luego se utiliza la funcin GetByteArrayElements de la interfaz para acceder a los elementos de la matriz de bytes en el lado nativo, despus se liberan y se devuelven a Java y, por ltimo, se utilizan para devolverlo desde la funcin. Si el objeto de matriz de bytes Java apropiado ya estaba disponible en uno de los parmetros de entrada, podra haberse utilizado ste en lugar de crear un objeto nuevo.

Devolucin de un valor de tipo decimal con zona


d subrs d fs C pr s eval 5s 0 dll('VSUBR') 5s 0 fc = subrc

Figura 89. Ejemplo VJNIR.VPG

Captulo 20. Llamada a funciones del sistema al compilar para Java

323

jobject _Export __stdcall { jclass cls; jmethodID mid; jobject rzo; jbyteArray ba; char *p;

Java_VJNIR_SUBRS( JNIEnv *je , void *jc)

printf(" llamada a SUBRS satisfactoria.\n"); // Crear un nuevo objeto RpgZoned. cls = (*je)->FindClass( je, "com/ibm/varpg/rpgruntime/RpgZoned"); mid = (*je)->GetMethodID( je, cls, "<init>", "(II)V"); rzo = (*je)->NewObject( je, cls, mid, (int) 5, /* nm. de dgitos */ ); // // // // // (int) 0 /* nm. de posiciones decimales */

Para establecer el valor del objeto decimal con zona, necesitamos una matriz de bytes Java para utilizarla como parmetro de entrada del mtodo para establecer el objeto decimal con zona. Puede construirse un objeto de matriz de bytes nuevo u obtener uno recuperando el valor decimal con zona del objeto.

// Construir una matriz de bytes. // Crear un objeto de matriz de bytes nuevo ba = (*je)->NewByteArray( je, 5 /* = longitud matriz bytes */ ); // Pinchar la memoria del elemento de la matriz de bytes para que // el lado nativo pueda acceder a ella. p = (char *) (*je)->GetByteArrayElements( je, ba, NULL);

memcpy( p, "55555", 5);

Figura 90. Ejemplo VSUBR.C (Pieza 1 de 2)

324

Programacin con VisualAge RPG

// Actualizar los valores y devolverlos al llamador Java // Cuarto parm. = 0 tambin hace que se libere el alm. de la variable, // por lo que no puede accederse a ellas tras llamar a esta funcin. (*je)->ReleaseByteArrayElements( je, ba, (signed char *) p, 0); // Preparar la llamada al mtodo desde la clase RpgNumeric que // // toma un objeto de matriz de bytes y asigna su valor al objeto RpgNumeric. Obtener el ID de mtodo.

// cls = (*je)->GetObjectClass(je, p1); // (cls) sigue identificando el segundo parmetro. Reutilizar el valor mid = (*je)->GetMethodID( je, cls, "assignFromNative", "([BII)V"); (*je)->CallVoidMethod( je, rzo, mid, ba, (int) 1, // = Component.ZONED_TYPE 0 // precisin return rzo; );

Figura 90. Ejemplo VSUBR.C (Pieza 2 de 2)

Se construye un objeto RpgZoned para poder devolverlo. A continuacin, se establece su valor mediante una llamada a mtodo. Sin embargo, el mtodo para establecer el valor necesita un objeto de matriz de bytes como parmetro de entrada que suministre el valor, por lo que primero se construye el objeto de matriz de bytes. El objeto RpgZoned se construye averiguando la clase, a continuacin, el mtodo constructor de la clase y, por ltimo invocando el mtodo constructor. A continuacin se construye un objeto de matriz de bytes y se establece en un valor de bytes con formato decimal con zona. Luego se resuelve un mtodo para establecer el valor del objeto RpgZoned y se invoca, pasndole el objeto de matriz de bytes como uno de sus parmetros.

Devolucin de un valor de tipo empaquetado


d subrp d fp C pr s eval 5p 0 dll('VSUBR') 5p 0 fp = subrp

Figura 91. Ejemplo VJNIR.VPG

Captulo 20. Llamada a funciones del sistema al compilar para Java

325

jobject _Export __stdcall { jclass cls; jmethodID mid; jobject ro; jbyteArray ba; char *p;

Java_VJNIR_SUBRP( JNIEnv *je , void *jc)

printf(" llamada a SUBRP satisfactoria.\n"); // Crear un nuevo objeto RpgPacked. cls = (*je)->FindClass( je, "com/ibm/varpg/rpgruntime/RpgPacked"); mid = (*je)->GetMethodID( je, cls, "<init>", "(II)V"); ro = (*je)->NewObject( je, cls, mid, (int) 5, /* nm. de dgitos */ ); // // // // // (int) 0 /* nm. de posiciones decimales */

Para establecer el valor del objeto decimal empaquetado, necesitamos una matriz de bytes Java para utilizarla como parmetro de entrada del mtodo para establecer el objeto decimal empaquetado. Puede construirse un objeto de matriz de bytes nuevo u obtener uno recuperando el valor decimal empaquetado del objeto.

// Crear un objeto de matriz de bytes nuevo ba = (*je)->NewByteArray( je, 3 /* = longitud matriz bytes */ );

Figura 92. Ejemplo VSUBR.C (Pieza 1 de 2)


// Pinchar la memoria del elemento de la matriz de bytes para que // el lado nativo pueda acceder a ella. p = (char *) (*je)->GetByteArrayElements( je, ba, NULL);

memcpy( p, "\x55\x55\x5C", 3); // Actualizar los valores y devolverlos al llamador Java (*je)->ReleaseByteArrayElements( je, ba, (signed char *) p, 0); // Preparar la llamada al mtodo desde la clase RpgNumeric que // toma un objeto de matriz de bytes y asigna su valor al // objeto RpgNumeric. Obtener el ID de mtodo. mid = (*je)->GetMethodID( je, cls, "assignFromNative", "([BII)V"); (*je)->CallVoidMethod( je, ro, mid, ba, // El objeto de matriz de bytes (int) 2, // = Component.PACKED_TYPE 0 // posiciones decimales ); return ro;

Figura 92. Ejemplo VSUBR.C (Pieza 2 de 2)

326

Programacin con VisualAge RPG

La devolucin de un valor decimal empaquetado es similar al caso de un valor decimal con zona ilustrado ms arriba. El objeto RpgPacked se construye averiguando la clase, a continuacin, el mtodo constructor de la clase y, por ltimo invocando el mtodo constructor. A continuacin se construye un objeto de matriz de bytes y se establece en un valor de bytes con formato decimal empaquetado. Luego se resuelve un mtodo para establecer el valor del objeto RpgPacked y se invoca, pasndole el objeto de matriz de bytes como uno de sus parmetros.

Devolucin de un valor de tipo binario

d subrb d fb C

pr s eval

5b 0 dll('VSUBR') 5b 0 fb = subrb

Figura 93. Ejemplo VJNIR.VPG


jobject _Export __stdcall { jclass cls; jmethodID mid; jobject ro; jbyteArray ba; char *p; printf(" llamada a SUBRB satisfactoria.\n"); // Crear un nuevo objeto RpgPacked. cls = (*je)->FindClass( je, "com/ibm/varpg/rpgruntime/RpgBinary"); mid = (*je)->GetMethodID( je, cls, "<init>", "(II)V"); ro = (*je)->NewObject( je, cls, mid, (int) 5, /* nm. de dgitos */ ); (int) 0 /* nm. de posiciones decimales */ Java_VJNIR_SUBRB( JNIEnv *je , void *jc)

Figura 94. Ejemplo VSUBR.C (Pieza 1 de 2)

Captulo 20. Llamada a funciones del sistema al compilar para Java

327

// Para establecer el valor del objeto, necesitamos // una matriz de bytes Java para utilizarla como parmetro de entrada // del mtodo para establecer el objeto. // Crear un objeto de matriz de bytes nuevo ba = (*je)->NewByteArray( je, 4 /* = longitud matriz bytes */ ); // Pinchar la memoria del elemento de la matriz de bytes para que // el lado nativo pueda acceder a ella. p = (char *) (*je)->GetByteArrayElements( je, ba, NULL); // 55555 = 0xD903

memcpy( p, "\x00\x00\xD9\x03", 4);

// Actualizar los valores y devolverlos al llamador Java (*je)->ReleaseByteArrayElements( je, ba, (signed char *) p, 0); // Preparar la llamada al mtodo desde la clase RpgNumeric que // toma un objeto de matriz de bytes y asigna su valor al // objeto RpgNumeric. Obtener el ID de mtodo. mid = (*je)->GetMethodID( je, cls, "assignFromNative", "([BII)V"); (*je)->CallVoidMethod( je, ro, mid, ba, // El objeto de matriz de bytes (int) 3, // = Component.Binary_TYPE 0 // posiciones decimales ); return ro;

Figura 94. Ejemplo VSUBR.C (Pieza 2 de 2)

La devolucin de un valor binario es similar a la de los casos anteriores para los decimales con zona y empaquetados, slo que se devuelve un objeto RpgBinary.

Devolucin de un valor de tipo entero


d subri2 d subri4 d fi2 d fi4 C C pr pr s s eval eval 5i 0 dll('VSUBR') 10i 0 dll('VSUBR') 5i 0 10i 0 fi2= subri2 fi4= subri4

Figura 95. Ejemplo VJNIR.VPG

328

Programacin con VisualAge RPG

jshort _Export __stdcall { jshort rc; rc = -5555; return rc; } jint _Export __stdcall { return -55555; }

Java_VJNIR_SUBRI2( JNIEnv *je , void *jc)

Java_VJNIR_SUBRI4( JNIEnv *je , void *jc)

Figura 96. Ejemplo VSUBR.C

La devolucin de un valor entero binario de 2 o 4 bytes es sencilla. Esto se debe a que los tipos se soportan como primitivas Java.

Devolucin de un valor entero sin signo

d subru d fu C

pr s eval

10u 0 dll('VSUBR') 10u 0 fu = subru

Figura 97. Ejemplo VJNIR.VPG

Captulo 20. Llamada a funciones del sistema al compilar para Java

329

jobject _Export __stdcall { jclass cls; jmethodID mid; jobject ro; jbyteArray ba; char *p;

Java_VJNIR_SUBRU( JNIEnv *je , void *jc)

printf(" llamada a SUBRU satisfactoria.\n"); // Crear un nuevo objeto RpgUnsigned. cls = (*je)->FindClass( je, "com/ibm/varpg/rpgruntime/RpgUnsigned"); mid = (*je)->GetMethodID( je, cls, "<init>", "(II)V"); ro = (*je)->NewObject( je, cls, mid, (int) 5, /* nm. de dgitos */ ); (int) 0 /* nm. de posiciones decimales */

// Para establecer el valor del objeto, necesitamos // una matriz de bytes Java para utilizarla como parmetro de entrada // del mtodo para establecer el objeto. // Crear un objeto de matriz de bytes nuevo ba = (*je)->NewByteArray( je, 4 /* = longitud matriz bytes */ ); // Pinchar la memoria del elemento de la matriz de bytes para que // el lado nativo pueda acceder a ella. p = (char *) (*je)->GetByteArrayElements( je, ba, NULL); // 55555 = 0xD903

memcpy( p, "\x00\x00\xD9\x03", 4);

Figura 98. Ejemplo VSUBR.C (Pieza 1 de 2)


// Actualizar los valores y devolverlos al llamador Java (*je)->ReleaseByteArrayElements( je, ba, (signed char *) p, 0); // Preparar la llamada al mtodo desde la clase RpgNumeric que // toma un objeto de matriz de bytes y asigna su valor al // objeto RpgNumeric. Obtener el ID de mtodo. mid = (*je)->GetMethodID( je, cls, "assignFromNative", "([BII)V"); (*je)->CallVoidMethod( je, ro, mid, ba, // El objeto de matriz de bytes (int) 5, // = Component.UNSIGNED_TYPE 0 // posiciones decimales ); return ro;

Figura 98. Ejemplo VSUBR.C (Pieza 2 de 2)

330

Programacin con VisualAge RPG

La devolucin de un valor binario sin signo es similar a la de los casos anteriores para los decimales con zona y empaquetados, slo que se utiliza un objeto RpgUnsigned.

Devolucin de un valor de fecha, hora o indicacin de la hora


d subrd d fd C pr s eval 10d dll('VSUBR') 10d fd = subrd

Figura 99. Ejemplo VJNIR.VPG


jbyteArray _Export __stdcall { jbyteArray ba; char *p; Java_VJNIR_SUBRD( JNIEnv *je , void *jc)

// Crear un nuevo objeto de matriz de bytes para poder devolverlo. ba = (*je)->NewByteArray( je, 10 /* = longitud matriz bytes */ ); // Pinchar la memoria del elemento de la matriz de bytes para que // el lado nativo pueda acceder a ella. p = (char *) (*je)->GetByteArrayElements( je, ba, NULL);

memcpy( p, "2000-01-01",10); // Actualizar los valores y devolverlos al llamador Java (*je)->ReleaseByteArrayElements( je, ba, (signed char *) p, 0); } return ba;

Figura 100. Ejemplo VSUBR.C

Los valores de fecha, hora e indicacin de la hora se devuelven como matrices de bytes Java con la longitud esperada. Es similar a los datos de tipo carcter.

Devolucin de un valor de tipo flotante


d d d d C C subrf subrf8 ff ff8 pr pr s s eval eval 4f 8f 4f 8f dll('VSUBR') dll('VSUBR')

ff = subrf ff8= subrf8

Figura 101. Ejemplo VJNIR.VPG

Captulo 20. Llamada a funciones del sistema al compilar para Java

331

jfloat _Export __stdcall { jfloat rc; rc = -4444.4444; return rc;

Java_VJNIR_SUBRF( JNIEnv *je , void *jc)

jdouble _Export __stdcall { return -7777777.55555; }

Java_VJNIR_SUBRF8( JNIEnv *je , void *jc)

Figura 102. Ejemplo VSUBR.C

La devolucin de un valor de tipo flotante o doble (flotante de 8 bytes) se realiza directamente. Esto se debe a que los tipos se soportan como primitivas Java.

Devolucin de un valor de tipo carcter de longitud variable


d subrcv d fcv C pr s eval 10 dll('VSUBR') 10 varying fcv= subrcv varying

Figura 103. Ejemplo VJNIR.VPG


jbyteArray _Export __stdcall { jbyteArray ba; char *p; Java_VJNIR_SUBRCV( JNIEnv *je , void *jc)

// Devolver una matriz de bytes de la longitud de datos actual // Crear un nuevo objeto de matriz de bytes para poder devolverlo. ba = (*je)->NewByteArray( je, 4 /* = longitud matriz bytes */ ); // Pinchar la memoria del elemento de la matriz de bytes para que // el lado nativo pueda acceder a ella. p = (char *) (*je)->GetByteArrayElements( je, ba, NULL);

memcpy( p, "abcd",4); // Actualizar los valores y devolverlos al llamador Java (*je)->ReleaseByteArrayElements( je, ba, (signed char *) p, 0); } return ba;

Figura 104. Ejemplo VSUBR.C

Un valor de tipo carcter de longitud variable se devuelve mediante una matriz de bytes Java, en la que la longitud de la matriz coincide con la longitud del valor actual.

332

Programacin con VisualAge RPG

Devolucin de valores de matriz


Se llama a una funcin de la interfaz JNI para asignar un objeto de matriz. Si los elementos de la matriz son tipos de datos primitivos de Java, se utilizan las funciones de la interfaz para asignar estos tipos de objetos de matriz. (Existe una funcin especfica para cada tipo primitivo). Tambin asignan los elementos de la matriz. A continuacin, slo se trata de llamar a la funcin de la interfaz para correlacionar los elementos de la matriz con la memoria nativa y ya se pueden establecer, liberar y devolver a Java y, a continuacin, devolverlos desde la funcin. Si los elementos de la matriz no son de tipos primitivos de Java, entonces debe asignarse un objeto Java para cada elemento de la matriz, establecer su valor segn se desee y, por ltimo, asignar el objeto al elemento especfico de la matriz. La asignacin de los objetos individuales para los elementos es similar al caso del valor de retorno escalar para dicho tipo de datos.
* d d d d d d d d d d d d d d d d d d d d d d Archivo fuente: VJNIRA.VPG subrca subrsa subrpa subrba subri2a subri4a subrua subrda subrfa subrf8a subrcva fc fs fp fb fi2 fi4 fu fd ff ff8 fcv pr pr pr pr pr pr pr pr pr pr pr s s s s s s s s s s s m s 10 5s 5p 5b 5i 10i 10u 10d 4f 8f 10 0 0 0 0 0 0 dll('VSUBRA') dll('VSUBRA') dll('VSUBRA') dll('VSUBRA') dll('VSUBRA') dll('VSUBRA') dll('VSUBRA') dll('VSUBRA') dll('VSUBRA') dll('VSUBRA') dll('VSUBRA') dim(4) dim(4) dim(4) dim(4) dim(4) dim(4) dim(4) dim(4) dim(4) dim(4) varying dim(4)

10 dim(4) 5s 0 dim(4) 5p 0 dim(4) 5b 0 dim(4) 5i 0 dim(4) 10i 0 dim(4) 10u 0 dim(4) 10d dim(4) 4f dim(4) 8f dim(4) 10 varying dim(4) 9 0 style(*info) button(*OK)

d mb1 d rc

Figura 105. Ejemplo VJNIRA.VPG (Pieza 1 de 2)

Captulo 20. Llamada a funciones del sistema al compilar para Java

333

C C c C c C c C c C c C c C c C c C c C c C c C c c C

*INZSR fc(2) fs(2) fp(2) fb(2)

BEGSR eval dsply eval dsply eval dsply eval dsply eval dsply eval dsply eval dsply eval dsply eval fc = subrca mb1 fs = subrsa mb1 fp = subrpa mb1 fb = subrba mb1 rc rc rc rc

fi2(2) fi4(2) fu(2) fd(2)

fi2= subri2a mb1 rc fi4= subri4a mb1 rc fu = subrua mb1 fd = subrda mb1 ff = subrfa mb1 rc rc rc

ff(2) ff8(2) fcv(2) rc

dsply eval dsply eval dsply eval dsply seton ENDSR

ff8= subrf8a mb1 rc fcv= subrcva mb1 rc rc = %len(fcv(2)) mb1 rc

lr

Figura 105. Ejemplo VJNIRA.VPG (Pieza 2 de 2)

334

Programacin con VisualAge RPG

// Archivo fuente: //

VSUBRA.C

Funcin nativa que devuelve valores de matriz

// Aadir (d:\jdk12\include;d:\jdk12\include\win32) al valor INCLUDE para // poder encontrar jni.h al compilar. // Compilado con: IBM VisualAge(TM) para C++ para Windows(R), Versin 3.5 // Mandato de compilacin: icc /q /ss /ge- /fe vsubra.dll vsubra.c #include <stdio.h> #include <string.h> #include <jni.h> static void SwapBin2( char *); static void SwapBin4( char *); //--------------------------------------------------------------jobjectArray _Export __stdcall { jobjectArray oa; jclass cls; jbyteArray ba; char *p; int i; Java_VJNIRA_SUBRCA( JNIEnv *je , void *jc)

printf(" llamada a SUBRCA satisfactoria.\n"); // Crear el objeto matriz cls = (*je)->FindClass( je, "java/lang/Object"); if ( cls == NULL) { printf(" ERROR 1: FindClass.\n"); return NULL;

Figura 106. Ejemplo VSUBRA.C (Pieza 1 de 22)

Captulo 20. Llamada a funciones del sistema al compilar para Java

335

oa = (*je)->NewObjectArray( je, 4 /* longitud matriz */, cls, NULL ); if ( oa == NULL) { printf(" ERROR 2: Newobj\n"); return NULL; } // Poblar la matriz for (i=0; i<4; i++) { // Crear un nuevo objeto de matriz de bytes para poder devolverlo. ba = (*je)->NewByteArray( je, 10 /* = longitud matriz bytes */ ); // Establecer el valor del segundo elemento if ( 1 == i) { // Pinchar la memoria del elemento de la matriz de bytes para que // el lado nativo pueda acceder a ella. p = (char *) (*je)->GetByteArrayElements( je, ba, NULL); ",10);

memcpy( p, "Satisfactorio

// Actualizar los valores y devolverlos al llamador Java // Cuarto parm. = 0 tambin hace que se libere el alm. de la variable, // por lo que no puede accederse a ellas tras llamar a esta funcin. (*je)->ReleaseByteArrayElements( je, ba, (signed char *) p, 0); }

(*je)->SetObjectArrayElement( je, oa, i /* elemento matriz, empieza en 0 */ , ba); } // for i return oa; } //---------------------------------------------------------------

Figura 106. Ejemplo VSUBRA.C (Pieza 2 de 22)

336

Programacin con VisualAge RPG

jobjectArray _Export __stdcall { jobjectArray oa; int i; jclass cls; jmethodID mid; jobject rzo; jbyteArray ba; char *p;

Java_VJNIRA_SUBRSA( JNIEnv *je , void *jc)

printf(" llamada a SUBRSA satisfactoria.\n"); // Crear el objeto matriz cls = (*je)->FindClass( je, "com/ibm/varpg/rpgruntime/RpgZoned"); if ( cls == NULL) { printf(" ERROR 1: FindClass.\n"); return NULL; } oa = (*je)->NewObjectArray( je, 4 /* longitud matriz */, cls, NULL ); if ( oa == NULL) { printf(" ERROR 2: Newobj\n"); return NULL; } // Poblar la matriz for (i=0; i<4; i++) { // Crear un nuevo objeto RpgZoned. cls = (*je)->FindClass( je, "com/ibm/varpg/rpgruntime/RpgZoned"); if ( cls == NULL) { printf(" ERROR 1: FindClass.\n"); return NULL; }

Figura 106. Ejemplo VSUBRA.C (Pieza 3 de 22)

Captulo 20. Llamada a funciones del sistema al compilar para Java

337

mid = (*je)->GetMethodID( je, cls, "<init>", "(II)V"); if ( mid == NULL) { printf(" ERROR: GetMethod.\n"); return NULL; } rzo = (*je)->NewObject( je, cls, mid, (int) 5, /* nm. de dgitos */ (int) 0 ); if ( rzo == NULL) { printf(" ERROR3: \n"); return NULL; } // Establecer el valor del segundo elemento if ( 1 == i) { // // // // Para establecer el valor del objeto decimal con zona, necesitamos una matriz de bytes Java para utilizarla como parmetro de entrada del mtodo para establecer el objeto decimal con zona. Puede construirse un objeto de matriz de bytes nuevo u obtener uno /* nm. de posiciones decimales */

// recuperando el valor decimal con zona del objeto. // Construir una matriz de bytes. // Crear un objeto de matriz de bytes nuevo ba = (*je)->NewByteArray( je, 5 /* = longitud matriz bytes */ ); if ( ba == NULL) { printf(" ERROR4: \n"); return NULL; }

Figura 106. Ejemplo VSUBRA.C (Pieza 4 de 22)

338

Programacin con VisualAge RPG

// Pinchar la memoria del elemento de la matriz de bytes para que // el lado nativo pueda acceder a ella. p = (char *) (*je)->GetByteArrayElements( je, ba, NULL);

memcpy( p, "55555", 5);

// Actualizar los valores y devolverlos al llamador Java // Cuarto parm. = 0 tambin hace que se libere el alm. de la variable, // por lo que no puede accederse a ellas tras llamar a esta funcin. (*je)->ReleaseByteArrayElements( je, ba, (signed char *) p, 0);

// Preparar la llamada al mtodo desde la clase RpgNumeric que // toma un objeto de matriz de bytes y asigna su valor al // objeto RpgNumeric. Obtener el ID de mtodo. // cls = (*je)->GetObjectClass(je, p1); // (clS) sigue identificando el segundo parmetro. Reutilizar el valor mid = (*je)->GetMethodID( je, cls, "assignFromNative", "([BII)V"); if ( mid == NULL) { printf(" ERROR 2: GetMethod.\n"); return NULL; } (*je)->CallVoidMethod( je, rzo, mid, ba, (int) 1, // = Component.ZONED_TYPE 0 // precisin ); }

Figura 106. Ejemplo VSUBRA.C (Pieza 5 de 22)

Captulo 20. Llamada a funciones del sistema al compilar para Java

339

(*je)->SetObjectArrayElement( je, oa, i /* elemento matriz, empieza en 0 */ , rzo); } // for i return oa; } //--------------------------------------------------------------jobjectArray _Export __stdcall { jobjectArray oa; int i; jclass cls; jmethodID mid; jobject ro; jbyteArray ba; char *p; printf(" llamada a SUBRPA satisfactoria.\n"); // Crear el objeto matriz cls = (*je)->FindClass( je, "com/ibm/varpg/rpgruntime/RpgPacked"); if ( cls == NULL) { printf(" ERROR 1: FindClass.\n"); return NULL; } oa = (*je)->NewObjectArray( je, 4 /* longitud matriz */, cls, NULL ); if ( oa == NULL) { printf(" ERROR 2: Newobj\n"); return NULL; } // Poblar la matriz for (i=0; i<4; i++) { Java_VJNIRA_SUBRPA( JNIEnv *je , void *jc)

Figura 106. Ejemplo VSUBRA.C (Pieza 6 de 22)

340

Programacin con VisualAge RPG

// Crear un nuevo objeto RpgPacked. #if 0 cls = (*je)->FindClass( je, "com/ibm/varpg/rpgruntime/RpgPacked"); if ( cls == NULL) { printf(" ERROR 1: FindClass.\n"); return NULL; } #endif mid = (*je)->GetMethodID( je, cls, "<init>", "(II)V"); if ( mid == NULL) { printf(" ERROR: GetMethod.\n"); return NULL; } ro = (*je)->NewObject( je, cls, mid, (int) 5, /* nm. de dgitos */ (int) 0 /* nm. de posiciones decimales */

);

if ( ro == NULL) { printf(" ERROR3: \n"); return NULL; } // Establecer el valor del segundo elemento if ( 1 == i) { // // // // Para establecer el valor del objeto decimal empaquetado, necesitamos una matriz de bytes Java para utilizarla como parmetro de entrada del mtodo para establecer el objeto decimal empaquetado. Puede construirse un objeto de matriz de bytes nuevo u obtener uno

// recuperando el valor decimal empaquetado del objeto. // Construir una matriz de bytes.

Figura 106. Ejemplo VSUBRA.C (Pieza 7 de 22)

Captulo 20. Llamada a funciones del sistema al compilar para Java

341

// Crear un objeto de matriz de bytes nuevo ba = (*je)->NewByteArray( je, 3 /* = longitud matriz bytes */ ); if ( ba == NULL) { printf(" ERROR4: \n"); return NULL; } // Pinchar la memoria del elemento de la matriz de bytes para que // el lado nativo pueda acceder a ella. p = (char *) (*je)->GetByteArrayElements( je, ba, NULL);

memcpy( p, "\x55\x55\x5C", 3);

// Actualizar los valores y devolverlos al llamador Java // Cuarto parm. = 0 tambin hace que se libere el alm. de la variable, // por lo que no puede accederse a ellas tras llamar a esta funcin. (*je)->ReleaseByteArrayElements( je, ba, (signed char *) p, 0);

// Preparar la llamada al mtodo desde la clase RpgNumeric que // toma un objeto de matriz de bytes y asigna su valor al // objeto RpgNumeric. Obtener el ID de mtodo. // cls = (*je)->GetObjectClass(je, p1); // (clS) sigue identificando el segundo parmetro. Reutilizar el valor mid = (*je)->GetMethodID( je, cls, "assignFromNative", "([BII)V"); if ( mid == NULL) { printf(" ERROR 2: GetMethod.\n"); return NULL; }

Figura 106. Ejemplo VSUBRA.C (Pieza 8 de 22)

342

Programacin con VisualAge RPG

(*je)->CallVoidMethod( je, ro, mid, ba, // El objeto de matriz de bytes (int) 2, // = Component.PACKED_TYPE ); } (*je)->SetObjectArrayElement( je, oa, i /* elemento matriz, empieza en 0 */ , ro); } // for i return oa; } //--------------------------------------------------------------jobjectArray _Export __stdcall { jobjectArray oa; int i; jclass cls; jmethodID jobject mid; ro; Java_VJNIRA_SUBRBA( JNIEnv *je , void *jc) 0 // posiciones decimales

jbyteArray ba; char *p; printf(" llamada a SUBRBA satisfactoria.\n"); // Crear el objeto matriz cls = (*je)->FindClass( je, "com/ibm/varpg/rpgruntime/RpgBinary"); if ( cls == NULL) { printf(" ERROR 1: FindClass.\n"); return NULL; }

Figura 106. Ejemplo VSUBRA.C (Pieza 9 de 22)

Captulo 20. Llamada a funciones del sistema al compilar para Java

343

oa = (*je)->NewObjectArray( je, 4 /* longitud matriz */, cls, NULL ); if ( oa == NULL) { printf(" ERROR 2: Newobj\n"); } return NULL;

// Poblar la matriz for (i=0; i<4; i++) { // Crear un nuevo objeto RpgPacked. #if 0 cls = (*je)->FindClass( je, "com/ibm/varpg/rpgruntime/RpgBinary"); if ( cls == NULL) { printf(" ERROR 1: FindClass.\n"); return NULL; } #endif mid = (*je)->GetMethodID( je, cls, "<init>", "(II)V"); if ( mid == NULL) { printf(" ERROR: GetMethod.\n"); return NULL; } ro = (*je)->NewObject( je, cls, mid, (int) 5, /* nm. de dgitos */ (int) 0 /* nm. de posiciones decimales */ );

Figura 106. Ejemplo VSUBRA.C (Pieza 10 de 22)

344

Programacin con VisualAge RPG

if ( ro == NULL) { printf(" ERROR3: \n"); return NULL; } // Establecer el valor del segundo elemento if ( 1 == i) { // Para establecer el valor del objeto decimal empaquetado, necesitamos // una matriz de bytes Java para utilizarla como parmetro de entrada // del mtodo para establecer el objeto decimal empaquetado. // Puede construirse un objeto de matriz de bytes nuevo u obtener uno // recuperando el valor decimal empaquetado del objeto. // Construir una matriz de bytes. // Crear un objeto de matriz de bytes nuevo ba = (*je)->NewByteArray( je, 4 /* = longitud matriz bytes */ ); if ( ba == NULL) { printf(" ERROR4: \n"); return NULL; } // Pinchar la memoria del elemento de la matriz de bytes para que // el lado nativo pueda acceder a ella. p = (char *) (*je)->GetByteArrayElements( je, ba, NULL); // 55555 = 0xD903

memcpy( p, "\x00\x00\xD9\x03", 4);

// Actualizar los valores y devolverlos al llamador Java // Cuarto parm. = 0 tambin hace que se libere el alm. de la variable, // por lo que no puede accederse a ellas tras llamar a esta funcin. (*je)->ReleaseByteArrayElements( je, ba, (signed char *) p, 0);

Figura 106. Ejemplo VSUBRA.C (Pieza 11 de 22)

Captulo 20. Llamada a funciones del sistema al compilar para Java

345

// Preparar la llamada al mtodo desde la clase RpgNumeric que // toma un objeto de matriz de bytes y asigna su valor al // objeto RpgNumeric. Obtener el ID de mtodo.

// cls = (*je)->GetObjectClass(je, p1); // (clS) sigue identificando el segundo parmetro. Reutilizar el valor mid = (*je)->GetMethodID( je, cls, "assignFromNative", "([BII)V"); if ( mid == NULL) { printf(" ERROR 2: GetMethod.\n"); return NULL; } (*je)->CallVoidMethod( je, ro, mid, ba, // El objeto de matriz de bytes (int) 3, // = Component.Binary_TYPE ); } (*je)->SetObjectArrayElement( je, oa, i /* elemento matriz, empieza en 0 */ , ro); } // for i } return oa; 0 // posiciones decimales

Figura 106. Ejemplo VSUBRA.C (Pieza 12 de 22)

346

Programacin con VisualAge RPG

//--------------------------------------------------------------jshortArray _Export __stdcall { jshortArray rc; jshort *n; Java_VJNIRA_SUBRI2A( JNIEnv *je , void *jc)

printf(" llamada a SUBRI2A satisfactoria.\n"); rc = (*je)->NewShortArray( je, 4 /* = longitud matriz */ ); // Pinchar la memoria del elemento de la matriz para que // el lado nativo pueda acceder a ella. n = (*je)->GetShortArrayElements( je, rc, NULL);

n[1] = -5555; // Actualizar los valores y devolverlos al llamador Java (*je)->ReleaseShortArrayElements( je, rc, n, 0); return rc; } //--------------------------------------------------------------jintArray _Export __stdcall Java_VJNIRA_SUBRI4A( JNIEnv *je , void *jc) { jintArray rc; jint *n; printf(" llamada a SUBRI4A satisfactoria.\n"); rc = (*je)->NewIntArray( je, 4 /* = longitud matriz */ ); // Pinchar la memoria del elemento de la matriz para que // el lado nativo pueda acceder a ella. n = (*je)->GetIntArrayElements( je, rc, NULL);

n[1] = -5555; // Actualizar los valores y devolverlos al llamador Java (*je)->ReleaseIntArrayElements( je, rc, n, 0); return rc;

Figura 106. Ejemplo VSUBRA.C (Pieza 13 de 22)

Captulo 20. Llamada a funciones del sistema al compilar para Java

347

//--------------------------------------------------------------jobjectArray _Export __stdcall { jobjectArray oa; int i; jclass cls; jmethodID mid; jobject ro; jbyteArray ba; char *p; printf(" llamada a SUBRUA satisfactoria.\n"); // Crear el objeto matriz cls = (*je)->FindClass( je, "com/ibm/varpg/rpgruntime/RpgUnsigned"); if ( cls == NULL) { printf(" ERROR 1: FindClass.\n"); return NULL; } oa = (*je)->NewObjectArray( je, 4 /* longitud matriz */, cls, NULL ); if ( oa == NULL) { printf(" ERROR 2: Newobj\n"); return NULL; } // Poblar la matriz for (i=0; i<4; i++) { // Crear un nuevo objeto RpgPacked. #if 0 cls = (*je)->FindClass( je, "com/ibm/varpg/rpgruntime/RpgUnsigned"); if ( cls == NULL) { printf(" ERROR 1: FindClass.\n"); return NULL; Java_VJNIRA_SUBRUA( JNIEnv *je , void *jc)

} #endif

Figura 106. Ejemplo VSUBRA.C (Pieza 14 de 22)

348

Programacin con VisualAge RPG

mid = (*je)->GetMethodID( je, cls, "<init>", "(II)V"); if ( mid == NULL) { printf(" ERROR: GetMethod.\n"); return NULL; } ro = (*je)->NewObject( je, cls, mid, (int) 5, /* nm. de dgitos */ (int) 0 /* nm. de posiciones decimales */ ); if ( ro == NULL) { } printf(" ERROR3: \n"); return NULL;

// Establecer el valor del segundo elemento if ( 1 == i) { // // // // // Para establecer el valor del objeto decimal empaquetado, necesitamos una matriz de bytes Java para utilizarla como parmetro de entrada del mtodo para establecer el objeto decimal empaquetado. Puede construirse un objeto de matriz de bytes nuevo u obtener uno recuperando el valor decimal empaquetado del objeto.

// Construir una matriz de bytes.

Figura 106. Ejemplo VSUBRA.C (Pieza 15 de 22)

Captulo 20. Llamada a funciones del sistema al compilar para Java

349

// Crear un objeto de matriz de bytes nuevo ba = (*je)->NewByteArray( je, 4 /* = longitud matriz bytes */ ); if ( ba == NULL) { printf(" ERROR4: \n"); return NULL; } // Pinchar la memoria del elemento de la matriz de bytes para que // el lado nativo pueda acceder a ella. p = (char *) (*je)->GetByteArrayElements( je, ba, NULL); // 55555 = 0xD903

memcpy( p, "\x00\x00\xD9\x03", 4);

// Actualizar los valores y devolverlos al llamador Java // Cuarto parm. = 0 tambin hace que se libere el alm. de la variable, // por lo que no puede accederse a ellas tras llamar a esta funcin. (*je)->ReleaseByteArrayElements( je, ba, (signed char *) p, 0);

Figura 106. Ejemplo VSUBRA.C (Pieza 16 de 22)

350

Programacin con VisualAge RPG

// Preparar la llamada al mtodo desde la clase RpgNumeric que // toma un objeto de matriz de bytes y asigna su valor al // objeto RpgNumeric. Obtener el ID de mtodo. // cls = (*je)->GetObjectClass(je, p1); // (clS) sigue identificando el segundo parmetro. Reutilizar el valor mid = (*je)->GetMethodID( je, cls, "assignFromNative", "([BII)V"); if ( mid == NULL) { printf(" ERROR 2: GetMethod.\n"); return NULL; } (*je)->CallVoidMethod( je, ro, mid, ba, // El objeto de matriz de bytes (int) 5, // = Component.UNSIGNED_TYPE 0 // posiciones decimales ); } (*je)->SetObjectArrayElement( je, oa, i /* elemento matriz, empieza en 0 */ } // for i , ro);

return oa; } //---------------------------------------------------------------

Figura 106. Ejemplo VSUBRA.C (Pieza 17 de 22)

Captulo 20. Llamada a funciones del sistema al compilar para Java

351

jobjectArray _Export __stdcall { jobjectArray oa; jclass cls; jbyteArray ba; char *p; int i;

Java_VJNIRA_SUBRDA(

JNIEnv *je , void *jc)

printf(" llamada a SUBRD satisfactoria.\n"); // Crear el objeto matriz cls = (*je)->FindClass( je, "java/lang/Object"); if ( cls == NULL) { printf(" ERROR 1: FindClass.\n"); return NULL; } oa = (*je)->NewObjectArray( je, 4 /* longitud matriz */, cls, NULL ); if ( oa == NULL) { printf(" ERROR 2: Newobj\n"); return NULL; } // Poblar la matriz for (i=0; i<4; i++) { // Crear un nuevo objeto de matriz de bytes para poder devolverlo. ba = (*je)->NewByteArray( je, 10 /* = longitud matriz bytes */ );

Figura 106. Ejemplo VSUBRA.C (Pieza 18 de 22)

352

Programacin con VisualAge RPG

// Establecer todos los elementos en un valor de fecha vlido. // Pinchar la memoria del elemento de la matriz de bytes para que // el lado nativo pueda acceder a ella. p = (char *) (*je)->GetByteArrayElements( je, ba, NULL);

memcpy( p, "2000-01-01",10); // Actualizar los valores y devolverlos al llamador Java // Cuarto parm. = 0 tambin hace que se libere el alm. de la variable, // por lo que no puede accederse a ellas tras llamar a esta funcin. (*je)->ReleaseByteArrayElements( je, ba, (signed char *) p, 0); (*je)->SetObjectArrayElement( je, oa, i /* elemento matriz, empieza en 0 */ , ba); } // for i return oa; } //--------------------------------------------------------------jfloatArray _Export __stdcall { jfloatArray rc; jfloat *n; Java_VJNIRA_SUBRFA( JNIEnv *je , void *jc)

printf(" llamada a SUBRF satisfactoria.\n"); rc = (*je)->NewFloatArray( je, 4 /* = longitud matriz */ ); // Pinchar la memoria del elemento de la matriz para que // el lado nativo pueda acceder a ella. n = (*je)->GetFloatArrayElements( je, rc, NULL);

n[1] = -4444.4444; // Actualizar los valores y devolverlos al llamador Java (*je)->ReleaseFloatArrayElements( je, rc, n, 0); } return rc;

Figura 106. Ejemplo VSUBRA.C (Pieza 19 de 22)

Captulo 20. Llamada a funciones del sistema al compilar para Java

353

//--------------------------------------------------------------jdoubleArray { _Export __stdcall Java_VJNIRA_SUBRF8A( JNIEnv *je , void *jc)

jdoubleArray rc; jdouble *n; printf(" llamada a SUBRF8 satisfactoria.\n"); rc = (*je)->NewDoubleArray( je, 4 /* = longitud matriz */ ); // Pinchar la memoria del elemento de la matriz para que // el lado nativo pueda acceder a ella. n = (*je)->GetDoubleArrayElements( je, rc, NULL);

n[1] = -7777777.55555; // Actualizar los valores y devolverlos al llamador Java (*je)->ReleaseDoubleArrayElements( je, rc, n, 0); return rc; } //--------------------------------------------------------------jobjectArray _Export __stdcall Java_VJNIRA_SUBRCVA( JNIEnv *je , void *jc) { // Similar al caso de caracteres de longitud fija, slo que los elementos // individuales de la matriz pueden crearse como matrices de bytes de // distintas longitudes para reflejar la longitud actual de los valores // de longitud variable.

Figura 106. Ejemplo VSUBRA.C (Pieza 20 de 22)

354

Programacin con VisualAge RPG

jobjectArray oa; jclass cls; jbyteArray ba; char *p; int i; printf(" llamada a SUBRCVA satisfactoria.\n"); // Crear el objeto matriz cls = (*je)->FindClass( je, "java/lang/Object"); if ( cls == NULL) { printf(" ERROR 1: FindClass.\n"); return NULL; } oa = (*je)->NewObjectArray( je, 4 /* longitud matriz */, cls, NULL ); if ( oa == NULL) { printf(" ERROR 2: Newobj\n"); return NULL; }

Figura 106. Ejemplo VSUBRA.C (Pieza 21 de 22)

Captulo 20. Llamada a funciones del sistema al compilar para Java

355

// Poblar la matriz for (i=0; i<4; i++) { // Crear un nuevo objeto de matriz de bytes para poder devolverlo. ba = (*je)->NewByteArray( je, /* = longitud matriz bytes */ (1==i) ? 4 : 10 ); // Establecer el valor del segundo elemento if ( 1 == i) { // Pinchar la memoria del elemento de la matriz de bytes para que // el lado nativo pueda acceder a ella. p = (char *) (*je)->GetByteArrayElements( je, ba, NULL);

memcpy( p, "abcd",4); // Actualizar los valores y devolverlos al llamador Java // Cuarto parm. = 0 tambin hace que se libere el alm. de la variable, // por lo que no puede accederse a ellas tras llamar a esta funcin. } (*je)->ReleaseByteArrayElements( je, ba, (signed char *) p, 0);

(*je)->SetObjectArrayElement( je, oa, i /* elemento matriz, empieza en 0 */ , ba); } // for i } return oa;

Figura 106. Ejemplo VSUBRA.C (Pieza 22 de 22)

356

Programacin con VisualAge RPG

Captulo 21. Cmo crear programas no GUI en VisualAge RPG


Esta seccin describe cmo crear aplicaciones VARPG autnomas y bibliotecas de enlace dinmico (DLL). Las aplicaciones VARPG autnomas no tienen interfaz de usuario, pero pueden acceder archivos locales y de AS/400, as como ejecutar programas AS/400. Los archivos DLL son mdulos que no pueden ejecutarse directamente; contienen procedimientos que pueden ser llamados por otras aplicaciones VARPG. Los archivos DLL tambin pueden acceder a archivos locales, as como a archivos de AS/400 y programas. Los archivos DLL vienen a ser del mismo tipo que los programas de servicios de AS/400. Puede crear aplicaciones VARPG autnomas en el diseador de GUI de VARPG, o bien emitiendo mandatos en una lnea de mandatos de MS-DOS. (Consulte el Apndice C. Creacin y compilacin de programas no GUI desde MS-DOS en la pgina 433 si desea informacin sobre los mandatos.) En este apartado se describe cmo puede utilizar el Diseador GUI para crear programas no GUI. Al crear aplicaciones o archivos DLL, tenga en cuenta las siguientes restricciones: v Deben estar constituidos exclusivamente de procedimientos. v *ENTRY no est permitido. v Las subrutinas especiales *INZSR y *TERMSR no estn permitidas. v Todas las subrutinas deben ser locales a un procedimiento. v La palabra clave EXPORT no est permitida al crear aplicaciones autnomas. v Debido a que ni las aplicaciones autnomas ni los archivos DLL tienen interfaz, las incorporaciones %GETATR y %SETATR, y los cdigos de operacin GUI no estn permitidos. Entre ellos: CLSWIN, GETATR, SETATR, START, STOP, SHOWWIN, READS El cdigo de operacin DSPLY puede utilizarse. Sin embargo, si el procedimiento que lo contiene es invocado desde un archivo DLL de VisualAge RPG, el cdigo de operacin DSPLY no har nada. Asimismo, el cdigo de operacin DSPLY no soporta un tipo de datos de mensaje en factor 1.

Cmo crear programas VARPG autnomos


Un programa VARPG autnomo se crea cuando la palabra clave EXE se encuentra en la especificacin de control.
H EXE

El fuente del programa debe contener un procedimiento cuyo nombre coincida con el nombre del archivo fuente. Este ser el principal punto de entrada del programa. Si deben pasarse parmetros al programa, deben especificarse en la definicin de parmetros para el procedimiento principal y deben pasarse por valor. Es decir, la palabra clave VALUE debe especificarse para cada parmetro. Al ejecutar una aplicacin desde la lnea de mandatos debe separar los parmetros mediante espacios. Si se pasan ms o menos parmetros de los especificados, no aparecer ningn mensaje de error. Para crear un programa autnomo en el Diseador GUI, seleccione Proyecto > Nuevo > Proyecto no GUI De la ventana de proyectos. El editor abre un nuevo archivo fuente que contiene una especificacin de control H. Elimine el comentario para la especificacin H * EXE y escriba el cdigo de su programa. Cuando haya
Copyright IBM Corp. 1994, 2000

357

terminado, guarde su proyecto y construya la aplicacin. Asimismo, puede seleccionar las opciones que desee desde la ventana de proyectos. En el ejemplo siguiente, el programa autnomo VARPG acepta un nico parmetro. Al ejecutarse, el programa convertir el parmetro a maysculas y mostrar el resultado utilizando el cdigo de operacin DSPLY. Observe que el nombre del procedimiento principal, y el nico, es MyPgm. Si desea intentar este ejemplo, asegrese de dar al archivo el nombre MYPGM al guardarlo.
* Programa de ejemplo autnomo VARPG H EXE * * Prototipo para el procedimiento principal D MyPgm PR D 64A Value * * Definicin del procedimiento para MYPGM PMyPgm B * D MyPgm PI D InString 64A Value * D OutString S 64A * D LC C 'abcdefghijklmnopqrstuvwxyz' D UC C 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' * * Conversin del parmetro de entrada a maysculas y visualizacin C lc:uc Xlate InString OutString C OutString Dsply I 1 * PMyPgm E

Cmo crear archivos DLL


Un archivo DLL se crea cuando la palabra clave NOMAIN se encuentra en la especificacin de control:
H NOMAIN

Para crear un archivo DLL en el Diseador GUI, seleccione Proyecto > Nuevo > Proyecto no GUI de la ventana de proyectos. El editor abre un nuevo archivo fuente que contiene una especificacin de control H. Elimine el comentario para la especificacin H * NOMAIN y escriba el cdigo de su programa. Cuando haya terminado, guarde su proyecto y construya el archivo DLL. Asimismo, puede seleccionar las opciones que desee desde la ventana de proyectos. Al construir un archivo DLL, el compilador produce el archivo DLL y un archivo LIB. El archivo LIB se utiliza para enlazar el archivo DLL a otras aplicaciones. El archivo LIB debe encontrarse en el mismo directorio que el fuente y debe tener el mismo nombre que el archivo DLL. El archivo LIB contiene todos los procedimientos que tienen la palabra clave EXPORT en su especificacin P Begin. El siguiente ejemplo le muestra cmo codificar la parte del programa MyPGM que convierte la serie de minsculas a maysculas como un procedimiento en un archivo DLL. El fuente para el archivo DLL contiene un procedimiento llamado ToUpper. Agregue la palabra clave Export a la definicin del procedimiento para que ste pueda invocarse desde otros programas.
* Ejemplo de archivo DLL VARPG H NOMAIN *

358

Programacin con VisualAge RPG

* Procedimiento prototipo ToUpper D ToUpper PR 64A D 64A Value * * El procedimiento ToUpper PToUpper B Export * D ToUpper PI 64A D InString 64A Value * D OutString S 64A * D LC C 'abcdefghijklmnopqrstuvwxyz' D UC C 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' * * C lc:uc Xlate InString OutString C Return OutString * PToUpper E

Al crear y construir un archivo DLL, puede nombrarlo como guste. Para este ejemplo, hemos utilizado el nombre MyFunc. Una construccin satisfactoria crear los siguientes archivos en el directorio fuente: v MyFunc.VPG - fuente del programa v MyFunc.DLL - el archivo DLL v MyFunc.LST - el listado del compilador v MyFunc.LIB - el archivo de biblioteca v MyFunc.EVT - el archivo de sucesos (utilizado por el Diseador GUI para visualizar la ventana de errores, aunque no es necesario para ejecutar el programa) Abra y modifique el fuente MyPGM para que llame al procedimiento ToUpper en el archivo MyFunc.DLL que acaba de crearse. El fuente modificado ser:
0000 * Llamada a un procedimiento en un archivo DLL VARPG 0001 H EXE 0002 * 0003 D ToUpper 0004 D 0006 D 0007 0008 0009 0010 0011 0012 0013 0014 0015 0016 0017 * D MyMain D * PMyMain * D MyMain D InString * D Upper * PR 64A 64A PR B PI S Eval Dsply E 64A 64A Upper=ToUpper(Instring) I 1 Value DLL('MyFunc') ExtProc('TOUPPER') Value

64A

Value

0018 C 0019 C Upper 0010 * 0011 PMyMain

ln. 0003

Descripcin de cambio Defina el prototipo para el procedimiento ToUpper y especifique que el


Captulo 21. Cmo crear programas no GUI en VisualAge RPG

359

procedimiento devuelva un parmetro que sea un campo alpha de 64 bytes de longitud. La palabra clave del archivo DLL especifica que el procedimiento se encuentra en el archivo DLL llamado MyFunc.DLL. 0004 La palabra clave ExtProc especifica el nombre del procedimiento que debe invocarse. El nombre es el mismo que el que hemos empleado en la especificacin Definition (lnea 0003), por lo que puede omitir la palabra clave. Si decide, de todas formas, especificar el nombre, ste deber aparecer en maysculas, como se indica. Esta sentencia indica que el procedimiento espera un parmetro - un campo alpha de 64 caracteres de longitud. En este caso, es VALUE quien pasa el parmetro. Esta es la llamada al procedimiento.

0006

0018

Si el procedimiento que est invocando no le devuelve un valor, debe utilizar el cdigo de operacin CALLP para invocarlo:
C CALLP SomeFunc(parm1:parm2)

360

Programacin con VisualAge RPG

Excepciones
El tratamiento de las excepciones difiere del de las aplicaciones GUI VARPG por varias razones: v No se devuelve ninguna informacin sobre la excepcin al emisor si ste no reside en la DLL de utilidad. v El manejador de excepciones por omisin no se invoca nunca desde un archivo DLL ya que no se invoca cuando se produce una excepcin en un procedimiento. Si se produce una excepcin en el archivo DLL y no hay ningn indicador de errores ni *PSSR, el archivo DLL finaliza. La informacin sobre la excepcin se escribe en el archivo FVDCERRS.LOG. v La manera ms adecuada de tratar excepciones en un archivo DLL de utilidad es tener un indicador de errores, o un *PSSR local para cada rutina que devuelva un cdigo de devolucin apropiado al emisor.

Cmo depurar aplicaciones


Para depurar programas VARPG, asegrese de utilizar la opcin de compilador de depuracin cuando construya la aplicacin. Si no ha establecido la opcin de depuracin, an puede iniciar el depurador en el programa, pero deber trabajar con la vista de ensamblador de su programa. Para ejecutar el depurador contra su fuente, debe antes construir su aplicacin. En la ventana de proyectos, seleccione Proyecto > Construir > Windows NT/95/98. Para arrancar el depurador, seleccione el elemento de men Depurar del men Proyecto. Consulte el Captulo 10. Depuracin de la aplicacin en la pgina 217 si desea ms informacin sobre depuracin.

Procedimientos de depuracin
Si desea depurar cdigo en su archivo DLL, debe seguir algunos pasos ms: 1. Inicie el depurador para su aplicacin principal; en nuestro ejemplo, MyMain. 2. En el dilogo Depurador - Control de sesin, seleccione Puntos de interrupcin-Establecer aparicin de carga.... 3. Cuando aparezca el dilogo Punto de interrupcin de aparicin de carga, escriba el nombre del archivo DLL, MyFunc, en la entrada Nombre del archivo DLL y pulse Aceptar. 4. Ejecute su programa. Cuando se invoca el proceso en el archivo DLL, se visualiza un dilogo de mensaje del depurador que indica que se est cargando el archivo DLL. Pulse Aceptar y haga lo siguiente: 1. Localice el dilogo Depurador - Control de sesin y observe que hay una nueva entrada en el panel de la derecha con el nombre del archivo DLL.

Captulo 21. Cmo crear programas no GUI en VisualAge RPG

361

Figura 107. Seleccin del archivo de objeto MyFunc.DLL

2. Pulse el botn con el signo + junto al nombre del archivo DLL. Se expandir para mostrar el nombre del mdulo de objeto, MyFunc.obj. 3. Efecte una doble pulsacin en el nombre del mdulo de objeto. 4. La vista del fuente del depurador mostrar ahora el fuente para el procedimiento ToUpper en el archivo DLL MYFUNC. Ahora puede aadir puntos de interrupcin y visualizar variables de programa en el archivo DLL. Asimismo, si est iniciando (START) otros componentes VARPG, o bien, si est invocando sus propias funciones C, tambin puede utilizar los procedimientos descritos ms arriba para depurarlos.

362

Programacin con VisualAge RPG

Captulo 22. Consideraciones sobre DBCS


Si piensa utilizar VisualAge RPG en un sistema de Juego de Caracteres de Doble Byte (DBCS), debe tener en cuenta lo siguiente: v El compilador no permite caracteres de desplazamiento a teclado ideogrfico y a teclado estndar en los literales. Si utiliza el editor de VisualAge RPG para abrir un miembro AS/400 con el fin de copiar el fuente en el programa VisualAge RPG, debe eliminar los caracteres de desplazamiento a teclado ideogrfico y a teclado estndar de todos los literales. Si no se eliminan, se producirn errores en la compilacin. v El compilador elimina los caracteres de desplazamiento a teclado ideogrfico y a teclado estndar de los miembros fuente VisualAge RPG cuando se recuperan mediante la caracterstica /COPY remota. v Los caracteres DBCS no estn permitidos en la extensin de los nombres de archivo de los iconos de una aplicacin. v Un nombre de aplicacin VisualAge RPG que contenga caracteres que no sean DBCS provoca una anomala en la compilacin.

Soporte de VisualAge RPG para tipos de datos DBCS


VisualAge RPG soporta varios tipos de datos DBCS. Cuando se ejecuta la aplicacin, se siguen ciertas normas al utilizar tipos de datos DBCS con el fin de asegurar que los datos se transfieren correctamente entre el servidor AS/400 y la estacin de trabajo. Estn soportados los siguientes tipos de datos DBCS: Slo DBCS Un campo de este tipo de datos slo contiene datos DBCS y debe utilizarse al usar la base de datos de AS/400. Equivale al tipo de datos J soportado por la base de datos de AS/400. DBCS cualquiera Un campo de este tipo de datos puede contener datos de byte nico y datos DBCS a la vez. Debe utilizarse al usar la base de datos de AS/400. Equivale al tipo de datos E soportado por la base de datos de AS/400. DBCS mixto Un campo de este tipo de datos puede contener datos de byte nico y datos DBCS a la vez. Debe utilizarse al intercambiar datos con la base de datos de AS/400. Equivale al tipo de datos O soportado por la base de datos de AS/400. Los tipos de datos de AS/400 J, O y E requieren que los datos DBCS estn encerrados entre caracteres SO (Desplazamiento a teclado ideogrfico) y SI (Desplazamiento a teclado estndar). Los campos de estacin de trabajo DBCS cualquiera, DBCS mixto y Slo DBCS no utilizan caracteres SO y SI. Cuando se utilizan estos campos para transferir datos al servidor, los caracteres SO y SI se aaden segn sea apropiado. Al recuperar datos del servidor, se eliminan los caracteres SO y SI y el campo VisualAge RPG se rellena con dos blancos de byte nico. DBCS cualquiera, DBCS mixto y Slo DBCS se representan como campos de tipo carcter con el mismo nombre que sus nombres de componente en la aplicacin VisualAge RPG.

Copyright IBM Corp. 1994, 2000

363

El siguiente ejemplo muestra cmo se convierten los datos cuando se transfieren datos DBCS a y desde el servidor. En este ejemplo, se crea un campo Slo DBCS de 10 bytes utilizando VisualAge RPG. Esto quiere decir que el campo puede contener cuatro caracteres DBCS ya que cada carcter DBCS requiere dos bytes. Los dos bytes extra se utilizan para insertar los caracteres SO y SI antes de transferir el campo al servidor. Suponga que el campo contiene los siguientes datos antes de transferirse al servidor:
DBDBDBDBblbl donde DB = 1 Carcter de doble byte. bl = 1 Carcter blanco de byte nico.

Antes de transferir el campo al servidor, se convierte de tal manera que los datos DBCS quedan encerrados entre los caracteres SO y SI. Los blancos de byte nico se consideran insignificantes y se sustituyen por los caracteres SO y SI adecuados. Por consiguiente, el campo aparecer de la manera siguiente antes de transferirse al servidor:
SODBDBDBDBSI

Si se recuperan los mismos datos del servidor, se eliminan los caracteres SO y SI y el campo se rellena con dos blancos de byte nico:
DBDBDBDBblbl donde DB = 1 Carcter de doble byte bl = 1 Carcter blanco de byte nico

Nota: Los campos de tipo carcter que representan los tipos de datos Slo DBCS, DBCS mixto o DBCS cualquiera deben rellenarse con el nmero adecuado de blancos de byte nico con el fin de que el campo se transfiera al servidor y los datos del campo se visualicen correctamente en la ventana. VisualAge RPG asegura que haya suficientes blancos de byte nico. Al establecer campos DBCS o recuperar informacin de campos DBCS mediante los cdigos de operacin SETATR y GETATR respectivamente, debe asegurarse de que la longitud del campo en las operaciones SETATR y GETATR sea igual que la del campo en la ventana. Si el campo no tiene la misma longitud, no podr transferirse entre el servidor y la estacin de trabajo.

Tipo de datos Slo DBCS


VisualAge RPG asegura lo siguiente cuando se utiliza el tipo de datos Slo DBCS, independientemente de si los datos se aaden a travs del campo en la ventana o si se entran mediante el cdigo de operacin SETATR: v La longitud mnima del campo es de 2. Esto asegura que haya espacio suficiente para los caracteres SO y SI que se aaden cuando se transfieren los datos al servidor. v El campo contiene caracteres DBCS vlidos. Cada par de doble byte se comprueba para asegurar que se utiliza un carcter DBCS vlido. v El campo se rellena con blancos de la manera adecuada. Si se entra un valor menor de lo que permite el campo, ste se rellena hasta la longitud mxima de 2 con blancos de doble byte. Los dos ltimos bytes del campo se rellenan con blancos de byte nico.

364

Programacin con VisualAge RPG

Tipo de datos DBCS cualquiera


El tipo de datos DBCS cualquiera slo puede contener todos los datos de byte nico o todos los datos de doble byte: no est permitida la mezcla de datos DBCS y de byte nico. Si se utilizan datos de byte nico, puede utilizarse la longitud mxima del campo para contener los datos de byte nico y puede transferirse la longitud mxima de datos a y desde el servidor. VisualAge RPG impone las siguientes reglas cuando los dos primeros bytes del campo representan un carcter DBCS, independientemente de si los datos se aaden a travs del campo en la ventana o si se entran mediante el cdigo de operacin SETATR: v La longitud mnima del campo es de 2. Esto asegura que haya espacio suficiente para los caracteres SO y SI que se aaden cuando se transfieren los datos al servidor. v El campo slo contiene caracteres DBCS vlidos. Cada par de doble byte se comprueba para asegurar que se utiliza un carcter DBCS vlido. v El campo se rellena con blancos de la manera adecuada. Si se entra un valor menor de lo que permite el campo, ste se rellena hasta la longitud mxima de 2 con blancos de doble byte. Los dos ltimos bytes del campo se rellenan con blancos de byte nico.

Tipo de datos DBCS mixto


Este campo puede contener cualquier nmero de caracteres DBCS o de byte nico de manera intercambiable. VisualAge RPG impone las siguientes reglas: v Este campo de tipo carcter siempre se rellena con blancos de byte nico. v Por cada cambio en la modalidad DBCS, debe contabilizarse un carcter SO y SI. Cada vez que el usuario pasa a entrar caracteres DBCS o de byte nico, se restan dos de la longitud mxima que puede entrarse. Por ejemplo, suponga que se crea un campo de DBCS mixto con una longitud igual a 20 utilizando VisualAge RPG. Este campo tiene el siguiente valor:
DBsbDBsbDBsbDBsb. donde DB = 1 carcter DBCS. sb = 1 carcter de byte nico.

Es la mxima longitud del campo, ya que ste se convierte a lo siguiente antes de transferirse al servidor.
SODBSIsbSODBSIsbSODBSIsbSODBSIsb. donde SO = 1 carcter de desplazamiento a teclado ideogrfico. sb = 1 carcter de desplazamiento a teclado estndar.

Se utilizan los 20 bytes del campo.

Consideraciones sobre DBCS puro


Tanto el lenguaje VisualAge RPG como el soporte de base de datos de AS/400 soportan un tipo de datos DBCS puro: el tipo de datos G o Grfico. Los datos de DBCS puro no requieren caracteres SO (Desplazamiento a teclado ideogrfico) o SI (Desplazamiento a teclado estndar) en el servidor AS/400 ni en la estacin de trabajo. Cuando se convierten datos grficos entre el servidor AS/400 y la estacin de trabajo, no se aade ni se elimina ningn carcter SO o SI. Los campos de entrada GUI no se correlacionan directamente con el tipo de datos grficos soportado en el lenguaje VisualAge RPG. Para utilizar el campo en toda su
Captulo 22. Consideraciones sobre DBCS

365

amplitud, se recomienda que cree una entrada de caracteres en la ventana. Al hacerlo, se crea un campo de tipo carcter VisualAge RPG con el mismo nombre que el componente Diseador GUI. Entonces puede utilizarse un campo Grfico distinto para interactuar con el campo de entrada de caracteres creado mediante el Diseador GUI. Utilice el cdigo de operacin SETATR o GETATR para interactuar con los campos de entrada. De esta manera, puede utilizarse toda la longitud del campo de entrada para almacenar caracteres DBCS sin preocuparse por los caracteres SO y SI.

366

Programacin con VisualAge RPG

Captulo 23. Fusin de cdigo en la aplicacin


Durante el proceso de programacin es posible que desee fusionar dos o ms componentes de un proyecto o componente lgico con el cdigo asociado. Puede utilizar la funcin Fusionar para llevarlo a cabo. Seleccione el elemento de men Fusionar en el men desplegable Proyecto. Aparecer el recuadro de dilogo Abrir Componente - VisualAge RPG que le permitir seleccionar el proyecto del que desea realizar el proceso de fusin. El aspecto y la funcin de este recuadro de dilogo es similar al recuadro de dilogo Buscar carpeta/proyecto. Se puede especificar el proyecto en el campo de entrada, incluyendo la va de acceso completa, o puede utilizarse el recuadro de lista para seleccionar una unidad y las carpetas para buscar el proyecto necesario. Estos dos mtodos abrirn la ventana Vista de rbol de objetos GUI del proyecto especificado. Asimismo, se puede seleccionar el elemento de men Objetos GUI en el men desplegable Ver del organizador de proyectos.

Figura 108. La vista de rbol de objetos GUI para fusin de cdigo

En esta ventana se muestran dos vistas; la de la izquierda contiene la vista de rbol del proyecto del que desea realizar el proceso de fusin, y la de la derecha contiene todos los hijos del componente seleccionado en la vista de rbol de la izquierda. Se pueden seleccionar varios componentes en la parte derecha de la ventana, de forma similar al Explorador de Windows. Esta vista se puede utilizar como paleta de componentes adicionales porque en ella pueden seleccionarse elementos (en el panel izquierdo o derecho) y, a continuacin, sealarlos y pulsarlos en la vista de rbol del proyecto en uso o en la ventana de diseo. Esto funciona de forma similar a la paleta de componentes en el sentido de que slo se pueden colocar componentes en componentes basados en marcos y stos, a su vez, slo se pueden colocar en la raz del rbol del proyecto. Al fusionar la GUI y el
Copyright IBM Corp. 1994, 2000

367

cdigo asociado, el constructor obligar a guardar el proyecto en uso para poder contar con una copia de seguridad del trabajo en caso de que los resultados de la fusin no le satisfagan. Adems del diseo de la GUI, la fusin copiar subrutinas de accin enlazadas, paneles de ayuda, descripciones tcnicas, referencias a archivos de soporte, subrutinas de usuarios referenciadas y mensajes de usuario. Hay que tener en cuenta varias reglas al fusionar cdigo en estos casos especficos. v Se copiarn todas las subrutinas de accin enlazadas. v Los archivos de soporte referenciados no se copiarn con las referencias. Esto es responsabilidad del programador. v Las especificaciones de las descripciones de archivos y las especificaciones de definiciones no se copiarn en el proyecto en uso. Esto tambin es responsabilidad del programador. v Las subrutinas de usuario, los procedimientos RPG y los mensajes de usuario referenciados por la subrutina de accin que se copia tambin se copiarn. Esto incluye todas las referencias a subrutinas de usuario utilizadas por un cdigo de operacin EXSR o CASxx, los procedimientos RPG referenciados en un cdigo de operacin CALLP y los mensajes de usuario referenciados con el cdigo de operacin DSPLY. v En el caso de los componentes cuyo nombre ha sido modificado, tambin se cambiar el nombre de todas las subrutinas de accin que hacen referencia al componente y que tienen nombres que se ajustan al formato estndar. Por ejemplo, el nombre del siguiente cdigo fuente se cambiara, ya que sigue el formato estndar. El requisito de este formato es que el nombre del componente y de la ventana correspondan directamente con la ubicacin donde puede encontrarse el componente.
*...1....+....2....+....3....+....4....+....5....+....6....+....7....+....8 CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq---C PSB000000C BEGACT PRESS FRA000000B . . . C ENDACT

v Los nombres de los mensajes de usuario copiados se cambian consecutivamente empezando por el primer mensaje copiado. Todos los mensajes de usuario fusionados se numeran secuencialmente empezando inmediatamente despus del ltimo mensaje del proyecto en uso. Los ID de mensaje se modifican en cdigos de operacin DSPLY que hacen referencia a ellos. v Si se detecta un conflicto de nombres para una subrutina de usuario, no se modificar el nombre y se aadir a una lista contenida en el archivo de registro de fusin. El registro tambin se visualizar en la ventana Resultado de la fusin de cdigo. El archivo de registro de fusin se ubicar en el directorio del proyecto, con el nombre de nombre_proyecto.mrg, donde nombre_proyecto es el nombre del proyecto. Este archivo ser sustituido si se realiza ms de una fusin para el mismo proyecto. El archivo no se aade automticamente. El siguiente ejemplo comprende un listado de un archivo de fusin de ejemplo.

368

Programacin con VisualAge RPG

Los componentes siguientes se han copiado en el proyecto de destino: Nombre de origen SEARCHW:CAN00023 SEARCHW:SEARCHW SEARCHW:SEARCHGB SEARCHW:STX00071 SEARCHW:TITLECB SEARCHW:STX00073 SEARCHW:STX00074 SEARCHW:STX00075 SEARCHW:CATCB SEARCHW:DIRCB SEARCHW:ACTORCB SEARCHW:SEARCHPB SEARCHW:CANCELSEPB SEARCHW:HELPPB SEARCHW:STX00082 Nombre de destino SEARCHW:CAN00023 SEARCHW:SEARCHW SEARCHW:SEARCHGB SEARCHW:STX00071 SEARCHW:TITLECB SEARCHW:STX00073 SEARCHW:STX00074 SEARCHW:STX00075 SEARCHW:CATCB SEARCHW:DIRCB SEARCHW:ACTORCB SEARCHW:SEARCHPB SEARCHW:CANCELSEPB SEARCHW:HELPPB SEARCHW:STX00082

Los paneles de ayuda siguientes se han copiado en el proyecto de destino: Nombre de origen 24.SEARCHW 79.SEARCHPB 80.CANCELSEPB 81.HELPPB Fusionando cdigo fuente: Subrutina de accin Redenominando a Subrutina de accin Subrutina de accin Subrutina de accin Subrutina de accin Subrutina de accin Subrutina de accin Subrutina de accin Subrutina de accin Subrutina de accin Subrutina de accin Mensaje Mensaje Mensaje Mensaje Subrutina de usuario Subrutina de usuario Subrutina de usuario Subrutina de usuario Mensaje Subrutina de usuario Subrutina de usuario Subrutina de usuario Subrutina de usuario Subrutina de usuario Subrutina de usuario Subrutina de usuario Subrutina de usuario CATW+CLOSE+CATW SEARCHW+CLOSE+SEARCHW TITLECB+CREATE+SEARCHW DIRCB+CREATE+SEARCHW ACTORCB+CREATE+SEARCHW CATCB+CREATE+SEARCHW TITLECB+ENTER+SEARCHW CATCB+SELECT+SEARCHW DIRCB+SELECT+SEARCHW ACTORCB+SELECT+SEARCHW CANCELSEPB+PRESS+SEARCHW SEARCHPB+PRESS+SEARCHW *MSG0001 -> *MSG0003 *MSG0001 -> *MSG0003 *MSG0001 -> *MSG0003 *MSG0001 -> *MSG0003 WRTBRSFSR CASECAT CKCRITERIA DSPBROWSE *MSG0001 -> *MSG0003 BRACTION BRCHILDREN BRSCIFI BRCOMEDY BRHORROR BRWESTERN BRROMANCE BRCLASSIC Nombre de destino 88.SEARCHW 99.SEARCHPB 100.CANCELSEPB 101.HELPPB

Captulo 23. Fusin de cdigo en la aplicacin

369

Los mensajes siguientes se han copiado en el proyecto de destino: Mensaje de origen 1 Mensaje de destino 3

Las descripciones tcnicas de los siguientes componentes se han copiado en el proyecto de destino: Nombre de origen SEARCHW:SEARCHPB SEARCHW:CANCELSEPB SEARCHW:HELPPB Nombre de destino SEARCHW:SEARCHPB SEARCHW:CANCELSEPB SEARCHW:HELPPB

Las reglas siguientes se aplican a la resolucin de conflictos de nombres de componentes: v Se cambiar el nombre del componente o de la ventana fusionado. v Si se cambia el nombre de una ventana, todos los componentes contenidos en ella recibirn el nombre de la nueva ventana. v Las subrutinas de accin enlazadas con una ventana o componente redenominado sern redenominadas y reenlazadas, siempre que tengan el formato estndar de nombres. v Se cambiarn las especificaciones de los clculos que contengan un cdigo de operacin GETATR o SETATR que haga referencia a un componente redenominado. v El proceso de fusin intenta corregir las referencias de componentes en el cdigo fusionado segn los cambios de nombre de los componentes. Tambin se copian los mensajes de usuario utilizados en los componentes fusionados. Se aplican las reglas siguientes: v Si existe un conflicto de nombres en un mensaje de usuario, se producir un cambio de nombre. v Se actualizarn las referencias a mensajes de usuario redenominados.

370

Programacin con VisualAge RPG

Captulo 24. Conectores de proveedor


Los conectores son aplicaciones escritas por desarrolladores de terceras empresas y creadas para proporcionar mayor funcionalidad a VisualAge RPG. Se puede automatizar una gran variedad de tareas, como la insercin de una lnea de cdigo para definir el valor de un atributo seleccionado de una lista para un componente determinado; o un procedimiento que permita que los programadores impriman el fuente RPG formateado para incluir cabeceras y pies de pgina.

Adicin de conectores de proveedor


Para aadir un conector creado u obtenido de un desarrollador de otra empresa, siga los siguientes pasos: 1. Pulse el botn sobre el men desplegable Proveedor. 2. Resalte el elemento Conectores para activar el submen de conectores. 3. Pulse el botn sobre el mandato Aadir conector... para abrir la ventana Aadir conector. 4. Seleccione el conector de proveedor que desea aadir de entre los archivos visualizados en la ventana. Los archivos visualizados tienen la extensin .plg.

Invocacin de un conector de proveedor


Una vez se ha aadido un conector al Diseador GUI de VisualAge RPG, hay que invocar la funcin. La manera ms sencilla de hacerlo consiste en seleccionar el elemento de men correspondiente al conector que ha sido definido por el proveedor. Este elemento de men puede encontrarse en el men desplegable Proveedor, Seleccionado o en el men emergente de un componente. En algunos casos el conector no tendr ningn elemento de men definido y ser necesario invocarlo de forma externa al Diseador GUI (para ver un ejemplo de este mtodo de invocacin, consulte el conector de ejemplo LPEXSAMP). Como ejemplo, aada uno o varios de los conectores de proveedor de ejemplo proporcionados con VisualAge RPG. Para invocar estos conectores, siga los siguientes pasos: 1. Pulse el botn sobre el men desplegable Proveedor. 2. Resalte el elemento Conectores para activar el submen de conectores. 3. Resalte el elemento de men aadido junto con el conector. El nombre de este elemento de men es variable porque est creado por el desarrollador del conector. Puede aparecer otro submen, dependiendo del desarrollador/proveedor. En este caso, vaya al paso 4; de lo contrario, pulse el botn sobre el elemento de men para invocar el conector. 4. Pulse el botn sobre el elemento de men adecuado del submen para invocar el conector.

Gestin de conectores de proveedor


Si dispone de conectores de proveedor en VisualAge RPG, es interesante conocer la informacin acerca del conector como, por ejemplo, el desarrollador, la descripcin del desarrollador sobre el conector y para qu sirve o la dll asociada con el mismo. Esta informacin puede obtenerse en la ventana Gestionar conectores. Para abrir la ventana Gestionar conectores, siga los siguientes pasos: 1. Pulse el botn sobre el men desplegable Proveedor. 2. Resalte el elemento Conectores para activar el submen de conectores.
Copyright IBM Corp. 1994, 2000

371

3. Pulse el botn sobre el mandato Gestionar conectores... para abrir la ventana Gestionar conectores.

372

Programacin con VisualAge RPG

Captulo 25. Creacin de conectores


Se puede crear un conector para satisfacer necesidades especficas o como suplemento de VisualAge RPG para enviarlo a otros programadores a los que pueda serles til. Los conectores pueden crearse utilizando VisualAge C++ o REXX de VisualAge RPG. A continuacin se describe el proceso de creacin de conectores mediante cdigo de VisualAge RPG. Seguirn secciones adicionales que tratan las excepciones y las normas bsicas de creacin de conectores con VisualAge C++ o REXX.

Creacin de conectores mediante VisualAge RPG


Hay dos componentes necesarios para crear un conector: el archivo ejecutable y el archivo de informacin del conector. El archivo ejecutable consta de cdigo fuente compilado que realiza la funcin deseada. El archivo de informacin del conector (.plg) acta de interfaz entre el Diseador GUI y el archivo ejecutable. Contiene informacin importante como las definiciones de los elementos del men desplegable que se aaden al Diseador GUI y la llamada al archivo ejecutable. El orden de creacin de los archivos no es importante, ya que ambos deben estar presentes para que el conector funcione. Este ejemplo empieza por el archivo .plg.

Creacin del archivo .plg


El archivo .plg acta de interfaz entre el conector y el diseador. Es un archivo ASCII que contiene informacin de organizacin, como la ubicacin de la DLL necesaria, la ubicacin de los archivos de ayuda asociados y el nombre del propio conector y del proveedor. El archivo .plg tambin contiene la informacin necesaria para actuar de interfaz entre el conector y el diseador. Se incluye la serie de la lnea de mandatos, el texto deseado para los elementos de men y la combinacin de teclas aceleradoras. En la siguiente lista de palabras clave se explican los distintos parmetros, incluidas las reglas pertinentes, tanto si el parmetro es necesario como opcional, y la informacin que hay que proporcionar. A continuacin de la lista de palabras clave se muestra un ejemplo del archivo cuando est finalizado. Nota: Los espacios entre la palabra clave y el valor del parmetro utilizado para el valor en el conector son arbitrarios. Los espacios utilizados en los ejemplos responden nicamente a una cuestin de diseo.

Alternate_Paths
Es una serie que indica las vas de acceso relativas que deben utilizarse al cargar la DLL del conector descrita ms abajo. Este campo es opcional. Esta serie adopta la forma:
"&1\vaRelativa1;&1vaRelativa2;...;&1\vaRelativaN;"

donde &1\ se convertir en la va de acceso completa del archivo .plg. Esto implica que si se dispone de un conjunto de conectores que se instalan en un directorio como c:\myplugins y todos ellos estn enlazados con una DLL comn: c:\myplugins\plugutil\plugutil.dll, en caso de que todos los conectores se encuentren en c:\myplugins\plugN\plugN.plg, se podra especificar la va de acceso alternativa: &1\..\util;, que se convertira en:
Copyright IBM Corp. 1994, 2000

373

c:\myplugins\plugN\..\util; y se aadira a PATH antes de cargar la DLL. Las comillas son necesarias si se decide utilizar esta palabra clave. En lugar de una serie, tambin se puede utilizar un ID de recurso para apuntar a una va de acceso especificada en un fuente externo.

DLL_Names
El valor de este campo es una serie que define el nombre de los archivos DLL necesarios para este conector. Es un campo opcional; si se utiliza, debe haber el nombre de una DLL utilizada por el conector. Adems, puede darse el nombre mri.dll. Este nombre es opcional, pero no puede incluirse sin la DLL correspondiente. Si se incluyen los dos, se delimitan con un espacio. El nombre de los archivos DLL puede comprender la va de acceso relativa a la ubicacin de los archivos del conector. conector.dll Es el nombre de la DLL que contiene el cdigo del conector. Puede omitirse si el conector no es una llamada de funcin dentro de una DLL. mri.dll Si el MRI (series traducibles) se encuentran en una DLL diferente, indique su nombre. Primero se especifican las DLL para que las series que deban seguirse puedan incluirse en las DLL. Cuando una serie es necesaria ms adelante en el archivo .plg, si no se especifica una serie entre comillas, se presupone que el valor dado es un ID de recurso de serie en mri.dll o conector.dll

Vendor_Name
Es el nombre del proveedor especificado entre comillas dobles o del ID de recurso de una serie. Este campo es opcional, pero recomendado. Un ejemplo de esta serie sera:
Vendor_Name: "Plug-Me-In Inc."

Plugin_Name
Es el nombre del conector especificado entre comillas o del ID de recurso de una serie. Este campo es opcional, pero recomendado. Un ejemplo de este campo con una serie es:
Plugin_Name: "Who Am I?"

Help_File
Este campo es opcional e identifica el archivo .hlp de Windows utilizado para visualizar ayuda para los elementos de men. Es una serie que no lleva comillas y que incluye la va de acceso relativa del archivo de ayuda.

Unloading_Function
Este campo es opcional. El campo Unloading_Function no puede utilizarse junto con el campo Unloading_Command_Line. Este campo slo se utiliza si hay informacin o un elemento de visualizacin que tiene que modificarse o eliminarse cuando se ha finalizado o eliminado el conector. Esta serie, que lleva comillas, designa la funcin que se utilizar. La funcin debe estar incluida en la DLL que acompaa al conector. El campo Unloading_Function es el nombre de la funcin que debe llamarse cuando se vaya a descargar el conector. Tiene la siguiente signatura:

374

Programacin con VisualAge RPG

unsigned long unloadFunctionName( const char* const char* const char* const char* int

ppluginPath_, ppluginStub_, pdllPath_, builderId_, remove_)

donde los parmetros son: ppluginPath_ La va de acceso completa del conector invocado, incluyendo la barra inclinada invertida final. ppluginStub_ El resto del nombre del archivo del conector (por ejemplo, myplug.plg). pdllPath_ La va de acceso completa de la DLL que contiene los mtodos expuestos de VARPG. builderId_ Serie utilizada por VARPG para identificar el constructor y por el conector al comunicarse con el constructor. remove_ 0 1 El constructor se est apagando. El usuario ha solicitado que se elimine todo el conector. En este caso, el conector debera eliminar en este momento toda la informacin almacenada en el registro.

Valor de retorno 0 1 xito fallo o rechazo

Si el conector devuelve un 1 de esta funcin, el constructor puede presentar al usuario la opcin de eliminar obligatoriamente el conector descargando su DLL. En este caso, es posible que el conector interrumpa el funcionamiento del diseador y deba volverlo a iniciar.

Unloading_Command_Line
Como se ha mencionado ms arriba, este campo no puede utilizarse al mismo tiempo que el campo Unloading_Function. Cuando se utiliza esta opcin, se proporciona una serie para ejecutarla como si se tratara de la lnea de mandatos. Por ejemplo, se podra iniciar Netscape especificando la serie: netscape.exe Este mtodo permite obtener el mismo conjunto de parmetros que estaran disponibles para una funcin en una DLL. Esto se consigue mediante la definicin de variables de sustitucin. Cuando se encuentra &0, &1, &2, &3, &4 o &5 en la serie especificada, se sustituyen de la siguiente manera: &0 &1 &2 &3 ppluginPath_ ppluginStub_ pdllPath_ builderId_
Captulo 25. Creacin de conectores

375

&4 &5

remove_ va de acceso del directorio raz del Diseador GUI

IBM_PluginInterface | PluginInterface
Es una funcin avanzada que no es necesaria. Este campo permite exponer el conector como componente programable. No se pueden utilizar estas dos opciones en el mismo archivo .plg. Si no hay necesidad de especificar uno de estos parmetros, no lo haga. Cuando se utiliza una de estas opciones, se emplear el nombre de la funcin especificado cuando haya otros conectores que interacten con este conector mediante una interfaz de destino/mandato/parmetros. La signatura de la funcin debe ser: para la funcin de tipo IBM_, donde arguments_ se utiliza para entradas y salidas.
unsigned long __stdcall IBMtargetCommandFunction( const IString& pluginPath_, const IString& dllPath_, const IString& builderId_, const IString& target_, const IString& command_, IString& arguments_);

Para la funcin que no es de tipo IBM, la signatura debe ser: En este caso, si hay una serie de retorno, debera asignarse memoria a
unsigned long __stdcall targetCommandFunction( const char* ppluginPath_, const char* pdllPath_, const char* pbuilderId_, const char* ptarget_, const char* pcommand_, const char* parguments_, char** ppreturnString_);

ppreturnString_ mediante el conector con GlobalAlloc( GMEM_FIXED, [bufferSize]), para que VARPG pueda desasignar la memoria cuando haya terminado con ella. Si no hay ninguna serie de retorno que sea necesaria, puede hacerse caso omiso de este parmetro. A continuacin se muestra un ejemplo de este mandato:
{ IString returnString = ...; ... *ppreturnString = GlobalAlloc( returnString. length() + 1); strcpy( *ppreturnString, returnString);

Para ver un ejemplo de conector que d soporte a la funcin IBM_PluginInterface, consulte el ejemplo LPEXSAMP proporcionado en el directorio x:\adtswin\samples\vndplugs\lpexsamp (donde x corresponde a la letra de la unidad en la que se ha instalado VisualAge RPG).

Begin_Details ... End_Details


Entre estos cdigos, entre el texto que desee mostrar al usuario cuando la informacin del conector se visualice en el recuadro de dilogo Gestionar conectores. Puede resultar til dar una breve descripcin del objetivo y del uso del conector. Se puede entrar el texto aqu o utilizar el formulario String/Resid descrito para mri.dll. Este campo es opcional, pero muy recomendado.

376

Programacin con VisualAge RPG

Function_Name
Es el nombre de la funcin que debe llamarse en conector.dll al activar el elemento de men. Se puede utilizar este campo o el campo Command_Line. No se pueden utilizar los dos. La signatura debera ser la siguiente: donde los parmetros son:
unsigned long pluginFunctionName( const char* const char* const char* unsigned long const char* ppluginPath_, pdllPath_, builderId_, menuContextId_, partsIds_);

ppluginPath_ Mismo significado que para unloadFunctionName(). pdllPath_ Mismo significado que para unloadFunctionName(). builderId_ Mismo significado que para unloadFunctionName(). menuContextId_ Un valor entero largo sin signatura que representa el tipo de men desde el que se invoca este conector. Este valor determina el significado de partsIds_. Los valores posibles son: 1 2 El conector se invoca desde la barra de mens (es decir, se trata de un conector pensado para proyectos) y partsIds_ es una serie vaca. El conector se invoca para un nico componente seleccionado, (es decir, se trata de un conector pensado para una nica seleccin) y partsIds_ contiene el identificador del componente seleccionado. El conector se invoca para un grupo de componentes seleccionados conjuntamente, (es decir, se trata de un conector pensado para una seleccin mltiple) y partsIds_ es una serie que contiene el conjunto delimitado por espacios en blanco de los identificadores de los componentes seleccionados. El conector se invoca cuando se inicia el diseador GUI.

8 partsIds_

Es una serie que representa el componente o componentes a los que la llamada de funcin debera hacer referencia, segn lo indicado en menuContextId_. En partsIds_, cada identificador de componente es una secuencia de valores enteros largos sin signatura separados por un punto (por ejemplo, 432.5632.612) que representan la jerarqua hijo-padre del componente en cuestin. En el ejemplo indicado, 612 es el ID del componente, 5632 es el ID de su padre y 432 es el ID del padre del padre.

Command_Line
Cuando se utiliza esta opcin, se proporciona una serie para ejecutarla como si se tratara de la lnea de mandatos. Por ejemplo, se podra iniciar Netscape especificando la serie: netscape.exe. Este mtodo permite obtener el mismo conjunto de parmetros que estaran disponibles para una funcin en una DLL. Esto se consigue mediante la definicin de variables de sustitucin. Cuando se encuentra &0, &1, &2, &3, &4 o &5 en la serie especificada, se sustituyen de la siguiente manera:
Captulo 25. Creacin de conectores

377

&0 &1 &2 &3 &4 &5

ppluginPath_ pdllPath_ builderId_ menuContextId_ partsIds_ va de acceso del directorio raz del Diseador GUI.

Siguiendo el ejemplo anterior para Netscape, supongamos que el proveedor proporciona un archivo HTML con el conector y que este elemento de men en particular es para visualizar dicho archivo HTML. Supongamos tambin que el archivo del conector se encuentra en d:\vendor\plugins y que el archivo HTML es d:\vendor\plugins\htmlsrc\plugpage.html. Para que el conector muestre esta pgina web, la definicin de la lnea de mandatos podra ser la siguiente:
netscape &0htmlsrc\plugpage.html

Que se ampliara y ejecutara como:


netscape d:\vendor\plugins\htmlsrc\plugpage.html

Menu_Name
Es una serie o un ID de recurso de serie que indica lo que el elemento de men debera ser. Estas series tienen el formato:
submen1/submen2/.../submenN/elementomen

donde submen1 hasta submenN son submens opcionales. Por ejemplo: donde Plug-Me-In Inc. es el submen y Who am I? es el elemento de men.
Menu_Name: "Plug-Me-In Inc./Who am I?"

Menu_Info_Strings
Es una lista de series o de ID de serie que estn asociados con los submens o elementos de men correspondientes, como se especifica en Menu_Name. La asociacin funciona a la inversa. Por ejemplo, si se especifica un submen y un elemento de men en Menu_Name, pero slo se especifica una serie en Menu_Info_Strings, la serie especificada en Menu_Info_Strings se asociar con el elemento de men y se har caso omiso del submen. (Es posible que la adicin de un elemento de men anterior definiera una serie de rea de informacin para el elemento de men en cuestin.)

Supported_Menus
Como se ha mencionado en Function_Name, menuContextId_ indica el tipo de men. Supported_Menus indica los mens a los que debe aadirse esta entrada en particular.

Help_Id
Si se ha especificado un archivo de ayuda y hay ayuda asociada con este mandato, indique el ID de ayuda en el parmetro panel_largosin de Help_Id. Si se proporciona el parmetro_opcional_ventana_completa con un valor diferente a

378

Programacin con VisualAge RPG

cero, la ayuda se visualizar en una ventana completa de ayuda, en lugar de en el rea emergente de contexto por omisin. Este campo adopta la forma de: y un ejemplo de codificacin sera:
Help_Id: panel_largosin parmetro_opcional_ventana_completa

Help_Id:

1000 1

Accelerator
Este campo opcional especifica el acelerador que se asociar con el elemento. Consta de una de las teclas F1 a F12, seguida de uno o varios modificadores (SHIFT [DESPL], ALT, CONTROL) Nota: <F1/10>, <Alt-F5/7/8/9/10> y <Despl-F9/10> ya estn reservadas por el diseador y, si se especifican, no se tendrn en cuenta. Para utilizar esta funcin, proporcione la siguiente informacin: Cuando se utilice este campo tendr el siguiente aspecto:
Accelerator: [F1 | F2 | F3 | ... | F12] [SHIFT] [CONTROL] [ALT]

Accelerator:

F8 Shift

End_of_Definition
Este campo indica al analizador que ha finalizado una definicin de funcin y que puede empezar otra.

Plantilla de archivo .plg y ejemplo


Al utilizar los campos descritos anteriormente para crear un archivo .plg para el Diseador GUI, hay que seguir este formato: Nota: Debe haber al menos una definicin de Function_Name o de Command_Line. No hay lmite en el nmero mximo permitido.

Captulo 25. Creacin de conectores

379

// Las lneas que empiezan por dos barras inclinadas no se tienen en cuenta // (es decir, se tratan como comentarios) Alternate_Paths: dll_Names: Vendor_Name: Plugin_Name: Help_File: Unloading_Function: (o bien) Unloading_Command_Line: IBM_PluginInterface: (o bien) PluginInterface: serie_o_IDrec conector.dll mri.dll serie_o_IDrec serie_o_IDrec archivo_ayuda.hlp "unloadingFunction" "invocacin lnea mandatos con smb. de sust. &0, &1, &2, &3, &4, &5" "IBMtargetCommandFunction" "targetCommandFunction"

Begin_Details: . . Texto opcional que especifique la funcin del conector. . . End_Details: Function_Name: (o bien) Command_Line: Menu_Name: Menu_Info_Strings: Supported_Menus: Help_Id: Accelerator: End_of_definition: "nombreFuncin1" "invocacin1 lnea mandatos con smb. de sust. &0, &1, &2, &3, &4" serie_o_IDrec serie_o_IDrec serie_o_IDrec ... IDcontextoMen1 IDcontextoMen2 ... panel_largosin parmetro_opcional_ventana_completa [F1 | F2 | F3 | ... | F12] [SHIFT] [CONTROL] [ALT]

Nota: v Todos los nombres de archivo son relativos a la ubicacin del archivo .plg. v Los descargadores son opcionales, pero si se elige alguno, slo se puede haber uno de los dos. v Puede especificarse Function_Name o Command_Line. A continuacin se muestra un ejemplo especfico de archivo .plg sencillo. Con VisualAge RPG se proporcionan algunos ejemplos de conectores. Estos archivos se pueden encontrar en el directorio X:\adtswin\samples\vndplugs\ de la estacin de trabajo donde se ha instalado VisualAge RPG (X corresponde a la letra de la unidad).

380

Programacin con VisualAge RPG

// Conector para proyecto de impresin Vendor_Name: Plugin_Name: Begin_Details: Who Am I? Este conector muestra informacin acerca del proyecto en uso, incluido el nombre del directorio y del archivo. End_Details: Command_Line: Menu_Name: Supported_Menus: Accelerator: End_of_Definition "d:\myproj\whoami\rt_win32\whoami.exe &1 &2 &4" "Plug-Me-In Inc./Who am I?" 1 F7 Shift "Plug-Me-In Inc." "Who Am I?"

Creacin del archivo .EXE


Para crear un archivo .EXE para el Diseador GUI, hay que tener en cuenta que: Cuando se utiliza VisualAge RPG para crear conectores, se utiliza el componente *component para que interacte con el diseador. Al definir los valores de los atributos PlugDLL, PlugId, PlugCmd, PlugRC y PlugResult, toda la informacin necesaria puede ser comunicada entre el diseador y el conector. Para crear un conector que funcione hay que establecer la comunicacin adecuada proporcionando al diseador la siguiente informacin: builderId_ Es el mismo ID proporcionado por el diseador cuando se invoc el conector. target_ Es una serie que representa el aspecto del diseador con el que desea interactuar. command_ Es la accin especfica que desea que realice el diseador. parameters_ Los argumentos necesarios para el mandato. Nota: En un programa VARPG, builderId_ corresponde al atributo PlugId de *component. Para hacer una llamada a la interfaz del conector, antes hay que definir PlugId y PlugDLL. PlugDLL indica al mdulo de tiempo de ejecucin de VARPG dnde se encuentra la dll que contiene la interfaz de conector del constructor. Al emitir un mandato, primero hay que concatenar los valores de target_, command_ y parameters_ utilizando espacios en blanco como delimitadores y, a continuacin, utilizar el resultado para definir el atributo PlugCmd de *component. De retorno se obtiene un resultado y un cdigo de error. En el caso de una llamada de funcin, uno de los parmetros est definido para contener la serie del resultado y el valor entero largo sin signatura devuelto contiene el cdigo de error. A continuacin se especifican algunos cdigos de retorno bsicos comunes para todos los mandatos. Los cdigos de error adicionales se definirn en la tabla correspondiente de destinos y mandatos.

Captulo 25. Creacin de conectores

381

Cdigo de retorno Significado 0 1 2 4 5 Todo ha ido bien y el mandato se ha ejecutado. No se ha reconocido el destino. El destino no ha reconocido el mandato. No se puede encontrar el constructor. Se ha producido un error desconocido y los resultados del mandato no son fiables.

Destinos y mandatos y los valores de retorno asociados


A continuacin se muestra una lista de los destinos y mandatos vlidos, junto con la semntica de sus parmetros y los valores de retorno.
Tabla 13. Destino: Proyecto
Mandato Build Parmetro(s) [win32|java] Valor por omisin: win32 Significado/Valor de retorno Construye una versin win32 o java del proyecto, dependiendo de si la plataforma es win32 o java. Sin valor de retorno; retorno inmediato (es decir, antes de finalizar la construccin). Muestra las opciones de la construccin para win32 o Java, dependiendo de si la plataforma es win32 o java. Sin valor de retorno, pero no hay retorno hasta que no se haya cerrado el recuadro de dilogo (modal). Devuelve una serie que contiene el identificador del componente en el que se encuentra el cursor. Si no hay ninguna ventana de diseo abierta o si ninguna ventana de diseo abierta es la ventana de diseo activa, esta serie estar vaca. Si el parmetro es igual a 1, se expandir toda la vista de rbol; en caso contrario, estar contrada. Abre el proyecto especificado sin comprobar si el proyecto en uso tiene que guardarse. Devuelve un 1 para indicar que el mandato ForceOpen ha sido satisfactorio o un 0 para indicar que ha sido insatisfactorio.

BuildOptions

[win32|java] Valor por omisin: win32

CursoredPart

ninguno

ExpandAll

[1]

ForceOpen

[Nombreproyecto]

382

Programacin con VisualAge RPG

Tabla 13. Destino: Proyecto (continuacin)


Get ProjectDir ProjectFileName Devuelve el directorio raz del proyecto en uso. Devuelve el nombre completo del archivo .IVG del proyecto en uso. Devuelve el nombre del archivo que se generar cuando se construya el proyecto (por ejemplo, myproj.exe). Devuelve el ttulo del proyecto en uso. Devuelve el nombre de archivo (menos la extensin) de los nombres del proyecto en uso (por ejemplo, myproj). Devuelve 1 para indicar que se ha modificado el proyecto y 0 para indicar que no se ha realizado ningn cambio desde que se abri. Devuelve 1 si se trata de un proyecto sin nombre y 0 en caso contrario. Devuelve el ensimo proyecto abierto ms recientemente, donde n es igual o superior a 1. Devuelve una serie vaca si el ndice est fuera de lmites. Comprueba si el usuario desea guardar el proyecto antes de abrir otro. Devuelve 1 si el proyecto se ha abierto satisfactoriamente y 0 en caso contrario.

ProjectTargetName

ProjectTitle ProjectFileStub

IsSaveRequired

ninguno

IsTemporary

ninguno

MostRecentlyUsed

Open

nombreProyecto

Captulo 25. Creacin de conectores

383

Tabla 13. Destino: Proyecto (continuacin)


PartId nombreComponente [nombreVentana |[0|1|2]] Devuelve un ID de componente cuando se da un nombre de componente. Si se especifica un nombre de ventana, se devolver el ID del componente o, si no hay dicho componente, se devolver una serie vaca. Si se especifica un tipo de bsqueda, se utilizarn las siguientes reglas cuando se busque un componente con el nombre dado: 0 (valor por omisin) - Devolver el primer componente con el nombre dado. 1 - Devolver todos los componentes con el nombre dado. 2 - Si slo hay un componente con este nombre, debe devolverse; en caso contrario, no debe devolverse nada. Solicita al usuario el nombre del proyecto y guarda el proyecto. Devuelve un 1 para indicar que se ha guardado el proyecto satisfactoriamente; en caso contrario, devuelve un 0. Solicita al usuario un proyecto existente. Devuelve el nombre de archivo del proyecto. Ejecuta el proyecto en uso. Guarda el proyecto en uso. Guarda el proyecto en uso con el nombre de proyecto especificado. Devuelve una serie que contiene los identificadores de todos los componentes seleccionados en la vista de rbol del proyecto.

PromptedSave

ninguno

PromptExisting

ninguno

Run Save SaveAs SelectedParts

ninguno ninguno nombreProyecto ninguno

Tabla 14. Destino: PartClass


Mandato AllAttributes Parmetro(s) ClassName Significado/Valor de retorno Devuelve una lista de los atributos soportados por el nombre de la clase especificada. Devuelve una lista de todas las clases de componentes disponibles. Cada elemento de la lista va entre comillas dobles, ya que algunos de ellos pueden constar de varias palabras (por ejemplo, los componentes de proveedor).

AllClasses

ninguno

384

Programacin con VisualAge RPG

Tabla 14. Destino: PartClass (continuacin)


AllEvents ClassName Devuelve todos los eventos registrados de la clase especificada. Devuelve una lista de todas las clases de componentes suministradas por IBM que no sean de proveedores. Devuelve la va de acceso de la dll que contiene el icono que representa la clase de componente especificada. Devuelve el ID de recurso del icono (en la dll especificada por IconDll) de la clase especificada. Devuelve 1 para indicar que la clase especificada en NombreClase es del tipo especificado; en caso contrario, devuelve 0. Los posibles valores de NombreTipo son: Frame, Canvas, MenuBar, NoteBook, NoteBookPage, PopUpMenu, SubMenu, MenuItem, Subfile y SubfileEntryField. Devuelve una lista de todas las clases de componentes de proveedores disponibles.

IBMClasses

ninguno

IconDll

ClassName

IconId

ClassName

IsType

NombreTipo

VendorClasses

ninguno

Tabla 15. Destino: Componente


Mandato ActionSubroutine Parmetro(s) IDComponente nombreEvento Significado/Valor de retorno Localiza la subrutina de la accin enlazada, el nombreEvento o crea un enlace y lo explora en caso de que no exista. Devuelve una lista de subrutinas de accin definidas para este componente. Devuelve todos los eventos registrados del componente especificado. Devuelve una lista de ID de componente delimitados por espacios en blanco que muestra todos los hijos del componente especificado. Si no se proporciona ningn IDComponente, se devuelve una lista de todas las ventanas del proyecto. Devuelve el nombre de clase del componente indicado.

ActionSubroutines

IDComponente

AllEvents

IDComponente

Children

[IDComponente]

ClassName

IDComponente

Captulo 25. Creacin de conectores

385

Tabla 15. Destino: Componente (continuacin)


CreateChild IDComponente nombreClase Crea un componente del nombre de clase especificado como hijo del componente indicado. Devuelve el IDComponente del componente recin creado. Crea un componente de la clase especificada. La clase debe ser un componente basado en marcos. Devuelve el IDComponente del componente recin creado.

CreateFrame

ClassName

DataInfo

dataType dataLength decimalPlaces

Devuelve una serie de tres nmeros, separados entre ellos por espacios en blanco. Los donde: componentes relacionados son, entre otros, el campo de entrada, dataType indica un valor el texto esttico y el campo de 0=Numrico o bien 1=Carcter entrada de subarchivo. dataLength expresa la longitud de los datos decimalPlaces indica el nmero de posiciones decimales

ExtraColorAreas IDComponente Ver Nota ms abajo

Devuelve el nmero de reas de color soportadas por el componente, en caso de que el componente soporte reas de color aparte del primer plano y el fondo. Obtiene el nombre de archivo definido para este componente. Si el componente no soporta archivos, el valor de retorno es una serie vaca. Obtiene el color del rea especificada. Devuelve una serie con 4 nmeros delimitados por espacios en blanco: useDefault - (0 1) redMix - (0 - 255) greenMix - (0 - 255) blueMix - (0 - 255)

FileName

IDComponente

GetColor

IDComponente [x] donde x corresponde al rea de color del componente indicado.

386

Programacin con VisualAge RPG

Tabla 15. Destino: Componente (continuacin)


GetFont IDComponente [x] donde x corresponde al rea de font del componente indicado. Obtiene el font del componente. Devuelve una serie vaca si el font no est soportado. En caso contrario, la primera parte de la serie devuelta es un 0 o un 1, indicando si se utiliza o no el font por omisin; la segunda palabra de la serie es el cuerpo; la tercera palabra de la serie es un nmero que rene estilos de font aplicables de entre: 1 - negrita 2 - cursiva 4 - subrayado 8 - tachado 16 - contorno El resto de la serie es el nombre del tipo de letra. Obtiene las coordenadas (x y ancho alto) del componente con relacin a su padre. Devuelve un 1 para indicar que el componente soporta un archivo (por ejemplo, lienzo, imagen, medios, etc.); en caso contrario, devuelve un 0. Devuelve un 1 para indicar que el rea de color est soportada; en caso contrario, devuelve un 0. Devuelve un 1 para indicar que el rea de font est soportada; en caso contrario, devuelve un 0. Devuelve la etiqueta del componente (si existe). Devuelve una lista de eventos para los que este componente tiene enlaces de accin. Devuelve el nombre del componente tal como se muestra en la vista de rbol y en el cuaderno de configuracin. Cuando se asigna el valor 1, abre y activa la ventana de diseo a la que pertenece el componente indicado. Si se asigna el valor de 0, se cerrar la ventana de diseo. Abre el cuaderno de configuracin del componente o, si el componente es un marco, abre la ventana de diseo correspondiente al componente. Abre el cuaderno de configuracin del componente.

GetRect

IDComponente

HasFile

IDComponente

IsColorArea IDComponente [x] Ver Nota ms abajo donde x corresponde al rea de color del componente indicado. IsFontArea IDComponente [x] donde x corresponde al rea de font del componente indicado. IDComponente IDComponente

Label LinkedEvents

Name

IDComponente

OpenDesignWindow IDComponente [1]

OpenPart

IDComponente

OpenSettings

IDComponente

Captulo 25. Creacin de conectores

387

Tabla 15. Destino: Componente (continuacin)


SetColor IDComponente Ver Nota ms abajo colorArea useDefault redMix greenMix blueMix SetCursored IDComponente Define el color del rea especificada. Consulte GetColor para obtener ms informacin acerca de los valores permitidos para cada parmetro. Si la ventana de diseo del componente est abierta, el componente pasa a ser el componente activo, pero el estado de la seleccin no vara. Si la ventana de diseo no est abierta, no tiene ningn efecto.

SetDataInfo

Establece las propiedades de los datos de un componente. No actualiza el cuaderno de donde: propiedades de un componente que ya est abierto o siendo partId es el ID de componente utilizado. El programador debe asegurarse de que los nuevos dataType indica un valor valores son compatibles con los 0=Numrico o bien 1=Carcter valores previamente existentes que ya se han definido para el dataLength expresa la longitud componente. Los componentes de los datos relacionados son, entre otros, el campo de entrada, el texto decimalPlaces indica el nmero esttico y el campo de entrada de de posiciones decimales subarchivo. partId dataType dataLength decimalPlaces IDComponente nombreArchivoNuevo Define el nombre de archivo para este componente. No tiene ningn efecto si el componente no soporta archivos. Define el font del componente. Intenta definir la etiqueta del componente. Si la etiqueta especificada no es vlida, aparece un mensaje de error. Devuelve un 1 para indicar que se ha definido la etiqueta; en caso contrario, devuelve un 0. Intenta definir el nombre del componente. Si no es posible hacerlo, aparece un mensaje de error. Si el componente tiene enlaces de accin asociados, aparece un mensaje preguntando al usuario si desea romperlos. Devuelve un 1 para indicar que el resultado ha sido satisfactorio o un 0 en caso contrario. Define las coordenadas (x y ancho alto) del componente con relacin a su padre.

SetFileName

SetFont SetLabel

partId fontArea setToDefault pointSize styles faceName IDComponente etiquetaNueva

SetName

IdComponente nombreNuevo

SetRect

IDComponente x y ancho alto

388

Programacin con VisualAge RPG

Tabla 15. Destino: Componente (continuacin)


SetSelected IDComponente [0|1] [0|1] Selecciona/deselecciona el componente especificado. El primer parmetro de la serie es activar y el segundo es exclusivo. Si no se especifica activar o exclusivo, se entiende que tienen el valor de 1. Exclusivo indica si la seleccin del componente debe deseleccionar el resto de componentes y activar indica si debe modificarse el estado de seleccin del componente. Define los estilos y los estilos ampliados del componente especificado. Observe que estos valores no se actualizarn necesariamente en el cuaderno de propiedades de la ventana de diseo si alguna de ellas est abierta. Este mandato est pensado para cuando se crea e inicializa un componente. Un 0 al final de esta serie indica que el valor est expresado en formato decimal, mientras que un 1 indica que se utiliza la notacin hexadecimal. Devuelve dos valores numricos separados por un espacio que representan los estilos y los estilos ampliados del componente especificado. Un 0 al final de esta serie indica que el valor est expresado en formato decimal, mientras que un 1 indica que se utiliza la notacin hexadecimal. Ampla la vista de rbol y se desplaza al componente indicado. Si se especifica un 1, tambin se activa la vista de rbol.

SetStyles

IDComponente estilos estilosAmpliados [0|1]

Styles

IDComponente [0|1]

Zoom

IDComponente [0|1]

Nota: Los componentes pueden tener un rea de color de primer plano (1), de fondo (0), no tener rea de color o tener reas de color adicionales. Las ventanas, por ejemplo, no tienen reas de color. Los recuadros de seleccin tienen reas de color de primer plano y de fondo. Los grficos tienen reas de color adicionales. Por tanto, 0 y 1 slo indican necesariamente el color de primer plano y de fondo si el componente no tiene colores adicionales.

Captulo 25. Creacin de conectores

389

Los siguientes mandatos requieren que el archivo fuente est abierto en LPEX.
Tabla 16. Destino: Subrutina
Mandato DeleteActionSub DeleteUserSub UserSubroutine Parmetro(s) nombreRutina nombreRutina nombreRutina Significado/Valor de retorno Suprime la subrutina de accin con el nombre especificado. Suprime la subrutina de usuario con el nombre especificado. Si la subrutina no existe, crea una subrutina de usuario con el nombre especificado y la ubica en el archivo fuente. Si existe, se ubica en el archivo fuente. Devuelve una lista de las subrutinas de usuario.

UserSubroutines

ninguno

Tabla 17. Destino: Cuadrcula


Mandato IsOn Parmetro(s) ninguno Significado/Valor de retorno Devuelve un 1 si la cuadrcula est activada y un 0 si est desactivada. Si se asigna el valor 1, se activar la cuadrcula. Si se asigna el valor de 0, se desactivar. (El valor por omisin es activado.)

TurnOn

[0|1]

Tabla 18. Destino: Lpex


Mandato DoIt IsSourceFileOpen Parmetro(s) Cualquier_mandato_LPEX ninguno Significado/Valor de retorno Pasa los parmetros a DoIt de LPEX. Devuelve un 1 para indicar que el archivo fuente est abierto; en caso contrario, devuelve un 0. Abre el archivo fuente en LPEX. Pasa los parmetros a Query de LPEX.

OpenSourceFile Query

ninguno Cualquier_consulta_LPEX

Tabla 19. Destino: Conector


Mandato AddPlugin Parmetro(s) nombreArchivo Significado/Valor de retorno Intenta aadir el conector especificado. Devuelve 0 si el resultado es satisfactorio.

390

Programacin con VisualAge RPG

Tabla 19. Destino: Conector (continuacin)


get nmeroConectores conector ndiceBasadoUno Devuelve el nmero de conectores instalados. Devuelve la va de acceso completa del conector que ocupa el lugar ndiceBasadoUno. Si n es menor que 1 o mayor que el nmero de conectores, se devuelve una serie nula. Devuelve una lista de las vas de acceso completas de todos los conectores. Invoca el conector utilizando una interfaz destino/mandato.

conectores

InvokePlugin

ndiceBasadoUno destino mandato parmetros

Tabla 20. Destino: Registro


Mandato DeleteKey Parmetro(s) clave Significado/Valor de retorno Este mandato suprimir la clave especificada del registro (incluidas las subclaves). Si no existe la clave, el valor de retorno es el valor por omisin; en caso contrario, es el valor de la clave en el registro. Cuando entre los datos, sustituya la serie valorOmisin por la serie que desee. Las comillas dobles son necesarias. Este mandato recuperar un rectngulo del registro y, si no se encuentra el elemento con la clave especificada, se devolvern los valores por omisin suministrados. Las comillas dobles son necesarias. Utilice este mandato para definir el valor de una serie en el registro. No hay valor de retorno. Este mandato almacenar el rectngulo especificado en el registro utilizando coordenadas normalizadas. Las comillas dobles son necesarias.

Get

clave [valorOmisin]

GetRect

clave [x y ancho alto]

Set

clave valor

SetRect

clave x y ancho alto

Nota acerca de cmo utilizar los mandatos del registro. Es muy recomendable que los conectores utilicen una subclave inicial que probablemente sea exclusiva, con el fin de que no interfieran con las entradas en el registro de otros conectores. Todas las entradas del registro creadas con estos mandatos estarn restringidas a una subseccin comn de la entrada de registro de VARPG; sin embargo, es posible solapar conectores.

Captulo 25. Creacin de conectores

391

Para evitar que se solapen, los conectores pueden utilizar una variacin del nombre de la va de acceso del archivo .PLG como subclave inicial, de la siguiente manera: Si el nombre de la va de acceso del conector es:
"c:\plugins\My_Plugins\myplug.plg",

y la entrada del registro debe utilizarse para almacenar la posicin de una ventana, una clave adecuada para este valor sera:
"c__plugins_my plugins_myplug.plg\Posicin ventana"

(Observe que se han eliminado las maysculas de la parte correspondiente a la va de acceso de la clave y que los dos puntos y las barras inclinadas invertidas se han convertido en caracteres de subrayado.) Las claves y los valores especificados deben ir entre comillas, ya que las claves pueden contener espacios. Por lo tanto, si deseara definir el valor de una serie, debera utilizar:
Set( "c__plugins_my_plugins_myplug.plg\Nombre clave relevante" "El valor nuevo.")

Las comillas incorporadas deben ir precedidas de una barra inclinada invertida:


Set( "c__plugins_my_plugins_myplug.plg\Nombre clave relevante" "El valor \"entre comillas\"nuevo.")

Hay otros mandatos que son aplicables a algunas de las propias ventanas constituyentes del Diseador GUI. (Por ejemplo, el catlogo de componentes.) Destinos aplicables: MainWindow Es la ventana principal del Diseador GUI. Catalog El catlogo de componentes. DBRefDlg La ventana Definir campos de referencia. ImportDlg La ventana Importar archivo de pantalla. LPEX La ventana del editor. Observe que estos mandatos slo son aplicables cuando la ventana especificada est abierta.
Tabla 21. Destino: Ventanas constituyentes del Diseador GUI
Mandato GetHandle Parmetro(s) ninguno Significado/Valor de retorno Devuelve el HANDLE de Windows de la ventana especificada. Devuelve el puntero de IWindow de la ventana especificada. Define el tamao y la posicin de la ventana. Desplaza la ventana a la posicin (X, Y). Devuelve la posicin de la ventana en la forma X, Y.

GetIWindowPointer MoveSizeTo MoveTo Position

ninguno X Y ancho alto XY ninguno

392

Programacin con VisualAge RPG

Tabla 21. Destino: Ventanas constituyentes del Diseador GUI (continuacin)


Rect ninguno Devuelve el rectngulo de la ventana en la forma X, Y, ancho, alto Activa la ventana indicada. Define el tamao de la ventana. Muestra la ventana (en caso de que no est visible) y la activa. Devuelve el tamao de la ventana en la forma X, Y. Especifica la ventana a la que debe notificarse que se cierra el Diseador GUI.

SetFocus SetSize ShowSetFocus Size NotifyOnClose

ninguno ancho alto ninguno ninguno Handle de ventana

Ejemplo de cdigo fuente de conector


A continuacin se muestra el cdigo fuente del conector que corresponde al archivo plg utilizado en la seccin anterior.
********************************************************************* * * * Program ID . . : WhoAmi * * * * Description . : Sample program to illustrate the Vendor plugin * * interface of VARPG. * * * * When invoked from the Vendor menu item on the * * GUI Designer this program will use the plugin * * interface to gather information about the * * current project and display it on a window * * named MAIN. * * * * The following plugin file, WHOAMI.PLG, was specified when adding * * this plugin to the GUI designer * * * * // WhoAmi.plg plug in file * * Vendor_Name: "Plug-Me-In Inc." * * Plugin_Name: "Who Am I?" * * Begin_Details: * * Who Am I? * * This plug-in will display information about the current * * project including its directory name and file name. * * End_Details: * * Command_Line: "d:\myproj\whoami\rt_win32\whoami.exe &1 &2"* * Menu_Name: "Plug-Me-In Inc./Who am I?" * * Supported_Menus: 1 * * Accelerator: F7 Shift * * End_of_Definition * * * ********************************************************************* * D Cmd S 255A * C *Entry Plist C Parm PlugDLL 64 C Parm PlugID 64

Captulo 25. Creacin de conectores

393

********************************************************************* * * * Ventana . : Main * * * * Componente : PB_Cancel * * * * Evento . . : Press * * * * Descripcin: Terminar el programa * * * ********************************************************************* * C PB_CANCEL BEGACT PRESS MAIN * C Move *on *inlr * C ENDACT * ********************************************************************* * * * Ventana . : Main * * * * Componente : Main * * * * Evento . . : Create * * * * Description: Set up the PLUGDLL and PLUGID values of the * * *COMPONENT part to establish communication with the * * GUI builder. * * * * Execute PLUGCMD attributes to collect information * * about the current project * * * ********************************************************************* * C MAIN BEGACT CREATE MAIN * C '*Component' Setatr PlugDll 'PlugDLL' C '*Component' Setatr PlugID 'PlugID' * C Eval Cmd='Project Get ProjectDir' C '*Component' Setatr Cmd 'PlugCmd' C '*Component' Getatr 'PlugResult' DirName * C Eval Cmd='Project Get ProjectFileStub' C '*Component' Setatr Cmd 'PlugCmd' C '*Component' Getatr 'PlugResult' File * C Eval Cmd='Project Get ProjectTargetName' C '*Component' Setatr Cmd 'PlugCmd' C '*Component' Getatr 'PlugResult' TAR

C C C C C C C C

* '*Component' '*Component' '*Component' '*Component'

Eval Setatr Getatr Eval Setatr Getatr Write ENDACT

Cmd='Project Get ProjectTitle' Cmd 'PlugCmd' 'PlugResult' Title Cmd='Project Get ProjectFileName' Cmd 'PlugCmd' 'PlugResult' Folder 'Main'

* *

394

Programacin con VisualAge RPG

Empaquetado de la aplicacin
El paso final de la creacin del conector es la compilacin del archivo .EXE. Seleccione Construir en el men desplegable Archivo y, a continuacin, la plataforma en la que desea utilizar el conector. Una vez que el archivo est compilado, ya estar listo para utilizarlo. Consulte las instrucciones de Adicin de conectores de proveedor para aadir el conector. A partir de este punto, ya puede utilizar el conector o realizar las pruebas que sean necesarias.

Consideraciones al crear conectores con VisualAge para C++


El proceso de creacin de conectores con VisualAge para C++ es el mismo que para VisualAge RPG. La nica diferencia es que cuando se crea el conector con VisualAge para C++, el programador no tiene el uso directo del componente *component. Para permitir que los programas de VisualAge para C++ puedan utilizarse como conectores, se proporciona la funcin IBMExecuteVDECommand(). Su uso se muestra en el conector de ejemplo TreeSamp. En caso de que sea necesario, se puede cortar y pegar el cdigo de los directorios x:\adtswin\samples\vndplugs\treesamp (donde x corresponde a la letra de la unidad de instalacin de VisualAge RPG) y x:\adtswin\samples\vndplugs\plugutil para crear las llamadas correctas a la funcin IBMExecuteVDECommand().

Consideraciones al crear conectores con REXX


El proceso de creacin de conectores con REXX es casi idntico al del ejemplo de VisualAge RPG. Los programadores de REXX no tienen acceso directo al Diseador GUI que utiliza el componente *component. Para facilitar el uso de scripts REXX como conectores, se incluye la funcin RexxExecuteVDECommand() entre este conjunto de funciones. En el conector de ejemplo RexxSamp se incluye un ejemplo de cmo utilizar esta funcin en un archivo REXX. En caso de que sea necesario, se puede cortar y pegar el cdigo del directorio x:\adtswin\samples\vndplugs\rexxsamp (donde x corresponde a la letra de la unidad de instalacin de VisualAge RPG) para crear las llamadas correctas a la funcin REXXExecuteVDECommand().

Captulo 25. Creacin de conectores

395

396

Programacin con VisualAge RPG

Parte 5. Distribucin de la aplicacin


Captulo 26. Cmo empaquetar el cdigo de tiempo de ejecucin y las aplicaciones en la pgina 399 Describe cmo utilizar el programa de utilidad de empaquetado. Captulo 27. Instalacin del cdigo de tiempo de ejecucin y las aplicaciones para Windows NT/95/98 en la pgina 407 Describe cmo utilizar el programa de utilidad de instalacin para aplicaciones Windows NT/95/98.

Copyright IBM Corp. 1994, 2000

397

398

Programacin con VisualAge RPG

Captulo 26. Cmo empaquetar el cdigo de tiempo de ejecucin y las aplicaciones


Despus de construir y probar la aplicacin, puede empaquetarla y distribuirla a otras estaciones de trabajo que tengan el cdigo de tiempo de ejecucin de VisualAge RPG instalado. Esta seccin describe cmo empaquetar el cdigo de tiempo de ejecucin de VisualAge RPG y las aplicaciones de VisualAge RPG Nota: Si la aplicacin va a utilizar un servidor AS/400 distinto de aqul al que se accedi durante el ciclo de desarrollo, todos los objetos de AS/400 utilizados por la aplicacin tambin deben empaquetarse y restaurarse en el nuevo servidor. La herramienta de empaquetado de aplicaciones VisualAge RPG no los empaqueta.

Antes de empezar
Asegrese de que los archivos que la aplicacin necesita se almacenan en el directorio de tiempo de ejecucin adecuado (RT_WIN32 para Windows NT/95/98 o RT_JAVA para Java;). Algunos archivos se colocan automticamente en el directorio de tiempo de ejecucin despus de construir la aplicacin (por ejemplo, los archivos MSG, HLP, DLL, BND, RST y EXE); otros deber colocarlos usted mismo (por ejemplo, BMP, GIF,ICO, JPG,MID, y WAV). Si coloca archivos adicionales en los directorios de tiempo de ejecucin antes de empaquetar la aplicacin, asegrese de que los nombres de archivo no sean los mismos que los de los archivos de aplicacin existentes. Despus de colocar todos los archivos en el directorio de tiempo de ejecucin, asegrese tambin de que no haya dos archivos que tengan el mismo nombre y de que no se d ninguna coincidencia en los dos primeros caracteres de su extensin de archivo. Por ejemplo, si tiene dos archivos FILEAABC y FILEAABB en el directorio RT_WIN32, uno se sobregrabar durante el proceso de empaquetado. Si desea empaquetar en disquetes, conviene tener disquetes preformateados disponibles antes de empezar el proceso de empaquetado.

Cmo empaquetar el cdigo de tiempo de ejecucin y las aplicaciones de VisualAge RPG


En esta seccin se describe el proceso que debe seguir para empaquetar el cdigo de tiempo de ejecucin de VisualAge RPG, una aplicacin o componentes compartidos. Nota: Verifique que el nombre de ubicacin remota en el archivo RST es el mismo servidor que utilizarn los usuarios. De lo contrario, modifique la columna Ubicacin remota para la entrada en la pgina Servidores del cuaderno Definir informacin de AS/400. Para acceder a este cuaderno desde el Diseador GUI, seleccione Definir informacin de AS/400 del men

Copyright IBM Corp. 1994, 2000

399

desplegable Servidor. Para acceder en el tiempo de ejecucin, utilice el icono Definir informacin de AS/400. Para acceder en tiempo de empaquetado, utilice el botn Cambiar servidor. En el archivo RST, tambin debe especificar el protocolo correcto utilizado por los usuarios. Para SNA, el nombre de ubicacin remota es el nombre del direccionador definido en Client Access. Para TCP/IP, el nombre de ubicacin remota es el nombre de sistema principal AS/400 definido en la lista de servidores TCP/IP.

Inicio de la herramienta de empaquetado


Para iniciar la herramienta de empaquetado utilice uno de estos mtodos: v Seleccione Proyecto>Empaquetar del Organizador de proyectos. v Seleccione la opcin Empaquetar del men emergente del icono de proyecto. v Seleccione Herramienta de empaquetado de aplicaciones del men Inicio>Programas>VisualAge RPG y CODE400>VisualAge para RPG. Aparecer la ventana Empaquetar aplicacin:

Especifique el sistema de destino de la aplicacin: v Windows NT/95/98 Empaqueta la versin Windows de su aplicacin para la plataforma Windows NT/95/98. v Aplicaciones Java para Windows NT/95/98 Empaqueta la versin Java de su aplicacin para la plataforma Windows NT/95/98. v Aplicacin/applet Java para todas las plataformas Empaqueta la versin Java de su aplicacin para otros sistemas operativos.

400

Programacin con VisualAge RPG

Cmo empaquetar aplicaciones Windows para Windows NT/95/98


Seleccione Windows NT/95/98 y pulse Aceptar. Aparece el dilogo Ventana de empaquetado:

Especifique lo siguiente: v Lo que se desea empaquetar v La informacin de empaquetado de la aplicacin v La informacin de empaquetado del tiempo de ejecucin

Especificacin de lo que se desea empaquetar


En la ventana Empaquetar especifique la informacin siguiente: Nombre de aplicacin El nombre del proyecto de aplicacin totalmente calificado. Puede escribir encima del valor por omisin (si lo hay) o utilizar el pulsador Buscar para invocar la ventana Buscar proyectos para empaquetar. Cuando se especifica un nombre de proyecto de aplicacin, se visualiza el ttulo de la aplicacin con carcter informativo. Lo que se desea empaquetar Utilice los recuadros de seleccin para indicar si desea empaquetar la aplicacin, los componentes compartidos, el cdigo de tiempo de ejecucin o los tres elementos. Si se seleccionan componentes compartidos, se abrir una ventana con una lista de los componentes compartidos. Se pueden seleccionar los componentes compartidos de la lista que se desean empaquetar. Utilice los botones de seleccin para indicar si desea empaquetar toda la aplicacin o slo los componentes seleccionados. Si elige empaquetar componentes seleccionados, se abrir una ventana con una lista de componentes de la aplicacin que pueden seleccionarse. Tambin se
Captulo 26. Cmo empaquetar el cdigo de tiempo de ejecucin y las aplicaciones

401

pueden empaquetar componentes compartidos adicionales creados con otras aplicaciones. Estos componentes compartidos se aadirn automticamente a la lista la prxima vez que elija empaquetar por componentes.

Especificacin de la informacin de empaquetado de la aplicacin


Una vez haya finalizado sus selecciones en la ventana de empaquetado, pulse Aceptar. Aparece la ventana de informacin sobre el empaquetado:

En la ventana Informacin de empaquetado, especifique la informacin siguiente: Directorio destino El directorio destino para el empaquetado. Si se empaqueta en un disquete, el directorio destino slo puede ser el directorio raz del disquete: no puede haber ningn subdirectorio. Si empaqueta en un directorio, ese directorio no debe contener otros archivos. Nombre de la compaa El nombre de la compaa con el que se registrar la aplicacin. Nota: Cuando empaquete una versin actualizada de una aplicacin distribuida con anterioridad, utilice el mismo nombre de compaa para la aplicacin revisada. De lo contrario, la aplicacin revisada ser tratada como si fuera nueva. Versin La versin de la aplicacin. Ttulo El ttulo de la aplicacin.

402

Programacin con VisualAge RPG

Aqu puede utilizar el botn Cambiar servidor para visualizar una lista de servidores (ubicaciones remotas) utilizados por su aplicacin. Puede modificar la lista para que el paquete utilice los nuevos nombres. Seleccione Empaquetar para iniciar el empaquetado. Aparece una ventana de indicador de progreso. Se visualizan mensajes para indicar al usuario las etiquetas que debe poner en los diversos disquetes a medida que los crea. Cuando se ha completado el empaquetado, se visualiza un mensaje de realizacin.

Cmo especificar la informacin de empaquetado del tiempo de ejecucin


Si ha especificado que desea empaquetar el cdigo de tiempo de ejecucin, debe especificar el directorio destino en la ventana Empaquetar tiempo de ejecucin:

Si se empaqueta en un disquete, el directorio destino slo puede ser el directorio raz del disquete: no puede haber ningn subdirectorio. Si empaqueta en un directorio, ese directorio no debe contener otros archivos. Seleccione Empaquetar para iniciar el empaquetado. Aparece una ventana de indicador de progreso. Un mensaje le indicar que el proceso se ha completado.

Cmo empaquetar aplicaciones Java para Windows NT/95/98


El empaquetado de la versin Java de su aplicacin para la plataforma Windows NT/95/98 sigue un proceso similar al de la versin de Windows. Especifique lo que desea empaquetar y si desea empaquetar el tiempo de ejecucin. Si desea empaquetar la aplicacin, especifique el nombre del proyecto de aplicacin y seleccione el recuadro de seleccin de la aplicacin. Utilice el recuadro de seleccin de tiempo de ejecucin para empaquetar el tiempo de ejecucin.

Captulo 26. Cmo empaquetar el cdigo de tiempo de ejecucin y las aplicaciones

403

Cmo empaquetar aplicaciones Java para otras plataformas


Seleccione Aplicacin/applet Java para todas las plataformas en la ventana Empaquetar aplicacin y pulse Aceptar. Aparece la ventana Empaquetar Java:

Especifique lo siguiente: v Especifique lo que desea empaquetar: la aplicacin, el tiempo de ejecucin o ambos. v El formato de su paquete: los archivos de aplicacin (slo vlidos si elige Aplicacin) o bien el archivo Jar.

Especificacin de lo que se desea empaquetar


En la ventana Empaquetar Java especifique la siguiente informacin: Nombre de aplicacin El nombre del proyecto de aplicacin totalmente calificado. Puede escribir encima del valor por omisin (si lo hay) o utilizar el pulsador Buscar para visualizar la ventana Buscar proyectos para empaquetar. Cuando se especifica un nombre de proyecto de aplicacin, se visualiza el ttulo de la aplicacin con carcter informativo. Lo que se desea empaquetar Indique si desea empaquetar la aplicacin o el archivo Jar de tiempo de ejecucin. Si elige Aplicacin, puede seleccionar uno de los formatos siguientes:

404

Programacin con VisualAge RPG

v Archivos de aplicacin Incluye todos los archivos en el directorio de tiempo de ejecucin y los coloca en el directorio destino. v Archivo Jar Incluye todos los archivos para un componente en su propio archivo Jar. (Cualquier archivo de imagen GIF se copiar y no se incluir en el archivo Jar.) v Incluir JDBC Incluir el archivo de funciones de la clase JDBC en el jar.

Cmo empaquetar el archivo Jar de aplicacin


Si selecciona que su aplicacin se empaquete como archivo Jar, aparece la siguiente ventana:

Especifique el directorio destino. Tambin puede especificar opciones Jar. Si selecciona Incluir archivo HTML, la pgina HTML por omisin para la aplicacin se copiar en el directorio de destino. Si selecciona Exportar a AS/400, se visualizar la Smart Guide para exportar archivos al sistema AS/400. Nota: Si su aplicacin tiene componentes mltiples, cada componente dispondr de su archivo Jar. Asimismo, cualquier archivo de imagen GIF slo se copiar y no ser incluido en el archivo Jar.

Captulo 26. Cmo empaquetar el cdigo de tiempo de ejecucin y las aplicaciones

405

Cmo empaquetar el tiempo de ejecucin


Si selecciona un archivo Jar de tiempo de ejecucin, aparece la siguiente ventana:

Especifique el nombre del archivo Jar y el directorio de destino. Si selecciona Exportar a AS/400, se visualizar la Smart Guide para exportar archivos al sistema AS/400.

406

Programacin con VisualAge RPG

Captulo 27. Instalacin del cdigo de tiempo de ejecucin y las aplicaciones para Windows NT/95/98
En esta seccin se describe la instalacin del cdigo de tiempo de ejecucin y de aplicaciones para Windows NT/95/98, mediante InstallShield. Nota: El cdigo de tiempo de ejecucin siempre debe instalarse antes de instalar una aplicacin. Slo se instala una sola copia del cdigo de tiempo de ejecucin en una estacin de trabajo, sin importar cuntas aplicaciones se instalen en la misma.

Instalacin del cdigo de tiempo de ejecucin


Inicie el programa de utilidad de instalacin mediante el mandato
setup.exe

del paquete y siga los pasos indicados en los recuadros de dilogo. Los programas de utilidad Definir conexin a servidores, Definir informacin de AS/400 y Definir lista de servidores TCP/IP se instalan con el cdigo de tiempo de ejecucin. Utilice estos programas de utilidad para mantener y actualizar los nombres y la ubicacin de los recursos de AS/400 en el cdigo de tiempo de ejecucin. Consulte el Captulo 8. Conectividad con AS/400 en la pgina 189 para obtener ms informacin.

Nota acerca del SQL incorporado


Si la aplicacin tiene el SQL incorporado y hace referencia a una base de datos con la que la aplicacin no se enlaz durante el tiempo de construccin, tiene que volver a enlazar la aplicacin con una base de datos a la que tenga acceso.

Instalacin de una aplicacin


Instale la aplicacin llamando al mandato
setup.exe

del paquete y siga los pasos indicados en los recuadros de dilogo. El programa de utilidad Definir informacin de AS/400 se puede instalar opcionalmente con la aplicacin. Utilice este programa de utilidad para mantener y actualizar los nombres y la ubicacin de los recursos de AS/400 en el cdigo de tiempo de ejecucin. Consulte el Captulo 8. Conectividad con AS/400 en la pgina 189 para obtener ms informacin.

Mantenimiento del cdigo de tiempo de ejecucin y las aplicaciones


Para actualizar el cdigo de tiempo de ejecucin o de aplicacin, utilice el mismo programa de instalacin. Para eliminar el cdigo de tiempo de ejecucin o las aplicaciones VisualAge RPG, realice las acciones siguientes:

Copyright IBM Corp. 1994, 2000

407

1. En el men emergente Inicio de Windows NT/95/98 en la Barra de tareas, seleccione Configuracin y Panel de control. 2. Invoque el programa de utilidad Agregar/quitar programas.

Instalacin desde la LAN


Esta seccin contiene informacin sobre las aplicaciones Windows que se ejecutan en Windows NT/95/98. Para ejecutar desde la LAN: 1. Empaquete el cdigo de tiempo de ejecucin o las aplicaciones en un servidor LAN. 2. Instale el cdigo de tiempo de ejecucin o las aplicaciones en el directorio raz del mismo servidor. El nombre del directorio debera ser VRPGRT_LAN para el cdigo de tiempo de ejecucin o XXX_LAN para la aplicacin. XXX es el nombre del archivo ejecutable de la aplicacin. 3. Instale el cdigo de tiempo de ejecucin en la estacin de trabajo cliente mediante el paquete del paso 1. Seleccione la opcin compactada. 4. Instale la aplicacin mediante el paquete del paso 1. Seleccione la opcin compacta.

Instalacin silenciosa desde la LAN


En esta seccin se describe cmo instalar el cdigo de tiempo de ejecucin o las aplicaciones de manera silenciosa desde un servidor LAN. Los pasos bsicos son los siguientes: 1. Empaquete el cdigo de tiempo de ejecucin o aplicacin en el servidor LAN utilizando el programa de utilidad de empaquetamiento. (Consulte el tema Cmo empaquetar el cdigo de tiempo de ejecucin y las aplicaciones de VisualAge RPG en la pgina 399 para obtener instrucciones). 2. Instale el tiempo de ejecucin o la aplicacin en el servidor LAN mediante la opcin -r del programa de instalacin:
setup -r

El parmetro r permite que el sistema grabe las pulsaciones de teclas efectuadas durante el proceso de instalacin. Esta informacin se almacena en el archivo setup.iss que se crea en el directorio de Windows. Estas pulsaciones de teclas se utilizarn en la instalacin silenciosa. 3. Copie el archivo setup.iss del directorio de Windows al directorio LAN en el que ha empaquetado el tiempo de ejecucin o la aplicacin. Por ejemplo, si c:\winnt es el directorio de Windows, el archivo setup.iss se encontrar bajo c:\winnt. Nota: Asegrese de copiar el archivo setup.iss del tiempo de ejecucin antes de instalar la aplicacin en el directorio LAN con la opcin r. De lo contrario, el archivo setup.iss de la instalacin de la aplicacin se grabar encima del archivo setup.iss que ha creado la instalacin del tiempo de ejecucin. 4. Modifique la copia del archivo setup.iss situado en el directorio LAN en el que ha empaquetado el tiempo de ejecucin o la aplicacin. Cambie la entrada szDir de modo que apunte a la unidad y el directorio de destino en el que debe instalarse el paquete del tiempo de ejecucin o aplicacin. 5. En la estacin de trabajo cliente, dirjase al directorio LAN en el que se ha empaquetado el tiempo de ejecucin o la aplicacin. Ejecute el siguiente mandato:

408

Programacin con VisualAge RPG

setup -s

Tras instalar el tiempo de ejecucin, concluya el sistema operativo y rearrnquelo.

Captulo 27. Instalacin del cdigo de tiempo de ejecucin y las aplicaciones para Windows NT/95/98

409

410

Programacin con VisualAge RPG

Parte 6. Apndices

Copyright IBM Corp. 1994, 2000

411

412

Programacin con VisualAge RPG

Apndice A. Archivos de aplicacin


Esta seccin describe todos los archivos que VisualAge RPG produce cuando se crea una GUI, se escribe una lgica o se construye una aplicacin. A menos que se haya especificado, no edite, renombre o elimine estos archivos del directorio en que se crearon. Nota: Para aplicaciones Java, es RT_JAVA. Para aplicaciones de Windows NT/95/98, es RT_WIN32.
Tabla 22. Archivos de aplicacin
Nombre de archivo nombrearchivo.CLASS Formato Binario Descripcin El directorio de tiempo de ejecucin contiene el archivo nombrearchivo.CLASS, que se crea cuando se compila un proyecto para Java. El directorio de tiempo de ejecucin contiene el archivo nombrearchivo.DLL, que se crea mediante el archivo .VPG. Una DLL VisualAge RPG es el objeto programa para la aplicacin. El compilador tambin puede crear una DLL del programa de utilidad y su archivo .LIB correspondiente. El directorio fuente de la aplicacin contiene el archivo nombrearchivo.EVT, que contiene errores de retorno del compilador. El directorio de tiempo de ejecucin contiene el archivo nombrearchivo.EXE, que contiene la lnea principal del tiempo de ejecucin. El compilador tambin puede crear un EXE que contenga el archivo de ejecucin. El directorio de tiempo de ejecucin contiene el archivo nombrearchivo.HLP, que es el archivo de ayuda compilado que se cre utilizando los archivos .IPF, .IPM, .VPG y .TXM. El directorio fuente de la aplicacin contiene el archivo nombrearchivo.HTM, que incluye cdigo HTML para la ejecucin del programa Java compilado como una applet. El directorio fuente de la aplicacin contiene el archivo nombrearchivo_applet.HTM, que incluye cdigo HTML que verifica el tiempo de ejecucin de Java en VARPG para asegurarse de que el usuario tiene la versin correcta instalada como extensin. El directorio fuente de la aplicacin contiene el archivo nombrearchivo.IPF, que contiene toda la informacin de control necesaria para crear ayuda en lnea.

nombrearchivo.DLL

Binario

nombrearchivo.EVT

ASCII

nombrearchivo.EXE

Binario

nombrearchivo.HLP

Binario

nombrearchivo.HTM

ASCII

nombrearchivo_applet.HTM

ASCII

nombrearchivo.IPF

ASCII

Copyright IBM Corp. 1994, 2000

413

Tabla 22. Archivos de aplicacin (continuacin)


Nombre de archivo nombrearchivo.IPM Formato ASCII Descripcin El directorio fuente de la aplicacin contiene el archivo nombrearchivo.IPM, que contiene toda la ayuda de segundo nivel escrita para los mensajes de las ventanas y sus componentes. v No renombre o elimine este archivo del directorio en el que se cre. v Utilice el Diseador GUI (ventana Definir mensajes) para editar este archivo. Si debe editar este archivo fuera del Diseador GUI, limite las modificaciones a la simple edicin de texto, como la correccin de errores gramaticales y de ortografa. No elimine ni modifique los ID de recurso, ni aada o suprima mensajes. El directorio fuente de la aplicacin contiene el archivo nombrearchivo.JAVA, que contiene la fuente Java generada como resultado de una compilacin de Java. El archivo nombrearchivo.LIB contiene todos los procedimientos exportados que forman parte de un nombrearchivo.DLL del programa de utilidad. El directorio fuente de la aplicacin contiene el archivo nombrearchivo.LST, que contiene el listado de compilacin. El directorio fuente de la aplicacin contiene el archivo nombrearchivo.ODF, que contiene toda la informacin sobre las ventanas de la aplicacin y sus componentes. v No renombre o elimine este archivo del directorio en el que se cre. v Este archivo slo puede editarse mediante el Diseador GUI. El directorio fuente contiene el archivo nombrearchivo.ODX, que se crea mediante nombrearchivo.ODF y se utiliza en tiempo de ejecucin. El directorio de tiempo de ejecucin contiene el archivo nombrearchivoRecursos.propiedades, que contiene todos los mensajes escritos para las ventanas y sus componentes, en formato Java.

nombrearchivo.JAVA

ASCII

nombrearchivo.LIB

Binario

nombrearchivo.LST

ASCII

nombrearchivo.ODF

Binario o ASCII

nombrearchivo.ODX

ASCII

nombarchRecursos.propiedades ASCII

414

Programacin con VisualAge RPG

Tabla 22. Archivos de aplicacin (continuacin)


Nombre de archivo nombrearchivo.RST Formato ASCII Descripcin El directorio fuente contiene la copia maestra de este archivo. nombrearchivo.RST contiene todos los pseudnimos de servidores, alteraciones temporales de archivos, alteraciones temporales de reas de datos, alteraciones temporales de programas y la informacin de nivel de bloqueo definida para la aplicacin. Puede cambiar el contenido de este archivo en tiempo de construccin utilizando el Diseador GUI, o utilizando el programa de utilidad Definir informacin de AS/400 en tiempo de ejecucin. El directorio fuente de la aplicacin contiene el archivo nombrearchivo.TXC, que contiene todas las notas de programacin guardadas en los campos de edicin de varias lneas proporcionados para almacenar descripciones tcnicas. v No renombre o elimine este archivo del directorio en el que se cre. v Para cambiar los valores de un componente utilice un cuaderno de valores. El directorio fuente de la aplicacin contiene el archivo nombrearchivo.TXM, que contiene todos los mensajes escritos para las ventanas y sus componentes. v No renombre o elimine este archivo del directorio en el que se cre. v Utilice el Diseador GUI (ventana Definir mensajes) para editar este archivo. Si debe editar este archivo fuera del Diseador GUI, limite las modificaciones a la simple edicin de texto, como la correccin de errores gramaticales y de ortografa. No elimine ni modifique los ID de recurso (idrec), ni aada o suprima mensajes. Los directorios de tiempo de ejecucin y de fuente de la aplicacin contienen el archivo nombrearchivo.VCX, que contiene informacin de permanencia para cualquier componente ActiveX utilizado en su aplicacin. El directorio fuente de la aplicacin contiene el archivo nombrearchivo.VPF, que contiene todo el texto de ayuda escrito para las ventanas y sus componentes. v No renombre o elimine este archivo del directorio en el que se cre. v Puede editar este archivo utilizando el editor del Diseador GUI (mediante un men emergente para un componente o mediante un cuaderno de propiedades).

nombrearchivo.TXC

ASCII

nombrearchivo.TXM

ASCII

nombrearchivo.VCX

Binario

nombrearchivo.VPF

ASCII

Apndice A. Archivos de aplicacin

415

Tabla 22. Archivos de aplicacin (continuacin)


Nombre de archivo nombrearchivo.VPG Formato ASCII Descripcin El directorio fuente de la aplicacin contiene el archivo nombrearchivo.VPG, que contiene todo el cdigo fuente escrito de la aplicacin VisualAge RPG. v No renombre o elimine este archivo del directorio en el que se cre. v Utilice el Diseador GUI para editar el cdigo fuente.

416

Programacin con VisualAge RPG

Apndice B. Cmo escribir aplicaciones de cliente ligero


Las aplicaciones VisualAge RPG que fundamentalmente se ejecutan y utilizan los recursos de las estaciones de trabajo se denominan aplicaciones de cliente grueso. Las aplicaciones de cliente ligero esencialmente confan al servidor AS/400 la realizacin de sus procesos y limitan al cliente al tratamiento de la GUI. Las aplicaciones de cliente grueso siguen el estilo de programacin que puede encontrarse en las aplicaciones actuales de RPG III o RPG IV, pero esencialmente se ejecutan en la estacin de trabajo en lugar de en el servidor AS/400. Las especificaciones de archivo se utilizan para especificar que base de datos debe accederse y las operaciones de RPG nativo como READ, CHAIN y otras, se utilizan para acceder a los datos del servidor. El sistema AS/400 funciona como servidor de datos y realiza clculos mnimos para dar soporte a la aplicacin VARPG. El modelo de cliente grueso tiene varias desventajas si lo comparamos con el cliente ligero. Su capacidad de reutilizacin de mdulos es muy limitada y se produce un incremento en el coste de la actividad general asociada a la gestin de cambios. De igual manera, el traslado del proceso a la estacin de trabajo cliente utiliza la energa de proceso del servidor. El aligeramiento de la porcin cliente de una aplicacin ofrece las ventajas siguientes: v Se puede reducir fcilmente la cantidad de cdigo que se ejecuta en el cliente. v Se mejora la capacidad de reutilizacin de la aplicacin. v Se facilita el mantenimiento de cdigo complejo. Esta seccin habla sobre dos implementaciones posibles del modelo de cliente ligero. Ambas implementaciones aprovecha diversas capacidades de VARPG que proporcionan integracin con el servidor AS/400. Ambos ejemplos incluyen capacidades que utilizan: v Descripcin externa de las estructuras de datos para definir con facilidad datos descritos externamente en una estructura de datos sin necesidad de utilizar el acceso directo a archivos. v Interfaz de llamada remota para proporcionar una forma sencilla de invocar programas de servidor y enviar datos. v Campos de referencia del Diseador GUI. Los campos del subarchivo de la interfaz de usuario se definen como campos de referencia, no se necesita una definicin adicional de los campos de la base de datos.

Cmo implementar el modelo de aplicacin VARPG ligera


El modelo de aplicacin VARPG ligera puede implementarse de varias formas distintas. Describiremos dos de ellas. Una implementacin utiliza llamadas remotas a un sistema AS/400; la otra utiliza colas de datos en el sistema AS/400. En ambos casos se utiliza la misma interfaz de usuario. La aplicacin de cliente simple lee datos de un archivo de un cliente y rellena un subarchivo con 10 registros cada vez. La siguiente ilustracin muestra la interfaz de usuario de esta aplicacin:

Copyright IBM Corp. 1994, 2000

417

Figura 109. Interfaz GUI de cliente

La interfaz consiste en una ventana con lienzo, un subarchivo y un pulsador para cargar una pgina de registros Ms en el subarchivo. El tamao del subarchivo para este ejemplo concreto es de 10 registros. Puede cambiarse incrementando la altura del componente subarchivo. En el ejemplo se utilizan los siguientes nombres: Componente Nombre Ventana WIN1 Subarchivo SUB1 Pulsador PSBMORE

Aplicacin de ejemplo que utiliza llamadas remotas


En los programas RPG AS/400 tradicionales, el cdigo de la interfaz y la lgica de acceso a la base de datos estn mezclados en un mdulo. Parte de esta estructura se origina en la historia de RPG y otra parte en el uso del OPM (Original Program Model) que obliga al programador a conseguir un alto rendimiento. Una forma de implementar el modelo de aplicacin ligera es subdividir completamente la lgica de la interfaz de usuario de la lgica de acceso a la base de datos y hacer que cada parte se ejecute en diferentes sistemas. La lgica de la interfaz de usuario se ejecuta en un cliente Windows, la lgica de acceso a la base de datos se ejecuta en el servidor AS/400. Esta aplicacin de ejemplo muestra cmo dar soporte a la lectura de registros de datos de la base de datos AS/400 y cmo poner esos datos en un subarchivo GUI. El programa que est en el servidor AS/400 puede tambin dar soporte a un

418

Programacin con VisualAge RPG

acceso completo a la base de datos (READ y WRITE). Esto podra implementarse proporcionando un programa por cada para cada mtodo de acceso diferente o pasando las operaciones deseadas como parmetros a un nico programa servidor. El siguiente diagrama muestra cmo funciona este ejemplo:
Interfaz de llamada entre cliente y servidor Rellenar subarchivo

Programa cliente

Subarchivo

Cliente AS/400

Estructura de datos El cliente llama al


programa servidor - accede a la base de datos - finaliza con RETURN - pasa los datos de la DS como parmetro

Programa servidor
Archivo de base de datos

El programa cliente recibe peticiones desde la interfaz de usuario. Invoca un programa servidor que lee los registros de un programa de la base de datos y pasa esos datos de nuevo al cliente mediante parmetros. El subarchivo se va llenando con los datos devueltos.

El programa cliente
El principal componente del componente cliente del programa es la interfaz de usuario. Se crea de la misma forma que cualquier aplicacin VARPG y puede utilizar las descripciones externas de base de datos del AS/400 mediante el uso de campos de referencia a base de datos. Cualquier comprobacin de la validacin especificada en la base de datos la realiza el tiempo de ejecucin de VARPG automticamente en el cliente. El programa cliente solicita datos del servidor invocando un programa de acceso a datos del servidor; los datos en s se pasan a travs de parmetros. El programa cliente no utiliza especificaciones de archivo; en su lugar, la definicin de los datos se realiza mediante estructuras de datos descritas externamente. De esta forma el programador sigue disponiendo de las ventajas de las descripciones externas de campo en los programas VARPG.

Fuente RPG de ejemplo para el componente cliente


El programa VARPG consiste en especificaciones D y C. Las especificaciones D contienen las siguientes definiciones de datos: v Los campos utilizados como parmetros: cust, una estructura de aparicin mltiple custelem, un campo numrico, que contiene el nmero mximo de registros que se estn solicitando eof, un indicador nombrado, que se pasa cuando el indicador de fin de archivo se establece en ON en el programa servidor nrecords, un campo numrico, que contiene el nmero de registros devueltos v Dos campos de trabajo: fileend, un indicador de nombre, para mantener la condicin de fin de archivo counter, un contador para el bucle DO

Apndice B. Cmo escribir aplicaciones de cliente ligero

419

v getrec, una constante, que define el programa al que llama el servidor. Define el enlace con el servidor y el nombre del programa servidor. El nombre del programa debe especificarse en maysculas.
H D D D D D D D D D D cust eof nrecords fileend getrec counter custelem e ds s s s c s s extname(customer) occurs(10) inz inz

n 2 0 n inz linkage(*server) const('GETREC') 2 0 2 0 inz(%elem(cust))

Las especificaciones C contienen una subrutina de accin que tiene un enlace con 3 eventos: v El evento Press del pulsador PSBMore v El evento Create de la ventana Win1 (Con un enlace con la subrutina de accin PSBmore/press) v El evento Pageend del subarchivo Subf1 La primera sentencia es una llamada al programa servidor para que proporcione ms registros. El resto de la lgica se limita a procesar los datos pasados mediante parmetros y los traslada al subarchivo desde la estructura de datos de aparicin mltiple. Una vez que el subarchivo se ha llenado con un conjunto de registros el nmero ms alto de registros del subarchivo se aplica al atributo SETTOP para trasladar este conjunto de registros al rea visible del subarchivo. Al final, si se alcanza el fin de archivo, el pulsador Ms se inhabilita. Observe que las teclas Av Pg todava funcionan. Es todava posible provocar un evento que desencadene esta subrutina de accin incluso con un pulsador inhabilitado.
C C C C C C C C C C C C C C C C C C C C C * PSBmore begact call parm parm parm parm eval dow occur write eval enddo eval PRESS GETREC win1 cust custelem eof nrecords

counter

counter=1 counter<=nrecords and not fileend cust sub1 counter=counter+1 %setatr('win1': 'sub1':'settop')=%getatr('win1' 'sub1':'count') eof %setatr('win1': 'psbmore':'enabled')=0 fileend=*on

if eval eval endif endact

Como puede ver, la parte de cdigo que corresponde al cliente es sencilla y minimiza el proceso en la estacin de trabajo.

420

Programacin con VisualAge RPG

El programa servidor
Debido a que el programa cliente VARPG no incluye la lgica de acceso a la base de datos, el programa servidor ser quien proporcione ahora esta funcin. El programa servidor contiene todas las definiciones y operaciones FILE con las que trata el proceso de la base de datos. Los datos se intercambian trasladando una estructura de datos como parmetro entre los programas cliente y servidor. La estructura de datos contiene las definiciones de campo del formato de registro del archivo de datos. En este ejemplo, una estructura de datos de aparicin mltiple se utiliza para acceder a una coleccin de registros. El nmero de apariciones es el mismo que el nmero de registros que deben pasarse; en este ejemplo, 10. Cualquier informacin de tipo operativo, como por ejemplo la informacin de errores, puede tambin pasarse como parmetro. La llamada del programa cliente VARPG invoca al programa servidor, que finaliza tras cada llamada. El cdigo de la operacin Return se utiliza para finalizar el programa y mantener el entorno de llamada. Esto supondr ventajas en el rendimiento para las llamadas posteriores, al no precisar de inicializacin. Asimismo, precisa que se haya creado el programa para ejecutarse en un grupo de activacin nombrado, ya que *NEW destruira inmediatamente el entorno de llamada y el espacio disponible.

Fuente RPG de ejemplo para el componente servidor


La especificacin de archivo define el archivo de base de datos externo Customer. Las especificaciones de definicin de datos definen los parmetros a pasar. Estos deben definirse de la misma forma que en el componente cliente. La cuenta de registros representa una variable de trabajo para el contador del bucle DO. Custelem contiene el nmero de elementos de la estructura de datos CUST y se utiliza como lmite para el bucle DO.
* Programa para leer un conjunto de registros en una estructura de datos ********************************************************** Fcustomer if e disk D cust e ds extname(customer) D occurs(20) D eof s n D count s 2 0 D custelem s 2 0

Al principio de las especificaciones de clculo, el cdigo de operacin PLIST define los parmetros que se pasan a este programa. El bucle DO lee del archivo de base de datos y pone los datos en la estructura de datos CUST, que a su vez volver a pasarse al programa cliente como un parmetro. Los otros dos parmetros slo indican el estado del acceso a la base de datos: v EOF se establecer en ON si la sentencia READ establece el indicador 99. v La cuenta de registros contiene el nmero de registros que vuelven a pasarse al cliente en la estructura de datos CUST.
C C C C C C C C C C C C C C *entry plist parm parm parm parm eval occur read dow eval occur read enddo if cust custelem eof count

count

count

count=1 cust customer count<custelem and not *in99 count=count+1 cust customer *IN99

9999

9999

Apndice B. Cmo escribir aplicaciones de cliente ligero

421

C C C C

eval eval endif return

count=count-1 eof=*on

Al compilar el programa servidor, asegrese de no especificar *NEW para el grupo de activacin. Si se especifica *NEW (el valor por omisin), todo el almacenamiento asignado por este programa se liberar al ejecutar RETURN. Una de las ventajas de este ejemplo de cliente ligero es la reutilizacin de la aplicacin de servidor por distintas aplicaciones. Incluso las aplicaciones 5250 tradicionales pueden utilizar mdulos de servidor para acceder a bases de datos. De esta forma se facilita el mantenimiento de aplicaciones ya que los cambios en un mdulo de servidor se reflejan en todas las aplicaciones que lo utilizan.

Aplicaciones de ejemplo que utilizan colas de datos


El sistema AS/400 proporciona soporte de colas de datos incorporado para permitir la comunicacin asncrona entre aplicaciones. Esta aplicacin de ejemplo aprovecha las colas de datos, en lugar de pasar parmetros, para intercambiar los datos de la base de datos con el programa cliente VARPG. Esta aplicacin est basada en dos colas de datos del servidor utilizadas por los programas cliente y servidor. El programa servidor de este ejemplo se inicia como un programa independiente en el servidor utilizando la palabra clave NOWAIT en las especificaciones D del programa cliente. Los diagramas siguientes ilustran cmo funciona este ejemplo. Primero, se crean dos colas de datos y se inicia el programa servidor DATAQ. El programa servidor empieza a solicitar datos de la cola de datos O y permanece en espera indefinida.
El programa servidor est a la espera de peticiones

Programa cliente Cliente AS/400 Cola de datos O

Subarchivo

Cola de datos I

En espera de peticiones

Programa servidor

El siguiente estado se especifica cuando un evento GUI solicita ms datos. (Consulte la Figura 109 en la pgina 418 para la interfaz de cliente.) Los tres eventos que desencadenan la subrutina de accin son: v Evento Create de la ventana v Evento Press del pulsador Ms... v Evento Pageend del subarchivo El programa cliente entonces espera datos de la cola de datos I. El programa servidor accede al archivo de base de datos y obtiene los datos.

422

Programacin con VisualAge RPG

El programa cliente solicita datos

Programa cliente
En espera de datos

Cliente Enviando peticin AS/400 Cola de datos O


Recibiendo peticiones Recibiendo datos

Cola de datos I

Programa servidor

En el tercer estado, el programa servidor llena la cola de datos I. El programa cliente se activa y transfiere los datos al subarchivo. Despus, el programa regresa a su estado inicial y el proceso vuelve a empezar.
El programa servidor enva datos
rellenando subarchivo con datos Recibiendo datos

Programa cliente

Subarchivo

Cliente AS/400 Cola de datos O Cola de datos I

Recibiendo datos

Programa servidor

Enviando datos

La aplicacin de cliente
La interfaz de usuario es la misma que la de la anterior aplicacin, esencialmente un subarchivo que se llena con datos de una base de datos del servidor AS/400. El subarchivo empieza a llenarse con el evento Create de la ventana, y contina cuando se presiona el pulsador Ms... o se produce un evento Pageend utilizando las teclas de avance de pgina. Esencialmente, se trata de lo mismo que en el anterior ejemplo. La configuracin de las colas de datos se realiza en la subrutina de inicializacin *INZSR, que invoca un programa en el servidor para crear dos colas de datos en una biblioteca del sistema AS/400. Para crear colas de datos exclusivas para cada cliente, los cinco ltimos caracteres de la direccin IP se codifican en el nombre de la cola de datos. Los caracteres I u O al final del nombre de una cola de datos proporcionan los nombres exclusivos para las colas de datos de entrada o de salida. El trabajo del servidor recibe mandatos de la cola de datos O; los mandatos se envan a la cola de datos O desde el programa cliente.
Apndice B. Cmo escribir aplicaciones de cliente ligero

423

Una vez creadas las colas de datos, el programa cliente invoca el programa servidor y le pasa los dos nombres de colas de datos. El programa servidor espera que la cola de datos O le enve mandatos del programa cliente. El programa cliente se activa mediante eventos GUI y entonces enva peticiones a la cola de datos O. Entonces espera a que la cola de datos I se llene de datos procedentes del trabajo del servidor. Cuando el programa cliente recibe una peticin de finalizacin, se invoca la subrutina *TERMSR para indicar al programa servidor que debe terminar y se eliminarn las dos colas de datos.

Fuente de ejemplo para el cliente


Este programa es algo ms extenso debido a que el entorno de cola de datos tambin debe gestionarse en l. Definiciones de datos Las definiciones de datos para el programa cliente: v El archivo DLL getHostName es un archivo DLL de Windows que se utiliza para obtener la direccin IP del cliente con la que crear nombres exclusivos para las colas de datos.
D* Prototipo para archivos DLL D* Este archivo dll obtiene la direccin IP de la estacin de trabajo, D* as como el nombre de sistema principal de WINDOWS TCPIP D* Este es el prototipo para invocar este archivo DLL D gethostname pr extproc('getHostName') D DLL('HOSTNAME.DLL') D Linkage(*STDCALL) D 10a D 15a D enthname s 10a D entipadd s 15a D* Series del mandato para crear y eliminar las colas de datos D QCMDEXC s 10 inz('QCMDEXC') D linkage(*server) D cmd s 256 INZ D cmdlen s 15p 5 inz(%size(cmd)) D cmd1 s 256 INZ('CRTDTAQ DTAQ(CWDATAQ/') D cmde s 256 INZ('DLTDTAQ DTAQ(CWDATAQ/') D cmd2 s 9 inz(') MAXLEN(') D* prefijo para el nombre de DATAQ D qname1 s 4 inz('CUSQ') D qname2 s 5 D* variables que contienen los dos nombres de colas de datos D* utilizados por un cliente D qnamei s 10 D qnameo s 10 D D* definir los programas RCVDTAQ y SNDDTAQ como programas de servidor D QRCVDTAQ s 10 inz('QRCVDTAQ') D linkage(*server) D QSNDDTAQ s 10 inz('QSNDDTAQ') D linkage(*server) D* definicin del programa servidor RPGIV D DATAQ s 10 inz('DATAQ') D linkage(*server) nowait D* estructura de datos que contiene datos de la base de datos D CustDS e ds extname(customer) occurs(10) D inz D* estructura de datos que contiene informacin de proceso D rinfo ds D eof n

424

Programacin con VisualAge RPG

D nrecords 2 0 D filler 20 D* lmite del bucle D custelem s 2 0 inz(%elem(CustDS)) D* indicador de que se ha alcanzado el fin de archivo D fileend s n D* parmetros para las API de cola de datos D msg_sz s 5 0 D Name_of_Q s 10 D Name_of_Lb s 10 D count s 2 0 D maxlen s 10 0 inz(%size(custds:*all)) D wait_time s 5 0

La subrutina de inicializacin Una vez se han creado las colas de datos RPG y la DATAQ del programa RPG servidor se ha iniciado, se invoca el programa mediante la palabra clave NOWAIT, con lo que el programa cliente no esperar a que acabe. Ambos programas estn funcionando de forma enteramente asncrona.
C* C* C* C* C C* C* C* C C* C* C C C C C C C C C C C C* C C C C C C C C C C C C* C C C C* C Subrutina de inicializacin empleada parar la configuracin del entorno servidor *inzsr begsr Obtener de la direccin IP con la que construir nombre exclusivos para las colas de datos entipadd contendr una direccin IP completa callp getHostName(enthname:entipadd) Nombre de construccin de las colas de datos 'I' y 'O' Agregar los 5 ltimos caracteres de la direccin IP a 'I' u 'O' eval qnameI= qname1 + %subst(entipadd:%len (%trim(entipadd))-5:5) + 'I' eval qnameO= qname1 + %subst(entipadd:%len (%trim(entipadd))-5: 5) + 'O' eval cmd=%trim(%trimr(cmd1) + qnamei + cmd2 + %editc(%size( CustDS:*all):'Z') + ')') Crear colas de datos call QCMDEXC 98 parm cmd parm cmdlen eval cmd=*blank eval cmd=%trim(%trimr(cmd1) + qnameo + cmd2 + %editc(%size( CustDS:*all):'Z') + ')') call QCMDEXC 98 parm cmd parm cmdlen Invocar el programa servidor para que acceda a la base de datos del servidor call DATAQ 98 parm qnamei parm qnameo Completada la inicializacin, ahora a procesar eventos endsr

La subrutina de accin

Apndice B. Cmo escribir aplicaciones de cliente ligero

425

Se enva una peticin a la cola de datos O. Entonces el programa cliente espera una respuesta de la DATAQ del programa servidor, en la cola de datos I. Una vez recibidos los datos, el subarchivo se llena en un bucle.
C* C* C* C* C* C* C C* C C* C* C* C C C C C C C* C* C C C C C C C C C* C C C C C C C C* C C C C C C C* C C C C C C * C Se invoca la subrutina de accin desde: - Evento Press del pulsador PSBMORE - Evento Create de la ventana - Evento Pageend del subarchivo PSBmore begact PRESS win1 Mientras haya datos, debe obtenerse ms datos if not fileend Enviar peticin a la cola de datos 'O' para que obtenga ms datos eval nrecords=10 call QSNDDTAQ parm qnameo parm 'CWDATAQ' NAME_OF_LB 10 parm 23 MSG_SZ 5 0 parm rinfo Esperar datos de la cola de datos 'I' Esperar datos de proceso en DS rinfo eval wait_time=-1 eval MSG_sz=23 call QRCVDTAQ parm qnamei parm 'CWDATAQ ' NAME_OF_LB parm MSG_SZ parm rinfo parm WAIT_TIME Esperar los datos de la base de datos eval Msg_sz=%size(custds:*all) call QRCVDTAQ parm QNAMEI parm 'CWDATAQ ' NAME_OF_LB parm MSG_SZ parm CustDS parm WAIT_TIME Llenar el subarchivo con todos los registros que haya ledo el servidor eval count=1 dow count<=nrecords and not fileend count occur CustDS write sub1 eval count=count+1 enddo Si se ha indicado el fin de archivo, desactivar el pulsador if eof eval %setatr('win1': 'psbmore':'enabled')=0 eval fileend=*on endif endif fin de la subrutina de accin endact

Interrumpir la subrutina Se enva una peticin de interrupcin a la DATAQ del programa servidor y las dos colas de datos se eliminan.
C* Cuando la app del cliente finaliza, limpiar el entorno de servidor C* C *termsr begsr C* Indicar fin de programa al programa servidor y enviar datos a la DATAQ 'O'

426

Programacin con VisualAge RPG

C eval nrecords=0 C call QSNDDTAQ C parm qnameo C parm 'CWDATAQ' NAME_OF_LB C parm 23 MSG_SZ C parm rinfo C* Eliminar ambas colas de datos C eval cmd=*blank C eval cmd=%trim(%trimr(cmde) + C qnamei + ')') C call QCMDEXC C parm cmd C parm cmdlen C eval cmd=*blank C eval cmd=%trim(%trimr(cmde) + C qnameo + ')') C call QCMDEXC C parm cmd C parm cmdlen C* La aplicacin concluye C endsr

98 10 5 0

98

98

El programa servidor
Una vez se ha iniciado, entra en un bucle y espera a la cola de datos O hasta que recibe una peticin del programa cliente. En este ejemplo, son posibles dos peticiones diferentes. El programa determina qu peticin se ha enviado: la de enviar ms datos o la de finalizar. Para una peticin de ms datos leer 10 registros ms de la base de datos y enviar dos tems a la cola de datos I. El primer tem contiene informacin de proceso; cuntos registros se leyeron y si se ha producido una situacin de fin de archivo. El segundo tem contiene la estructura de datos de aparicin mltiple con los datos del archivo de la base de datos. El programa cliente recibir estos registros de la cola de datos I y llenar el subarchivo de acuerdo con ellos. Cuando el programa servidor recibe la seal de que se solicita una interrupcin, se activar el indicador LR y finalizar el bucle DO. Esto finalizar el programa. Cualquier otra operacin de limpieza ser gestionada por el programa cliente.

Fuente de ejemplo para el servidor


Definiciones de archivo y de datos
Fcustomer if e disk D* estructura de datos que contiene datos de la base de datos D* que deben pasarse al cliente D CustDS e ds extname(customer) occurs(10) D* estructura de datos para pasar informacin de control entre D* cliente y servidor D rinfo ds D eof n D count 2 0 D fill 20 D* nmero de apariciones en DS para el lmite del bucle D custelem s 2 0 inz(%elem(CustDS)) D* nombre de la biblioteca para la DATAQ y el tamao de los datos que D* deben enviarse a la DATAQ y al tiempo de espera D Name_of_LB s 10 inz('CWDATAQ')
Apndice B. Cmo escribir aplicaciones de cliente ligero

427

D msg_sz S 5 0 D wait_time s 5 0 D* nombre de las DATAQ pasadas desde el cliente D qnamei s 10 D qnameo s 10

Lnea principal del programa Procesar el bucle DO, esperar a la cola de datos O hasta que lleguen ms datos de la base de datos, enviar los datos a la cola de datos I y seguir esperando ms peticiones.
C* C C C C* C* C C* C C C C C C C C C* C* C* C C C C C C C C C C* C C C C C* C* C* C* C C C C C C* C C C C C C C* C* C C C* Principio de la lnea principal *entry plist parm qnamei parm qnameo El bucle DO se ejecuta constantemente hasta que el programa cliente le indica que se interrumpa dow not *inlr Esperar a que el programa cliente indique que necesita datos eval wait_time=-1 eval MSG_sz=23 call 'QRCVDTAQ' parm qnameo parm NAME_OF_LB parm MSG_SZ parm rinfo parm WAIT_TIME Leer 10 registros del archivo de la base de datos cuenta de registros = 0 significa que el programa cliente se est interrumpiendo if count >0 eval count=1 count occur CustDS read customer 9999 dow count<custelem and not *in99 eval count=count+1 count occur CustDS read customer 9999 enddo Determinar si hay ms datos en el archivo if *IN99 eval count=count-1 eval eof=*on endif Enviar informacin a la cola de datos Enviar un registro con informacin sobre cuntos registros se han ledo y si se ha alcanzado el fin de archivo call 'QSNDDTAQ' 98 parm QnameI parm NAME_OF_LB parm 23 MSG_SZ parm rinfo Enviar los datos en DS desde el archivo de la base de datos a DATAQ eval msg_sz=%SIZE(custds:*all) call 'QSNDDTAQ' 98 parm qnamei parm NAME_OF_LB parm MSG_SZ parm CUSTds Cuando finaliza el programa cliente, enva nrecords 0, entonces este programa acaba tambin else eval *inlr=*on

428

Programacin con VisualAge RPG

C end C enddo C* C* Fin de la lnea principal

Otras implementaciones posibles


Adems de estos ejemplos especficos, son posibles otras variaciones y combinaciones de ambas implementaciones. El objetivo es minimizar los procesos del cliente y utilizar la capacidad del servidor para que ejecute estas aplicaciones. La reutilizacin de los mdulos del servidor puede conseguirse ya que las aplicaciones 5250 y GUI pueden utilizar los mismos programas servidor. Una implementacin posible es el uso de peticiones en la forma de sentencias SQL que se pasan a un programa servidor. Este programa servidor emite la sentencia SQL y direcciona los datos recibidos a una cola de datos. El programa cliente, esperando a la cola de datos, utiliza los datos que recibe para satisfacer la peticin del usuario final. En esta aplicacin particular, se utiliza una cola de datos de clave nica en lugar de mltiples colas de datos. Otra implementacin podra pasar todos los datos de entrada desde la interfaz de usuario al programa servidor para realizar la comprobacin de errores en el servidor; las condiciones de error se enviaran al cliente. Este mtodo permite un alto grado de reutilizacin de la lgica del sistema entre las aplicaciones 5250 y GUI, a la vez que proporciona un cliente an ms ligero.

Ejemplo de programa servidor reutilizable


El cdigo RPG IV siguiente para una aplicacin de subarchivo 5250 utiliza el mismo programa servidor, pero en una interfaz 5250. Este ejemplo muestra las posibilidades de reutilizacin de los programas servidor para aplicaciones GUI y 5250. Los programas GUI de cliente ligero pueden utilizar fcilmente la lgica del sistema contenida en el programa servidor 5250. La siguiente ilustracin muestra un ejemplo de la pantalla 5250 que muestra la misma informacin de base de datos que el ejemplo GUI al principio de este captulo.

Apndice B. Cmo escribir aplicaciones de cliente ligero

429

Este subarchivo slo tiene capacidad para 8 registros en pantalla debido a que cada registro ocupa dos filas del subarchivo. A continuacin puede ver el fuente del programa para esta aplicacin:
H* Programa para listar los registros del cliente F* Archivo Workstn que contiene DSPF Fgetrecs cf e workstn sfile(sub1:recnum) D* estructura de datos para pasar datos del programa servidor al subarchivo Dcust e ds extname(customer) occurs(8) D inz Deof s 1 inz(*off) Dnrecords s 2 0 Dfileend s 1 inz(*off) Dcount s 2 0 Dcustelem s 2 0 inz(%elem(cust)) Drecnum s 5 0 inz(1) * Programa principal para invocar la subrutina del subarchivo y * finalizar el programa * In91 indica que el archivo de la base de datos no ha alcanzado el final C EVAL *IN91=*ON C exsr more C eval *inlr=*on c C more BEGsr * Bucle para obtener ms datos y visualizarlos en un subarchivo C dow not *in03 * Invocar el programa servidor para que obtenga datos la primera vez * y cundo se utiliza el avance de pgina C if *in91 C call 'GETREC' C parm cust C parm custelem C parm eof C parm nrecords C eval count=1 * recnum1 es sbfrcdnbr en el registro de control del subarchivo, * para posicionar el primer registro que se visualizar en la pantalla C EVAL RECNUM1=RECNUM * Bucle para llenar un subarchivo con nuevos registros C dow count<=nrecords

430

Programacin con VisualAge RPG

C C C C C C C C C C C C C C C C C

* *

* *

occur cust write sub1 eval count=count+1 eval recnum=recnum+1 enddo Una vez se ha aadido el conjunto de registros al subarchivo, visualizarlo, adems del formato del encabezamiento y del pie de pgina write record1 write footer exfmt sub1ctl Ignorar las teclas de Av Pg else read sub1ctl 99 endif if eof=*on IN90 habilita la tecla Av Pg para que puedan leerse ms registros. Al final del archivo se inhabilita. eval *in90=*on eval recnum=recnum1 endif enddo Abandonar el bucle cuando se solicite Salir ENDSR

count

Apndice B. Cmo escribir aplicaciones de cliente ligero

431

432

Programacin con VisualAge RPG

Apndice C. Creacin y compilacin de programas no GUI desde MS-DOS


Puede crear aplicaciones VARPG autnomas en el diseador de GUI de VARPG, o bien emitiendo mandatos en una lnea de mandatos de MS-DOS. Esta seccin le proporciona los mandatos que puede utilizar en una lnea de mandatos. Para utilizar el Diseador GUI, consulte Captulo 21. Cmo crear programas no GUI en VisualAge RPG en la pgina 357. Para iniciar el editor y crear fuente en una lnea de mandatos de MS-DOS, escriba:
codeedit nombrearchivo.VPG

Asegrese de incluir la extensin .VPG en el nombre del archivo para que pueda beneficiarse de las funciones de interpretacin y comprobacin de sintaxis que incorpora el editor. Para ejecutar el compilador FVDFNFE, emita el mandato de compilador desde una lnea de mandatos de MS-DOS. La sintaxis del mandato es:
fvdfnfe nombrearchivo.VPG [/compilador_opcin1 ... /compilador_opcinn]

Nota: Debe incluir la extensin .VPG en el nombre del archivo fuente; no se da por supuesta. Las opciones del compilador, que puede escribir en maysculas o minsculas, son opcionales. stas son: Opcin Descripcin /BL nombre Nombre de la biblioteca de enlace. Si hubiera ms de una, delimite los nombres mediante comillas. /D Genera informacin de depuracin

/GL 1-99 Nivel de gravedad de generacin /L /LI /LX /LV /LD /LC /LE /LM2 /LS Genera un listado de salida Sangrado Genera un listado de referencias cruzadas (XREF) Genera un listado de referencias cruzadas visual (XREF) Expande DDS en listado Expande /COPY en listado Muestra referencias externas Muestra mensajes de segundo nivel en el listado Muestra las lneas excluidas en el listado

/LP 10-99 Lneas por pgina (listado) /HCU Habilita la antememoria en el sistema principal
Copyright IBM Corp. 1994, 2000

433

/HCR /RF /RN

Renueva la antememoria en el sistema principal Corrije valores numricos Permite valor nulo

/RNU Permite valor nulo bajo control del usuario /RT /TI Trunca valores numricos Genera informacin de depuracin (igual que /D)

/SB Nombre Nombre de archivo de enlace SQL /SF XX Formato SQL para columnas de fecha y hora /SI XX (RR RS CS UR) nivel de aislamiento de SQL /SN Nombre Nombre de base de datos SQL /SP Nombre Nombre de archivo de paquete SQL /SR /SU /SUP /SVC /SVG Bloqueo de registro de SQL ID de usuario de base de datos Contrasea de base de datos Carcter de variable de conversin Grfico de variable de conversin

Acceso a un sistema AS/400


Si el programa debe acceder a datos ubicados en el sistema AS/400 o ejecutar programas AS/400, debe crear un archivo RST (Remote Server Table). El archivo RST es un archivo ASCII que lee el compilador y el tiempo de ejecucin de VARPG para determinar qu informacin sobre el sistema debe utilizar y la ubicacin de los archivos. Un archivo RST se crea en el Diseador GUI al utilizar el dilogo Definir informacin de AS/400. Durante el tiempo de compilacin, el archivo RST debe estar en el mismo directorio que el fuente del programa. Durante el tiempo de ejecucin, el archivo RST debe estar en el mismo directorio que los archivos ejecutables del programa. A continuacin encontrar un ejemplo de un archivo RST:
DEFINE_SERVER SERVER_ALIAS_NAME(MYAS400) REMOTE_LOCATION_NAME(TORAS40Z) NETWORK_PROTOCOL(*TCP) TEXT(Development - RST)

DEFINE_FILE

FILE_ALIAS_NAME(CUSTOMER) REMOTE_FILE_NAME(PRODUCT/CUSTMAST) SERVER_ALIAS_NAME(MYAS400) TEXT()

La sentencia DEFINE_FILE indica la ubicacin de los archivos definidos en las especificaciones F en el sistema AS/400. En este ejemplo, el archivo CUSTOMER en la especificacin F se refiere al archivo CUSTMAST en la biblioteca PRODUCT.

434

Programacin con VisualAge RPG

Si el archivo se encuentra en la lista de su biblioteca, puede omitir la sentencia DEFINE_FILE. En tal caso, la bsqueda se llevar acabo en la lista de biblioteca *LIBL. La palabra clave TEXT se utiliza para comentarios, por lo que puede estar en blanco.

Apndice C. Creacin y compilacin de programas no GUI desde MS-DOS

435

436

Programacin con VisualAge RPG

Glosario
Este glosario incluye trminos y definiciones de: v El American National Dictionary for Information Systems ANSI X3.172-1990, copyright 1990 del American National Standards Institute (ANSI). Si desea adquirir una copia de esta publicacin debe dirigirse al American National Standards Institute, 1430 Broadway, New York, New York, 10018. Las definiciones se especifican mediante el smbolo (A) despus de las mismas. v El Information Technology Vocabulary desarrollado por el Subcomit 1, Comit Tcnico Conjunto 1, de International Organization for Standardization y el International Electrotechnical Committee (ISO/IEC JTC1/SC1). Las definiciones de las partes publicadas de este vocabulario se identifican mediante el smbolo (|) despus de las mismas; las definiciones tomadas de borradores de estndares internacionales, borradores del comit y trabajos no concluyentes desarrollados por ISO/IEC JTC1/SC1 se identifican mediante el smbolo (T) despus de las mismas, lo cual indica que an no se ha alcanzado un acuerdo definitivo entre los Organismos Nacionales integrantes del SC1. v IBM Dictionary of Computing, New York: McGraw-Hill, 1994. v Object-Oriented Interface Design IBM Common User Interface Guidelines, SC34-4399-00, Carmel, IN: Que Corporation, 1992.

A
accin. (1) Sinnimo de subrutina de accin. (2) Programa ejecutable o archivo de mandatos utilizado para manipular los componentes de un proyecto o participar en una construccin. accin por omisin. Accin que se efecta cuando se realiza otra como, por ejemplo, pulsar la tecla Intro. alias de servidor. Nombre al que da una definicin y que puede utilizarse en lugar del nombre del servidor. ancla. Cualquier componente que se utiliza como punto de referencia para alinear, dimensionar y espaciar otros componentes. anotaciones de error. Realiza un seguimiento de los errores en las anotaciones de error. El editor le lleva al lugar del cdigo fuente en el que se ha producido el error. API. Interfaz de programacin de aplicaciones. aplicacin. Un grupo de componentes de software utilizados para efectuar tareas de usuario especficas en un sistema. applet. Programa escrito en Java que se ejecuta dentro de un navegador compatible con Java o AppletViewer. archivo. Grupo de datos relacionados que se almacena y se recupera mediante un nombre asignado. Un archivo puede incluir informacin que inicia un programa (objeto de archivo de programa), contiene texto o grficos (objeto de archivo de datos) o procesa una serie de mandatos (archivo por lotes). archivo de mensajes. Archivo que contiene mensajes de aplicacin. Este archivo se crea a partir del archivo fuente de mensajes durante el proceso de construccin. Vase tambin construir. archivo de ondas. Archivo utilizado para sonidos audio en un dispositivo de forma de onda. archivo de Recurso de Presentacin de Informacin (IPF). Archivo en el que se almacena el fuente de la ayuda de la aplicacin. archivo MIDI. Archivo de la Interfaz Digital de Instrumentos Musicales.

Copyright IBM Corp. 1994, 2000

437

archivos JAR (.jar). En Java, abreviatura de Java ARchive. Es un formato de archivo que se utiliza para agregar varios archivos en uno. rea comn. rea de almacenamiento proporcionada por el sistema para retener datos temporalmente. Los datos del rea comn estn disponibles para otras aplicaciones. rea de cliente. La parte de la ventana que es el espacio de trabajo del usuario donde ste teclea informacin y selecciona opciones de campos de seleccin. En ventanas primarias, el rea en la que un programador de aplicaciones presenta los objetos con los que trabaja el usuario. rea de informacin. Componente de una ventana en el que se visualiza informacin sobre el objeto o la opcin en los que se encuentra el cursor. El rea de informacin tambin puede incluir un mensaje sobre la conclusin normal de un proceso. Vase tambin barra de estado. rea de trabajo. rea utilizada para organizar objetos de acuerdo a las tareas del usuario. Cuando un usuario cierra un rea de trabajo, todas las ventanas abiertas a partir de objetos contenidos en el rea de trabajo se eliminan del lugar de trabajo. Arquitectura Common User Access (arquitectura CUA). Directrices para el dilogo entre una persona y una estacin de trabajo o un terminal. arquitectura CUA. Arquitectura de Acceso Comn de Usuario. arrastrar. Mover o copiar un objeto utilizando el ratn. Por ejemplo, un usuario puede arrastrar el borde de una ventana para hacerla ms grande pulsando un botn del ratn y mantenindolo pulsado mientras mueve el ratn. Vase tambin arrastrar y soltar. arrastrar y soltar. Manipular directamente un objeto movindolo y colocndolo en cualquier lugar utilizando el ratn. ASCII (American National Standard Code for Information Interchange). Cdigo estndar, que se compone de un juego de caracteres codificados de 7 bits (8 bits incluyendo comprobacin de paridad), que se utiliza para el intercambio de informacin entre sistemas de proceso de datos, sistemas de comunicacin de datos y equipo asociado. El juego de caracteres ASCII se compone de caracteres de control y caracteres grficos. (A) atenuado. Atenuacin del contraste visual de un componente que indica que el usuario no puede seleccionar ni manipular directamente ese componente.

B
barra de desplazamiento. Componente que muestra a un usuario que hay ms informacin disponible en una direccin determinada y que puede moverse para visualizar dicha informacin utilizando el ratn o las teclas de pgina. barra de estado. Componente de una ventana que visualiza informacin que indica el estado de la vista o del objeto actuales. Vase tambin rea de informacin. barra de herramientas. Men que contiene una o ms opciones grficas que representa las acciones que un usuario puede efectuar utilizando el ratn. barra de ttulos. rea en la parte superior de cada ventana que contiene el smbolo del men del sistema. base de datos. (1) Grupo de datos con una estructura determinada para aceptar, almacenar y proporcionar, previa peticin, datos para varios usuarios. (T) (2) Todos los archivos de datos almacenados en el sistema. Biblioteca de enlace dinmico (DLL). Archivo que contiene cdigo ejecutable y datos enlazados de manera lgica a un programa durante el tiempo de carga o el de ejecucin, en lugar de durante el enlace. Varias aplicaciones pueden compartir a la vez el cdigo y los datos de una biblioteca de enlace dinmico. BMP. Extensin de archivo de un archivo bitmap. borde de dimensionamiento. Borde de un marco alrededor de un componente (o conjunto de componentes) que selecciona para cambiar el tamao del componente (o del conjunto de componentes) utilizando el ratn o el teclado.

438

Programacin con VisualAge RPG

borde de seleccin. Borde visual que aparece alrededor de un componente de VARPG o de un componente creado por el usuario, que permite moverlo con el ratn o el teclado. botn. (1) Mecanismo en un dispositivo de puntero, como un ratn, utilizado para solicitar o iniciar una accin. (2) Mecanismo grfico en una ventana que, cuando se selecciona, produce una accin. Por ejemplo, el pulsador Aceptar que, al seleccionarse, inicia una accin. botn 1 del ratn. Por omisin, el botn izquierdo del ratn se utiliza para seleccionar. botn 2 del ratn. Por omisin, el botn derecho del ratn se utiliza para manipular. botn de manipulacin. Vase botn 2 del ratn. botn de maximizar. Botn en la parte ms a la derecha de una barra de ttulo sobre el que un usuario pulsa el botn del ratn para aumentar el tamao de la ventana lo mximo posible. Comprese con botn de minimizar y botn de ocultar. botn de minimizar. Botn ubicado junto al botn ms a la derecha en una barra de ttulo que reduce el tamao de la ventana lo mximo posible. Comprese con botn de maximizar y botn de ocultar. botn de ocultar. Botn en una barra de ttulo sobre el que un usuario pulsa el botn del ratn para suprimir una ventana del lugar de trabajo sin cerrarla. Cuando la ventana est oculta, el estado de la misma, indicado en la lista de ventanas, cambia. Comprese con botn de maximizar y botn de minimizar. botn de ratn. Mecanismo en un ratn para seleccionar opciones, iniciar acciones o manipular objetos con el puntero. Vase tambin botn 1 del ratn y botn 2 del ratn. botn de restaurar. Botn que aparece en la esquina ms a la derecha de la barra de ttulo despus de haber maximizado una ventana. Cuando se selecciona el botn de restaurar, la ventana vuelve a tener el tamao y la posicin que tena antes de que se maximizara. Vase tambin botn de maximizar. botn de seleccin. Vase botn 1 del ratn.

C
campo. (1) rea identificable en una ventana, como un campo de entrada, en la que un usuario escribe texto. (2) Grupo de bytes relacionados, como un nombre o una cantidad, que se trata como una unidad en un registro. campo de referencia. Campo de la base de datos de AS/400 cuyas caractersticas un componente campo de entrada puede heredar. campo de subarchivo. Campo utilizado para definir campos en un componente subarchivo. Vase tambin campo subarchivo. Capa de Sockets Segura (SSL). Esquema de seguridad de gran aceptacin desarrollado por Netscape Communications Corp. y RSA Data Security, Inc. SSL permite al cliente autenticarse en el servidor y cifrar todos los datos y peticiones. El URL de un servidor seguro protegido mediante SSL empieza por https en lugar de http. carpeta destino. Objeto en el que se coloca el icono que representa una aplicacin VARPG. catlogo de componentes. Espacio de almacenamiento para todos los componentes utilizados para crear interfaces grficas de usuario para aplicaciones VARPG. cliente. (1) Sistema que depende de un servidor para obtener datos. (2) La PWS donde se ejecutan las aplicaciones VARPG. Vase tambin cliente DDE. cliente DDE. Aplicacin que inicia una conversacin DDE. Comprese con servidor DDE. Vase tambin componente cliente DDE y conversacin DDE. cliente/servidor. Modelo de interaccin en el proceso de datos distribuidos en el que un programa en una ubicacin enva una peticin a un programa en otra ubicacin y espera una respuesta. El programa que efecta la peticin recibe el nombre de cliente; y el programa que responde, servidor. Vase tambin cliente, servidor, cliente DDE, servidor DDE.

Glosario

439

compilar. Convertir un programa fuente en un programa ejecutable (programa objeto). componente barra de desplazamiento horizontal. Componente que aade una barra de desplazamiento horizontal a una ventana. Este componente permite desplazarse por un panel de informacin de izquierda a derecha o viceversa. componente barra de desplazamiento vertical. Componente que aade una barra de desplazamiento vertical a una ventana. Este componente permite desplazarse por un panel de informacin verticalmente. componente barra de estado. Componente de una ventana que puede visualizar informacin adicional sobre un proceso o accin de la ventana. componente barra de mens. rea que est junto a la parte superior de la ventana, debajo de la barra de ttulo y encima del resto de la ventana, que contiene opciones que proporcionan acceso a otros mens. En VisualAge RPG, se seala y pulsa un componente barra de mens de la paleta de componentes o del catlogo de componentes y se suelta en una ventana de diseo. componente barra de progreso. Componente que se puede utilizar para indicar el progreso de un proceso como, por ejemplo, copiar archivos, cargar una base de datos, etc. de forma grfica. componente bena Java. Componente que permite a las aplicaciones VARPG acceder a los JavaBean de Sun Microsystem. componente botn de seleccin. Crculo con texto al lado. Los botones de seleccin se combinan para mostrar a un usuario un conjunto fijo de opciones de entre las que slo puede seleccionarse una. Cuando se selecciona una opcin, el crculo se rellena parcialmente. Puede sealar y pulsar un componente botn de seleccin de la paleta de componentes o del catlogo de componentes y soltarlo en una ventana de diseo. componente calendario. Componente que aade un calendario que puede ser modificado por el usuario para incluir texto, color u otros atributos. componente campo de entrada. rea de una pantalla donde un usuario pueden entrar informacin, a menos que el campo sea de slo lectura. Normalmente, los lmites de un campo de entrada estn indicados. En VisualAge RPG, se seala y pulsa un componente campo de entrada de la paleta de componentes o del catlogo de componentes y se suelta en una ventana de diseo. componente cliente DDE. Componente utilizado para intercambiar datos con otras aplicaciones como, por ejemplo, aplicaciones de hoja de clculo, que soportan el protocolo de intercambio de datos dinmico (DDE). componente *component. Componente que es la representacin de componente del componente lgico. Para cada componente lgico se crea un componente *component, que no se visualiza. componente contenedor. Componente que almacena registros relacionados y los visualiza en una vista de detalles, de icono o de rbol. componente control de animacin. Componente que permite reproducir archivos de vdeo, con la extensin AVI, en Windows, o reproducir secuencias GIF de animacin en aplicaciones Java. componente cuaderno. Representacin grfica de un cuaderno. Puede aadir pginas de cuaderno al componente cuaderno y agrupar las pginas en secciones separadas por separadores. En Windows, a veces se hace referencia al cuaderno como el control de separadores de Windows. Vase tambin componente pgina de cuaderno y componente pgina de cuaderno con lienzo. componente de activeX. Componente que aade objetos de control ActiveX al proyecto. Las aplicaciones VARPG pueden acceder as a los atributos y supervisar si hay eventos. componente definido por el usuario. Componente, que se compone de uno o ms componentes que ha personalizado, que guarda en la paleta de componentes o del catlogo de componentes para volver a utilizarlo. Cuando est en la paleta o en el catlogo, este componente se puede sealar y pulsar en la ventana de diseo tal como se hara con otro componente de VARPG. componente destino. Componente que, siempre que cambia el estado del componente fuente, recibe un evento link (de enlace) del componente fuente.

440

Programacin con VisualAge RPG

componente de subarchivo. Componente utilizado para visualizar una lista de registros que constan de varios campos. Este componente es similar a un subarchivo de AS/400. Vase tambin campo de subarchivo. componente edicin de mltiples lneas (MLE). Componente que representa un campo de entrada que permite al usuario entrar varias lneas de texto. componente elemento de men. Componente que es un elemento grfico o de texto en un men. Cuando el usuario desea trabajar con un objeto, selecciona un elemento de men. componente fuente. Componente que, siempre que cambia su estado, puede notificarlo a los componentes de destino. Un componente fuente puede tener varios destinos. componente graduador. Componente visual de una interfaz de usuario que representa una cantidad y su relacin con el rango de posibles valores para esa cantidad. El usuario tambin puede modificar el valor de la cantidad. Puede sealar y pulsar un componente graduador de la paleta de componentes o del catlogo de componentes y soltarlo en una ventana de diseo. componente grfica. Componente que permite al usuario aadir un grfico a la GUI. Los estilos de grfico disponibles son el diagrama de lneas, de barras, de lneas y barras y circular. componente imagen. Componente utilizado para visualizar una imagen, de un archivo BMP o ICO, en una ventana. componente lienzo. Componente en el que puede sealar y pulsar otros componentes, colocarlos y organizarlos para producir una interfaz grfica de usuario. El componente lienzo ocupa el rea de cliente de un componente ventana o de un componente pgina de cuaderno. Vase tambin componente pgina de cuaderno con lienzo y componente ventana con lienzo. componente lgico. Agrupacin funcional de archivos relacionados dentro de un proyecto. Se crea un componente lgica cuando las palabras clave NOMAIN y EXE no se encuentran en las especificaciones de control. componente lgico compartido. Componente lgico al que puede accederse a travs de ms de un proyecto. componente medios. Componente que proporciona a un programa la posibilidad de procesar archivos de sonido (.WAV) y archivos de vdeo (.MID). componente men emergente. Componente que, cuando se aade a un objeto en la interfaz, aparece junto al objeto con el que est asociado cuando se solicita. Puede sealar y pulsar un componente men emergente de la paleta de componentes o del catlogo de componentes y soltarlo en una ventana de diseo. componente odbc/jdbc. Componente que permite a las aplicaciones VAPRG acceder y procesar archivos de base de datos que den soporte a la API ODBC de Windows o la API JDBC de Sun Microsystem. componente pgina de cuaderno. A part used to add pages to a notebook part. Vase tambin cuaderno. componente pgina de cuaderno con lienzo. Combinacin del componente cuaderno y del componente pgina con lienzo. Vase tambin cuaderno y componente lienzo. componente panel de medios. Componente utilizado para proporcionar al usuario control sobre otros componentes. Por ejemplo, un componente panel de medios puede utilizarse para controlar el volumen de un componente medios. componente pulsador. Botn etiquetado con texto que representa una accin que se inicia cuando un usuario selecciona el pulsador. Puede sealar y pulsar un componente pulsador de la paleta de componentes o del catlogo de componentes y soltarlo en una ventana de diseo. Vase tambin componente pulsador grfico. componente pulsador grfico. Pulsador, etiquetado con un grfico, que representa una accin que se inicia cuando un usuario la selecciona. Comprese con componente pulsador. componente recuadro de contorno. Componente que es un recuadro rectangular colocado alrededor de un grupo de componentes para indicar que todos los componentes estn relacionados. componente recuadro de grupo. Marco rectangular alrededor de un grupo de controles que indica que estn relacionados y que proporciona una etiqueta optativa para el grupo. En VisualAge RPG, se seala y pulsa un componente recuadro de grupo de la paleta de componentes o del catlogo de componentes y se suelta en una ventana de diseo.

Glosario

441

componente recuadro de lista. Control que contiene opciones desplazables que un usuario puede seleccionar. En VisualAge RPG, se seala y pulsa un componente recuadro de lista de la paleta de componentes o del catlogo de componentes y se suelta en una ventana de diseo. componente recuadro de seleccin. Recuadro de seleccin con texto asociado que representa una opcin. Cuando un usuario selecciona una opcin, aparece un indicador en el recuadro de seleccin que indica que la opcin est seleccionada. El usuario puede eliminar la marca del recuadro de seleccin volviendo a seleccionar la opcin. En VisualAge RPG, se seala y pulsa un componente recuadro de seleccin de la paleta de componentes o del catlogo de componentes y se suelta en una ventana de diseo. componente referencia a componente lgico. Componente que permite que un componente lgico se comunique con otro en una aplicacin VARPG. componentes. Objetos que componen la GUI de una aplicacin VARPG. componente selector cclico. Tipo de campo de entrada que muestra un anillo de opciones relacionadas, pero que se excluyen mutuamente, por el que un usuario puede desplazarse y seleccionar una opcin. El usuario tambin puede teclear una opcin vlida en el campo de entrada. Puede sealar y pulsar un componente selector cclico de la paleta de componentes o del catlogo de componentes y soltarlo en una ventana de diseo. componente subarchivo de mensajes. Componente que puede visualizar mensajes predefinidos o texto suministrado en la lgica del programa. componente submen. Componente utilizado para iniciar un submen a partir de un elemento de men o de un men existente, o para iniciar un men desplegable a partir de un elemento de men en una barra de men. Vase tambin submen y componente elemento de men. componente temporizador. Componente utilizado para hacer un seguimiento del intervalo de tiempo entre dos eventos y activar el segundo evento cuando ha transcurrido el intervalo. componente texto esttico. Componente utilizado como etiqueta para otros componentes, como solicitud para un componente campo de entrada. componente ventana. rea con lmites visibles que representa una vista de un objeto o con la que un usuario mantiene un dilogo con un sistema. Puede sealar y pulsar un componente ventana de la paleta de componentes o del catlogo de componentes y soltarlo en la ventana de proyectos. componente ventana con lienzo. Combinacin del componente ventana y del componente lienzo. Vase tambin componente ventana y componente lienzo. comprobacin de sintaxis. Verifica que la sintaxis de cada lnea sea correcta mientras se edita el cdigo fuente. Con ello pueden evitarse errores de compilacin. Esta opcin puede activarse o desactivarse. Puede visualizarse slo determinados tipos de especificacin, como especificaciones C, o una lnea con una serie especfica. Conectividad de Baes de Datos Java (JDBC). Estndar del sector para la conectividad independiente de la base de datos entre Java y una amplia gama de bases de datos. JDBC proporciona una interfaz de programacin de aplicaciones (API) a nivel de llamada para el acceso a bases de datos basado en SQL. conector. Funcin creada por el usuario o un proveedor externo que se puede utilizar en los programas VARPG. CONFIG.SYS. Archivo de configuracin, ubicado en el directorio raz de la unidad de arranque, para los sistemas operativos DOS, OS/2 o Windows. Contiene informacin necesaria para instalar y ejecutar hardware y software. configuracin. Manera en que el hardware y el software de un sistema de proceso de informacin estn organizados y se conectan entre s (T). construir. Proceso por el que las diversas partes de un cdigo fuente que forman los componentes lgicos de una aplicacin VARPG se compilan y enlazan para producir una versin ejecutable de la aplicacin. conversacin DDE. El intercambio de datos entre un cliente DDE y un servidor DDE. Vase tambin conversacin de enlace esttico y conversacin de enlace dinmico. conversacin de enlace dinmico. En DDE, actualizacin automtica de un programa cliente por un programa servidor cuando los datos cambian en el servidor. Comprese con conversacin de enlace esttico

442

Programacin con VisualAge RPG

conversacin de enlace esttico. En DDE, peticin explcita efectuada por un programa cliente a un programa servidor. El programa servidor responde a la peticin. Comprese con conversacin de enlace dinmico. cuaderno de propiedades. Representacin grfica que se asemeja a un cuaderno enlazado que contiene pginas separadas en secciones por pginas separadoras. Seleccione los separadores de un cuaderno para ir de una seccin a otra. cursor. Indicacin visible de la posicin en la que aparecer la interaccin de usuario con el teclado.

D
DBCS. Juego de caracteres de doble byte. DDE. Intercambio de datos dinmico. definicin de interfaz de procedimiento. Repeticin de la informacin prototipo dentro de la definicin de un procedimiento. Se utiliza para declarar los parmetros de entrada para el procedimiento y para garantizar que la definicin interna del procedimiento es coherente con la definicin externa (el prototipo) directorio destino. Directorio en el que se almacena la aplicacin VARPG compilada despus de una creacin. Comprese con carpeta destino. directorio fuente. Directorio en el que se almacenan todos los archivos fuente para una aplicacin VARPG. Diseador GUI. Conjunto de herramientas utilizadas para crear interfaces arrastrando y soltando componentes de la paleta de componentes a la ventana de diseo. DLL. Biblioteca de enlace dinmico. doble pulsacin. Pulsar un botn dos veces rpidamente.

E
EBCDIC. Cdigo de intercambio decimal binario ampliado. Juego de caracteres de 256 caracteres de 8 bits. edicin directa. Utilizacin de procedimientos que permiten a un usuario trabajar con un objeto arrastrndolo con un ratn o interactuando con su men emergente. elemento. En intercambio de datos dinmico, una unidad de datos. Por ejemplo, la posicin de la casilla superior izquierda en una hoja de clculo es fila 1, columna 1. Se puede hacer referencia a la posicin de la casilla como el elemento R1C1. eliminar referencia. Accin de suprimir la asociacin entre un componente y un campo de base de datos de AS/400. nfasis. Resaltado del cambio de color u otra indicacin visible de condiciones relativas a un objeto o una opcin que afecta a la capacidad del usuario de interactuar con ese objeto u opcin. El nfasis tambin puede proporcionar a un usuario informacin adicional sobre el estado de una opcin o un objeto. entrada/salida (E/S). Datos proporcionados al sistema o datos que resultan del proceso del sistema. estacin de trabajo. Dispositivo que permite a un usuario efectuar trabajos. Vase tambin estacin de trabajo programable. estacin de trabajo programable (PWS). Estacin de trabajo que tiene posibilidades de proceso y que permite a un usuario modificar sus funciones. evento. Seal generada como resultado de una modificacin en el estado de un componente. Por ejemplo, al accionar un pulsador se genera el evento Press. evento de enlace. Evento que un componente destino recibe siempre que cambia el estado de un componente fuente.

Glosario

443

excepcin. (1) En lenguajes de programacin, una situacin anormal que se da durante la ejecucin, que puede ocasionar una desviacin de la secuencia normal de ejecucin, para la que existen recursos en los lenguajes de programacin a fin de definirla, activarla, reconocerla, ignorarla y manejarla. (I) (2) En VisualAge RPG, un evento o situacin que impide, o puede impedir, que una accin solicitada por un usuario concluya tal como ste espera. Las excepciones tienen lugar cuando un producto no puede interpretar la entrada de un usuario. EXE. Extensin de un archivo ejecutable. exportar. Funcin que convierte un archivo interno en un formato de archivo estndar para utilizarlo fuera de la aplicacin. Comprese con importar.

F
foco. Sinnimo de foco de entrada. foco de entrada. rea de una ventana en la que la interaccin del usuario puede tener lugar desde el teclado o desde el ratn.

I
ICO. Extensin de archivo de un archivo de icono. icono. Representacin grfica de un objeto, que se compone de una imagen, un fondo de imagen y una etiqueta. importar. Funcin que convierte objetos de archivo de pantalla de AS/400 al componente VARPG adecuado. Comprese con exportar. indicador de progreso. Uno o ms controles utilizados para informar a un usuario sobre el curso de un proceso. ndice. Identificador de una entrada en componentes de VARPG como, por ejemplo, recuadros de lista o recuadros de combinacin. INI. Extensin de archivo para un archivo del sistema operativo OS/2 o Windows que contiene informacin especfica de la aplicacin que necesita conservarse de una llamada de una aplicacin a otra. intercambio de datos dinmicos (DDE). Intercambio de datos entre programas o entre un programa y un objeto de archivo de datos. Cualquier cambio efectuado en la informacin de un programa o una sesin se aplica a los datos idnticos creados por el otro programa. Vase tambin conversacin DDE, cliente DDE y servidor DDE. Interfaz de programacin de aplicaciones (API). Interfaz funcional suministrada por el sistema operativo o un programa bajo licencia que se solicita por separado, que permite que un programa de aplicacin escrito en un lenguaje de alto nivel pueda utilizar datos o funciones especficas del sistema operativo o del programa bajo licencia. interfaz de usuario grfica (GUI). Tipo de interfaz de usuario que proporciona las ventajas de los grficos de alta resolucin. Una interfaz grfica de usuario incluye una combinacin de grficos, el paradigma de accin de objeto, el uso de dispositivos de puntero, barras de men y otros mens, solapamiento de ventanas e iconos. Interfaz Nativa de Java (JNI). Interfaz de programacin que permite al cdigo Java que se ejecuta dentro de una Mquina Virtual Java (JVM) interoperar con las funciones escritas en otros lenguajes de programacin. IPF. Recurso de Presentacin de Informacin.

J
Java. Lenguaje de programacin orientado a objeto para cdigo interpretado porttil que soporta la interaccin entre objetos remotos. Java y sus especificaciones han sido desarrolladas por Sun Microsystems, Incorporated. JavaBean. En Java, un modelo de componente reutilizable, porttil e independiente de la plataforma. Java Runtime Environment (JRE). Subconjunto del Kit de desarrollo Java para los usuarios finales y desarrolladores que deseen redistribuir el JRE. El JRE consiste en la Mquina Virtual Java, las Clases de Ncleo de Java y los archivos de soporte.

444

Programacin con VisualAge RPG

Java 2 Software Development Kit (J2SDK). Software que distribuye Sun Microsystems a los desarrolladores de Java. Este software incluye el interpretador Java, clases Java y herramientas de desarrollo Java. Las herramientas de desarrollo incluyen un compilador, un depurador, un desensamblador, un AppletViewer, un generador de archivos de apndice y un generador de documentacin. juego de caracteres de doble byte (DBCS). Juego de caracteres en el que cada carcter se representa mediante 2 bytes. Algunos idiomas como el japons, el chino o el coreano, que contienen ms smbolos de los que pueden representarse mediante los 256 puntos de cdigo, necesitan el juego de caracteres de doble byte. Puesto que cada carcter necesita 2 bytes, la escritura, la visualizacin y la impresin de caracteres DBCS necesita hardware y programas que soporten DBCS. El sistema soporta cuatro juegos de caracteres de doble byte: japons, coreano, chino simplificado y chino tradicional. Comprese con juego de caracteres de un solo byte (SBCS). juego de caracteres de un solo byte (SBCS). Juego de caracteres en el que cada carcter se representa mediante un byte. Comprese con juego de caracteres de doble byte (DBCS).

L
lnea de ejecucin. La unidad ms pequea de operacin que puede efectuarse dentro de un proceso. lista desplegable. Campo de una sola seleccin en el que slo puede verse la opcin actual. Las dems opciones permanecen ocultas hasta que el usuario realiza una accin especfica para visualiza el recuadro de lista que las contiene. lugar de trabajo. rea que ocupa toda la pantalla y contiene todos los objetos que componen la interfaz del usuario.

M
Mquina Virtual Java (JVM). La parte del Java Runtime Environment (JRE) responsable de interpretar bytecodes de Java. marcador de grupo. Marcador que identifica un componente como el primero de un grupo. Cuando el usuario desplaza el cursor por un grupo de componentes y llega al ltimo, el cursor vuelve a la primera parte del grupo. mensaje. (1) Informacin no solicitada por un usuario pero visualizada por un producto como respuesta a un evento no esperado o cuando se produce algo no deseado. (2) Comunicacin enviada por una persona o un programa a otra persona u otro programa. men. Lista de opciones que pueden aplicarse a un objeto. Un men puede contener opciones que no estn disponibles para ser seleccionadas en determinados contextos. Estas opciones estn atenuadas. men desplegable. Men que aparece al seleccionar una opcin en una barra de men o a partir del smbolo del men del sistema. Las opciones de un men desplegable estn relacionadas entre s. men emergente. Men que, cuando se solicita, aparece junto al objeto con el que est asociado. Contiene opciones adecuadas para el objeto en su contexto actual. MID. Extensin de archivo de un archivo MIDI. migrar. (1) Mover a un sistema operativo modificado, generalmente a un nuevo release o versin de un sistema. (2) Mover datos desde una jerarqua de almacenamiento a otra. mdulo EXE. Un mdulo EXE consta de un procedimiento principal y subprocedimientos. Se crea cuando la palabra clave EXE est presente en la especificacin de control. Todas las subrutinas (BEGSR) deben ser locales a un procedimiento. El EXE debe contener un procedimiento cuyo nombre coincida con el nombre del archivo fuente. Este ser el punto de entrada principal para el EXE; es decir, el procedimiento principal. mdulo NOMAIN. Mdulo que contiene solamente subprocedimientos. No contiene ninguna accin o subrutina de usuario autnoma. Un mdulo NOMAIN se crea cuando la palabra clave NOMAIN se encuentra en la especificacin de control.

Glosario

445

N
nemotcnico. Un solo carcter, dentro del texto de una opcin, identificado por un subrayado debajo de l. Vase tambin seleccin nemotcnica. nivel del graduador. Indicador visual en el graduador que un usuario puede mover para modificar el valor numrico.

O
objeto. (1) Espacio de almacenamiento con nombre que consiste en un conjunto de caractersticas que describen el espacio de almacenamiento en s y, en algunos casos, datos. Un objeto es algo que existe en el almacenamiento y ocupa parte de su espacio, y en el que se pueden efectuar operaciones. Algunos ejemplos de objetos son: programas, archivos, bibliotecas y carpetas. (2) Componente visual de una interfaz de usuario con el que un usuario puede efectuar una tarea. Un objeto puede aparecer como texto o como un icono. objeto de datos. Objeto que transporta informacin, como texto, grficos, audio o vdeo.

P
paleta de colores. Conjunto de colores que puede utilizarse para cambiar el color de cualquier componente en la GUI de la aplicacin. paleta de componentes. El grupo de componentes ms adecuado para construir la interfaz grfica de usuario actual para una aplicacin. Cuando finaliza la GUI, puede vaciar la paleta y aadir los componentes del catlogo de componentes que necesite para la siguiente aplicacin. paleta de fonts. Conjunto de fonts que puede utilizarse para cambiar el font de un componente en la GUI de la aplicacin. panel de navegacin. Grupo de botones que se pueden utilizar para controlar la seleccin visible de registros en un subarchivo. paquete. Funcin utilizada para reunir todos los componentes de una aplicacin VARPG para su distribucin. paradigma accin-objeto. Patrn de interaccin en el que un usuario selecciona un objeto y a continuacin selecciona una accin para aplicarla a ese objeto. procedimiento. Un procedimiento es cualquier parte del cdigo a la que pueda llamarse mediante la operacin CALLP. procedimiento principal. Un procedimiento principal es un subprocedimiento que puede especificarse como procedimiento de entrada del programa y que recibe el control cuando se le llama por primera vez. El procedimiento principal slo se genera cuando se crea un EXE. Consulte mdulo EXE programacin orientada a objetos. Mtodo para estructurar programas como clases organizadas jerrquicamente que describen los datos y las operaciones de objetos que pueden interactuar con otros objetos. (T) programa destino. Objeto que el proyecto ha de crear, como una biblioteca de enlace dinmico (DLL). programa de utilidad DLL. Vase mdulo NOMAIN programa objeto. Programa destino adecuado para ser ejecutado. Un programa objeto puede o no necesitar enlace. (T) prototipo. Un prototipo es una definicin de la interfaz de llamadas. Incluye informacin como, por ejemplo, si la llamada est enlazada (procedimiento) o es dinmica (programa), el nombre externo, el nmero y la naturaleza de los parmetros, qu parmetros deben ser pasados y el tipo de datos de cualquier valor de retorno (para un procedimiento) proyecto. Conjunto de datos y acciones completo necesarios para construir un destino nico, como una biblioteca de enlace dinmico (DLL) o un archivo ejecutable (EXE).

446

Programacin con VisualAge RPG

pulsar. Pulsar y liberar un botn del ratn sin mover el puntero fuera de la opcin o del objeto. Vase tambin doble pulsacin. puntero del ratn. Sinnimo de cursor. PWS. Estacin de trabajo programable.

R
ratn. Dispositivo con uno o ms pulsadores que se utilizan para colocar un puntero en la pantalla sin usar el teclado. Se utiliza para seleccionar una opcin o una funcin que se ha de efectuar o para llevar a cabo operaciones en la pantalla, como dibujar lneas y arrastrarlas de una posicin a otra. recuadro de combinacin. Control que combina las funciones de un campo de entrada y de un recuadro de lista. Un recuadro de combinacin contiene una lista de objetos por los que el usuario puede desplazarse y seleccionar para completar el campo de entrada. Si lo desea, el usuario tambin puede escribir texto directamente en el campo de entrada. En VisualAge RPG, se seala y pulsa un componente recuadro de combinacin de la paleta de componentes o del catlogo de componentes y se suelta en una ventana de diseo. recuadro de combinacin desplegable. Tipo de recuadro de combinacin en la que un recuadro de lista est oculto hasta que un usuario realiza una accin especfica para visualizarlo. Recurso de Presentacin de Informacin (IPF). Herramienta utilizada para crear ayuda en lnea en una estacin de trabajo programable. resaltado de smbolos. Mejora la legibilidad del cdigo. Puede configurar el resaltado de diferentes elementos del lenguaje con diferentes colores o fonts para identificar las estructuras del programa. Puede activar o desactivar el resaltado de smbolos.

S
SBCS. Juego de caracteres de un solo byte. seccin fuente principal. En un programa VARPG, la seccin que contiene todas las definiciones globales para un mdulo. Para un componente lgico, esta seccin tambin incluye la accin y las subrutinas de usuario. seleccin nemotcnica. Mtodo de seleccin en el que un usuario selecciona una opcin tecleando el nemotcnico de esa opcin. sealar y pulsar. (1) Mtodo de seleccin que se utiliza para copiar un componente de la paleta o el catlogo de componentes en la ventana de diseo, la vista de iconos o la vista de rbol de la GUI. (2) Para colocar un componente en cualquiera de las vistas, seale y pulse el componente; despus, mueva el cursor a la ventana elegida y seale y suelte el componente donde desea que aparezca. En las vistas de iconos y de rbol, el componente se colocar en el componente padre, y tendr que moverlo al lugar donde le interese que aparezca en la ventana de diseo. servidor. Sistema de una red que maneja las peticiones de otro sistema, llamado cliente. servidor DDE. Aplicacin que proporciona datos a otra aplicacin habilitada por DDE. Comprese con cliente DDE. Vase tambin conversacin DDE. sistema operativo. Grupo de programas del sistema que controlan la operacin general de un sistema. solicitud. (1) Mensaje visual o audible enviado por un programa para solicitar la respuesta de un usuario. (T) (2) Smbolo o mensaje que se visualiza para solicitar una entrada del usuario o proporcionar informacin operativa. El usuario debe responder a la solicitud para poder proseguir. SSL. Capa de Sockets Segura. submen. Men que aparece al seleccionar una opcin en cascada en otro men y que contiene opciones relacionadas con dicho men. Los submens se utilizan para reducir la longitud de un men desplegable o de un men emergente. Vase tambin componente submen.

Glosario

447

subprocedimiento. Procedimiento especificado despus de la seccin fuente principal. Debe tener un prototipo correspondiente en las especificaciones de definicin de la seccin fuente principal. subrutina de accin. Lgica que se escribe para responder a un evento especfico.

T
tema. En intercambio de datos dinmico (DDE), el juego de datos que es el sujeto de una conversacin DDE. tope de tabulador. Atributo utilizado para establecer un tope de tabulador para un componente de manera que los usuarios pueden proporcionarle foco cuando utilizan el tabulador para moverse por la interfaz.

V
valor por omisin. Valor que el sistema o un programa proporciona o presupone automticamente cuando el usuario no especifica ninguno. El valor por omisin puede asignarse a un pulsador o a un pulsador grfico. ventana activa. Ventana con la que un usuario interacta actualmente. Esta es la ventana que recibe la entrada del teclado. ventana de diseo. Ventana en el diseador GUI en la que se colocan componentes para crear una interfaz de usuario. ventana emergente. Ventana movible, de tamao fijo, en la que un usuario proporciona informacin necesaria para una aplicacin de manera que puede continuar procesando una peticin de usuario. Sinnimo de ventana secundaria. ventana inactiva. Ventana que no puede recibir entrada de teclado en un momento dado. ventana primaria. Ventana en la que tiene lugar la interaccin principal entre el usuario y la aplicacin. Sinnimo de ventana principal. ventana principal. Vase ventana primaria. ventana secundaria. Ventana que contiene informacin que depende de la informacin de una ventana primaria y se utiliza para complementar la interaccin en dicha ventana. Vase tambin ventana primaria. Sinnimo de ventana emergente. vista de rbol. Visualizacin del contenido de un objeto de manera jerrquica. vista de detalles. Vista de contenido estndar en la que un icono pequeo se combina con texto para proporcionar informacin descriptiva sobre un objeto. vista de iconos. Vista de contenido estndar en la que cada objeto contenido en un contenedor se visualiza como un icono.

W
WAV. Extensin de archivo de un archivo de ondas.

448

Programacin con VisualAge RPG

Bibliografa
Para obtener informacin adicional sobre temas relacionados con VisualAge RPG y CODE (Cooperative Development Environment) para AS/400, consulte las siguientes publicaciones de IBM: Manuales de WebSphere Development Tools para AS/400: *Nota: Se han actualizado todas las versiones en lnea de las publicaciones de WebSphere Development Tools para AS/400. Las publicaciones cuyo nmero de pedido est marcado con un asterisco (*) no se han vuelto a imprimir en este release. v Iniciacin a VisualAge RPG y CODE/400, SC10-3287-01 (SC09-2625-01), proporciona informacin sobre WebSphere Development Tools para AS/400, dando una visin general de las caractersticas de CODE/400 y VARPG, de cmo funcionan juntas y de las ventajas empresariales que se obtienen al utilizarlas. Manuales de VisualAge RPG: v Iniciacin a VisualAge RPG y CODE/400, SC10-3287-01 (SC09-2625-01)*, describe los conceptos y las tareas de VARPG que se realizan mientras se utiliza VisualAge RPG. v VisualAge RPG Manual de consulta del lenguaje, SC10-3066-01 (SC09-2451-01)*, proporciona informacin de consulta sobre el lenguaje y el compilador de VARPG. v VisualAge RPG Manual de consulta de componentes, SC10-3065-02 (SC09-2450-02)*, proporciona una descripcin de cada componente, atributo de componente, evento de componente, atributo de componente y atributo de evento de VARPG. Es un manual de consulta para todos aquellos que desarrollan aplicaciones con VisualAge RPG. v Programacin con VisualAge para RPG, SC10-3067-02 (SC09-2449-02)*, contiene informacin especfica sobre cmo crear aplicaciones con VisualAge RPG. Describe los pasos que debe seguir en cada fase del ciclo de desarrollo de la aplicacin, desde el diseo hasta el empaquetado y la distribucin. Se incluyen ejemplos de programacin para clarificar los conceptos y el proceso de desarrollo de aplicaciones VARPG. v Java for RPG Programmers es una introduccin al lenguaje Java (y RPG IV) mediante la comparacin con el lenguaje RPG. Se trata de un comienzo muy apropiado en el mundo de Java. Tambin incluye una gua de aprendizaje interactiva en formato CD sobre Java y VisualAge para Java, mediante MINDQ. v Experience RPG IV Tutorial es una gua de aprendizaje interactiva en formato CD que ensea RPG IV e ILE, paso a paso y de un modo divertido. Se trata de un manual con preguntas y ejercicios que ayudan a adquirir experiencia prctica con esta nueva y apasionante versin de RPG. v Otra publicacin que no es de IBM interesante para los usuarios de VisualAge RPG es VisualAge for RPG by Example. Informacin y publicaciones del AS/400: v Si tiene acceso a Internet, puede obtener otra informacin y publicaciones del AS/400 en uno de los siguientes sitios Web:
http://www.as400.ibm.com/infocenter http://publib.boulder.ibm.com/pubs/html/as400/infocenter.htm

Copyright IBM Corp. 1994, 2000

449

Para obtener una versin en copia software de las publicaciones de AS/400, consulte la publicacin CD-ROM AS/400e Biblioteca en soporte software, SK3T-1325-04 (SK3T-0118-04). Manuales de Gestor para el Desarrollo de Aplicaciones ADM: v ADTS/400: Gestor para el Desarrollo de Aplicaciones ADM Introduccin y gua de planificacion, GC10-9401-00 (GC09-1807-00), describe los conceptos bsicos y la planificacin necesaria para hacer un uso efectivo de la funcin Gestor para el Desarrollo de Aplicaciones ADM. v ADTS/400: Gestor para el Desarrollo de Aplicaciones ADM Gua del Usuario, SC10-9609-01 (SC09-2133-01), describe cmo crear y gestionar proyectos definidos para la funcin Gestor para el Desarrollo de Aplicaciones ADM. v ADTS/400: Gestor para el Desarrollo de Aplicaciones ADM Gua de autoaprendizaje, SC10-9610-00 (SC09-2138-00), proporciona experiencia prctica en la utilizacin de la funcin Gestor para el Desarrollo de Aplicaciones ADM del producto ADTS para OS/400. Esta gua muestra cmo utilizar la funcin Gestor para el Desarrollo de Aplicaciones ADM guindole a travs de una serie de ejercicios paso a paso. v ADTS/400: Application Development Manager API Reference, SC09-2180-00, describe cmo los programadores de aplicaciones pueden escribir su propia interfaz para la funcin Gestor para el Desarrollo de Aplicaciones ADM. Manual Recurso de presentacin de informacin (IPF): v Information Presentation Facility Programming Guide G25H-7110, describe los elementos que componen el IPF (Recurso de presentacin de informacin). IPF es una herramienta que soporta el diseo y el desarrollo de documentos en lnea y de recursos de ayuda en lnea. Manuales de SQL: v IBM SQL Reference Version 2 SC26-8416, Volumen 2, compara los recursos de DB2 SQL/DS DB2/400 DB2/6000 IBM SQL ISO-ANSI (SQL92E) X/Open (XPG4-SQL). v DB2 Universal Database Administration Guide S10J-8157, proporciona la informacin necesaria para utilizar y administrar el producto DB2. v DB2 Universal Database Embedded SQL Programming Guide S10J-8158, describe cmo disear y codificar programas de aplicacin para acceder a los servidores de la familia DB2 Client/Server (como DB2 o DB2/400). Contiene informacin detallada sobre la utilizacin del SQL (Lenguaje de Consulta Estructurada) y llamadas de API en las aplicaciones.

450

Programacin con VisualAge RPG

Avisos
Esta informacin se ha elaborado para productos y servicios que se ofrecen en Estados Unidos. Es posible que IBM no ofrezca todos los productos, servicios o caractersticas que se tratan en este documento en otros pases. Consulte con el representante local de IBM para obtener informacin sobre los productos y servicios que estn disponibles en su rea en la actualidad. Ninguna referencia hecha en esta publicacin a un producto, programa o servicio de IBM pretende afirmar ni implicar que slo pueda utilizarse dicho producto, programa o servicio de IBM. Puede utilizarse cualquier producto, programa o servicio funcionalmente equivalente y que no infrinja ninguno de los derechos de propiedad intelectual de IBM. Sin embargo, es responsabilidad del usuario evaluar y verificar el funcionamiento de los productos, programas o servicios que no sean de IBM. IBM puede tener patentes o solicitudes de patente pendientes acerca del tema de este documento. La entrega de este documento no le otorga ninguna licencia sobre dichas patentes. Puede enviar consultas sobre licencias, por escrito, a: Director of Licensing Intellectual Property & Licensing International Business Machines Corporation North Castle Drive, MD - NC119 Armonk, New York 10504-1785 EE.UU. El siguiente prrafo no es aplicable en el Reino Unido ni en ningn otro pas donde tales estipulaciones sean contradictorias con la legislacin local: INTERNATIONAL BUSINESS MACHINES CORPORATION PROPORCIONA ESTA PUBLICACIN TAL CUAL, SIN NINGN TIPO DE GARANTA, EXPLCITA O IMPLCITA, INCLUYENDO, PERO SIN LIMITARSE A, LAS GARANTAS IMPLCITAS DE NO VULNERACIN, COMERCIALIZACIN E IDONEIDAD PARA UNA FINALIDAD DETERMINADA. En determinados pases no se permite la declaracin de limitacin de responsabilidad de las garantas expresas ni implcitas en determinadas transacciones, por lo tanto, esta declaracin puede no ser procedente en su caso. Esta informacin puede contener inexactitudes tcnicas o errores tipogrficos. Se efectan cambios peridicos en la informacin contenida en este documento; tales cambios se incorporarn en nuevas ediciones de la publicacin. IBM puede hacer mejoras y/o modificaciones en los productos y/o programas descritos en esta publicacin en cualquier momento sin previo aviso. Las referencias hechas en esta informacin a pginas Web de terceros se proporcionan slo como gentileza para los usuarios y de ninguna manera puede interpretarse que IBM avala esas pginas Web. El material de estas pginas Web no forma parte del material para este producto de IBM y el usuario ser el nico responsable del uso de estas ubicaciones Web. Los poseedores de una licencia de este programa que deseen obtener informacin al respecto con el fin de permitir: (i) el intercambio de informacin entre programas creados de manera independiente y otros programas (incluido ste) y (ii) la utilizacin mutua de la informacin que se ha intercambiado, deben ponerse en contacto con IBM en la siguiente direccin:

Copyright IBM Corp. 1994, 2000

451

IBM Canada Ltd. Department 071 1150 Eglinton Avenue East Toronto, Ontario M3C 1H7 Canad Dicha informacin estar disponible de acuerdo con los trminos y condiciones oportunos, que en algunos casos puede incluir el pago de una cantidad. IBM proporciona el programa bajo licencia descrito en esta informacin y todo el material bajo licencia disponible para l segn los trminos del Contrato de Cliente IBM, Contrato de Licencia de Programa Internacional IBM o cualquier contrato equivalente entre IBM y el cliente.

Informacin de interfaz de programacin


Esta publicacin pretende ayudarle a crear y gestionar aplicaciones e interfaces de usuario VisualAge RPG en la estacin de trabajo, en un entorno cliente/servidor. Esta publicacin documenta la interfaz de programacin de uso general y la informacin de gua asociada que proporciona VisualAge RPG y CODE/400.

Marcas registradas y marcas de servicio


Los siguientes trminos son marcas registradas de International Business Machines Corporation en Estados Unidos y/o en otros pases:
Application System/400 Common User Access DB2 IBM VisualAge AS/400 CUA DB2 Connect OS/400 400 AS/400e DATABASE 2 DB2 Universal Database SQL/DS

Java y todas las marcas registradas derivadas de Java son marcas registradas de Sun Microsystems, Inc. en Estados Unidos y/u otros pases. Lotus es marca registrada de Lotus Development en Estados Unidos y/u otros pases. ActiveX, Microsoft, Windows y Windows NT son marcas registradas de Microsoft Corporation en Estados Unidos y/o en otros pases. Otros nombres de empresas, productos y servicios pueden ser marcas registradas o marcas de servicio de terceros.

452

Programacin con VisualAge RPG

ndice Caracteres Especiales


%GETATR, utilizacin 25 %SETATR, utilizacin 25 *INZSR 261 .MID, archivo proceso por componentes medios *TERMSR 261 .WAV, archivo proceso por componentes medios archivo .VPF, descripcin 413 archivo .VPG, descripcin 413 archivo de imagen para componentes imagen 81 utilizacin 233 archivos de aplicacin descripcin 413 nombrearchivo.DLL 218, 413 nombrearchivo.EVT 413 nombrearchivo.EXE 413 nombrearchivo.HLP 413 nombrearchivo.IPF 413 nombrearchivo.IPM 413 nombrearchivo.LIB 413 nombrearchivo.LST 413 nombrearchivo.ODF 413 nombrearchivo.ODX 413 nombrearchivo.RST 189, 413 nombrearchivo.TXC 413 nombrearchivo.TXM 413 nombrearchivo.VPF 413 nombrearchivo.VPG 413 archivos de pantalla color de componentes convertidos 211 formatos de registro de pantalla 207 palabras clave de archivos de pantalla 209 reutilizacin 206, 207 archivos de sonido, utilizacin 233 Arrange, atributo 67 AS/400 acceso a archivos en el sistema AS/400 34 creacin de archivos de datos para los programas de ejemplo 34 mensajes para traducir 250 nombrearchivo.RST 413 reutilizar aplicaciones de 201 reutilizar ayuda UIM 212 atributo AddLink control del componente medios 100 para componentes panel de medios 101 atributo AddOffset 111 atributo AllowLink habilitacin del control panel de medios estableciendo 100 para componentes panel de medios 101 atributo BackColor, usos comunes de 37 atributo Bottom, usos comunes de 37 atributo Count para componentes contenedor 66 para componentes recuadro de lista 92 para componentes subarchivo 154 atributo Checked para componentes opcin de men 104 atributo Checked (continuacin) para componentes recuadro de seleccin 55 atributo DDEAddLink utilizacin 255 atributo DDEMode 255 atributo del sistema %DspHeight 27, 38 atributo del sistema %DspWidth 27, 38 atributo DeSelect para componentes recuadro de lista 91, 92 atributo DragEnable 41 atributo DropEnable 41 atributo Enabled para componentes campo de entrada 74 para componentes edicin de mltiples lneas 111 para componentes opcin de men 105 usos comunes de 37 atributo FileName para componentes imagen 82 para componentes medios 99, 233 para componentes pulsador grfico 78 atributo Focus, usos comunes de 38 atributo ForeColor, usos comunes de 37 atributo ForeMix, usos comunes de 37 atributo GetItem 92 atributo Height para componentes recuadro de contorno 131 usos comunes de 37 atributo Index para componentes recuadro de combinacin 59 para componentes recuadro de lista 92 para componentes subarchivo 155 atributo InfoLabel 39 atributo InsertItem para componentes recuadro de combinacin 58 para componentes recuadro de lista 91 atributo InsertLine 110 atributo Interval 167 atributo Label finalidad 30 para componentes opcin de men 104 para componentes pulsador 134 para componentes recuadro de grupo 79 para componentes texto esttico 149 usos comunes de 39 atributo Left, usos comunes de 37 atributo LineNumber 110 para componentes edicin de mltiples lneas 110

99

99

A
acceso a archivos de imgenes en tiempo de construccin 234 actualizar registro de subarchivo para componentes subarchivo 153 AddItemEnd, atributo 145 AddMsgId, atributo 106 AddMstTxt, atributo 106 AddRcd, atributo 65 agrupacin de botones de seleccin, ejemplo 136 alteraciones temporales acceso a archivos de base de datos de AS/400 192 acceso a reas de datos de AS/400 191 llamada a programas AS/400 262 alteraciones temporales de rea de datos 191 aplicacin actualizacin 407 eliminar 407 empaquetado 399 instalacin 407 volver a empaquetar 407 volver a instalar 407 aplicacin Video Catalog adicin de ayuda en lnea 15 adicin de mensajes 15 creacin de la ventana Comedy 7 creacin de la ventana Preview 11 descripcin de 3 diseo 5 ejecutar 4 instalacin 3 aplicaciones, cliente ligero 417 archivo .EVT, descripcin 413 archivo .HLP, descripcin 413 archivo .IPF, descripcin 413 archivo .IPM, descripcin 413 archivo .LIB, descripcin 413 archivo .LST, descripcin 413 archivo .ODF, descripcin 413 archivo .ODX, descripcin 413 archivo .RST, descripcin 413 archivo .TXC, descripcin 413 archivo .TXM, descripcin 413 Copyright IBM Corp. 1994, 2000

453

atributo Multiplier 167 atributo MultSelect para componentes recuadro de lista 75, 90 para componentes subarchivo 152 atributo Panel 82 atributo PanelItem 102 atributo ParentName, usos comunes de 35 atributo PartName, usos comunes de 35 atributo PartType, usos comunes de 35 atributo Position establecer 100 para componentes panel de medios 102 atributo ReadOnly para componentes campo de entrada 74 para componentes edicin de mltiples lneas 111 para componentes recuadro de combinacin 59 para componentes selector cclico 146 atributo Selected para componentes recuadro de combinacin 59 para componentes recuadro de lista 91, 92 atributo Sequence para componentes recuadro de combinacin 58 para componentes recuadro de lista 90 atributo SetItem para componentes recuadro de combinacin 59 para componentes recuadro de lista 91 atributo SetTop para componentes recuadro de combinacin 59 para componentes recuadro de lista 91 atributo TabLabel 39 atributo Text 110 atributo TextEnd 111 atributo TextSelect 111 atributo TextStart 111 atributo TickLabel para componentes graduador 139 atributo TimerMode 168 atributo UserData, usos comunes de 39 atributo Value para componentes graduador 139 para componentes selector cclico 146 para componentes temporizador 168 atributo Visible para componentes de ventana 176 para componentes temporizador 167 usos comunes de 38 atributo Volume para componentes medios 100 para componentes panel de medios 102

atributo Width para componentes recuadro de contorno 131 usos comunes de 37 atributos AddItemEnd 145 AddLink 100, 101 AddMsgId 106 AddMsgTxt 106 AddOffset 111 AddRcd 65 AllowLink 100, 101 Arrange 67 AudioMode 100 BackColor 37 BackMix 37, 140 Bottom 37 ColNumber 66, 155 comprobacin de atributos de evento y de sistema 27 Count 66, 92, 154 CharOffSet 111 Checked 55, 104 DDEMode 255 DeSelect 59, 91, 92 DragEnable 41 DropEnable 41 Enabled 37, 74, 105, 111 FileName 78, 82, 99, 233 FirstSel 59 Focus 38 FontName 149 FontSize 149 ForeColor 37 ForeMix 37 GetItem 92 GetNewID 65 GetRcdText 65 Height 37, 131 Index 59, 92, 155 InfoLabel 39 InsertItem 58, 91 InsertLine 110 InsertMode 73 Interval 167 Label 39, 79, 104, 134, 149 Left 37 LineNumber 110 Masked 74 Maximum 145 Minimum 145 MsgSubText 107 Multiplier 167 obtener y establecer 25 OpenEdit 155 OpenImmediately 176, 177 Panel 82 PanelItem 102 para componentes barra de desplazamiento horizontal 80 para componentes barra de desplazamiento vertical 174 para componentes barra de estado 151 para componentes barra de progreso 133 para componentes bean Java 87

atributos (continuacin) para componentes botn de seleccin 136 para componentes campo de entrada 72 para componentes cliente DDE 71 para componentes contenedor 64 para componentes control de animacin 50 para componentes cuaderno 115 para componentes de ActiveX 47 para componentes de posicionamiento 37 para componentes edicin de mltiples lneas 110 para componentes graduador 139 para componentes imagen 82 para componentes interfaz ODBC/JDBC 119 para componentes lienzo 54 para componentes lienzo de cuaderno 117 para componentes men emergente 132 para componentes opcin de men 104 para componentes pgina de cuaderno 116 para componentes panel de medios 101 para componentes pulsador 134 para componentes pulsador grfico 78 para componentes recuadro de combinacin 57, 58 para componentes recuadro de contorno 131 para componentes recuadro de grupo 79 para componentes recuadro de lista 75, 90 para componentes recuadro de seleccin 55 para componentes referencia a componente lgico 62 para componentes subarchivo 152 para componentes subarchivo de mensajes 106 para componentes submen 166 para componentes temporizador 167 para componentes texto esttico 149 para componentes ventana con lienzo 175, 176 ParentName 35 PartName 35 PartType 35 Position 100, 102 ReadOnly 59, 74, 111, 146 RecordID 66 RemoveItem 59, 91 RemoveMsg 107 RemoveRcd 67 Selected 59, 91, 92 SelectItem 61 Sequence 58, 90 SetItem 59, 91 SetRcdIcon 67

454

Programacin con VisualAge RPG

atributos (continuacin) SetRcdText 64 SetTop 59, 91 TabLabel 39 Terminar al cerrar 182 Text 59, 73, 110, 146 TextEnd 111 TextSelect 111 TextStart 111 TimerMode 168 UserData 39 Validate 73 Value 139, 146, 168 View 70 Visible 38, 167, 176 Volume 102 Volumen 100 Width 37, 131 atributos comunes, descripcin de 35 atributos de evento, utilizacin 26 atributos del sistema %DspHeight 27, 38 %DspWidth 27, 38 AudioMode, atributo 100 ayuda adicin de grficos a 236 creacin de enlaces de hipertexto 237 creacin de un pulsador de ayuda 236 creacin para Windows 239 editar 212 nombrearchivo.IPM 413 nombrearchivo.VPF 413 para aplicaciones Java 243 planificacin de la aplicacin 19 reutilizar UIM 212 tipos de 236 traducir 235 ayuda segn el contexto 236

bitmaps, utilizacin 233 bloqueo de archivos de base de datos de AS/400 196 BMP, archivo utilizacin 81, 233 botn de maximizar 178 botn de minimizar 178 buscar un mensaje un mensaje 249

C
calendario 51 finalidad 51 cambio el contenido de un campo durante la depuracin 224 la representacin durante la depuracin 224 un valor de puntero durante la modificacin 226 variables, matrices y estructuras durante la depuracin 224 vistas del depurador 226 cambio de la posicin de los componentes 178 cambio del tamao de las ventanas 178 cambios de fuente java 278 campo, componentes nombres exclusivos 30 campos de subarchivo ocultos 155 CLEAR, cdigo de operacin finalidad 30 para componentes subarchivo 153 cliente DDE atributos 71 determinar si est soportado por programas 71 eventos 71 finalidad 71 clientes ligeros 417 Close, evento 182 cdigo de operacin BEGACT, respuesta a eventos con 26 cdigo de operacin CALL, ejemplo de 262 cdigo de operacin CALLB llamada a funciones locales 255, 256 cdigo de operacin ENDACT, respuesta a eventos con 26 cdigo de operacin READ (leer un registro) archivos de base de datos 195 finalidad 30 cdigo de operacin SETATR (establecer atributo) para componentes imagen 82 reflejar valores almacenados en la pantalla 29 cdigo de operacin STOP (detener un componente lgico) descripcin 261 cdigo de operacin WRITE (crear nuevos registros) archivos de base de datos 195 finalidad 30 para componentes subarchivo 153

B
barra de desplazamiento horizontal atributos 80 eventos 80 finalidad 80 barra de desplazamiento vertical atributos 174 eventos 174 finalidad 174 barra de estado, componente atributos 151 eventos 151 finalidad 151 barra de mens atributos 103 eventos 103 finalidad 103 barra de progreso, componente finalidad 133 bean Java, componente atributos 87 classpath, configuracin 88 crear 87 finalidad 87 JAR asociados 88 propiedades y mtodos 89 bibliografa 449

cdigo de operacin WRITE (crear nuevos registros) (continuacin) reflejar valores almacenados en la pantalla 29 cdigo de tiempo de ejecucin empaquetado 399 instalacin 407 cdigo fuente editar 214 nombrearchivo.VPG 413 cdigos de edicin definido por el usuario 230 finalidad 229 formato de datos en formatos predefinidos 229 cdigos de operacin CALLB 256 CLEAR 153, 183 CHAIN 153 DELETE 153 READ 73 READC 153 READS 153 SETATR 82 SHOWWIN 177 START 62, 260 STOP 260 UPDATE 153 WRITE 73, 153 ColNumber, atributo 66, 155 color de componentes convertidos despus de la importacin 211 colores de componente ejemplo de componente graduador 140 usos comunes de 37 compartir campos de programa, ejemplo de componentes 31 compilacin de programas nombrearchivo.EVT 413 nombrearchivo.LST 413 Complete, evento 100 componente *component atributos 184 eventos 184 finalidad 184 Componente ActiveX atributos 47 crear 47 eventos 47, 49, 87 finalidad 46 mtodos 48 propiedades 47 componente botn de seleccin atributos 136 ejemplo que muestra cmo agrupar 136 eventos 136 finalidad 136 componente campo de entrada almacenar valores de lectura 29 alteracin temporal de valores definidos 29 atributos 72 borrar 183 eventos 73 finalidad 72 ndice

455

componente campo de entrada (continuacin) inicio de componentes lgicos 260 y transferencia de datos 41 componente de interfaz ODBC/JDBC acceder a los datos de una tabla 120 atributos 119, 133 conexin a una base de datos 119 crear de un conjunto de registros 119 eventos 119, 133 finalidad 118 recuperar filas de tabla 121 tipos de datos 121 componente edicin de mltiples lneas atributos 110 ejemplo de 112 eventos 110 finalidad 110 y transferencia de datos 41 componente elemento de men atributos 104 eventos 103, 104 finalidad 104 componente pulsador atributos 134 eventos 134 finalidad 134 componente pulsador grfico atributos 78 eventos 78 finalidad 77 componente recuadro de combinacin aadir y cambiar elementos 58 atributos 57 eliminacin de elementos 59 eventos 58 finalidad 57 orden de elementos 58 recuperacin de un elemento seleccionado por usuario 59 seleccin y deseleccin de elementos 59 y transferencia de datos 41 componente Recuadro de contorno atributos 131 eventos 131 finalidad 131 componente subarchivo de mensajes atributos 106 ejemplo de 108 eventos 106 finalidad 106 y transferencia de datos 41 componente texto esttico almacenar valores de lectura 29 alteracin temporal de valores definidos 29 atributos 149 eventos 149 finalidad 149 nombres exclusivos 30 y transferencia de datos 41 componente ventana atributos 175 eventos 175 finalidad 175

componentes *component 184 ActiveX 46 barra de desplazamiento horizontal 80 barra de desplazamiento vertical 174 barra de estado 151 barra de mens 103 barra de progreso 133 Bean Java 87 botn de seleccin 136 cambio de los colores de 37 campo de entrada 72 Cliente DDE 71 colocacin en diversas resoluciones de monitor 38 comunicacin entre 253 contenedor 64 Contenedor 64 control de animacin 50 cuaderno 115 detener 261 edicin de mltiples lneas 110 elemento de men 104 enlace 253 graduador 139 grfica 75 habilitacin de componentes 37 imagen 81 iniciar 260 interfaz ODBC/JDBC 118 lienzo 53 listado de eventos para un componente 26 marco de la ventana 175 medios 99 men emergente 132 pgina de cuaderno 116 pgina de cuaderno con lienzo 117 panel de medios 101 posicionamiento 37 pulsador 134 pulsador grfico 77 recuadro de combinacin 57 Recuadro de combinacin 57 recuadro de contorno 131 recuadro de grupo 79 recuadro de lista 83, 90 recuadro de seleccin 55 referencia 25 referencia a componente lgico 62 Referencia a componente lgico 62 selector cclico 145 soportar transferencia de datos 41 subarchivo 152 subarchivo de mensajes 106 submen 166 temporizador 167 texto esttico 149 ventana 175, 176 comprobacin de nivel conectores de proveedor aadir 371 crear 373 gestionar 371 invocar 371 196

contenedor, componente atributos 64 cambio de vistas de 67 ejemplo de actualizacin de datos en 66 ejemplo de adicin de registros a 66 ejemplo de eliminar registros de 67 eventos 64 finalidad 64 control de animacin, componente atributos 50 eventos 50 finalidad 50 conversin cdigo fuente RPG utilizando CVTRPGSRC 214 Crear archivo de mensajes, programa de utilidad 250 cuaderno, componente atributos 115 eventos 115 finalidad 115 CVTRPGSRC, herramienta de conversin ILE RPG/400 214

CH
CHAIN (recuperacin aleatoria de archivo), cdigo de operacin 153 Change, evento para componentes graduador 140 para componentes panel de medios 102 y componentes edicin de mltiples lneas 112 CharOffset, atributo 111

D
DELETE (suprimir registro), cdigo de operacin 153 depurador cambio de vista 223 Cargar aparicin 218 ejecucin de pasos 222 ejecucin de pasos externos 222 ejecucin de pasos internos 222 ejecucin de un programa durante la depuracin 222 ejecucin del programa 223 establecimiento de puntos de interrupcin 219, 221 iniciar 217 modificacin de la representacin 224 modificacin de las vistas del depurador 226 modificacin del contenido de un campo 224 puntos de interrupcin 218 retorno de recorrido 222 selecciones de la barra de herramientas 222 visin general 217 visualizacin de la pila 223 visualizacin de la supervisin del programa 223

456

Programacin con VisualAge RPG

depurador (continuacin) visualizacin de la ventana de control de sesin de la depuracin 223 visualizacin de registros 223 visualizacin del almacenamiento 223 visualizar variables 223 diferencias de tiempo de ejecucin java 280 diseo aplicacin Video Store Catalog 5 ayuda en lnea 19 contenido de la ventana 20 lgica del programa 21 mensajes 21 nmero de ventanas 20 DLL, archivo carga de la aparicin de DLL durante la depuracin 218 descripcin 413 llamada a funciones 256 DSPLY 250

E
edicin archivos de ayuda 212 datos en campos de entrada y componentes texto esttico 229, 230 fuente RPG 214 mensajes 249 editar mensajes de forma directa 251 ejecucin con puntos de interrupcin programas durante la depuracin 222 puntos de interrupcin de la depuracin 221 ejecucin de pasos externos durante la depuracin 222 ejecutar subrutina invocacin de subrutinas de accin con 26 ejemplos actualizacin de componentes contenedor 66 adicin de registros a un componente contenedor 66 agrupacin de botones de seleccin 136 aplicacin Video Store Catalog 3 cambio del tamao de una ventana 178 componente ventana 183 de componentes que comparten un campo de programa 31 de transferencia de datos 42 eliminacin de registros de componentes contenedor 67 lectura y modificacin de registros de subarchivo 154 obtencin y establecimiento de valores para componentes selector cclico 146 utilizacin de componente referencia a componente lgico 62 utilizacin de subarchivos para visualizar datos de AS/400 155

ejemplos (continuacin) utilizacin del componente edicin de mltiples lneas 112 utilizacin del componente graduador 140 utilizacin del componente imagen 83 utilizacin del componente recuadro de lista 93 utilizacin del componente subarchivo de mensajes 108 utilizacin del componente subarchivo para visualizar registros de base de datos 156 utilizacin del componente temporizador 168 utilizacin del evento Create para una ventana 38 eliminar cdigo de tiempo de ejecucin 407 una aplicacin 407 empaquetado aplicacin 399 cdigo de tiempo de ejecucin 399 prerrequisitos 399 enlace de componentes 253 enlaces de hipertexto, creacin 237 entradas de posicin y conversin durante la importacin 208 establecer fonts de la depuracin 227 puntos de interrupcin de la depuracin 219 etiquetas descripcin 39 sustitucin 247 etiquetas de sustitucin definicin de texto para 247 descripcin 39 evento Create, ejemplo de 38 evento Enter para componentes recuadro de combinacin 61 para componentes recuadro de lista 92, 165 evento GotFocus usos comunes de 39 y componentes edicin de mltiples lneas 112 evento LostFocus, usos comunes de 39 evento MenuSelect para componentes opcin de men 105 evento Press para componentes pulsador 135 para componentes pulsador grfico 78 evento Select para componentes botn de seleccin 138 para componentes recuadro de combinacin 61 para componentes recuadro de lista 92 para componentes subarchivo 165 sealizacin 56

eventos Close 182 codificacin de BEGACT y ENDACT 26 Complete 100 comprobacin de errores de atributos de evento 27 Change 102, 112, 140 descripcin de atributos 26 Enter 92, 165 GotFocus 39, 112 invocacin de subrutinas de accin 26 listado de eventos para un componente 26 LostFocus 39 MenuSelect 105 Notify 63 para componentes barra de desplazamiento horizontal 80 para componentes barra de desplazamiento vertical 174 para componentes barra de estado 151 para componentes barra de mens 103 para componentes barra de progreso 133 para componentes bean Java 87 para componentes botn de seleccin 136 para componentes campo de entrada 73 para componentes cliente DDE 71 para componentes control de animacin 50 para componentes cuaderno 115 para componentes de ActiveX 47 para componentes edicin de mltiples lneas 110 para componentes graduador 139 para componentes imagen 82 para componentes Interfaz ODBC/JDBC 119 para componentes medios 99 para componentes opcin de men 104 para componentes pgina de cuaderno 116 para componentes panel de medios 101 para componentes pulsador 134 para componentes pulsador grfico 78 para componentes recuadro de combinacin 61 para componentes recuadro de contorno 131 para componentes recuadro de grupo 79 para componentes recuadro de lista 90 para componentes recuadro de seleccin 56 para componentes selector cclico 145 para componentes subarchivo 152 ndice

457

eventos (continuacin) para componentes subarchivo de mensajes 106 para componentes submen 166 para componentes temporizador 167 para componentes texto esttico 149 para componentes ventana con lienzo 175, 176 Press 78, 135 respuesta a eventos en el programa 26 Select 56, 92, 138, 165 Tick 167 eventos, atributos definicin de atributos de evento y de sistema 28 finalidad 26 EXE, archivo descripcin 413 llamada a archivos .EXE 258

F
FirstSel, atributo 59 FontName, atributo 149 FontSize, atributo 149 fuente RPG reutilizar 214

importar 206 (continuacin) formatos de registro de pantalla 207 palabras clave de archivos de pantalla 209 situacin 201 iniciar el depurador 217 ventana de depuracin 217 inicio de componentes lgicos inicio de componentes lgicos 260 inicio de un componente lgico 260 InsertItem para componentes recuadro de lista 91 InsertMode, atributo 73 instalacin aplicaciones (para Windows NT) 407 cdigo de tiempo de ejecucin (para Windows NT) 407 cdigo para ejemplos en este manual 33 consideraciones sobre DBCS 363 ejemplo Catlogo de vdeos 3 intercambio de informacin con otras aplicaciones de PWS 253 IPF (Recurso de Presentacin de Informacin) 235

llamada a programas locales (continuacin) funciones utilizando constantes con nombre 256 funciones utilizando un puntero de procedimiento 257 llamada a programas locales 255 programas locales 255 programas remotos 260 llamada de prototipo llamada de prototipo 264

M
Masked, atributo 74 matriz modificacin durante la sesin de depuracin 224 visualizacin durante la sesin de depuracin 223 Maximum, atributo 145 medios, componente atributos 99 control con el componente panel de medios 100 eventos 99 finalidad 99 sealizacin de eventos 100 mensajes buscar 249 compilar para traducir 250 crear 247, 248 disear 21 edicin 249 editar para traducir 251 eleccin del tipo de 248 nombrearchivo.TXM 413 supresin 249 tipos de 247 utilizacin con la lgica 250 utilizacin de etiquetas 251 mensajes de error error al referenciar componentes 177 salida formateada incorrectamente 231 men emergente, componente atributos 132 eventos 132 finalidad 132 mtodos java, invocar 269 mtodos java, prototipo 270 Minimum, atributo 145 modificacin eventos de enlace a subrutinas de accin 26 ID de recurso 413 MsgSubText, atributo 107

J G
Gestor de Interfaz de Usuario, reutilizar archivos 212 GETATR utilizacin 25 GetNewID, atributo 65 GetRcdText, atributo 65 glosario 437 graduador, componente atributos 139 eventos 139 finalidad 139 grfica 75 finalidad 75 java, compilacin 277 JavaHelp, creacin 243 Juego de Caracteres de Doble Byte consideraciones del desarrollo de aplicaciones 363 DBCS puro 365 GETATR, cdigo de operacin 364, 365 SETATR, cdigo de operacin 364, 365 tipo de datos DBCS cualquiera 363, 365 tipo de datos DBCS mixto 363, 365 tipo de datos grficos 365 tipo de datos Slo DBCS 363, 364

I
ICO, archivo utilizacin 81, 233 iconos, utilizacin 233 imagen, componente acceso a archivos de imgenes y sonido en tiempo de construccin 234 atributos 82 especificacin del atributo FileName 233 eventos 82 finalidad 81 imgenes, adicin 233 importar 206 archivos de pantalla 206, 207 color de componentes convertidos 211 entradas de posicin y conversin 208

L
lienzo, componente atributos 54 eventos 54 finalidad 53 listas de bibliotecas configuracin de un servidor 190 Consideraciones sobre el cuaderno Definir informacin de AS/400 193 descripcin de trabajo 190 QCMDDDM 190, 191 QCMDEXC 190

N
nemotcnico para botones de seleccin 136 para componentes recuadro de seleccin 56 para elementos de men 104 para pginas del cuaderno 116 para pulsadores 134

LL
llamada a programas locales funciones locales 256 funciones sin parmetros obligatorios 257

458

Programacin con VisualAge RPG

nemotcnico (continuacin) traduccin 22 Notify, evento 63

O
obtencin de la cuenta de registros atributo de texto para componentes de mltiples lneas 110 atributos de componente 25 cuenta de registros en un subarchivo 154 estado de componentes botn de seleccin 138 estado de componentes recuadro de seleccin 55 valor para componentes graduador 139 valores para componentes selector cclico 146 Open Immediately, atributo 176 OpenEdit, atributo 155

P
pgina de cuaderno, componente atributos 116 eventos 116 finalidad 116 pgina de cuaderno con lienzo, componente atributos 117 eventos 117 finalidad 117 palabras de edicin correccin de salida formateada incorrectamente 231 cuerpo de 231 estado de 232 finalidad 229, 230 partes de 231 posiciones de expansin de 232 panel de medios, componente atributos 101 control del componente medios 100 eventos 101 finalidad 101 planificacin de la aplicacin 19 posicin de los componentes, cambiar 178 proceso recurrente llamadas recursivas 266 programa de lenguaje de control (CL) ALCOBJ 196 CVTRPGSRC, herramienta de conversin ILE RPG/400 214 QCMDDDM 190 QCMDEXC 190 STRPCCMD 263 programa de utilidad de Empaquetado 399 programa de utilidad Definir informacin de AS/400 establecimiento de un servidor en tiempo de ejecucin 190 y empaquetado de la aplicacin 400 programas, no GUI 357

programas autnomos 357 programas de ejemplo construir 34 ejecutar 34 instalar 33 instrucciones especiales para ejemplos que necesiten datos de AS/400 34 programas de utilidad Crear archivo de mensajes 250 Definir informacin de AS/400 190, 400 Empaquetado 399 programas no GUI 357 Programas no GUI desde DOS 433 prototipo, mtodos Java 270 pseudnimos de archivo (alteraciones temporales) 192 publicaciones, lista de 449 pulsador de ayuda, creacin 236 puntero modificacin del valor durante la depuracin 226 visualizacin durante la depuracin 225 punto de interrupcin establecer 219, 221

referencia a componente lgico, componente atributos 62 comunicacin entre componentes lgicos 253 ejemplo 62 eventos 62 finalidad 62 RemoveItem, atributo 59, 91 RemoveMsg, atributo 107 RemoveRcd, atributo 67 RESET finalidad 30 restricciones de java 277 reutilizacin aplicaciones de AS/400 201 archivos de ayuda UIM 212 archivos de pantalla 206, 207 fuente RPG 214

S
seleccin de elementos en recuadros de combinacin 59 SelectItem, atributo 61 selector cclico, componente ejemplo de 146 eventos 145 finalidad 145 servidores acceso a archivos de base de datos de AS/400 192 acceso a reas de datos de AS/400 191 alteracin de archivos de base de datos 196 bloqueo de archivos de base de datos 196 comprobacin de nivel 196 configurar para desarrollar/ejecutar aplicaciones 190 consideraciones de base de datos 197 consideraciones sobre el cuaderno 189 consideraciones sobre la lista de bibliotecas 190 definicin de la informacin de AS/400 189 emisin de mandatos CL 190 llamada a programas AS/400 262 llamada a programas AS/400 con archivos de estacin de trabajo 263 utilizacin de la aplicacin como servidor DDE 254 SETATR utilizacin 25 SetRcdIcon, atributo 67 SetRcdText, atributo 64, 67 SHOWWIN, cdigo de operacin carga de ventana en memoria 177 sistema, atributos comprobacin de errores de atributos de sistema 27 sonido, adicin 233 START (iniciar un componente lgico), cdigo de operacin descripcin 260 ndice

Q
QCMDDDM cambio de la lista de bibliotecas QCMDDDM, cambio de la lista de bibliotecas 190 QCMDEXC cambio de la lista de bibliotecas QCMDEXC, cambio de la lista de bibliotecas 190 190

190

R
READC (leer siguiente registro modificado), cdigo de operacin 153 READS (leer registro seleccionado del subarchivo), cdigo de operacin 153 RecordID, atributo 66 recuadro de grupo atributos 79 eventos 79 finalidad 79 recuadro de lista, componente atributos 75, 90 eventos 90 finalidad 90 y transferencia de datos 41 recuadro de seleccin, componente atributos 55 eventos 55, 56 finalidad 55 obtencin y establecimiento de estados 55 Recurso de Presentacin de Informacin (IPF) 235 referencia componentes en diferentes ventanas 25 componentes en las mismas ventanas 25

459

START (iniciar un componente lgico), cdigo de operacin (continuacin) llamada a programas locales utilizando 259 restricciones al llamar a programas locales con 260 y componentes referencia a componente lgico 62 subarchivo, componente atributos 152 campos ocultos 155 ejemplo de lectura y actualizacin de registros 154 ejemplo de visualizar datos de AS/400 155 eventos 152 finalidad 152 submen, componente atributos 166 eventos 166 finalidad 166 subrutina de accin modificacin de eventos de enlace 26 subrutina de accin, invocacin 26

V
Validate, atributo 73 valor de color RGB 37 valores por omisin abrir inmediatamente 176 contenido de la lista de ventanas 181 debido a cdigo de operacin CLEAR 183 foco 181 orden de los elementos en un recuadro de combinacin 58 valores del men del sistema 182 visible 176 varios procedimientos llamada de prototipo 264 ventana con lienzo, componente atributos 176 eventos 176 finalidad 176 ventanas atributos 175, 176 atributos para cdigos de operacin 30 cambiar el tamao 178 carga en memoria 177 cdigos de operacin para 30 consideraciones sobre el estilo 22 creacin al iniciar 177 cundo puede establecer atributos 177 dar foco de entrada 38 diseo del contenido de 20 especificar cundo visualizar 38 establecimiento del contenido de la lista de ventanas 181 establecimiento del foco 181 eventos 175, 176 finalidad 175, 176 mtodo para mover 178 nombres exclusivos para componentes campo de entrada y texto esttico 30 OpenImmediately, atributo 176 referencia 177 situar sin utilizar la barra de ttulo 178 terminacin al Cerrar 182 utilizacin de sonido 233 valores del men del sistema 182 valores por omisin 176 Visible, atributo 176 visualizacin 176 visualizacin de imgenes en 233 View, atributo 70 vistas, cambiar 67 vistas de contenedor, cambiar 67 Visual RPG barra de herramientas de la depuracin 222 ejecucin de puntos de interrupcin 221 establecimiento de fonts de la depuracin 227 establecimiento de puntos de interrupcin 219 informacin de arranque de la depuracin 219

T
temas finales para componentes graduador 140 usos comunes de 37 temporizador, componente eventos 167 finalidad 167 terminacin de un programa 182 Terminar al cerrar 182 texto finalidad 30 para componentes campo de entrada 73 para componentes recuadro de combinacin 59 para componentes selector cclico 146 Tick event 167 tiempo de ejecucin actualizacin 407 eliminar 407 nombrearchivo.DLL 413 nombrearchivo.EXE 413 nombrearchivo.HLP 413 nombrearchivo.ODX 413 nombrearchivo.RST 413 suprimir 407 volver a empaquetar 407 volver a instalar 407 tipo de componente descripcin 264 tipo de datos grficos 365 traduccin compilar mensajes para 250 consejos para 22, 40 editar mensajes para 251 mensajes 22 nemotcnico 22 transferencia de datos componentes que soportan 41 ejemplo 42 utilizacin 41

Visual RPG (continuacin) lista de puntos de interrupcin 220 modificacin de un valor de puntero 226 modificacin de variables, matrices y estructuras 224 ventana de depuracin 217 visualizacin de un valor de puntero 225 visualizacin de variables, matrices y estructuras 223 visualizacin del cdigo fuente ensamblador 218 visualizacin del punto de interrupcin de la carga de la aparicin 218 visualizar variables cdigo fuente ensamblador de la depuracin 218 punto de interrupcin de la carga de la aparicin de la depuracin 218 valor de puntero durante la depuracin 225 variables, matrices y estructuras durante la depuracin 223 variables durante la depuracin 223 volver a empaquetar 407

W
Windows, ayuda, creacin 239

460

Programacin con VisualAge RPG

Nmero de Programa: 5769-CL3

Printed in Denmark by IBM Danmark A/S

SC10-3067-04