You are on page 1of 480

AS/400e

IBM

Programacin con
VisualAge para RPG
Versin 4.5.1 para Windows

SC10-3067-04

AS/400e

IBM

Programacin con
VisualAge para RPG
Versin 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

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

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

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

iv

Programacin con VisualAge RPG

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

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

. 146
. 146
. 149
. 149
. 149
.
.
.
.
.
.
.

150
150
151
151
152
153
153

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

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

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

153
153
153
154
154
154
155
155
155
155
165
166
167
167
167
168
168

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

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

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

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

189
189
190
190
190
191
192
196
196
196
197
197

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

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

.
.
.

.
.
.

.
.
.

.
.
.

224
224
225
225
226
227

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

vi

Programacin con VisualAge RPG

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

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

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

247

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
248
249
249
249
250
250
251
251

223

Captulo 11. Edicin de la salida . . . 229


Cdigos de edicin . . . . . .
Palabras de edicin . . . . . .
Partes de una palabra de edicin .

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 .

235
235
235
236

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 18. Cmo invocar mtodos


Java desde programas VisualAge
RPG . . . . . . . . . . . . . . . 269

Captulo 23. Fusin de cdigo en la


aplicacin . . . . . . . . . . . . . 367

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

Captulo 24. Conectores de proveedor 371


. 269
. 270
.
.
.
.

271
273
273
276

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

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

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

Adicin de conectores de proveedor . . .


Invocacin de un conector de proveedor .
Gestin de conectores de proveedor . . .

.
.
.

.
.
.

Captulo 25. Creacin de conectores

. 371
. 371
. 371

373

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
379
381
395

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

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


Apndice A. Archivos de aplicacin

413

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

Apndice C. Creacin y compilacin


de programas no GUI desde MS-DOS . 433
Acceso a un sistema AS/400 .

viii

Programacin con VisualAge RPG

. 434

Glosario

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

Bibliografa . . . . . . . . . . . . 449
Avisos . . . . . . . . . . . . . . 451
Informacin de interfaz de programacin .
Marcas registradas y marcas de servicio .

.
.

.
.

. 452
. 452

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

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

Programacin con VisualAge RPG

Al accionar el pulsador Browse by Category en la


ventana Video Catalog Welcome se visualiza la
ventana Video Catalog Categories.

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

brComedy

*
*

C
C
C
C
C
C
C

*
*

C
C
C
C
C

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

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

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

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

Descripcin

Tipo

Longitud

%DspHeight

Devuelve la altura de Numrico


la pantalla, en tiempo
de ejecucin, en
pixels.

%DspWidth

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

Numrico

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

Atributo de los componentes campo de entrada que se utiliza para ejecutar


operaciones READ, WRITE, CLEAR y RESET.

Label

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

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

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

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

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

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

Descripcin

Animation

Ejemplo de componente control de


animacin

Bean

Ejemplo de componente bean Java

Calendar

Ejemplo de componente calendario

Component Reference Part

Ejemplo de referencia del componente

Container

Ejemplo del componente contenedor

Customer Maintenance*

Ejemplo de mantenimiento de clientes

DDE Client

Ejemplo de componente cliente DDE

DDE Hotlink

Ejemplo de enlace dinmico DDE

Drag and Drop

Ejemplo de transferencia de datos

Graph

Ejemplo de componente grfico

Image*

Ejemplo de componente imagen

Listbox

Ejemplo de componente recuadro de lista

Message Subfile

Ejemplo de componente subarchivo de


mensajes

Multiline Edit

Ejemplo de componente edicin de


mltiples lneas

Notebook

Ejemplo del componente cuaderno

Odbcceld

Ejemplo de componente interfaz


ODBC/JDBC

Popup Menu

Ejemplo del componente men emergente

Progress

Ejemplo de componente barra de progreso

Resize

Ejemplo de ajuste de tamao

Scroll

Ejemplo de componente barra de


desplazamiento

Slider**

Ejemplo de componente graduador

Spin Button

Ejemplo de componente selector cclico

Subfile*

Ejemplo de componente subarchivo

Timer

Ejemplo de componente temporizador

VARPG Plug-in

Ejemplo de conector de proveedor

Video Store Cashier*

Ejemplo de cajero de tienda de vdeos

Video Store Catalog*

Ejemplo de catlogo de vdeos

Welcome

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

36

Atributo PartType

Componente VisualAge RPG

FVDESOCX

ActiveX

FVDESAnimationControl

Control de animacin

FVDESCalendar

Calendario

FVDESCanvas

Lienzo

FVDESCheckBox

Recuadro de seleccin

FVDESComboBox

Recuadro de combinacin

FVDESContainerControl

Contenedor

FVDESVComponentReference

Referencia a componente lgico

FVDESDDEClient

Cliente DDE

FVDESEntryField

Campo de entrada

FVDESGraph

Grfica

FVDESGraphicPushButton

Pulsador grfico

FVDESGroupBox

Recuadro de grupo

FVDESHScrollBar

Barra de desplazamiento horizontal

FVDESImage

Imagen

FVDESJavaBean

Bean Java

FVDESListBox

Recuadro de lista

FVDESAudio

Medios

FVDESMediaPanel

Panel de medios

FVDESMenuItem

Elemento de men

FVDESMessageSubfile

Subarchivo de mensajes

FVDESMultiLineEdit

Edicin de mltiples lneas

FVDESNotebook

Cuaderno

FVDESNotebookPage

Pgina de cuaderno

FVDESODBCInterface

Interfaz ODBC/JDBC

FVDESOutlineBox

Recuadro de contorno

FVDESPopUpMenu

Men emergente

FVDESProgressBar

Barra de progreso

FVDESPushButton

Pulsador

FVDESRadioButton

Botn de seleccin

FVDESSlider

Graduador

FVDESSpinButton

Selector cclico

FVDESStaticText

Texto esttico

FVDESStatusBar

Barra de estado

FVDESSubfile

Subarchivo

FVDESSubmenu

Submen

FVDESTimer

Temporizador

FVDESVScrollBar

Barra de desplazamiento vertical

FVDESFrameWindow

Ventana

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

Datos transferidos

Recuadro de combinacin

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

Campo de entrada

El valor del atributo Text

Recuadro de lista

El elemento seleccionado

Subarchivo de mensajes

El mensaje seleccionado

Edicin de mltiples lneas

El valor del atributo Text

Texto esttico

El valor del atributo Label

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

48

'PieChart'

Programacin con VisualAge RPG

const('AddData, ItemX, 3.0')


Setatr

datax

'Method'

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

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

50

Programacin con VisualAge RPG

Destroy

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
*

'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

54

Programacin con VisualAge RPG

Create
MouseMove

DblClick
MouseUp

Destroy
Popup

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

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

60

Programacin con VisualAge RPG

'Combo1'
'Combo1'
'Combo1'

Getatr
Setatr
Getatr

'FirstSel'
X
'ItemKey'

X
'Index'
Key

2 0

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.

Icono

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.

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.

Texto

El texto que se visualiza con el icono de objeto. Puede cambiarse en tiempo


de ejecucin mediante el atributo SetRcdText.

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

Destroy
TimeOut

ExecuteAck

Eventos a los que puede aplicarse


Create
PokeAck

Data
Terminate

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

'Graph1'

Do
Setatr

2
Group

Group
'DataGroup'

2 0

C
C

'Graph1'

Do
Setatr

12
Point

Point
'DataPoint'

2 0

C
C

'Graph1'

If
Setatr

Group = 1
Low(Point)

'DataValue'

Else
Setatr
Endif

High(Point)

'DataValue'

'UseData'

*
*
*

C
C
C

'Graph1'
*

EndDo

EndDo

*
*

'Graph1'

Setatr

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

80

Programacin con VisualAge RPG

Destroy

Scroll

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

MAIN

BEGACT

CREATE

MAIN

C
C

'LB1'
'LB1'

Setatr
Setatr

0
1

'Case'
'SearchType'

Read

Custom01

DoW
Setatr
Read
EndDo

NOT *in99
CustNa
Custom01

'AddItemEnd'

Setatr

'SelectItem'

*
*

C
C
C
C

'LB1'
*

'LB1'

99

99

ENDACT

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

EF1

BEGACT

CHANGE

MAIN

'EF1'

Getatr

'Text'

Search

C
C

'LB1'

If
Setatr

Search <> *Blanks


Search
'Search'

*
*
*

40

Captulo 7. Utilizacin de componentes

97

C
C
C
C
C
C

If
Eval
Eval
EndIf

C
C
C
C

'LB1'
'LB1'
'LB1'

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

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

Destroy
MouseMove

Link
Popup

Eventos a los que puede aplicarse


Change
MouseEnter
Press

Create
MouseExit

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'

'Select * From "Customers"'


Setatr
Setatr

SelAll
1

'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

20
30

S
S

*
*

INZ(%Addr(first))
INZ(%Addr(last))

Setatr
Setatr
Setatr
Setatr

1
20
fptr
1

'Column'
'BufferLen'
'BufferPtr'
'BufferType'

Setatr
Setatr
Setatr
Setatr

2
30
lptr
1

'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

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

Tipo de datos
VARPG

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

Especifica la longitud
del campo de
programa (utilice
BufferLen)

Especifica las posiciones


decimales de la columna
del almacenamiento
intermedio (utilice
BufferDec)

zona
zona
zona

X
X
X
X

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'

'Select * From "Customers"'


Setatr
Setatr

SelAll
1

'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

'ODBC1'
'ODBC1'

Setatr
Getatr

1
'IsData'

'FetchNext'
Temp

C
C
C
C

'LB1'
'ODBC1'

DoW
Setatr
Getatr
EndDo

Temp = 1
first
'IsData'

'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

PB_Update

BEGACT

PRESS

C
C
C

'ODBC1'
'ODBC1'

Read
Getatr
Setatr

'Main'
'CurrentRow' Row
Row
'UpdateRow'

Main
1 0

ENDACT

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

PB_Delete

BEGACT

PRESS

C
C

'ODBC1'
'ODBC1'

Getatr
Setatr

'CurrentRow' Row
Row
'DeleteRow'

*
*

Main
1 0

ENDACT

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

*
*
*
*
*
*

*
* Seleccionar todos los registros
*
DSelAll
C
*

'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

'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

5
'Column'
17
'BufferLen'
1
'BufferType'
P_005=%Addr(Phone)
P_005
'BufferPtr'

Fax
SetAtr
SetAtr
SetAtr
Eval
SetAtr

6
'Column'
17
'BufferLen'
1
'BufferType'
P_006=%Addr(Fax)
P_006
'BufferPtr'

Direccin
SetAtr
SetAtr
SetAtr
Eval
SetAtr

7
'Column'
40
'BufferLen'
1
'BufferType'
P_007=%Addr(Address)
P_007
'BufferPtr'

Ciudad
SetAtr
SetAtr
SetAtr
Eval
SetAtr

8
'Column'
30
'BufferLen'
1
'BufferType'
P_008=%Addr(City)
P_008
'BufferPtr'

Pas
SetAtr
SetAtr
SetAtr
Eval
SetAtr

9
'Column'
20
'BufferLen'
1
'BufferType'
P_009=%Addr(Country)
P_009
'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

152

Programacin con VisualAge RPG

ColSelect
FirstRec
LostFocus
NextRec
PageUp
VKeyPress

Create
GotFocus
MouseEnter
PageDown
Popup

Destroy
KeyPress
MouseExit
PageEnd
PrevRec

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

REPORT

*
*
*
*
*

*IN99

BEGACT

PRESS

READS

SUBF1

DOWEQ

*OFF

MOVEL

'(Reported)'

UPDATE

SUBF1

C
C

READS
END

SUBF1

ENDACT

*
*

99

Para el registro seleccionado, procesarlo y marcarlo


como 'Informado' en la pantalla de subarchivo.

WIN1

SF1NAME

99

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.

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

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

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

Add
Read
EndDo

1
customer

Read

customer

*
*

count

9999

C
C
C
C
C
C
C
C
C
C

CurRec
'SFl1'
'SFL1'
'SFl1'
'SFL1'
'SFl1'
'SFL1'
'SFl1'
'SFL1'

ifeq
setatr
setatr
setatr
setatr
setatr
setatr
setatr
setatr
endif

1
1
0
2
0
5
1
6
1

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

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

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

ifeq
oreq
setatr
setatr
setatr
setatr
setatr
setatr
setatr
setatr
endif
ENDSR

*on
LastPage
1
1
2
1
5
0
6
0

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

9999

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

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

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

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

Eventos a los que puede aplicarse


Create

166

Programacin con VisualAge RPG

Destroy

PartType

UserData

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

174

Programacin con VisualAge RPG

Destroy

Scroll

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:

DTAARA (debe entrarse en maysculas)

Nombre de rea de datos remota:

REMDTAARA

Pseudnimo del servidor:

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

'
'
'
'

BEGSR

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

196

Programacin con VisualAge RPG

ENDSR

'QCMDDDM' Linkage(*Server)
QCMDDDM_Parm1 = 'OVRDBF FILE(MENUFL)' +

CallExecDDM

CallExecDDM

BEGSR

C
C
C
C

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

FLD2

IF

K DISK

SETLL

REC1

READ

REC1

BLOCK(*YES)
REMOTE

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
Ship to: 9999

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

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

Significado

8-16

Indicadores

17

Tipo de registro

19-28

Nombre

29

Referencia

30-34

Longitud

35

Modalidad de teclado

Entrada y resultados de la conversin


No se convierten

Se convierte segn lo descrito


en Formatos de registro

No se convierten

Si es un campo con nombre, se


utiliza como nombre del
componente

No se convierten

Establece la longitud de los


datos

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

208

Programacin con VisualAge RPG

Decimales

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

Tabla 6. Entradas de posicin y conversin (continuacin)


Columnas

Significado

38

Uso

39-41

Ubicacin

45-80

Palabras clave

Entrada y resultados de la conversin


IB

Habilitado

MP

No se convierten

Slo lectura, habilitado

Se convierte si el campo es de
subarchivo

Determina la posicin del


componente en la ventana

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

Atributos de campo

Atributos GUI

E/S*

ReadOnly: Desactivado
Enabled: Activado
Color:
Amarillo claro

Salida

ReadOnly: Activado
Enabled: Activado
Color:
Verde claro

Entrada

ReadOnly: Desactivado
Enabled: Activado
Color:
Azul claro

Entrada o E/S

Protegido

ReadOnly: Desactivado
Enabled: Desactivado
Color:
Rojo claro

Entrada o E/S

Teclado inhibido

ReadOnly: Activado
Enabled: Activado
Color:
Rojo intermedio

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

212

Cdigo UIM

Funcin cdigo

Cdigo IPF

:DL.

Lista de definiciones

:dl.

:FIG.

Figura

:fig.

:HP1.

Frase resaltada

:hp1.

:HP2.

Frase resaltada

:hp2.

:HP3.

Frase resaltada

:hp3.

:HP4.

Frase resaltada

:hp4.

:HP5.

Frase resaltada

:hp5.

:HP6.

Frase resaltada

:hp6.

:HP7.

Frase resaltada

:hp7.

:HP8.

Frase resaltada

:hp8.

Programacin con VisualAge RPG

Tabla 8. Cdigos UIM e IPF idnticos (continuacin)


Cdigo UIM

Funcin cdigo

Cdigo IPF

:HP9.

Frase resaltada

:hp9.

:LINES.

Lneas

:lines.

:LI.

Elemento de lista

:li.

:LP.

Componente de lista

:lp.

:NT.

Nota

:nt.

:OL.

Lista ordenada

:ol.

:P.

Prrafo

:p.

:PARML.

Lista de parmetros

:parml.

:P

Descripcin de parmetro

:pd.

:PT.

Trmino de parmetro

:pt.

:SL.

Lista sencilla

:sl.

:UL.

Lista no ordenada

:ul.

:XMP.

Ejemplo

:xmp.

&AMP.

Ampersand (&)

&amp.

&COLON.

Dos puntos (:)

&colon.

&period.

Punto (.)

&period.

&SLR.

Barra inclinada (/)

&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

Funcin

Cdigo IPF

:CIT.

Cita

:hp5.

:H1.

Cabecera

:h2.

:H2.

Cabecera

:h3.

:H3.

Cabecera

:h4.

:H4.

Cabecera

:h5.

:HELP.

Cabecera

:help.

:ISCH.

Elemento ndice

:i1.

:ISCHSYN.

Sinnimo de ndice

:isyn.

:PK.

Palabra clave de
programacin

:hp2.

:PK. con :DEF.

Palabra clave de prog. por


omisin

:hp7.

:PV.

Variable de programacin

: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

Funcin

Sustitutos IPF sugeridos

:HP0.

Sin resaltado

No utilice ningn cdigo :hpn alrededor del


texto.

:PC.

Continuacin de prrafo

No utilice ningn cdigo. Contine con el


texto del prrafo.

:RT.

Texto inverso

Utilice un tipo diferente de resaltado


utilizando un cdigo :hpn.

:XH1.

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

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.

:XH3.

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

:XH4.

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

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

Ejemplo de
Saldo
nmero negativo cero

ning. No

0123456789

0123456789-

Sin signo

124,567.89

124,567.89

Sin signo

124,567.89

124,567.89

No

Sin signo

124567.89

124567.89

No

Sin signo

124567.89

124567.89

CR

124,567.89

124.567,89CR

CR

124,567.89

124.567,89CR

No

CR

124567.89

124567,89CR

No

CR

124567.89

124567,89CR

-(menos)

124,567.89

124.567,89-

-(menos)

124,567.89

124.567,89-

No

-(menos)

124567.89

124567,89-

No

-(menos)

124567.89

124567,89-

-(menos flotante)

124,567.89

-124.567,89

-(menos flotante)

124,567.89

-124.567,89

EC
T

No

-(menos flotante)

124567.89

-124567,89

No

-(menos flotante)

124567.89

-124567,89

Y (2.)
Z (3.) No

.00

.00

.00

.00

.00

.00

.00

.00

1984-12-25
No

Sin signo

1234567

1234567

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.
Especifica la va de acceso al archivo de temas HTML que contiene el texto
de la ayuda. La va puede ser relativa o absoluta.

url

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

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

</tocitem>
</toc>

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

Aviso

4.
5.

6.

7.

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

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

begsr
callb
parm
parm
seton
endsr

*
procptr inz(%paddr('MYFUNC'))
80a
inz('misdatos')
9b 0 inz(32)
p2

wilma
age

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

El nombre del programa a utilizar en el programa VisualAge RPG

24-25

PR

44-80

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'

LINKAGE(*CLIENT)

'xxx'
test1
test2

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

LINKAGE(*CLIENT)

name1
name2

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

262

Nombre de alteracin temporal del


programa:

REMPGM

Nombre del programa remoto:

MYLIB/LOOKUP

Pseudnimo del servidor:

SERVER01

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

268

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.

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

CLASS(*JAVA:'java.math.BigDecimal')

Para declarar un campo que contendr un tipo de objeto String:


D string

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:

270

Tipo de datos Java

Tipo de datos VARPG

char[]

grfico o Unicode

boolean

indicador (N)

byte[]

alfanumrico (A de cualquier longitud)

byte

entero (3I)

int

entero (10I)

short

entero (5I)

long

entero (20I)

float

coma flotante (4F)

double

coma flotante (8F)

Programacin con VisualAge RPG

Tipo de datos Java

Tipo de datos VARPG

cualquier objeto

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

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
O

EXTPROC(*JAVA:
'java.lang.Integer':
'getInteger')
CLASS(*JAVA:'java.lang.Integer')
STATIC
CLASS(*JAVA:'java.lang.String')
CLASS(*JAVA:'java.lang.Integer')

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

272

Programacin con VisualAge RPG

PR

5I 0 EXTPROC(*JAVA:
'java.lang.Integer':
'shortValue')

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

4F

EXTPROC(*JAVA:
'java.math.BigDecimal':
*CONSTRUCTOR)
CLASS(*JAVA:'java.math.BigDecimal')
VALUE

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.

*
*
*
*
*
*

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

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

'trim')

D fld

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

* Sin la palabra clave EXTPROC


d sub2
pr
C

*INZSR

dll('VSUB')

BEGSR

C
C

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

Java_VCOMP1_proc1( void *je , void *jc)

{
printf(" llamada a proc1 satisfactoria.\n");
}
//--------------------------------------------------------------void _Export __stdcall
{
}

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

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

s
s
s

d mb1

d rc

*INZSR

C
C

1
4
10

inz('J')
inz('blue')
inz('abcdefghij')
style(*info) button(*OK)

BEGSR
callp
callp

sub1c(c1)
sub2c(c4:c10)

* Visualizar los valores cambiados por las llamadas


c4
dsply
mb1
rc
c10
dsply
mb1
rc

c
c
c
C

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
{

char

Java_VCOMPC_proc1c(

JNIEnv *je , void *jc,


jbyteArray p1)

*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

Java_VCOMPC_SUB2C( JNIEnv *je , void *jc,


jbyteArray p1, jbyteArray p2)

*c4;
*c10;

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

4S 0

* Con un parmetro Packed(9,2)


d subp
pr
d

dll('VSUBN')

dll('VSUBN')
9P 2

* 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

4S
9P
4B
9B

0
2
0
0

d mb1
d rc

m
s

*INZSR

inz(1234)
inz(1234567.89)
inz(1234)
inz(123456789)
style(*info) button(*OK)

BEGSR

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

b4
b9

c
C

dsply
dsply

mb1
mb1

rc
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

LR

ENDACT

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
{

Java_VCOMPN_SUBP( JNIEnv *je , void *jc,


jobject p1) // P(9,2)

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

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
{

jclass
jmethodID
jobject
jobject

cls;
mid;
aryobj;
aryobj2;

char
char

*binarynum;
*b9;

short
int

binary2;
binary4;

Java_VCOMPN_SUBB( JNIEnv *je , void *jc,


jobject p1 // B(4,0)
,jobject p2) // B(9,0)

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

// = Component.UNSIGNED_TYPE
// 0 posiciones decimales

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

Java_VJNIO_SUBF(

JNIEnv *je , void *jc,


jobject p1, jobject p2)

cls, cls2;
mid;
f4;
f8;

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

10d
8t
26z
callp

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

pr

d c1
d c4
d c10

s
s
s

d subz
d

pr

dll('VSUBA')
4S 0 dim(4)

d subp

pr

dll('VSUBA')

dll('VSUBA')

4
10

dim(4)

1
4
10

inz('J')
inz('blue')
inz('abcdefghij') dim(4)

9P 2 dim(4)

d subb
d
d

pr

dll('VSUBA')
4B 0 dim(4)
9B 0 dim(4)

d
d
d
d

z4
p92
b4
b9

s
s
s
s

4S
9P
4B
9B

d subf

pr

d
d

0
2
0
0

dim(4)
dim(4)
dim(4)
dim(4)
dll('VSUBA')

4f
8f

dim(4)
dim(4)

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

pr

d subiu
d
d

pr

10d
8t
26z

dll('VSUBA')
5i 0 dim(4)
10i 0 dim(4)

d
d
d
d
d
d
d

5u 0 dim(4)
10u 0 dim(4)
f4
f8
fd
ft
fts

s
s
s
s
s

d fi2

5i 0 dim(4) inz(1)

d fi4
d fu2
d fu4

s
s
s

10i 0 dim(4) inz(2)


5u 0 dim(4) inz(3)
10u 0 dim(4) inz(4)

*INZSR

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

BEGSR

C
C
C
C
C
C

callp
callp
callp
callp
callp
callp

subca(c4:c10)
subz(z4)
subp(p92)
subb(b4:b9)
subf(f4:f8)
subdtz(fd:ft:fts)

C
c
C

callp
seton
ENDSR

subiu(fi2:fi4:fu2:fu4)

Figura 85. Ejemplo VJNIA.VPG (Pieza 2 de 2)

308

dll('VSUBA')
dim(4)
dim(4)
dim(4)

Programacin con VisualAge RPG

lr

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

void _Export __stdcall

Java_VJNIA_SUBZ(

JNIEnv *je , void *jc,


jobject p1)

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

Java_VJNIA_SUBF(

JNIEnv *je , void *jc,


jfloatArray p1, jdoubleArray p2)

cls, cls2;
mid;
*f4;
*f8;
p1e,p2e;

printf(" llamada a SUBF satisfactoria.\n");


f4

(*je)->GetFloatArrayElements( je, p1, NULL);

f8

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

pr

10

dll('VSUBR')

d fc

10

inz('ibm varpg ')

eval

Figura 87. Ejemplo VJNIR.VPG

322

Programacin con VisualAge RPG

fc = subrc

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;

Java_VJNIR_SUBRS( JNIEnv *je , void *jc)

jbyteArray ba;
char
*p;
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;

Java_VJNIR_SUBRP( JNIEnv *je , void *jc)

jbyteArray ba;
char
*p;
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

5b 0 dll('VSUBR')
5b 0

eval

fb = subrb

Figura 93. Ejemplo VJNIR.VPG


jobject _Export __stdcall
{
jclass
cls;
jmethodID mid;
jobject
ro;

Java_VJNIR_SUBRB( JNIEnv *je , void *jc)

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

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

memcpy( p, "\x00\x00\xD9\x03", 4);

// 55555 = 0xD903

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

pr
pr

5i 0 dll('VSUBR')
10i 0 dll('VSUBR')

d fi2
d fi4

s
s

5i 0
10i 0

C
C

eval
eval

Figura 95. Ejemplo VJNIR.VPG

328

Programacin con VisualAge RPG

fi2= subri2
fi4= subri4

jshort _Export __stdcall


{
jshort rc;
rc = -5555;
return rc;
}

Java_VJNIR_SUBRI2( JNIEnv *je , void *jc)

jint
_Export __stdcall
{
return -55555;
}

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;

Java_VJNIR_SUBRU( JNIEnv *je , void *jc)

jbyteArray ba;
char
*p;
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);

memcpy( p, "\x00\x00\xD9\x03", 4);

// 55555 = 0xD903

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;

Java_VJNIR_SUBRF( JNIEnv *je , void *jc)

rc = -4444.4444;
return rc;

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

Archivo fuente: VJNIRA.VPG

d
d
d
d
d
d
d

subrca
subrsa
subrpa
subrba
subri2a
subri4a
subrua

pr
pr
pr
pr
pr
pr
pr

10
5s
5p
5b
5i
10i
10u

d
d
d
d

subrda
subrfa
subrf8a
subrcva

pr
pr
pr
pr

10d
4f
8f
10

d
d
d
d

fc
fs
fp
fb

s
s
s
s

10
dim(4)
5s 0 dim(4)
5p 0 dim(4)
5b 0 dim(4)

d
d
d
d
d
d
d

fi2
fi4
fu
fd
ff
ff8
fcv

s
s
s
s
s
s
s

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)

d mb1
d rc

m
s

0
0
0
0
0
0

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)

dll('VSUBRA')
dll('VSUBRA')
dll('VSUBRA')
dll('VSUBRA')

dim(4)
dim(4)
dim(4)
varying dim(4)

style(*info) button(*OK)

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

*INZSR

BEGSR

fs(2)

eval
dsply
eval
dsply

fc = subrca
mb1
fs = subrsa
mb1

C
c

fp(2)

eval
dsply

fp = subrpa
mb1

rc

C
c

fb(2)

eval
dsply

fb = subrba
mb1

rc

C
c

fi2(2)

eval
dsply

fi2= subri2a
mb1
rc

C
c

fi4(2)

eval
dsply

fi4= subri4a
mb1
rc

C
c

fu(2)

eval
dsply

fu = subrua
mb1

rc

C
c

fd(2)

eval
dsply

fd = subrda
mb1

rc

eval

ff = subrfa

fc(2)

rc
rc

ff(2)

dsply

mb1

C
c

ff8(2)

eval
dsply

ff8= subrf8a
mb1
rc

eval
dsply
eval
dsply
seton
ENDSR

fcv= subrcva
mb1
rc
rc = %len(fcv(2))
mb1
rc

C
c
C
c
c
C

fcv(2)
rc

rc

Figura 105. Ejemplo VJNIRA.VPG (Pieza 2 de 2)

334

Programacin con VisualAge RPG

lr

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

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

(*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;

Java_VJNIRA_SUBRSA( JNIEnv *je , void *jc)

jbyteArray ba;
char
*p;
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
);

/* nm. de posiciones decimales */

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

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

Java_VJNIRA_SUBRPA( JNIEnv *je , void *jc)

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

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

// posiciones decimales

}
(*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

Java_VJNIRA_SUBRBA( JNIEnv *je , void *jc)

mid;
ro;

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

memcpy( p, "\x00\x00\xD9\x03", 4);

// 55555 = 0xD903

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

// posiciones decimales

}
(*je)->SetObjectArrayElement( je, oa, i /* elemento matriz, empieza en 0 */
, ro);
} // for i
}

return oa;

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;

Java_VJNIRA_SUBRUA( JNIEnv *je , void *jc)

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;

}
#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);

memcpy( p, "\x00\x00\xD9\x03", 4);

// 55555 = 0xD903

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

PR

64A

DLL('MyFunc')
ExtProc('TOUPPER')
Value

64A

Value

64A

Value

B
PI
S

64A

0018 C

Eval

0019 C
Upper
0010 *
0011 PMyMain

Dsply

Upper=ToUpper(Instring)
I

ln.

Descripcin de cambio

0003

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.

0006

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.

0018

Esta es la llamada al procedimiento.

Si el procedimiento que est invocando no le devuelve un valor, debe utilizar el


cdigo de operacin CALLP para invocarlo:
C

360

Programacin con VisualAge RPG

CALLP

SomeFunc(parm1:parm2)

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

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

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

Nombre de destino

24.SEARCHW
79.SEARCHPB
80.CANCELSEPB
81.HELPPB

88.SEARCHW
99.SEARCHPB
100.CANCELSEPB
101.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

Captulo 23. Fusin de cdigo en la aplicacin

369

Los mensajes siguientes se han copiado en el proyecto de destino:


Mensaje de origen

Mensaje de destino

Las descripciones tcnicas de los siguientes componentes se han copiado en


el proyecto de destino:
Nombre de origen

Nombre de destino

SEARCHW:SEARCHPB
SEARCHW:CANCELSEPB
SEARCHW:HELPPB

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

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

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

ppluginPath_

&1

ppluginStub_

&2

pdllPath_

&3

builderId_
Captulo 25. Creacin de conectores

375

&4

remove_

&5

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

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.

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

ppluginPath_

&1

pdllPath_

&2

builderId_

&3

menuContextId_

&4

partsIds_

&5

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:

Help_Id:

panel_largosin parmetro_opcional_ventana_completa

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:

"Plug-Me-In Inc."
"Who Am I?"

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

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

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

382

Mandato

Parmetro(s)

Significado/Valor de retorno

Build

[win32|java]
Valor por omisin: win32

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

BuildOptions

[win32|java]
Valor por omisin: win32

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

CursoredPart

ninguno

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.

ExpandAll

[1]

Si el parmetro es igual a 1, se
expandir toda la vista de rbol;
en caso contrario, estar
contrada.

ForceOpen

[Nombreproyecto]

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.

Programacin con VisualAge RPG

Tabla 13. Destino: Proyecto (continuacin)


Get

ProjectDir

Devuelve el directorio raz del


proyecto en uso.

ProjectFileName

Devuelve el nombre completo


del archivo .IVG del proyecto en
uso.

ProjectTargetName

Devuelve el nombre del archivo


que se generar cuando se
construya el proyecto (por
ejemplo, myproj.exe).

ProjectTitle

Devuelve el ttulo del proyecto


en uso.

ProjectFileStub

Devuelve el nombre de archivo


(menos la extensin) de los
nombres del proyecto en uso
(por ejemplo, myproj).

IsSaveRequired

ninguno

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.

IsTemporary

ninguno

Devuelve 1 si se trata de un
proyecto sin nombre y 0 en caso
contrario.

MostRecentlyUsed

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.

Open

nombreProyecto

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.

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.

PromptedSave

ninguno

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.

PromptExisting

ninguno

Solicita al usuario un proyecto


existente. Devuelve el nombre de
archivo del proyecto.

Run

ninguno

Ejecuta el proyecto en uso.

Save

ninguno

Guarda el proyecto en uso.

SaveAs

nombreProyecto

Guarda el proyecto en uso con el


nombre de proyecto especificado.

SelectedParts

ninguno

Devuelve una serie que contiene


los identificadores de todos los
componentes seleccionados en la
vista de rbol del proyecto.

Tabla 14. Destino: PartClass

384

Mandato

Parmetro(s)

Significado/Valor de retorno

AllAttributes

ClassName

Devuelve una lista de los


atributos soportados por el
nombre de la clase especificada.

AllClasses

ninguno

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

Programacin con VisualAge RPG

Tabla 14. Destino: PartClass (continuacin)


AllEvents

ClassName

Devuelve todos los eventos


registrados de la clase
especificada.

IBMClasses

ninguno

Devuelve una lista de todas las


clases de componentes
suministradas por IBM que no
sean de proveedores.

IconDll

ClassName

Devuelve la va de acceso de la
dll que contiene el icono que
representa la clase de
componente especificada.

IconId

ClassName

Devuelve el ID de recurso del


icono (en la dll especificada por
IconDll) de la clase
especificada.

IsType

NombreTipo

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.

VendorClasses

ninguno

Devuelve una lista de todas las


clases de componentes de
proveedores disponibles.

Tabla 15. Destino: Componente


Mandato

Parmetro(s)

Significado/Valor de retorno

ActionSubroutine

IDComponente nombreEvento

Localiza la subrutina de la accin


enlazada, el nombreEvento o crea
un enlace y lo explora en caso de
que no exista.

ActionSubroutines

IDComponente

Devuelve una lista de subrutinas


de accin definidas para este
componente.

AllEvents

IDComponente

Devuelve todos los eventos


registrados del componente
especificado.

Children

[IDComponente]

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.

ClassName

IDComponente

Devuelve el nombre de clase del


componente indicado.

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.

CreateFrame

ClassName

Crea un componente de la clase


especificada. La clase debe ser un
componente basado en marcos.
Devuelve el IDComponente del
componente recin creado.

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

386

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.

FileName

IDComponente

Obtiene el nombre de archivo


definido para este componente.
Si el componente no soporta
archivos, el valor de retorno es
una serie vaca.

GetColor

IDComponente [x]
donde x corresponde al rea de
color del componente indicado.

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)

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.

GetRect

IDComponente

Obtiene las coordenadas (x y


ancho alto) del componente con
relacin a su padre.

HasFile

IDComponente

Devuelve un 1 para indicar que


el componente soporta un
archivo (por ejemplo, lienzo,
imagen, medios, etc.); en caso
contrario, devuelve un 0.

IsColorArea
IDComponente [x]
Ver Nota ms abajo donde x corresponde al rea de
color del componente indicado.

Devuelve un 1 para indicar que


el rea de color est soportada;
en caso contrario, devuelve un 0.

IsFontArea

IDComponente [x]
donde x corresponde al rea de
font del componente indicado.

Devuelve un 1 para indicar que


el rea de font est soportada; en
caso contrario, devuelve un 0.

Label

IDComponente

Devuelve la etiqueta del


componente (si existe).

LinkedEvents

IDComponente

Devuelve una lista de eventos


para los que este componente
tiene enlaces de accin.

Name

IDComponente

Devuelve el nombre del


componente tal como se muestra
en la vista de rbol y en el
cuaderno de configuracin.

OpenDesignWindow IDComponente [1]

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.

OpenPart

IDComponente

Abre el cuaderno de
configuracin del componente o,
si el componente es un marco,
abre la ventana de diseo
correspondiente al componente.

OpenSettings

IDComponente

Abre el cuaderno de
configuracin del componente.

Captulo 25. Creacin de conectores

387

Tabla 15. Destino: Componente (continuacin)

388

SetColor
IDComponente
Ver Nota ms abajo colorArea
useDefault
redMix
greenMix
blueMix

Define el color del rea


especificada. Consulte GetColor
para obtener ms informacin
acerca de los valores permitidos
para cada parmetro.

SetCursored

IDComponente

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

partId dataType dataLength


decimalPlaces

SetFileName

IDComponente
nombreArchivoNuevo

Define el nombre de archivo para


este componente. No tiene
ningn efecto si el componente
no soporta archivos.

SetFont

partId fontArea setToDefault


pointSize styles faceName

Define el font del componente.

SetLabel

IDComponente etiquetaNueva

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.

SetName

IdComponente nombreNuevo

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.

SetRect

IDComponente x y ancho alto

Define las coordenadas (x y


ancho alto) del componente con
relacin a su padre.

Programacin con VisualAge RPG

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.

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.

SetStyles

IDComponente estilos
estilosAmpliados [0|1]

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.

Styles

IDComponente [0|1]

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.

Zoom

IDComponente [0|1]

Ampla la vista de rbol y se


desplaza al componente
indicado. Si se especifica un 1,
tambin se activa la vista de
rbol.

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

Parmetro(s)

Significado/Valor de retorno

DeleteActionSub

nombreRutina

Suprime la subrutina de accin


con el nombre especificado.

DeleteUserSub

nombreRutina

Suprime la subrutina de usuario


con el nombre especificado.

UserSubroutine

nombreRutina

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.

UserSubroutines

ninguno

Devuelve una lista de las


subrutinas de usuario.

Tabla 17. Destino: Cuadrcula


Mandato

Parmetro(s)

Significado/Valor de retorno

IsOn

ninguno

Devuelve un 1 si la cuadrcula
est activada y un 0 si est
desactivada.

TurnOn

[0|1]

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

Tabla 18. Destino: Lpex


Mandato

Parmetro(s)

Significado/Valor de retorno

DoIt

Cualquier_mandato_LPEX

Pasa los parmetros a DoIt de


LPEX.

IsSourceFileOpen

ninguno

Devuelve un 1 para indicar que


el archivo fuente est abierto; en
caso contrario, devuelve un 0.

OpenSourceFile

ninguno

Abre el archivo fuente en LPEX.

Query

Cualquier_consulta_LPEX

Pasa los parmetros a Query de


LPEX.

Tabla 19. Destino: Conector

390

Mandato

Parmetro(s)

Significado/Valor de retorno

AddPlugin

nombreArchivo

Intenta aadir el conector


especificado. Devuelve 0 si el
resultado es satisfactorio.

Programacin con VisualAge RPG

Tabla 19. Destino: Conector (continuacin)


get

InvokePlugin

nmeroConectores

Devuelve el nmero de
conectores instalados.

conector ndiceBasadoUno

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.

conectores

Devuelve una lista de las vas de


acceso completas de todos los
conectores.

ndiceBasadoUno destino
mandato parmetros

Invoca el conector utilizando una


interfaz destino/mandato.

Tabla 20. Destino: Registro


Mandato

Parmetro(s)

Significado/Valor de retorno

DeleteKey

clave

Este mandato suprimir la clave


especificada del registro
(incluidas las subclaves).

Get

clave [valorOmisin]

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.

GetRect

clave [x y ancho alto]

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.

Set

clave valor

Utilice este mandato para definir


el valor de una serie en el
registro. No hay valor de retorno.

SetRect

clave x y ancho alto

Este mandato almacenar el


rectngulo especificado en el
registro utilizando coordenadas
normalizadas. Las comillas
dobles son necesarias.

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

392

Mandato

Parmetro(s)

Significado/Valor de retorno

GetHandle

ninguno

Devuelve el HANDLE de
Windows de la ventana
especificada.

GetIWindowPointer

ninguno

Devuelve el puntero de IWindow


de la ventana especificada.

MoveSizeTo

X Y ancho alto

Define el tamao y la posicin de


la ventana.

MoveTo

XY

Desplaza la ventana a la posicin


(X, Y).

Position

ninguno

Devuelve la posicin de la
ventana en la forma X, Y.

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

SetFocus

ninguno

Activa la ventana indicada.

SetSize

ancho alto

Define el tamao de la ventana.

ShowSetFocus

ninguno

Muestra la ventana (en caso de


que no est visible) y la activa.

Size

ninguno

Devuelve el tamao de la
ventana en la forma X, Y.

NotifyOnClose

Handle de ventana

Especifica la ventana a la que


debe notificarse que se cierra el
Diseador GUI.

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

'*Component'
'*Component'

Eval
Setatr
Getatr

Cmd='Project Get ProjectTitle'


Cmd
'PlugCmd'
'PlugResult' Title

C
C
C

'*Component'
'*Component'

Eval
Setatr
Getatr

Cmd='Project Get ProjectFileName'


Cmd
'PlugCmd'
'PlugResult' Folder

Write

'Main'

ENDACT

*
*

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

Formato

Descripcin

nombrearchivo.CLASS

Binario

El directorio de tiempo de ejecucin


contiene el archivo nombrearchivo.CLASS,
que se crea cuando se compila un proyecto
para Java.

nombrearchivo.DLL

Binario

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.

nombrearchivo.EVT

ASCII

El directorio fuente de la aplicacin


contiene el archivo nombrearchivo.EVT, que
contiene errores de retorno del compilador.

nombrearchivo.EXE

Binario

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.

nombrearchivo.HLP

Binario

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.

nombrearchivo.HTM

ASCII

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.

nombrearchivo_applet.HTM

ASCII

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.

nombrearchivo.IPF

ASCII

El directorio fuente de la aplicacin


contiene el archivo nombrearchivo.IPF, que
contiene toda la informacin de control
necesaria para crear ayuda en lnea.

Copyright IBM Corp. 1994, 2000

413

Tabla 22. Archivos de aplicacin (continuacin)


Nombre de archivo

Formato

Descripcin

nombrearchivo.IPM

ASCII

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.

nombrearchivo.JAVA

ASCII

El directorio fuente de la aplicacin


contiene el archivo nombrearchivo.JAVA,
que contiene la fuente Java generada como
resultado de una compilacin de Java.

nombrearchivo.LIB

Binario

El archivo nombrearchivo.LIB contiene


todos los procedimientos exportados que
forman parte de un nombrearchivo.DLL del
programa de utilidad.

nombrearchivo.LST

ASCII

El directorio fuente de la aplicacin


contiene el archivo nombrearchivo.LST, que
contiene el listado de compilacin.

nombrearchivo.ODF

Binario o
ASCII

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.

nombrearchivo.ODX

ASCII

El directorio fuente contiene el archivo


nombrearchivo.ODX, que se crea mediante
nombrearchivo.ODF y se utiliza en tiempo
de ejecucin.

nombarchRecursos.propiedades ASCII

414

Programacin con VisualAge RPG

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.

Tabla 22. Archivos de aplicacin (continuacin)


Nombre de archivo

Formato

Descripcin

nombrearchivo.RST

ASCII

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.

nombrearchivo.TXC

ASCII

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.

nombrearchivo.TXM

ASCII

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.

nombrearchivo.VCX

Binario

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.

nombrearchivo.VPF

ASCII

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

Apndice A. Archivos de aplicacin

415

Tabla 22. Archivos de aplicacin (continuacin)

416

Nombre de archivo

Formato

Descripcin

nombrearchivo.VPG

ASCII

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.

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

Programa
cliente

Cliente
AS/400

Rellenar subarchivo

Subarchivo

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

e ds

eof
nrecords
fileend
getrec

s
s
s
c

counter
custelem

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

PSBmore

counter

begact
call
parm
parm
parm
parm
eval
dow
occur
write
eval
enddo
eval

C
C
C
C
C

if
eval

endact

eval
endif

PRESS
GETREC

win1
cust
custelem
eof
nrecords

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

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

count

count

plist
parm
parm
parm
parm
eval
occur
read
dow
eval
occur
read
enddo
if

cust
custelem
eof
count

count=1
cust
customer
count<custelem and not *in99
count=count+1
cust
customer

9999

9999

*IN99

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

Subarchivo

Cliente
AS/400

Cola de datos O

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

Cola de datos I

Recibiendo
peticiones
Recibiendo
datos

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

Programa
cliente

rellenando
subarchivo
con datos

Subarchivo

Recibiendo datos

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.

428

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

C*
C*
C*
C*
C
C
C
C
C
C*
C
C
C
C
C
C
C*
C*
C
C
C*

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

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

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

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

count

*
*

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

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

Genera un listado de salida

/LI

Sangrado

/LX

Genera un listado de referencias cruzadas (XREF)

/LV

Genera un listado de referencias cruzadas visual (XREF)

/LD

Expande DDS en listado

/LC

Expande /COPY en listado

/LE

Muestra referencias externas

/LM2

Muestra mensajes de segundo nivel en el listado

/LS

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

Renueva la antememoria en el sistema principal

/RF

Corrije valores numricos

/RN

Permite valor nulo

/RNU Permite valor nulo bajo control del usuario


/RT

Trunca valores numricos

/TI

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

Bloqueo de registro de SQL

/SU

ID de usuario de base de datos

/SUP

Contrasea de base de datos

/SVC

Carcter de variable de conversin

/SVG

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

DEFINE_FILE

SERVER_ALIAS_NAME(MYAS400)
REMOTE_LOCATION_NAME(TORAS40Z)
NETWORK_PROTOCOL(*TCP)
TEXT(Development - RST)

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

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

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

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

454

Programacin con VisualAge RPG

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

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

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

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

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

456

Programacin con VisualAge RPG

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

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

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

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

458

Programacin con VisualAge RPG

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

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

LL
llamada a programas locales
funciones locales 256
funciones sin parmetros
obligatorios 257

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

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

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

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

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

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

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

460

Programacin con VisualAge RPG

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

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

IBM

Nmero de Programa: 5769-CL3

Printed in Denmark by IBM Danmark A/S

SC10-3067-04

You might also like