648
AS/400e VisualAge ® RPG Manual de consulta del lenguaje Versión 4.5.1 para Windows ® SC10-3066-03 IBM

RPG Referencia

Embed Size (px)

Citation preview

Page 1: RPG Referencia

AS/400e™

VisualAge® RPGManual de consulta del lenguajeVersión 4.5.1 para Windows®

SC10-3066-03

IBM

Page 2: RPG Referencia
Page 3: RPG Referencia

AS/400e™

VisualAge® RPGManual de consulta del lenguajeVersión 4.5.1 para Windows®

SC10-3066-03

IBM

Page 4: RPG Referencia

¡Nota!Antes de utilizar esta información y el producto al que hace referencia, asegúrese de leer la información general en “Avisos”en la página 611.

Cuarta edición (Abril 2000)

Esta edición corresponde a la Versión 4, Release 5, Nivel de modificación 1, de IBM WebSphere Development Toolspara AS/400 (Programa 5769-CL3) y a todos los releases y modificaciones posteriores hasta que no se indique locontrario en nuevas ediciones.

Esta edición sustituye a la publicación SC10-3066-02.

Los cambios o las adiciones al texto o a las ilustraciones están indicados con una línea vertical a la izquierda delcambio o la adición.

Solicite las publicaciones a través de su representante de IBM o la sucursal de IBM que atiende a su localidad. Laspublicaciones no están almacenadas en la dirección que se proporciona más abajo.

IBM agradece sus comentarios. Puede dirigir sus comentarios a:

IBM, S.A.National Language Solutions CenterAvda. Diagonal, 57108029 BarcelonaEspaña

También puede enviar sus comentarios por fax:

Desde España: (93) 321 61 34Desde otros países: 34 3 321 61 34

Si tiene acceso a Internet, puede enviar sus comentarios electrónicamente a: [email protected]. Consulte elapartado “Cómo enviar comentarios” en la página xiii para obtener una descripción de los métodos.

Cuando envía información a IBM, otorga a IBM un derecho no exclusivo de utilizar o distribuir la información decualquier manera que considere adecuada, sin incurrir en ninguna obligación hacia usted.

© Copyright International Business Machines Corporation 1994, 2000. Reservados todos los derechos.

Page 5: RPG Referencia

Contenido

Acerca de este manual . . . . . . . . xiRequisitos previos e información relacionada . . . xiLa biblioteca VisualAge RPG . . . . . . . . xiiCómo enviar comentarios . . . . . . . . . xiiiAcceso a información en línea . . . . . . . . xiii

Utilización de los manuales en línea . . . . . xiiiPublicaciones en formato PDF . . . . . . . xivUtilización de la ayuda en línea . . . . . . xiv

Novedades de este release . . . . . xvii

Parte 1. Introducción al lenguaje deVisualAge RPG . . . . . . . . . . . 1

Capítulo 1. Nombres simbólicos ypalabras reservadas . . . . . . . . . 3Nombres simbólicos . . . . . . . . . . . . 3Palabras con funciones especiales y palabrasreservadas . . . . . . . . . . . . . . . 4

Palabras especiales de funciones incorporadas . . 4Palabras especiales de fecha y hora . . . . . . 4Expresiones. . . . . . . . . . . . . . 5Palabras especiales de posición de archivo . . . 5Literales implícitos . . . . . . . . . . . 5Palabras reservadas de indicadores . . . . . . 5Palabras reservadas de fecha de trabajos . . . . 5Palabras reservadas de numeración de páginas . . 6Palabras especiales de transferencia de parámetros 6Colocación de campos . . . . . . . . . . 6Grabación de todos los campos . . . . . . . 6

Posición de archivo . . . . . . . . . . . . 6Palabras reservadas PAGE, PAGE1-PAGE7 . . . . 6Palabras especiales de fecha de usuario . . . . . 7

Capítulo 2. Directivas del compilador . . 9/COPY (Posiciones 7-11) . . . . . . . . . . 9

Copia de archivos de un servidor AS/400 . . . 9Copia de archivos de una estación de trabajo . . 10Directiva /COPY jerarquizada . . . . . . . 10

Directivas de compilación condicionales . . . . . 11Definición de condiciones. . . . . . . . . 11Expresiones condicionales . . . . . . . . 12Comprobación de condiciones . . . . . . . 12

La directiva /EOF . . . . . . . . . . . . 13/EOF (Posiciones 7-10) . . . . . . . . . 14

/EJECT (Posiciones 7-12) . . . . . . . . . . 14/SPACE (Posiciones 7-12). . . . . . . . . . 14/TITLE (Posiciones 7-12) . . . . . . . . . . 15

Capítulo 3. Indicadores . . . . . . . . 17Indicadores definidos en las especificaciones . . . 17

Indicadores de identificación de registro . . . . 17Indicadores de campo . . . . . . . . . . 18

Indicadores resultantes . . . . . . . . . 19Indicador de último registro (LR) . . . . . . 21

Utilización de indicadores . . . . . . . . . 21Indicadores de relación de registros de campos 21Indicadores para el condicionamiento de cálculos 22Indicadores utilizados en expresiones. . . . . 24Indicadores de condicionamiento de salida . . . 24

Indicadores referidos como datos . . . . . . . 25*IN . . . . . . . . . . . . . . . . 25*INxx . . . . . . . . . . . . . . . 25Reglas para la especificación de indicadoresreferidos como datos . . . . . . . . . . 25

Resumen de indicadores . . . . . . . . . . 27

Capítulo 4. Trabajar con componenteslógicos . . . . . . . . . . . . . . . 29Iniciar y detener componentes lógicos . . . . . 29Inicializar componentes lógicos . . . . . . . . 29Terminar componentes lógicos . . . . . . . . 30

Terminación normal . . . . . . . . . . 30Terminación anormal . . . . . . . . . . 32

Inicializar, terminar y restricciones de manejo deeventos . . . . . . . . . . . . . . . . 32

Capítulo 5. Manejo de excepciones yerrores . . . . . . . . . . . . . . . 37Excepciones/errores de archivo. . . . . . . . 37

Estructura de datos de información de archivo . 37Excepciones y errores de programa . . . . . . 48

Estructura de datos de estado de programa. . . 48Códigos de estado de programa . . . . . . 51Subrutina de excepción y error de programa . . 54

Excepciones/errores de componente lógico . . . . 55Códigos de estado de componente lógico . . . 55Manejo de errores de evento. . . . . . . . 56Manejo de excepciones . . . . . . . . . 58

Capítulo 6. Subprocedimientos yprototipos . . . . . . . . . . . . . 59Definición de subprocedimiento . . . . . . . 59

Definición de interfaz de procedimiento . . . . 61Valores de retorno . . . . . . . . . . . 61Ámbito de definiciones . . . . . . . . . 62Cálculos de subprocedimiento . . . . . . . 63

Módulo NOMAIN . . . . . . . . . . . . 65Módulo EXE . . . . . . . . . . . . . . 66Subprocedimientos y subrutinas . . . . . . . 66Prototipos y parámetros . . . . . . . . . . 67

Prototipos . . . . . . . . . . . . . . 67Parámetros con prototipo . . . . . . . . . 68Interfaz de procedimiento . . . . . . . . 70

Capítulo 7. Soporte SQL . . . . . . . 71Reglas sintácticas generales . . . . . . . . . 71

© Copyright IBM Corp. 1994, 2000 iii

Page 6: RPG Referencia

Declaraciones de variables del lenguaje principal 72Reglas de las variables del lenguaje principal . . 73Estructuras de datos como variables del lenguajeprincipal . . . . . . . . . . . . . . 74Variables de indicador y estructuras . . . . . 74Reglas de la estructura del lenguaje principal . . 75Sentencia /EXEC SQL INCLUDE . . . . . . 75Sentencia /EXEC SQL INCLUDE SQLCA . . . 75Sentencia /EXEC SQL WHENEVER . . . . . 76Sentencia /EXEC SQL BEGIN DECLARE . . . 77Manejo de errores durante la ejecución . . . . 78

Construcción de una aplicación. . . . . . . . 78Ejecución de una aplicación . . . . . . . . . 78Conexión a una base de datos . . . . . . . . 79

Utilización de la sentencia CONNECT TO . . . 79Utilización de una conexión implícita. . . . . 80

Capítulo 8. Consideraciones sobrearchivos . . . . . . . . . . . . . . 81Archivos de disco . . . . . . . . . . . . 81

Archivos locales . . . . . . . . . . . . 81Archivos de AS/400 . . . . . . . . . . 81

Archivos de impresora . . . . . . . . . . 87Archivos especiales . . . . . . . . . . . . 87

Parte 2. Datos . . . . . . . . . . . 93

Capítulo 9. Tipos de datos y formatosde datos . . . . . . . . . . . . . . 95Formatos internos y externos . . . . . . . . 95

Formato interno . . . . . . . . . . . . 96Formato externo . . . . . . . . . . . . 96

Tipo de datos puntero de base . . . . . . . . 98Establecimiento de un puntero de base . . . . . 99Ejemplos . . . . . . . . . . . . . . . 99Tipo de datos carácter . . . . . . . . . . 102

Formato carácter . . . . . . . . . . . 103Formato indicador. . . . . . . . . . . 103Formato gráfico . . . . . . . . . . . 104Formato UCS-2 . . . . . . . . . . . . 105Formato carácter, gráfico y UCS-2 de longitudvariable . . . . . . . . . . . . . . 105Conversión entre datos de tipo carácter, gráficoy UCS-2 . . . . . . . . . . . . . . 111

Datos de fecha . . . . . . . . . . . . . 112Separadores . . . . . . . . . . . . . 114Formatos para operaciones MOVE, MOVEL yTEST . . . . . . . . . . . . . . . 114

Tipo de datos numérico . . . . . . . . . . 114Formato binario . . . . . . . . . . . 115Formato flotante . . . . . . . . . . . 117Formato entero . . . . . . . . . . . . 118Formato decimal empaquetado . . . . . . 119Formato sin signo . . . . . . . . . . . 120Formato decimal con zona . . . . . . . . 121Consideraciones para utilizar formatosnuméricos . . . . . . . . . . . . . 122Representación de formatos numéricos . . . . 123

Tipo de datos puntero de procedimiento . . . . 125Datos de hora . . . . . . . . . . . . . 126

Separadores . . . . . . . . . . . . . 128Datos de indicación de la hora . . . . . . . 128

Separadores . . . . . . . . . . . . . 128Soporte de valores nulos de base de datos. . . . 128

Soporte controlado por el usuario para camposcon posibilidad de nulos y campos de clave . . 129Soporte de sólo entrada para campos conposibilidad de nulos . . . . . . . . . . 133Opción de campos sin nulos . . . . . . . 134

Conversión de campos de base de datos delongitud variable . . . . . . . . . . . . 134

Capítulo 10. Literales y constantescon nombre . . . . . . . . . . . . 139Literales . . . . . . . . . . . . . . . 139

Literales de caracteres . . . . . . . . . 139Literales hexadecimales . . . . . . . . . 139Literales numéricos . . . . . . . . . . 140Literales de fecha . . . . . . . . . . . 141Literales de hora . . . . . . . . . . . 141Literales de indicación de la hora. . . . . . 141Literales de gráficos . . . . . . . . . . 141Literales UCS-2 . . . . . . . . . . . . 141Constantes con nombre . . . . . . . . . 141

Constantes con nombre . . . . . . . . . . 142Reglas para constantes con nombre . . . . . 142

Constantes figurativas . . . . . . . . . . 142Reglas para constantes figurativas . . . . . 144

Capítulo 11. Estructuras de datos. . . 147Definición de subcampos de estructura de datos 148

Especificación de la longitud de subcampo . . 148Alineación de los subcampos de la estructura dedatos . . . . . . . . . . . . . . . 148

Estructura de datos de área de datos . . . . . 149Estructura de datos de información de archivo . . 150Estructura de datos de estado de programa . . . 150Ejemplos de estructura de datos . . . . . . . 150

Capítulo 12. Utilización de matrices ytablas . . . . . . . . . . . . . . . 157Matrices . . . . . . . . . . . . . . . 157

Nombre e índice de una matriz . . . . . . 158Especificaciones esenciales de una matriz . . . 158Codificación de una matriz de tiempo deejecución . . . . . . . . . . . . . . 158Carga de una matriz de tiempo de ejecución 159Codificación de una matriz de tiempo decompilación . . . . . . . . . . . . . 160Carga de una matriz de tiempo de compilación 161Codificación de una matriz de tiempo depreejecución . . . . . . . . . . . . . 162Carga de una matriz de preejecución . . . . 163Comprobación de secuencia para las matrices decaracteres. . . . . . . . . . . . . . 163

Inicialización de matrices . . . . . . . . . 164Matrices de tiempo de compilación y de tiempode preejecución. . . . . . . . . . . . 164

Definición de matrices relacionadas . . . . . . 164Búsqueda de matrices . . . . . . . . . . 166

iv VisualAge RPG Consulta del lenguaje

Page 7: RPG Referencia

Búsqueda en una matriz sin un índice . . . . 166Búsqueda en una matriz con un índice . . . . 167

Utilización de matrices . . . . . . . . . . 168Especificación de una matriz en los cálculos . . 168

Clasificación de matrices . . . . . . . . . 169Clasificación utilizando parte de la matriz comouna clave . . . . . . . . . . . . . . 169

Salida de matriz . . . . . . . . . . . . 170Edición de toda una matriz. . . . . . . . 170

Tablas . . . . . . . . . . . . . . . . 171LOOKUP con una tabla . . . . . . . . . 171LOOKUP con dos tablas. . . . . . . . . 171Especificación del elemento de tabla encontradoen una operación LOOKUP. . . . . . . . 172

Capítulo 13. Edición de camposnuméricos . . . . . . . . . . . . . 173Códigos de edición . . . . . . . . . . . 173

Códigos de edición simples. . . . . . . . 174Códigos de edición de combinación . . . . . 174Consideraciones de edición . . . . . . . . 175Resumen de códigos de edición . . . . . . 176

Palabras de edición . . . . . . . . . . . 179Cómo codificar una palabra de edición . . . . 179Partes de una palabra de edición . . . . . . 180Resumen de reglas de codificación para palabrasde edición . . . . . . . . . . . . . 185

Edición de archivos descritos externamente . . . 185

Capítulo 14. Inicialización de los datos 187Subrutina de inicialización (*INZSR). . . . . . 187Códigos de operación CLEAR y RESET . . . . 187Inicialización de datos . . . . . . . . . . 187

Parte 3. Especificaciones . . . . . 189

Capítulo 15. Acerca de lasespecificaciones VisualAge RPG . . . 191Especificaciones de subprocedimiento . . . . . 193Datos de programa . . . . . . . . . . . 193Entradas comunes . . . . . . . . . . . . 194

Sintaxis de las palabras clave . . . . . . . 194Reglas de continuación . . . . . . . . . 195

Capítulo 16. Especificaciones decontrol . . . . . . . . . . . . . . 201Sentencia de especificación de control . . . . . 201

Posición 6 (Tipo de formulario) . . . . . . 201Posiciones 7-80 (Palabras clave) . . . . . . 201Sintaxis de las palabras clave . . . . . . . 201ALWNULL(*NO | *INPUTONLY | *USRCTL) 202CACHE(*YES | *NO) . . . . . . . . . 203CACHEREFRESH(*YES | *NO) . . . . . . 203CCSID(*GRAPH : parámetro | *UCS2 : número) 203COPYNEST(número) . . . . . . . . . . 204COPYRIGHT(’serie de copyright’) . . . . . 204CURSYM(’sim’) . . . . . . . . . . . 204CVTOEM(*YES | *NO) . . . . . . . . . 204

CVTOPT(*{NO}VARCHAR*{NO}VARGRAPHIC). . . . . . . . . . 204DATEDIT(fmt{separador}) . . . . . . . . 205DATFMT(fmt{separador}) . . . . . . . . 205DEBUG{(*NO | *YES)} . . . . . . . . . 205DECEDIT(’valor’) . . . . . . . . . . . 206EXE . . . . . . . . . . . . . . . 206EXPROPTS(*MAXDIGITS | *RESDECPOS) . . 206EXTBININT{(*NO | *YES)} . . . . . . . . 206FLTDIV{(*NO | *YES)} . . . . . . . . . 207GENLVL(número) . . . . . . . . . . . 207INDENT(*NONE | ’valor-carácter’) . . . . . 207INTPREC(10 | 20) . . . . . . . . . . . 208LIBLIST(’archivo1 archivo2 ... archivon’) . . . 208NOMAIN . . . . . . . . . . . . . 208OPTION(*{NO}XREF *{NO}GEN *{NO}SECLVL*{NO}SHOWCPY *{NO}EXPDDS *{NO}EXT*{NO}SHOWSKP) . . . . . . . . . . . 208SQLBINDFILE(’archivo’) . . . . . . . . 209SQLDBBLOCKING(*YES | *NO) . . . . . . 210SQLDBNAME(’base de datos’) . . . . . . 210SQLDTFMT(*EUR | *ISO | *USA | *JIS) . . . 210SQLISOLATIONLVL(*RR | *CS | *UR) . . . . 211SQLPACKAGENAME(’paquete.txt’) . . . . . 211SQLPASSWORD(’contraseña’) . . . . . . . 211SQLUSERID(’ID de usuario’) . . . . . . . 212TIMFMT(fmt{separador}) . . . . . . . . 212TRUNCNBR(*YES | *NO) . . . . . . . . 212

Capítulo 17. Especificaciones dedescripción de archivo . . . . . . . 213Sentencia de especificación de descripción dearchivo . . . . . . . . . . . . . . . 213

Línea de continuación de palabras clave dedescripción de archivo . . . . . . . . . 213Posición 6 (Tipo de formulario) . . . . . . 214Posiciones 7-16 (Nombre de archivo) . . . . 214Posición 17 (Tipo de archivo) . . . . . . . 214Posición 18 (Designación de archivo) . . . . 215Posición 19 (Reservada) . . . . . . . . . 216Posición 20 (Adición de archivo) . . . . . . 216Posición 21 (Reservada) . . . . . . . . . 217Posición 22 (Formato de archivo) . . . . . . 217Posiciones 23-27 (Longitud de registro) . . . . 217Posición 28 (Reservada) . . . . . . . . . 217Posiciones 29-33 (Reservadas) . . . . . . . 217Posición 34 (Tipo de dirección de registro). . . 217Posición 35 (Reservada) . . . . . . . . . 218Posiciones 36-42 (Dispositivo) . . . . . . . 218Posición 43 (Reservada) . . . . . . . . . 219

Posiciones 44-80 (Palabras clave) . . . . . . . 219BLOCK(*YES|*NO) . . . . . . . . . . 220COMMIT{(rpg_nombre)} . . . . . . . . 221DATFMT(formato{separador}) . . . . . . . 221EXTFILE(nombrearchivo) . . . . . . . . 221FORMLEN(número) . . . . . . . . . . 222IGNORE(formatoreg{:formatoreg...}) . . . . . 222INCLUDE(formatoreg{:formatoreg...}) . . . . 222INFDS(nombreDS). . . . . . . . . . . 222INFSR(nombreSUBR) . . . . . . . . . . 222PLIST(nombre_Plist) . . . . . . . . . . 222

Contenido v

Page 8: RPG Referencia

PREFIX(serie_prefijo{:núm_de_car_sustit}) . . . 223PROCNAME(nombre_procedimiento) . . . . 223PRTCTL(estruct_datos{:*COMPAT}) . . . . . 223RCDLEN(nombre de campo) . . . . . . . 224RECNO(nombre de campo) . . . . . . . 225REMOTE . . . . . . . . . . . . . . 225RENAME(formato_externo:formato_interno) . . 225TIMFMT(formato{separador}) . . . . . . . 225USROPN . . . . . . . . . . . . . . 226

Tipos de archivo y métodos de proceso. . . . . 226

Capítulo 18. Especificaciones dedefinición . . . . . . . . . . . . . 227Ubicación de definiciones y ámbito . . . . . . 228

Almacenamiento de definiciones . . . . . . 230Sentencia de especificación de definición . . . . 230

Línea de continuación de palabras clave deespecificación de definición. . . . . . . . 230Línea de nombre continuado de especificaciónde definición . . . . . . . . . . . . 231Posición 6 (Tipo de formulario) . . . . . . 231Posiciones 7-21 (Nombre) . . . . . . . . 231Posición 22 (Descripción externa) . . . . . . 232Posición 23 (Tipo de estructura de datos) . . . 233Posiciones 24-25 (Tipo de definición) . . . . 233Posiciones 26-32 (Desde posición) . . . . . 234Posiciones 33-39 (Hasta posición/Longitud) . . 234Posición 40 (Tipo de datos internos) . . . . . 235Posiciones 41-42 (Posiciones decimales). . . . 236Posición 43 (Reservada) . . . . . . . . . 236Posiciones 44-80 (Palabras clave) . . . . . . 237

Palabras clave de especificación de definición . . 237ALIGN . . . . . . . . . . . . . . 237ALT(nombre_matriz) . . . . . . . . . . 238ASCEND . . . . . . . . . . . . . . 238BASED(nombre_puntero_de base) . . . . . 238BUTTON(botón1:botón2....) . . . . . . . . 239CCSID(número | *DFT) . . . . . . . . . 239CLASS(*JAVA:nombre_clase) . . . . . . . 239CLTPGM(nombre de programa) . . . . . . 240CONST(constante). . . . . . . . . . . 240CTDATA . . . . . . . . . . . . . . 241DATFMT(formato{separador}) . . . . . . . 241DESCEND . . . . . . . . . . . . . 241DIM(constante_numérica) . . . . . . . . 242DLL(nombre) . . . . . . . . . . . . 242DTAARA{(nombre_área_datos)} . . . . . . 242EXTFLD(nombre_campo) . . . . . . . . 243EXTFMT(código) . . . . . . . . . . . 243EXTNAME(nombre_archivo{:nombre_formato}) 244EXTPROC(nombre) . . . . . . . . . . 244FROMFILE(nombre_archivo) . . . . . . . 247INZ{(valor inicial)} . . . . . . . . . . 247LIKE(nombre_RPG) . . . . . . . . . . 248LINKAGE(tipo_enlace) . . . . . . . . . 249MSGDATA(msgdata1:msgdata2....) . . . . . 250MSGNBR(*MSGnnnn o nombre de campo) . . 250MSGTEXT(’texto mensaje’) . . . . . . . . 250MSGTITLE(’título’) . . . . . . . . . . 250NOOPT . . . . . . . . . . . . . . 251NOWAIT . . . . . . . . . . . . . . 251

OCCURS(constante_numérica). . . . . . . 251OPTIONS(*OMIT *VARSIZE *STRING*RIGHTADJ). . . . . . . . . . . . . 252OVERLAY(nombre{:pos | *NEXT}) . . . . . 257PACKEVEN . . . . . . . . . . . . . 259PERRCD(constante_numérica) . . . . . . . 260PREFIX(serie_prefijo{:núm_de_car_sustit}) . . . 260PROCPTR . . . . . . . . . . . . . 260STATIC . . . . . . . . . . . . . . 260STYLE(tipo_estilo) . . . . . . . . . . . 261TIMFMT(formato{separador}) . . . . . . . 261TOFILE(nombre_archivo) . . . . . . . . 261VALUE . . . . . . . . . . . . . . 262VARYING . . . . . . . . . . . . . 262

Resumen según el tipo de especificación dedefinición . . . . . . . . . . . . . . 262

Capítulo 19. Especificaciones deentrada . . . . . . . . . . . . . . 267Sentencia de especificación de entrada . . . . . 267

Descrito por programa . . . . . . . . . 267Descrito externamente . . . . . . . . . 267

Archivos descritos por programa . . . . . . . 268Posición 6 (Tipo de formulario) . . . . . . 268

Entradas de identificación de registro . . . . . 268Posiciones 7-16 (Nombre de archivo) . . . . 268Posiciones 16-18 (Relación lógica). . . . . . 268Posiciones 17-18 (Secuencia) . . . . . . . 269Posición 19 (Reservada) . . . . . . . . . 269Posición 20 (Opción) . . . . . . . . . . 269Posiciones 21-22 (Indicador de identificación deregistro) . . . . . . . . . . . . . . 269Posiciones 23-46 (Códigos de identificación deregistro) . . . . . . . . . . . . . . 269

Entradas de descripción de campo . . . . . . 272Posición 6 (Tipo de formulario) . . . . . . 272Posiciones 7-30 (Reservado) . . . . . . . 272Posiciones 31-34 (Atributos de datos) . . . . 272Posición 35 (Separador fecha/hora) . . . . . 272Posición 36 (Formato de datos) . . . . . . 273Posiciones 37-46 (Ubicación de campo) . . . . 273Posiciones 47-48 (Posiciones decimales). . . . 274Posiciones 49-62 (Nombre de campo) . . . . 274Posiciones 63-64 (Reservadas) . . . . . . . 275Posiciones 65-66 (Reservadas) . . . . . . . 275Posiciones 67-68 (Relación de registro de campo) 275Posiciones 69-74 (Indicadores de campo) . . . 276

Archivos descritos externamente . . . . . . . 276Posición 6 (Tipo de formulario) . . . . . . 276

Entradas de identificación de registro . . . . . 276Posiciones 7-16 (Nombre de registro) . . . . 277Posiciones 17-20 (Reservadas) . . . . . . . 277Posiciones 21-22 (Indicador de identificación deregistro) . . . . . . . . . . . . . . 277Posiciones 23-80 (Reservadas) . . . . . . . 277

Entradas de descripción de campo . . . . . . 277Posiciones 7-20 (Reservadas) . . . . . . . 277Posiciones 21-30 (Nombre de campo externo) 277Posiciones 31-48 (Reservadas) . . . . . . . 278Posiciones 49-62 (Nombre de campo) . . . . 278Posiciones 63-64 (Reservadas) . . . . . . . 278

vi VisualAge RPG Consulta del lenguaje

Page 9: RPG Referencia

Posiciones 65-66 (Reservadas) . . . . . . . 278Posiciones 67-68 (Reservadas) . . . . . . . 278Posiciones 69-74 (Indicadores de campo) . . . 278Posiciones 75-80 (Reservadas) . . . . . . . 279

Capítulo 20. Especificaciones decálculo . . . . . . . . . . . . . . 281Sentencia de especificación de cálculo . . . . . 281Especificación de cálculo Factor 2 ampliado Líneade continuación . . . . . . . . . . . . 281

Posición 6 (Tipo de formulario) . . . . . . 282Posiciones 7-8 (Nivel de control) . . . . . . 282Posiciones 9-11 (Indicadores) . . . . . . . 282Posiciones 12-25 (Factor 1) . . . . . . . . 283Posiciones 26-35 (Operación y ampliador) . . . 283Posiciones 36-49 (Factor 2) . . . . . . . . 284Posiciones 50-63 (Campo del resultado). . . . 284Posiciones 64-68 (Longitud de campo) . . . . 285Posiciones 69-70 (Posiciones decimales). . . . 285Posiciones 71-76 (Indicadores resultantes) . . . 285

Sentencia de especificación del Cálculo del factor 2ampliado . . . . . . . . . . . . . . . 286

Posiciones 7-8 (Nivel de control) . . . . . . 286Posiciones 9-11 (Indicadores) . . . . . . . 286Posiciones 12-25 (Factor 1) . . . . . . . . 286Posiciones 26-35 (Operación y ampliador) . . . 286Posiciones 36-80 (Factor 2 ampliado) . . . . 287

Capítulo 21. Especificaciones desalida . . . . . . . . . . . . . . . 289Sentencia de especificación de salida . . . . . 289

Descrito por programa . . . . . . . . . 289Descrito externamente . . . . . . . . . 290

Archivos descritos por programa . . . . . . . 290Posición 6 (Tipo de formulario) . . . . . . 290

Identificación de registro y entradas de control . . 290Posiciones 7-16 (Nombre de archivo) . . . . 290Posiciones 16-18 (Relación lógica). . . . . . 291Posición 17 (Tipo - Archivo descrito porprograma) . . . . . . . . . . . . . 291Posiciones 18-20 (Adición/supresión de registro) 291Posiciones 21-29 (Indicadores ID de registro dearchivo) . . . . . . . . . . . . . . 291Posiciones 30-39 (Nombre EXCEPT) . . . . . 292Posiciones 40-51 (Espacio y saltar) . . . . . 293Posiciones 40-42 (Espacio antes) . . . . . . 293Posiciones 43-45 (Espacio después) . . . . . 293Posiciones 46-48 (Saltar antes) . . . . . . . 294Posiciones 49-51 (Saltar después) . . . . . . 294

Descripción de campo y entradas de control . . . 294Posiciones 21-29 (Indicadores de salida) . . . 294Posiciones 30-43 (Nombre de campo) . . . . 294Posición 44 (Códigos de edición) . . . . . . 296Posición 45 (Blanco después) . . . . . . . 296Posiciones 47-51 (Posición final) . . . . . . 296Posición 52 (Formato de datos) . . . . . . 297Posiciones 53-80 (Constante, Palabra de edición,Atributos de datos) . . . . . . . . . . 298

Archivos descritos externamente . . . . . . . 300Posición 6 (Tipo de formulario) . . . . . . 300

Identificación de registro y entradas de control . . 300Posiciones 7-16 (Nombre de registro) . . . . 300Posiciones 16-18 (Relación lógica externa) . . . 300Posición 17 (Tipo) . . . . . . . . . . . 300Posiciones 18-20 (Adición de registros) . . . . 301Posiciones 21-29 (Indicadores de salida) . . . 301Posiciones 30-39 (Nombre EXCEPT) . . . . . 301

Descripción de campo y entradas de control . . . 301Posiciones 21-29 (Indicadores de salida) . . . 301Posiciones 30-43 (Nombre de campo) . . . . 301Posición 45 (Blanco después) . . . . . . . 302

Capítulo 22. Especificaciones deprocedimiento . . . . . . . . . . . 303Sentencia de especificación de procedimiento. . . 303

Línea de continuación de palabra clave deespecificación de procedimiento . . . . . . 304Línea de nombre continuada de especificaciónde procedimiento . . . . . . . . . . . 304Posición 6 (Tipo de formulario) . . . . . . 304Posiciones 7-21 (Nombre) . . . . . . . . 305Posición 24 (Inicio/fin de procedimiento) . . . 305Posiciones 44-80 (Palabras clave) . . . . . . 305

Palabras clave de especificación de procedimiento 305EXPORT . . . . . . . . . . . . . . 305

Parte 4. Funciones incorporadas,Expresiones y Códigos deoperación . . . . . . . . . . . . 307

Capítulo 23. Funciones incorporadas 309Funciones incorporadas (por orden alfabético) . . 313

%ABS (Valor absoluto de la expresión) . . . . 313%ADDR (Obtener dirección de variable) . . . 314%CHAR (Convertir a datos de tipo carácter) 316%DEC (Convertir a formato decimalempaquetado) . . . . . . . . . . . . 317%DECH (Convertir a formato decimalempaquetado con redondeo) . . . . . . . 318%DECPOS (Obtener el número de posicionesdecimales) . . . . . . . . . . . . . 318%DIV (Devolver la porción entera del cociente) 319%EDITC (Editar valor utilizando un Editcode) 319%EDITFLT (Convertir en representación flotanteexterna) . . . . . . . . . . . . . . 321%EDITW (Editar valor utilizando una Palabrade edición) . . . . . . . . . . . . . 322%ELEM (Obtener número de elementos) . . . 322%EOF (Devolver condición de fin o principio dearchivo) . . . . . . . . . . . . . . 323%EQUAL (Devolver condición de coincidenciaexacta) . . . . . . . . . . . . . . 324%ERROR (Devolver condición de error) . . . 325%FLOAT (Convertir en formato flotante) . . . 325%FOUND (Devolver condición de encontrado) 326%GETATR (Recuperar atributo) . . . . . . 327%GRAPH (Convertir a valor gráfico) . . . . 328%INT (Convertir en formato de entero). . . . 329

Contenido vii

Page 10: RPG Referencia

%INTH (Convertir en formato de entero conredondeo) . . . . . . . . . . . . . 330%LEN (Obtener o establecer longitud) . . . . 330%NULLIND (Consultar o establecer indicadorde nulo) . . . . . . . . . . . . . . 332%OPEN (Devolver condición de apertura dearchivo) . . . . . . . . . . . . . . 333%PADDR (Obtener dirección de procedimiento) 333%REM (Devolver resto entero) . . . . . . 334%REPLACE (Sustituir serie de caracteres) . . . 335%SCAN (Explorar caracteres) . . . . . . . 337%SETATR (Establecer atributo) . . . . . . 337%SIZE (Tamaño de constante o campo). . . . 338%STATUS (Devolver estado de archivo o deprograma) . . . . . . . . . . . . . 339%STR (Obtener o almacenar serie conterminación de nulo) . . . . . . . . . . 341%SUBST (Devolver una serie) . . . . . . . 343%SUBST Utilizado para su valor . . . . . . 344%SUBST Utilizado como resultado de unaasignación . . . . . . . . . . . . . 344%TRIM (Eliminar blancos iniciales y de cola) 345%TRIML (Eliminar blancos iniciales). . . . . 345%TRIMR (Eliminar blancos de cola) . . . . . 346%UCS2 (Convertir a valor UCS-2) . . . . . 346%UNS (Convertir en formato sin signo) . . . 347%UNSH (Convertir en formato sin signo conredondeo) . . . . . . . . . . . . . 348%XFOOT (Sumar elementos de expresión dematriz) . . . . . . . . . . . . . . 348

Capítulo 24. Expresiones . . . . . . 351Operadores de expresión . . . . . . . . . 351

Prioridad de las operaciones . . . . . . . 352Operandos de expresión. . . . . . . . . . 353

Reglas de las expresiones . . . . . . . . 356Formato de los resultados numéricosintermedios . . . . . . . . . . . . . 357

Reglas de precisión para operaciones numéricas 358Utilización de la regla de precisión por omisión 359Precisión de los resultados intermedios . . . . 359Ejemplo de reglas de precisión por omisión . . 360Utilización de las Reglas de precisión de″Posición decimal de resultado″ . . . . . . 362Ejemplo de Reglas de precisión de ″Posicióndecimal de resultado″ . . . . . . . . . 363

Evaluación de circuito corto . . . . . . . . 364Orden de evaluación . . . . . . . . . . . 365

Capítulo 25. Códigos de operación 367Operaciones aritméticas . . . . . . . . . . 367

Consideraciones sobre el rendimiento . . . . 369Aritmética de enteros y sin signo . . . . . . 369

Operaciones de matrices. . . . . . . . . . 371Operaciones de bits . . . . . . . . . . . 371Operaciones de bifurcación . . . . . . . . . 372Operaciones de llamada . . . . . . . . . . 372

Llamadas con prototipo . . . . . . . . . 372Sintaxis de los nombres de los programas enuna llamada . . . . . . . . . . . . . 373

Operaciones de comparación . . . . . . . . 375Operaciones de área de datos . . . . . . . . 376Operaciones de fecha . . . . . . . . . . . 377

Adición o resta de fechas . . . . . . . . 378Cálculo de las duraciones entre fechas . . . . 378Resultados inesperados . . . . . . . . . 379

Operaciones declarativas . . . . . . . . . 379Operaciones que utilizan expresiones . . . . . 380Operaciones de archivos. . . . . . . . . . 380Operaciones de establecimiento de indicador . . . 382Operaciones de información . . . . . . . . 382Operaciones de inicialización . . . . . . . . 382Operaciones de gestión de memoria . . . . . . 382Operaciones de mensaje . . . . . . . . . . 384Operaciones Mover . . . . . . . . . . . 384

Cómo mover datos de tipo carácter, gráfico,UCS-2 y numérico . . . . . . . . . . . 384Cómo mover los datos de fecha y hora . . . . 386Ejemplos de conversión de un campo decaracteres en un campo de fecha . . . . . . 387

Operaciones de serie . . . . . . . . . . . 389Operaciones de programación estructuradas . . . 390Operaciones de subrutina . . . . . . . . . 391Operaciones de comprobación . . . . . . . . 392Operaciones de GUI . . . . . . . . . . . 392Los detalles de los códigos de operación . . . . 392

ADD (Añadir) . . . . . . . . . . . . 392ADDDUR (Añadir duración) . . . . . . . 393ALLOC (Asignar almacenamiento) . . . . . 395ANDxx (Y) . . . . . . . . . . . . . 396BEGACT (Empezar subrutina de acción) . . . 397BEGSR (Empezar subrutina de usuario) . . . 400BITOFF (Desactivar los bits) . . . . . . . 400BITON (Activar los bits) . . . . . . . . . 401CABxx (Comparar y bifurcar) . . . . . . . 402CALL (Llamar a un programa AS/400) . . . . 404CALLB (Llamar a una función) . . . . . . 407CALLP (Llamar a un procedimiento o programacon prototipo) . . . . . . . . . . . . 408CASxx (Invocar subrutina condicionalmente) 409CAT (Concatenar dos series) . . . . . . . 411CHAIN (Recuperación aleatoria desde unarchivo) . . . . . . . . . . . . . . 414CHECK (Comprobar caracteres) . . . . . . 417CHECKR (Comprobación inversa) . . . . . 419CLEAR (Borrar) . . . . . . . . . . . 422CLOSE (Cerrar archivos) . . . . . . . . 424CLSWIN (Cerrar ventana) . . . . . . . . 424COMMIT (Comprometer) . . . . . . . . 425COMP (Comparar) . . . . . . . . . . 426DEALLOC (Liberar almacenamiento) . . . . 426DEFINE (Definición de campo) . . . . . . 428DELETE (Suprimir registro) . . . . . . . 431DIV (Dividir) . . . . . . . . . . . . 432DO (Hacer) . . . . . . . . . . . . . 433DOU (Hacer hasta) . . . . . . . . . . 435DOUxx (Hacer hasta). . . . . . . . . . 436DOW (Hacer mientras) . . . . . . . . . 438DOWxx (Hacer mientras) . . . . . . . . 439DSPLY (Visualizar ventana de mensaje). . . . 441ELSE (En caso contrario) . . . . . . . . 442

viii VisualAge RPG Consulta del lenguaje

Page 11: RPG Referencia

ENDyy (Finalizar un grupo estructurado) . . . 443ENDACT (Fin de subrutina de acción) . . . . 444ENDSR (Fin de subrutina de usuario) . . . . 445EVAL (Evaluar expresión) . . . . . . . . 446EVALR (Evaluar expresión, ajuste por laderecha) . . . . . . . . . . . . . . 447EXCEPT (Salida en tiempo de cálculo) . . . . 448EXSR (Invocar subrutina de usuario) . . . . 449EXTRCT (Extraer fecha/hora/indicación de lahora) . . . . . . . . . . . . . . . 452FEOD (Forzar fin de datos) . . . . . . . . 453FOR (Para) . . . . . . . . . . . . . 453GETATR (Recuperar atributo) . . . . . . . 455GOTO (Ir a) . . . . . . . . . . . . . 457IF (Si) . . . . . . . . . . . . . . . 457IFxx (Si) . . . . . . . . . . . . . . 458IN (Recuperar un área de datos) . . . . . . 460ITER (Iterar). . . . . . . . . . . . . 461KFLD (Definir partes de una clave) . . . . . 462KLIST (Definir una clave compuesta) . . . . 463LEAVE (Abandonar un grupo DO/FOR) . . . 464LEAVESR (Abandonar una subrutina) . . . . 465LOOKUP (Buscar un elemento en tabla omatriz) . . . . . . . . . . . . . . 466MOVE (Mover). . . . . . . . . . . . 468MOVEA (Mover matriz) . . . . . . . . . 483MOVEL (Mover a la izquierda) . . . . . . 489MULT (Multiplicar) . . . . . . . . . . 497MVR (Mover resto) . . . . . . . . . . 498OCCUR (Establecer/Obtener aparición de unaestructura de datos) . . . . . . . . . . 499OPEN (Abrir archivo para proceso) . . . . . 502ORxx (O) . . . . . . . . . . . . . . 503OTHER (De lo contrario, seleccionar) . . . . 504OUT (Grabar un área de datos) . . . . . . 505PARM (Identificar parámetros) . . . . . . 506PLIST (Identificar una lista de parámetros) . . 508POST (Anotar) . . . . . . . . . . . . 509READ (Leer un registro). . . . . . . . . 510READC (Leer siguiente registro modificado) . . 513READE (Leer clave igual) . . . . . . . . 514READP (Leer registro anterior) . . . . . . 516READPE (Leer igual anterior) . . . . . . . 518READS (Leer seleccionados) . . . . . . . 520REALLOC (Reasignar almacenamiento conlongitud nueva) . . . . . . . . . . . 521RESET (Restablecer) . . . . . . . . . . 522RETURN (Volver al llamador) . . . . . . . 525ROLBK (Retrotraer) . . . . . . . . . . 526SCAN (Buscar serie) . . . . . . . . . . 527SELECT (Iniciar un grupo de selección) . . . 530SETATR (Establecer atributo) . . . . . . . 531SETGT (Establecer mayor que) . . . . . . 532SETLL (Establecer límite inferior) . . . . . . 534SETOFF (Desactivar indicador) . . . . . . 537SETON (Activar indicador) . . . . . . . . 537SHOWWIN (Visualizar ventana) . . . . . . 538SORTA (Clasificar una matriz) . . . . . . . 539SQRT (Raíz cuadrada) . . . . . . . . . 540START (Iniciar un componente lógico o Llamara programa local) . . . . . . . . . . . 541

STOP (Detener un componente lógico) . . . . 542SUB (Restar). . . . . . . . . . . . . 543SUBDUR (Restar duración) . . . . . . . . 543SUBST (Subserie) . . . . . . . . . . . 546TAG (Etiqueta) . . . . . . . . . . . . 548TEST (Comprobar fecha/hora/indicación de lahora) . . . . . . . . . . . . . . . 549TESTB (Comprobar bit) . . . . . . . . . 551TESTN (Comprobar numérico) . . . . . . 553TESTZ (Comprobar zona) . . . . . . . . 554TIME (Hora del día) . . . . . . . . . . 554UNLOCK (Desbloquear un área de datos oLiberar un registro) . . . . . . . . . . 556UPDATE (Modificar registro existente) . . . . 557WHEN (Seleccionar cuando sea verdadero) . . 558WHENxx (Seleccionar cuando sea verdadero) 559WRITE (Crear nuevos registros) . . . . . . 561XFOOT (Sumar los elementos de una matriz) 563XLATE (Convertir) . . . . . . . . . . 564Z-ADD (Poner a cero y sumar) . . . . . . 565Z-SUB (Poner a cero y restar) . . . . . . . 566

Parte 5. Apéndices . . . . . . . . 567

Apéndice A. Restricciones . . . . . . 569

Apéndice B. Resumen de códigos deoperación . . . . . . . . . . . . . 571

Apéndice C. Órdenes de clasificación 579Orden de clasificación EBCDIC . . . . . . . 579Orden de clasificación ASCII . . . . . . . . 582

Apéndice D. Valores CCSIDsoportados . . . . . . . . . . . . 585

Apéndice E. Comparación de loscompiladores RPG . . . . . . . . . 587Ciclo RPG . . . . . . . . . . . . . . 587

Indicadores de VisualAge RPG . . . . . . 587Indicadores no soportados . . . . . . . . 587

Palabras no soportadas . . . . . . . . . . 588Directivas del compilador . . . . . . . . . 588Manejo de excepciones y errores . . . . . . . 588Datos . . . . . . . . . . . . . . . . 588

Tipos de datos y formatos de datos . . . . . 588Literales y constantes con nombre . . . . . 589Áreas de datos . . . . . . . . . . . . 589Matrices y tablas . . . . . . . . . . . 590Códigos de edición . . . . . . . . . . 590

Archivos . . . . . . . . . . . . . . . 590Especificaciones . . . . . . . . . . . . 590

Especificaciones de control . . . . . . . . 590Especificaciones de descripción de archivo . . 591Especificaciones de definición . . . . . . . 593Especificaciones de entrada. . . . . . . . 594

Funciones incorporadas . . . . . . . . . . 594Códigos de operación . . . . . . . . . . 595

Códigos de operación similares . . . . . . 595

Contenido ix

||

Page 12: RPG Referencia

Códigos de operación no soportados . . . . 595Códigos de operación específicos de VisualAgeRPG . . . . . . . . . . . . . . . 595Conversiones entre CCSID . . . . . . . . 596

Glosario . . . . . . . . . . . . . 597

Bibliografía . . . . . . . . . . . . 609

Avisos . . . . . . . . . . . . . . 611Información de interfaz de programación . . . . 612Marcas registradas y marcas de servicio . . . . 612

Índice . . . . . . . . . . . . . . . 613

x VisualAge RPG Consulta del lenguaje

Page 13: RPG Referencia

Acerca de este manual

Esta publicación proporciona información acerca del lenguaje RPG IV tal como seimplementa utilizando el compilador VisualAge RPG con el sistema operativoWindows® 95, Windows 98 o Windows NT®.

Esta publicación contiene:v Conceptos básicos del lenguaje como el juego de caracteres, nombres simbólicos

y palabras reservadas, directivas del compilador e indicadoresv Tipos y formatos de datosv Manejo de errores y de excepcionesv Subprocedimientosv Especificacionesv Funciones incorporadas, expresiones y códigos de operación.

Este manual es para los programadores que estén familiarizados con el lenguaje deprogramación VisualAge RPG.

Este manual de consulta contiene una descripción detallada del lenguaje VisualAgeRPG. No contiene información sobre cómo utilizar el compilador de VisualAgeRPG o cómo convertir los programas ILE RPG en programas VisualAge RPG. Paraobtener más información sobre estos temas, consulte la publicaciones Iniciación aVisualAge RPG y CODE/400, SC10-3287-01 (SC09-2625-01) y Programación conVisualAge para RPG, SC10-3067-02 (SC09-2449-02).

Antes de utilizar este manual, deberá estar familiarizado con las tareas de unaaplicación VisualAge RPG. Consulte la publicación Iniciación a VisualAge RPG yCODE/400, SC10-3287-01 (SC09-2625-01).

Requisitos previos e información relacionadaPara buscar información técnica sobre AS/400, utilice AS/400 Information Centercomo punto de partida. A Information Center se puede acceder desde el CD-ROMAS/400e™ Information Center (versión en inglés: SK3T-1330-02 (SK3T-2027-03)) ydesde uno de los sitios Web siguientes:http://www.as400.ibm.com/infocenterhttp://publib.boulder.ibm.com/pubs/html/as400/infocenter.htm

AS/400 Information Center contiene información importante sobre temas talescomo las particiones lógicas, los clústers, Java™, TCP/IP, los servicios Web y lasredes seguras. También contiene enlaces con sitios Web de Internet como labiblioteca en línea de AS/400 y AS/400 Technical Studio. Asimismo, hay un enlaceen el que se describe a un alto nivel las diferencias en cuanto a informaciónexistentes entre Information Center y la biblioteca en línea.

Si desea obtener las publicaciones de AS/400 en formato de software, consulte elCD-ROM AS/400e Biblioteca en soporte software, SK3T-1325-04 (SK3T-0118-04).

© Copyright IBM Corp. 1994, 2000 xi

Page 14: RPG Referencia

La biblioteca VisualAge RPG

*Nota: Todas las versiones en línea de la publicaciones de WebSphereDevelopment Tools para AS/400 han sido actualizadas. Las publicacionescuyo título está marcado con un asterisco (*) no se han vuelto a imprimiren este release.

La biblioteca VisualAge RPG contiene las publicaciones siguientes:

*Iniciación a VisualAge RPG y CODE/400

Utilice esta publicación para familiarizarse con los conceptos y la interfaz deVisualAge RPG y como consulta de tareas al utilizar VisualAge RPG.

*Programación con VisualAge para RPG

Esta publicación contiene información específica acerca de la creación deaplicaciones con VisualAge RPG. Describe los pasos que debe seguir en cada fasedel ciclo de desarrollo de la aplicación, desde el diseño hasta el empaquetado y ladistribución. Se incluyen ejemplos de programación para clarificar los conceptos yel proceso de desarrollo de aplicaciones VisualAge RPG.

*VisualAge RPG Manual de consulta de componentes

Este manual proporciona información sobre los componentes, atributos decomponente, eventos de componente y atributos de evento de VisualAge RPG. Esun manual de consulta para todos aquellos que desarrollan aplicaciones conVisualAge RPG.

*VisualAge RPG Manual de consulta del lenguaje

Esta publicación proporciona información acerca del lenguaje RPG IV tal como seimplementa utilizando el compilador VisualAge RPG. Contiene:v Conceptos básicos del lenguaje como el juego de caracteres, nombres simbólicos

y palabras reservadas, directivas del compilador e indicadores.v Tipos y formatos de datosv Manejo de errores y de excepcionesv Especificacionesv Funciones incorporadas, expresiones y códigos de operación.

Para obtener una lista de las publicaciones relacionadadas, consulte el apartadoBibliografía que hay al final de este manual.

Guía de aprendizaje de VA RPG y CODE/400

Existe una guía de aprendizaje basada en HTML, que hallará en el URL siguiente:http://www.ibm.com/software/ad/varpg/download/#interactive

Esta guía de aprendizaje interactiva registra la evolución del usuario para podervolver fácilmente al último ejercicio realizado. Hay unas pruebas al final de cadalección que sirven de ayuda para comprobar los conocimientos adquiridos en launidad.

xii VisualAge RPG Consulta del lenguaje

Page 15: RPG Referencia

Nota: Para poder utilizar esta guía de aprendizaje, necesitará un navegador queadmita marcos, Java® y Javascript. También necesitará una herramienta deextracción de archivos, como WinZip, que pueda tratar nombres largos dearchivos.

También puede encontrar la información más reciente sobre VA RPG y CODE/400en la siguiente fuente en línea:

La página de presentación de VisualAge RPG y CODE/400http://www.ibm.com/software/ad/varpg/

Cómo enviar comentariosSus comentarios son muy importantes, pues nos permiten proporcionarinformación más precisa y de mayor calidad. IBM agradece sus comentarios sobreeste manual o cualquier otro de la documentación de AS/400.v Si prefiere enviar los comentarios por correo, diríjalos a:

IBM, S.A.National Language Solutions CenterAvda. Diagonal, 57108029 BarcelonaEspaña

Si envía por correo una hoja de comentarios del lector desde un país que no seaEstados Unidos, puede entregar dicha hoja a una sucursal local de IBM o a unrepresentante de IBM para enviarla con portes pagados.

v Si prefiere enviar los comentarios por fax, utilice el número de teléfonosiguiente:– Desde España: 93 321 61 34– Desde otros países: 34 93 321 61 34

v Si prefiere enviar los comentarios por correo electrónico, puede utilizar una delas direcciones siguientes:– Comentarios sobre publicaciones:

[email protected]: to toribm(torrcf)

– Comentarios sobre AS/400 Information Center:[email protected]

Debe incluir estos datos:v El título del librov El número de publicaciónv Número de página o tema al que hace referencia su comentario.

Acceso a información en líneaVisualAge RPG contiene una serie de manuales y de ayuda en línea. Puede accedera la ayuda mientras utiliza el producto y puede ver los manuales mientras utilizael producto o por separado.

Utilización de los manuales en líneaPara ver un manual en línea, realice una de las acciones siguientes:v Seleccione el nombre del manual del menú desplegable Ayuda del Diseñador

GUI de VisualAge RPG GUI de la ventana de edición.

Acerca de este manual xiii

Page 16: RPG Referencia

v Acceda a los manuales desde el menú Inicio. Seleccione Programas → VisualAgeRPG y CODE400. A continuación, seleccione Información de VARPG yCODE400.

Publicaciones en formato PDFTodas las publicaciones de VA RPG y CODE/400 se incluyen como parte de laayuda habitual para el producto. Además del formato normal, el producto tambiéncontiene la versión PDF de las publicaciones.

Nota: Debe disponer del programa Adobe Acrobat Reader, Versión 3.01 o superiorpara Windows, para ver el formato PDF de las publicaciones en la estaciónde trabajo. Si no dispone de dicho programa, puede descargar una copia dela página Web de Adobe Systems (http://www.adobe.com).

En la ayuda en línea están disponibles las siguientes publicaciones en formatoPDF:v Iniciación a VisualAge RPG y CODE/400v Programación con VisualAge para RPGv VisualAge RPG Manual de consulta de componentesv VisualAge RPG Manual de consulta del lenguaje

Nota: Se han actualizado todas las versiones en línea de las publicaciones deWebSphere Development Tools para AS/400.

Utilización de la ayuda en líneaLa ayuda en línea está disponible en todas las áreas de VisualAge RPG. Paraobtener ayuda para una ventana determinada, un recuadro de diálogo o uncuaderno de propiedades, seleccione el pulsador Ayuda (si está disponible).

Nota: Para ver la ayuda que está en formato HTML, la estación de trabajo debetener un navegador Web que soporte marcos como, por ejemplo NetscapeNavigator 4.04 o superior, o Microsoft® Internet Explorer 4.01 o superior. (Elnavegador recomendado es Netscape Navigator 4.6 o Internet Explorer 5.0)

Utilización de ayuda según contextoPara recibir ayuda según contexto en cualquier momento, pulse F1. La ayuda queaparece es específica al área de la interfaz que tiene foco de entrada. El foco deentrada puede encontrarse en los elementos de menú, ventanas, recuadros dediálogo y cuadernos de propiedades o en componentes específicos de éstos.

Para obtener ayuda según contexto en los recuadros de diálogo, pulse en el signode interrogación (si está disponible) que hay en el ángulo superior derecho de laventana. Aparece un signo de interrogación al lado de la flecha del ratón. Pulse enuna palabra o un campo y aparecerá la información de ayuda sobre esedeterminado campo.

Utilización del hipertextoAlgunas ventanas de ayuda contienen palabras, frases o gráficos resaltados. Sonenlaces de hipertexto que llevan de un tema a otro. Para visualizar ayudaespecífica de un tema resaltado, pulse en él. Cuando siga un enlace de hipertexto,puede aparecer un botón Sincronizar en la esquina superior derecha del tema deayuda. (Quizás deba retroceder páginas para verlo). Si pulsa el botón Sincronizar,la lista de temas del marco izquierdo se renueva a fin de mostrarle el lugar queocupa el tema actual en la tabla de contenido general.

xiv VisualAge RPG Consulta del lenguaje

Page 17: RPG Referencia

Utilización de la tabla de contenido de ayudaCuando se visualice la ventana de Ayuda, pulse el botón Sincronizar (cuando estédisponible) para visualizar la sección Componentes en el marco de la izquierda.Pulse los símbolos más + y menos − para expandir y contraer la seccióncorrespondiente al componente deseado. Para ver un tema, pulse en él.

Utilización del recurso de búsquedaEl sistema de ayuda VisualAge RPG y CODE/400 utiliza un motor de búsquedaavanzado de texto completo, que devuelve ″aciertos″ o ″coincidencias″ HTMLbasados en la petición de búsqueda. 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 búsqueda. Pulse Intro.2. Si la palabra o frase no se encuentra, se visualiza información acerca del intento

de búsqueda. De lo contrario, aparece la página Resultado de la búsqueda conuna lista de temas en los que se ha encontrado la palabra o frase. Pulse elenlace que desee ver.

3. Puede utilizar las +Opciones de búsqueda para especificar el número dedocumentos que debe devolverse.

Si desea obtener consejos para refinar las búsquedas, puede ver el tema Cómobuscar información en la ayuda en línea.

Utilización de ayuda según lenguajePara recibir ayuda según lenguaje, pulse F1 en una ventana de edición. Si el cursorse encuentra en un código de operación, recibirá ayuda para dicho código deoperación; sino, recibirá ayuda para la especificación actual.

Acerca de este manual xv

Page 18: RPG Referencia

xvi VisualAge RPG Consulta del lenguaje

Page 19: RPG Referencia

Novedades de este release

Las principales mejoras efectuadas en VisualAge RPG desde la versión 3.2.1 son losnuevos tipos de datos enteros con signo y sin signo de 3 y 20 dígitos, y el soportepara un nuevo tipo de datos UCS-2 (Juego de Caracteres Universal Versión 2) y laconversión de campos de tipo UCS-2 a campos de tipo gráfico o carácter de unsolo byte, y viceversa.

La siguiente lista describe estas mejoras:v Soporte para nuevos tipos de datos enteros de 1 y 8 bytes: entero con signo 3I y

20I, y entero sin signo 3U y 20U– Estos nuevos tipos de datos enteros proporcionan un mayor rango de valores

enteros.– El nuevo tipo 3U facilita la comunicación de tipos de retorno de caracteres de

un solo byte (char) y parámetros pasados por valor.– La nueva palabra clave de especificación de control INTPREC permite

especificar una precisión de 20 dígitos para los valores intermedios en lasexpresiones con operaciones aritméticas binarias con enteros y enteros sinsigno.

– Se han añadido las funciones incorporadas %DIV y %REM para dar soporte alas operaciones de división y resto entre enteros.

v Soporte para el nuevo tipo de datos UCS-2 (Juego de Caracteres UniversalVersión 2) o tipo de datos Unicode– El juego de caracteres UCS-2 (Unicode) permite codificar los caracteres de

muchos idiomas escritos. El campo es de tipo carácter en el que sus caracterestienen una longitud de dos bytes.

– Al añadir soporte para Unicode, puede desarrollarse una aplicación únicapara una corporación multinacional, minimizando la necesidad de realizarconversiones de páginas de códigos. La utilización de Unicode permiteprocesar los caracteres de varios scripts sin pérdida de su integridad.

– Soporte para las conversiones entre campos de tipo UCS-2 y campos de tipográfico o carácter de un solo byte, utilizando las operaciones MOVE yMOVEL, y las nuevas funciones incorporadas %UCS2 y %GRAPH.

En este release también se han realizado otras mejoras. Entre éstas se incluyen:v Nuevas palabras especiales para la palabra clave INZ de la especificación de

definición:– INZ(*EXTDFT) permite utilizar en las DDS los valores por omisión para

inicializar los subcampos de las estructuras de datos descritas externamente.v La nueva función incorporada %XFOOT suma todos los elementos de una

expresión de matriz especificada.v El nuevo código de operación EVALR evalúa expresiones y asigna el resultado a

un resultado de tipo carácter o gráfico de longitud fija. La asignación ajusta porla derecha los datos dentro del resultado.

v El nuevo código de operación FOR realiza un bucle iterativo y permiteespecificar expresiones de formato libre en los valores de inicio, incremento ylímite.

v El nuevo código de operación LEAVESR puede utilizarse para salir de unasubrutina desde cualquier punto de su interior.

v El nuevo parámetro *NEXT de la palabra clave OVERLAY(nombre:*NEXT)indica que un subcampo solapa otro subcampò en la siguiente posicióndisponible.

© Copyright IBM Corp. 1994, 2000 xvii

Page 20: RPG Referencia

v La posibilidad de utilizar literales hexadecimales en campos enteros y enterossin signo en operaciones de inicialización y de formato libre, como por ejemploEVAL, IF, etc.

La siguiente tabla resume los elementos nuevos y modificados del lenguaje,basándose en la parte afectada del lenguaje.

Tabla 1. Elementos del lenguaje modificados desde la V3.2.1

Unidad dellenguaje Elemento Descripción

Palabras clave dela especificación dedefinición

INZ(*EXTDFT) Ahora pueden inicializarse todos lossubcampos de una estructura de datosdescrita externamente con los valorespor omisión especificados en las DDS.

OVERLAY(nombre:*NEXT) El valor especial *NEXT indica que elsubcampo se colocará en la siguienteposición disponible dentro del camposolapado.

OPTIONS(*RIGHTADJ) El nuevo parámetroOPTIONS(*RIGHTADJ), que seespecifica en un parámetro de valor oconstante de un prototipo de función,indica que el valor de tipo carácter,gráfico o UCS-2 que se pasa comoparámetro se ajustará por la derechaantes de pasarse a la llamada delprocedimiento.

Especificación dedefiniciónposiciones 33-39(Hastaposición/Longitud)

En los tipos de datos I y Use permiten 3 y 20 dígitos

Se han añadido a la lista de valorespermitidos para tipos de datosinternos, para dar soporte a los datosenteros y sin signo de 1 y 8 bytes.

Tipo de datosinternos

C (formato UCS-2 delongitud fija o variable)

Se añade a la lista de tipos de datosinternos permitidos en lasespecificaciones de definición. El juegode caracteres UCS-2 (Unicode) permitecodificar los caracteres de muchosidiomas escritos. El campo es uncampo de tipo carácter cuyoscaracteres tienen una longitud de dosbytes.

Formato de datos C (formato UCS-2 delongitud fija o variable)

Se añade el formato UCS-2 a la lista deformatos de datos permitidos en lasespecificaciones de entrada y salida dearchivos descritos por el programa.

Tabla 2. Elementos del lenguaje nuevos desde la V3.2.1

Unidad dellenguaje Elemento Descripción

Palabras clave dela especificación decontrol

CCSID(*GRAPH: *IGNORE |*SRC | número)

Establece el CCSID gráfico por omisióndel módulo. Este valor se utiliza en losliterales, en los datos de tiempo decompilación y en los campos ydefiniciones de entrada y salidadescritos por el programa. El valor poromisión es *IGNORE.

xviii VisualAge RPG Consulta del lenguaje

Page 21: RPG Referencia

Tabla 2. Elementos del lenguaje nuevos desde la V3.2.1 (continuación)

Unidad dellenguaje Elemento Descripción

CCSID(*UCS2: número) Establece el CCSID UCS-2 por omisióndel módulo. Este valor se utiliza en losliterales, en los datos de tiempo decompilación y en los campos ydefiniciones de entrada y salidadescritos por el programa. El valor poromisión es 13488.

INTPREC(10 | 20) Especifica la precisión decimal de losvalores intermedios enteros y sin signoen las expresiones con operacionesaritméticas binarias. El valor poromisión, INTPREC(10), indica que seutilizará una precisión de 10 dígitos.

Palabras clave dela especificación dedefinición

CCSID(número | *DFT) Establece el CCSID gráfico y UCS-2 dela definición.

Funcionesincorporadas

%DIV(n:m) Realiza una división entera entre losdos operandos n y m; el resultado es laparte entera de n/m. Los operandosdeben ser valores numéricos con ceroposiciones decimales.

%GRAPH(char-expr |graph-expr | UCS2-expr {:ccsid})

Convierte datos de tipo carácter de unsolo byte, gráfico o UCS-2 a datos detipo gráfico.

%REM(n:m) Realiza una operación de resto enteroentre los dos operandos n y m; elresultado es el resto de n/m. Losoperandos deben ser valoresnuméricos con cero posicionesdecimales.

%UCS2(char-expr |graph-expr | UCS2-expr {:ccsid})

Convierte datos de tipo carácter de unsolo byte, gráfico o UCS-2 a datos detipo UCS-2.

%XFOOT(array-expr) Efectúa la suma de todos los elementosde la expresión de matriz numéricaespecificada.

Códigos deoperación

EVALR Evalúa una sentencia de asignaciónque tenga la formaresultado=expresión. El resultado seajustará por la derecha.

FOR Inicia un grupo de operaciones eindica el número de veces que seprocesará el grupo. Los valores deinicio, incremento y límite pueden serexpresiones de formato libre.

ENDFOR ENDFOR finaliza un grupo deoperaciones iniciadas mediante unaoperación FOR.

LEAVESR Se utiliza para salir de una subrutinadesde cualquier lugar de su interior.

Novedades de este release xix

Page 22: RPG Referencia

Esta publicación presenta numerosas diferencias respecto a la versión anterior. Lamayor parte de los cambios están relacionados con las mejoras que se hanefectuado desde el último release; otros reflejan correcciones técnicas menores. Parafacilitarle la utilización de este manual, las mejoras y los cambios técnicos seindican con una barra vertical (|).

xx VisualAge RPG Consulta del lenguaje

Page 23: RPG Referencia

Parte 1. Introducción al lenguaje de VisualAge RPG

En este apartado se describen algunos de los elementos básicos del leguajeVisualAge® RPG (VARPG) como son:v Juego de caracteresv Nombres simbólicos y palabras reservadasv Directivas del compiladorv Indicadoresv Subprocedimientos

© Copyright IBM Corp. 1994, 2000 1

Page 24: RPG Referencia

2 VisualAge RPG Consulta del lenguaje

Page 25: RPG Referencia

Capítulo 1. Nombres simbólicos y palabras reservadas

Los caracteres válidos para el lenguaje VisualAge RPG son los siguientes:letras A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

Se pueden utlilizar letras minúsculas en los nombres simbólicosaunque se convierten en mayúsculas durante la compilación.

números 0 1 2 3 4 5 6 7 8 9caracteres + − * , . ’ & / $ # : @ _ > < = ( ) %carácter en blanco

Nombres simbólicosUn nombre simbólico identifica datos específicos de forma exclusiva en unprograma o procedimiento. Su función es permitir al usuario acceder a dichosdatos. Las normas siguientes se aplican a todos los nombres simbólicos:v El primer carácter del nombre debe ser alfabético, $ o @v Los caracteres restantes deben ser alfabéticos, numéricos o el signo de subrayado

(_)v El nombre debe estar ajustado por la izquierda en la entrada de la hoja de

especificaciones, excepto en los campos que permiten que el nombre esté enformato libre (la especificación de definición, los campos de palabra clave y elcampo de factor 2 ampliado)

v No puede ser una palabra reservadav Un nombre simbólico puede tener entre 1 y 4096 caracteres. Los límites prácticos

están determinados por el tamaño de la entrada utilizada para definir el nombre.En la entrada Nombre de la especificación de definición o procedimiento sepuede especificar un nombre con una longitud máxima de 15 caracteres. Paranombres con más de 15 caracteres, utilice una especificación de continuación.

v Un nombre simbólico debe ser único dentro del procedimiento en el que sedefine.

En la Tabla 3 se listan los nombres simbólicos y las restricciones adicionales.

Tabla 3. Restricciones para nombres simbólicos

Matrices Un nombre de matriz no puede empezar con las letras TAB.

Nombres de compilacióncondicional

Los nombres simbólicos utilizados para la compilacióncondicional no tienen relación con otros nombres simbólicos.Los nombres para la compilación condicional pueden tener 50caracteres.

Estructuras de datos Una estructura de datos sólo se puede definir una vez.

Registros de salida deexcepción

El mismo nombre EXCEPT se puede asignar a más de unregistro de salida de excepción.

© Copyright IBM Corp. 1994, 2000 3

Page 26: RPG Referencia

Tabla 3. Restricciones para nombres simbólicos (continuación)

Campos Un nombre de campo global puede definirse varias veces sicada definición que utiliza el nombre tiene el mismo tipo dedatos, la misma longitud y el mismo número de posicionesdecimales. Todas las definiciones que utilizan el mismo nombrehacen referencia a un solo campo (es decir, a la misma área delalmacenamiento). Sin embargo, el campo sólo se puede definiruna vez en la especificación de definición. Un campo sólopuede definirse una vez como subcampo de estructura de datos.Un nombre de subcampo no puede especificarse como el campode resultado en un parámetro *ENTRY PLIST. El compilador deVisualAge RPG crea campos para los textos estáticos y loscampos de entrada de componentes con el mismo nombre queel componente. Si define estos campos explícitamente en elfuente, se aplican las reglas precedentes. Estas reglas no seaplican a los campos locales definidos en los subprocedimientos.

Listas de campos de clave No hay restricciones adicionales para los nombres de lista decampos de clave (KLIST).

Etiquetas No hay restricciones adicionales para los nombres de etiquetas.

Constantes con nombre No hay restricciones adicionales para las constantes connombre.

Listas de parámetros No hay restricciones adicionales para los nombres de lista deparámetros (PLIST).

Nombres de prototipo No hay restricciones adicionales para los nombres de prototipo.

Nombres de registro Un nombre de registro puede existir en un solo archivo delprograma.

Subrutinas Consulte el apartado “BEGACT (Empezar subrutina de acción)”en la página 397 para ver una descripción de los nombres desubrutina de acción y el apartado “BEGSR (Empezar subrutinade usuario)” en la página 400 para ver una descripción de losnombres de subrutina de usuario.

Tablas Un nombre de tabla puede contener de 3 a 10 caracteres, debeempezar con los caracteres TAB y no puede definirse en unsubprocedimiento.

Palabras con funciones especiales y palabras reservadasA continuación se facilita un resumen de las palabras que tienen funcionesespeciales.

Palabras especiales de funciones incorporadasLas palabras especiales *ALL y *NULL se utilizan con las funciones incorporadas.Para obtener más información acerca de las funciones incorporadas, consulte elcapítulo “Capítulo 23. Funciones incorporadas” en la página 309.

Palabras especiales de fecha y horaCon los campos de Fecha, Hora e Indicación de la hora se utilizan las palabrasespeciales siguientes:

*CDMY *CMDY *CYMD

*CYMD0 *DMA *ISO

*LONGJUL *MDA *EUR

4 VisualAge RPG Consulta del lenguaje

Page 27: RPG Referencia

*JIS *USA *HMS

*JUL *AMD

Para obtener más información acerca de los formatos de fecha, consulte el apartado“DATFMT(fmt{separador})” en la página 205.

ExpresionesLa palabra especial NOT se puede utilizar con las expresiones. Para obtener másinformación acerca de las expresiones, consulte el apartado “Capítulo 24.Expresiones” en la página 351.

Palabras especiales de posición de archivoLas palabras especiales *START y *END se pueden utilizar para definir unaposición en un archivo. Para obtener más información acerca de la posición dearchivo, consulte el apartado “Posición de archivo” en la página 6.

Literales implícitosLas constantes figurativas son literales implícitos que pueden especificarse sinhacer referencia a la longitud. Para obtener más información acerca de lasconstantes figurativas, consulte el apartado “Constantes figurativas” en lapágina 142.

*ALLX’x1..’ *DARKGREEN *OFF

*ALLG’K1K2’ *DARKGRAY *ON

*ALL’X..’ *DARKPINK *OK

*ABORT *DARKRED *PALEGRAY

*BLACK *ENTER *PINK

*BLANK *GREEN *RED

*BLANKS *HALT *RETRY

*BLUE *HIVAL *WARN

*BROWN *INFO *WHITE

*CANCEL *IGNORE *YELLOW

*CYAN *LOVAL *YESBUTTON

*DARKBLUE *NOBUTTON *ZERO

*DARKCYAN *NULL *ZEROS

Palabras reservadas de indicadoresLas palabras reservadas *IN e *INxx permiten hacer referencia a los indicadorescomo si se tratasen de datos. Si desea más información, consulte “Indicadoresreferidos como datos” en la página 25.

Palabras reservadas de fecha de trabajosLas palabras reservadas siguientes permiten acceder a la fecha de trabajo o a unaparte de la fecha. Si desea más información, consulte el apartado “Palabrasespeciales de fecha de usuario” en la página 7.

UDATE *DATE

Capítulo 1. Nombres simbólicos y palabras reservadas 5

Page 28: RPG Referencia

UMONTH *MONTH

UYEAR *YEAR

UDAY *DAY

Palabras reservadas de numeración de páginasLas palabras reservadas PAGE y PAGE1-PAGE7 se pueden utilizar para numerarlas páginas de un informe o para numerar los campos de salida de formasecuencial. Si desea más información, consulte el apartado “Palabras reservadasPAGE, PAGE1-PAGE7”.

Palabras especiales de transferencia de parámetrosLas palabras especiales *OMIT, *RIGHTADJ, *STRING y *VARSIZE se utilizar parapasar parámetros.

Colocación de campos*PLACE permite la colocación repetitiva de campos en un registro de salida. Sidesea más información, consulte el apartado “*PLACE” en la página 295.

Grabación de todos los campos*ALL permite grabar en la salida todos los campos que se han definido para unarchivo descrito externamente. Para obtener más información acerca de lasconstantes figurativas, consulte el apartado “Reglas para constantes figurativas” enla página 144.

Posición de archivo*START y *END cambian la posición de un archivo de base de datos de AS/400™.

Si el archivo no es por clave, *START y *END establecen la posición al principio yal final del archivo respectivamente. Si se trata de un archivo por clave, *START y*END establecen la posición al principio y al final de la vía de acceso por clave,respectivamente.

Palabras reservadas PAGE, PAGE1-PAGE7PAGE se utiliza para numerar las páginas de un informe, los registros de salida deun archivo o los campos de salida. No provoca un salto de página.

Los ocho campos PAGE posibles (PAGE, PAGE1, PAGE2, PAGE3, PAGE4, PAGE5,PAGE6 y PAGE7) se pueden utilizar para numerar distintos tipos de páginas desalida o para numerar páginas de diferentes archivos de impresora.

Los campos PAGE pueden especificarse en las posiciones 30 a 43 de lasespecificaciones de salida o en las especificaciones de entrada o de cálculo.

Las reglas siguientes se aplican a la palabra clave PAGE:v La numeración de las páginas, a menos que se indique lo contrario, empieza por

1v En cada página nueva se suma 1 automáticamentev Los campos PAGE pueden tener cualquier longitudv Los campos PAGE no deben tener ninguna posición decimal

6 VisualAge RPG Consulta del lenguaje

Page 29: RPG Referencia

v Cuando un campo PAGE sólo está indicado en las especificaciones de salida, setrata como un campo numérico de cuatro dígitos sin posiciones decimales.

Puede utilizar las palabras PAGE de diversas formas:v Para comenzar por un número de página que no sea el 1, establezca el valor del

campo PAGE en el número anterior al que desea.v Para volver a iniciar la numeración de páginas en cualquier punto de un trabajo:

– Especifique un espacio en blanco detrás (posición 45 de las especificaciones desalida)

– Especifique el campo PAGE como el campo de resultado de una operación enlas especificaciones de cálculo

– Especifique un indicador de salida en el campo de salida (consulte laFigura 2). Cuando el indicador de salida está activado, el campo PAGE serestablece a 1. Los indicadores no se pueden utilizar para controlar laimpresión de un campo PAGE, ya que éste siempre se graba.

– Especifique el campo PAGE como campo de entrada (consulte la Figura 1).

Palabras especiales de fecha de usuarioSe puede especificar una fecha para un programa en tiempo de ejecuciónutilizando una palabra especial de fecha de usuario. Las palabras especiales defecha de usuario son: UDATE, *DATE, UMONTH, *MONTH, UDAY, *DAY,UYEAR y *YEAR.

Las palabras especiales de fecha de usuario acceden a la fecha del trabajoespecificado en la descripción de trabajo. La fecha de usuario se puede grabarcomo salida.

Las palabras especiales de fecha de usuario se establecen cuando la aplicaciónempieza a ejecutarse. No se actualiza si el programa se ejecuta pasada lamedianoche ni si cambia la fecha del trabajo. Utilice la operación TIME paraobtener la hora y la fecha mientras se ejecuta el programa. Para obtener másinformación acerca de la operación TIME, consulte el apartado “TIME (Hora deldía)” en la página 554.

Las restricciones siguientes se aplican a los campos de fecha de usuario:v Estos campos son numéricos, no de tipo de fecha.

*...1....+....2....+....3....+....4....+....5....+....6....+....7...IFilename++Sq..RiPos1+NCCPos2+NCCPos3+NCC................................I........................Fmt+SPFrom+To+++DcField+++++++++....FrPlMnZr....IINPUT 50 1 CPI 2 5 0PAGE

Figura 1. Descripción de registro de página

*...1....+....2....+....3....+....4....+....5....+....6....+....7...OFilename++EF..N01N02N03Excnam++++B++A++Sb+Sa+...........................O..............N01N02N03Field+++++++++YB.End++PConstant/editword/DTformatO* Si el indicador 15 está activado, el campo PAGE se establece a 0O* y se suma 1 antes de imprimir el campo. Si está desactivado, seO* suma 1 al contenido del campo PAGE antes de imprimir.OPRINT E 99 01O 15 PAGE 1 75

Figura 2. Restablecimiento de los campos de PAGE a cero

Capítulo 1. Nombres simbólicos y palabras reservadas 7

Page 30: RPG Referencia

v Los campos de fecha de usuario no se pueden modificar. Esto significa que no sepueden utilizar:– En el campo de resultado de los cálculos– Como factor 1 de operaciones PARM– Como índice de factor 2 de operaciones LOOKUP– Con un espacio en blanco detrás en las especificaciones de salida– Como campos de entrada

v Los campos de fecha de usuario UMONTH, *MONTH, UDAY, *DAY, UYEAR y*YEAR no se pueden editar mediante el código de edición Y en la posición 44 delas especificaciones de salida.

Puede utilizar las palabras de fecha de usuario de diversas maneras:

Códigos de operación que utilizancampos numéricos

Las palabras especiales de fecha de usuario sepueden utilizar en el factor 1 ó 2 de lasespecificaciones de cálculo para los códigos deoperación que utilizan campos numéricos.

Edición de UDATE y *DATE Es posible editar UDATE y *DATE cuando se grabansi se especifica el código de edición & en la posición44 de la especificación de salida. La palabra claveDATEDIT en la especificación de control determinael formato y el carácter separador que se insertará.

Impresión de campos de fecha de dosposiciones

Para imprimir un campo de fecha de dos posiciones,especifique UMONTH, *MONTH UDAY, *DAY yUYEAR en las especificaciones de salida.

Impresión de campos de fecha decuatro posiciones

Para imprimir un campo de fecha de cuatroposiciones, especifique UMONTH, *MONTH UDAY,*DAY y UYEAR en las especificaciones de salida.

Impresión de campos de fecha de seisposiciones

Para imprimir un campo de fecha de seis posiciones,especifique UDATE en las especificaciones de salida.Se pueden utilizar tres formatos distintos:Mes/día/año, Año/mes/día y Día/mes/año. Lapalabra clave DATEDIT en la especificación decontrol determina el formato.

Impresión de campos de fecha deocho posiciones

Para imprimir un campo de fecha de ochoposiciones, especifique *DATE en las especificacionesde salida. Para el año se utilizan cuatro dígitos. Sepueden utilizar tres formatos distintos:Mes/día/año, Año/mes/día y Día/mes/año. Lapalabra clave DATEDIT en la especificación decontrol determina el formato.

Impresión del día Para imprimir el día solamente, especifique UDAY o*DAY en las especificaciones de salida.

Impresión del mes Para imprimir el mes solamente, especifiqueUMONTH o *MONTH en las especificaciones desalida.

Impresión del año Para imprimir el año solamente, especifique YEAR o*YEAR en las especificaciones de salida.

8 VisualAge RPG Consulta del lenguaje

Page 31: RPG Referencia

Capítulo 2. Directivas del compilador

Las directivas del compilador /TITLE, /EJECT, /SPACE y /COPY le permitenespecificar información de cabecera para el listado del compilador, controlar elespaciado del listado del compilador e insertar registros procedentes de otrosmiembros de archivo durante de la compilación. Las sentencias condicionales dedirectiva del compilador /DEFINE, /UNDEFINE, /IF, /ELSEIF, /ELSE y /EOF lepermiten seleccionar u omitir registros del fuente. Las sentencias de directiva delcompilador deben preceder a las matrices de tiempo de compilación y a losregistros de tabla.

/COPY (Posiciones 7-11)La directiva del compilador /COPY sustituye /COPY por registros de otro archivo.Este archivo puede existir en la estación de trabajo o en un servidor AS/400. Estosregistros se insertan en el punto en que aparece /COPY y se compilan con elprograma. Los registros insertados pueden contener cualquier especificación válida,incluyendo /COPY, hasta la máxima profundidad de jerarquización especificadapor la palabra clave COPYNEST (32 cuando no se especifica).

Para facilitar el mantenimiento de la aplicación, será deseable colocar los prototiposde los procedimientos exportados en un miembro /COPY. Si lo hace, asegúrese decolocar una directiva /COPY para el miembro en el módulo que contiene elprocedimiento exportado y en todos los módulos que contengan llamadas alprocedimiento exportado.

/COPY no se imprime en el listado del compilador, sino que se sustituye por elcontenido del archivo especificado. Todos los miembros /COPY aparecen en latabla de miembros COPY del listado del compilador.

Copia de archivos de un servidor AS/400Para copiar archivos de un servidor AS/400, especifique la sentencia /COPY talcomo se indica a continuación:

Posiciones Entrada

7-11 /COPY

12 Blanco

13-19 *REMOTE

20 Blanco

21-52 Identifica la ubicación del miembro que se va a copiar (fusionar).El formato es: biblioteca/archivo,miembrov Debe especificarse un nombre de miembro.v Si no se especifica un nombre de archivo, se tomará el valor por

omisión QRPGLESRC.v El nombre de archivo y de miembro deben estar separados por

una coma. La coma debe ir incluida.v Si no se especifica la biblioteca, el archivo se busca en la lista de

bibliotecas. El miembro se busca en todas las apariciones delarchivo fuente especificado hasta que se localiza o hasta que labúsqueda finaliza.

© Copyright IBM Corp. 1994, 2000 9

Page 32: RPG Referencia

v Si se especifica una biblioteca, también debe especificarse unnombre de archivo.

53-80 Blanco

81-100 Comentarios

A continuación, se facilitan ejemplos de la sentencia /COPY para copiar archivosAS/400:v Para copiar el miembro MBR1 del archivo fuente QRPGLESRC, entre la

sentencia siguiente. Observe que se utiliza la lista de bibliotecas actual parabuscar el archivo QRPGLESRC:C/COPY *REMOTE MBR1

v Para copiar el miembro MBR1 del archivo fuente SRCFIL, entre la sentenciasiguiente. Observe que se utiliza la lista de bibliotecas actual para buscar elarchivo SRCFIL:I/COPY *REMOTE SRCFIL,MBR1

v Para copiar el miembro MBR1 del archivo fuente SRCFIL de la bibliotecaSRCLIB, entre la sentencia siguiente:O/COPY *REMOTE SRCLIB/SRCFIL,MBR1

v Para copiar el miembro ″mbr1″ del archivo ″srcfil″ de la biblioteca ″srclib″, entrela sentencia siguiente:O/COPY *REMOTE "srclib"/"srcfil","mbr1"

Copia de archivos de una estación de trabajoPara copiar archivos de una estación de trabajo local, entre la sentencia /COPYsiguiente:

Posiciones Entrada

7-11 /COPY

12 Blanco

13-79 Identifica la ubicación del miembro que se va a copiar. El formatoes: Unidad:\vía\miembro.CPY

La unidad y la vía de acceso son opcionales.

80 Blanco

81-100 Comentarios

En el ejemplo siguiente se muestra la sentencia /COPY para copiar archivoslocales:O/COPY D:\PROJECT1\INCLUDES\TOOLS1.CPY

Directiva /COPY jerarquizadaSe permite la jerarquización de directivas /COPY. Un miembro /COPY puedecontener una o varias directivas /COPY (que a su vez pueden contener másdirectivas /COPY, etc.). La profundidad máxima de jerarquización puedeestablecerse utilizando la palabra clave de especificación de control COPYNEST. Laprofundidad máxima por omisión es 32.

Debe asegurarse de que los archivos /COPY no se incluyen unos a otrosinfinitamente. Utilice las directivas de compilación condicionales al principio de losarchivos /COPY para evitar que las líneas fuente se utilicen más de una vez.

10 VisualAge RPG Consulta del lenguaje

Page 33: RPG Referencia

Directivas de compilación condicionalesLas sentencias de directivas de compilación condicionales permiten incluir oexcluir de la compilación secciones de código fuente de forma condicional.v Los nombres de condición pueden añadirse o eliminarse de la lista de

condiciones definidas actualmente utilizando las directivas de definición decondición /DEFINE y /UNDEFINE.

v La expresiones condicionales DEFINED(nombre de condición) y NOTDEFINED(nombre de condición) se utilizan dentro de grupos /IF decomprobación de condición.

v Las directivas condicionales de comprobación /IF, /ELSEIF, /ELSE y /ENDIF,controlan qué líneas fuente debe leer el compilador.

v La directiva /EOF indica al compilador que debe ignorar el resto de líneasfuente del miembro fuente actual.

Definición de condicionesLos nombres de condición pueden añadirse o eliminarse de la lista de condicionesdefinidas actualmente utilizando las directivas de definición de condición/DEFINE y /UNDEFINE.

/DEFINE (Posiciones 7-13)La directiva del compilador /DEFINE define condiciones para la compilacióncondicional. Las entradas del área de nombre de condición tienen formato libre (nodeben justificarse a la izquierda). Las entradas siguientes se utilizan para/DEFINE:

Posiciones Entrada

7 - 13 /DEFINE

14 Blanco

15 - 80 nombre de condición

81 - 100 Comentarios

La directiva /DEFINE añade un nombre de condición a la lista de condiciones yadefinidas. Una directiva /IF DEFINED(nombre de condición) posterior seríaverdadera. Una directiva /IF NOT DEFINED(nombre de condición) posterior seríafalsa.

/UNDEFINE (Posiciones 7-15)Utilice la directiva /UNDEFINE para indicar que una condición ya no estádefinida. Las entradas del área de nombre de condición tienen formato libre (nodeben justificarse a la izquierda).

Posiciones Entrada

7 - 15 /UNDEFINE

16 Blanco

17 - 80 nombre de condición

81 - 100 Comentarios

La directiva /UNDEFINE elimina un nombre de condición de la lista decondiciones ya definidas. Una directiva /IF DEFINED(nombre de condición)posterior sería falsa. Una directiva /IF NOT DEFINED(nombre de condición)posterior sería verdadera.

Capítulo 2. Directivas del compilador 11

Page 34: RPG Referencia

Nota: Las condiciones especificadas en el parámetro DEFINE se tendrán en cuentapara la definición al procesar las directivas /IF y /ELSEIF. Estas condicionespueden eliminarse utilizando la directiva /UNDEFINE.

Expresiones condicionalesUna expresión condicional presenta una de las formas siguientes:v DEFINED(nombre de condición)v NOT DEFINED(nombre de condición)

La expresión de condición tiene formato libre pero no puede continuar en la líneasiguiente.

Comprobación de condicionesLas condiciones se comprueban utilizando los grupos /IF que constan de unadirectiva /IF, seguida de cero o más directivas /ELSEIF, seguidas opcionalmentepor una directiva /ELSE, seguida de una directiva /ENDIF.

Son válidas todas las líneas fuente entre las directivas de un grupo /IF excepto losdatos de tiempo de compilación. Esto incluye los grupos /IF jerarquizados.

Nota: No hay un límite práctico para el nivel de jerarquización de los grupos /IF.

Expresión de la condición /IF (Posiciones 7-9)La directiva del compilador /IF se utiliza para comprobar una expresión decondición para la compilación condicional. Las entradas siguientes se utilizan para/IF:

Posiciones Entrada

7 - 9 /IF

10 Blanco

11 - 80 Expresión de la condición

81 - 100 Comentarios

Si la expresión de la condición es verdadera, se seleccionan las líneas fuente quevan a continuación de la directiva /IF para que las lea el compilador. De locontrario, se excluyen las líneas existentes hasta la próxima condición /ELSEIF,/ELSE o /ENDIF del mismo grupo /IF.

Expresión de la condición /ELSEIF (Posiciones 7-13)La directiva del compilador /ELSEIF se utiliza para comprobar la expresión de unacondición dentro de un grupo /IF o /ELSEIF. Las entradas siguientes se utilizanpara /ELSEIF:

Posiciones Entrada

7 - 13 /ELSEIF

14 Blanco

15 - 80 Expresión de la condición

81 - 100 Comentarios

Si no se cumplió la condición /IF o /ELSEIF anterior y la expresión de lacondición es verdadera, se seleccionan para lectura las líneas fuente que van a

12 VisualAge RPG Consulta del lenguaje

Page 35: RPG Referencia

continuación de la directiva /ELSEIF. De lo contrario, se excluyen las líneasexistentes hasta que se encuentra la próxima condición /ELSEIF, /ELSE o /ENDIFdel mismo grupo /IF.

/ELSE (Posiciones 7-11)La directiva del compilador /ELSE se utiliza para seleccionar incondicionalmentelíneas fuente que se vayan a leer después una comprobación /IF o /ELSEIF fallida.Las entradas siguientes se utilizan para /ELSE:

Posiciones Entrada

7 - 11 /ELSE

12 - 80 Blanco

81 - 100 Comentarios

Si no se cumplió la condición /IF o /ELSEIF anterior, las líneas fuente seseleccionan hasta la próxima condición /ENDIF.

Si se cumplió la condición /IF o /ELSEIF anterior, se excluyen las líneas fuentehasta la próxima condición /ENDIF.

/ENDIF (Posiciones 7-12)La directiva del compilador /ENDIF se utiliza para finalizar el grupo /IF, /ELSEIFo /ELSE más reciente. Las entradas siguientes se utilizan para /ENDIF:

Posiciones Entrada

7 - 12 /ENDIF

13 - 80 Blanco

81 - 100 Comentarios

Después de la directiva /ENDIF, si la directiva /IF correspondiente era una líneaseleccionada, las líneas se seleccionan de forma incondicional. De lo contrario, elgrupo /IF no estaba seleccionado, por lo que las líneas siguen sin serseleccionadas.

Reglas para la comprobación de condicionesv /ELSEIF, y /ELSE no son válidas fuera de un grupo /IF.v Un grupo /IF puede contener al menos una directiva /ELSE. Una directiva

/ELSEIF no puede ir a continuación de una directiva /ELSE.v /ENDIF no es válida fuera de un grupo /IF, /ELSEIF o /ELSE.v A cada directiva /IF debe corresponderle una directiva /ENDIF posterior.v Todas las directivas asociadas a cualquier grupo /IF deben estar en el mismo

archivo fuente. No es válido tener la directiva /IF en un archivo y la directiva/ENDIF correspondiente en otro, incluso aunque el segundo archivo esté en unadirectiva /COPY jerarquizada. Sin embargo, todo un grupo /IF puede estar enuna directiva /COPY jerarquizada.

La directiva /EOFLa directiva /EOF indica al compilador que debe ignorar el resto de líneas fuentedel miembro fuente actual.

Capítulo 2. Directivas del compilador 13

Page 36: RPG Referencia

/EOF (Posiciones 7-10)La directiva del compilador /EOF se utiliza para indicar que el compilador debetener en cuenta que se ha alcanzado el final del archivo para el archivo fuenteactual. Las entradas siguientes se utilizan para /EOF:

Posiciones Entrada

7 - 10 /EOF

11 - 80 Blanco

81 - 100 Comentarios

La directiva /EOF finalizará cualquier grupo /IF activo que se haya activadodurante la lectura del miembro fuente actual. Si la directiva /EOF estaba en unarchivo /COPY, las condiciones que estaban activas cuando se leyó la directiva/COPY seguirán estándolo.

Nota: Si las líneas excluidas se están imprimiendo en el listado, se continuará lalectura y el listado de las líneas fuente después de /EOF, pero el compiladorignorará completamente el contenido de las líneas. Nunca se emitiránmensajes de diagnóstico después de /EOF.

Al utilizar la directiva /EOF se mejora el rendimiento del tiempo de compilacióncuando todo un miembro /COPY se utiliza una sola vez, pero puede copiarsevarias veces. (Esto no es cierto si se imprimen las líneas excluidas).

/EJECT (Posiciones 7-12)Utilice la directiva del compilador /EJECT para comenzar una página nueva en ellistado del compilador.

Nota: /EJECT no se imprime en el listado del compilador, sino que se sustituyepor una página nueva. Si aparece al principio de una página del listado delcompilador, no se imprime otra página nueva.

Para especificar una página nueva, entre la sentencia /EJECT siguiente:

Posiciones Entrada

7-12 /EJECT

13-49 Blanco

50-100 Comentarios

/SPACE (Posiciones 7-12)Utilice la directiva del compilador /SPACE para controlar el interlineado de lasección fuente del listado del compilador.

Nota: /SPACE no se imprime en el listado del compilador, sino que se sustituyepor el interlineado especificado. El interlineado creado por /SPACE se añadea las dos líneas que se colocan entre los tipos de especificaciones.

Para especificar información de cabecera, entre la sentencia /SPACE siguiente:

Posiciones Entrada

7-12 /SPACE

14 VisualAge RPG Consulta del lenguaje

Page 37: RPG Referencia

13 Blanco

14-16 Valor entero positivo comprendido entre el 1 y el 112 que define elnúmero de líneas correspondiente al interlineado. Si se especificaun número mayor que 112, se utiliza 112 como valor de /SPACE.Si el número es mayor que la cantidad de líneas que quedan en lapágina actual, las especificaciones siguientes comienzan en lapágina siguiente.

17-49 Blanco

50-100 Comentarios

/TITLE (Posiciones 7-12)Utilice la directiva del compilador /TITLE para especificar información de cabecera(por ejemplo, la clasificación de seguridad o los títulos). Dicha información apareceen la parte superior de todas las páginas del listado del compilador.

Un programa puede contener varias sentencias /TITLE. Cada una de ellasproporciona información de cabecera para el listado del compilador hasta que seencuentra otra sentencia /TITLE. La sentencia /TITLE debe ser la primeraespecificación que se encuentre para imprimir información en la primera páginadel listado del compilador. Además de la información de cabecera del compilador,la información especificada en la sentencia /TITLE también se imprime.

Nota: /TITLE no se imprime en el listado del compilador, sino que se sustituyepor la información de cabecera. La sentencia /TITLE hace que se salte a lapágina siguiente antes de imprimir el título.

Para especificar información de cabecera, entre la sentencia /TITLE siguiente:

Posiciones Entrada

7-12 /TITLE

13 Blanco

14-100 Información de título

Capítulo 2. Directivas del compilador 15

Page 38: RPG Referencia

16 VisualAge RPG Consulta del lenguaje

Page 39: RPG Referencia

Capítulo 3. Indicadores

Un indicador en un campo de caracteres de un byte que contiene un 1 (activado) oun 0 (desactivado). Se suelen utilizar para indicar el resultado de una operación opara establecer condiciones en el proceso de una operación.

Los indicadores se definen en entradas en la especificación. Las posiciones de laespecificación en las que se define un indicador determinan cómo se utiliza elindicador. Un indicador que se ha definido se puede utilizar para condicionar lasoperaciones de cálculo y de salida.

El formato de indicador puede especificarse en las especificaciones de definicióncon el fin de definir las variables de indicador. Si desea obtener una descripción decómo definir datos de tipo carácter en el formato de indicador, consulte “Tipo dedatos carácter” en la página 102 y “Posición 40 (Tipo de datos internos)” en lapágina 235.

El estado de la mayoría de indicadores se puede modificar mediante operacionesde cálculo. Todos los indicadores se pueden activar con el código de operaciónSETON y desactivar con SETOFF.

En este apartado se da la descripción de lo siguiente:v Los indicadores definidos en las especificaciones VisualAge RPG (indicadores de

identificación de registro, de campo y resultantes).v El indicador de Último Registro (LR)v La asignación de indicadores de relación de registros de camposv El condicionamiento de los cálculosv La utilización de indicadores en las expresionesv El condicionamiento de la salidav Los indicadores a los que se hace referencia como a los datos.

Indicadores definidos en las especificacionesEn las especificaciones pueden definirse los indicadores siguientes:v Indicador de identificación de registro (posiciones 21 y 22 de las especificaciones

de entrada)v Indicador de campo (posiciones 69 a 74 de las especificaciones de entrada)v Indicador resultante (posiciones 71 a 76 de las especificaciones de cálculo)v La matriz *IN, el elemento de matriz *IN(xx) o el campo *INxx.

El indicador definido se puede utilizar para condicionar las operaciones delprograma.

Indicadores de identificación de registroLos indicadores de identificación de registro se definen mediante entradas en lasposiciones 21 y 22 de las especificaciones de salida y se activan cuando el tipo deregistro correspondiente se selecciona para su proceso. Se pueden utilizar paracondicionar determinadas operaciones de cálculo y de salida. No es necesarioasignarlos en un orden en concreto.

Los indicadores de identificación de registro son 01-99 y LR.

© Copyright IBM Corp. 1994, 2000 17

Page 40: RPG Referencia

En el caso de un archivo descrito externamente, el indicador de identificación deregistro es opcional. Si se especifica, sigue las mismas reglas que en el caso de unarchivo descrito por programa.

Cuando se selecciona un tipo de registro para procesarlo, se activa el indicador deidentificación de registro correspondiente. Los demás indicadores de identificaciónde registro se desactivan excepto cuando se utiliza un código de operación dearchivo para recuperar registros de un archivo. El indicador de identificación deregistro se activa después de seleccionar el registro, pero antes de que los camposde entrada se desplacen al área de entrada. Se pueden desactivar en cualquiermomento.

Si se utiliza un código de operación de archivo en las especificaciones de cálculopara recuperar un registro, el indicador de identificación de registro se activa encuanto el registro se recupera del archivo. Puede haber varios indicadores deidentificación de registro para el mismo archivo, así como indicadores de registrono encontrado, activados al mismo tiempo si se emiten varias operaciones sobre elmismo archivo.

Reglas para la asignación de indicadores de identificación deregistroLas reglas siguientes se aplican al asignar indicadores de identificación de registroa los registros de un archivo descrito por programa:v Se puede asignar el mismo indicador a dos o más tipos de registro diferentes si

se va a procesar la misma operación en todos los tipos de registro. Para ello,especifique el indicador de identificación de registro en las posiciones 21 y 22, eindique los códigos de identificación de registro para los distintos tipos deregistro en una relación OR.

v Un indicador de identificación de registro se puede asociar con una relaciónAND, pero debe aparecer en la primera línea del grupo. Los indicadores deidentificación de registro no se pueden especificar en las líneas AND.

v La existencia de un registro no definido (un registro de un archivo descrito porprograma que no se ha descrito mediante un código de identificación de registroen las posiciones 23 a 46) hace que el programa se detenga.

v Un indicador de identificación de registro se puede especificar como indicadorde identificación de registro para otro tipo de registro, como indicador de campoo como indicador resultante. No se emite ningún mensaje de diagnóstico, peroeste uso de los indicadores puede proporcionar resultados erróneos.

Las reglas siguientes se aplican al asignar indicadores de identificación de registroen los registros de un archivo descrito externamente:v Las relaciones AND/OR no se pueden utilizar con nombres de formato de

registro; sin embargo, se puede asignar el mismo indicador de identificación deregistro a más de un registro.

v Debe especificarse el nombre de formato de registro, en vez de especificar elnombre de archivo, en las posiciones 7 a 16.

Indicadores de campoLos indicadores de campo se definen mediante una entrada en las posiciones 69 y70, 71 y 72 ó 73 y 74 de las especificaciones de entrada. Los indicadores de camposson los indicadores generales 01-99.

Un indicador de campo se puede utilizar para determinar si el campo o elelemento de matriz especificado es mayor que cero, menor que cero, cero o unespacio en blanco:v Las posiciones 69 a 72 son válidas para los campos numéricos

18 VisualAge RPG Consulta del lenguaje

Page 41: RPG Referencia

v Las posiciones 73 a 74 son válidas para los campos numéricos o de caracteresv Un indicador especificado en las posiciones 69 y 70 se activa cuando el campo

de entrada numérico es mayor que cerov Un indicador especificado en las posiciones 71 y 72 se activa cuando el campo

de entrada numérico es menor que cerov Un indicador especificado en las posiciones 73 y 74 se activa cuando el campo

de entrada numérico es cero o cuando el campo de entrada de caracteres es unespacio en blanco.

Los indicadores de campo se pueden utilizar para condicionar las operaciones decálculo o de salida.

Un indicador de campo se activa cuando los datos del campo o elemento de matrizse extrae del registro y la condición a la que representa se cumple en el registro deentrada. Permanece activo hasta que se lee otro registro del mismo tipo y lacondición a la que representa no se cumple en el registro de entrada o hasta que elindicador se desactiva como resultado de un cálculo.

Reglas para la asignación de indicadores de campoLas reglas siguientes se aplican al asignar indicadores de campo:v Los indicadores más, menos, cero o blanco se desactivan al principio del

programa. No se activan hasta que el campo que se está comprobando delregistro que se acaba de leer cumpla la condición (más, menos, cero o blanco).

v Los indicadores de campo no se pueden utilizar con matrices enteras. Sinembargo, se puede crear una entrada para un elemento de matriz. Losindicadores de campo únicamente están permitidos para campos con posibilidadde nulos si se ha especificado la opción Control del usuario oALWNULL(*USRCTL). Consulte el apartado “Soporte de valores nulos de basede datos” en la página 128 para obtener información acerca del soporte de valornulo.

v A un campo de entrada numérico se le pueden asignar dos o tres indicadores decampo. Sin embargo, sólo se activa el indicador que señala el resultado de laprueba de dicho campo; los demás se desactivan.

v Si el mismo indicador de campo se asigna a campos en distintos tipos deregistro, su estado (activado o desactivado) siempre se basa en el último tipo deregistro seleccionado.

v Cuando distintos indicadores de campo se asignan a campos en tipos de registrodiferentes, un indicador de campo permanecerá activado hasta que se lee otroregistro de ese tipo. De forma similar, un indicador de campo asignado a más deun campo en un solo tipo de registro siempre refleja el estado del última campodefinido.

v Un indicador de campo se puede especificar como indicador de campo en otraespecificación de entrada, como indicador resultante, como indicador deidentificación de registro o como indicador de relación de registros de campos.No se emite ningún mensaje de diagnóstico, pero este uso de los indicadorespuede proporcionar resultados erróneos.

v Si se especifica el mismo indicador en las tres posiciones, el indicador siempre seactivará al seleccionarse el registro que contenga este campo.

Indicadores resultantesUn indicador resultante está definido por una entrada en las posiciones 71 a 76 delas especificaciones de cálculo. La finalidad de los indicadores resultantes dependedel código de operación especificado en las posiciones 26 a 35. Consulte cadacódigo de operación en Capítulo 25. Códigos de operación para obtener unadescripción de la finalidad de los indicadores resultantes. Por ejemplo, se puedenutilizar para comprobar el campo de resultado después de una operación

Capítulo 3. Indicadores 19

Page 42: RPG Referencia

aritmética, para identificar una condición de registro no encontrado, para indicaruna condición de excepción/error para una operación de archivo o para indicaruna condición de fin de archivo.

Los indicadores resultantes son 01-99 y LR.

Los indicadores resultantes se pueden especificar en tres lugares (posiciones 71-72,73-74 y 75-76) de las especificaciones de cálculo. Las posiciones en las que sedefinen los indicadores resultantes determinan la condición que se ha decomprobar.

En la mayoría de casos, cuando se procesa un cálculo, los indicadores resultantesse desactivan y, si la condición especificada por un indicador resultante se cumple,dicho indicador se activa. Sin embargo, hay algunas excepciones a esta regla, como“LOOKUP (Buscar un elemento en tabla o matriz)” en la página 466, “SETOFF(Desactivar indicador)” en la página 537 y “SETON (Activar indicador)” en lapágina 537. Un indicador resultante se puede utilizar como indicador decondicionamiento en la misma línea de cálculo o en otros cálculos u operaciones desalida. Cuando se utiliza en la misma línea, el valor anterior del indicadordetermina si el cálculo se procesa o no. Si se procesa, el campo de resultado secomprueba y se determina el valor actual del indicador (véase la Figura 3).

Reglas para la asignación de indicadores resultantesLas reglas siguientes se aplican al asignar indicadores resultantes:v Los indicadores resultantes no se pueden utilizar si el campo de resultado hace

referencia a una matriz entera.v Si se utiliza el mismo indicador para comprobar el resultado de más de una

operación, la última operación procesada determina el valor del indicador.v Se puede utilizar el mismo indicador para comprobar más de una condición,

dependiendo de la operación especificada.

*...1....+....2....+....3....+....4....+....5....+....6....+....7...CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq..C*C* Se utilizan dos indicadores resultantes para comprobar las distintasC* condiciones de una operación de resta. Estos indicadores se usanC* para condicionar los cálculos que deben procesarse para un trabajoC* de nómina. El indicador 10 se activa si las horas trabajadas (HRSWKD)C* superan las 40, y después se usa para condicionar todas las opera-C* ciones necesarias para calcular el pago de las mismas. Si el indi-C* cador 20 no está activado (el empleado ha trabajado más de 40 horas)C* se calcula el sueldo normal según una semana de 40 horas.C*C HRSWKD SUB 40 OVERTM 3 01020C*C N20PAYRAT MULT (H) 40 PAY 6 2C 10OVERTM MULT (H) OVRRAT OVRPAY 6 2C 10OVRPAY ADD PAY PAYC*C* Si el indicador 20 está activado (el empleado ha trabajado menosC* de 40 horas), se calcula el sueldo según una semana de menos deC* 40 horas.C 20PAYRAT MULT (H) HRSWKD PAYC*

Figura 3. Indicadores resultantes utilizados para las operaciones de condición

20 VisualAge RPG Consulta del lenguaje

Page 43: RPG Referencia

Indicador de último registro (LR)El indicador LR se puede utilizar para finalizar el programa. Este indicador secomprueba al final de cada subrutina de acción para determinar si se debe finalizarel programa. Para obtener más información, consulte el apartado “ENDACT (Finde subrutina de acción)” en la página 444.

Utilización de indicadoresLos indicadores definidos como de identificación de registro, de campo,resultantes, *IN, *IN(xx) o *INxx se puede utilizar para condicionar archivos,operaciones de cálculo u operaciones de salida. Un indicador debe definirse antesde que se utilice como indicador de condicionamiento. Su estado /(activado odesactivado) no resulta afectado cuando se utiliza como indicador decondicionamiento. El estado se puede cambiar definiendo el indicador de modoque represente a una condición determinada.

Indicadores de relación de registros de camposLos indicadores de relación de registros de campos se especifican en las posiciones67 y 68 de las especificaciones de entrada. Los indicadores válidos de este tipo son01-99.

Nota: Los indicadores de relación de registros de campos no se pueden especificarpara los archivos descritos externamente.

Los indicadores de relación de registros de campos asocian campos con un tipodeterminado de registro cuando dicho tipo es uno de los indicados en una relaciónOR. El campo descrito en la línea de especificación está disponible para entradasolamente si el indicador especificado en la entrada de relación de registros decampos está activado o si la entrada está en blanco. Si la entrada está en blanco, elcampo es común a todos los tipos de registro definidos en la relación OR.

Asignación de indicadores de relación de registros de camposEspecifique un indicador de identificación de registro en las posiciones 67 y 68para relacionar un campo con un tipo de registro determinado. Cuando seespecifican varios tipos de registro en una relación OR, todos los campos que notienen un indicador de relación de registros de campos en las posiciones 67 y 68 seasocian con todos los tipos de registro de la relación OR. Para relacionar un campocon un solo tipo de registro, entre el indicador de identificación de registroasignado a dicho tipo de registro en las posiciones 67 y 68 (véase la Figura 4 en lapágina 22).

Se puede utilizar un indicador (01 a 99) que no sea de identificación de registro enlas posiciones 67 y 68 para condicionar el traslado del campo del área de entrada alos campos de entrada.

Capítulo 3. Indicadores 21

Page 44: RPG Referencia

El archivo de la Figura 4 contiene dos tipos distintos de registros: uno estáidentificado mediante un 5 en la posición 1 y el otro mediante un 6 en la mismaposición. El campo FLDC está relacionado mediante el indicador de identificaciónde registro 14 con el tipo de registro identificado por un 5 en la posición 1. Elcampo FLDD está relacionado con el tipo de registro que tiene un 6 en la posición1 mediante el indicador de identificación de registro 16. Ello significa que FLDC seencuentra solamente en un tipo de registro (el identificado mediante un 5 en laposición 1) y que FLDD sólo se encuentra en el otro tipo. FLDA está condicionadopor el indicador 07, que estaba definido previamente en otro lugar del programa.FLDB se encuentra en ambos tipos de registro, ya que no está relacionado conninguno de ellos mediante un indicador de identificación de registro.

Indicadores para el condicionamiento de cálculosLos indicadores que se utilizan para especificar las condiciones bajo las cuales serealiza un cálculo se definen en otro punto del programa. Los indicadores paracondicionar cálculos se pueden especificar en las posiciones 9 a 11.

Posicione s 7 y 8Especifique espacios en blanco, SR, AN u OR en las posiciones 7 y 8 de lasespecificaciones de cálculo. Si dichas posiciones están en blanco, el cálculo seprocesa cuando lo indique la lógica del programa mediante una sentencia de unasubrutina o una operación declarativa.

Posiciones 9-11Para especificar indicadores que controlen las condiciones bajo las cuales seprocesará una operación, especifique las posiciones 9 a 11 en las especificaciones decálculo. Si se especifica N en la posición 9, debe comprobarse el indicador para elvalor desactivado (’0’). Se pueden especificar 01-99 o LR para las posiciones 10 a11.

Los indicadores que se utilicen en las posiciones de 9 a 11 deben estar definidosanteriormente como uno de los tipos de indicadores siguientes:v Indicadores de identificación de registro (especificaciones de entrada, posiciones

21 y 22)v Indicadores de campo (especificaciones de entrada, posiciones 69 a 74)v Indicadores resultantes (especificaciones de cálculo, posiciones 71 a 76)v Matriz *IN, elemento de matriz *IN(xx) o campo *INxx. Consulte el apartado

“Indicadores referidos como datos” en la página 25 para obtener una descripciónde cómo se define un indicador cuando se utiliza con una de estas palabrasreservadas.

*...1....+....2....+....3....+....4....+....5....+....6....+....7...IFilename++Sq..RiPos1+NCCPos2+NCCPos3+NCC................................I........................Fmt+SPFrom+To+++DcField+++++++++....FrPlMnZr....IREPORT AA 14 1 C5I OR 16 1 C6I 20 30 FLDBI 2 10 FLDA 07I*I* El indicador 07 se ha especificado en otro punto del programa.I*I 40 50 FLDC 14I 60 70 FLDD 16

Figura 4. Relación de registros de campos

22 VisualAge RPG Consulta del lenguaje

Page 45: RPG Referencia

Si es necesario que el indicador esté desactivado para condicionar la operación,coloque una N en la posición 9. Los indicadores de las líneas AND/OR agrupadasdeben ser exactamente iguales que los especificados antes de efectuar la operación.

En la Figura 5 y en la Figura 6 se muestran ejemplos de indicadores decondicionamiento.

*...1....+....2....+....3....+....4....+....5....+....6....+....7...IFilename++Sq..RiPos1NCCPos2NCCPos3NCC.PFromTo++DField+L1M1FrPlMnZr...*I........................Fmt+SPFrom+To+++DcField+++++++++....FrPlMnZr....I*I* Los indicadores de campo se pueden utilizar para condicionar ope-I* raciones. Suponga que el programa ha de calcular el sueldo semanalI* incluidas las horas extras. El campo de horas extras se compruebaI* para determinar si se ha entrado la cantidad de horas. Si elI* empleado ha trabajado horas extras, el campo es positivo y elI* indicador 10 se activa. En todos los casos se calcula el sueldoI* semanal normal. Sin embargo, la parte correspondiente a lasI* horas extras sólo se suma si el indicador 10 está activado.I*ITIME AB 01I 1 7 EMPLNOI 8 10 0OVERTM 10I 15 20 2RATEI 21 25 2RATEOTCSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++++C*C* El indicador de campo 10 se ha asignado en las especificaciones deC* entrada. Aquí se usa para condicionar las operaciones de cálculo.C*C EVAL (H) PAY = RATE * 40C 10 EVAL (H) PAY = PAY + (OVERTM * RATEOT)

Figura 5. Condicionamiento de operaciones (Indicadores de campos)

*...1....+....2....+....3....+....4....+....5....+....6....+....7...IFilename++Sq..RiPos1+NCCPos2+NCCPos3+NCC................................I........................Fmt+SPFrom+To+++DcField+++++++++....FrPlMnZr....I*I* Se usa un indicador de identificación de registro para condicionarI* una operación. Cuando se lee un registro con una T en la posición 1,I* se activa el indicador 01. Si este indicador está activado, el campoI* SAVE se suma a SUM. Cuando se lee un registro sin una T en la posiciónI* 1, se activa el indicador 02. Se efectúa la operación de resta,I* condicionada por 02, en lugar de la operación de suma.I*IFILE AA 01 1 CTI OR 02 1NCTI 10 15 2SAVECSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq..C*C* Los indicadores de identificación de registro 01 y 02 se asignan enC* las especificaciones de entrada. Aquí se usan para condicionarC* operaciones de cálculo.C*CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq..C 01 ADD SAVE SUM 8 2C 02 SUB SAVE SUM 8 2

Figura 6. Operaciones de condicionamiento (Indicadores de identificación de registros)

Capítulo 3. Indicadores 23

Page 46: RPG Referencia

Indicadores utilizados en expresionesLos indicadores pueden utilizarse como booleanos en expresiones en el campofactor 2 ampliado de la especificación de cálculo. Se les hace referencia como adatos (es decir, utilizando *IN o *INxx). En la Figura 7 puede ver un ejemplo.

En el apartado “Capítulo 24. Expresiones” en la página 351 y “EVAL (Evaluarexpresión)” en la página 446 hallará más información.

Indicadores de condicionamiento de salidaLos indicadores utilizados para especificar las condiciones bajo las cuales se grabaun registro de salida o un campo de salida deben estar definidos anteriormente.Los indicadores para condicionar la salida se especifican en las posiciones 21 a 29.Todos los indicadores son válidos para condicionar la salida.

Los indicadores que se utilicen para condicionar la salida deben estar definidospreviamente como pertenecientes a uno de los tipos siguientes de indicadores:v Indicadores de identificación de registro (especificaciones de entrada, posiciones

21 y 22)v Indicadores establecidos por el programa VisualAge RPG, como 01 a 99v Matriz *IN, elemento de matriz *IN(xx) o campo *INxx.

Si un indicador condiciona un registro completo, entre el indicador en la línea queespecifica el tipo de registro. Si condiciona cuándo se graba un campo, éntrelo enla misma línea que el nombre del campo.

Los indicadores de salida no son necesarios en las líneas de salida. Si no se hanespecificado indicadores de condicionamiento, la línea aparece en la salida cadavez que se comprueba la salida de ese tipo de registro. Si se especificanindicadores de condicionamiento, se puede entrar un indicador en cada uno de lostres campos de indicador de salida distintos (posiciones 22 y 23, 25 y 26, y 28 y29). Si estos indicadores están activados, se efectúa la operación de salida. Una Nen la posición anterior a cada indicador (posiciones 21, 24 ó 27) significa que laoperación de salida sólo se realiza si el indicador no está activado (indicadornegativo). Ninguna de las líneas de salida debe estar condicionada por indicadoresnegativos únicamente; al menos uno de ellos debe ser positivo.

Los indicadores de salida se pueden especificar en una relación AND/ORindicando AND/OR en las posiciones 16 a 18. Puede utilizarse un númeroilimitado de líneas AND/OR. Las líneas AND/OR se pueden utilizar paracondicionar los registros de salida, pero no campos. Sin embargo, un campo se

CSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++++C* En estos ejemplos, la estructura IF se efectúa sólo si 01 estáC* activado. *IN01 se trata como booleano con un valor de activado oC* desactivado.C* En el primer ejemplo, el valor del indicador ('0' o '1') seC* comprueba.C IF *IN01C* En el segundo ejemplo, la expresión lógica B < A se evalúa.C* Si es cierta, se activa 01. Si es falsa, 01 se desactiva. EsC* lo mismo que utilizar COMP con A y B y colocar 01 en laC* posición de indicador resultante adecuada.C EVAL *IN01 = B < A

Figura 7. Indicadores utilizados en expresiones

24 VisualAge RPG Consulta del lenguaje

Page 47: RPG Referencia

puede condicionar con más de tres indicadores utilizando la operación EVAL enlos cálculos. En la Figura 8 puede ver un ejemplo.

Indicadores referidos como datosOtro modo de hacer referencia y manipular indicadores es utilizando las palabrasreservadas *IN e *INxx.

*INLa matriz *IN es una matriz predefinida de 99 elementos de caracteres de unaposición que representa a los indicadores 01 a 99. Los elementos de esta matrizdeben contener solamente los valores de carácter '0' (cero) o '1' (uno).

La especificación de la matriz *IN o del elemento de matriz de índice variable*IN(xx) como campo de un registro de entrada, como campo de resultado o comofactor 1 de una operación PARM define los indicadores 01 a 99 para utilizarlos enel programa.

Las operaciones o referencias válidas para una matriz de elementos de un solocarácter son válidas con la matriz *IN, con la excepción de que la matriz *IN no sepuede especificar como subcampo en una estructura de datos ni como campo deresultado de una operación PARM.

*INxxEl campo *INxx es un campo predefinido de caracteres de una posición; xxrepresenta cualquier indicador.

La especificación del campo *INxx o del elemento de matriz de índice fijo *IN(n)(siendo n = 1 a 99) como campo en un registro de entrada, como campo deresultado o como factor 1 de una operación PARM define el indicadorcorrespondiente para su utilización en el programa.

Especifique *INxx siempre que un campo de caracteres de una posición sea válido.*INxx no se puede especificar como subcampo de una estructura de datos, comocampo de resultado de una operación PARM ni en una operación SORTA.

Reglas para la especificación de indicadores referidos comodatos

Las normas siguientes se aplican a *IN, al elemento de matriz *IN(xx) o al campo*INxx:

CSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++++C* El indicador 20 sólo se activa si los indicadores 10, 12, 14, 16 y 18C* están activados.C EVAL *IN20 = *IN10 AND *IN12 AND *IN14C AND *IN16 AND *IN18C EXCPTOFilename++EAddN01N02N03Excnam++++.......................................O..............N01N02N03Field+++++++++YB.End++PConstant/editword/DTformatO* OUTFIELD está condicionado por el indicador 20, lo que significaO* que está condicionado por todos los indicadores de la operaciónO* EVAL.OPRINTER EO 20 OUTFIELD

Figura 8. Utilización de EVAL con indicadores

Capítulo 3. Indicadores 25

Page 48: RPG Referencia

v Si se traslada un carácter '0' (cero) u *OFF a uno de estos campos, el indicadorcorrespondiente se desactiva.

v Si se traslada un carácter '1' (uno) u *ON a uno de estos campos, el indicadorcorrespondiente se activa.

v No debe trasladarse ningún valor, excepto '0' (cero) o '1' (uno), a *INxx.

Vea en la Figura 9 un ejemplo de los indicadores a los que se hace referencia comoa datos.

*...1....+....2....+....3....+....4....+....5....+....6....+....7...CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq..C*C* Cuando se llama a este programa, se pasa un solo parámetro paraC* controlar parte de la lógica del programa. Este parámetro defineC* el valor del indicador 50. Debe pasarse con un valor deC* carácter de 1 ó 0.C*C *ENTRY PLISTC *IN50 PARM SWITCH 1C*C*C* La subrutina SUB1 utiliza los indicadores 61 a 68. Antes deC* procesar la subrutina, el estado de estos indicadores utilizadosC* en el programa principal (se presupone que los indicadores estánC* desactivados al principio de la subrutina). Una vez que la subrutinaC* se haya procesado, los indicadores vuelven a tomar su estado original.C*C*C MOVEA *IN(61) SAV8 8C EXSR SUB1C MOVEA SAV8 *IN(61)C*C* Un campo de código (CODE) contiene un valor numérico de 1 a 5 y seC* usa para establecer los indicadores 71 a 75. Los cinco indicadoresC* están desactivados. El campo X se calcula como la suma de 70 más elC* campo CODE. Después se utiliza como índice de la matriz *IN.C* A continuación se utilizarán distintas subrutinas según el estadoC* de los indicadores 71 a 75.C*C MOVEA '00000' *IN(71)C 70 ADD CODE X 3 0C MOVE *ON *IN(X)C 71 EXSR CODE1C 72 EXSR CODE2C 73 EXSR CODE3C 74 EXSR CODE4C 75 EXSR CODE5

Figura 9. Ejemplos de indicadores referidos como datos

26 VisualAge RPG Consulta del lenguaje

Page 49: RPG Referencia

Resumen de indicadoresTabla 4. Cuándo se activan y desactivan los indicadores

Tipo deindicador

Se activa Se desactiva

De identificaciónde registro

Inmediatamente de leer el registro Lo desactiva el programador

De indicador decampo

Mediante un espacio en blanco oun cero en los camposespecificados, mediante un signomás o un signo menos en el campoespecificado.

Antes de que el estado de estecampo se vuelva a comprobar.

Resultante Cuando el cálculo se procesa y lacondición a la que representa elindicador se cumple.

La vez siguiente que se procesa uncálculo para el cual se haespecificado el mismo indicadorcomo indicador resultante y lacondición especificada no secumple.

LR Lo desactiva el programador. Lo desactiva el programador.

Capítulo 3. Indicadores 27

Page 50: RPG Referencia

28 VisualAge RPG Consulta del lenguaje

Page 51: RPG Referencia

Capítulo 4. Trabajar con componentes lógicos

De una compilación puede surgir un objeto destino de tres tipos posibles. Elresultado depende de la palabra clave de especificación de control que se utiliza:v Cuando las palabras clave NOMAIN y EXE no están presentes, se crea un

componente lógico.v Cuando se especifica la palabra clave NOMAIN, se crea un programa de

utilidad DLL o NOMAIN. Esta DLL contiene solamente subprocedimientos RPG.v Cuando se especifica la palabra clave EXE, se crea un RPG EXE. Este módulo

contiene un procedimiento principal y subprocedimientos.

En este apartado se describe cómo iniciar y detener y cómo inicializar y terminarlos componentes lógicos. Para tener una visión general sobre cómo crear y utilizarlas DLL de NOMAIN y los EXE, consulte el capítulo 6, “Capítulo 6.Subprocedimientos y prototipos” en la página 59.

Iniciar y detener componentes lógicosLos códigos de operación START y STOP le permite ejecutar múltiplescomponentes lógicos en una aplicación. La operación START inicia un nuevocomponente lógico en una aplicación. La operación STOP interrumpe la ejecuciónde un componente lógico.

Para obtener más información sobre estos códigos de operación, consulte losapartados “START (Iniciar un componente lógico o Llamar a programa local)” en lapágina 541 y “STOP (Detener un componente lógico)” en la página 542.

Inicializar componentes lógicosUna aplicación VisualAge RPG puede constar de uno o más componentes lógicos.Cada componente lógico se inicia de forma independiente. El primer componentelógico (primario) se inicia al ejecutar la aplicación. Todos los componentes lógicosposteriores (secundarios) son iniciados por el usuario o por el programa en funciónde los eventos que se producen y las subrutinas de acción que manejan loseventos. Los componentes lógicos secundarios se pueden iniciar en cualquierorden.

El archivo EXE de la aplicación invoca al componente lógico primario. Desde lalínea de mandatos es posible pasar los parámetros a este componente lógico. Todoslos parámetros se convierten desde la serie de caracteres entrada en el tipo dedatos de destino de los parámetros en la *ENTRY PLIST.

Los componentes lógicos secundarios son invocados mediante el código deoperación START desde el componente lógicos primario o desde otroscomponentes lógicos secundarios. Mediante los códigos de operación PARM yPLIST se pueden pasar los parámetros a los componentes lógicos secundarios.Cuando se trata de un componente lógico secundario, los parámetros no seconvierten.

Una vez un componente lógico ha recibido cualquier parámetro, ocurre losiguiente:1. Los campos de programa son inicializados.

© Copyright IBM Corp. 1994, 2000 29

Page 52: RPG Referencia

2. Se abren los archivos y se cargan las estructuras de datos, las tablas y lasmatrices de pre-ejecución.

3. En los parámetros *ENTRY PLIST, el campo del resultado se mueve al factor 1.4. Si se especifica una subrutina de inicialización de usuario (*INZSR), ésta se

ejecuta. La mayor parte de operaciones relacionadas con los componentes yeventos de los componentes lógicos no funcionarán en este momento puestoque el entorno de ejecución del componente lógico no ha sido inicializado.

5. En los parámetros *ENTRY PLIST, el factor 2 se copia en el campo delresultado.

6. Se guardan las estructuras de datos y las variables que la operación RESETutilizará.

7. Se inicializa el entorno de ejecución del componente lógico.8. Si las subrutinas de acción han sido grabadas para ellos, se maneja un conjunto

inicial de eventos en el conjunto inicial de ventanas y sus componentes. Porejemplo, cualquier ventana y sus componentes que tengan atributos dearranque que especifiquen ″Abrir inmediatamente″ producen un eventoCREATE. Todos los eventos generados durante la ejecución de dichassubrutinas de acción también invocan a cualquier subrutina de acción escritapara ellos en ese momento.

Una vez completada la inicialización de un componente, la aplicación puededisponer de los componentes de los componentes lógicos. El usuario final puedegenerar eventos para invocar a la subrutina de acción en cualquier de loscomponentes lógicos abiertos ahora.

En algunos casos, durante la inicialización de la aplicación, no se permiten algunoscódigos de operación, atributos y el manejador de excepciones por omisión. Porejemplo, no puede obtener un atributo de un componente antes de que elcomponente haya sido creado. Para obtener más información, consulte la Tabla 5 enla página 32, la Tabla 6 en la página 34, la Tabla 7 en la página 34 y la Tabla 8 en lapágina 36.

Terminar componentes lógicosLos componentes lógicos se terminan al finalizar el componente lógico primario oal finalizar un componente lógico que ha iniciado uno o más componentes lógicos.Cuando se terminan múltiples componentes lógicos, éstos se terminan por ordenjerárquico inverso. Cada componente lógico tiene su *TERMSR llamado(terminación normal) por orden jerárquico inverso. Todos los componentes lógicos,por turno, atraviesan el borrado y la terminación (por ejemplo, al cerrar archivos).

Cuando un componente lógico finaliza de modo anormal en una aplicación demúltiples componentes lógicos, únicamente dicho componente lógico finalizaanormalmente. El resto de componentes lógicos que también finalizan, lo hacen deforma normal.

Terminación normalUn componente lógico termina de forma normal en las siguientes situaciones:v Si LR está activado al alcanzar ENDACT en la subrutina de acción de raíz o si se

ejecuta RETURN desde la subrutina de acción de raíz.La subrutina de acción de raíz es la subrutina de la parte inferior (o primera) decualquier subrutina de acción jerarquizada. Las subrutinas de acciónjerarquizadas se producen cuando un evento invoca a una subrutina de acciónnueva mientras se ejecuta otra subrutina de acción.

30 VisualAge RPG Consulta del lenguaje

Page 53: RPG Referencia

Por ejemplo, la subrutina de acción BUTTON+CLICK+WINDOW1 contiene laoperación ’window2″ SHOWWIN. Esto causa un evento CREATE que invoca ala subrutina de acción WINDOW2+CREATE+WINDOW2. Si se produce otroevento mientras se maneja el evento CREATE, (por ejemplo, ’WINDOWX’SETATR 1 ’FOCUS’), entonces se suspende la subrutina de acciónWINDOW2+CREATE+WINDOW2 y se invoca la subrutina de acciónWINDOWX+FOCUS+WINDOWX. La pila de llamadas incluye las siguientessubrutinas de acción jerarquizadas:

1. FIELD1+FOCUS+WINDOWX2. WINDOW2+CREATE+WINDOW23. BUTTON+CLICK+WINDOW1 (subrutina de acción raíz)

LR no se comprueba hasta que:1. La subrutina de acción WINDOWX+FOCUS+WINDOWX finaliza2. La subrutina de acción WINDOW2+CREATE+WINDOW2 finaliza3. La operación ENDACT o RETURN se realiza para la subrutina de acción

BUTTON+CLICK+WINDOW1.v Si STOP se realiza en el componente lógico. Para obtener más información,

consulte el apartado “STOP (Detener un componente lógico)” en la página 542.v Si *PSSR se ejecuta y finaliza de una de las siguientes maneras:

– ENDSR ’*DEFAULT’ o un nombre de campo equivalente. El indicador LR estáactivado al final de la subrutina de acción de raíz.

– ENDSR ’*NODEFAULT’ o un nombre de campo equivalente. El indicador LRestá activado al final de la subrutina de acción de raíz.

Para obtener más información consulte los apartados “ENDSR (Fin de subrutinade usuario)” en la página 445 y “Excepciones/errores de componente lógico” enla página 55.

v Si el manejador de excepciones por omisión presenta la ventana de informaciónde mensajes y se realiza una de las siguientes opciones:– Realizar el proceso por omisión y el indicador LR está activado al final de la

subrutina de acción de raíz– No realizar el proceso por omisión y el indicador LR está activado al final de

la subrutina de acción de raíz

Para obtener más información, consulte el apartado “Excepciones/errores decomponente lógico” en la página 55.

Esto es lo que ocurre en una terminación normal:v Si *TERMSR existe, se ejecutav Se escriben los archivos, las tablas y matrices de pre-ejecución y las estructuras

de datos de las áreas de datosv Se cierran todos los archivosv Se desbloquean todas las áreas de datos

*TERMSR es una subrutina escrita por el usuario en la que puede producirsecualquier ejecución de código final. Cuando *TERMSR es invocado, ningunasubrutina de acción está activa y el componente lógico actual ha sido marcadocomo que se está terminando. Esto significa que hay pocas operaciones de interfazgráfica de usuario permitidas. Consulte la Tabla 5 en la página 32, la Tabla 6 en lapágina 34, la Tabla 7 en la página 34 y la Tabla 8 en la página 36.

Consulte el apartado “Códigos de estado de componente lógico” en la página 55para obtener una lista de los valores de estado en la terminación normal decomponentes lógicos.

Capítulo 4. Trabajar con componentes lógicos 31

Page 54: RPG Referencia

Terminación anormalUn componente lógico termina de forma anormal si se produce una de lassiguientes situaciones:v El *PSSR se ejecuta y finaliza de una de las siguientes maneras:

– ENDSR ’*ENDCOMP’, ENDSR ’*CANCL’ o un nombre de campo equivalente– ENDSR ’*ENDAPPL’ o un nombre de campo equivalente

v El manejador de excepciones por omisión presente la ventana de información demensajes y se elige una de las siguientes opciones:– Terminar el componente lógico– Terminar la aplicación

v Un condición anormal se produce en la GUI durante la ejecución.

Esto es lo que ocurre en una terminación anormal:v Se cierran todos los archivosv Se desbloquean todas las áreas de datos.

Nota: *TERMSR no es llamado para la terminación anormal.

Inicializar, terminar y restricciones de manejo de eventosEn algunos casos, en alguna fase de la aplicación, no se permiten algunos códigosde operación, atributos y el manejador de excepciones por omisión. En lassiguientes tablas se describen algunas restricciones durante la inicialización, laterminación o el manejo de eventos normales.

Tabla 5. Restricciones de códigos de operación durante la inicialización, la terminación y elmanejo de eventos

Operación de GUI Inicialización(*INZSR)

Terminación(*TERMSR)

Manejo de eventos

CLSWIN No permitida No permitida Sin restricciones

DSPLY Sin restricciones No permitida La ventana deinformación que sevisualiza interfierecon cualquier eventoque haya sidoenviado. Si se ejecutala operación DSPLYdesde la mismasubrutina o desdeuna subrutina deacción jerarquizadadespués de llevar acabo una operaciónCLSWIN o STOP(por ejemplo, loseventos CloseWindow o CloseComponent todavíaestán pendientes), laoperación DSPLYrecibe los eventospendientes pero nose ejecutan.

32 VisualAge RPG Consulta del lenguaje

Page 55: RPG Referencia

Tabla 5. Restricciones de códigos de operación durante la inicialización, la terminación y elmanejo de eventos (continuación)

Operación de GUI Inicialización(*INZSR)

Terminación(*TERMSR)

Manejo de eventos

SHOWWIN No permitida No permitida No se puede ejecutarel mismo código deoperación diversasveces desde dentrode la mismasubrutina de acción osubrutina de acciónjerarquizada. Porejemplo, unasubrutina de accióncontiene:

SHOWWIN 'WIN1'CLSWIN 'WIN1'SHOWWIN 'WIN1'

En este caso, elsegundo SHOWWINfalla.

START Sin restricciones Sin restricciones No se puede ejecutarel mismo código deoperación diversasveces desde dentrode la mismasubrutina de acción osubrutina de acciónjerarquizada. Porejemplo, unasubrutina de accióncontiene:

START 'COMP2'STOP 'COMP2'STOP 'COMP2'

En este caso, elsegundo STOP falla.

STOP ’self’ No permitida No permitida No se puede finalizarun componentelógico desde unasubrutina de acciónjerarquizada.

STOP ’other’ No es posiblefinalizar elcomponente lógicopadre

No es posiblefinalizar elcomponente lógicopadre

No se puede finalizarun componentelógico desde unasubrutina de acciónjerarquizada.

Capítulo 4. Trabajar con componentes lógicos 33

Page 56: RPG Referencia

Tabla 6. Restricciones de atributos durante la inicialización, terminación y el manejo deeventos

Atributo Inicialización(*INZSR)

Terminación(*TERMSR)

Manejo de eventos

Atributos decomponente

(GETATR, SETATR,%GETATR,%SETATR)

No permitida No permitida Sin restricciones

Atributos de evento

(%PART, ...)

No permitida No permitida Sin restricciones

Atributos de sistema

(%DSPWIDTH,%DSPHEIGHT)

No permitida No permitida Sin restricciones

Tabla 7. Restricciones del manejador de excepciones por omisión durante la inicialización,terminación y el manejo de eventos

Atributo Inicialización(*INZSR)

Terminación(*TERMSR)

Manejo de eventos

Ventana deinformación demensajes,

Realizar el procesopor omisión

Sin restricciones Se termina elcomponente lógico yse visualiza unaventana deinformaciónasíncrona.

La ventana deinformación que sevisualiza interfierecon cualquier eventoque haya sidoenviado. Si estaoperación se realizadesde la mismasubrutina o subrutinade acciónjerarquizada despuésde efectuar unaoperación CLSWIN oSTOP (por ejemplo,los eventos CloseWindow o CloseComponent todavíaestán pendientes),esta operación recibelos eventospendientes y no sellevan a cabo.

34 VisualAge RPG Consulta del lenguaje

Page 57: RPG Referencia

Tabla 7. Restricciones del manejador de excepciones por omisión durante la inicialización,terminación y el manejo de eventos (continuación)

Atributo Inicialización(*INZSR)

Terminación(*TERMSR)

Manejo de eventos

Ventana deinformación demensajes,

No realizar procesopor omisión

Sin restricciones Se termina elcomponente lógico yse visualiza unaventana deinformaciónasíncrona.

La ventana deinformación que sevisualiza interfierecon cualquier eventoque haya sidoenviado. Si estaoperación se realizadesde la mismasubrutina o subrutinade acciónjerarquizada despuésde efectuar unaoperación CLSWIN oSTOP (por ejemplo,los eventos CloseWindow o CloseComponent todavíaestán pendientes),esta operación recibelos eventospendientes y no sellevan a cabo.

Ventana deinformación demensajes,

Terminar componentelógico

Sin restricciones Se termina elcomponente lógico yse visualiza unaventana deinformaciónasíncrona.

No se puede finalizarun componentelógico desde unasubrutina de acciónjerarquizada. Laventana deinformación que sevisualiza interfierecon cualquier eventoque haya sidoenviado. Si estaoperación se realizadesde la mismasubrutina o subrutinade acciónjerarquizada despuésde efectuar unaoperación CLSWIN oSTOP (por ejemplo,los eventos CloseWindow o CloseComponent todavíaestán pendientes),esta operación recibelos eventospendientes y no sellevan a cabo.

Capítulo 4. Trabajar con componentes lógicos 35

Page 58: RPG Referencia

Tabla 7. Restricciones del manejador de excepciones por omisión durante la inicialización,terminación y el manejo de eventos (continuación)

Atributo Inicialización(*INZSR)

Terminación(*TERMSR)

Manejo de eventos

Ventana deinformación demensajes,

Terminar aplicación

Sin restricciones Se termina elcomponente lógico yse visualiza unaventana deinformaciónasíncrona.

La ventana deinformación que sevisualiza interfierecon cualquier eventoque haya sidoenviado. Si estaoperación se realizadesde la mismasubrutina o subrutinade acciónjerarquizada despuésde efectuar unaoperación CLSWIN oSTOP (por ejemplo,los eventos CloseWindow o CloseComponent todavíaestán pendientes),esta operación recibelos eventospendientes y no sellevan a cabo.

Tabla 8. Restricciones para finalizar componentes lógicos durante la inicialización,terminación y el manejo de eventos

Finalizar uncomponente lógico

Inicialización(*INZSR)

Terminación(*TERMSR)

Manejo de eventos

*PSSR BEGSR..

ENDSR ’*DEFAULT’

Sin restricciones Sin restricciones Sin restricciones

*PSSR BEGSR..

ENDSR’*NODEFAULT’

Sin restricciones Sin restricciones Sin restricciones

*PSSR BEGSR..

ENDSR’*ENDCOMP’ o

ENDSR ’*CANCL’

Sin restricciones Sin restricciones No se puede finalizarun componentelógico desde unasubrutina de acciónjerarquizada.

*PSSR BEGSR..

ENDSR ’*ENDAPPL’

Sin restricciones Sin restricciones No se puede finalizarun componentelógico desde unasubrutina de acciónjerarquizada.

36 VisualAge RPG Consulta del lenguaje

Page 59: RPG Referencia

Capítulo 5. Manejo de excepciones y errores

Los excepciones/errores se incluyen dentro de dos clases: de programa y dearchivo. En un programa VARPG la información sobre las excepciones/errores dearchivo y de programa está disponible mediante la utilización de estructuras dedatos de información de archivo y estructuras de datos de estado de programa,respectivamente. Se pueden especificar las subrutinas de excepción/error dearchivo y de programa para manejar estos tipos de excepciones/errores. En esteapartado se describe el manejo de errores y excepciones en los archivos, programasy componentes lógicos.

Excepciones/errores de archivoEstos son algunos ejemplos de excepciones/errores de archivo: tipo de registro nodefinido, un error en el programa activador, una operación de E/S a un archivocerrado, un error de dispositivo y un error de secuencia de carga matriz/tabla.Estas excepciones/errores se pueden manejar de una de las siguientes maneras:v Se puede especificar el ampliador de código de operación ’E’. Una vez

especificado, y antes de empezar la operación, este ampliador establece lasfunciones incorporadas %ERROR y %STATUS para que vuelvan a cero. Si seproduce una excepción/error durante la operación, después de la operación%ERROR devuelve ’1’ y %STATUS devuelve el estado del archivo. La estructurade datos de información de archivo opcional se actualiza con la información deexcepción/error. Comprobando %ERROR y %STATUS podrá determinar laacción que efectuará.

v Se puede especificar un indicador en las posiciones 73 y 74 de lasespecificaciones de cálculo para un código de operación. Este indicador se activasi se produce una excepción/error durante el proceso de la operaciónespecificada. La estructura de datos de información de archivo opcional seactualiza con la información de excepción/error. Comprobando el indicadorpodrá determinar la acción que emprenderá.

v Se puede especificar una subrutina de excepción/error de archivo. En unaespecificación de descripción de archivo, la palabra clave INFSR define lasubrutina con el nombre de la subrutina que va a recibir el control. Lainformación referente a la excepción/error de archivo está disponible mediantela estructura de datos de información de archivo que se especifica con la palabraclave INFDS en la especificación de descripción de archivo. También puedeutilizar la función incorporada %STATUS que devuelve el valor más recientepara el estado del archivo o programa. Si se especifica un archivo, %STATUSdevuelve el valor contenido en el campo INFDS *STATUS para el archivoespecificado.

v Si el indicador, el ampliador ’E’o la subrutina de excepción/error de archivo noestán presentes, el gestor de errores por omisión de VisualAge RPG manejatodas las excepciones/errores de archivo.

Estructura de datos de información de archivoLa estructura de datos de información de archivo proporciona la información paralos errores de archivo. La estructura de datos de información de archivo (INFDS)puede definirse para que todos los archivos pongan a disposición del programa lainformación de retorno del archivo, del error y de la excepción de archivo. Estaestructura de datos debe ser exclusiva para cada archivo. Contiene la siguienteinformación de retorno:

© Copyright IBM Corp. 1994, 2000 37

Page 60: RPG Referencia

v Información de retorno de archivo (posiciones de 1 a 80)v Información de retorno de apertura (posiciones de 81 a 240)v Información de retorno de entrada/salida (posiciones de 41 a 366)v Información de retorno dependiente de dispositivo (posición 367)

Nota: La longitud de la INFDS depende de los campos que haya declarado en laINFDS.

Información de retorno de archivoLa información de retorno de archivo empieza en la posición 1 y finaliza en laposición 80 de la INFDS. Contiene los datos sobre el archivo que son específicospara el programa de VisualAge RPG, incluido:v El nombre del archivo en el que se produjo la excepción o el errorv El registro que se estaba procesando cuando se produjo la excepción o el error o

bien el registro que causó la excepción o el errorv La última operación que se procesaba cuando se produjo la excepción o el errorv El código de estadov La rutina donde se produjo la excepción o el error

Nota: No es recomendable escribir encima de la sección de retorno de archivo yaque puede producir resultados inesperados en la ulterior manejo de errores.

Palabras clave especiales definen la ubicación de algunos de los campos utilizadosmás a menudo en la sección de retorno del archivo. La Tabla 9 ofrece un resumende estas palabras clave.

Tabla 9. Información de retorno de archivo en la INFDS

De(Pos.26-32)

A(Pos.33-39)

Formato Lon-gitud

Palabra clave Información

1 8 Carácter 8 *FILE Los 8 primeros caracteres delnombre de archivo

9 9 Carácter 1 Indicación de apertura (1 = abrir)

10 10 Carácter 1 Fin de archivo (1 = fin de archivo)

11 15 Decimal conzona

5.0 *STATUS Código de estado. Consulte elapartado “Códigos de estado dearchivo” en la página 46.

38 VisualAge RPG Consulta del lenguaje

Page 61: RPG Referencia

Tabla 9. Información de retorno de archivo en la INFDS (continuación)

De(Pos.26-32)

A(Pos.33-39)

Formato Lon-gitud

Palabra clave Información

16 21 Carácter 6 *OPCODE Código de operación. Las cincoprimeras posiciones (ajustadas a laizquierda) especifican el tipo deoperación utilizando larepresentación de caracteres de loscódigos de operación de cálculo.Por ejemplo, si se procesaba unREADE, READE se coloca en lascinco posiciones situadas más a laizquierda.

Los códigos de operación quetienen nombres de 6 letras debenacortarse a 5 letras.

DELETEDELET

EXCEPTEXCPT

READPEREDPE

UNLOCKUNLCK

UPDATEUPDAT

La posición restante contiene unode los siguientes valores:

F La última operación seespecificó para unnombre de archivo.

R La última operación seespecificó para unregistro.

I La última operación erauna operación de archivoimplícita.

22 29 Carácter 8 *ROUTINE Los primeros 8 caracteres delnombre de procedimiento o cero sila llamada es mediante el punterode procedimiento

30 37 Carácter 8 Número de línea de listado fuente

38 42 Decimal conzona

5.0 Razón especificada por el usuariopara el error en el archivoSPECIAL

Capítulo 5. Manejo de excepciones y errores 39

Page 62: RPG Referencia

Tabla 9. Información de retorno de archivo en la INFDS (continuación)

De(Pos.26-32)

A(Pos.33-39)

Formato Lon-gitud

Palabra clave Información

38 45 Carácter 8 *RECORD En un archivo descrito por elprograma el registro que identificaal indicador está situado lo más ala izquierda del campo; las seisposiciones restantes tienenespacios en blanco.

En un archivo descritoexternamente, los 8 primeroscaracteres del nombre del registroque se estaba procesando cuandose produjo la excepción o el error.

46 52 Carácter 7 Número de mensaje del sistema omáquina

53 66 Carácter 14 No utilizado

Si desea obtener una descripción completa del contenido del área de informaciónde retorno de archivo, consulte el apartado DB2® Universal Database™ para AS/400de la categoría Bases de datos y sistemas de archivo de Information Center, que sehalla en el sitio Web siguiente -http://publib.boulder.ibm.com/pubs/html/as400/infocenter.htm.

Ejemplo de información de retorno de archivo de la INFDS: Para definir unaINFDS que contiene campos en la sección de retorno de archivo, especifique lasentradas siguientes:v Especifique la palabra clave INFDS en la especificación de descripción de

archivo con el nombre de la estructura de datos de información de archivov Especifique la estructura de datos de información de archivo y los subcampos

que desea utilizar en una especificación de definiciónv Especifique las palabras clave especiales ajustadas a la izquierda, en el campo

DESDE (posiciones 26-32) en la especificación de definición o bien especifiquelas posiciones de los campos en el DESDE (posiciones 26-32) y el campo A(posiciones 33-39).

FFilename++IT.A.FRlen+......A.Device+.Keywords+++++++++++++++++++++++++++++Comments++++++++++FMYFILE IF E DISK INFDS(FILEFBK) REMOTEDName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++Comments++++++++++DFILEFBK DSD FILE *FILE * Nombre archivoD OPEN_IND 9 9 * Apertura archivo?D EOF_IND 10 10 * Archivo en eof?D STATUS *STATUS * Código estadoD OPCODE *OPCODE * Último cód.oper.D ROUTINE *ROUTINE * Rutina RPGD LIST_NUM 30 37 * Línea listadoD SPCL_STAT 38 42S 0 * Estado SPECIALD RECORD *RECORD * Nombre registroD MSGID 46 52 * Error MSGID

Figura 10. Ejemplo de codificación de una INFDS con información de retorno de archivo

40 VisualAge RPG Consulta del lenguaje

Page 63: RPG Referencia

Nota: Las palabras clave no son etiquetas y no se pueden utilizar para acceder alos subcampos. Las entradas cortas se rellenan por la derecha con espaciosen blanco.

Información de retorno de aperturaDesde la posición 81 hasta la posición 240 de la estructura de datos de informaciónde archivo se encuentra la información de retorno de apertura. El contenida de estaárea se copia en la sección de retorno de apertura siempre que el archivo asociadoa la INFDS está abierto. Esto incluye a los miembros abiertos como resultado deuna operación de lectura en un archivo procesado de múltiples miembros.

Nota: La información de retorno de apertura no se proporciona para los archivosde impresora, sin embargo sí que se proporciona la información de retornode dispositivo. En el apartado DB2 Universal Database para AS/400 de lacategoría Bases de datos y sistemas de archivos de Information Center, que sehalla en el sitio Web -http://publib.boulder.ibm.com/pubs/html/as400/infocenter.htm, encontraráuna descripción completa del contenido del área de información de retornode apertura.

Ejemplo de información de retorno de apertura de la INFDS: Para definir unaINFDS que contiene campos en la sección de retorno de apertura, especifique lasentradas siguientes:v Especifique la palabra clave INFDS en la especificación de descripción de

archivo con el nombre de la estructura de datos de información de archivov Especifique la estructura de datos de información de archivo y los subcampos

que desea utilizar en una especificación de definición.v Consulte la información dada en el apartado DB2 Universal Database para AS/400

de la categoría Bases de datos y sistemas de archivos de Information Center con elfin de determinar los campos que desea incluir en la INFDS. Para calcular lasposiciones Desde y A (posiciones de la 26 a la 32 y de la 33 a la 39 de lasespecificaciones de definición) que especifican los subcampos de la sección deretorno de apertura, utilice el desplazamiento, tipo de datos y longitud dados enInformation Center y realice los cálculos siguientes:

Desde = 81 + DesplazamientoA = Desde - 1 + Longitud_carácterLongitud_carácter = Longitud (en bytes)

Información de retorno de Entrada/SalidaLas posiciones que van desde la 241 hasta la 366 de la estructura de datos deinformación de archivo se utilizan para la información de retorno deentrada/salida. El contenido del área de retorno de entrada/salida común dearchivo se copia en la sección de retorno de entrada/salida únicamente después derealizar un POST en el archivo. Para obtener más información, consulte el apartado“POST (Anotar)” en la página 509.

Si desea obtener una descripción del contenido del área de información de retornode entrada/salida, consulte el apartado DB2 Universal Database para AS/400 de lacategoría Bases de datos y sistemas de archivos de Information Center.

Nota: La información de retorno de E/S no se proporciona para los archivos deimpresora, sin embargo sí que se proporciona la información de retornoespecífica de dispositivo.

Ejemplo de información de retorno de Entrada/Salida de la INFDS: Para definiruna INFDS que contiene campos en la sección de retorno de apertura, especifiquelas entradas siguientes:

Capítulo 5. Manejo de excepciones y errores 41

Page 64: RPG Referencia

v Especifique la palabra clave INFDS en la especificación de descripción dearchivo con el nombre de la estructura de datos de información de archivo

v Especifique la estructura de datos de información de archivo y los subcamposque desea utilizar en una especificación de definición.

v Consulte la información dada en el apartado DB2 Universal Database para AS/400de la categoría Bases de datos y sistemas de archivos de Information Center con elfin de determinar los campos que desea incluir en la INFDS. Para calcular lasposiciones Desde y A (posiciones de la 26 a la 32 y de la 33 a la 39 de lasespecificaciones de definición) que especifican los subcampos de la sección deretorno de entrada/salida, utilice el desplazamiento, tipo de datos y longituddados en Information Center y realice los cálculos siguientes:

Desde = 241 + DesplazamientoA = Desde - 1 + Longitud_carácterLongitud_carácter = Longitud (en bytes)

Por ejemplo, para la clase de dispositivo de un archivo, Information Centerindica:

Desplazamiento = 30Tipo de datos es de caracteresLongitud = 2

Por tanto,Desde = 241 + 30 = 271,A = 271 - 1 + 2 = 272.

Consulte el subcampo DEV_CLASS de la Figura 11.

Información de retorno dependiente de dispositivoLa información de retorno dependiente de dispositivo de la estructura de datos deinformación de archivo empieza en la posición 367 de la INFDS. Contieneinformación de retorno de entrada/salida especifica para una base de datos o undispositivo de impresora.

La longitud de la INFDS cuando se necesita la información de retorno dependientede dispositivo es variable y depende de si el tipo de dispositivo del archivo esvariable y de si el archivo tiene un conector de referencia o no (si es un archivoDISK).

En los archivos DISK descritos externamente, la INFDS tiene, como mínimo, lalongitud suficiente como para mantener la clave más larga del archivo queempieza en la posición 401.

FFilename++IT.A.FRlen+......A.Device+.Keywords+++++++++++++++++++++++++++++Comments++++++++++++FMYFILE IF E DISK INFDS(MYIOFBK) REMOTEDName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++Comments++++++++++DMYIOFBK DSD * 241-242 no usadasD WRITE_CNT 243 246B 0 * Escribir cuentaD READ_CNT 247 250B 0 * Leer cuentaD WRTRD_CNT 251 254B 0 * Escribir/leer cuentaD OTHER_CNT 255 258B 0 * Otras cuentas de E/SD OPERATION 260 260 * Operación actualD IO_RCD_FMT 261 270 * Nombre formato RcdD DEV_CLASS 271 272 * Clase dispositivoD IO_PGM_DEV 273 282 * Nombre dispositivo pgmD IO_RCD_LEN 283 286B 0 * Len Rcd de E/S

Figura 11. Codificar información de retorno de entrada/salida

42 VisualAge RPG Consulta del lenguaje

Page 65: RPG Referencia

El contenido del área de retorno de entrada/salida dependiente de dispositivo delarchivo se copia en la sección de retorno dependiente de dispositivo de la INFDSúnicamente después de realizar un POST en el archivo. Para obtener másinformación, consulte el apartado “POST (Anotar)” en la página 509.

Ejemplos de información de retorno dependiente de dispositivo de INFDS: Paradefinir una INFDS que contiene campos en la sección de retorno de dispositivo,especifique las entradas siguientes:v Especifique la palabra clave INFDS en la especificación de descripción de

archivo con el nombre de la estructura de datos de información de archivov Especifique la estructura de datos de información de archivo y los subcampos

que desea utilizar en una especificación de definiciónv Consulte la información dada en el apartado DB2 Universal Database para AS/400

de la categoría Bases de datos y sistemas de archivos de Information Center con elfin de determinar los campos que desea incluir en la INFDS. Para calcular lasposiciones Desde y A (posiciones de la 26 a la 32 y de la 33 a la 39 de lasespecificaciones de definición) que especifican los subcampos de la informaciónde retorno dependiente de dispositivo, utilice el desplazamiento, tipo de datos ylongitud dados en Information Center y realice los cálculos siguientes:

Desde = 367 + DesplazamientoA = Desde - 1 + Longitud_carácterLongitud_carácter = Longitud (en bytes)

Por ejemplo, para el número relativo de registro de un archivo de base de datos,Information Center indica:

Desplazamiento = 30Tipo de datos binariosLongitud = 4

Por tanto,Desde = 367 + 30 = 397,A = 397 - 1 + 4 = 400.

Consulte el subcampo DB_RRN en la estructura de datos DBFBK en la Figura 12.

Consideraciones de bloqueo: Los campos del área de realimentación específica deentrada/salida y, en la mayoría de casos, los campos del área de información deretorno específica de dispositivo, no se actualizan en todas las operacionesrealizadas en el archivo en el que los registros se bloquean u desbloquean, exceptoen el caso del número relativo de registro y de la clave. Esta excepción se producecuando se efectúa una operación POST. En este caso, se actualizan todos los

FFilename++IT.A.FRlen+......A.Device+.Keywords+++++++++++++++++++++++++++++Comments++++++++++FMYFILE IF E DISK INFDS(DBFBK) REMOTEDName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++Comments++++++++++DDBFBK DSD FDBK_SIZE 367 370B 0 * Tamaño de fdbk de BDD JOIN_BITS 371 374B 0 * Bits de JFILED LOCK_RCDS 377 378B 0 * Núm. reg. bloqueadosD POS_BITS 385 385 * Bits pos. de archivoD DLT_BITS 384 384 * Bits suprim. registroD NUM_KEYS 387 388B 0 * Claves numér.(bin)D KEY_LEN 393 394B 0 * Longitud claveD MBR_NUM 395 395B 0 * Número miembrosD DB_RRN 397 400B 0 * Núm.rel.registroD KEY 401 2400 * Valor clave (tamañoD * máximo 2000)

Figura 12. Ejemplo de codificación de una INFDS con información de retorno específica de base de datos

Capítulo 5. Manejo de excepciones y errores 43

Page 66: RPG Referencia

campos de las áreas de realimentación específicas de dispositivo y específicas deentrada/salida. En una operación POST, la clave y el número relativo de registro seactualizan con la información del registro actual, no el último registro del bloqueo.

Subrutina de excepción y error de archivo (INFSR)Para identificar la subrutina que recibe el control siguiendo todos los errores oexcepciones de archivo, especifique la palabra clave INFSR en la especificación dedescripción de archivo con el nombre de la subrutina. El nombre de subrutinapuede ser *PSSR, indicando que se da el control de las excepciones y errores deeste archivo a la subrutina de excepción/error de programa.

Una subrutina de excepción/error recibe el control cuando se produce unaexcepción o error en una operación de archivo que no tiene un indicadorespecificado en las posiciones 73 y 74. El código de operación EXSR también puedeejecutar la subrutina de excepción/error de archivo. En la subrutina deexcepción/error, se pueden utilizar todos los códigos de operación. El factor 1 dela operación BEGSR y el factor 2 de la operación EXSR deben contener el nombrede la subrutina que recibe el control (el mismo nombre como se especifica con lapalabra clave en las especificaciones de descripción de archivo). La operaciónENDSR debe ser la última especificación en la subrutina de excepción/error dearchivo y debe ser especificada de la siguiente manera:

Posición Entrada

6 C

7-11 Blanco

12-25 Puede contener una etiqueta que se utiliza en una especificaciónGOTO dentro de una subrutina.

26-35 ENDSR

36-49 Entrada opcional para designa donde se devolverá el controlsiguiendo el proceso de la subrutina. La entrada debe ser uncampo de caracteres, un literal o un elemento de matriz cuyo valorespecifique uno de los siguientes puntos de retorno.

Nota: Si los puntos de retorno se especifican como literales, debenir entre apóstrofos. Si se especifican como constantes connombre, las constantes deben ser caracteres y debencontener únicamente el punto de retorno sin ningún espacioen blanco delante. Si se especifican en campos o elementosde matriz, el valor debe ir ajustado a la izquierda en elcampo o elemento de matriz.

*DEFAULTDevuelve el control desde la subrutina de acción actual yse ejecuta el proceso por omisión correspondiente al eventoactual.

*NODEFAULTDevuelve el control desde la subrutina de acción actual. Nose ejecuta ningún proceso por omisión. Si LR está activadocuando el proceso alcance este punto, el componente lógicohabrá terminado y los puntos de retorno *DEFAULT y*NODEFAULT son ignorados.

*CANCLTermina el componente lógico de forma anormal.

44 VisualAge RPG Consulta del lenguaje

Page 67: RPG Referencia

*ENDAPPLTermina todos los componentes lógicos actualmente activosfinalizando la aplicación.

*ENDCOMPTermina el componente lógico de forma anormal.

BlancosDevuelve el control al gestor de errores por omisión. Estose aplica cuando el factor 2 es un valor de blancos ycuando el factor 2 no se especifica. Si la operación EXSRllama a la subrutina y el factor 2 está en blanco, el controlvuelve a la siguiente instrucción por orden. Los blancossólo son válidos durante la ejecución.

50-76 En blanco

Recuerde lo siguiente cuando especifique la subrutina de excepción/error dearchivo:v Puede llamar explícitamente a la subrutina de excepción/error de archivo

especificando el nombre de la subrutina en el factor 2 de la operación EXSR.v Una vez ejecutada la operación ENDSR de la subrutina de excepción/error de

archivo, el campo o elemento de matriz en el factor 2 se restablece en espaciosen blanco. Si no coloca un valor en este campo durante el proceso de lasubrutina, el gestor de errores por omisión recibe el proceso de seguimiento decontrol de la subrutina a menos que la operación EXSR haya llamado a lasubrutina. Debido a que el factor 2 está establecido en espacios en blanco, puedeespecificar el punto de retorno dentro de la subrutina que esté mejor adaptada ala excepción o error que se haya producido. Si la operación EXSR ha llamado ala subrutina, el control vuelve a la próxima instrucción por orden siguiendo laoperación EXSR. Una subrutina de excepción/error puede manejar errores demás de un archivo.

v Si se produce una excepción error de archivo durante el inicio o el fin de unprograma, el control pasa al gestor de errores por omisión y no a laexcepción/error escrita por el usuario o a la subrutina (INFSR).

v Puesto que la subrutina de excepción/error de archivo puede que reciba elcontrol siempre que se produzca una excepción o error de archivo, dichaexcepción o error podría producirse mientras la subrutina se está ejecutando sise procesa una operación de E/S en el archivo que tiene el error. Si se produceuna excepción/error en el archivo que ya tiene un error mientras la subrutina seestá ejecutando, se vuelve a llamar a la subrutina, con lo cual provocará unbucle de programa a menos que codifique la rutina para evitar este problema.Una manera de evitar un bucle de programa de este tipo es establecer unconmutador de primera vez en la subrutina. Si no es la primera vez que ejecutala subrutina, active el indicador LR y emita la operación RETURN de lasiguiente manera:

Capítulo 5. Manejo de excepciones y errores 45

Page 68: RPG Referencia

Nota: Puede que no pueda continuar procesando el archivo cuando se haproducido un error de E/S. Para continuar, será necesario emitir unaoperación CLOSE y, a continuación, una operación OPEN en el archivo.

Códigos de estado de archivoNingún código situado en la ubicación del subcampo *STATUS que sea mayor que99 es considerado como una excepción o error. Si el código de estado es mayor que99, el indicador de errores — si está especificado en las posiciones 73 y 74 — seactiva o la función incorporada %ERROR — si se especifica el ampliador ’E’ — seestablece para devolver ’1’. De lo contrario, la subrutina de excepciones/erroresrecibe el control. La ubicación de *STATUS se actualiza después de cada operaciónde archivo.

Puede utilizar la función incorporada %STATUS para obtener información sobreexcepciones/errores. Devuelve el valor más reciente establecido para el estado dearchivo y de programa. Si se especifica un archivo, %STATUS devuelve el valorcontenido en el campo *STATUS de la INFDS para el archivo especificado.

Las siguientes tablas son un resumen de los códigos colocados en la ubicación desubcampo *STATUS para la estructura de datos de información de archivo:

Tabla 10. Códigos normales

Código Dispositivo1 RC Condición

00000 Sin excepción/error

00011 D Fin de archivo en una lectura (entrada)

00012 D Condición sin registros encontrados en lasoperaciones CHAIN, SETLL y SETGT

00014 Registro de salida de archivo localtruncado

00015 Registro de entrada de archivo localtruncado

Nota: 1“Dispositivo” se refiere a los dispositivos a los que se aplica la condición. Seutilizan las abreviaciones siguientes: P = IMPRESORA; D = DISCO; SP = ESPECIAL

*...1....+....2....+....3....+....4....+....5....+....6....+....7...CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq..C* Si INFSR ya maneja el error, salga.C ERRRTN BEGSRC SW IFEQ '1'C SETON LRC RETURNC* De lo contrario, señale el gestor de errores.C ELSEC MOVE '1' SWC :C :C :C ENDIFC* Finalice el proceso de errores.C MOVE '0' SWC ENDSR

46 VisualAge RPG Consulta del lenguaje

Page 69: RPG Referencia

Tabla 11. Códigos de excepción/error

Código Dispositivo1 RC Condición

01011 D Tipo de registro no definido (el registro deentrada no coincide con el indicadoridentificador de registros)

01021 D Ha intentado escribir un registro que yaexiste (el archivo que se utiliza tiene clavesexclusivas y la clave está duplicada)

01022 D Error de restricción referencial detectado enel miembro de archivo

01041 n/d Error de secuencia al cargar matriz/tabla

01042 n/d Error de secuencia al cargar matriz/tabla

01051 n/d Excesivas entradas en el archivo dematriz/tabla

01211 todos Operación de E/S en un archivo cerrado

01215 todos Se ha emitido OPEN en un archivo yaabierto

012162 todos Error en una operación OPEN/CLOSEimplícita.

012172 todos Error en una operación OPEN/CLOSEexplícita.

01218 D Registro ya bloqueado

01221 D Se ha intentado operación de actualizaciónsin lectura previa

01222 D Imposible asignar el registro debido a unerror de restricción referencial

01231 SP Error en archivo SPECIAL

01235 P Error en las entradas de espacio y salto dePRTCTL

01299 D,P Otro error de E/S detectado. En losarchivos locales, este mensaje contiene unode los siguientes identificadores:v *LF0001: No se pudo abrir el archivov *LF0002: No se pudo cerrar el archivov *LF0003: Resultado de E/S inesperadov *LF0004: No se pudo establecer puntero

de archivov *LF0005: La lectura ha falladov *LF0006: La escritura ha falladov *LF0007: No se pudo determinar el

tamaño del archivov *LF0008: No se pudo ajustar el tamaño

del archivov *LF0009: No se pudo copiar el archivov *LF0010: No se pudo suprimir el archivov *LF0011: El archivo designado como

local durante la compilación haresultado ser un archivo remoto durantela ejecución

Capítulo 5. Manejo de excepciones y errores 47

Page 70: RPG Referencia

Tabla 11. Códigos de excepción/error (continuación)

Código Dispositivo1 RC Condición

Nota: 1“Dispositivo” se refiere a los dispositivos a los que se aplica la condición. Seutilizan las abreviaciones siguientes: P = IMPRESORA; D = DISCO; SP = ESPECIAL;2Todos los errores que se producen durante una operación de apertura o de cierre tendráncomo resultado un valor *STATUS de 1216 o 1217.

Excepciones y errores de programaEstos son algunos ejemplos de errores y excepciones de programa: división porcero, SQRT de un número negativo, índice de matriz no válido, error en unaCALL, devolución de un error desde un programa invocado y una posición deinicio o una longitud fuera del límite de una operación de series. Estasexcepciones/errores se pueden manejar de una de las siguientes maneras:v Se puede especificar un indicador en las posiciones 73 y 74 de las

especificaciones de cálculo para algunos códigos de operación. Este indicador seactiva si se produce una excepción o error durante el proceso de la operaciónespecificada. La estructura de datos de estado de programa opcional se actualizacon la información de excepción/error. Comprobando el indicador podrádeterminar la acción que emprenderá.

v Se puede especificar el ampliador de código de operación ’E’ para algunoscódigos de operación. Una vez especificado, y antes de empezar la operación,este ampliador establece las funciones incorporadas %ERROR y %STATUS paraque vuelvan a cero. Si se produce una excepción/error durante la operación,después de la operación %ERROR devuelve ’1’ y %STATUS devuelve el estadodel programa. La estructura de datos de estado del programa opcional seactualiza con la información de excepción/error. Comprobando %ERROR y%STATUS podrá determinar la acción que efectuará.

v Codificando *PSSR en el factor 1 de una operación BEGSR se puede especificaruna subrutina de excepción/error. La información correspondiente a laexcepción/error de programa está disponible mediante la estructura de datos deestado del programa que se especifica con una S en la posición 23 de lasentencia de la estructura de datos en las especificaciones de definición.

v Si el indicador, el ampliador ’E’, o la subrutina de excepción/error de programano está, el gestor de errores por omisión manejará las excepciones y errores deprograma.

Estructura de datos de estado de programaPara poner a disposición de un programa VisualAge RPG la información deexcepción y error de programa, puede definir una estructura de datos de estadodel programa.

Una estructura de datos se define como una estructura de datos de estado delprograma mediante una S en la posición 23 de la sentencia de estructura de datos.Una estructura de datos de estado del programa contiene subcampos queproporcionan información acerca de la excepción o error de programa que se haproducido. La ubicación de estos subcampos se define mediante palabras claveespeciales o mediante posiciones Desde y A predefinidas. A fin de acceder a lossubcampos, asigne un nombre a cada subcampo. Es necesario especificar laspalabras clave, ajustadas a la izquierda entre las posiciones 26 y 39.

La Tabla 12 en la página 49 proporciona el diseño de los subcampos de laestructura de datos y de las posiciones Desde y A de sus subcampos.

48 VisualAge RPG Consulta del lenguaje

Page 71: RPG Referencia

Tabla 12. Contenido de la estructura de datos de estado del programa

De (Pos.26-32)

A (Pos.33-39)

Formato Longitud Palabra clave Información

1 10 Carácter 10 *PROC Nombre de componente lógico

11 15 Decimalcon zona

5.0 *STATUS Código de estado

16 20 Decimalcon zona

5.0 Código de estado anterior

21 28 Carácter 8 Número de línea de listado fuente

29 36 Carácter 8 *ROUTINE Nombre de la rutina donde se produjo laexcepción o error. Este subcampo se actualiza alprincipio de una rutina o después de unallamada de programa únicamente cuando elsubcampo *STATUS se actualiza con un valorno cero. Estos son los nombres que identificanlas rutinas:

*INIT Inicialización del programa

*TERMFinalización del programa

*ROUTINENombre del programa o procedimientollamado (primeros 8 caracteres).

37 39 Decimalcon zona

3.0 *PARMS Número de parámetros pasados a esteprograma desde un programa de llamada

40 42 Carácter 3 Tipo de excepción: CPF en una excepción delsistema OS/400®, MCH en una excepción demáquina o *RT en un código de retorno deerror desde una rutina de ejecución. En unaexcepción de Windows, este campo contiene*EX.

43 46 Carácter 4 Número de excepción: En una excepción CPF,este campo contiene un número de mensajeCPF. En una excepción de máquina, contieneun número de excepción de máquina. En unaexcepción de Windows, este campo contiene elnúmero de excepción en formato 9.0 binario. Elcódigo de retorno de error desde una rutina deejecución de VisualAge RPG también seencuentra en este campo, en formato 9.0binario.

47 90 44 Reservado

91 170 Carácter 80 Datos de excepción recuperados. Los mensajesde AS/400 están situados en este subcampo

171 190 20 Reservado

191 198 Carácter 8 Fecha (formato *DATE) en la que se entró eltrabajo en el sistema.La fecha que este valorrepresenta es la misma que está representadapor las posiciones de la 270 a la 275.

Capítulo 5. Manejo de excepciones y errores 49

Page 72: RPG Referencia

Tabla 12. Contenido de la estructura de datos de estado del programa (continuación)

De (Pos.26-32)

A (Pos.33-39)

Formato Longitud Palabra clave Información

199 200 Decimalcon zona

2.0 Primeros 2 dígitos de un año de 4 dígitos. Es lomismo que los 2 primeros dígitos de*YEAR.Este campo se aplica a la partecorrespondiente al siglo de la fecha que hay enlas posiciones de la 270 a la 275. Por ejemplo, sila fecha fuese 1999-06-27, UDATE sería 990627y el campo de siglo sería 19. El valor de estecampo junto con el valor de las posiciones de la270 a la 275 combina la información del valorde las posiciones de la 191 a la 198.Nota: El campo de siglo no se aplica a lasfechas situadas en las posiciones de 276 a la 281ni a las situadas en las posiciones de la 288 a la293.

201 208 Carácter 8 Nombre del archivo en el que se produjo laúltima operación de archivo (actualizadaúnicamente cuando se produce un error)

209 243 Carácter 35 Información de estado sobre el último archivoutilizado. Esta información incluye el código deestado, el código de operación, el nombre de larutina de VisualAge RPG, el número de líneadel listado fuente y el nombre de registro.Únicamente se actualiza cuando se produce unerror.Nota: El nombre del código de operación estáen el mismo formato que *OPCODE en laINFDS.

244 253 10 Reservado

254 263 Carácter 10 Identificador de usuario de conexión al sistemaprincipal de AS/400 para una operación deapertura de archivo remoto. Este valor sólo seactualiza cuando se accede a un sistemaprincipal distinto con un identificador deusuario de conexión diferente.

264 269 10 Reservado

270 275 Decimalcon zona

6.0 Fecha (en formato UDATE) de inicio de laejecución del programa en el sistema (UDATEderiva de esta fecha). En el apartado “Palabrasespeciales de fecha de usuario” en la página 7hallará una descripción de UDATE. Este valorrecibe habitualmente el nombre de ″fecha deltrabajo″. La fecha que este valor representa esla misma que está representada por lasposiciones de la 191 a la 198.

276 281 Decimalcon zona

6.0 Fecha de la ejecución del programa (la fechadel sistema en formato UDATE). Si la partecorrespondiente al año de este valor estácomprendida entre 40 y 99, la fecha estácomprendida entre 1940 y 1999. En casocontrario, está comprendida entre el 2000 y el2039. El valor de ″siglo″ de las posiciones de la199 a la 200 no es aplicable a este campo.

50 VisualAge RPG Consulta del lenguaje

Page 73: RPG Referencia

Tabla 12. Contenido de la estructura de datos de estado del programa (continuación)

De (Pos.26-32)

A (Pos.33-39)

Formato Longitud Palabra clave Información

282 287 Decimalcon zona

6(posicionesdedecimalescero)

Hora de ejecución del programa en formatohhmmss

288 293 Carácter 6 Fecha de compilación del programa (en formatoUDATE). Si la parte correspondiente al año deeste valor está comprendida entre 40 y 99, lafecha está comprendida entre 1940 y 1999. Encaso contrario, está comprendida entre el 2000 yel 2039. El valor de ″siglo″ de las posiciones dela 199 a la 200 no es aplicable a este campo.

294 299 Carácter 6 Hora (en el formato hhmmss) en que elprograma se compiló

300 303 Carácter 4 Nivel del compilador

304 313 Carácter 10 Nombre del archivo fuente (primeros 10caracteres)

314 429 116 Reservado

Códigos de estado de programaNingún código situado en la ubicación del subcampo *STATUS que sea mayor que99 es considerado como una condición de excepción o error. Si el código de estadoes mayor que 99, el indicador de errores — si está especificado en las posiciones 73y 74 — se activa o la función incorporada %ERROR — si se especifica el ampliador’E’ — se establece para devolver ’1’. De lo contrario, la subrutina deexcepción/error de programa recibe el control. *STATUS se actualiza cuando seproduce una excepción o error.

La función incorporada %STATUS devuelve el más reciente establecido para elestado de programa y de archivo.

Los siguientes códigos están situados en la ubicación de subcampo *STATUS parala estructura de datos de estado de programa:

Códigos normales:

CódigoCondición

00000 No se produjeron excepciones/errores

00031 El componente lógico está terminando: indicador LR activado cuando seefectúa una operación RETURN o ENDACT

00032 El componente lógico está terminando como resultado de una terminaciónexplícita del componente lógico (componente lógico STOP)

00033 El componente lógico está terminando como resultado de una terminaciónimplícita del componente lógico (STOP padre o abuelo del componentelógico)

00034 El componente lógico está terminando como resultado de una petición determinación explícita de otro componente lógico (componente lógico STOP)

Capítulo 5. Manejo de excepciones y errores 51

Page 74: RPG Referencia

00035 El resultado está terminando como resultado de una petición terminaciónimplícita de otro componente lógico (padre del componente lógico STOP)

00050 La conversión ha dado como resultado una sustitución.

Códigos de excepción/error:

CódigoCondición

00100 Valor fuera de rango en operación de series

00101 Raíz cuadrada negativa

00102 División por cero

00103 Un resultado intermedio no es suficientemente grande para contener elresultado

00104 Subdesbordamiento de flotantes. Un valor intermedio es demasiadopequeño para estar contenido en el campo del resultado intermedio.

00112 Valor de Fecha, Hora o Indicación de la hora no válido.

00113 Desbordamiento o subdesbordamiento de fechas. (Por ejemplo, cuando elresultado de un cálculo de fecha da como resultado un número mayor que*HIVAL o menor que *LOVAL)

00114 Errores de correlación de fechas, cuando se correlaciona una fecha de unaño de 4 caracteres a un año de 2 caracteres y el rango de fechas no es1940-2039

00115 El campo de caracteres o gráficos de longitud variable tiene una longitudactual que no es válida.

00120 Tabla o matriz fuera de secuencia

00121 Índice de matriz no válido

00122 OCCUR fuera de rango

00123 Se ha intentado la operación restablecer durante el paso de inicializacióndel programa

00202 Ha fallado el programa o procedimiento llamado

00211 Procedimiento o programa de llamada de error

00221 El programa llamado ha intentado utilizar un parámetro que no se le habíapasado

00222 Error de puntero o parámetro

00333 Error en operación DSPLY

00401 No se ha encontrado área de datos especificada en ENTRADA/SALIDA

00411 El tipo o la longitud del área de datos no coincide

00412 Área de datos no bloqueada en salida

00413 Error en operación IN/OUT

00414 Usuario no autorizado para utilizar el área de datos

00415 Usuario no autorizado para cambiar el área de datos

00421 Error en operación UNLOCK

00431 Área de datos anteriormente bloqueada por otro programa

52 VisualAge RPG Consulta del lenguaje

Page 75: RPG Referencia

00432 Área de datos bloqueada por el programa en el mismo proceso

00501 Anomalía al recuperar secuencia de ordenación

00802 Control de compromiso no activo

00803 Ha fallado la operación de retrotracción

00804 Error en la operación COMMIT

00805 Error en la operación ROLBK

00907 Error de datos decimales (dígito o signo no válido)

00940 Error en los servicios del sistema principal

00970 El número de nivel del compilador utilizado para generar el programa nocoincide con el número de nivel de las subrutinas de ejecución deVisualAge RPG.

01400 El nombre de atributo no es válido

01401 Se ha intentado operación SHOWWIN en una ventana abierta

01402 No se ha encontrado el nombre del componente en la aplicación

01403 El valor del atributo nuevo no se encuentra dentro del rango válido

01404 El tipo de acceso del atributo no es válido para la operación

01405 El tipo de datos del atributo de evento no es compatible con la operación

01406 Identificador de mensajes no válido

01407 El tipo de datos del atributo no es compatible con la operación

01408 Recursos insuficientes

01410 Ha fallado la operación START

01411 Ha fallado la operación STOP

01420 Se ha producido un error en una operación de subarchivo

08888 Error de recursión

09001 No hay indicador de errores ni *PSSR

09998 Anomalía interna en el compilador de VisualAge RPG o en las subrutinasde ejecución

09999 Excepción de programa en la rutina del sistema.

Ejemplo de estructura de datos de estado de programaPara especificar una estructura de datos de estado de programa (PSDS) en elprograma, codifique la estructura de datos de estado de programa y los subcamposque desea utilizar en una especificación de definición.

Capítulo 5. Manejo de excepciones y errores 53

Page 76: RPG Referencia

Nota: Las palabras clave no son etiquetas y no se pueden utilizar para acceder alos subcampos. Las entradas cortas se rellenan por la derecha con espaciosen blanco.

Subrutina de excepción y error de programaPara identificar la subrutina que recibe el control cuando se produce una excepcióno error de programa, especifique *PSSR en el factor 1 de la operación BEGSR de lasubrutina. Si no se especifica un indicador en las posiciones 73 y 74 en un códigode operación o si se produce una excepción inesperada en un código de operación(por ejemplo, un error de indexación de matrices durante una operación SCAN),cuando se produce una excepción o error de programa el control se transfiere aesta subrutina. Además, la operación EXSR también puede llamar a la subrutina.Se puede especificar *PSSR en la palabra clave INFSR en las especificaciones dedescripción de archivo y recibe el control si se produce una excepción/error dearchivo.

En la subrutina de excepción/error de programa se pueden utilizar todos loscódigos de operación. La operación ENDSR debe ser la última especificación de lasubrutina y la entrada del factor 2 en la operación ENDSR especifica el punto deretorno que sigue a la ejecución de la subrutina. Para obtener más información,consulte el apartado “Subrutina de excepción y error de archivo (INFSR)” en lapágina 44.

Recuerde los siguientes aspectos al especificar una subrutina de excepción/error deprograma:v Puede llamar explícitamente a la subrutina *PSSR especificando *PSSR en el

factor 2 de la operación EXSR.v Una vez ejecutada la operación ENDSR de la subrutina *PSSR, el campo,

subcampo, elemento de matriz o elemento de matriz especificado en el factor 2se restablece en blancos. Esto le permitirá especificar el punto de retorno dentro

DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++Comments++++++++++DMYPSDS SDSD PROC_NAME *PROC * Nombre componente lógicoD PGM_STATUS *STATUS * Código estadoD PRV_STATUS 16 20S 0 * Estado anteriorD LINE_NUM 21 28 * Núm.línea listado fuenteD ROUTINE *ROUTINE * Nombre rutinaD PARMS *PARMS * Núm.parám. pasadosD EXCP_TYPE 40 42 * Tipo excepciónD EXCP_NUM 43 46 * Número excepciónD*D EXCP_DATA 91 170 * Datos excepciónD*D DATE 191 198 * Fecha (form. *DATE)D YEAR 199 200S 0 * Año (form. *YEAR)D LAST_FILE 201 208 * Último archivo usadoD FILE_INFO 209 243 * Info errores de archivoD*D JOB_DATE 270 275S 0 * Fecha (form. UDATE)D RUN_DATE 276 281S 0 * Fecha ejec. (UDATE)D RUN_TIME 282 287S 0 * Hora ejec. (UDATE)D CRT_DATE 288 293 * Fecha creaciónD CRT_TIME 294 299 * Hora creaciónD CPL_LEVEL 300 303 * Nivel compiladorD SRC_FILE 304 313 * Archivo fuenteD*

Figura 13. Ejemplo de codificación de una PSDS

54 VisualAge RPG Consulta del lenguaje

Page 77: RPG Referencia

de la subrutina que esté mejor adaptada para la excepción o error que se haproducido. Si el factor 2 contiene blancos al final de la subrutina, el gestor deerrores por omisión recibe el control; si una operación EXSR o CASxx hallamado a la subrutina, el control vuelve a la próxima instrucción por ordensiguiendo el EXSR o ENDCS. Si la excepción se ha producido en unsubprocedimiento y no se ha encontrado ninguna operación GOTO antes de laoperación ENDSR, se emite el código de error 9001 y la aplicación finaliza. Elfactor 2 no está soportado en la operación ENDSR de las *PSSR delsubprocedimiento.

v Debido a que la subrutina de excepción/error de programa puede recibir elcontrol siempre que se produzca una excepción /error de no archivo, podríaproducirse una excepción o error mientras la subrutina se está ejecutando. Siesto ocurre, la subrutina es llamada de nuevo lo que conlleva un bucle deprograma a menos que codifique la subrutina para evitar este problema.

v Se puede definir una *PSSR en un subprocedimiento y cada subprocedimientopuede tener su propia *PSSR. Fíjese que la *PSSR de un subprocedimiento eslocal en ese subprocedimiento. Si desea que los subprocedimientos compartan lamisma rutina de excepción, cada llamada de *PSSR deberá tener unprocedimiento compartido.

v Si tiene una *PSSR que no está definido dentro de un subprocedimiento, esta*PSSR nunca se ejecuta si se produce una excepción dentro de unsubprocedimiento.

Excepciones/errores de componente lógicoEn los apartados siguientes se describe cómo majar los errores durante un evento ycuáles son las excepciones detectadas por el gestor de excepciones de VisualAgeRPG.

Códigos de estado de componente lógicoLos siguientes valores *STATUS le permiten consultar cómo ha terminado elcomponente lógico en la terminación normal:

00031 El componente lógico termina porque LR está activo. LR se compruebacuando se alcanza ENDACT de raíz. La subrutina de acción de raíz es lasubrutina de la parte inferior (o primera) de cualquier subrutina de acciónjerarquizada.

00032 El componente lógico se termina a sí mismo directamente. Por ejemplo, elcomponente lógico ’thiscomp’ emite ’thiscomp’ de STOP. El componentelógico ’thiscomp’ ha terminado.

00033 El componente lógico se termina a sí mismo indirectamente. Por ejemplo,’myparent’ de STOP es emitido por el componente lógico actual paraterminar el componente lógico que inició (START) el componente lógicoactual. Todos los hijos de ’myparent’ se terminan en primer lugar, incluidoel componente lógico actual.

00034 El componente lógico es terminado directamente por otro componentelógico. Por ejemplo, ’X’ de STOP es emitido por otro componente lógicopara terminar el componente lógico actual, ’X’.

00035 El componente lógico es terminado indirectamente por otro componentelógico. Por ejemplo, ’myparent’ de STOP es emitido por otro componentelógico para terminar el padre del componente lógico actual, ’myparent’, eindirectamente, el componente lógico actual también ha sido terminado.

Capítulo 5. Manejo de excepciones y errores 55

Page 78: RPG Referencia

Cuando se produce una terminación normal, la subrutina *TERMSR es llamada.*TERMSR es una subrutina escrita por el usuario desde la que se puede producircualquier ejecución de código final. Cuando se invoca a *TERMSR, no haysubrutinas de acción activas y el componente lógico actual ha sido marcado comoque está terminando. Esto significa que hay pocas operaciones de interfaz gráficade usuario permitidas. Consulte las siguientes tablas para obtener másinformación:v Tabla 5 en la página 32v Tabla 6 en la página 34v Tabla 7 en la página 34v Tabla 8 en la página 36

Manejo de errores de eventoSi se produce un error durante el manejo de un evento, puede ocurrir una de estasdos cosas:v Si no hay una *PSSR o una INFSR, se invoca al gestor de excepciones por

omisión.v Si hay una rutina de manejo de errores (*PSSR o INFSR), se invoca a la rutina de

manejo de errores.

Si la aplicación contiene una subrutina de manejo de errores, esta subrutina sigueejecutándose hasta que se alcanza uno de los siguientes códigos de operación:

RETURN El control vuelve al mismo lugar donde se produce el proceso*DEFAULT de ENDACT. Si no hay más subrutinas de acciónjerarquizadas, se comprueba LR:v Si LR está activado, el componente lógico termina normalmente.

Consulte el apartado “Terminación normal” en la página 30.v Si LR no está activado, la subrutina de acción actual finaliza y se

ejecuta cualquier acción por omisión para el evento.

STOP El componente lógico termina normalmente. Se aplican algunasrestricciones. Consulte el “Capítulo 4. Trabajar con componenteslógicos” en la página 29.

ENDSR Lo que especifique en el factor 2 afecta al flujo de ejecución:v Si no se especifica el factor 2, se visualiza la ventana de

información de mensajes de consulta del gestor de excepcionespor omisión.

v Si se especifica *DEFAULT en el factor 2, el control vuelve almismo lugar donde se produce el proceso *DEFAULT ENDACT.Si no hay más subrutinas de acción jerarquizadas, se compruebaLR:– Si LR está activado, el componente lógico termina

normalmente. Consulte el apartado “Terminación normal” enla página 30.

– Si LR no está activado, la subrutina de acción actual finaliza yse ejecuta cualquier acción por omisión para el evento.

v Si se especifica *NODEFAULT en el factor 2, el control vuelve almismo lugar donde se produce el proceso *NODEFAULTENDACT. Consulte el apartado “ENDSR (Fin de subrutina deusuario)” en la página 445. Si no hay más subrutinas de acciónjerarquizadas, se comprueba LR:– Si LR está activado, el componente lógico termina

normalmente. Consulte el apartado “Terminación normal” enla página 30.

56 VisualAge RPG Consulta del lenguaje

Page 79: RPG Referencia

– Si LR no está activado, la subrutina de acción actual finaliza yNO se ejecuta ninguna acción por omisión para el evento.

v Si se especifica *ENDCOMP o *CANCL en el factor 2, finaliza lasubrutina de acción que se estaba ejecutando cuando se produjoel error y el componente lógico termina de forma anormal.Consulte el apartado “ENDSR (Fin de subrutina de usuario)” enla página 445.

v Si se especifica *ENDAPPL en el factor 2, termina la subrutinade acción que se estaba ejecutando cuando se produjo el error ytodos los componentes lógicos de la aplicación se cierran pororden jerárquico inverso. Consulte el apartado “ENDSR (Fin desubrutina de usuario)” en la página 445. El componente lógicoque estaba activado cuando se produjo el error ha terminado deforma anormal. Todos los demás componentes lógicos terminannormalmente. Consulte los apartados “Terminación normal” enla página 30 y “Terminación anormal” en la página 32.

Cuando se invoca al gestor de excepciones por omisión para una excepción que seproduce fuera de un procedimiento, se visualiza una ventana desde la cual puedeelegir una de las siguientes opciones:v Realizar el proceso por omisión (se aplica la información de antes de ENDSR

*DEFAULT)v No realizar el proceso por omisión (se aplica la misma información de antes

para ENDSR *NODEFAULT)v Reintentar la operación: Esta opción sólo aparece para un pequeño conjunto de

errores de E/S. Le permite reintentar la misma operación.v Terminar el componente lógico (se aplica la misma información de antes de

ENDSR *ENDCOMP)v Terminar la aplicación (se aplica la información de antes de ENDSR *ENDAPPL)

Nota: Si se produce una excepción dentro de un subprocedimiento y no existeninguna *PSSR local o indicador de errores, la aplicación finaliza.

Cuando se da el control a una rutina de manejo de errores o al gestor deexcepciones por omisión, la subrutina de acción actual que causó el error todavíaestá activada. Todavía puede acceder a los mismos atributos de evento que eranválidos en el momento del error. Por ejemplo, el atributo de evento %BUTTON esválido durante el proceso del evento MouseDown. Si se produce un error duranteel manejo de este evento, se puede hacer referencia a %BUTTON en la *PSSR.

Nota: Si se hace referencia a %BUTTON en la *PSSR para un evento donde elatributo de evento no es válido, entonces se produce un error. Este tipo deerror puede fácilmente provocar que la aplicación entre en una situación derecursión interminable si no se codifica correctamente la *PSSR para manejaresta situación.

En los casos en que diversas subrutinas de acción están anidadas, la rutina demanejo de errores sólo afecta a la máxima invocación de subrutinas de accióncuando se ejecuta ENDSR *DEFAULT, *NODEFAULT o un nombre de campoequivalente. Por ejemplo, si se ejecuta SHOWWIN WINDOW2 desde dentro de lasubrutina de acción BUTTON+CLICK+WINDOW1, se suspendeBUTTON+CLICK+WINDOW1 y se invoca a la subrutina de acciónWINDOW2+CREATE+WINDOW2. Si se produce un error mientras se invoca aesta segunda subrutina de acción, se invoca a la *PSSR o al gestor de excepcionespor omisión. Si se toma *DEFAULT, únicamente finaliza

Capítulo 5. Manejo de excepciones y errores 57

Page 80: RPG Referencia

WINDOW2+CREATE+WINDOW2 y el control vuelve aBUTTON1+CLICK+WINDOW1 en la operación siguiente de SHOWWINWINDOW2.

Manejo de excepcionesEl gestor de excepciones de VisualAge RPG ha detectado las siguientesexcepciones. Estas excepciones están situadas en el campo número de excepciones(43-46) de la PSDS como un número binario de 4 bytes con *EX situado en elcampo tipo de excepción (40-42) de la PSDS.

Violación de acceso 0xC0000005División de enteros por cero 0xC000009BDivisión de flotantes por cero 0xC0000095Operación no válida de flotantes 0xC0000097Instrucción no permitida 0xC000001CInstrucción privilegiada 0xC000009DDesbordamiento de enteros 0xC000009CDesbordamiento de flotantes 0xC0000098Subdesbordamiento de flotantes 0xC000009AOperando anormal de flotantes 0xC0000094Resultado inexacto de flotantes 0xC0000096Comprobación de pila de flotantes 0xC0000099Desalineación de tipo de datos 0xC000009ESecuencia de bloqueo no válida 0xC000001DLímites de matriz excedidos 0xC0000093

Para obtener más información sobre excepciones específicas de Windows, consultela documentación del sistema operativo.

Todas las demás excepciones se manejan de una de las siguientes maneras:v Si la excepción se produce durante un CALLB o CALL, el código de estado se

establece en 202 o 211.v Si la excepción no se produce durante una CALLB o CALL, las excepciones se

correlacionan a un código de estado de la siguiente manera:

División de enteros por cero 102División de flotantes por cero 102Desbordamiento de flotantes 103Violación de acceso 222Desalineación de tipo de datos 222Las demás excepciones 9999

58 VisualAge RPG Consulta del lenguaje

Page 81: RPG Referencia

Capítulo 6. Subprocedimientos y prototipos

De una compilación puede surgir un objeto destino de tres tipos posibles. Elresultado depende de la palabra clave de especificación de control utilizada:v Cuando las palabras clave NOMAIN y EXE no están presentes, se crea un

componente lógico.v Cuando se especifica la palabra clave NOMAIN, se crea un programa de

utilidad DLL o NOMAIN. Esta DLL contiene solamente subprocedimientos RPG.v Cuando se especifica la palabra clave EXE, se crea un RPG EXE. Este módulo

contiene un procedimiento principal y subprocedimientos.

Un programa de VisualAge RPG consta de uno o varios módulos. Unprocedimiento es cualquier parte del código que puede llamarse con el código deoperación CALLP. VisualAge RPG tiene dos clases de procedimientos:procedimiento principal y subprocedimiento. Un procedimiento principal es unprocedimiento que puede especificarse como el procedimiento de entrada delprograma y que recibe el control cuando se llama por primera vez. Tenga encuenta que un procedimiento sólo se genera al crear un EXE.

Un subprocedimiento es un procedimiento especificado después de la secciónfuente principal. (Consulte el apartado “Ubicación de definiciones y ámbito” en lapágina 228 para el conocer el diseño de la sección fuente principal de cada tipo dedestino de compilación). Los subprocedimientos se diferencian de unprocedimiento principal en que:v No se puede acceder a los nombres definidos en un subprocedimiento desde

fuera del subprocedimiento.v Se debe hacer un prototipo de la interfaz de llamada.v Las llamadas a los procedimientos deben ser llamadas de procedimiento

enlazado.v Sólo se pueden utilizar las especificaciones P, D y C.

Todos los subprocedimientos deben tener un prototipo correspondiente en lasespecificaciones de definición de la sección fuente principal. El compilador utilizael prototipo para llamar correctamente al programa o procedimiento y paraasegurar que el llamador pasa los parámetros correctos.

Esta sección trata los aspectos siguientes de los subprocedimientos:v Definición de subprocedimientov Módulos NOMAIN y EXEv Comparación con subrutinas

Definición de subprocedimientoLos subprocedimientos se definen después de la sección fuente principal. En laFigura 14 en la página 60se muestra un subprocedimiento y se resaltan lasdiferentes partes que lo componen.

© Copyright IBM Corp. 1994, 2000 59

Page 82: RPG Referencia

1. Un prototipo que especifica el nombre, el valor de retorno, si lo hay y losparámetros, si los hay.

2. Una especificación de Inicio de procedimiento (B en la posición 24 de unaespecificación de procedimiento)

3. Una definición de Interfaz del procedimiento, que especifica el valor de retornoy los parámetros, si procede. La interfaz de procedimiento debe coincidir con elprototipo correspondiente. La definición de interfaz de procedimiento esopcional si el subprocedimiento no devuelve un valor y no se le pasa ningúnparámetro.

4. Otras especificaciones de definición de variables, constantes y prototipos quenecesita el subprocedimiento. Se trata de definiciones locales.

5. Todas las especificaciones de cálculo necesarias para llevar a cabo la tarea delprocedimiento. Los cálculos pueden hacer referencia a definiciones locales yglobales. Todas las subrutinas incluidas dentro del subprocedimiento sonlocales. No se pueden utilizar fuera del subprocedimiento. Si elsubprocedimiento devuelve un valor, también debe contener una operaciónRETURN.

6. Una especificación de Fin de procedimiento (E en la posición 24 de unaespecificación de procedimiento)

Excepto para la definición de interfaz de procedimiento, que se puede ubicar encualquier lugar de las especificaciones de definición, un subprocedimiento se debecodificar en el orden que se muestra más arriba.

No puede codificar lo siguiente para los subprocedimientos:v Matrices y tablas de tiempo de preejecución y tiempo de compilaciónv Definiciones *DTAARA

* Prototipo para el procedimiento FUNCTION*

D FUNCTION PR 10I 0 «1¬D TERM1 5I 0 VALUED TERM2 5I 0 VALUED TERM3 5I 0 VALUE*

P Function B «2¬**-------------------------------------------------------------* Este procedimiento realiza una función sobre los 3 valores* numéricos pasados como parámetros de valor.** Esto muestra cómo se especifica una interfaz de procedimiento* para un procedimiento y la devolución de valores desde el mismo.*-------------------------------------------------------------*

D Function PI 10I 0 «3¬D Term1 5I 0 VALUED Term2 5I 0 VALUED Term3 5I 0 VALUED Result S 10I 0 «4¬C EVAL Result = Term1 ** 2 * 17C + Term2 * 7 «5¬C + Term3C RETURN Result * 45 + 23P E «6¬*

Figura 14. Ejemplo de un subprocedimiento

60 VisualAge RPG Consulta del lenguaje

Page 83: RPG Referencia

Las especificaciones de cálculo se procesan sólo una vez y el procedimiento retornaal final de las especificaciones de cálculo. Consulte el apartado “Cálculos desubprocedimiento” en la página 63 si desea más información.

Puede exportarse un subprocedimiento, lo que significa que otros procedimientosde otros módulos del programa pueden llamarlo. Para indicar que debe exportarse,especifique la palabra clave EXPORT en la especificación de Inicio deprocedimiento. Si no se especifica, únicamente se puede llamar alsubprocedimiento desde el módulo. Tenga en cuenta que los procedimientos sólopueden exportarse desde las DLL NOMAIN.

Definición de interfaz de procedimientoSi un procedimiento con prototipo tiene parámetros de llamada o un valor deretorno, debe tener una definición de interfaz de procedimiento. Una definición deinterfaz de procedimiento es una repetición de la información del prototipo dentrode la definición de un procedimiento. Se utiliza para anunciar los parámetros deentrada del procedimiento y asegurarse de que la definición interna de éste escoherente con la definición externa (el prototipo).

Puede especificar una interfaz de procedimiento indicando PI en la entrada Tipode definición (posiciones 24-25). Las definiciones de parámetros, indicadasmediante espacios en blanco en las posiciones 24-25, deben ir inmediatamente acontinuación de la especificación PI. La definición de interfaz de procedimientofinaliza con la primera especificación de definición que no tenga espacios en blancoen las posiciones 24-25 o por una especificación no de definición.

Para obtener más información sobre las definiciones de interfaz de procedimiento,consulte el apartado “Interfaz de procedimiento” en la página 70.

Valores de retornoUn procedimiento que devuelve un valor es esencialmente una función definidapor el usuario, parecida a una función incorporada. Para definir un valor deretorno para un subprocedimiento, debe:1. Definir el valor de retorno en el prototipo y las definiciones de interfaz de

procedimiento del subprocedimiento.2. Codificar una operación RETURN con una expresión en el campo factor 2

ampliado que contiene el valor a devolver.

La longitud y el tipo del valor de retorno se definen en la especificación de interfazde procedimiento (la especificación de definición con PI en las posiciones 24-25).También están permitidas las palabras clave siguientes:

DATFMT(fmt)El valor de retorno tiene el formato de fecha especificado en la palabraclave.

DIM(N)El valor de retorno es una matriz de N elementos.

LIKE(nombre)El valor de retorno se define como el ítem especificado por la palabraclave.

PROCPTREl valor de retorno es un puntero de procedimiento.

Capítulo 6. Subprocedimientos y prototipos 61

Page 84: RPG Referencia

TIMFMT(fmt)La palabra clave especifica el formato de hora del valor de retorno.

Para devolver el valor al llamador, debe codificar una operación RETURN con unaexpresión que contenga el valor de retorno. La expresión del campo factor 2ampliado está sujeta a las mismas reglas que una expresión con EVAL. El valordevuelto real desempeña la misma función que el lado izquierdo de la expresiónEVAL, mientras que el factor 2 ampliado de la operación RETURN desempeña lamisma función que el lado derecho. Debe asegurarse de que se lleva a cabo unaoperación RETURN si el subprocedimiento tiene un valor de retorno definido; delo contrario, se emite una excepción para el llamador del subprocedimiento.

Ámbito de definicionesLos ítems definidos en un subprocedimiento son locales. Si un ítem se define conel mismo nombre que un ítem de datos global, todas las referencias al nombrehechas dentro del subprocedimiento utilizan la definición local.

Sin embargo, recuerde lo siguiente:v Sólo el procedimiento para el que se han definido conoce los nombres de las

subrutinas y las etiquetas, incluso aquellos definidos en el procedimientoprincipal de un EXE.

v Todos los campos especificados en las especificaciones de entrada y de salidason globales. Cuando un subprocedimiento utiliza especificaciones de entrada osalida (por ejemplo, cuando procesa una operación de lectura), se utiliza elnombre global aunque haya una variable local del mismo nombre.

Cuando se utiliza una sentencia KLIST o PLIST global en un subprocedimiento,algunos campos pueden tener los mismos nombres que los campos locales. Si estosucede, se utiliza el campo global. Esto puede originar problemas al preparar unaKLIST o PLIST antes de utilizarla.

Por ejemplo, observe el fuente siguiente:D* Definiciones del procedimiento principalD Fld1 S 1AD Fld2 S 1AD*C* Definir una lista de campos de clave globales con dos campos,C* Fld1 y Fld2C global_kl KLISTC KFLD Fld1C KFLD Fld2C*P* Sección de subprocedimientoP Subproc BD Fld2 S 1AD*C* local_kl tiene un kfld global (fld1) y uno local (fld2)C*C local_kl KLISTC KFLD Fld1C KFLD Fld2C*C* Aunque Fld2 se define localmente en el subprocedimiento,C* global_kl utiliza Fld2 global, ya que las KLIST globalesC* siempre utilizan campos globales. Por tanto, laC* asignación a Fld2 local NO afecta a la operación CHAIN.C*C EVAL Fld1 = 'A'C EVAL Fld2 = 'B'C global_kl SETLL file

62 VisualAge RPG Consulta del lenguaje

Page 85: RPG Referencia

C*C* Las KLIST locales utilizan campos globales sólo cuando noC* hay un campo local con ese nombre. local_kl utiliza Fld2C* local y así la asignación a Fld2 AFECTARÁ a la operaciónC* CHAIN.C EVAL Fld1 = 'A'C EVAL Fld2 = 'B'C local_kl SETLL file...

P E

Para obtener más información acerca de la situación de las definiciones y del efectosobre el ámbito, consulte el apartado “Ubicación de definiciones y ámbito” en lapágina 228.

Cálculos de subprocedimientoUn subprocedimiento finaliza cuando se da una de las condiciones siguientes:v Se procesa una operación RETURN.v Se procesa el último cálculo del cuerpo del subprocedimiento.

La Figura 15 en la página 64 muestra los pasos del proceso normal de unsubprocedimiento. La Figura 16 en la página 65 muestra la secuencia de manejo deexcepciones/errores.

Capítulo 6. Subprocedimientos y prototipos 63

Page 86: RPG Referencia

«1¬ Seguir la rama ″No″ significa que ya se ha llamado a otro procedimientodesde que se activó el programa. Debe asegurarse de no hacer suposicionesincorrectas acerca del estado de los archivos, las áreas de datos, etc., ya queotro procedimiento puede haber cerrado archivos o desbloqueado áreas dedatos.

Inicio

Señalizarexcepciónallamador (el subprocedimiento

finaliza)

Devolvera llamador

Operaciónderetorno

Establecervalorpara llamador (si elsubprocedimientodevuelveunvalor)

Primeravezquesecarga la

DLLocuandose llamaal EXE.

¿Es laprimeravezqueseha llamado

al subprocedimiento?

Si el subprocedimientodevuelveunvalor, ¿seefectuóunaoperación

RETURN?

Inicializarvariablesautomáticas

Efectuarcálculosunavez

No

No

No

•Ejecutar inicializacióndemódulo•Efectuar inicializacióndeestructurasdedatosydesubcampos

•Recuperar indicadoresexternos(U1aU8)ycamposde fechadeusuario

•Abrir archivos•Cargardatosdel áreadedatos local,estructuras,matricesy tablas

•Si nohayningún*INZSR,almacenarestructurasdedatosyvariablesparaoperacionesRESET

• Inicializar variablesestáticas•AlmacenarvariablesparaoperacionesRESETenvariables locales

Figura 15. Secuencia del proceso normal de un subprocedimiento

64 VisualAge RPG Consulta del lenguaje

Page 87: RPG Referencia

A continuación se proporcionan algunos puntos a tener en cuenta al codificar lossubprocedimientos:v No hay ningún *INZSR asociado a los subprocedimientos. Los datos se

inicializan (con valores INZ o valores por omisión) cuando se llama alprocedimiento por primera vez, pero antes de empezar los cálculos.

v Cuando un subprocedimiento retorna normalmente, el valor de retorno, si estáespecificado en el prototipo del programa o procedimiento llamado, se pasa alllamador. No se produce nada más automáticamente. Se han de cerrarmanualmente todos los archivos y áreas de datos. Los archivos deben grabarsemanualmente. En el caso de un EXE, puede activar indicadores tales como LR,pero el programa no terminará hasta que el procedimiento principal del EXEtermine.

v La gestión de excepciones dentro de un subprocedimiento difiere básicamente deun procedimiento principal en que no hay un gestor de excepciones por omisiónpara los subprocedimientos y, de este modo, situaciones en las que se llamaría algestor por omisión para un procedimiento principal corresponden a unafinalización anómala del subprocedimiento. Por ejemplo, el Factor 2 de unaoperación ENDSR para una subrutina *PSSR dentro de un subprocedimientodebe estar en blanco. Un factor 2 en blanco significaría pasar el control al gestorpor omisión, pero en un subprocedimiento, si se ha alcanzado ENDSR, elsubprocedimiento finalizará de forma anómala.Puede evitar la terminación anómala codificando una operación RETURN en la*PSSR, o codificando GOTO y una etiqueta en el subprocedimiento paracontinuar el proceso.

v La subrutina de error *PSSR es local para el subprocedimiento. A la inversa, loserrores de archivo son globales por definición y por tanto no puede codificarINFSR en un subprocedimiento ni utilizar un archivo para el que se hacodificado INFSR.

Módulo NOMAINPuede codificar uno o varios subprocedimientos en un módulo sin codificarsubrutinas de acción. Un módulo de estas características se denomina móduloNOMAIN y requiere la especificación de la palabra clave NOMAIN en laespecificación de control. El concepto de una DLL NOMAIN es parecido al de unprograma de servicio de OS/400™.

Excepciónde filtración(el subprocedimiento

finaliza)

¿Errordeprogramaysubprocedimiento

tienen*PSSR?

¿Ha llegado*PSSRaENDSR?

No

No

El programacontinúanormalmentedespuésde

RETURNoGOTO

Señalizarexcepciónallamador (el subproce-

dimiento finaliza)

Ejecutar subrutina*PSSR

Excepcióndurantecálculos

Figura 16. Gestión de excepciones/errores para un subprocedimiento

Capítulo 6. Subprocedimientos y prototipos 65

Page 88: RPG Referencia

Para las DLL NOMAIN, debe tenerse en cuenta lo siguiente:v La DLL sólo debe constar de procedimientos. Todas las subrutinas (BEGSR)

deben ser locales a un procedimiento.v En este fuente no se permiten códigos de operación GUI, lo que incluye START,

STOP, SETATR, GETATR, %SETATR, %GETATR, SHOWWIN, CLSWIN yREADS. Se puede utilizar DSPLY. No obstante, si se llama al procedimiento quelo contiene desde una DLL VisualAge RPG, el código de operación DSPLY norealiza ninguna función.

v No se permiten *INZSR y *TERMSR.v No se permiten parámetros *ENTRY.

Módulo EXEUn módulo se denomina módulo EXE cuando tiene especificada la palabra claveEXE en la especificación de control.

El módulo EXE consta de un procedimiento principal y subprocedimientos. Todaslas subrutinas (BEGSR) deben ser locales a un procedimiento. El EXE debecontener un procedimiento cuyo nombre coincida con el nombre del archivofuente. Este será el punto de entrada principal para el EXE; es decir, elprocedimiento principal.

Para los módulos EXE, se debe tener en cuenta lo siguiente:v En este fuente no se permiten códigos de operación GUI. Esto incluye START,

STOP, SETATR, GETATR, %SETATR, %GETATR, SHOWWIN, CLSWIN yREADS. Se puede utilizar DSPLY.

v No se permiten *INZSR y *TERMSR.v No se permiten parámetros *ENTRY.

Si existen parámetros de entrada, se especifican en la definición del parámetropara el procedimiento principal y se deben pasar por VALUE (se debeespecificar la palabra clave VALUE para cada parámetro). No pueden serparámetros UCS-2.

v La palabra clave EXPORT no está permitida en la especificación P Begin.v El valor de retorno para el procedimiento principal se debe definir como un

número binario o entero de precisión cero(0).

Subprocedimientos y subrutinasUn subprocedimiento se parece a una subrutina, con la salvedad de que unsubprocedimiento ofrece las mejoras siguientes:v Puede pasar parámetros a un subprocedimiento, incluso pasarlos por valor.

Esto significa que los parámetros utilizados para comunicarse con lossubprocedimientos no tienen que ser modificables. Los parámetros que se pasanpor referencia, como ocurre con los programas, deben ser modificables y son,por tanto, menos fiables.

v En el tiempo de compilación se comprueba la coherencia de los parámetrospasados a un subprocedimiento y de los recibidos por éste. Esto ayuda a reducirlos errores de tiempo de ejecución, que pueden ser más costosos.

v Puede utilizar un subprocedimiento como una función incorporada en unaexpresión.Cuando se utiliza de esta forma, devuelven un valor al llamador. Esto permitebásicamente definir de forma personalizada los operadores que pueda necesitaren una expresión.

v Los nombres definidos en un subprocedimiento no son visibles fuera delsubprocedimiento.

66 VisualAge RPG Consulta del lenguaje

Page 89: RPG Referencia

Esto significa que hay menor probabilidad de que el procedimiento cambieinadvertidamente un ítem compartido por otros procedimientos. Además, elllamador del procedimiento no necesita conocer tanto acerca de los ítemsutilizados dentro del subprocedimiento.

v Puede llamar al subprocedimiento desde fuera del módulo, si se exporta.v Puede llamar a subprocedimientos de forma recursiva.v Los procedimientos se definen en un tipo de especificación distinto, es decir:

especificaciones de procedimiento. Este tipo distinto permite reconocerinmediatamente que se está tratando con una unidad aparte.

Sin embargo, si no necesita las mejoras ofrecidas por los subprocedimientos,debería utilizar una subrutina. El proceso de una subrutina es mucho más rápidoque la llamada a un subprocedimiento.

Prototipos y parámetrosLa forma recomendada de llamar a programas y procedimientos consiste enutilizar llamadas mediante prototipo, ya que estas llamadas permiten alcompilador comprobar la interfaz de llamada en el tiempo de compilación. Sicodifica un subprocedimiento, necesitará codificar una interfaz de procedimientopara permitir que el compilador haga coincidir la interfaz de llamada con elsubprocedimiento.

En este apartado se indica cómo definir lo siguiente: prototipos, parámetros conprototipo e interfaces de procedimiento.

PrototiposUn prototipo es una definición de la interfaz de llamada. Incluye la informaciónsiguiente:v Si la llamada es enlazada (procedimiento) o dinámica (programa)v Cómo encontrar el programa o procedimiento (el nombre externo)v El número y naturaleza de los parámetrosv Qué parámetros deben pasarse y cuáles se pasan opcionalmentev El tipo de datos del valor de retorno, si lo hay (para un procedimiento)

Se debe incluir un prototipo en las especificaciones de definición del programa oprocedimiento que realiza la llamada. El compilador utiliza el prototipo parallamar correctamente al programa o procedimiento y para asegurar que el llamadorpasa los parámetros correctos.

Las normas siguientes se aplican a las definiciones de prototipo.v Un nombre de prototipo debe especificarse en las posiciones 7-21. Si se especifica

la palabra clave EXTPROC en la definición de prototipo, las llamadas alprograma o procedimiento utilizan el nombre externo especificado para esapalabra clave. Si no se especifica la palabra clave, el nombre externo es elnombre de prototipo, es decir, el nombre especificado en las posiciones 7-21 (enmayúsculas).

v Especifique PR en la entrada del Tipo de definición (posiciones 24-25). Lasdefiniciones de parámetros deben ir inmediatamente después de laespecificación PR. La definición de prototipo finaliza con la primeraespecificación de definición que no tenga espacios en blanco en las posiciones24-25 o con una especificación no de definición.

v Especifique cualquiera de las palabras clave siguientes en tanto que pertenecen ala interfaz de llamada:

Capítulo 6. Subprocedimientos y prototipos 67

Page 90: RPG Referencia

EXTPROC(nombre)La llamada será una llamada de procedimiento enlazado que utiliza elnombre externo especificado por la palabra clave.

CLTPGM(nombre)La llamada será una llamada de programa externo que utiliza el nombreexterno especificado por la palabra clave.

v En la definición de PR se especifica un valor de retorno, si lo hay. Especifique lalongitud y el tipo de datos del valor de retorno. Además, puede especificar laspalabras clave siguientes para el valor de retorno:

DATFMT(fmt)El valor de retorno tiene el formato de fecha especificado en la palabraclave.

DIM(N)El valor de retorno es una matriz de N elementos.

LIKE(nombre)El valor de retorno se define como el ítem especificado por la palabraclave.

PROCPTREl valor de retorno es un puntero de procedimiento.

TIMFMT(fmt)La palabra clave especifica el formato de hora del valor de retorno.

Para obtener información acerca de estas palabras clave, consulte el apartado“Palabras clave de especificación de definición” en la página 237.

Figura 17 muestra un prototipo para un subprocedimiento CVTCHR que toma unparámetro de entrada numérico y devuelve una serie de caracteres. Tenga encuenta que no hay ningún nombre asociado al valor de retorno. Por esta razón, nopuede visualizar el contenido al depurar el programa.

Parámetros con prototipoSi la interfaz de llamada con prototipo incluye el paso de parámetros, debe definirel parámetro inmediatamente después de la especificación PR. Las palabras clavesiguientes, que se aplican a la definición del tipo, se permiten en lasespecificaciones de definición de parámetros:

* El valor devuelto es la representación de caracteres* del parámetro de entrado, NUM, justificado a la* izquierda y rellenado con blancos por la derecha.

*D CVTCHR PR 31AD NUM 30P 0 VALUE

** La expresión siguiente muestra una llamada a CVTCHR.* Si la variable rrn tiene el valor 431, tras este EVAL,* la variable msg tendría el valor* 'Registro 431 no encontrado.'

*C EVAL msg = 'Registro 'C + %TRIMR(CVTCHR(RRN))C + ' no encontrado '

Figura 17. Prototipo para CVTCHR

68 VisualAge RPG Consulta del lenguaje

Page 91: RPG Referencia

ASCENDLa matriz está por orden ascendente.

DATFMT(fmt)El parámetro de fecha tiene el formato fmt.

DIM(N)El parámetro es una matriz con N elementos.

LIKE(nombre)El parámetro se define igual que el ítem especificado por la palabra clave.

PROCPTREl parámetro es un puntero de procedimiento.

TIMFMT(fmt)El parámetro de hora tiene el formato fmt.

Para obtener información acerca de estas palabras clave, consulte el apartado“Palabras clave de especificación de definición” en la página 237.

Las palabras clave siguientes, que especifican cómo debe pasarse el parámetro,también se permiten en las especificaciones de definición de parámetros:

CONSTEl parámetro se pasa por referencia de sólo lectura. Un parámetro definidocon CONST no debe ser modificado por el programa o procedimientollamado. Este método de paso de parámetros permite pasar literales yexpresiones.

NOOPTEl parámetro no se optimizará en el programa o procedimiento llamado.

OPTIONS(opt1 { : opt2 { : opt3 { : opt4 } } })Donde opt1 ... opt4 puedes ser *OMIT, *VARSIZE o *STRING. Por ejemplo,OPTIONS(*VARSIZE).

Especifica las opciones de paso de parámetros siguientes:

*OMIT El valor especial *OMIT puede pasarse para este parámetrode referencia.

*VARSIZE El parámetro puede contener menos datos de los indicadosen la definición. Esta palabra clave sólo es válida paraparámetros de caracteres, parámetros gráficos o matricespasadas por referencia. El programa o procedimientollamado debe tener alguna manera de determinar lalongitud del parámetro pasado.

Nota: Si no se especifica this(*VARSIZE) para los camposde longitud fija, debe pasar como mínimo tantos datoscomo requiera el prototipo; en el caso de los camposde longitud variable, el parámetro debe tener lamisma lomgitud máxima declarada que la indicadaen la definición.

*RIGHTADJ En un parámetro CONST o VALUE, *RIGHTADJ indicaque debe ajustarse por la derecha el valor del parámetro detipo gráfico, UCS-2 o carácter.

*STRING Pasar un valor de caracteres como una serie terminada en

Capítulo 6. Subprocedimientos y prototipos 69

Page 92: RPG Referencia

nulo. Esta palabra clave sólo es válida para parámetros depuntero de base pasados por valor o por referencia de sólolectura.

VALUEEl parámetro se pasa por valor.

Para obtener información sobre las palabra clave listadas, consulte el apartado“Palabras clave de especificación de definición” en la página 237.

Interfaz de procedimientoSi un procedimiento con prototipo tiene parámetros de llamada o un valor deretorno, debe definirse una definición de interfaz de procedimiento, en la secciónfuente principal (para un procedimiento principal) o en la sección desubprocedimiento. Una definición de interfaz de procedimiento repite lainformación de prototipo dentro de la definición de un procedimiento. Se utilizapara anunciar los parámetros de entrada del procedimiento y asegurarse de que ladefinición interna de éste es coherente con la definición externa (el prototipo).

Las reglas siguientes se aplican a las definiciones de interfaz de procedimiento:v El nombre de la interfaz de procedimiento, especificado en las posiciones 7-21,

es opcional. Si se especifica, debe coincidir con el nombre especificado en lasposiciones 7-21 de la definición de prototipo correspondiente.

v Especifique PI en la entrada de Tipo de definición (posiciones 24-25). Ladefinición de interfaz de procedimiento puede especificarse en cualquier partede las especificaciones de definición. En el procedimiento principal, la interfazde procedimiento debe ir precedida por el prototipo al que hace referencia. Enun subprocedimiento se necesita una interfaz de procedimiento si elprocedimiento devuelve un valor o si tiene parámetros, de lo contrario esopcional.

v Las definiciones de parámetros, indicadas mediante espacios en blanco en lasposiciones 24-25, deben ir inmediatamente a continuación de la especificación PI.

v Deben especificarse los nombres de parámetros, aunque no tengan que coincidircon los nombres especificados en el prototipo.

v Todos los atributos de los parámetros, incluyendo el tipo de datos, la longitud yla dimensión, deben coincidir exactamente con los de la definición de prototipocorrespondiente.

v Las palabras clave especificadas en la especificación PI y las especificaciones deparámetro deben coincidir con las especificadas en el prototipo.

Si un módulo contiene llamadas a un procedimiento, debe haber una definición deprototipo para cada programa y procedimiento que quiera llamar. Una forma deminimizar la codificación necesaria consiste en almacenar prototipos en archivos/COPY.

Si proporciona procedimientos con prototipo para otros usuarios, asegúrese deproporcionar también los prototipos (en archivos /COPY).

70 VisualAge RPG Consulta del lenguaje

Page 93: RPG Referencia

Capítulo 7. Soporte SQL

Si su aplicación de VisualAge RPG contiene sentencias de Lenguaje Estructurado(SQL) para acceder a las bases de datos DB2®, deberá realizar las tareas siguientes:1. Instale DB2 y configure el acceso. En los manuales Base de datos universal DB2

Edición Personal: Inicio rápido, SC10-3156 (S10J-8150) y DB2 Universal Database forWindows NT Quick Beginnings, S10J-8149, así como en el apartado DB2 UniversalDatabase para AS/400 de la categoría Bases de datos y sistemas de archivo deInformation Center (que se halla en este sitio Web -http://publib.boulder.ibm.com/pubs/html/as400/infocenter.htm), se explicacómo instalar y configurar los productos DB2 en estaciones de trabajo y ensistemas AS/400. En Instalación de VisualAge RPG y CODE/400 para AS/400,SC10-3064-03 (SC09-2446-03) se explica un método que sirve para configurar elacceso a una base de datos de AS/400.

2. Codifique las sentencias SQL en el programa fuente. En el apartado “Reglassintácticas generales” se explica la manera de codificar una sentencia SQL enun programa VisualAge RPG.

3. Construya la aplicación. En la ayuda en línea de diálogo Opciones deconstrucción del Diseñador GUI se indica qué opciones de construcción puedenseleccionarse para los programas VisualAge RPG con sentencias SQL. Paraobtener información adicional sobre cómo construir, ejecutar y conectarse a unabase de datos, consulte los apartados “Construcción de una aplicación” en lapágina 78, “Ejecución de una aplicación” en la página 78 y “Conexión a unabase de datos” en la página 79.

4. Empaquete e instale la aplicación de usuario. En la publicación Programacióncon VisualAge para RPG, SC10-3067-02 (SC09-2449-02) se explica cómoempaquetar e instalar una aplicación VisualAge RPG.

El soporte SQL incorporado de VisualAge RPG difiere de la mayor parte deimplementaciones restantes en cuanto no existe un precompilador separado paracrear el archivo intermedio que posteriormente se compilará. Las sentencias SQLincorporadas se manejan durante el paso de compilar del proceso de construcción.

La aplicación puede ser construida para utilizar bases de datos locales, bases dedatos en otros nodos de la estación de trabajo o bases de datos en otros servidoresAS/400. Se examinan las diferencias en el nivel de SQL soportado en estos otrossistemas con el nivel de SQL soportado en la estación de trabajo donde se haconstruido. Únicamente se permite la sintaxis soportada por DB2 en la estación detrabajo durante la construcción.

Si traslada la aplicación a otra estación de trabajo, la aplicación sólo se puedeejecutar en el mismo nivel o en un nivel superior de DB2.

Nota: VisualAge RPG da soporte al nivel de función definido en DB2/2 V1.2. Sepueden utilizar los releases más recientes de DB2/2 si en la aplicación sólose utilizan las funciones de V1.2.

Reglas sintácticas generalesLas reglas siguientes indican cuál es la sintaxis de las sentencias SQL incluidas enlos programas fuente VisualAge RPG:1. Las sentencias SQL se codifican en las especificaciones de cálculo. Las

sentencias siguientes son excepciones y se pueden codificar en cualquier lugar

© Copyright IBM Corp. 1994, 2000 71

Page 94: RPG Referencia

antes de los datos de tiempo de compilación (** en las posiciones 1 y 2):INCLUDE, BEGIN DECLARE, END DECLARE.

2. Para indicar dónde comienza una sentencia SQL, codifique /EXEC SQL en lasposiciones 7 a 15. La posición 16 debe estar en blanco. El resto de la línea desdela posición 17 a la 80 puede ser una sentencia SQL o parte de ella.

3. Para especificar el final de una sentencia SQL, codifique /END-EXEC en lasposiciones 7 a 15.

4. Solamente se puede codificar una sentencia SQL entre /EXEC SQL y/END-EXEC.

5. Una sentencia SQL se puede codificar en varias líneas. Las líneas comprendidasentre /EXEC SQL y /END-EXEC deben contener un signo más (+) en laposición 7 y un espacio en blanco en la posición 8.

6. Los literales de tipo carácter pueden ocupar varias líneas. Se codifican hasta lacolumna 80 en una línea y continúan en la columna 9 de la línea siguiente.

7. Para especificar una línea de comentario en la sentencia SQL, coloque unasterisco (*) en la posición 7.

8. Para especificar un comentario en la misma línea que una sentencia SQL, utilice-- en ésta.

9. Debe evitarse la utilización de nombres que comiencen por SQL en elprograma, ya que pueden entrar en conflicto con los nombres SQL.

En el ejemplo siguiente se ilustran las reglas sintácticas generales:

Declaraciones de variables del lenguaje principalSe permiten las sentencias SQL BEGIN DECLARE y END DECLARE en losprogramas de VisualAge RPG, no obstante dichas sentencias se ignoran. Todas lasvariables declaradas son consideradas variables candidatas del lenguaje principal.

Las variables del lenguaje principal se identifican por el signo de dos puntos quelas precede en una sentencia SQL.

Los tipos de datos soportados para las variables del lenguaje principal son datosde tipo carácter, de tipo carácter de longitud variable, gráficos, decimalesempaquetados enteros, decimales con zona, numéricos, numéricos binarios, fecha,hora e indicación de la hora. Los tipos de datos SQL REAL, DOUBLE y VARCHARno están soportados.

La siguiente tabla da un resumen de cómo los tipos de datos de VisualAge RPG seasignan a los tipos de datos SQL.

----+-*--1----+----2----+----3----+----4----+----5----+----6----+C/EXEC SQL WHENEVER SQLERROR GO TO ERRLABC/END-EXECC/EXEC SQL -- principio de sentencia SQLC+ SELECT ** éste es un comentario RPG normal

C+ INTO :hvar1, -- var sist pral unoC+ :hvar2 -- var sist pral dosC+ FROM TABLEXC+ WHERE NAME='TESTING'C/END-EXEC

Figura 18. Reglas sintácticas generales para las sentencias SQL

72 VisualAge RPG Consulta del lenguaje

Page 95: RPG Referencia

Tabla 13. Tipos de datos de sistema principal

Tipo de datos deVARPG

Tipo de datos deSQL

Descripción Notas

Binario de 4 dígitos SMALLINT Entero señalado de 16 bits Sin decimales

Binario de 9 dígitos INTEGER Entero señalado de 32 bits Sin decimales

Decimalempaquetado

DECIMAL(m,n) Tipo de datos numéricoRPG por omisión

Carácter CHAR(m) Carácter de longitud fija Máximo de 254 caracteres

Gráfico GRAPHIC(m) Serie DBCS de longitud fija Máximo de 127 caracteres

Decimal con zona DECIMAL(m,n) Número de coma fija Convertido a decimal empaquetado porRPG antes o después de la operación deDB2.

Fecha DATE Fecha Los siguientes formatos están soportadospor DB2: *ISO, *USA, *EUR, *JIS. Otrosformatos RPG son convertidos por RPGantes o después de la operación de DB2.

Hora TIME Hora Los siguientes formatos están soportadospor DB2: *ISO, *USA, *EUR, *JIS. Otrosformatos RPG son convertidos por RPGantes o después de la operación de DB2.

Indicación de la hora TIMESTAMP Indicación de la hora

Reglas de las variables del lenguaje principalA continuación se describen las reglas para las variables del lenguaje principal:1. Las variables del lenguaje principal pueden ser cualquier campo de carácter

escalar, numérico, de fecha, de hora, de indicación de la hora o DBCS definidoen el programa. Las variables del lenguaje principal no pueden tratarse deninguno de los siguientes casos:v Estructuras de datos de múltiples aparicionesv Nombres de campo de indicador (*INxx)v Tablasv UDATE, UDAY, UMONTH, UYEAR

2. Las matrices indexadas no se permiten como variables del lenguaje principal.3. Todos los tipos de datos numéricos en SQL son compatibles y se producen las

conversiones adecuadas el tipo de la variable del lenguaje principal no coincidecon la definición de columna. Esto incluye las columnas de bases de datos ennotación científica (FLOAT). Recibirá un mensaje que indicará el truncamiento.

4. Todos los tipos de datos de carácter en SQL son compatibles y se producen lasconversiones adecuadas cuando el tipo de la variable del lenguaje principal nocoincide exactamente con la definición de columna. SQL realizará lasconversiones adecuadas entre el dato de tipo carácter de longitud fija y el delongitud variable. Recibirá un mensaje que indicará el truncamiento.

5. Todos los tipos de datos DBCS en SQL son compatibles y se producen lasconversiones adecuadas cuando el tipo de la variable del lenguaje principal nocoincide exactamente con la definición de columna. SQL realizará lasconversiones apropiadas entro los datos DBCS de longitud fija y los delongitud variable. Recibirá un mensaje que indicará el truncamiento.

6. Los campos de fecha, de hora y de indicación de la hora en SQL soncompatibles con los campos de tipo carácter. Por ejemplo, cuando una columnade fecha SQL es llevada a una variable del lenguaje principal de tipo carácter,es formateada utilizando el valor de formato Fecha/Hora especificado en lapágina de opciones de DB2 del cuaderno Construir.

Capítulo 7. Soporte SQL 73

Page 96: RPG Referencia

7. Las variables de indicador deben ser declaradas como numéricos binarios de 4dígitos.

8. Las estructuras de datos de aparición única sin subcampos son consideradastipo de datos carácter siguiendo las reglas RPG normales (consulte“Capítulo 11. Estructuras de datos” en la página 147). Las estructuras de datoscon subcampos se consideran estructuras del lenguaje principal.

Estructuras de datos como variables del lenguaje principalAl especificar una estructura de datos como un a variable del lenguaje principal enuna sentencia SQL, el nombre hace referencia a todos los subcampos de laestructura de datos. Esta manera es adecuada para especificar una larga lista devariables del lenguaje principal. La Figura 19 ilustra el código fuente si no seutiliza una estructura de datos mientras que la Figura 20 ilustra el código fuente sise utiliza una estructura de datos.

Utilizando la estructura de datos:

A pesar de que existe cierta codificación extra para los subcampos de la estructurade datos, la lista de las variables del lenguaje principal en la sentencia SQL esmucho más pequeña. Puesto que probablemente existen varias sentencias SQL enel programa, el esfuerzo de codificación global puede ser menor.

Variables de indicador y estructurasSi las variables de indicador son necesarias (por ejemplo, a causa de las columnasnulas), se puede especificar una matriz numérica binaria breve junto con el nombrede la estructura del lenguaje principal.

----+-*--1----+----2----+----3----+----4----+----5----+----6----+C/EXEC SQLC+ SELECT *C+ INTO :F1, :F2, :F3, :F4, :F5, :F6, :F7C+ FROM TABLEXC+ WHERE NAME='GASPARE'C/END-EXEC

Figura 19. Codificación de variables del lenguaje principal sin utilizar una estructura de datos

----+-*--1----+----2----+----3----+----4----+----5----+----6----+D ROW DSD F1 1 10D F2 11 20D F3 21 30D F4 31 40D F5 41 50D F6 51 60D F7 61 70*

C/EXEC SQLC+ SELECT *C+ INTO :ROWC+ FROM TABLEXC+ WHERE NAME='GASPARE'C/END-EXEC

Figura 20. Codificación de variables del lenguaje principal utilizando una estructura de datos

74 VisualAge RPG Consulta del lenguaje

Page 97: RPG Referencia

Es lo mismo que codificar cada elemento de matriz como una variable deindicador. Por ejemplo, la variable de indicador para el campo F1 es AI(1); para elcampo F2, AI(2); etc.

Reglas de la estructura del lenguaje principalA continuación se describen las reglas para las estructuras del lenguaje principal:v Una única sentencia SQL puede contener una o más estructuras del lenguaje

principal.v La estructura de datos debe contener subcampos a fin de poder ser reconocida

como una estructura del lenguaje principal. Una estructura de datos sinsubcampos es considerada un campo normal de carácter.

v Los nombres de estructura del lenguaje principal pueden ir seguidosinmediatamente por una matriz de indicador, que se trata de una matriznumérica binaria sin decimales. Cada elemento de la matriz corresponde a unsubcampo de la estructura de datos.

Sentencia /EXEC SQL INCLUDELa sentencia /EXEC SQL INCLUDE puede aparecer en cualquier parte delprograma antes de la sección de datos de la hora de compilación (** en lasposiciones 1-2). El nombre de archivo se especifica mediante un único nombre. Laextensión de archivo por omisión es VPG.

Nota: El nombre de archivo sólo puede hacer referencia a un archivo local.

Sentencia /EXEC SQL INCLUDE SQLCAUna estructura de datos SQLCA se incluye automáticamente en el programa deVisualAge RPG cuando el proceso de la base de datos se ha especificado en lapágina de opciones DB2 del cuaderno de Construcción. Se incluye la estructura dedatos incluso cuando la sentencia INCLUDE SQLCA no se ha especificado.

Puede utilizar la estructura de datos SQLCA para consultar el resultado de cadasentencia SQL después de que haya sido ejecutada.

----+-*--1----+----2----+----3----+----4----+----5----+----6----+D ROW DSD F1 1 10D F2 11 20D F3 21 30D F4 31 40D F5 41 50D F6 51 60D F7 61 70*

D STRUCT DSD AI 1 14B 0 DIM(7)*

C/EXEC SQLC+ SELECT *C+ INTO :ROW:AIC+ FROM TABLEXC+ WHERE NAME='GASPARE'C/END-EXEC

Figura 21. Variables de indicador y estructuras

Capítulo 7. Soporte SQL 75

Page 98: RPG Referencia

Si se ha especificado la sentencia INCLUDE SQLCA, la definición de la estructurade datos se incluye en ese punto del programa. Las instancias posteriores de lasentencia INCLUDE SQLCA son ignoradas.

Nota: La estructura de datos SQLCA también se puede incluir utilizando ladirectiva del compilador /COPY, en lugar de /EXEC SQL INCLUDESQLCA.

La Figura 22 muestra el diseño de la estructura de datos SQLCA:

Sentencia /EXEC SQL WHENEVERLa sentencia /EXEC SQL WHENEVER determina qué manejo de errores se realizadespués de ejecutar las sentencias SQL. La Figura 23 ilustra la sintaxis de lasentencia /EXEC SQL WHENEVER.

Nota: La <condición> es SQLWARNING, SQLERROR o NOT FOUND. La<acción> es GOTO <nombre-etiqueta>, GO TO <nombre-etiqueta> oCONTINUE.

----+-*--1----+----2----+----3----+----4----+----5----+----6----+SQL D* Inicio de la estructura de datos SQLCASQL D SQLCA DSSQL D SQLAID 1 8ASQL D SQLABC 9 12B 0SQL D SQLCOD 13 16B 0SQL D SQLERL 17 18B 0SQL D SQLERM 19 88ASQL D SQLERP 19 96ASQL D SQLERRD 97 120B 0 DIM(6)SQL D SQLERR 97 120ASQL D SQLER1 97 100B 0SQL D SQLER2 101 104B 0SQL D SQLER3 105 108B 0SQL D SQLER4 109 112B 0SQL D SQLER5 113 116B 0SQL D SQLER6 117 120B 0SQL D SQLWRN 121 127ASQL D SQLWN0 121 121ASQL D SQLWN1 122 122ASQL D SQLWN2 123 123ASQL D SQLWN3 124 124ASQL D SQLWN4 125 125ASQL D SQLWN5 126 126ASQL D SQLWN6 127 127ASQL D SQLWN7 128 128ASQL D SQLWN8 129 129ASQL D SQLWN9 130 130ASQL D SQLWNA 131 131ASQL D SQLSTT 132 136ASQL D* Fin de la estructura de datos SQLCA

Figura 22. Expansión fuente de la estructura de datos SQLCA

C/EXEC SQL WHENEVER <condición> <acción>C/END-EXEC

Figura 23. Sintaxis de la sentencia SQL WHENEVER

76 VisualAge RPG Consulta del lenguaje

Page 99: RPG Referencia

La sentencia /EXEC SQL WHENEVER identifica la acción que se realizará cuandouna sentencia SQL vuelve con un código de retorno de no cero. Se aplica a todaslas posteriores sentencias SQL en el programa hasta la sentencia /EXEC SQLWHENEVER siguiente.

Se emite un mensaje siempre que la acción no se puede aplicar basándose en lasección del código donde se encuentra la sentencia. La Figura 24 ilustra este caso.

En este ejemplo, la sentencia 7 no es válido puesto que la acción WHENEVERprovocaría una bifurcación en otra subrutina. Los posibles valores de la condiciónson:v SQLWARNING: La acción es invocada si el valor del código de retorno SQL es

mayor que 0 y menor que 100.v SQLERROR: La acción es invocada si el valor del código de retorno SQL es

menor que 0.v NOT FOUND: La acción es invocada si el valor del código de retorno SQL es

100.

Los posibles valores de la acción son:v GOTO <nombre-etiqueta>: Si la condición es auténtica, la ejecución se reanuda

en el nombre de etiqueta especificado.v CONTINUE: Si la condición es auténtica, la ejecución se reanuda en la siguiente

sentencia ejecutable en el programa. Esta es la acción por omisión.

Nota: La sentencia /EXEC SQL WHENEVER debe aparecer en las especificacionesde cálculo.

Sentencia /EXEC SQL BEGIN DECLAREEl compilador ignora la sentencia /EXEC SQL END DECLARE, aunque no ignoralas sentencias que hay en medio. La Tabla 14 describe cómo asignar los tipos dedatos SQL en los tipos de datos de VisualAge RPG.

Tabla 14. Asignación de tipos SQL a las variables del lenguaje principal

Tipo de datos deSQL

Tipo de datos deVARPG

Formato de datos

(pos 43)

Longitud (Bytes)

(pos 44-51)

Posicionesdecimales

(pos 52)

SMALLINT Binario de 4dígitos

B 2 0

INTEGER Binario de 9dígitos

B 4 0

---+-*--1----+----2----+----3----+----4----+----5----+----6----+1 C SUBR1 BEGSR2 C/EXEC SQL WHENEVER SQLERROR GOTO ERRLAB3 C/END-EXEC4 C ERRLAB TAG5 C ENDSR6 C SUBR2 BEGSR7 C/EXEC SQL FETCH ...8 C/END-EXEC9 C ENDSR

Figura 24. Mensajes de error utilizando SQL WHENEVER

Capítulo 7. Soporte SQL 77

Page 100: RPG Referencia

Tabla 14. Asignación de tipos SQL a las variables del lenguaje principal (continuación)

Tipo de datos deSQL

Tipo de datos deVARPG

Formato de datos

(pos 43)

Longitud (Bytes)

(pos 44-51)

Posicionesdecimales

(pos 52)

DECIMAL(m,n) Decimalempaquetado

P m/2+1 n

CHAR(m) Carácter m

DATE Fecha 10

TIME Hora 8

TIMESTAMP Indicación de lahora

26

GRAPHIC(m) Gráfico G m*2

Manejo de errores durante la ejecuciónSi una sentencia SQL falla, no se emiten mensajes durante la ejecución. Deberácodificar una sentencia SQL WHENEVER o comprobar explícitamente el valorSQLCOD a fin de detectar esos errores.

Construcción de una aplicaciónPara construir una aplicación que contenga el SQL incorporada, deberá especificarlas siguientes opciones en el cuaderno de Construcción:v Nombre de base de datos DB2v Un nombre de Paquete o un nombre de Archivo de enlace

Para obtener más información, consulte la publicación Programación con VisualAgepara RPG, SC10-3067-02 (SC09-2449-02).

El nombre de la base de datos que especifique deberá estar catalogado en laestación de trabajo. Deberá tener la autoridad adecuada para utilizar la base dedatos. Cuando empiece a construir una aplicación, se inicia automáticamente elGestor de base de datos DB2 (el proceso de construcción emite el mandatoDB2START). No obstante, si construye la aplicación desde un entorno de cliente,usted mismo deberá iniciar el gestor de base de datos en el servidor. Paraconectarse a la base de datos automáticamente durante la compilación, primerodeberá especificar un ID de usuario y una contraseña válidos en la página deconexión a DB2 del cuaderno de Opciones de construcción. En posterioresconstrucciones, VARPG utilizará esta información para conectarse a la base dedatos.

Antes de que la aplicación pueda ejecutarse, deberá crear un paquete. Un paquetees un objeto almacenado en la base de datos que incluye información para ejecutarel SQL incorporado en la aplicación o programa. Si el paquete se crea durante laconstrucción, esto es construir con enlace habilitado. Esto permite que la aplicaciónsólo acceda a la base de datos utilizada durante la construcción. Si la aplicación seconstruye con el enlace diferido, se crea un archivo de enlace y la aplicación puedeacceder a muchas bases de datos.

Ejecución de una aplicaciónPara ejecutar una aplicación que contenga el SQL incorporado, deberán existir lassiguientes condiciones:

78 VisualAge RPG Consulta del lenguaje

Page 101: RPG Referencia

v La base de datos a la que accede la aplicación debe estar catalogada en laestación de trabajo

v Deberá tener la autorización necesaria para acceder a la base de datosv La indicación de la hora con la que se construyó la aplicación debe coincidir con

la indicación de la hora del paquete de la base de datos a la que se accede.

Cuando ejecute la aplicación de VisualAge RPG, el Gestor de base de datos DB2 seinicia automáticamente (DB2START). Si ejecuta la aplicación desde un entorno decliente, usted mismo deberá iniciar el gestor de base de datos en el servidor.

Si la aplicación ha sido construida con enlace diferido, los archivos de enlace lógicoque se producen deben enlazarse a la base de datos antes de poder ejecutar laaplicación.

Al construir la aplicación, hay una indicación de la hora incorporada. Estaindicación de la hora se compara con el paquete de la base de datos al ejecutar laaplicación. Si las indicaciones de la hora no son iguales, la aplicación no seejecutará. Esta discrepancia puede producirse si la aplicación se ejecuta dentro deun paquete más antiguo.

Si traslada la aplicación a otra estación de trabajo, las indicaciones de la hora de laaplicación deben coincidir con las indicaciones de la hora del paquete al queacceder en la estación de trabajo nueva. Puede realizar una de estas acciones:v Volver a ejecutar bind en la aplicación emitiendo el siguiente mandato desde la

línea de mandatos:sqlbind applic1.bnd typesx

donde sqlbind es el mandado de DB2, applic1.bnd es el archivo de enlace creadodurante la construcción y typesx es la base de datos a la que desea acceder.

v Configurar el acceso a la base de datos utilizada por la aplicación. Deberácatalogar la base de datos a la que intenta acceder en la estación de trabajonueva. Se trata de la misma base de datos utilizada durante la construcción. Labase de datos puede encontrarse en otra estación de trabajo o bien en un sistemaremoto.

Conexión a una base de datosAntes de que la aplicación pueda acceder a una base de datos, deberá tener unaconexión a dicha base de datos. Podrá realizar la conexión utilizando la sentenciaCONNECT TO o utilizando una conexión implícita.

Utilización de la sentencia CONNECT TOPuede especificar el nombre de la base de datos a la que desea conectarseutilizando la sentencia CONNECT TO en la aplicación. Por ejemplo,

C\EXEC SQL CONNECT TO LATONAC\END-EXEC

Nota: LATONA es el nombre de la base de datos.

Puede utilizar una variable para el nombre de la base de datos como se muestra enel siguiente ejemplo:

D server s 10aD userid s 8aD password s 10a...C eval server = 'LATONA'

Capítulo 7. Soporte SQL 79

Page 102: RPG Referencia

C eval userid = 'IDUSUARIO'C eval password = 'contraseña'...C\EXEC SQLC+ CONNECT TO :server IN SHARE MODE user :userid using :passwordC\END-EXEC

Para obtener más información sobre la sintaxis de la sentencia CONNECT SQL,consulte el Manual de consulta de SQL para la configuración de DB2.

Utilización de una conexión implícitaPuede establecer una conexión implícita a la base de datos estableciendo lavariable de entorno SQLDBDFT para indicar a la base de datos que deseaconectarse implícitamente. Por ejemplo,SET SQLDBDFT=LATONA

Esta variable de entorno puede establecerse en el archivo CONFIG.SYS o desde elindicador de mandatos de la sesión.

Si ejecuta la aplicación en un entorno de Windows, puede conectarse a una base dedatos de la siguiente manera:SET DB2DBDFT=LATONASET DB2USERID=IDUSUARIOSET DB2PASSWORD=contraseña

Estas variables de entorno están establecidas en el archivo AUTOEXEC.BAT.

Nota: Existen algunas diferencias en los nombres de las variables de entorno enfunción de la configuración de la DB2 instalada. Consulte los manuales deinstalación de DB2.

80 VisualAge RPG Consulta del lenguaje

Page 103: RPG Referencia

Capítulo 8. Consideraciones sobre archivos

En este apartado se describe cómo utilizar los archivos en un programa deVisualAge RPG. El programa puede utilizar los archivos DISK, PRINTER ySPECIAL:v Archivos DISK:

– Los archivos DISK pueden ser remotos o locales– Los archivos DISK remotos deben estar descritos externamente.– Los archivos DISK locales deben estar descritos por programa.

v Archivos PRINTER:– Se permite un máximo de ocho archivos PRINTER– Los archivos PRINTER deben estar descritos por programa– Los archivos PRINTER deben ser locales

v Archivos SPECIAL:– Los archivos SPECIAL deben estar descritos por programa– Los archivos SPECIAL deben ser locales

Para obtener más información sobre cómo especificar los archivos, consulte losapartados siguientes:v “Capítulo 17. Especificaciones de descripción de archivo” en la página 213v “Capítulo 18. Especificaciones de definición” en la página 227v “Capítulo 19. Especificaciones de entrada” en la página 267v “Capítulo 21. Especificaciones de salida” en la página 289.

Archivos de discoEn el apartado “Parte 3. Especificaciones” en la página 189 se describe cómo definirlos archivos locales y remotos en las diversas especificaciones. En este apartado sedescriben las consideraciones adicionales si la aplicación de VisualAge RPG utilizaarchivos locales o archivos de bases de datos AS/400.

Archivos localesA continuación se facilita un resumen de las restricciones de los archivos locales:v El archivo local no puede ser bloqueado.v Los campos numéricos de los archivos locales se escriben y leen tal cual, sin

conversión alguna.v Si el programa realiza E/S en un archivo local que no existe, se crea dicho

archivo.v Si VisualAge RPG crear el archivo local, los registros de dicho archivo terminan

con un salto de línea de retorno de carro. Si utiliza un archivo local que nocontiene saltos de línea de retorno de carro, la aplicación VisualAge RPG nopodrá realizar las operaciones de E/S en este archivo.

v Las tramas de bits de un archivo local se leen tal cual en el almacenamiento. Siuna trama de bits contiene la representación binaria de un salto de línea deretorno de carro (CRLF), el registro que el programa de VisualAge RPG lee, sedividirá en dos registros.

v Si un archivo local contiene números binarios, los números son intercambiadospor bytes.

Archivos de AS/400Los códigos de operación de VisualAge RPG pueden acceder a los archivos debases de datos lógicos, físicos de fuente y físicos de AS/400. Si desea obtener más

© Copyright IBM Corp. 1994, 2000 81

Page 104: RPG Referencia

información sobre la configuración de archivos de base de datos de AS/400,consulte el apartado DB2 Universal Database para AS/400 de la categoría Bases dedatos y sistemas de archivos de Information Center, que se halla en este sitio Web -http://publib.boulder.ibm.com/pubs/html/as400/infocenter.htm.

Antes de que la aplicación acceda a los archivos de bases de datos de AS/400,debe establecer el servidor. Para obtener más información sobre cómo configurarun servidor, consulte las publicaciones Iniciación a VisualAge RPG y CODE/400,SC10-3287-01 (SC09-2625-01) y Programación con VisualAge para RPG, SC10-3067-02(SC09-2449-02).

Cuando la aplicación VisualAge RPG accede a un archivo de bases de datos deAS/400, se utiliza un trabajo de servicio DDM para manejar las peticiones de E/Sde la base de datos. Se utiliza un único trabajo de servicio DDM en cada servidorAS/400 distinto donde se abren los archivos de cada aplicación de VisualAge RPG.Al finalizar la aplicación, finalizan todos los trabajos de servicio DDM de AS/400.

Compartir la vía de acceso de datos abierta de archivos AS/400No está soportado compartir vías de acceso de datos abiertas. Si una aplicación deVisualAge RPG contiene un mandato OPNQRYF CL, entonces la vía de acceso dedatos abierta asociada al mandato OPNQRYF no puede ser compartida por losarchivos abiertos en la aplicación de VisualAge RPG.

Si la aplicación de VisualAge RPG llama a un programa que utiliza el mandatoOPNQRYF, se puede compartir la vía de acceso de datos abiertos.

Cada apertura realizada por la aplicación de VisualAge RPG crea una vía de accesode datos abierta exclusiva. Múltiples aperturas del mismo archivo de base de datosdentro de la misma aplicación de VisualAge RPG da como resultado distintasinstancias del archivo, cada una con su propia vía de acceso de datos abierta.

Puede abrir el mismo archivo de base de datos más de una vez utilizandodiferentes nombres de alias para los archivos en el programa de VisualAge RPGpara hacer referencia al mismo archivo de base de datos AS/400 real. Debe definirdiversas páginas de archivo en el cuaderno Definir información de AS/400.

También puede abrir el mismo archivo de base de datos en distintos componenteslógicos de la aplicación de VisualAge RPG.

Conversiones de datos de archivos de AS/400Los datos se almacenan de forma distinta en el sistema AS/400 que en la estaciónde trabajo. Po esta razón, el producto de VisualAge RPG convierte los datos si laaplicación de VisualAge RPG llama a los programas de AS/400, accede a las áreasde datos de AS/400 o accede a los archivos de base de datos de AS/400. Estaconversión garantiza que los datos están correctamente representados tanto en laestación de trabajo como en el servidor AS/400.

Si se pasa una estructura de datos como un parámetro a un llamada a unprograma de AS/400 o si la estructura de datos representa un área de datos deAS/400, cada subcampo es convertido basándose en su tipo de datos.

Nota: A fin de que las conversiones de datos funcionen, todos los archivos de basede datos de AS/400 y los archivos TO/FROM deben estar descritosexternamente.

Las siguientes conversiones se realizan en los tipos de datos de VisualAge RPG:

82 VisualAge RPG Consulta del lenguaje

Page 105: RPG Referencia

Datos de tipo carácter:Los datos de tipo carácter se convierten de EBCDIC a ASCII y a la inversa.Todos los datos de tipo carácter almacenados en la base de datos deAS/400 deben ser identificados con un EBCDIC CCSID adecuado a fin deque la conversión funcione correctamente. Los datos de tipo carácter seconvierten en función del CCSID del campo de caracteres y de la páginade códigos de la estación de trabajo ASCII. Si la aplicación llama a unprograma de AS/400 o accede a un área de datos de AS/400, al convertirlos datos se utiliza el CCSID del trabajo de AS/400 que sirve a la llamadao la petición del área de datos.

Si desea obtener más información sobre la identificación de los datos detipo carácter, consulte el apartado DB2 Universal Database para AS/400 de lacategoría Bases de datos y sistemas de archivos de Information Center, que sehalla en este sitio Web -http://publib.boulder.ibm.com/pubs/html/as400/infocenter.htm.

Tipo de datos gráfico:El Tipo de datos gráfico contiene todos los caracteres DBCS sin loscaracteres SO y SI. Puesto que este es el formato que el sistema espera, sepuede utilizar todo el tipo de datos gráfico.

Nota: Si la aplicación emite peticiones de E/S de AS/400, deberáidentificar los campos Gráfico de AS/400 con un CCSID de DBCSadecuado a fin de que la conversión de VisualAge RPG funcionesatisfactoriamente.

Tipos de datos de fecha, hora e indicación de la hora:La conversión es la misma que para los datos de tipo carácter. No esnecesaria la identificación CCSID explícita para el acceso a la base de datosde AS/400.

Tipo de datos numérico con zona:Se convierten los números con zona de modo que puedan visualizarse eimprimirse tanto en el servidor AS/400 como en la estación de trabajo.

Al convertir números con zona EBCDIC negativos a ASCII, la parte designo del último byte se convierte en x’7’. Consulte el apartado “Formatodecimal con zona” en la página 121.

Tipo de datos decimal empaquetado:Al convertir los números EBCDIC empaquetados a ASCII, la parte de signodel número empaquetado se convierte en x’C’ si el número es positivo y enx’D’ si el número es negativo. Consulte el apartado “Formato decimalempaquetado” en la página 119.

Tipos de datos binarios:Los campos binarios se reordenan cuando estos datos se envían entre elservidor AS/400 y la estación de trabajo.

Las siguientes conversiones se realizan en los tipos de base de datos de AS/400:

Tipos de datos flotantes:Los campos Binario y Flotante son intercambiados por bytes cuando seenvían estos datos entre el servidor AS/400 y la estación de trabajo. Porejemplo,v Un campo entero de 2 bytes en el servidor AS/400 que contiene ’1 2’ se

convierte en ’2 1’ en la estación de trabajo.v Un campo entero de 2 bytes que contiene ’2 1’ en la estación de trabajo

se convierte en ’1 2’ en el servidor AS/400.

Capítulo 8. Consideraciones sobre archivos 83

Page 106: RPG Referencia

v Un campo entero de 4 bytes en el servidor AS/400 que contiene ’1 2 3 4’se convierte en ’4 3 2 1’ en la estación de trabajo.

v Un campo entero de 4 bytes que contiene ’4 3 2 1’ en la estación detrabajo se convierte en ’1 2 3 4’ en el servidor AS/400.

Tipo de datos hex y datos de tipo carácter identificados con un CCSID de 65535La conversión de datos no se produce si el campo de tipo carácter estáidentificado con un CCSID de 65535 (lo cual implica que no tendrá lugar laconversión).

Tipos de datos J, O o E:Los tipos de datos J (sólo DBCS), O (Datos mezclados) y E (Todos de unsolo byte o todos de doble byte) son tratados como campos de tipo carácteren el programa de VisualAge RPG.

Los tipos de datos J, O y E deben estar identificados con un CCSIDadecuado. No obstante, puesto que puede que contengan caracteres DBCS,son especiales. En el servidor AS/400, los caracteres DBCS para estos tiposde datos van entre los caracteres SO (Shift out) y SI (Shift In). En laestación de trabajo, la DBCS no va entre los caracteres SO y SI.

Al recuperar datos del servidor AS/400, estos caracteres están deterioradosy el campo de tipo carácter está rellenado con dos blancos de colaadicionales.

Al enviar los datos al servidor AS/400, deberá asegurarse de que haysuficientes blancos de cola en el campo de tipo carácter de modo quepuedan ser sustituidos por el número adecuado de caracteres SO y SI quese añadirán al campo DBCS de AS/400.

Por ejemplo, supongamos que se crea un campo O (datos mezclados) en labase de datos de AS/400. En la estación de trabajo, antes de ser escrito enla base de datos de AS/400, este campo contiene lo siguiente.

sbDBsbDBblblblblDonde sb = Carácter de un solo byte.

DB = Carácter de doble byte.bl = Carácter en blanco de un solo byte.

En este ejemplo, este campo se convierte de la siguiente manera:sbSODBSIsbSODBSI

Nota: Los blancos de cola de un solo byte son considerados insignificantesy son sustituidos por los caracteres SO y SI de forma adecuada.

Campos de longitud variable:En las peticiones de E/S de AS/400, se reordena la parte Binario cuando serealiza el envío de estos datos entre el servidor AS/400 y la estación detrabajo. La parte de carácter se convierte basada en el CCSID de campo.

Control de compromiso de los archivos de la base de datos deAS/400El control de compromiso de AS/400 le permite procesar un grupo de cambios dela base de datos como una unidad. Esta unidad puede aplicarse satisfactoriamentea la base de datos de AS/400 emitiendo una operación commit. Los cambiosasociados a la unidad pueden retrotraerse si no es posible aplicarlossatisfactoriamente como un grupo.

La información que entre en el cuaderno Definir información de AS/400 le permitedefinir múltiples archivos de bases de datos de AS/400 para la aplicación deVisualAge RPG. Dichos archivos pueden existir en diversos servidores de AS/400.

84 VisualAge RPG Consulta del lenguaje

Page 107: RPG Referencia

Para obtener más información sobre cómo definir la información de AS/400,consulte las publicaciones Iniciación a VisualAge RPG y CODE/400, SC10-3287-01(SC09-2625-01) y Programación con VisualAge para RPG, SC10-3067-02 (SC09-2449-02).

Sólo se puede iniciar un entorno de control de compromiso en un servidor AS/400.Todavía puede utilizar el archivo de base de datos AS/400 en otros servidoresAS/400. No obstante, estos archivos no se pueden abrir bajo de control decompromiso.

Una vez el entorno de control de compromiso se ha iniciado en un servidor, puedeabrir los archivos de base de datos AS/400 en dicho servidor mediante la palabraclave COMMIT en la especificación de archivo de los archivos que desea abrir bajoel control de compromiso. Sólo los archivos abiertos bajo el control de compromisose ven afectados por las posteriores operaciones COMMIT y ROLLBK. Para obtenermás información sobre la palabra clave COMMIT, consulte el apartado“COMMIT{(rpg_nombre)}” en la página 221.

Una vez efectuados los cambios adecuados asociados a la transacción, podrácomprometer los cambios en la base de datos AS/400 mediante el código deoperación COMMIT o bien podrá retrotraer los cambios de la base de datosAS/400 mediante el código de operación ROLLBK.

El control de compromiso finaliza al finalizar la aplicación de VisualAge RPG. Sihay cambios pendientes en la base de datos AS/400 que no han sidoexplícitamente comprometidos o retrotraídos, cuando termina la aplicación seproduce una operación de retrotracción implícita.

Puede escribir un programa de modo que la decisión de abrir un archivo bajo elcontrol de compromiso se toma durante la ejecución. La palabra clave COMMIT enla especificación de archivo tiene un parámetro que le permite especificar el controlde compromiso adicional. Para obtener más información sobre la utilización de lapalabra clave COMMIT para controlar la apertura de un archivo para el control decompromiso durante la ejecución, consulte el apartado “COMMIT{(rpg_nombre)}”en la página 221.

Comprobación de nivel: VisualAge RPG da soporte a la comprobación de nivelentre un programa de VisualAge RPG y los archivos de base de datos AS/400 quese están utilizando.

El compilador de VisualAge RPG proporciona la información requerida por lacomprobación de nivel. La comprobación de nivel se produce en formato deregistro cuando se abre el archivo, a menos que especifique LVLCHK(*NO) al crearo modificar el archivo de base de datos AS/400.

Nota: Si se produce una comprobación de nivel, se maneja como un error de E/S.

Coma flotante: Los campos de coma flotante no son soportados. Si procesa unarchivo AS/400 descrito externamente con campos de coma flotante, la aplicaciónde VisualAge RPG no puede acceder a los campos de coma flotante. Cuando creeun nuevo registro, los campos de coma flotante del registro tendrán un valor decero. Cuando actualice los registros existentes, los campos de coma flotante no sealteran. No puede utilizar un campo de coma flotante como un campo clave.

Bloqueo de archivos: El sistema OS/400 permite colocar un estado de bloqueo(exclusivo, exclusivo que permite la lectura, compartido para actualización,compartido para no actualización o compartido para lectura) en un archivo

Capítulo 8. Consideraciones sobre archivos 85

Page 108: RPG Referencia

utilizado durante la ejecución de un trabajo. Los programas de dentro de untrabajo no se ven afectados por los estados de bloqueo de archivo. Un estado debloqueo de archivo se aplica únicamente cuando un programa en otro trabajointenta utilizar el archivo simultáneamente. Se puede asignar el estado de bloqueode archivo con el mandato ALCOBJ (Allocate Object) de CL. Si desea obtener másinformación sobre la asignación de recursos y los estados de bloqueo, consulte elapartado CL y API de la categoría Programación de Information Center, que sehalla en este sitio Web -http://publib.boulder.ibm.com/pubs/html/as400/infocenter.htm.

El sistema OS/400 coloca los siguientes estados de bloqueo en los archivos de basede datos cuando abre los archivos:v Abierto para INPUT: Estado de bloqueo de Compartido para lecturav Abierto para UPDATE: Estado de bloqueo de Compartido para actualizaciónv Abierto para ADD: Estado de bloqueo de Compartido para actualizaciónv Abierto para OUTPUT: Estado de bloqueo de Compartido para actualización

Bloqueo de registros: Cuando se lee un registro de un archivo que ha sidoabierto para actualizarlo, se aplica un bloqueo al registro. Otros programas delsistema AS/400 y otras instancias abiertas de la aplicación de VisualAge RPG delmismo archivo no pueden leer este registro para actualizarlo hasta que se libere elbloqueo de registro.

Si el archivo es un archivo de actualización, podrá leer un registro incluso con elobjetivo de efectuar entradas mediante el ampliador de código de operación (N) enel campo de código de operación que sigue al nombre del código de operación.Los siguientes códigos de operación hacen que un registro sea bloqueado si no seespecifica el ampliador de código de operación (N):v CHAINv READv READEv READPv READPE

El bloqueo permanece hasta que da una de las siguientes circunstancias:v El registro se actualizav El registro se suprimev Se lee otro registro desde el archivo (para entradas o actualización)v Se ejecuta una operación SETLL o SETGT contra el archivov Se ejecuta una operación UNLOCK contra el archivov Cuando se ejecuta contra el archivo una operación de salida definida por una

especificación de salida sin nombres de campo incluidos

Nota: Las operaciones de salida que añaden un registro a un archivo no hacenque se libere el bloqueo del registro.

Si el programa intenta leer un registro para actualizarlo y el registro todavía estábloqueado por otra instancia de apertura de archivo, la operación de lectura esperahasta que el registro se desbloquea. Si el tiempo de espera excede el parámetroWAITRCD en el archivo, se produce una excepción. Si el programa no maneja estaexcepción (RNQ1218), el gestor de errores por omisión toma el control. Tiene laopción de reintentar la operación. Esto permite que el programa continúe como sino se hubiera producido el tiempo de espera para el bloqueo de registro.

Nota: Si el archivo tiene una subrutina INFSR especificada al ejecutar unaoperación de E/S en el archivo antes de que el gestor de errores por omisión

86 VisualAge RPG Consulta del lenguaje

Page 109: RPG Referencia

tome el control, pueden producirse resultados inesperados si la operación deentrada que se ha reintentado es una operación secuencial. Esto puedeocurrir si se ha modificado el cursor de archivo.

Archivos de impresoraLas reglas siguientes se aplican a los archivos de impresora:v La longitud de registro para el dispositivo de impresora en una aplicación de

VisualAge RPG debe ser menor que o igual que el ancho de página físico.v Se inserta un salto de página automático cuando el valor de la línea actual es

igual al valor especificado por la palabra clave is FORMLEN(n), donde la n es elnúmero de líneas por página. Si FORMLEN no se especifica, la longitud depágina por omisión es de 66 líneas.

v Si la impresión finaliza en medio de una página del archivo de impresora,automáticamente se añade un salto de página.

Las restricciones siguientes se aplican a los archivos de impresora:v El área de realimentación PRINT (para el número de páginas y líneas) se

actualiza únicamente después de una operación POST.v Los códigos de retorno mayor/menor, las áreas de realimentación de E/S y las

áreas de realimentación abiertas no están soportadas.v Desbordar/traer no está soportado. Sin embargo, cuando el número de líneas

alcanza el valor especificado por FORMLEN (o el valor por omisión de 66), secrea un salto de página.

v Puesto que el desbordamiento no está soportado, la rutina *OFL (para lasexcepciones y errores de archivo) tampoco está soportada. Esto significa que*ROUTINE no se actualiza con este valor en el área de realimentación dearchivo.

Archivos especialesLos archivos especiales le permiten especificar un archivo de entrada y/salida queno está directamente soportado por las operaciones de VisualAge RPG. Lasoperaciones de entrada y salida del archivo están controladas por una rutinaescrita por el usuario. Utilice la palabra clave PROCNAME en las especificacionesde archivo para definir el gestor de archivos especiales.

Nota: La rutina escrita por el usuario es una función contenida en una Bibliotecade enlace dinámico (DLL).

En la Figura 25 en la página 88, fspecr es una función dentro de un módulo C queha sido compilado y enlazado a una aplicación de VisualAge RPG. Este ejemplodemuestra cómo realizar la E/S local en una estación de trabajo.

Nota: A fin de que el programa de VisualAge RPG se conecte con una DLL,deberá crear la DLL que contenga la definición de la función C a la que hacereferencia la palabra clave de procedimiento (PROCNAME) en el programade VisualAge RPG. Cuando construya la aplicación de VisualAge RPG,deberá especificar la lista de bibliotecas (LIB) y/u objetos (OBJ) que contienetodas las funciones a las que la aplicación llama en el cuaderno Construir.

Capítulo 8. Consideraciones sobre archivos 87

Page 110: RPG Referencia

F* ---------------------------------------------------------------F* ---------- --- Archivos especiales VRPG --- ----------------------F* ---------------------------------------------------------------F* Declaración de archivo especial. Apertura y cierre explícitos.F dino cf f 18 SPECIAL USROPN PLIST(dinoplist)F PROCNAME('fspecr')F INFDS(info)D* ---------------------------------------------------------------D* Las posiciones INFDS- de 38 a 42.D info DSd errinfo 38 42s 0D* ---------------------------------------------------------------D* Utilizado para visualizar indicadores establecidos y valores leídos.D BoxId M STYLE(*INFO)D BUTTON(*OK:*ENTER)D BUTTON(*ABORT:*IGNORE)D* ---------------------------------------------------------------D* Campo de entrada asociado al archivo especial.D fieldc S 18 inz ('VRPGisGreat')D* ---------------------------------------------------------------D* Parámetro extra definido por el usuario para operaciones de E/SD* de archivos especiales.D mySFparm S 10 inz ('VRPGisGreat')I* ---------------------------------------------------------------I* Especificación de entrada, es decir, fieldc se actualiza en el programaI* de VRPG después de cada operación de E/S realizada en el archivoI* especial dino.I dino NSI 1 18 fieldc

I*

Figura 25. Utilización de archivos especiales (Pieza 1 de 2)

I* ---------------------------------------------------------------C *INZSR BEGSRC* ---------------------------------------------------------------C dinoplist PLISTC PARM mySFparmC EVAL fieldc = 'FIRSTINIT'C FIELDC DSPLY BoxId Reply 9 0C*---------------------------------------------------------------------C OPEN dino 90C 90'IND90' DSPLY BoxId ReplyC 99'IND99' DSPLY BoxId Replyc*---------------------------------------------------------------------C N90 READ dino 9099C*---------------------------------------------------------------------C N90FIELDC DSPLY BoxId ReplyC 90'IND90' DSPLY BoxId ReplyC 99'IND99' DSPLY BoxId Replyc*---------------------------------------------------------------------C CLOSE dino 90C*---------------------------------------------------------------------C 90'IND90' DSPLY BoxId ReplyC 99'IND99' DSPLY BoxId ReplyC ENDSR

Figura 25. Utilización de archivos especiales (Pieza 2 de 2)

88 VisualAge RPG Consulta del lenguaje

Page 111: RPG Referencia

#include <stdlib.h>#include <memory.h>#include <stdio.h>/* --------------------------------------------------------------,| Función de archivo especial |'---------------------------------------------------------------*/*

extern void fspecr ( char *option, // Proporcionado por VRPGchar *status, // Proporcionado por VRPGchar *error, // Proporcionado por VRPGchar *area, // Proporcionado por VRPGchar *mySFparm) // Proporcionado por usuario

{/* --------------------------------------------------------------,| Constantes locales |'---------------------------------------------------------------*/#define REC_SIZE 18 // Tamaño del registro a leer.#define NORMAL_STATUS '0' // Valores del parámetro 'status'.#define ERROR_STATUS '2'#define EOF_STATUS '1'#define OPEN_ERROR 12345 // Valores de actualización de 'error'#define READ_ERROR 88888 // también usados en el campo *RECORD#define OPTION_ERROR 99999 // en la INFDS.*static FILE *fp ;

*int radix = 10 ; // Obligatoria para la función '_itoa'.

*int a = 0 ;char temp[6];switch (option[0]) {case 'O' : // Abre localmente el archivo.if ((fp=fopen("special.dat", "rb+")) == NULL) {

a = OPEN_ERROR ; // El valor ASCII de un error de apertura_itoa( a, temp, radix ) ; // se establece aquí para la INFDS.memcpy( error, temp, 5 ) ;status[0] = ERROR_STATUS ; // Estado de retorno.

}else {

status[0] = NORMAL_STATUS ;}

*break ;

*case 'C' : // Cierre local ...fclose(fp) ;status[0] = NORMAL_STATUS ;break ;

Figura 26. Programa C para archivos especiales (Pieza 1 de 2)

Capítulo 8. Consideraciones sobre archivos 89

Page 112: RPG Referencia

El ejemplo de la Figura 27 en la página 91 ilustra cómo se realizan implícitamentelas operaciones OPEN y CLOSE, omitiendo la palabra clave USROPN de lasespecificaciones de archivo.

*case 'R' : // Apertura de archivo local... lectura.fread(area, 1, REC_SIZE, fp) ;if (feof(fp)) {status[0] = EOF_STATUS ; // Archivo leído y EOF alcanzado.

}else if (ferror(fp)) { // Comprobar errores.

a = READ_ERROR ; // El equivalente ASCII de error de lectura_itoa( a, temp, radix ) ; // se establece aquí para la INFDS.memcpy( error, temp, 5 ) ;status[0] = ERROR_STATUS ; // Estado de retorno.

}else {status[0] = NORMAL_STATUS ;

}break ;

*default :

a = OPTION_ERROR ; // Establece el equivalente ASCII de un_itoa( a, temp, radix ) ; // error de opción para la INFDS.memcpy( error, temp, 5 ) ;status[0] = ERROR_STATUS ; // Estado de retorno.break ;

*}

*return ;

*#undef REC_SIZE#undef NORMAL_STATUS#undef ERROR_STATUS#undef EOF_STATUS#undef OPEN_ERROR#undef READ_ERROR#undef OPTION_ERROR}

Figura 26. Programa C para archivos especiales (Pieza 2 de 2)

90 VisualAge RPG Consulta del lenguaje

Page 113: RPG Referencia

F* ---------------------------------------------------------------F* ---------- --- Archivos especiales VRPG --- ----------------F* ---------------------------------------------------------------F* Declaración de archivo especial. Apertura y cierre implícitos.F dino cf f 18 SPECIAL PLIST(dinoplist)F PROCNAME('fspecr')F INFDS(info)D* ---------------------------------------------------------------D* Las posiciones INFDS- de 38 a 42.D info DSd errinfo 38 42s 0D* ---------------------------------------------------------------D* Utilizado para visualizar indicadores establecidos y valores de campo.D BoxId M STYLE(*INFO)D BUTTON(*OK:*ENTER)D BUTTON(*ABORT:*IGNORE)D* ---------------------------------------------------------------D* Campo de entrada asociado al archivo especial.D fieldc S 18 inz ('VRPGisGreat')D* ---------------------------------------------------------------D* Parámetro extra definido por el usuario para operaciones de E/SD* de archivos especiales.D mySFparm S 10 inz ('VRPGisGreat')I* ---------------------------------------------------------------I* Especificación de entrada, es decir, fieldc se actualiza en el programaI* de VRPG después de cada operación de E/S realizada en el archivoI* especial dino.I dino NSI 1 18 fieldcI* ---------------------------------------------------------------C *INZSR BEGSRC* ---------------------------------------------------------------C dinoplist PLISTC PARM mySFparmC EVAL fieldc = 'FIRSTINIT'C FIELDC DSPLY BoxId Reply 9 0C*---------------------------------------------------------------------C READ dino 9099C*---------------------------------------------------------------------C N90FIELDC DSPLY BoxId ReplyC 90'IND90' DSPLY BoxId ReplyC 99'IND99' DSPLY BoxId ReplyC*---------------------------------------------------------------------C ENDSR

Figura 27. Abrir y cerrar archivos especiales implícitamente

Capítulo 8. Consideraciones sobre archivos 91

Page 114: RPG Referencia

92 VisualAge RPG Consulta del lenguaje

Page 115: RPG Referencia

Parte 2. Datos

En este apartado se proporciona información sobre la utilización de datos en unprograma:v “Capítulo 9. Tipos de datos y formatos de datos” en la página 95 describe los

tipos de datos y formatosv “Literales” en la página 139 describe los literalesv “Capítulo 11. Estructuras de datos” en la página 147 describe las estructuras de

datosv “Capítulo 12. Utilización de matrices y tablas” en la página 157 describe las

Matrices y tablasv “Capítulo 13. Edición de campos numéricos” en la página 173 describe cómo

editar los campos numéricosv “Capítulo 14. Inicialización de los datos” en la página 187 describe la

inicialización de datos

© Copyright IBM Corp. 1994, 2000 93

Page 116: RPG Referencia

94 VisualAge RPG Consulta del lenguaje

Page 117: RPG Referencia

Capítulo 9. Tipos de datos y formatos de datos

En este capítulo se describen los tipos de datos soportados por VisualAge RPG ysus características especiales. Los tipos de datos soportados son:v Puntero de basev Carácterv Fechav Gráficov Numéricov Puntero de procedimientov Horav Indicación de la horav UCS-2

Además, algunos de los tipos de datos permiten distintos formatos de datos. Eneste apartado se indica las diferencias que existen entre los formatos de datosinternos y externos, se describe cada formato y se explica cómo especificarlos.

Formatos internos y externosLos campos numéricos, de fecha y de indicación de la hora tienen un formatointerno independiente del formato externo. El formato interno es el modo en quelos datos se almacenan en el programa. El formato externo es el modo en que losdatos se almacenan en los archivos.

Debe prestar atención al formato interno al:v pasar parámetros por referenciav recubrir subcampos en estructuras de datos

Además, deberá tener en cuenta el formato interno de los campos numéricoscuando el rendimiento del tiempo de ejecución de las operaciones aritméticas seaimportante. Para obtener más información al respecto, consulte el apartado“Consideraciones sobre el rendimiento” en la página 369.

Hay un formato interno y externo por omisión para los tipos de datos numéricos yde fecha/hora. Puede especificar un formato interno para un campo determinadoen una especificación de definición. De forma similar, puede especificar un formatoexterno para un campo descrito en un programa en la especificación de entrada osalida correspondiente.

Para los campos de un archivo descrito externamente, el formato de datos externose especifica en las especificaciones de descripción de datos en la posición 35. Nopuede cambiar el formato externo de los campos descritos externamente, con unaexcepción. Si especifica EXTBININT en una especificación de control, cualquiercampo binario con cero posiciones decimales se tratará como si tuviera un formatoexterno entero.

Para los subcampos de estructuras de datos descritas externamente, El compiladorutiliza los formatos de datos especificados en la descripción externa como losformatos internos de los subcampos.

© Copyright IBM Corp. 1994, 2000 95

Page 118: RPG Referencia

Formato internoEl formato interno por omisión de los campos numéricos autónomos es decimalempaquetado. El formato interno por omisión de los subcampos numéricos deestructura de datos es decimal con zona. Para especificar un formato internodistinto, especifique el formato deseado en la posición 40 de la especificación dedefinición del campo o subcampo.

El formato por omisión de los campos de fecha, hora e indicación de la hora es*ISO. Por lo general, se recomienda utilizar el formato interno ISO por omisión,especialmente si tiene una mezcla de tipos de formato externo.

Para los campos de fecha, hora e indicación de la hora puede utilizar las palabrasclave DATFMT y TIMFMT en la especificación de control para cambiar el formatointerno por omisión, si lo desea, de todos los campos de fecha/hora del programa.Puede utilizar la palabra clave DATFMT o TIMFMT en la especificación de unadefinición para alterar el formato interno por omisión de un campo de fecha/horaindividual.

Formato externoSi tiene campos numéricos, de caracteres o de fecha y hora en archivos descritospor programa, puede especificar su formato externo. Los formatos numéricosexternos son: binario, entero, decimal empaquetado, decimal con zona, sin signo oflotante. El formato externo no afecta al modo en que se procesa un campo. Sinembargo, puede ser capaz de mejorar el rendimiento de las operacionesaritméticas, dependiendo del formato interno especificado. Para obtener másinformación al respecto, consulte el apartado “Consideraciones sobre elrendimiento” en la página 369.

Especificación de un formato externo para un campo numéricoLa tabla siguiente muestra cómo especificar el formato externo de camposnuméricos descritos por el programa. Para obtener más información sobre cadatipo de formato, consulte el subapartado correspondiente de este apartado.

Tabla 15. Entradas y ubicaciones para especificar formatos externos

Tipo de campo Especificación Utilización de

Entrada Entrada Posición 36

Salida Salida Posición 52

Matriz o tabla Definición Palabra clave EXTFMT

Para cualquiera de estos campos de Tabla 15, especifique uno de los siguientesformatos numéricos externos válidos:B BinarioF FlotanteI EnteroL Signo a la izquierdaP Decimal empaquetadoR Signo a la derechaS Decimal con zonaU Sin signo

El formato externo por omisión para los datos numéricos flotantes se llamarepresentación de pantalla externa. El formato de datos flotantes de 4 bytes es:

96 VisualAge RPG Consulta del lenguaje

Page 119: RPG Referencia

+n.nnnnnnnE+ee, donde + representa el signo (+ o -)n representa los dígitos de la mantisae representa los dígitos del exponente

El formato para datos flotantes de 8 bytes es:+n.nnnnnnnnnnnnnnnE+eee

Tenga en cuenta que un valor flotante de 4 bytes ocupa 14 posiciones y un valorflotante de 8 bytes ocupa 23 posiciones.

Para otros datos numéricos aparte de los flotantes, el formato externo por omisiónes decimal con zona. El formato externo de las matrices y las tablas de tiempo decompilación debe ser decimal con zona, con el signo a la derecha o a la izquierda.

Para las matrices y las tablas de tiempo de compilación de flotantes, los datos detiempo de compilación se especifican como un literal numérico o un literal flotante.Cada elemento de una matriz de flotante de 4 bytes ocupa 14 posiciones en elregistro fuente; cada elemento de una matriz de flotante de 8 bytes ocupa 23posiciones.

Los campos numéricos no flotantes definidos en las especificaciones de entrada,especificaciones de cálculo o especificaciones de salida sin definicióncorrespondiente en una especificación de definición se almacenan internamente enformato decimal empaquetado.

Especificación de un formato externo para un campo decaracteres, gráfico o UCS-2Para cualquiera de los campos de entrada y salida de Tabla 15 en la página 96,especifique uno de los siguientes formatos de datos externos válidos:

A Carácter (válido para datos de caracteres e indicadores)

N Indicador (válido para datos de caracteres e indicadores)

G Gráfico (válido para datos gráficos)

C UCS-2 (válido para datos UCS-2)

Puede utilizarse la palabra clave EXTFMT para especificar los datos de una matrizo tabla en formato UCS-2.

Especifique el atributo de datos *VAR en las posiciones 31 a 34 de unaespecificación de entrada y en las posiciones 53 a 80 de una especificación desalida para los datos de carácter, gráficos o UCS-2 de longitud variable.

Especificación de un formato externo para un campo defecha/horaSi tiene campos de fecha, hora e indicación de la hora en archivos descritos porprogramas, debe especificar el formato externo de los campos. Puede especificar unformato externo para todos los campos de fecha, hora e indicación de la hora enun archivo descrito por programa utilizando las palabras clave DATFMT yTIMFMT en una especificación de descripción de archivo. También puedeespecificar un formato externo para un campo determinado. Especifique el formatodeseado en las posiciones 31-34 de una especificación de entrada. Especifique lapalabra clave y el formato adecuados en las posiciones 53-80 de una especificaciónde salida.

Para obtener más información sobre cada tipo de formato, consulte el apartadoapropiado de este capítulo.

Capítulo 9. Tipos de datos y formatos de datos 97

Page 120: RPG Referencia

Tipo de datos puntero de baseLos punteros de base se utilizan para ubicar el almacenamiento de las variables debase. Se accede al almacenamiento definiendo un campo, matriz o estructura dedatos como basado en una variable de puntero de base determinado yestableciendo la variable del puntero de base de modo que señale a la ubicación dealmacenamiento necesaria.

Por ejemplo, considere la variable de base MI_CAMPO, un campo de caracterescon una longitud 5, basada en el puntero PTR1. La variable de base no tiene unaubicación fija en el almacenamiento. Debe utilizar un puntero para indicar laubicación actual del almacenamiento que contiene la variable.

Suponga que el diseño de cierta área del almacenamiento es el siguiente:-------------------------------------------------------------| A | B | C | D | E | F | G | H | I | J | K | L | M | N | O |-------------------------------------------------------------

Si establecemos el puntero PTR1 de modo que señale a G,PTR1-------------------.

|V

-------------------------------------------------------------| A | B | C | D | E | F | G | H | I | J | K | L | M | N | O |-------------------------------------------------------------

MI_CAMPO se halla ubicado ahora en el almacenamiento que empieza en ’G’, porlo que su valor es ’GHIJK’. Si se mueve el puntero de modo que señale a ’J’, elvalor de MI_CAMPO pasa a ser ’JKLMN’:

PTR1-------------------.|V

-------------------------------------------------------------| A | B | C | D | E | F | G | H | I | J | K | L | M | N | O |-------------------------------------------------------------

Si una sentencia EVAL cambia ahora MI_CAMPO por ’HOLA’, el almacenamientoa partir de ’J’ sería el siguiente:

PTR1-------------------.|V

-------------------------------------------------------------| A | B | C | D | E | F | G | H | I | H | O | L | A | N | O |-------------------------------------------------------------

Utilice la palabra clave BASED de la especificación de definición (véase“BASED(nombre_puntero_de base)” en la página 238) para definir un puntero debase para un campo. Los punteros de base tienen el mismo ámbito que el campobasado.

La longitud del campo de puntero de base debe ser de 4 bytes y debe estaralineada en un límite de 4 bytes. Debido a este requisito de alineación de límites esposible que un subcampo de puntero no siga directamente al campo anterior y queestructuras de datos de múltiples apariciones tengan apariciones no contiguas. Paraobtener más información sobre la alineación de los subcampos, consulte elapartado “Alineación de los subcampos de la estructura de datos” en la página 148.

El valor de inicialización por omisión para los punteros base es *NULL.

98 VisualAge RPG Consulta del lenguaje

Page 121: RPG Referencia

Notas:

1. Al codificar los punteros de base, debe estar seguro de que el puntero se haestablecido sobre un almacenamiento suficientemente grande y del tipo correctopara el campo basado. Figura 31 en la página 102 muestra algunos ejemplos decómo no debe codificarse punteros de base.

2. Puede sumar o restar un desplazamiento a un puntero de una expresión, comopor ejemplo EVAL ptr = ptr + desplazamiento. Al realizar aritmética depunteros, debe tener en cuenta que es su responsabilidad asegurarse de quetodavía apunte al interior del almacenamiento del elemento al que estáseñalando. En muchos casos, no se emitirá ninguna excepción si señala antes odespués del elemento.Al restar dos punteros para determinar el desplazamiento existente entreambos, los punteros deben apuntar al mismo espacio o al mismo tipo dealmacenamiento. Por ejemplo, puede restar dos punteros que apunten alalmacenamiento estático, dos punteros al almacenamiento automático o dospunteros dentro del mismo espacio de usuario.

Establecimiento de un puntero de baseLa ubicación de la variable basada se establece o se cambia estableciendo ocambiando el puntero de base de una de las siguientes maneras:v Inicializándola con INZ(%ADDR(FLD)) donde FLD es una variable no basadav Asignando el puntero al resultado de %ADDR(X) donde X es cualquier variablev Asignando al puntero el valor de otro punterov Utilizando ALLOC o REALLOC (consulte los apartados “ALLOC (Asignar

almacenamiento)” en la página 395 y “REALLOC (Reasignar almacenamientocon longitud nueva)” en la página 521 para obtener ejemplos).

v Avanzando o retrocediendo el puntero por el almacenamiento utilizandoaritmética de punteros:EVAL PTR = PTR + desplazamiento

(″desplazamiento″ es la distancia en bytes que se mueve el puntero=

EjemplosLa Figura 28 en la página 100 muestra cómo definir una estructura de datos debase.

Capítulo 9. Tipos de datos y formatos de datos 99

Page 122: RPG Referencia

El siguiente ejemplo muestra cómo puede sumar y restar desplazamientos a lospunteros y determinar también la diferencia entre dos punteros expresada comodesplazamiento.

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++** Definir una estructura de datos de base, matriz y campo.* Si PTR1 no está definido, el compilador lo definirá* implícitamente.** Tenga en cuenta que antes de que puedan utilizarse estos campos de* base o estructuras, debe establecerse el puntero de base de* modo que señale la ubicación de almacenamiento correcta. PRT1* se establecerá de modo que señale a una dirección de* almacenamiento válida antes de que se utilice la estructura* de datos DSbased.*

D DSbased DS BASED(PTR1)D Campo1 1 16AD Campo2 2DD ARRAY S 20A DIM(12) BASED(PTR2)DD Temp_fld S * BASED(PTR3)DD PTR2 * INZD PTR3 * INZ(*NULL)

Figura 28. Definición de estructuras y campos basados

100 VisualAge RPG Consulta del lenguaje

Page 123: RPG Referencia

La Figura 30 muestra cómo obtener el número de días en formato Juliano, en casode necesitarse una fecha en Juliano.

Al codificar los punteros de base, asegúrese de que el puntero esté establecidosobre un almacenamiento suficientemente grande y del tipo correcto para el campo

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+...8DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++D.....................................Keywords+++++++++++++++++++++++++++++*

D P1 s *D P2 s *CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....CSRN01++++++++++++++Opcode(E)+Extended Factor 2++++++++++++++++++++++++++++** Asignar 20 bytes de almacenamiento para el puntero P1

C ALLOC 20 P1* Inicializar el almacenamiento con 'abcdefghij'

C EVAL %STR(P1:20) = 'abcdefghij'* Establecer P2 para que apunte el noveno bytes de este almacenamiento.

C EVAL P2 = P1 + 8* Mostar que P2 apunta a 'i'. %STR devuelve los datos a los que* apunta el puntero hasta el primer terminador de nulo x'00'* que encuentra, sin incluirlo, pero sólo busca la longitud* dada, que en este caso es 1.

C EVAL Result = %STR(P2:1)C DSPLY Result 1* Establecer P2 para que apunte al byte anterior

C EVAL P2 = P2 - 1* Mostrar que P2 apunta a 'h'

C EVAL Result = %STR(P2:1)C DSPLY Result* Determinar la distancia entre P1 y P2. (7 bytes)

C EVAL Diff = P2 - P1C DSPLY Diff 5 0* Liberar el almacenamiento de P1

C DEALLOC P1C RETURN

Figura 29. Aritmética de punteros

*..1....+....2....+....3....+....4....+....5....+....6....+....7....+....HKeywords++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++H DATFMT(*JUL)DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++D.....................................Keywords+++++++++++++++++++++++++++++*

D JulDate S D INZ(D'95/177')D DATFMT(*JUL)D JulDS DS BASED(JulPTR)D Jul_yy 2 0D Jul_sep 1D Jul_ddd 3 0D JulDay S 3 0CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....CSRN01++++++++++++++Opcode(E)+Extended Factor 2++++++++++++++++++++++++++++** Establecer el puntero de base para la estructura que* recubre la fecha en Juliano.

C EVAL JulPTR = %ADDR(JulDate)* Extraer la porción correspondiente al día de la fecha en Juliano

C EVAL JulDay = Jul_ddd

Figura 30. Obtención de una fecha en Juliano

Capítulo 9. Tipos de datos y formatos de datos 101

Page 124: RPG Referencia

basado. Figura 31 muestra algunos ejemplos de cómo no debe codificarse punterosde base.

Tipo de datos carácterEl tipo de datos carácter representa valores de tipo carácter y puede tener uno delos formatos siguientes:

A Carácter

N Indicador

G Gráfico

C UCS-2

Los datos de tipo carácter pueden contener uno o más caracteres de un solo byte ode doble byte, en función del formato especificado. Los campos de tipo carácter,gráfico y UCS-2 también pueden tener un formato de longitud fija o variable. Loscódigos de operación que operan en series aceptan datos de tipo carácter. Lasiguiente tabla resume los distintos formatos de los tipos de datos de tipo carácter.

Tipo de datos detipo carácter

Número de bytes CCSID

Carácter Uno o más caracteres de un solobyte con una longitud fija ovariable.

se asume el CCSID de la estaciónde trabajo

Indicador Un carácter de un solo byte conuna longitud fija

se asume el CCSID de la estaciónde trabajo

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+...8DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++D.....................................Keywords+++++++++++++++++++++++++++++*

D chr10 S 10a based(ptr1)D char100 S 100a based(ptr1)D p1 S 5p 0 based(ptr1)CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....CSRN01++++++++++++++Opcode(E)+Extended Factor 2++++++++++++++++++++++++++++*** Establecer ptr1 en la dirección de p1, un campo numérico* Establecer chr10 (basado en ptr1) en 'abc'* Los datos escritos en p1 no serán fiables debido a la* incompatibilidad entre tipos de datos.*

C EVAL ptr1 = %addr(p1)C EVAL chr10 = 'abc'** Establecer ptr1 en la dirección de chr10, un campo de 10 bytes.* Establecer chr100, un campo de 100 bytes, en 100 'x'* 10 bytes se escriben en chr10, y 90 bytes se escriben en otro* almacenamiento, cuya ubicación se desconoce.*

C EVAL ptr1 = %addr(chr10)C EVAL chr100 = *all'x'

Figura 31. Cómo no codificar punteros de base

102 VisualAge RPG Consulta del lenguaje

Page 125: RPG Referencia

Tipo de datos detipo carácter

Número de bytes CCSID

Gráfico Uno o más caracteres de doblebyte con una longitud fija ovariable

el CCSID de la estación de trabajoo un CCSID de doble byte válidodefinido por el usuario

UCS-2 Uno o más caracteres de doblebyte con una longitud fija ovariable

13488 (UCS-2 versión 2.0)

Para obtener información sobre los CCSID de los datos de tipo carácter, consulte elapartado “Conversión entre datos de tipo carácter, gráfico y UCS-2” en lapágina 111.

El valor de inicialización por omisión para campos de tipo carácter no indicadorson blancos.

Los indicadores son un tipo especial de datos de caracteres. Los datos de tipoindicador constan del indicador y del campo especificado con la palabra claveCOMMIT en la especificación de descripción de archivo. Los indicadores tienentodos una longitud de un byte y sólo pueden contener los valores de carácter ’0’ y’1’. El valor por omisión de los indicadores es ’0’.

Formato carácterEl formato carácter de longitud fija tiene, como su nombre indica, una longitud fijade uno o varios bytes.

Para obtener información sobre el formato carácter de longitud variable, consulte elapartado “Formato carácter, gráfico y UCS-2 de longitud variable” en la página 105.

Un campo de tipo carácter se define especificando A en la entrada Tipo de datosde la especificación adecuada. También se puede definir utilizando la palabra claveLIKE en la especificación de definición en la que el parámetro sea un campo detipo carácter.

El valor de inicialización por omisión es espacios en blanco.

Formato indicadorEl formato indicador es un tipo especial de datos de carácter. Los indicadorestienen todos una longitud de un byte y sólo pueden contener los valores decarácter ’0’ (desactivado) y ’1’ (activado). Se suelen utilizar para indicar elresultado de una operación o para establecer condiciones en (controlar) el procesode una operación. El valor por omisión de los indicadores es ’0’.

Un campo de tipo indicador se define especificando N en la entrada Tipo de datosde la especificación adecuada. También se puede definir utilizando la palabra claveLIKE en la especificación de definición en la que el parámetro sea un campo detipo indicador. Así mismo, los campos de tipo indicador quedan definidos deforma implícita incluyendo la palabra clave COMMIT en la especificación dedescripción de archivo.

Las reglas para definir variables de indicador son:v Los indicadores pueden definirse como campos autónomos, subcampos,

parámetros de prototipo y valores de retorno de procedimiento.

Capítulo 9. Tipos de datos y formatos de datos 103

Page 126: RPG Referencia

v Si se define una variable de indicador como tabla o matriz de tiempo decompilación o de tiempo de preejecución, los datos de inicialización debenconstar únicamente de ceros y unos.

Nota: Si un indicador contiene un valor distinto de ’0’ o de ’1’ en tiempo deejecución, los resultados serán imprevisibles.

v Si se especifica la palabra clave INZ, el valor debe ser ’0’, *OFF, ’1’ o bien *ON.v No puede especificarse la palabra clave VARYING para un campo de tipo

indicador.

Las reglas para utilizar variables de indicador son:v El valor de inicialización por omisión para campos de tipo indicador es ’0’.v El código de operación CLEAR establece una variable de indicador en ’0’.v Si se aplica la función espacio en blanco después de a una variable de indicador,

ésta última queda establecida en ’0’.v Si se especifica una matriz de indicadores como resultado de una operación

MOVEA(P), el carácter de relleno será ’0’.v Se pueden utilizar indicadores como argumentos de búsqueda allí donde la

clave externa sea un carácter de longitud 1.

Formato gráficoEl formato gráfico es una serie de caracteres en la que cada carácter se representamediante 2 bytes.

La diferencia entre los datos gráficos de doble byte y los caracteres de un solo bytese muestra en la siguiente figura:

La longitud de un campo gráfico, en bytes, es dos veces el número de caracteresgráficos del campo.

Si se añade un registro al archivo de base de datos y no se especifican los camposgráficos para salida, se colocan espacios en blanco de doble byte en los campospara salida. Los espacios en blanco se colocan en campos de salida en lascondiciones siguientes:v Los campos no se especifican para salida en la especificación de salida.v No se satisfacen los indicadores de condición para el campo.

1 byte

1 byte

1 car.

1 carácter gráfico 1 carácter gráfico

1 car. 1 car. 1 car.

1 byte

1 byte

1 byte

1 byte

1 byte

1 byte

Datos de unsolo byte

Datosgráficos

Figura 32. Comparación de datos de un sólo byte y gráficos

104 VisualAge RPG Consulta del lenguaje

Page 127: RPG Referencia

Los datos gráficos pueden tener una longitud fija o variable. El formato gráfico delongitud fija es una serie de caracteres con una longitud establecida en la que cadacarácter está representado por 2 bytes.

Para obtener información sobre el formato carácter de longitud variable, consulte elapartado “Formato carácter, gráfico y UCS-2 de longitud variable”.

Un campo gráfico se define especificando G en la entrada Tipo de datos de laespecificación adecuada. También se puede definir utilizando la palabra clave LIKEen la especificación de definición en la que el parámetro sea un campo gráfico.

El valor de inicialización por omisión de los datos gráficos es el espacio en blancode doble byte. Su valor hexadecimal depende de la página de códigos instalada enla estación de trabajo. El valor de *HIVAL es X'FFFF' y el de *LOVAL es X'0000'.

Formato UCS-2El formato Conjunto Universal de Caracteres (UCS-2) es una serie de caracteres enla que cada carácter se representa mediante 2 bytes. Este juego de caracteres puedecodificar los caracteres de muchos idiomas escritos.

La longitud de un campo UCS-2, en bytes, es igual a dos veces el número decaracteres UCS-2 que tenga el campo.

El formato UCS-2 de longitud fija es una serie de caracteres con una longitudestablecida en la que cada carácter está representado por 2 bytes.

Para obtener información sobre el formato UCS-2 de longitud variable, consulte elapartado “Formato carácter, gráfico y UCS-2 de longitud variable”.

Un campo UCS-2 se define especificando C en la entrada Tipo de datos de laespecificación adecuada. También se puede definir utilizando la palabra clave LIKEen la especificación de definición en la que el parámetro sea un campo UCS-2.

El valor de inicialización por omisión para los datos UCS-2 es X'0020'. El valor de*HIVAL es X'FFFF', de *LOVAL es X'0000' y el valor de *BLANKS es X'0020'.

Si desea obtener más información sobre el formato UCS-2, consulte los manualesInternational Application Development y National Language Support, así como losapartados CL y API de la categoría Programación de Information Center, que sehalla en este sitio Web -http://publib.boulder.ibm.com/pubs/html/as400/infocenter.htm.

Formato carácter, gráfico y UCS-2 de longitud variableLos campos de tipo carácter de longitud variable tienen una longitud máximadeclarada y una longitud actual que puede variar mientras se ejecuta el programa.La longitud se mide en bytes únicos en el formato carácter y en bytes dobles en losformatos gráfico y UCS-2. El almacenamiento asignado para los campos de tipocarácter de longitud variable es 2 bytes más grande que la longitud máximadeclarada. Los 2 bytes situados más a la izquierda constituyen un campo de tipoentero sin signo que contiene la longitud actual en caracteres, caracteres gráficos ocaracteres UCS-2. Los datos de tipo carácter reales empiezan a partir del tercer bytedel campo de longitud variable.

Capítulo 9. Tipos de datos y formatos de datos 105

Page 128: RPG Referencia

La Figura 33 muestra cómo se almacenan los campos de tipo carácter de longitudvariable:

La Figura 34 muestra cómo se almacenan los campos gráficos de longitud variable.Los campos UCS-2 se almacenan de una forma similar.

Nota: Sólo son significativos los datos que llegan hasta la longitud actual,inclusive.

Para definir un campo de tipo carácter de longitud variable, especifique A(carácter), G (Gráfico) o C (UCS-2) y la palabra clace VARYING en unaespecificación de definición. También se puede definir utilizando la palabra claveLIKE en una especificación de definición en la que el parámetro sea un campo detipo carácter de longitud variable.

Se puede hacer referencia a campos externos de longitud variable, en unaespecificación de entrada o salida, con el atributo de datos *VAR.

El valor de inicialización por omisión es la serie nula (’’); un valor con longitudcero.

Si desea ver ejemplos de la utilización de campos de longitud variable, consulte losapartados:v “Utilización de campos de longitud variable” en la página 109v “%LEN (Obtener o establecer longitud)” en la página 330v “%CHAR (Convertir a datos de tipo carácter)” en la página 316v “%REPLACE (Sustituir serie de caracteres)” en la página 335

El formato de longitud variable también está disponible para datos de tipo gráfico.

Normas para los formatos de carácter, gráfico y UCS-2 delongitud variableA la hora de definir campos de longitud variable se aplican las normas siguientes:v La longitud declarada del campo puede ser de 1 a 65535 caracteres de un solo

byte y de 1 a 16383 caracteres UCS-2 o gráficos de doble byte.

longitudactual carácter-datos

N = longitud máxima declarada

2 + N = número total de bytes

UNS(5) CHAR(N)

Figura 33. Campos de tipo carácter con formato de longitud variable

longitudactual

gráfico-datos

N = longitud máxima declarada = número de bytes dobles

2 + 2(N) = número total de bytes

UNS(5) GRAPHIC(N)

Figura 34. Campos gráficos con formato de longitud variable

106 VisualAge RPG Consulta del lenguaje

Page 129: RPG Referencia

v La longitud actual puede ser un valor comprendido entre 0 y la longitudmáxima declarada del campo.

v El campo puede inicializarse con la palabra clave INZ. El valor inicial es el valorexacto especificado y la longitud inicial del campo es la longitud del valorinicial. El campo se rellena con espacios en blanco para su inicialización, perodichos espacios no se incluyen en la longitud.

v En todos los casos, excepto en el de los subcampos definidos con notaciónposicional, la entrada de longitud (posiciones de la 33 a la 39 de lasespecificaciones de definición) contiene la longitud máxima del campo sin incluirla longitud de 2 bytes.

v En el caso de los subcampos definidos con notación posicional, la longitudincluye la longitud de 2 bytes. Como resultado de ello, un subcampo delongitud variable puede tener una longitud de 65537 de un solo byte o de 16384de doble byte para una estructura de datos sin nombre.

v No puede especificarse la palabra clave VARYING para una estructura de datos.v En el caso de las matrices de tiempo de preejecución de longitud variable, los

datos de inicialización del archivo se almacenan con formato variable, incluido elprefijo de longitud de 2 bytes.

v Dado que los datos de matriz de tiempo de preejecución se leen de un archivo yla longitud máxima de registros de los archivos es 32766, el tamaño máximo delas matrices de tiempo de preejecución de longitud variable es de 32764caracteres de un solo byte o de 16382 caracteres gráficos o UCS-2 de doble byte.

v Se puede definir una tabla o una matriz de longitud variable con datos detiempo de compilación. Los espacios en blanco finales del campo de los datos noson significativos. La longitud de los datos es la posición del último carácter queno sea un espacio en blanco en el campo. Esto es distinto a la inicialización detiempo de preejecución, ya que el prefijo de longitud no puede almacenarse enlos datos de tiempo de compilación.

v En el caso de los datos gráficos de tiempo de compilación, se considera que losespacios en blanco de un solo byte son datos significativos. Los datos de tiempode compilación de las tablas y matrices gráficas deben rellenarse con espacios enblanco de doble byte. Se considera que los espacios en blanco de un solo byte noson espacios en blanco.

v No se puede utilizar *LIKE DEFINE para definir un campo como campo delongitud variable.

Lo siguiente es un ejemplo de definición de campos de tipo carácter de longitudvariable:

Capítulo 9. Tipos de datos y formatos de datos 107

Page 130: RPG Referencia

A continuación se muestra un ejemplo de definición de campos de tipo gráfico yUCS-2 de longitud variable:

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... *DName+++++++++++ETDsFrom+++To/L+++IDc.Functions++++++++++++++++++++++++++++

* Campos autónomos:D var5 S 5A VARYINGD var10 S 10A VARYING INZ('0123456789')D max_len_a S 32767A VARYING

* Matriz de tiempo de preejecución:D arr1 S 100A VARYING FROMFILE(dataf)

* Subcampos de estructura de datos:D ds1 DS

* Subcampo definido con notación de longitud:D sf1_5 5A VARYINGD sf2_10 10A VARYING INZ('0123456789')

* Subcampo definido con notación posicional: A(5)VARD sf4_5 101 107A VARYING

* Subcampos que muestran la representación interna de VARYING:D sf7_25 100A VARYINGD sf7_len 5I 0 OVERLAY(sf7_25:1)D sf7_data 100A OVERLAY(sf7_25:3)

* Prototipo de procedimientoD Replace PR 32765A VARYINGD String 32765A CONSTANT VARYING OPTIONS(*VARSIZE)D FromStr 32765A CONSTANT VARYING OPTIONS(*VARSIZE)D ToStr 32765A CONSTANT VARYING OPTIONS(*VARSIZE)D StartPos 5U 0 VALUED Replaced 5U 0 OPTIONS(*OMIT)

Figura 35. Definición de campos de tipo carácter y UCS-2 de longitud variable

108 VisualAge RPG Consulta del lenguaje

Page 131: RPG Referencia

Utilización de campos de longitud variableLa parte correspondiente a la longitud de un campo de longitud variablerepresenta la longitud actual del campo medida en caracteres. En los campos decaracteres, esta longitud también representa la longitud actual en bytes. En loscampos de doble byte (gráficos y UCS-2), esta longitud representa la longitud delcampo en bytes dobles. Por ejemplo, un campo UCS-2 con una longitud actual de3 tiene una longitud de 3 caracteres de doble byte y una longitud de 6 bytes.

Las siguientes secciones describen el mejor modo de utilizar los campos delongitud variable y cómo cambia la longitud actual al utilizar distintos códigos deoperación.

Cómo se establece la longitud del campo: Cuando se inicializa un campo delongitud variable utilizando INZ, su longitud inicial se establece en la longitud delvalor de inicialización. Por ejemplo, si se establece un campo de tipo carácter delongitud 10 en el valor ’ABC’, su longitud inicial se establece en 3.

La operación EVAL cambia la longitud de un destino de longitud variable. Porejemplo, si se asigna el valor ’XY’ a un campo de tipo carácter de longitud 10, sulongitud se establece en 2.

La operación CLEAR cambia a 0 la longitud de un campo de longitud variable.

* .. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+...DName+++++++++++ETDsFrom+++To/L+++IDc.Functions++++++++++++++++*-------------------------------------------------------------* Campos de tipo gráfico*-------------------------------------------------------------* Campos autónomos:

D GRA20 S 20G VARYINGD MAX_LEN_G S 16383G VARYING* Matriz de tiempo de preejecución:

D ARR1 S 100G VARYING FROMFILE(DATAF)* Subcampos de estructura de datos:

D DS1 DS* Subcampo definido con notación de longitud:

D SF3_20 20G VARYING* Subcampo definido con notación posicional: G(10)VAR

D SF6_10 11 32G VARYING*-------------------------------------------------------------* Campos de tipo UCS-2*-------------------------------------------------------------

D MAX_LEN_C S 16383C VARYINGD FLD1 S 5C INZ(%UCS2('ABCDE')) VARYINGD FLD2 S 2C INZ(U'01230123') VARYINGD FLD3 S 2C INZ(*HIVAL) VARYINGD DS_C DSD SF3_20_C 20C VARYING* Subcampo definido con notación posicional: C(10)VAR

D SF_110_C 11 32C VARYING

Figura 36. Definición de campos de tipo gráfico y UCS-2 de longitud variable

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++D fld 10A VARYING* No importa la longitud que tuviera 'fld' antes de EVAL;* después de EVAL, su longitud será 2.

CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq...C EVAL fld = 'XY'

Capítulo 9. Tipos de datos y formatos de datos 109

Page 132: RPG Referencia

La operación PARAM establece la longitud del campo de resultado en la longituddel campo del Factor 2, si se especifica.

Las operaciones de formato fijo MOVE, MOVEL, CAT, SUBST y XLATE nocambian la longitud de los campos de resultado de longitud variable. Por ejemplo,si se mueve utilizando MOVE el valor ’XYZ’ a un campo de tipo carácter delongitud variable de longitud 10 cuya longitud actual sea 2, la longitud del campono cambiará y los datos se truncarán.

Nota: Se recomienda la utilización de MOVE y MOVEL, al contrario que EVAL,para cambiar el valor de los campos que desee que tengan una longitudtemporalmente fija. Un ejemplo de esto sería la elaboración de un informecon columnas cuyos tamaños puedan variar de un día al otro, pero cuyostamaños deban ser fijos en cada ejecución del programa.

Cuando se lee un campo desde un archivo (especificaciones de Entrada), lalongitud de un campo de longitud variable se establece en la longitud de los datosde entrada.

La función ″Blanco Después″ de las especificaciones de Salida establece la longitudde un campo de longitud variable en 0.

Puede establecer usted mismo la longitud de un campo de longitud variableutilizando la función incorporada %LEN en la parte izquierda de una operaciónEVAL.

Cómo se utiliza la longitud del campo: Cuando se desea utilizar el valor de uncampo de longitud variable, se utiliza su longitud actual. El siguiente ejemploasume que ’result’ es un campo de longitud fija con una longitud de 7.

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++D fld 10A VARYING

* Se asume que fld tiene una longitud 2 antes de MOVEL.* Tras el primer MOVEL, tendrá un valor de 'XY'

CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq...C MOVEL 'XYZ' fld

* Tras el segundo MOVEL, tendrá el valor de '1Y'C MOVEL '1' fld

110 VisualAge RPG Consulta del lenguaje

Page 133: RPG Referencia

Por qué deben utilizarse campos de longitud variable: La utilización de camposde longitud variable para las variables temporales puede aumentar el rendimientode las operaciones con series, así como facilitar la lectura del código ya que no esnecesario guardar la longitud actual del campo en otra variable para la operación%SUBST, ni utilizar %TRIM para ignorar los blancos adicionales.

Si el objetivo de un subprocedimiento es el de manejar datos de tipo serie dedistintas longitudes, la utilización de campos de longitud variable en los valores delos parámetros y de retorno de los procedimientos con prototipos puede aumentarel rendimiento y la facilidad de lectura de las llamadas y los procedimientos. Noserá necesario pasar ningún parámetro de longitud al subprocedimiento paraobtener la longitud real del parámetro.

Conversión entre datos de tipo carácter, gráfico y UCS-2

Nota: Si se ignoran los CCSID gráficos (se ha especificadoCCSID(*GRAPH:*IGNORE) en la especificación de control o no se haespecificado CCSID(*GRAPH)), se considera que los datos gráficos no tienenCCSID y no se soporta la conversión entre datos gráficos y datos UCS-2.

Los datos de tipo carácter, gráfico y UCS-2 pueden tener distintos CCSID (ID deJuego de Caracteres Codificado). La conversión entre estos tipos de datos dependedel CCSID de los datos.

Códigos CCSID de los datosSólo se tiene en consideración el CCSID de los datos de tipo carácter al realizarconversiones entre datos de tipo carácter y tipo UCS-2.

Cuando se realizan conversiones entre datos de tipo carácter y datos de tipo UCS-2o gráfico, se asume que el CCSID de los datos de tipo carácter es el CCSID de laestación de trabajo.

El CCSID de los datos UCS-2 toma por omisión el valor de 13488. Este valor poromisión puede cambiarse utilizando la palabra clave CCSID(*UCS2) en laespecificación de control. El CCSID de los campos UCS-2 descritos por el programa

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++D fld 10A VARYING* Para la siguiente operación EVAL* Valor de 'fld' Longitud de 'fld' 'result'* -------------- --------------- -----------* 'ABC' 3 'ABCxxx '* 'A' 1 'Axxx '* '' 0 'xxx '* 'ABCDEFGHIJ' 10 'ABCDEFG'

CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq...C EVAL result = fld + 'xxx'* En la siguiente operación MOVE, se asume que 'result'* tiene el valor de '.......' antes de MOVE.* Valor de 'fld' Longitud de 'fld' 'result'* -------------- --------------- -----------* 'ABC' 3 '....ABC'* 'A' 1 '......A'* '' 0 '.......'* 'ABCDEFGHIJ' 10 'DEFGHIJ'

C MOVE fld result

Capítulo 9. Tipos de datos y formatos de datos 111

Page 134: RPG Referencia

puede especificarse utilizando la palabra clave CCSID en la especificación dedefinición. El CCSID de los campos UCS-2 descritos externamente proviene delarchivo externo.

Nota: Los campos UCS-2 se definen en DDS especificando un tipo de datos G yun CCSID de 13488.

El CCSID de los datos de tipo gráfico toma por omisión el valor especificado en lapalabra clave CCSID(*GRAPH) de la especificación de control. El CCSID de loscampos de tipo gráfico descritos por el programa puede especificarse utilizando lapalabra clave CCSID en la especificación de definición. El CCSID de los campos detipo gráfico descritos externamente proviene del archivo externo.

Datos de fechaLos campos de fecha tienen un tamaño y formato predeterminado. Puedendefinirse en la especificación de definición. Son necesarios los ceros iniciales y decola para todos los datos de fecha.

Las constantes o variables de fecha utilizadas en comparaciones o asignaciones nohan de estar en el mismo formato ni utilizar los mismos separadores. Las fechasutilizadas para operaciones de E/S, como por ejemplo campos de entrada, camposde salida o campos de clave se convierten (si es necesario) al formato necesariopara la operación.

El formato interno por omisión para variables de fecha es *ISO. Este formatointerno por omisión se puede alterar temporalmente de modo global mediante lapalabra clave de especificación de control DATFMT y de modo individualmediante la palabra clave de especificación de definición DATFMT.

La jerarquía utilizada al determinar el formato interno y el separador de un campode fecha proviene de:1. La palabra clave DATFMT especificada en la especificación de definición2. La palabra clave DATFMT especificada en la especificación de control3. *ISO

Existen tres clases de formatos de datos de fecha, según cuál sea el rango de añosque pueden representarse. Esto conlleva la posibilidad de que se produzca unacondición de desbordamiento o de subdesbordamiento cuando el resultado de unaoperación es una fecha que está fuera del rango válido del campo de destino. Losformatos y los rangos son los siguientes:

Número de dígitos del año Rango de años

2 (*YMD, *DMY, *MDY, *JUL) De 1940 al 2039

3 (*CYMD, *CDMY, *CMDY) De 1900 al 2899

4 (*ISO, *USA, *EUR, *JIS, *LONGJUL) De 0001 a 9999

La Tabla 16 en la página 113 lista los formatos de los datos de fecha y susseparadores:

Si desea ver ejemplos de cómo se puede codificar campos de fecha, consulte losejemplos dados en:v “Operaciones de fecha” en la página 377v “Cómo mover los datos de fecha y hora” en la página 386

112 VisualAge RPG Consulta del lenguaje

Page 135: RPG Referencia

v “ADDDUR (Añadir duración)” en la página 393v “MOVE (Mover)” en la página 468v “EXTRCT (Extraer fecha/hora/indicación de la hora)” en la página 452v “SUBDUR (Restar duración)” en la página 543v “TEST (Comprobar fecha/hora/indicación de la hora)” en la página 549

Tabla 16. Separadores y formatos de fecha definidos con RPG correspondientes al tipo dedatos Fecha

Nombredeformato

Descripción Formato(separador poromisión)

Separadoresválidos

Longitud Ejemplo

Formatos de año de 2 dígitos

*MDA Mes/Día/Año mm/dd/aa / - . , ’&’ 8 01/15/96

*DMA Día/Mes/Año dd/mm/aa / - . , ’&’ 8 15/01/96

*AMD Año/Mes/Día aa/mm/dd / - . , ’&’ 8 96/01/15

*JUL Juliana aa/ddd / - . , ’&’ 6 96/015

Formatos de año de 4 dígitos

*ISO InternationalStandardsOrganization

aaaa-mm-dd - 10 1996-01-15

*USA Estándar EE.UU.IBM®

mm/dd/aaaa / 10 01/15/1996

*EUR Estándar europeoIBM

dd.mm.aaaa . 10 15.01.1996

*JIS Estándar industrialjaponés eracristiana

aaaa-mm-dd - 10 1996-01-15

La tabla siguiente lista los valores *LOVAL, *HIVAL y los valores por omisión detodos los formatos de fecha:

Tabla 17. Valores de fecha

Nombreformato

Descripción *LOVAL *HIVAL Valor poromisión

Formatos de año de 2 dígitos

*MDA Mes/Día/Año 01/01/40 12/31/39 01/01/40

*DMA Día/Mes/Año 01/01/40 31/12/39 01/01/40

*AMD Año/Mes/Día 40/01/01 39/12/31 40/01/01

*JUL Juliana 40/001 39/365 40/001

Formatos de año de 4 dígitos

*ISO International StandardsOrganization

0001-01-01 9999-12-31 0001-01-01

*USA Estándar EE.UU. IBM 01/01/0001 12/31/9999 01/01/0001

*EUR Estándar europeo IBM 01.01.0001 31.12.9999 01.01.0001

*JIS Estándar industrial japonésera cristiana

0001-01-01 9999-12-31 0001-01-01

Capítulo 9. Tipos de datos y formatos de datos 113

Page 136: RPG Referencia

SeparadoresAl codificar un formato de fecha en una operación MOVE, MOVEL o TEST, losseparadores son opcionales para los campos de caracteres. Para indicar que no hayseparadores, especifique el formato seguido de un cero. Para obtener másinformación sobre cómo codificar formatos de fecha sin separadores, consulte losapartados “MOVE (Mover)” en la página 468, “MOVEL (Mover a la izquierda)” enla página 489 y “TEST (Comprobar fecha/hora/indicación de la hora)” en lapágina 549.

Formatos para operaciones MOVE, MOVEL y TESTTambién se da soporte a varios formatos únicamente para los campos utilizadospor las operaciones MOVE, MOVEL y TEST. Este soporte se proporciona porcompatibilidad con valores definidos externamente cuyo formato de año es de tresdígitos y con el formato de año de 4 dígitos *LONGJUL.

La Tabla 18 lista los formatos de fecha definidos externamente que son válidos yque pueden utilizarse en el Factor 1 de una operación MOVE, MOVEL y TEST.

Tabla 18. Separadores y formatos de fecha definidos externamente

Nombre deformato

Descripción Formato(separador poromisión)

Separadoresválidos

Longitud Ejemplo (25de abril del2001)

Formatos de año de 3 dígitos(1.)

*CYMD SigloAño/Mes/Día

saa/mm/dd / - . , ’&’ 9 101/04/25

*CMDY SigloMes/Día/Año

smm/dd/aa / - . , ’&’ 9 104/25/01

*CDMY SigloDía/Mes/Año

sdd/mm/aa / - . , ’&’ 9 125/04/01

Formatos de año de 4 dígitos

*LONGJUL Juliana larga aaaa/ddd / - . , ’&’ 8 2001/115

Notas:

1. Los valores válidos del carácter que indica el siglo, ’s’, son:

's' Años-----------------------0 1900-19991 2000-2099. .. .. .9 2800-2899

Los separadores son opcionales para los campos de caracteres en el formato*CYMD. Para indicar que no hay separadores puede especificar *CYMD0.

Tipo de datos numéricoLos datos numéricos constan de datos que contienen cero o más posicionesdecimales. El formato de los datos numéricos es uno de los siguientes:v “Formato binario” en la página 115v “Formato flotante” en la página 117

114 VisualAge RPG Consulta del lenguaje

Page 137: RPG Referencia

v “Formato entero” en la página 118v “Formato decimal empaquetado” en la página 119v “Formato sin signo” en la página 120v “Formato decimal con zona” en la página 121

El valor de inicialización por omisión para los campos numéricos es cero.

Formato binarioEl formato binario significa que el signo (positivo o negativo) es el bit más a laizquierda del campo y que el valor entero son los bits restantes del campo. Losnúmeros positivos tienen un cero en el bit de signo; los números negativos tienenun 1 en el bit de signo y están en forma de complemento de dos. En formatobinario, cada campo debe tener una longitud de 2 ó 4 bytes.

Un campo binario puede tener una longitud entre uno y nueve dígitos y puededefinirse con posiciones decimales. Si la longitud del campo es de uno a cuatrodígitos, el compilador presupone una longitud de campo binario de 2 bytes. Si lalongitud del campo es de cinco a nueve dígitos, el compilador presupone unalongitud de campo binario de 4 bytes.

Archivo descrito por programaA cada lectura de campo de entrada en formato binario el compilador le asignauna longitud de campo (número de dígitos). Se asigna una longitud de 4 a uncampo binario de 2 bytes; se asigna una longitud de 9 a un campo binario de 4bytes, si no se ha definido el campo en ningún otro lugar del programa. Debido aestas limitaciones de longitud, el valor decimal más alto que puede asignarse a uncampo binario de 2 bytes es 9999 y el valor decimal más alto que puede asignarsea un campo binario de 4 bytes es 999 999 999. En general, un campo binario de ndígitos puede tener un valor máximo de n 9. Se presuponen cero posicionesdecimales.

En los archivos descritos por programa, especifique campos de entrada binaria, desalida binaria, y de matriz o tabla binaria con las entradas siguientes:v Campo de entrada binaria: Especifique B en la posición 36 de las

especificaciones de entrada.v Campo de salida binaria: Especifique B en la posición 52 de las especificaciones

de salida. Esta posición debe estar en blanco si se especifica edición.La longitud de un campo que se ha de grabar en formato binario no puedesobrepasar los nueve dígitos. Si la longitud del campo es de uno a cuatrodígitos, el compilador presupone una longitud de campo binario de 2 bytes. Si lalongitud del campo es de cinco a nueve dígitos, el compilador presupone unalongitud de campo binario de 4 bytes.Dado que el compilador convierte un campo de 2 bytes de formato binario enun campo decimal con 1 a 4 dígitos, el valor de entrada puede ser demasiadogrande. Si lo es, se elimina el dígito situado más a la izquierda del número. Porejemplo, si un campo de entrada binario de cuatro dígitos tiene un valor binariohexadecimal 6000, el compilador lo convierte en 24 576 en base decimal. El 2 seelimina y el resultado es 4576. De forma similar, el valor de entrada puede sermuy grande para un campo de 4 bytes en formato binario. Si los camposbinarios tienen cero (0) posiciones decimales, puede evitar este problema deconversión definiendo campos enteros en lugar de campos binarios.

Nota: Los campos de entrada binarios no pueden definirse como campos deemparejamiento o de control.

Capítulo 9. Tipos de datos y formatos de datos 115

Page 138: RPG Referencia

v Campo de tabla o matriz binaria: Especifique una B en la posición 40 de lasespecificaciones de definición. El formato externo para las matrices y tablas detiempo de compilación no debe ser un formato

Archivo descrito externamentePara un archivo descrito externamente, el formato de datos se especifica en laposición 35 de las especificaciones de descripción de datos. El número de dígitosdel campo es exactamente igual a la longitud de la descripción DDS. Por ejemplo,si define un campo binario en la especificación DDS como de 7 dígitos y 0posiciones decimales, los datos se manejan del modo siguiente:1. El campo se define como un campo binario de 4 bytes en la especificación de

entrada2. Se genera un campo empaquetado (7,0) para el campo en el programa

VisualAge RPG.

Si quiere retener toda la información del campo binario, redefina el campo comoun subcampo binario en una estructura de datos o como un campo binarioautónomo. Tenga en cuenta que un campo binario descrito externamente puedetener un valor situado fuera del rango permitido por los campos binarios VARPG.Si el campo binario descrito externamente tiene (0) posiciones decimales puedeevitar este problema. Para ello, defina el campo binario descrito externamente enuna especificación de definición y especifique la palabra clave EXTBININT en laespecificación de control. Esto cambiará el formato externo del campo descritoexternamente por el de un entero con signo.

La Figura 37 muestra cómo aparece el número decimal 8191 en diversos formatos.

1Si se lee 8191 en el almacenamiento como campo decimal con zona, ocupa 4 bytes.Si se convierte al formato decimal empaquetado, ocupa 3 bytes. Cuando se vuelvea convertir en formato decimal con zona, ocupa 5 bytes.

+++++++ ++ +++

0 8 1 9 1

3 bytes

1001 00010011 00010011100000110000 00110011

Zona Zona Zona Zona

5 bytes

0 100 1111 11 1111 1111

2 bytes

=4096 204820482048 1024 512512 256256 128 646464 32 16 8 4 2 1 8191

8 1 9 1

0000 11000001100100011000

Formato decimal empaquetado

Formato decimal con zona:1

Formato binario:2

Signo positivo

Signo positivo

Signo positivo

Figura 37. Definición de campos binarios

116 VisualAge RPG Consulta del lenguaje

Page 139: RPG Referencia

2Para obtener el valor numérico de un número binario positivo, sume los valoresde los bits que están activados (1) sin incluir el bit de signo. Para obtener el valornumérico de un número binario negativo, sume los valores de los bits desactivados(0) más uno (no se incluye el bit de signo).

Formato flotanteEl formato flotante consta de dos partes:v la mantisav el exponente

El valor de un campo de coma flotante es el resultado de multiplicar la mantisapor 10 elevado a la potencia del exponente. Por ejemplo, si 1.2345 es la mantisa y 5es el exponente, entonces el valor del campo de coma flotante es:1.2345 * (10 ** 5) = 123450

Puede definir un campo de coma flotante especificando F en la entrada de tipo dedatos de la especificación apropiada.

Las posiciones decimales deben dejarse en blanco. Sin embargo, se considera quelos campos de coma flotante tienen posiciones decimales. Por tanto, las variablesflotantes no pueden utilizarse allí dónde se necesita un valor numérico sinposiciones decimales, como un índice de matriz, un índice de bucle, etc..

El valor CLEAR y de inicialización por omisión para un campo de coma flotante es0E0.

La longitud de un campo de coma flotante se define en términos del número debytes. Debe especificarse como 4 u 8 bytes. Los rangos de los valores permitidospara un campo de coma flotante positivo son:

Longitud decampo

Mínimo valor permitido Máximo valor permitido

4 bytes 1.175 494 4 E-38 3.402 823 5 E+388 bytes 2.225 073 858 507 201 E-308 1.797 693 134 862 315 E+308

Nota: Los valores negativos tienen el mismo rango, pero con un signo negativo.

Puesto que las variables de coma flotante representan valores ″científicos″,un valor numérico almacenado en una variable flotante podrá norepresentar exactamente el mismo valor que representaría en una variableempaquetada. Las variables flotantes no deben utilizarse para representarnúmeros exactamente hasta un número determinado de decimales, talescomo cantidades monetarias.

Representación de pantalla externa de un campo de comaflotanteConsulte el apartado “Especificación de un formato externo para un camponumérico” en la página 96 para obtener una descripción general de unarepresentación de pantalla externa.

La representación de pantalla externa de valores flotantes se aplica a lo siguiente:v Salida de datos flotantes con la entrada Formato de datos en blancov Entrada de datos flotantes con la entrada Formato de datos en blancov Formato externo de matrices y tablas de tiempo de compilación y de tiempo de

preejecución (cuando se omite la palabra clave EXTFMT).

Capítulo 9. Tipos de datos y formatos de datos 117

Page 140: RPG Referencia

v Visualización y entrada de valores flotantes utilizando el código de operaciónDSPLY.

v Resultado de la función incorporada %EDITFLT.

Salida: Al sacar valores flotantes, la representación externa utiliza un formatosimilar a los literales flotantes, excepto que:v Los valores se escriben siempre con el carácter E y los signos para la mantisa y

el exponente.v Los valores tienen 14 ó 23 caracteres (para 4F y 8F respectivamente).v Los valores están normalizados. Es decir, la coma decimal figura inmediatamente

a continuación del dígito más significativo.v El carácter separador decimal es un punto o una coma dependiendo del

parámetro para la palabra clave de especificación de control DECEDIT.

A continuación se dan algunos ejemplos de cómo se presentan los valores flotantes:+1.2345678E-23-8.2745739E+03-5.722748027467392E-123+1,2857638E+14 si se especifica DECEDIT(',')

Entrada: Al entrar valores flotantes, el valor se especifica como un literal flotante.No es necesario normalizar o ajustar el valor en el campo. Cuando los valoresflotantes se definen como datos de inicialización de matriz/tabla, se especifican encampos de 14 ó 23 caracteres (para 4F y 8F respectivamente).

Tenga en cuenta lo siguiente acerca de los campos flotantes:v La alineación de los campos flotantes puede ser deseable para mejorar el

rendimiento del acceso de los subcampos flotantes. Puede utilizar la palabraclave ALIGN para alinear los subcampos flotantes definidos en unaespecificación de definición. Los subcampos flotantes de 4 bytes se alinean sobreun límite de 4 bytes y los subcampos flotantes de 8 bytes se alinean sobre unlímite de 8 bytes. Para obtener más información sobre la alineación de lossubcampos flotantes, consulte el apartado “ALIGN” en la página 237.

v No está permitido ajustar la longitud cuando se utiliza la palabra clave LIKEpara definir un campo como campo flotante.

Formato enteroEl formato entero es parecido al formato binario con dos excepciones:v El formato entero acepta el rango completo de valores binariosv El número de posiciones decimales para un campo entero es siempre cero.

Un campo entero se define especificando I en la entrada Tipo de datos de laespecificación adecuada. También puede definir un campo entero utilizando lapalabra clave LIKE en una especificación de definición en la que el parámetro esun campo entero.

La longitud de un campo entero se define en términos del número de dígitos;puede tener una longitud de 3, 5, 10 o 20 dígitos. Un campo de 3 dígitos ocupa 1byte de almacenamiento; un campo de 5 dígitos ocupa 2 bytes de almacenamiento;un campo de 10 dígitos ocupa 4 bytes;un campo de 20 dígitos ocupa 8 bytes. Elrango de valores permitido para un campo entero depende de la longitud.

Longitud de campoRango de valores permitidos

Entero de 3 dígitosDe -128 a 127

118 VisualAge RPG Consulta del lenguaje

Page 141: RPG Referencia

Entero de 5 dígitosDe -32768 a 32767

Entero de 10 dígitosDe -2147483648 a 2147483647

Entero de 20 dígitosDe -9223372036854775808 a 9223372036854775807

Tenga en cuenta lo siguiente acerca de los campos enteros:v La alineación de los campos enteros puede ser deseable para mejorar el

rendimiento del acceso de los subcampos flotantes. Puede utilizar la palabraclave ALIGN para alinear subcampos enteros definidos en una especificación dedefinición.Los subcampos enteros de 2 bytes se alinean en un límite de 2 bytes y lossubcampos enteros de 4 bytes se alinean a lo largo de un límite de 4 bytes; lossubcampos enteros de 8 bytes se alinean a lo largo de un límite de 8 bytes. Paraobtener más información sobre la alineación de los subcampos enteros, consulteel apartado “ALIGN” en la página 237.

v Si la palabra clave LIKE se utiliza para definir un campo como un campo entero,la entrada Longitud puede contener un ajuste de longitud en términos denúmero de dígitos. El valor de ajuste debe ser tal que el número resultante dedígitos para el campo sea 3, 5, 10 o 20.

Formato decimal empaquetadoEl formato decimal empaquetado significa que cada byte de almacenamiento(excepto el byte de orden inferior) puede contener dos números decimales. El bytede orden inferior contiene un dígito en la parte situada más a la izquierda y elsigno (positivo o negativo) en la parte situada más a la derecha. Todos los númerosdecimales empaquetados utilizan signos preferidos: hexadecimal C para númerospositivos y hexadecimal D para números negativos. Además, están soportados lossignos siguientes: hexadecimal A, E, F para números positivos y hexadecimal Bpara números negativos. El formato decimal empaquetado es así:

En la Figura 37 en la página 116 se muestra que el número decimal 8191 tiene elaspecto de tener formato decimal empaquetado.

Para un archivo descrito por programa:v Especifique P en la posición 36 de las especificaciones de entrada para entrada

decimal empaquetadaEspecifique P en la posición 52 de las especificaciones de salida para salidadecimal empaquetada. Esta posición debe estar en blanco si se especifica edición.Especifique P en la posición 40 de las especificaciones de definición paramatrices y tablas de decimal empaquetado. El formato externo para matrices ytablas de tiempo de compilación no puede ser formato decimal empaquetado.

Dígito DígitoDígito Signo

0 7 0 7

Byte

Capítulo 9. Tipos de datos y formatos de datos 119

Page 142: RPG Referencia

Para un archivo descrito externamente, el formato de datos es el indicado en lasespecificaciones de descripción de datos.

Determinación de la longitud de dígitos de un campo decimalempaquetadoUtilice la fórmula siguiente para saber la longitud en dígitos de un campo decimalempaquetado:

Número de dígitos = 2n − 1,

...donde n = número de posiciones del registro deentrada empaquetadas que se han utilizado.

Esta fórmula le da el número máximo de dígitos que puede representar en formatodecimal empaquetado; el límite superior es 30.

Los campos empaquetados pueden tener una longitud máxima de 16 bytes. En laTabla 19 se muestran los equivalentes empaquetados para campos decimales conzona con un máximo de 30 dígitos de longitud:

Tabla 19. Equivalentes empaquetados para los campos decimales con zona de hasta 30dígitos

Longitud decimal con zona en dígitos Número de bytes utilizado en el campodecimal empaquetado

1 1

2, 3 2

4, 5 3

. .

. .

. .

.

.

.

28, 29 15

30 16

Nota: Sólo se permiten 30 dígitos.

Si utiliza la notación posicional para campos empaquetados de 16 bytes, debeutilizar la palabra clave PACKEVEN; de lo contrario debe definir el campo comode 30 dígitos.

Por ejemplo, un campo de entrada leído en formato decimal empaquetado tieneuna longitud de cinco bytes (como se especifica en las especificaciones dedescripción de datos o de entrada). El número de dígitos de este campo es igual a2(5) − 1 ó 9. Por lo tanto, cuando se utiliza el campo en las especificaciones decálculo, el campo de resultado debe tener una longitud de nueve posiciones. Lapalabra clave PACKEVEN de la especificación de definición puede utilizarse paraindicar cuál de los dos tamaños posibles quiere cuando especifica un campoempaquetado utilizando posiciones inicial y final en lugar del número de dígitos.

Formato sin signoEl formato entero sin signo es igual que el formato entero excepto que el rango devalores no incluye números negativos. Debe utilizar el formato sin signo sólocuando espere datos enteros no negativos.

120 VisualAge RPG Consulta del lenguaje

Page 143: RPG Referencia

Un campo sin signo se define especificando U en la entrada Tipo de datos de laespecificación adecuada. También puede definir un campo sin signo utilizando lapalabra clave LIKE en la especificación de definición en la que el parámetro sea uncampo sin signo.

La longitud de un campo sin signo se define en términos del número de dígitos;puede tener una longitud de 3, 5, 10 o 20 dígitos. Un campo de 3 dígitos ocupa 1byte de almacenamiento; un campo de 5 dígitos ocupa 2 bytes de almacenamiento;un campo de 10 dígitos ocupa 4 bytes;un campo de 20 dígitos ocupa 8 bytes. Elrango de valores permitido para un campo sin signo depende de la longitud.

Longitud de campo Rango de valores permitidosEntero sin signo de 3 dígitos De 0 a 2555 dígitos sin signo 0 a 6553510 dígitos sin signo 0 a 429496729520 dígitos sin signo De 0 a 18446744073709551615

Para obtener información sobre otras consideraciones acerca de la utilización decampos sin signo, incluyendo la información sobre la alineación, consulte elapartado “Formato entero” en la página 118.

Formato decimal con zonaFormato decimal con zona significa que cada byte de almacenamiento puedecontener un dígito o un carácter. En el formato decimal con zona, cada byte dealmacenamiento está dividido en dos partes: una parte de zona de 4 bits y unaparte de dígitos de 4 bits. El formato decimal con zona es así:

La parte de zona del byte situado más a la derecha indica el signo (positivo onegativo) del número decimal. Todos los números decimales con zona utilizansignos preferidos: hexadecimal 3 para números positivos y hexadecimal 7 paranúmeros negativos. Además, están soportados los signos siguientes: hexadecimal 0,1, 2, 8, 9, A, B para números positivos y hexadecimal 4, 5, 6, C, D, E, F paranúmeros negativos. En el formato decimal con zona, cada dígito de un númerodecimal incluye una parte de zona; sin embargo, sólo la parte de zona situada mása la derecha sirve como signo. La Figura 37 en la página 116 muestra cómo apareceel número 8191 en formato decimal con zona.

Debe tener en cuenta el cambio de longitud del campo cuando codifique laposición final de las posiciones 40 a 43 de las especificaciones de salida y la salidadel campo ha de ser en formato empaquetado. Para saber la longitud del campouna vez se ha empaquetado, utilice la fórmula siguiente:

ZoneZoneZona Dígito Zona Dígito Zona Dígito Zona Dígito

0 7 0 70 70 70 7

Byte 0111 = Valor negativo (hex 7)0011 = Valor positivo (hex 3)

Capítulo 9. Tipos de datos y formatos de datos 121

Page 144: RPG Referencia

En un archivo descrito por programa, se especifica el formato decimal con zonamediante un blanco en la posición 36 de las especificaciones de entrada, en laposición 52 de las especificaciones de salida o en la posición 40 de lasespecificaciones de definición. En un archivo descrito externamente, el formato dedatos se especifica en la posición 35 de las especificaciones de descripción de datos.

Puede especificar un formato de signo alternativo para el formato decimal conzona. En el formato de signo alternativo, el campo numérico va precedido oseguido inmediatamente por un signo + o −. Un signo más es un hexadecimal 2B yun signo menos es un hexadecimal 2D.

Cuando se especifica un formato de signo alternativo, la longitud de campo(especificada en las especificaciones de entrada) debe incluir una posición adicionalpara el signo. Por ejemplo, si un campo tiene una longitud de 5 dígitos y seespecifica el formato de signo alternativo, debe especificarse una longitud de 6posiciones.

Consideraciones para utilizar formatos numéricosRecuerde lo siguiente cuando defina campos numéricos:v Cuando codifique la posición final en las posiciones 47 a 51 de las

especificaciones de salida, asegúrese de utilizar el formato externo al calcular elnúmero de bytes que debe ocupar el campo de salida. Por ejemplo, un campoempaquetado con 5 dígitos se almacena en 3 bytes, pero cuando la salida tieneformato con zona necesita 5 bytes. Cuando la salida tiene formato entero sólonecesita 2 bytes.

v Si traslada un campo de caracteres a un campo numérico con zona, el signo delcampo de caracteres se establece en positivo o negativo con zona. La parte conzona de los demás bytes se establecerá obligatoriamente en ’3’. Sin embargo, sila parte de dígitos de uno de los bytes del campo de caracteres contiene undígito no válido, se producirá un error de datos decimales.

v Cuando los campos numéricos se escriben sin editar, el signo no se imprimecomo carácter aparte; el último dígito del número incluirá el signo. Esto puedeproducir resultados sorprendentes; por ejemplo, cuando se escribe -625, el valordecimal con zona es XX'363275', que aparece como 62u.

v Por omisión se realiza una aritmética de 4 bytes. El compilador sólo realiza unaaritmética de 8 bytes si por lo menos un operando es un entero de 8 bytes. Enestas operaciones aritméticas puede producirse un error de desbordamiento entiempo de ejecución cuando dos enteros de 4 bytes produzcan un resultado de 8bytes. Para evitar este problema, asegúrese de que un operando sea de 8 bytes.

Líneas directrices para elegir el formato numérico para uncampoDebe especificar el formato entero o sin signo para los campos cuando:v El rendimiento de la aritmética es importante

nLongitud de campo= + 1

2

. . . siendo n = el número de dígitos en el campo decimal con zona.

(No se tiene en cuenta el resto de la división.)

122 VisualAge RPG Consulta del lenguaje

Page 145: RPG Referencia

Con ciertas operaciones aritméticas puede ser importante que el valor utilizadosea un entero. Algunos ejemplos en los que el rendimiento puede mejorarseincluyen los cálculos de índices de matrices y los argumentos para la funciónincorporada %SUBST.

v Por omisión se realiza una aritmética de 4 bytes. El compilador sólo realiza unaaritmética de 8 bytes si por lo menos un operando es un entero de 8 bytes.Desde el punto de vista del rendimiento, la aritmética de 8 bytes es cara y debeevitarse en lo posible.

v Se interactúa con rutinas escritas en otros lenguajes que soportan un tipo dedatos entero, tal como ILE C.

v Se utilizan campos en áreas de realimentación definidas como enteros y quepueden contener valores superiores a 9999 ó 999999999.

Debe especificar los formatos empaquetado, con zona y binario para los camposcuando:v Se utilizan valores que implican decimales, tales como valores monetariosv Se manipulan valores que tienen más de 19 dígitosv Es importante asegurar un número específico de dígitos para un campo

Debe especificar el formato flotante para los campos cuando:v Se necesita la misma variable para retener valores muy grandes y/o muy

pequeños que no pueden representarse en valores empaquetados o por zonas.

Nota: Es más probable que se produzca un desbordamiento con operacionesaritméticas realizadas utilizando el formato entero o sin signo, especialmentecuando la aritmética de enteros se realiza en expresiones de formato libre.Esto es así porque los resultados intermedios se guardan en un formatoentero o sin signo en lugar de en un campo decimal temporal de tamañosuficiente.

Representación de formatos numéricosLa figura siguiente muestra qué aspecto tiene el número decimal 21544 en diversosformatos.

Capítulo 9. Tipos de datos y formatos de datos 123

Page 146: RPG Referencia

Tenga en cuenta lo siguiente acerca de las representaciones de la figura precedente.

Formatodecimalempaquetado:

Formatodecimal conzona:

Signopositivo

Signopositivo

2 1 5 4 4

0010 0001 0101 0010 0010 1100

3bytes

Zona Zona Zona Zona

12 5 4 4

0011

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

0011 0011

0 1 0 1

0011

0 0 1 0

00110010 0001 0101

0 1 0 0

0100

1 0 0 0

0100

5bytes

Signopositivo

4bytes

Formatobinario:16384

+ 4096+ 1024+ 32+ 8

-------------21544

0 1 0 1

0 1 0 1

0 0 1 0

0 0 1 0

0 1 0 0

0 1 0 0

1 0 0 0

1 0 0 0

Signopositivo

2bytes

2bytes

Formatodeentero (consigno) :

Formatosinsigno:

16384+ 4096+ 1024+ 32+ 8

-------------21544

16384+ 4096+ 1024+ 32+ 8

-------------21544

124 VisualAge RPG Consulta del lenguaje

Page 147: RPG Referencia

v Para obtener el valor numérico de un número entero o binario positivo, añadalos valores de los bits activados (1), pero no incluya el bit de signo (si lo hay).Para un número sin signo, añada los valores de los bits activados, incluyendo elbit situado más a la izquierda.

v El valor 21544 no puede representarse en un campo binario de 2 bytes, inclusoaunque sólo utilice bits en los dos bytes de orden inferior. Un campo binario de2 bytes sólo puede retener 4 dígitos y 21544 tiene 5 dígitos.

La Figura 38 muestra el número -21544 en formato entero.

Nota: La arquitectura de la estación de trabajo almacena los formatos binarios,enteros y sin signo en la memoria del programa con los bytes en ordeninvertido. Este mecanismo de almacenamiento afectará al valor de lossubcampos de caracteres utilizados para recubrir subcampos para estosformatos.

Tipo de datos puntero de procedimientoLos punteros de procedimiento se utilizan para apuntar procedimientos ofunciones. Un puntero de procedimiento señala un punto de entrada que estáenlazado en el programa. Los punteros de procedimiento se definen en laespecificación de definición.

La longitud del campo de puntero de procedimiento debe ser de 4 bytes y debeestar alineada en un límite de 4 bytes. Debido a este requisito de alineación delímites es posible que un subcampo de puntero no siga directamente al campoanterior y que estructuras de datos de múltiples apariciones tengan apariciones nocontiguas. El valor de inicialización por omisión para punteros de procedimiento es*NULL.

1 0 1 0 1 1 0 11 0 1 1 1 0 0 0

Signonegativo

2bytes

Figura 38. Representación como entero del número -21544

Capítulo 9. Tipos de datos y formatos de datos 125

Page 148: RPG Referencia

Datos de horaLos campos de hora tienen un tamaño y formato predeterminado. Pueden definirseen la especificación de definición. Son necesarios los ceros iniciales y de cola paratodos los datos de hora.

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++D*D* Definir un puntero base e inicializarlo a la dirección de la estructuraD* de datos My_Struct.D*D My_struct DSD My_array 10 DIM(50)DD Ptr1 S 4* INZ(%ADDR(My_Struct))D*D* O fijar por omisión la longitud en 4, si no se ha definido la longitudD*D Ptr1 S * INZ(%ADDR(My_Struct))D*D* Definir un campo de puntero de procedimiento e inicializarlo en NULLD*D Ptr1 S 4* PROCPTR INZ(*NULL)D*D* Definir un campo de puntero de procedimiento e inicializarlo a laD* dirección del procedimiento My_Proc.D*D Ptr1 S 4* PROCPTR INZ(%PADDR(My_Proc))D*D* Definir punteros en una estructura de datos de varias apariciones yD* correlacionar el almacenamiento.D*DDataS DS OCCURS(2)D ptr1 *D ptr2 *D Switch 1AD*D* La correlación de almacenamiento será:D*D* DataS

*****************

ptr1 4 bytes

ptr2 4 bytes

Conmutador 1 byte

Pad 3 bytes

ptr1

4 bytesptr2

4 bytes

Conmutador 1 byte

Figura 39. Definición de punteros

126 VisualAge RPG Consulta del lenguaje

Page 149: RPG Referencia

Las constantes o variables de hora utilizadas en las comparaciones o asignacionesno han de estar en el mismo formato ni utilizar los mismos separadores. Las horasse utilizan en operaciones de E/S donde los campos de entrada, los campos desalida o los campos de clave se convierten (si es necesario) al formato necesariopara la operación.

El formato interno por omisión para variables de hora es *ISO. Este formatointerno por omisión se puede alterar temporalmente de modo global mediante lapalabra clave de especificación de control TIMFMT y de modo individual mediantela palabra clave de especificación de definición TIMFMT.

La jerarquía utilizada al determinar el formato interno y el separador de un campode hora proviene de:1. La palabra clave TIMFMT indicada en la especificación de definición2. La palabra clave TIMFMT indicada en la especificación de control.3. *ISO

Si desea ver ejemplos de cómo se puede codificar campos de hora, consulte losejemplos dados en:v “Operaciones de fecha” en la página 377v “Cómo mover los datos de fecha y hora” en la página 386v “ADDDUR (Añadir duración)” en la página 393v “MOVE (Mover)” en la página 468v “SUBDUR (Restar duración)” en la página 543v “TEST (Comprobar fecha/hora/indicación de la hora)” en la página 549

La tabla siguiente lista los formatos de los datos de hora:

Tabla 20. Separadores y formatos del tipo de datos Hora

Nombredeformato

Descripción Formatoconseparadorpor omisión

Separadoresválidos

Longitud Ejemplo

*HMS Horas:Minutos:Segundos hh:mm:ss : . , & 8 14:00:00

*ISO International StandardsOrganization

hh.mm.ss . 8 14.00.00

*USA Estándar EE.UU. IBM. AM y PMpueden ser cualquiercombinación de mayúsculas yminúsculas

hh:mm AMo hh:mmPM

: 8 02:00 PM

*EUR Estándar europeo IBM hh.mm.ss . 8 14.00.00

*JIS Estándar industrial japonés eracristiana

hh:mm:ss : 8 14:00:00

La tabla siguiente lista los valores *LOVAL, *HIVAL y los valores por omisión paratodos los formatos de hora:

Capítulo 9. Tipos de datos y formatos de datos 127

Page 150: RPG Referencia

Tabla 21. Valores de hora

Nombreformato

Descripción *LOVAL *HIVAL Valor poromisión

*HMS Horas:Minutos:Segundos 00:00:00 24:00:00 00:00:00

*ISO International StandardsOrganization

00.00.00 24.00.00 00.00.00

*USA Estándar EE.UU. IBM. AM y PMpueden ser cualquier combinaciónde mayúsculas y minúsculas

00:00 AM 12:00 AM 00:00 AM

*EUR Estándar europeo IBM 00.00.00 24.00.00 00.00.00

*JIS Estándar industrial japonés eracristiana

00:00:00 24:00:00 00:00:00

SeparadoresAl codificar un formato de hora en una operación MOVE, MOVEL o TEST, losseparadores son opcionales para los campos de caracteres. Para indicar que no hayseparadores, especifique el formato seguido de un cero. Para obtener másinformación sobre cómo codificar los formatos de hora sin separadores, consulte elapartado “MOVE (Mover)” en la página 468.

Datos de indicación de la horaLos campos de indicación de la hora tienen un tamaño y formato predeterminado.Pueden definirse en la especificación de definición. Los datos de indicación de lahora deben tener el formatoaaaa-mm-dd-hh.mm.ss.mmmmmm (longitud 26).

Para los literales de indicación de la hora son opcionales los microsegundos(.mmmmmm) y si no se suministran se rellenarán por la derecha con ceros. Sonnecesarios los ceros iniciales en todos los datos de indicación de la hora.

El valor de inicialización por omisión para una indicación de la hora es lamedianoche del 1 de enero del 0001 (0001-01-01-00.00.00.000000). El valor *HIVALpara una indicación de la hora es 9999-12-31-24.00.00.000000. De forma similar, elvalor *LOVAL para la indicación de la hora es 0001-01-01-00.00.00.00000.

SeparadoresAl codificar el formato de indicación de la hora en una operación MOVE, MOVELo TEST, los separadores son opcionales para los campos de caracteres. Para indicarque no hay separadores, especifique *ISO0. Para ver un ejemplo de cómo utilizar*ISO sin separadores, consulte el apartado “TEST (Comprobarfecha/hora/indicación de la hora)” en la página 549.

Soporte de valores nulos de base de datosEn un programa de VisualAge RPG puede seleccionar una de tres formas distintasde manejar campos con posibilidad de nulos de un archivo de base de datosdescrito externamente. Esto depende de cómo especifique la opción Permitir valoresnulos o la palabra clave de especificación de control ALWNULL:1. Control de usuario, ALWNULL(*USRCTL) - leer, grabar, actualizar y suprimir

registros con valores nulos y recuperar y situar en registros con claves nulas.

128 VisualAge RPG Consulta del lenguaje

Page 151: RPG Referencia

2. Sólo entrada, ALWNULL(*INPUTONLY) - leer registros con valores nulos paraacceder a los datos de los campos nulos.

3. No, ALWNULL(*NO)- no procesar registros con valores nulos.

Nota: En un archivo descrito por programa, una valor nulo en el registro siemprecausa un error de correlación de datos, a pesar del valor que se especifiqueen la opción Permitir valores nulos o en la palabra clave ALWNULL.

Para obtener más información sobre la especificación de opciones de compilador,consulte la publicación Iniciación a VisualAge RPG y CODE/400, SC10-3287-01(SC09-2625-01).

Soporte controlado por el usuario para campos conposibilidad de nulos y campos de clave

Cuando un archivo descrito externamente contiene campos con posibilidad denulos y se especifica la opción Control de usuario o ALWNULL(*USRCTL), puedehacer lo siguiente:v Leer, grabar, actualizar y suprimir registros con valores nulos de archivos de

base de datos descritos externamente.v Recuperar y posicionarse en registros con claves nulas utilizando operaciones

por clave, especificando un indicador en el factor 2 de KFLD asociado al campo.v Determinar si un campo con posibilidad de nulos es realmente nulo utilizando

la función incorporada %NULLIND en la parte derecha de una expresión.v Establecer que un campo con posibilidad de nulos sea nulo para la salida o

actualización utilizando la función incorporada %NULLIND en la parteizquierda de una expresión.

Tiene la responsabilidad de asegurarse de que los campos que contienen valoresnulos se utilicen correctamente en el programa. Por ejemplo, si utiliza un campocon posibilidad de nulos como factor 2 de una operación MOVE, debe comprobarprimero si es nulo antes de realizar la operación MOVE, de lo contrario puedecorromper el valor del campo de resultado. También debe tener cuidado al enviarun campo con posibilidad de nulos a un archivo que no tiene el campo definidocomo con posibilidad de nulos, por ejemplo: un archivo PRINTER o descrito porprograma.

Nota: El valor del indicador de nulos para un campo con posibilidad de nulos sólose tiene en cuenta para estas operaciones: entrada, salida y posicionamientode archivos. A continuación, se proporcionan algunos ejemplos deoperaciones en las que el indicador de nulos no se tiene en cuenta:v La operación DSPLY de un campo con posibilidad de nulos muestra el

contenido del campo aunque el indicador de nulos esté activado.v Si traslada un campo con posibilidad de nulos a otro campo con

posibilidad de nulos y el campo de factor 2 tiene el indicador de nulosactivado, el campo de resultado obtendrá los datos del campo de factor 2.El indicador de nulos correspondiente para el campo de resultado noestará activado.

v Las operaciones de comparación, incluyendo SORTA y LOOKUP, concampos con posibilidad de nulos no tienen en cuenta los indicadores denulos.

Se considera que un campo tiene posibilidad de nulos si tiene posibilidad de nulosen cualquier registro de base de datos descrito externamente y no está definidocomo una constante en el programa.

Capítulo 9. Tipos de datos y formatos de datos 129

Page 152: RPG Referencia

Nota: Si el archivo utilizado para una estructura de datos descrita externamentetiene campos definidos con posibilidad de nulos, el atributo nulo no seutiliza al definir el subcampo VARPG.

Cuando un campo tiene la consideración de campo con capacidad de nulos en unprograma VARPG, hay un indicador de nulos asociado al campo. Tenga en cuentalo siguiente:v Si el campo es una estructura de datos de varias apariciones o una tabla, se

asociará al campo una matriz de indicadores de nulos. Cada indicador de nuloscorresponde a una aparición de la estructura de datos o elemento de la tabla.

v Si el campo es un elemento de matriz, se considerará que toda la matriz tieneposibilidad de nulos. Se asociará una matriz de indicadores de nulos a la matriz,cada indicador de nulos corresponderá a un elemento de la matriz.

v Si el campo es un elemento de un subcampo de una matriz de una estructura dedatos de varias apariciones, se asociará una matriz de indicadores de nulos a lamatriz para cada aparición de la estructura de datos.

Los indicadores de nulos se inicializan como ceros durante la inicialización delprograma y de este modo los campos con posibilidad de nulos no contienenvalores nulos cuando el programa arranca la ejecución.

Entrada de campos con posibilidad de nulosPara un campo con posibilidad de nulos en el programa RPG, se aplicará losiguiente en la entrada, para archivos DISK y SPECIAL:v Cuando se lee un campo con posibilidad de nulos desde un archivo descrito

externamente, el indicador de nulos para el campo se activa si el campo es nuloen el registro. De lo contrario, el indicador de nulos es desactivado.

v Si se especifican indicadores de campo y el campo con posibilidad de nulos esnulo, se desactivarán todos los indicadores de campo.

v Si se define un campo como campo con posibilidad de nulos en un archivo y sinposibilidad de nulos en otro, el campo se considerará como campo conposibilidad de nulos en el programa RPG. Sin embargo, al leer el segundoarchivo, el indicador de nulos asociado al campo siempre estará desactivado.

v Una operación de entrada desde un archivo descrito por programa utilizandouna estructura de datos en el campo de resultado no afecta al indicador de nulosasociado a la estructura de datos ni a cualquiera de los subcampos.

v La lectura de campos con posibilidad de nulos utilizando especificaciones deentrada para archivos descritos por programa siempre desactiva los indicadoresde nulos asociados.

v Si los campos con posibilidad de nulos no se seleccionan para la lectura debidoa un indicador de relación de campo-registro, el indicador de nulos asociado nose cambiará.

Salida de campos con posibilidad de nulosCuando se graba un campo con posibilidad de nulos (salida o actualización) en unarchivo descrito externamente, se graba un valor nulo si el indicador de nulos delcampo está activado en el momento en que se realiza la operación.

Cuando un campo con posibilidad de nulos se transfiere o actualiza a un archivode base de datos descrito externamente, entonces, si el campo es nulo, la gestiónde datos ignorará el valor situado en el almacenamiento intermedio.

Nota: Los campos que tienen el indicador activado en el momento de la salidatrasladan los datos al almacenamiento intermedio. Esto significa que loserrores tales como error de datos decimales o puntero de base no establecidose producirán incluso aunque el indicador de nulos del campo esté activado.

130 VisualAge RPG Consulta del lenguaje

Page 153: RPG Referencia

Durante una operación de salida a un archivo de base de datos descritoexternamente, si el archivo contiene campos considerados como campos conposibilidad de nulos en el programa pero sin posibilidad de nulos en el archivo, nose utilizarán los indicadores de nulos asociados a estos campos con posibilidad denulos.

La Figura 40 muestra cómo leer, grabar y actualizar registros con valores nuloscuando se selecciona la opción Control de usuario o la palabra claveALWNULL(*USRCTL).

Operaciones por claveSi tiene un campo de clave con posibilidad de nulos, puede buscar registros quecontengan valores nulos especificando un indicador en el factor 2 de la operaciónKFLD y activar el indicador antes de la operación de entrada por clave. Si noquiere que se seleccione una clave nula, desactive el indicador.

H*H* Especificar la palabra clave ALWNULL(*USRCTL) en una especificaciónH* de control o compilar el programa VARPG con la opciónH* Control de usuario.H*HKeywords++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++H* H ALWNULL(*USRCTL)F*F* ARCHDISCO contiene un registro REC con 2 campos: FLD1 y FLD2F* Tanto FLD1 como FLD2 tienen posibilidad de nulos.F*FFilename++IPEASFRlen+LKlen+AIDevice+.Keywords++++++++++++++++++++++++++F*FARCHDISCO UF A E DISKCSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq.C*C* Leer el primer registro.C* Actualizar el registro con nuevos valores para los campos que noC* son nulos.C READ REC 10C IF NOT %NULLIND(Fld1)C MOVE 'FLD1' Fld1C ENDIFC IF NOT %NULLIND(Fld2)C MOVE 'FLD2' Fld2C ENDIFC UPDATE RECC*C* Leer otro registro.C* Actualizar el registro para que todos los campos sean nulos.C* No hay necesidad de establecer los valores de los campos porqueC* se ignorarán.C READ REC 10C EVAL %NULLIND(Fld1) = *ONC EVAL %NULLIND(Fld2) = *ONC UPDATE RECC*C* Grabar un nuevo registro donde Fld 1 es nulo y Fld 2 no es nulo.C*C EVAL %NULLIND(Fld1) = *ONC EVAL %NULLIND(Fld2) = *OFFC EVAL Fld2 = 'Valor nuevo'C WRITE REC

Figura 40. Entrada y salida de campos con posibilidad de nulos

Capítulo 9. Tipos de datos y formatos de datos 131

Page 154: RPG Referencia

La Figura 41 ilustra cómo se utilizan las operaciones por clave para posicionar yrecuperar registros con claves nulas.

** Supuesto: Arch1 contiene un registro Rec1 con una clave compuesta* por tres campos clave: Key1, Key2 y Key3. Key2 y Key3 tienen* posibilidad de nulos. Key1 no tiene posibilidad de nulos.* Cada campo de clave tiene una longitud de dos caracteres.**..1....+....2....+....3....+....4....+....5....+....6....+....7....+..

FFilename++IPEASFRlen+LKlen+AIDevice+.Keywords++++++++++++++++++++++++++F*FArch1 IF E DISKF*CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq.C*C Full_Kl KLISTC KFLD Key1C KFLD *IN02 Key2C KFLD *IN03 Key3C*C Partial_Kl KLISTC KFLD Key1C KFLD *IN05 Key2C*C*C* *IN02 está ACTIVADO y *IN03 DESACTIVADO para la operación STLL.C* Arch1 se situará en el siguiente registro que tenga una claveC* igual o mayor que 'AA??CC' (donde ?? se utiliza en este ejemploC* para indicar NULO)C*C* Puesto que *IN02 está ACTIVADO, se ignorará el contenido realC* del argumento de búsqueda para Key2.C*C* Si existe un registro en Arch1 con 'AA' en Key1, nulo en Key2, yC* 'CC' en Key3, se ACTIVARÁ el indicador 90 (el indicador Ig).C*C MOVE 'AA' Key1C MOVE 'CC' Key3C EVAL *IN02 = '1'C EVAL *IN03 = '0'C Full_Kl SETLL Rec1 90C*

Figura 41. Ejemplo de operaciones por clave utilizando campos de clave con posibilidad denulos. (Pieza 1 de 2)

132 VisualAge RPG Consulta del lenguaje

Page 155: RPG Referencia

Soporte de sólo entrada para campos con posibilidad denulos

Cuando un archivo de sólo entrada descrito externamente contiene campos conposibilidad de nulos y se especifica la opción Sólo entrada o la palabra claveALWNULL(*INPUTONLY), se aplican las condiciones siguientes:v Cuando se recupera un registro de un archivo de base de datos y hay varios

campos en el registro que contienen valores nulos, los valores por omisión de labase de datos para los campos con posibilidad de nulos se situarán en loscampos que contienen valores nulos. El valor por omisión será el valor poromisión de la DDS definido por el usuario o el valor por omisión definido por elsistema.

v No será capaz de determinar si un campo determinado del registro tiene unvalor nulo.

v No se permiten los indicadores de campo en una especificación de entrada si elcampo de entrada es un campo con posibilidad de nulos de un archivo de sóloentrada descrito externamente.

v No se permiten las operaciones por clave cuando el factor 1 de una operación decálculo de entrada por clave corresponde a un campo de clave con posibilidadde nulos en un archivo de sólo entrada descrito externamente.

C*C* La operación CHAIN recuperará un registro con 'JJ' en Key1,C* 'KK' en Key2 y nulo en Key3. Puesto que *IN03 está ACTIVADO, aunqueC* el programador haya movido algún valor (p.ej. 'XX') al argumento deC* búsqueda de Key3, no se utilizará 'XX'. Esto significa si File1C* tiene realmente un registro con una clave 'JJKKXX', que el registroC* no se recuperará.C*C MOVE 'JJ' Key1C MOVE 'KK' Key2C EVAL *IN02 = '0'C EVAL *IN03 = '1'C Full_Kl CHAIN Rec1 80C*C*C* La operación CHAIN utiliza una clave parcial como argumento deC* búsqueda. Recuperará un registro con 'NN' en Key1, nulo en Key2 yC* cualquier valor, incluso nulo, en Key3.C*C* En la base de datos, el valor NULL ocupa la posición más alta enC* el orden de clasificación. Suponer que las claves de File1 estánC* en orden ascendente. Si File1 tiene un registro con 'NN??xx' comoC* clave (?? = NULO) y xx es cualquier valor distinto de NULO), seC* recuperará el registro. Si tal registro no existe en File1, peroC* File1 tiene un registro con 'NN????' como clave, se recuperará elC* registro 'NN????'. Los indicadores nulos de Key2 y Key3 seC* ACTIVARÁN como resultado.C*C MOVE 'NN' Key1C SETON 05C Partial_Kl CHAIN Rec1 70

Figura 41. Ejemplo de operaciones por clave utilizando campos de clave con posibilidad denulos. (Pieza 2 de 2)

Capítulo 9. Tipos de datos y formatos de datos 133

Page 156: RPG Referencia

Opción de campos sin nulosCuando un archivo descrito externamente contiene campos con posibilidad denulos y se especifica la opción No o la palabra clave ALWNULL(*NO), se aplicanlas condiciones siguientes:v Un registro que contenga valores nulos recuperados de un archivo originará un

error de correlación de datos y se emitirá un mensaje de error.v Los datos del registro no son accesibles y no puede actualizarse ninguno de los

campos del registro con los valores del registro de entrada que contienen valoresnulos.

v Con esta opción no puede situar valores nulos en campos con posibilidad denulos para actualizar o añadir un registro. Si quiere situar valores nulos encampos con posibilidad de nulos, utilice la opción Control de usuario.

Conversión de campos de base de datos de longitud variableEl compilador VisualAge RPG puede definir internamente como campos de tipocarácter de longitud fija los campos de tipo carácter o gráfico de longitud variableprocedentes de una estructura de datos o un archivo descritos externamente.Aunque la conversión de los campos de tipo carácter o gráfico de longitud variablea formato de longitud fija no es necesaria, se conserva la opción del compiladorCVTOPT en el lenguaje con el fin de dar soporte a los programas escritos antes deque se diera soporte a los campos de longitud variable.

Para convertir los campos de longitud variable, especifique *VARCHAR (paracampos de tipo carácter de longitud variable) o *VARGRAPHIC (para camposgráficos de longitud variable) en la palabra clave de especificación de controlCVTOPT. Si no se especifica *VARCHAR ni *VARGRAPHIC, o bien si se especifica*NOVARCHAR o *NOVARGRAPHIC, los campos de longitud variable no seconvierten a formato carácter de longitud fija y se pueden utilizar en el programaVisualAge RPG como de longitud variable.

Cuando se especifica *VARCHAR o *VARGRAPHIC, rigen las condicionessiguientes:v Si se extrae un campo de longitud variable de un archivo descrito externamente

o una estructura de datos descrita externamente, se declara como un campo decaracteres de longitud fija.

v En los campos de caracteres de un solo byte, la longitud del campo declarado esla longitud del campo DDS más 2 bytes.

v En los campos de datos de tipo DBCS gráfico, la longitud del campo declaradoes dos veces la longitud del campo de DDS más 2 bytes.

v Los dos bytes extra del campo pueden contienen un número binario querepresenta la longitud actual del campo de longitud variable. La Figura 42 en lapágina 135 muestra la longitud de campo de los campos de longitud variable.

v En los campos gráficos de longitud variable definidos como campos de tipocarácter de longitud fija, la longitud es el doble del número de caracteresgráficos.

134 VisualAge RPG Consulta del lenguaje

Page 157: RPG Referencia

v El programa puede realizar cualquier operación de cálculo de caracteres válidaen el campo de longitud fija declarado. Sin embargo, debido a la estructura delcampo, los primeros dos bytes del campo deben contener datos de tipo enterosin signo válidos al grabar el campo en un archivo. Se produce un error deexcepción de E/S en una operación de salida si los primeros dos bytes delcampo contienen datos de longitud no válida.

v En el transcurso de la compilación, se producirán errores debidos a conflictos dedefinición de campos cuando se importe un campo de longitud variableprocedente de un archivo AS/400 en un objeto GUI y el archivo se utilicetambién en el programa como archivo descrito externamente con la opción*VARCHAR o *VARGRAPHIC especificada. Los dos bytes correspondientes a lalongitud de datos se añaden a la definición del campo procedente del formatode registro de archivo, que entra en conflicto con la definición de longitud decampo procedente del objeto GUI.Para soslayar este conflicto, no especifique la opción *VARCHAR ni*VARGRAPHIC o bien redenomine el objeto GUI y escriba código fuente paramover datos entre los dos campos según convenga.

v No está permitido utilizar indicadores de campo en una especificación deentrada si el campo de entrada es un campo con posibilidad de nulos de unarchivo de sólo entrada descrito externamente.

v No se permiten las operaciones por clave cuando el factor 1 de una operaciónpor clave corresponde a un campo de clave de longitud variable de un archivodescrito externamente.

v Si selecciona la salida selectiva de ciertos campos de un registro y en laespecificación de salida no se ha especificado el campo de longitud variable, o sien el programa se pasa por alto el campo de longitud variable, se coloca unvalor por omisión en el almacenamiento intermedio de salida del registroañadido recientemente. El valor por omisión es 0 en los primeros dos bytes yblancos en todos los demás bytes.

v Si desea cambiar los campos de longitud variable convertidos, asegúrese de quela longitud del campo actual sea correcta. Una forma de hacerlo es:

Campos de car ácter de un s ólo byte:

Campos de tipo de datos gráficos:

longitud

longitud

datos de caracteres

datos gráficos

N = longitud declarada en DDS

N = longitud declarada en DDS = número de bytes dobles

2 + N = longitud de campo

2 + 2(N) = longitud de campo

UNS(5)

UNS(5)

CHAR(N)

CHAR(2(N))

Figura 42. Longitud de campo de los campos de longitud variable convertidos

Capítulo 9. Tipos de datos y formatos de datos 135

Page 158: RPG Referencia

1. Definir una estructura de datos con un nombre de campo de longitudvariable como un nombre de subcampo.

2. Definir un subcampo de tipo entero sin signo de 5 dígitos que solape elinicio del campo y definir un subcampo de caracteres de N-bytes que solapeel campo que comienza en la posición 3.

3. Actualizar el campo.

Como alternativa, puede mover otro campo de longitud variable alineado a laizquierda en el campo. A continuación, se facilita un ejemplo de cómo cambiar uncampo de longitud variable convertido en un programa VARPG.

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ..*A*A* El archivo MASTER contiene un campo de longitud variableA*AAN01N02N03T.Name++++++Rlen++TDpBLinPosFunctions+++++++++++++++++++++A*A R RECA FLDVAR 100 VARLEN

*..1....+....2....+....3....+....4....+....5....+....6....+....7....+.. *H*H* Especificar la palabra clave CVTOPT(*VARCHAR) en una especificaciónH* de control o compilar el programa VisualAge RPG conH* CVTOPT(*VARCHAR) en el mandato.H*HKeywords++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++H*H CVTOPT(*VARCHAR)F*F* El nombre de archivo descrito externamente es MASTER.F*FFilename++IPEASFRlen+LKlen+AIDevice+.Keywords++++++++++++++++++++++++++++F*FMASTER UF E DISK

Figura 43. Conversión de un campo de longitud variable en un programa (Pieza 1 de 2)

D*D* FLDVAR es un campo de longitud variable definido en DDS con unaD* longitud DDS de 100. Tenga en cuenta que la longitud de campoD* VARPG es 102.D*DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++D*D DSD FLDVAR 1 102D FLDLEN 5U 0 OVERLAY(FLDVAR:1)D FLDCHR 100 OVERLAY(FLDVAR:3)

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ..*CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq..C*C* Se mueve un valor de caracteres al campo de longitud variable FLDCHR.C* Después de la operación CHECKR, FLDLEN tiene un valor de 5.C READ MASTER LRC MOVEL 'SALES' FLDCHRC ' ' CHECKR FLDCHR FLDLENC NLR UPDAT REC

Figura 43. Conversión de un campo de longitud variable en un programa (Pieza 2 de 2)

136 VisualAge RPG Consulta del lenguaje

Page 159: RPG Referencia

Si son necesarios campos gráficos de longitud variable convertidos, puede codificarun campo de tipo entero sin signo de 2 bytes para guardar la longitud y unsubcampo gráfico de longitud N para guardar la parte de datos del campo.

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ..*D*D* El campo de gráficos de longitud variable VGRAPH se declara enD* DDS como de longitud 3. Esto significa que la longitud máximaD* del campo es de 3 bytes dobles ó de 6 bytes. La longitud total delD* campo, incluida la parte de longitud, es de 8 bytes.D*D* Compilar el programa VARPG con CVTOPT(*VARGRAPHIC).D*DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++D*D DSDVGRAPH 8D VLEN 4U 0 OVERLAY(VGRAPH:1)D VDATA 3G OVERLAY(VGRAPH:3)

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ..*C*C* Se presupone que GRPH es un campo de gráficos de longitud fijaC* con una longitud de 2 bytes dobles. GRPH se copia en VGRAPH yC* la longitud de VGRAPH se define como 2.C*CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq..C*C MOVEL GRPH VDATAC Z-ADD 2 VLEN

Figura 44. Conversión de un campo gráfico de longitud variable

Capítulo 9. Tipos de datos y formatos de datos 137

Page 160: RPG Referencia

138 VisualAge RPG Consulta del lenguaje

Page 161: RPG Referencia

Capítulo 10. Literales y constantes con nombre

Los literales y las constantes con nombre son tipos de constantes. Se puedenespecificar constantes en cualquiera de los lugares siguientes:v En el factor 1v En el factor 2v En un factor 2 ampliado en las especificaciones de cálculov Como parámetros para palabras clave en la especificación de controlv Como parámetros para funciones incorporadasv En los campos Nombre de campo, Constante o Palabra de edición de las

especificaciones de salida.v Como índices de matrizv Con palabras clave en la especificación de definición.

LiteralesUn literal es una constante autodefinida a la que puede hacerse referencia en unprograma. Un literal puede pertenecer a cualquiera de los tipos de datos deVisualAge RPG.

Literales de caracteresSe aplican las normas siguientes cuando se especifica un literal de tipo carácter:v En un literal de caracteres puede utilizarse cualquier combinación de caracteres.

Esto incluye los caracteres DBCS. Los caracteres DBCS han de ser de un númeropar de bytes. Son válidos los blancos intercalados.

v Se permite un literal de tipo carácter sin caracteres entre los apóstrofes.v Los literales de caracteres deben estar encerrados entre apóstrofos (’).v Un apóstrofo necesario como parte de un literal se representa mediante dos

apóstrofos. Por ejemplo, el literal O’CLOCK se codifica como ’O″CLOCK’.v Los literales de caracteres son compatibles únicamente con los datos de

caracteresv Los literales de indicador son literales de tipo carácter de un byte que contienen

un ’1’ (activado) o un ’0’ (desactivado).

Literales hexadecimalesSe aplican las normas siguientes cuando se especifica un literal hexadecimal:v Los literales hexadecimales tienen el formato siguiente:

X'x1x2...xn'

donde:

X’x1x2...xn’ debe contener los caracteres A-F, a-f y 0-9.v El literal codificado entre los apóstrofos debe tener una longitud par.v Cada par de caracteres define un solo byte.v Se permiten los literales hexadecimales donde estén soportados los literales de

caracteres excepto como factor 2 de ENDSR y como palabras de edición.v Un literal hexadecimal tiene el mismo significado que el literal de caracteres

correspondiente excepto cuando se utiliza en las operaciones BITON, BITOFF yTESTB. En las operaciones de bit, el factor 2 puede contener un literalhexadecimal que represente 1 byte. Las normas y significados son los mismostanto para los literales hexadecimales como para los campos de caracteres.

© Copyright IBM Corp. 1994, 2000 139

Page 162: RPG Referencia

v Si el literal hexadecimal contiene el valor hexadecimal de un apóstrofo, no tieneque especificarse dos veces, como en el caso de los literales de caracteres. Porejemplo, el literalA'B

se especifica como'A'B'

pero la versión hexadecimal es X’412742’ y no X’41272742’.v Normalmente, los literales hexadecimales son compatibles únicamente con los

datos de carácter. Sin embargo, puede tratarse un literal hexadecimal quecontiene 16 dígitos hexadecimales o menos como un valor numérico sin signocuando se utiliza en una expresión numérica o cuando se inicializa una variablenumérica con la palabra clave INZ.

Literales numéricosSe aplican las normas siguientes cuando se especifica un literal numérico:v Un literal numérico está compuesto de cualquier combinación de dígitos del 0 a

9. Puede incluirse una coma decimal o un signo.v El signo (+ o −), si está presente, debe ser el carácter situado más a la izquierda.

Un literal sin signo se trata como un número positivo.v No pueden aparecer blancos en un literal numérico.v Los literales numéricos no se encierran entre apóstrofos (’).v Los literales numéricos se utilizan del mismo modo que un campo numérico,

con la excepción de que no puede asignarse valores a los literales numéricos.v El separador decimal puede ser una coma o un punto

Los literales numéricos del formato flotante se especifican de forma algo distinta.Los literales flotantes son de la forma siguiente:

<mantisa>E<exponente>Donde

<mantisa> es un literal como se ha descrito anteriormentede 1 a 16 dígitos

<exponente> es un literal sin coma decimal con un valorentre -308 y +308

v Los literales flotantes no tienen que normalizarse. Es decir, no es necesario quela mantisa se escriba exactamente con un dígito a la izquierda de la comadecimal. (No es necesario especificar la coma decimal).

v Puede utilizarse una e minúscula en lugar de una E mayúscula.v Puede utilizarse un punto (’.’) o una coma (’,’) como coma decimal.v Los literales flotantes están permitidos siempre que se permitan las constantes

numéricas, excepto en las operaciones que no permiten tipos de datos flotantes.Por ejemplo, los literales flotantes no están permitidos allí donde se espera unliteral numérico con cero posiciones decimales, como por ejemplo un índice dematriz.

v Los literales flotantes siguen las mismas reglas de continuación que los literalesnuméricos. Un literal puede dividirse en cualquier punto.

v Un literal flotante debe tener un valor dentro de los límites descritos en 1.6.2,″Reglas de definición″ en la página 4.

A continuación se proporcionan algunos ejemplos de literales flotantes válidos:1E1 = 101.2e-1 = .12-1234.9E0 = -1234.912e12 = 12000000000000+67,89E+0003 = 67890 (con coma decimal)

140 VisualAge RPG Consulta del lenguaje

Page 163: RPG Referencia

A continuación se listan algunos ejemplos de literales flotantes no válidos:1.234E <--- falta el exponente1.2e- <--- falta el exponente-1234.9E+309 <--- exponente demasiado grande12E-2345 <--- exponente demasiado pequeño1.797693134862316e308 <--- valor demasiado grande179.7693134862316E306 <--- valor demasiado grande0.0000000001E-308 <--- valor demasiado pequeño

Literales de fechaLos literales de fecha tienen el formato D’xxxxxx’, donde:v D indica que el literal es de tipo de fechav xxxxxx es una fecha válida en el formato especificado en la especificación de

controlv xxxxxx está encerrado entre apóstrofos (’).

Literales de horaLos literales de hora tienen el formato T’xxxxxx’, donde:v T indica que el literal es de tipo de horav xxxxxx es una hora válida en el formato especificado en la especificación de

controlv xxxxxx está encerrado entre apóstrofos (’).

Literales de indicación de la horaLos literales de indicación de la hora tienen el formato Z’aaaa-mm-dd-hh.mm.ss.mmmmmm’, donde:v Z indica que el literal es de tipo de indicación de la horav aaaa−mm−dd es una fecha válida (año−mes−día)v hh.mm.ss.mmmmmm es una hora válida

(horas.minutos.segundos.microsegundos)v aaaa−mm−dd−hh.mm.ss.mmmmmm está encerrado entre apóstrofosv Los microsegundos son opcionales y si no se especifican toman el valor por

omisión de cero.

Literales de gráficosLos literales de gráficos tienen el formato G’K1K2’, donde:v G indica que el literal es de tipo de gráficosv K1K2 es un número par de bytesv K1K2 está encerrado entre apóstrofos (’).

Literales UCS-2Los literales UCS-2 tienen el formato U’Xxxx...Yyyy’, donde:v U indica que el literal es de tipo UCS-2.v Cada literal UCS-2 requiere cuatro bytes por cada carácter UCS-2 del literal.

Cada cuatro bytes del literal representan un carácter UCS-2 de doble byte.v Los literales UCS-2 son compatibles únicamente con los datos UCS-2.

Se asume que los literales UCS-2 tienen el CCSID UCS-2 por omisión del módulo.

Constantes con nombreUna constante con nombre es un nombre simbólico asignado a un literal. Lasconstantes con nombre se definen en las especificaciones de definición. El valor deuna constante con nombre sigue las normas especificadas para los literales.

Capítulo 10. Literales y constantes con nombre 141

Page 164: RPG Referencia

Constantes con nombrePuede darle un nombre a una constante. Este nombre representa un valorespecífico que no puede cambiarse cuando está ejecutándose el programa.

Reglas para constantes con nombrev Las constantes con nombre se pueden especificar en el factor 1, en el factor 2 y

en el factor 2 ampliado de las especificaciones de cálculo, como parámetros parapalabras clave de la especificación de control, como parámetros para funcionesincorporadas y en los campos Nombre de Campo, Constante o Palabra deEdición en las especificaciones de salida. También pueden utilizarse comoíndices de matrices o con palabras clave en la especificación de definición.

v Las constantes con nombre numéricas no tienen una precisión predefinida. Laprecisión real se define mediante el contexto que se ha especificado.

v La constante con nombre puede definirse en cualquier lugar de lasespecificaciones de definición.

Ejemplo de definición de una constante con nombre

Constantes figurativasLas siguientes constantes figurativas son literales implícitos que puedenespecificarse sin una longitud, porque la longitud implícita y las posicionesdecimales de una constante figurativa son iguales que las del campo asociado.Consulte el apartado “Reglas para constantes figurativas” en la página 144 paraobtener una lista de excepciones.

*ALL’x..’, *ALLG’K1K2’*ALLU’XxxxYyyy’,*ALLX’x1..’

*BLANK/*BLANKS *HIVAL

*LOVAL *NULL *ON/*OFF*ZERO/*ZEROS

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++D.....................................Keywords+++++++++++++++++++++++++++++** Definir un campo de fecha e inicializarlo con el valor 3 de septiembre* de 1988.*

D DateField S D INZ(D'1988-09-03')** Definir un campo binario 9,5 e inicializarlo en 0.*

D BIN9_5 S 9B 5 INZ** Definir una constante con nombre cuyo valor es el alfabeto en* minúsculas*

D Lower C CONST('abcdefghijklmnop-D qrstuvwxyz')** Definir una constante con nombre sin la utilización explícita de* la palabra clave CONST.*

D Upper C 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'

Figura 45. Definición de constantes con nombre

142 VisualAge RPG Consulta del lenguaje

Page 165: RPG Referencia

Pueden especificarse constantes figurativas en el factor 1 y factor 2 de lasespecificaciones de cálculo. A continuación, se muestran las palabras reservadas ylos valores implícitos para las constantes figurativas:

Palabras reservadas Valores implícitos*BLANK/*BLANKS Todo blancos. Solamente es válido para campos de tipo carácter,

gráfico o UCS-2.*ZERO/*ZEROS Campos de caracteres/numéricos: Todo ceros. Para los campos

flotantes numéricos: El valor es ’0 E0’.*HIVAL Campos de tipo carácter, gráfico o UCS-2: El carácter de

clasificación más alto del sistema (FF hexadecimales).

Campos numéricos: Todo nueves con un signo positivo.

Para campos flotantes: *HIVAL para flotante de 4 bytes = 3.402 8235E38 (x’FF7FFFFF’) *HIVAL para flotante de 8 bytes = 1.797 693134 862 315 E308 (x’FFEFFFFFFFFFFFFF’)

Campos de fecha, hora e indicación de la hora: Consulte losapartados “Datos de fecha” en la página 112, “Datos de hora” en lapágina 126 y “Datos de indicación de la hora” en la página 128para conocer los valores *HIVAL para los datos de fecha, hora eindicación de la hora.

*LOVAL Campos de tipo carácter, gráfico o UCS-2: El carácter declasificación más bajo del sistema (ceros hexadecimales).

Campos numéricos: Todo nueves con un signo negativo.

Para campos flotantes: *LOVAL para flotante de 4 bytes = -3.402 8235E38 (x’7F7FFFFF’) *LOVAL para flotante de 8 bytes = -1.797 693134 862 315 E308 (x’7FEFFFFFFFFFFFFF’)

Campos de fecha, hora e indicación de la hora: Consulte losapartados “Datos de fecha” en la página 112, “Datos de hora” en lapágina 126 y “Datos de indicación de la hora” en la página 128para conocer los valores *LOVAL para los datos de fecha, hora eindicación de la hora.

*ALL’x..’ Campos de caracteres/numéricos: La serie de caracteres x . . serepite cíclicamente en una longitud igual a la del campo asociado.Si el campo es numérico, todos los caracteres de la serie deben sernuméricos (0 a 9). No puede especificarse un signo o una comadecimal cuando se utiliza *ALL’x..’ como constante numérica.Nota: No puede utilizar *ALL’x..’ con campos numéricos deformato flotante.

Para campos numéricos enteros o sin signo, el valor nunca esmayor que el valor máximo permitido para el campocorrespondiente.

*ALLG’K1K2’ Campos gráficos: La serie gráfica K1K2 se repite cíclicamente enuna longitud igual a la del campo asociado.

*ALLU’XxxxYyyy’ Campos UCS-2: Una constante figurativa con el formato*ALLU’XxxxYyyy’ indica un literal con el formato’XxxxYyyyXxxxYyyy...’ y con una longitud determinada por lalongitud del campo asociado a la constante *ALLU’XxxxYyyy’.Cada carácter de doble byte de la constante se representa mediantecuatro dígitos hexadecimales. Por ejemplo, *ALLU’0041’ representauna serie de letras ’A’ UCS-2 repetidas.

*ALLX’x1..’ Campos de caracteres: El literal hexadecimal X’x1..’ se repitecíclicamente en una longitud igual a la del campo asociado.

*NULL Un valor nulo válido para punteros de base o punteros deprocedimiento.

Capítulo 10. Literales y constantes con nombre 143

Page 166: RPG Referencia

*ON/*OFF *ON ’1’ *OFF es ’0’. Ambos son válidos sólo para campos decaracteres.

Las constantes figurativas siguientes son literales implícitos que pueden utilizarsecon el código de operación DSPLY:

*ABORT *CANCEL *ENTER *HALT*IGNORE *INFO *NOBUTTON *OK*RETRY *WARN *YESBUTTON

Las constantes figurativas siguientes son literales implícitos que pueden utilizarseal crear la GUI de una aplicación:

*BLACK *BLUE *BROWN *CYAN*DARKBLUE *DARKCYAN *DARKGREEN *DARKGRAY*DARKPINK *DARKRED *GREEN *PALEGRAY*PINK *RED *YELLOW *WHITE

Reglas para constantes figurativasLas reglas siguientes se aplican al utilizar constantes figurativas:v Las constantes figurativas que están permitidas para los campos de tipo carácter

de longitud fija lo están también para los de longitud variable(*BLANK/*BLANKS, *ZERO/*ZEROS, *HIVAL, *LOVAL, *ALL’x..’,*ALLG’K1K2’, *ALLX’x1..’, *ON/*OFF).

v Las constantes figurativas que están permitidas para los campos gráficos delongitud fija lo están también para los de longitud variable (*BLANK/*BLANKS,*HIVAL, *LOVAL, *ALLG’K1K2’).

v Los valores de constante figurativa son los mismos para los campos de tipocarácter y los gráficos, tanto de longitud fija como de longitud variable:*HIVAL = X'FF'*LOVAL = X'00'*BLANK = ' ' o X'20' o blanco de doble byte*ZERO = '0' o X'30'*OFF = '0' o X'30'*ON = '1' o X'31'

v Las operaciones MOVE y MOVEL permiten el desplazamiento de una constantefigurativa de caracteres a un campo numérico. La constante figurativa se amplíaprimero como numérica con zona del tamaño del campo numérico, se conviertea numérica empaquetada o numérica binaria si es necesario y a continuación sealmacena en el campo numérico de destino. La parte de dígitos de cada carácterde la constante debe ser válida.

v Las constantes figurativas se consideran elementos básicos. A excepción deMOVEA, las constantes figurativas actúan como un campo si se utilizan juntocon una matriz. Por ejemplo: MOVE *ALL’XYZ’ ARR.Si ARR tiene elementos de caracteres de 4 bytes, cada elemento contiene ’XYZX’.

v MOVEA se considera un caso especial. La constante se genera con una longitudigual a la de la parte de la matriz especificada. Por ejemplo:– MOVEA *BLANK ARR(X)

A partir del elemento X, el resto de ARR contiene espacios en blanco.– MOVEA *ALL’XYZ’ ARR(X)

ARR tiene elementos de caracteres de 4 bytes. Se pasan por alto los límites deelementos, como ocurre siempre con las operaciones MOVEA de caracteres. Apartir del elemento X, el resto de la matriz contiene ’XYZXYZXYZ...’.

144 VisualAge RPG Consulta del lenguaje

Page 167: RPG Referencia

v Los códigos de operación SETGT y SETLL no admiten la utilización del valor*HIVAL o *LOVAL en el factor 1.

Nota: Los resultados de MOVEA son distintos de los del ejemplo de MOVE:v Una vez se han establecido o restaurado las constantes figurativas con su

longitud adecuada, su orden de clasificación normal se puede alterar si seespecifica un orden de clasificación alternativo.

v Las operaciones de movimiento MOVE y MOVEL producen el mismo resultadocuando mueven las constantes figurativas *ALL’x..’, *ALLG’K1K2’ y *ALLX’x1..’.La serie se repite cíclicamente carácter por carácter (comenzando por laizquierda) hasta que la longitud del campo asociado es la misma que la longitudde la serie.

v Pueden utilizarse constantes figurativas en las operaciones de comparaciónsiempre que uno de los factores no sea una constante figurativa.

v En una operación MOVE, las constantes figurativas y *BLANK/*BLANKS semueven como ceros a un campo numérico.

Capítulo 10. Literales y constantes con nombre 145

Page 168: RPG Referencia

146 VisualAge RPG Consulta del lenguaje

Page 169: RPG Referencia

Capítulo 11. Estructuras de datos

Puede definir un área en el almacenamiento y la distribución de los campos(subcampos) del área. Esta área de almacenamiento se denomina una estructura dedatos. Especifique DS en las posiciones 24 a 25 de una especificación de definiciónpara definir una estructura de datos.

Puede utilizar estructuras de datos para:v Definir la misma área interna varias veces utilizando formatos de datos distintos.v Operar sobre un subcampo individual utilizando el nombre del subcampov Operar sobre todos los subcampos como un grupo utilizando el nombre de la

estructura de datosv Definir una estructura de datos y sus subcampos de la misma forma en que se

define un registrov Definir múltiples apariciones de un conjunto de datosv Agrupar datos no contiguos en ubicaciones de almacenamiento interno

contiguas.

Existen tres estructuras de datos especiales, cada una de ellas con un propósitoespecífico:v Una estructura de datos de área de datos (identificada por una U en la posición

23 de la especificación de definición). Consulte “Posición 23 (Tipo de estructurade datos)” en la página 233.

v Una estructura de datos de información de archivo (identificada por la palabraclave INFDS en las especificaciones de descripción de archivo). Consulte“INFDS(nombreDS)” en la página 222.

v Una estructura de datos de estado de programa (identificada por una S en laposición 23 de la especificación de definición). Consulte “Posición 23 (Tipo deestructura de datos)” en la página 233.

Las estructuras de datos pueden estar descritas por programa o externamente.

Una estructura de datos descrita por programa se identifica por un espacio enblanco en la posición 22 de la especificación de definición. Las definiciones desubcampo para una estructura de datos descrita por programa deben irinmediatamente después de la definición de estructura de datos. Consulte“Posición 22 (Descripción externa)” en la página 232.

Una estructura de datos descrita externamente, identificada por una E en laposición 22 de la especificación de definición, tiene descripciones de subcampocontenidas en un archivo descrito externamente. Cuando se compila el programa,se utiliza el nombre externo para localizar y extraer la descripción externa de lossubcampos de la estructura de datos. Especifique el nombre de la descripciónexterna en las posiciones 7 a 21 o como un parámetro para la palabra claveEXTNAME. Consulte los apartados “Posiciones 7-21 (Nombre)” en la página 231 y“EXTNAME(nombre_archivo{:nombre_formato})” en la página 244.

Nota: El compilador utiliza los formatos de datos especificados para lossubcampos de la descripción externa como los formatos internos de lossubcampos. Esto difiere del modo en que se tratan los archivos descritosexternamente.

© Copyright IBM Corp. 1994, 2000 147

Page 170: RPG Referencia

Puede redenominar un nombre de subcampo externo en el programa utilizando lapalabra clave EXTFLD. La palabra clave PREFIX puede utilizarse para añadir unprefijo a los nombres de subcampo externos que no se han redenominado conEXTFLD. Tenga en cuenta que los subcampos de estructura de datos no estánafectados por la palabra clave PREFIX especificada en una especificación dedescripción de archivo, incluso aunque el archivo tenga el mismo nombre que elparámetro especificado en la palabra clave EXTNAME al definir la estructura dedatos utilizando un nombre de archivo externo. Se pueden añadir subcamposadicionales a una estructura de datos descrita externamente especificandosubcampos descritos por programa inmediatamente después de la lista desubcampos externos. Consulte los apartados “EXTFLD(nombre_campo)” en lapágina 243 y “PREFIX(serie_prefijo{:núm_de_car_sustit})” en la página 260.

Definición de subcampos de estructura de datosPuede definir un subcampo especificando espacios en blanco en la entrada Tipo dedefinición (posiciones 24 a 25) de una especificación de definición. La(s)definición(es) de subcampo debe(n) ir inmediatamente a continuación de laestructura de datos. Las definiciones de subcampo finalizan cuando aparece unaespecificación de definición cuya entrada Tipo de definición no está en blanco ocuando aparece un tipo de especificación distinto.

El nombre del subcampo se entra en las posiciones 7 a 21. Para mejorar la lecturadel fuente, puede sangrar los nombres de subcampo para mostrar gráficamenteque se trata de subcampos.

También puede definir un subcampo como un ítem existente utilizando la palabraclave LIKE. Cuando se define de esta forma, el subcampo recibe la longitud y eltipo de datos del ítem en el que se basa. En Figura 86 en la página 249 hallará unejemplo con la palabra clave LIKE.

Puede recubrir el almacenamiento de un subcampo definido previamente con el deotro subcampo utilizando la palabra clave OVERLAY. La palabra clave se especificaen la definición de subcampo posterior.

Especificación de la longitud de subcampoLa longitud de un subcampo puede especificarse utilizando notación absoluta(posicional) o de longitud.

AbsolutaEspecifique un valor en las entradas correspondientes a la posición Desde(posiciones 26 a 32) y la posición A (posiciones 33 a 39) en la especificaciónde definición.

LongitudEspecifique un valor en la entrada correspondiente a posición A/Longitud(posiciones 33 a 39). La entrada posición Desde está en blanco.

Cuando se utilizan la notación de longitud, el subcampo se sitúa de forma que laposición inicial es mayor que la posición A máxima de todos los subcamposdefinidos anteriormente. Para obtener ejemplos de cada notación, consulte elapartado “Ejemplos de estructura de datos” en la página 150.

Alineación de los subcampos de la estructura de datosLa alineación de subcampos puede ser necesaria. En algunos casos se lleva a caboautomáticamente, en otros, debe hacerse manualmente.

148 VisualAge RPG Consulta del lenguaje

Page 171: RPG Referencia

Por ejemplo, al definir subcampos de tipo puntero base o puntero deprocedimiento utilizando la notación de longitud, el compilador rellenaráautomáticamente, si es necesario, para asegurar que el subcampo estéadecuadamente alineado.

Al definir subcampos flotantes, enteros o sin signo, puede ser deseable laalineación para mejorar el rendimiento del tiempo de ejecución. Si los subcamposse definen utilizando la notación de longitud, puede alinear automáticamente lossubcampos flotantes, enteros o sin signo especificando la palabra clave ALIGN enla definición de estructura de datos. Sin embargo, debe tener en cuenta lasexcepciones siguientes:v La palabra clave ALIGN no está permitida para una estructura de datos de

información o de estado de programa.v Los subcampos definidos utilizando la palabra clave OVERLAY no se alinean

automáticamente, aunque se especifique la palabra clave ALIGN para laestructura de datos. En este caso, debe alinear los subcampos manualmente.

La alineación automática alineará los campos en los límites siguientes.v 2 bytes para subcampos enteros o sin signo de 5 dígitosv 4 bytes para subcampos enteros o sin signo de 10 dígitos o subcampos flotantes

de 4 bytesv 8 bytes para subcampos enteros o sin signo de 20 dígitosv 8 bytes para subcampos flotantes de 8 bytesv 16 bytes para campos de puntero

Si va a alinear los campos manualmente, asegúrese de que están alienados en losmismos límites. Una posición inicial está en un límite de n bytes si ((posición -1) mod n) = 0. (El valor de ″x mod y″ es el resto después de dividir x por y enaritmética de enteros. Es lo mismo que el valor MVR después de X DIV Y.)

La Figura 46 muestra una secuencia de bytes e identifica los diferentes límitesutilizados para la alineación.

Tenga en cuenta lo siguiente acerca de la secuencia de bytes anterior:v La posición 1 está en un límite de 16 bytes, ya que ((1-1) mod 16) = 0.v La posición 13 está en un límite de 4 bytes, ya que ((13-1) mod 4) = 0.v La posición 7 no está en un límite de 4 bytes, ya que ((7-1) mod 4) = 2.

Estructura de datos de área de datosUna estructura de datos de área de datos se especifica por una U en la posición 23de la especificación de definición. Esto indica que la misma área de datos que selee y bloquea en la inicialización del programa debe grabarse y desbloquearse alfinal del programa. Las estructuras de datos de área de datos, como otrasestructuras de datos, son del tipo de caracteres. Un área de datos que se incluya enuna estructura de datos de área de datos también deberá ser de tipo carácter. Elárea de datos y la estructura de datos de área de datos deben tener el mismonombre a menos que cambie el nombre del área de datos en el programa

1 2 3 4 5 6 7 8 9 10 11 12 13 15 16 17 18

Figura 46. Límites para la alineación de datos

Capítulo 11. Estructuras de datos 149

Page 172: RPG Referencia

utilizando el código de operación *DTAARA DEFINE o la palabra clave DTAARA.Consulte “DEFINE (Definición de campo)” en la página 428 y“DTAARA{(nombre_área_datos)}” en la página 242.

Puede especificar las operaciones de área de datos (IN, OUT y UNLOCK) para unárea de datos que se lea y se grabe implícitamente. Antes de utilizar una estructurade datos de área de datos con estas operaciones, debe especificar dicha área dedatos en el campo del resultado de la operación *DTAARA DEFINE o con lapalabra clave DTAARA. Consulte “DEFINE (Definición de campo)” en lapágina 428 y “DTAARA{(nombre_área_datos)}” en la página 242.

Nota: Una estructura de datos de área de datos no puede especificarse en elcampo del resultado de una operación PARM en la *ENTRY PLIST.

Estructura de datos de información de archivoPuede especificar una estructura de datos de información de archivo para cadaarchivo del programa. Las estructuras de datos de información de archivo sedefinen con la palabra clave INFDS en las especificaciones de descripción dearchivo. Consulte “INFDS(nombreDS)” en la página 222. Esto lo proporciona lainformación de estado de la excepción o error de archivo que ha tenido lugar. Elnombre de la estructura de datos de información de archivo debe ser exclusivopara cada archivo. Una estructura de datos de información de archivo contienesubcampos que proporcionan información acerca de la excepción o error dearchivo que se ha producido. Si desea obtener más información sobre lasestructuras de datos de información de archivo y sus subcampos, consulte“Estructura de datos de información de archivo” en la página 37.

Estructura de datos de estado de programaUna estructura de datos de estado de programa proporciona información sobre lasexcepciones y errores del programa. Se identifica por una S en la posición 23 de laespecificación de definición. Para obtener más información acerca de las estructurasde datos de estado de programa y de sus subcampos, consulte “Estructura dedatos de estado de programa” en la página 48.

Ejemplos de estructura de datosLos ejemplos siguientes muestran la forma de definir y utilizar las estructuras dedatos.v Utilización de una estructura de datos para subdividir un campov Utilización de una estructura de datos para agrupar camposv Estructura de datos con notación absoluta y de longitudv Redenominar e inicializar una estructura de datos descrita externamentev Utilización de PREFIX para redenominar todos los campos en una estructura de

datos externav Definición de una estructura de datos de varias aparicionesv Utilización de estructuras de datos de áreas de datos

150 VisualAge RPG Consulta del lenguaje

Page 173: RPG Referencia

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++D.....................................Keywords+++++++++++++++++++++++++++++** Utilice la notación de longitud para definir los subcampos de estructura* de datos. Puede referirse a toda la estructura con Partno, o con los* subcampos individuales Manufactr, Drug, Strength o Count.*

D Partno DSD Manufactr 4D Drug 6D Strength 3D Count 3 0D*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8IFilename++Sq..RiPos1+NCCPos2+NCCPos3+NCC..................................I........................Fmt+SPFrom+To+++DcField+++++++++....FrPlMnZr......** Los registros del archivo FILEIN descrito por programa contienen un campo,* Partno, que necesita subdividirse para procesarse en este programa.* Para conseguirlo, el campo Partno se describe como una estructura de* datos que utiliza la especificación de definición anterior.*

IFILEIN NS 01 1 CA 2 CBI 3 18 PartnoI 19 29 NameI 30 40 Patno

Figura 47. Utilización de una estructura de datos para subdividir un campo

Capítulo 11. Estructuras de datos 151

Page 174: RPG Referencia

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++D.....................................Keywords+++++++++++++++++++++++++++++** Cuando utiliza una estructura de datos para agrupar campos, puede* hacerse que campos de ubicaciones no adyacentes del registro de entrada* ocupen ubicaciones adyacentes internas. Puede hacerse referencia al* área por el nombre de la estructura de datos o el nombre del subcampo* individual.*

D Partkey DSD Location 4D Partno 8D Type 4D*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8IFilename++Sq..RiPos1+NCCPos2+NCCPos3+NCC..................................I........................Fmt+SPFrom+To+++DcField+++++++++....FrPlMnZr......** Los campos del archivo TRANSACTN descrito por programa deben compararse* con el campo recuperado de un archivo Item_Master*

ITRANSACTN NS 01 1 C1 2 C2I 3 10 PartnoI 11 16 0QuantityI 17 20 TypeI 21 21 CodeI 22 25 LocationI*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....** Utilice el nombre de estructura de datos Partkey para comparar* con el campo Item_Nbr*

C :C Partkey IFEQ Item_Nbr 99C :C*

Figura 48. Utilización de una estructura de datos para agrupar campos

152 VisualAge RPG Consulta del lenguaje

Page 175: RPG Referencia

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++D.....................................Keywords+++++++++++++++++++++++++++++** Definir una estructura de datos descrita por programa llamada FRED* La estructura de datos se compone de 5 campos:* 1. Una matriz con longitud de elemento 10 y dimensión 70(Field1)* 2. Un campo de longitud 30 (Field2)* 3/4. Dividir Field2 en 2 campos de igual longitud (Field3 y Field4)* 5. Definir un campo binario sobre el tercer campo* Se debe tener en cuenta el sangrado para mejorar la lectura*** Notación absoluta:** El compilador determinará la longitud del elemento de matriz (Field1)* dividiendo la longitud total (700) por la dimensión (70)*

D FRED DSD Field1 1 700 DIM(70)D Field2 701 730D Field3 701 715D Field5 701 704B 2D Field4 716 730** Notación de longitud:** La palabra clave OVERLAY se utiliza para subdividir Field2*

D FRED DSD Field1 10 DIM(70)D Field2 30D Field3 15 OVERLAY(Field2)D Field5 4B 2 OVERLAY(Field3)D Field4 15 OVERLAY(Field2:16)

Figura 49. Estructura de datos con notación absoluta y de longitud

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++D.....................................Keywords+++++++++++++++++++++++++++++** Definir una estructura de datos descrita externamente con nombre* interno FRED y nombre externo EXTDS y redenominar el campo CUST por* CUSTNAME. Inicializar CUSTNAME con 'GEORGE' y PRICE con 1234.89.* Asignar al subcampo ITMARR (definido en la descripción externa como* campo de caracteres de 100 bytes) la palabra clave DIM*

D Fred E DS EXTNAME(EXTDS)D CUSTNAME E EXTFLD(CUST) INZ('GEORGE')D PRICE E INZ(1234.89)D ITMARR E DIM(10)

Figura 50. Redenominar e inicializar una estructura de datos descrita externamente

Capítulo 11. Estructuras de datos 153

Page 176: RPG Referencia

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++D.....................................Keywords+++++++++++++++++++++++++++++DD extds1 E DS EXTNAME (CUSTDATA)D PREFIX (CU_)D Name E INZ ('Joe's Garage')D Custnum E EXTFLD (NUMBER)D** La estructura de datos anterior se amplia de la forma siguiente:* -- Todos los campos descritos externamente se incluyen en la* estructura de datos* -- Los subcampos redenominados mantienen los nombres nuevos* -- Los subcampos no redenominados obtienen un prefijo* con la cadena de caracteres de prefijo** Estructura de datos ampliada:*

D EXTDS1 E DSD CU_NAME E 20A EXTFLD (NAME)D INZ ('Joe's Garage')D CU_ADDR E 50A EXTFLD (ADDR)D CUSTNUM E 9S0 EXTFLD (NUMBER)D CU_SALESMN E 7P0 EXTFLD (SALESMN)

Figura 51. Utilización de PREFIX para redenominar todos los campos en una estructura dedatos externa

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++D.....................................Keywords+++++++++++++++++++++++++++++** Definir estructura de datos de varias apariciones de 20 elementos con:* -- 3 campos de 20 caracteres* -- Un cuarto campo de 10 caracteres que solapa al segundo* y empieza en la segunda posición.** La constante con nombre 'twenty' se utiliza para definir el número* de aparición** Notación absoluta (utilización de posiciones inicial/final)*

D twenty C CONST(20)DDDataStruct DS OCCURS (twenty)D field1 1 20D field2 21 40D field21 22 31D field3 41 60** Mezcla de notación absoluta y de longitud*

D DataStruct DS OCCURS(twenty)D field1 20D field2 20D field21 22 31D field3 41 60

Figura 52. Definición de una estructura de datos de varias apariciones

154 VisualAge RPG Consulta del lenguaje

Page 177: RPG Referencia

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++D.....................................Keywords+++++++++++++++++++++++++++++** Este programa utiliza una estructura de datos de área de datos para* acumular una serie de totales.*

D Totals UDSD Import_tot 8 2D Tot_gross 10 2D Tot_netto 10 2*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8CSRN01Factor1+++++++Opcode(E)+Factor2++++++++++++++++++++++++++++++++++++++*

C :C EVAL Tot_amount = Tot_amount + amountC EVAL Tot_gross = Tot_gross + grossC EVAL Tot_netto = Tot_netto + netto

Figura 53. Utilización de estructuras de datos de áreas de datos

Capítulo 11. Estructuras de datos 155

Page 178: RPG Referencia

156 VisualAge RPG Consulta del lenguaje

Page 179: RPG Referencia

Capítulo 12. Utilización de matrices y tablas

Las matrices y tablas son una colección de campos de datos (elementos) de igual:v Longitud de campov Tipo de datos

– Carácter– Numérico– Fecha– Hora– Indicación de la hora– Gráfico– Puntero de base– Puntero de procedimiento– UCS-2

v Formatov Número de posiciones decimales (si es numérico)

Las matrices y tablas se diferencian en lo siguiente:v Puede hacer referencia a un elemento de una matriz específica por su posiciónv No puede hacer referencia a elementos específicos de la tabla por su posiciónv Un nombre de matriz hace referencia a todos los elementos de la matrizv Un nombre de tabla hace siempre referencia al elemento encontrado en la última

operación LOOKUP (Buscar un elemento de tabla o matriz). .

Nota: Sólo puede definir matrices de tiempo de ejecución en un subprocedimiento.Las tablas, las matrices de tiempo de preejecución y las matrices de tiempode compilación no están soportadas.

En los apartados siguientes se describe la forma de utilizar las matrices:v “Matrices”v “Inicialización de matrices” en la página 164v “Definición de matrices relacionadas” en la página 164v “Búsqueda de matrices” en la página 166v “Utilización de matrices” en la página 168v “Salida de matriz” en la página 170

En el apartado “Tablas” en la página 171 se describe la misma información para lastablas.

En el apartado “Matrices” se describe cómo codificar una matriz, cómo especificarlos valores iniciales de los elementos de matriz, cómo cambiar los valores de unamatriz y las consideraciones especiales para utilizar una matriz.

MatricesExisten tres tipos de matrices:v La matriz de tiempo de ejecución se carga mientras se ejecuta el programa.v La matriz de tiempo de compilación se carga cuando se crea el programa. Los

datos iniciales se convierten en una parte permanente del programa.v La matriz de tiempo de preejecución se carga de un archivo de matriz cuando el

programa inicia la ejecución, antes de procesar operaciones de entrada, cálculo osalida.

© Copyright IBM Corp. 1994, 2000 157

Page 180: RPG Referencia

Los puntos esenciales de la definición y carga de una matriz se describen para lasmatrices de tiempo de ejecución. Para definir y cargar matrices de tiempo decompilación y de tiempo de preejecución, utilice estos puntos esenciales y algunasespecificaciones adicionales.

Nombre e índice de una matrizSe hace referencia a toda una matriz utilizando sólo el nombre de la matriz. Sehace referencia a los elementos individuales de una matriz utilizando el nombre dela matriz, seguido de un paréntesis de apertura, un índice y un paréntesis decierre. Por ejemplo:AR(IND)

El índice indica la posición del elemento en la matriz (comenzando a partir de 1) ysi es un número o un campo que contiene un número.

Se aplican las normas siguientes cuando se especifica un nombre de matriz y uníndice:v El nombre de matriz debe ser un nombre simbólico exclusivov El índice debe ser un campo numérico o constante mayor que cero y con cero

posiciones decimalesv Si se especifica la matriz en una expresión del campo del factor 2 ampliado, el

índice puede ser una expresión que devuelva un valor numérico con ceroposiciones decimales

v En tiempo de ejecución, si el programa hace referencia a una matriz que utilizaun índice con un valor que sea cero, negativo o mayor que el número deelementos de la matriz, la rutina de error/excepción toma el control delprograma.

Especificaciones esenciales de una matrizPara definir una matriz en una especificación de definición:v Especifique el nombre de la matriz en las posiciones 7 a 21v Especifique el número de entradas de la matriz utilizando la palabra clave DIMv Especifique la longitud, formato de datos y posiciones decimales como lo haría

para campos escalares. Puede especificar entradas de posición Desde y Aexplícitas (si está definiendo un subcampo) o una entrada de longitud explícita,definir los atributos de matriz utilizando la palabra clave LIKE o bien especificarlos atributos en otro lugar del programa.

v Si necesita especificar una secuencia de ordenación, utilice las palabras claveASCEND o DESCEND.

La Figura 54 en la página 159 muestra un ejemplo de las especificaciones de matrizesenciales.

Codificación de una matriz de tiempo de ejecuciónSi no especifica nada más aparte de las especificaciones esenciales de la matriz,habrá definido una matriz de tiempo de ejecución. Tenga en cuenta que laspalabras clave ALT, CTDATA, EXTFMT, FROMFILE, PERRCD y TOFILE no sepueden utilizar para una matriz de tiempo de ejecución.

158 VisualAge RPG Consulta del lenguaje

Page 181: RPG Referencia

Carga de una matriz de tiempo de ejecuciónPuede asignar valores iniciales para una matriz de tiempo de ejecución utilizandola palabra clave INZ en la especificación de definición. También puede asignarvalores iniciales para una matriz de tiempo de ejecución a través de lasespecificaciones de entrada o de cálculo. Este segundo método también puedeutilizarse para poner datos en otros tipos de matrices.

Por ejemplo, puede utilizar las especificaciones de cálculo en la operación MOVEpara poner 0 en cada elemento de una matriz (o en elementos seleccionados).

Utilizando las especificaciones de entrada, puede rellenar una matriz con los datosde un archivo. En los apartados siguientes se proporcionan más detalles sobre larecuperación de estos datos desde los registros de un archivo.

Nota: Los datos de fecha y hora de tiempo de ejecución deben estar en el mismoformato y utilizar los mismos separadores que la matriz de fecha y hora quese está cargando.

Carga de una matriz de tiempo de ejecución desde un registrofuenteSi la información de la matriz está contenida en un registro, la información puedeocupar posiciones consecutivas en el registro o puede estar distribuida por elregistro.

Si los elementos de matriz son consecutivos en el registro de entrada, puedecargarse la matriz con una sola especificación de entrada. La Figura 55 muestra lasespecificaciones para cargar una matriz de seis elementos (12 caracteres cada uno)desde un solo registro.

Si los elementos de la matriz están distribuidos por todo el registro, se puedendefinir y cargar uno por uno, con un elemento descrito en una línea deespecificación.

La Figura 56 en la página 160 muestra las especificaciones para cargar una matrizde seis elementos (12 caracteres cada uno) desde un solo registro. Un blanco separacada uno de los elementos de los demás.

*...1....+....2....+....3....+....4....+....5....+....6....+....7...DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++DARC S 3A DIM(12)

Figura 54. Especificaciones esenciales para definir una matriz de tiempo de ejecución

*...1....+....2....+....3....+....4....+....5....+....6....+....7...DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++DINPARR S 12A DIM(6)IFilename++Sq..RiPos1+NCCPos2+NCCPos3+NCC................................I........................Fmt+SPFrom+To+++DcField+++++++++....FrPlMnZr....IARRFILE AA 01I 1 72 INPARR

Figura 55. Utilización de una matriz de tiempo de ejecución con elementos consecutivos

Capítulo 12. Utilización de matrices y tablas 159

Page 182: RPG Referencia

Carga de una matriz de tiempo de ejecución utilizando variosregistros fuenteSi la información de la matriz se encuentra en más de un registro, puede utilizarmétodos diferentes para cargar la matriz. El método a utilizar depende del tamañode la matriz y de si los elementos son o no consecutivos en los registros deentrada. Los registros se procesan uno por uno. Por lo tanto, no se procesa toda lamatriz hasta que se lean todos los registros que contienen la información de lamatriz y se mueva la información a los campos de la matriz. Puede que resultenecesario suprimir las operaciones de cálculo y salida hasta que se lea toda lamatriz en el programa.

Ordenación de matrices de tiempo de ejecuciónNo se comprueba la secuencia de las matrices de tiempo de ejecución. Si procesauna operación SORTA (clasificación de una matriz), la matriz se clasifica en lasecuencia indicada en la especificación de definición (palabras clave ASCEND oDESCEND) que define la matriz. Si no se especifica la secuencia, la matriz seclasifica por orden ascendente. Cuando en la operación LOOKUP se utilizan losindicadores de mayor (posiciones 71 y 72 de las especificaciones de cálculo) omenor (posiciones 73 y 74 de las especificaciones de cálculo), debe especificarse lasecuencia de la matriz.

Codificación de una matriz de tiempo de compilaciónSe especifica una matriz de tiempo de compilación utilizando las especificacionesesenciales y la palabra clave CTDATA. Puede especificar el número de entradas dela matriz en un registro de entrada utilizando la palabra clave PERRCD en laespecificación de definición. Si no especifica la palabra clave PERRCD, el númerode entradas toma el valor por omisión 1. Consulte las especificaciones del apartadoFigura 57 en la página 161 para obtener un ejemplo.

Puede especificar el formato de datos externo utilizando la palabra claveEXTFMT(código). Consulte el apartado “EXTFMT(código)” en la página 243 paraobtener más información.

Nota: La palabra clave EXTFMT no puede utilizarse si los datos de matriz residenen la estación de trabajo. La palabra clave EXTFMT no está permitida paralas matrices de tiempo de compilación de flotantes.

Puede utilizarse la palabra clave TOFILE para especificar un archivo en el que seha grabar la matriz cuando finalice el programa con el indicador LR activado.

*...1....+....2....+....3....+....4....+....5....+....6....+....7...DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++DARRX S 12A DIM(6)IFilename++Sq..RiPos1+NCCPos2+NCCPos3+NCC................................I........................Fmt+SPFrom+To+++DcField+++++++++....FrPlMnZr....IARRFILE AA 01I 1 12 ARRX(1)I 14 25 ARRX(2)I 27 38 ARRX(3)I 40 51 ARRX(4)I 53 64 ARRX(5)I 66 77 ARRX(6)

Figura 56. Definición de una matriz de tiempo de ejecución con elementos distribuidos

160 VisualAge RPG Consulta del lenguaje

Page 183: RPG Referencia

Carga de una matriz de tiempo de compilaciónPara una matriz de tiempo de compilación, entre los datos fuente de la matriz enlos registros del miembro fuente del programa. Si utiliza la palabra clave**CTDATA, pueden entrarse los datos de la matriz en cualquier lugar acontinuación de los registros fuente. Si no utiliza esta palabra clave, los datos de lamatriz deben seguir al registro fuente en el orden en el que se han definido lasmatrices y tablas de tiempo de compilación en las especificaciones de salida. Estosdatos se cargan en la matriz cuando se compila el programa. Hasta que elprograma se vuelva a compilar con nuevos datos, la matriz tendrá siempreinicialmente los mismos valores cada vez que llame al programa, a menos que lallamada anterior haya finalizado con LR desactivado.

Las matrices de tiempo de compilación pueden describirse por separado o enformato alternativo (con la palabra clave ALT). El formato alternativo significa quelos elementos de una matriz se mezclan en el registro de entrada con los elementosde otra matriz.

Reglas para los registros fuente de matrizLas reglas para los registros fuente de matriz son:v La primera entrada de matriz de cada registro debe comenzar por la posición 1.v Todos los elementos deben tener la misma longitud y no debe haber espacios

entre ellos.v No es necesario rellenar con entradas todo un registro. Si no lo está, pueden

incluirse blancos o comentarios después de las entradas. Consulte la Figura 57.v Si el número de elementos de matriz indicado en la especificación de definición

es mayor que el número de entradas proporcionado, los elementos restantes serellenan con los valores por omisión correspondientes al tipo de datosespecificado.

v Cada registro, excepto el último, debe contener el número de entradasespecificado con la palabra clave PERRCD en las especificaciones de definición.En el último registro, las entradas no utilizadas deben estar en blanco y puedenincluirse comentarios después de ellas.

v Cada entrada debe estar totalmente contenida en un registro. Una entrada no sepuede dividir entre dos registros. La longitud de una sola entrada está limitadapor la longitud máxima de 100 caracteres (tamaño del registro fuente). Si seutilizan matrices y se describen en un formato alternativo, los elementoscorrespondientes deben estar en el mismo registro. Juntos no pueden sobrepasarlos 100 caracteres.

v Los datos de las matrices de tiempo de compilación de fecha y hora deben estaren el mismo formato y utilizar los mismos separadores que la matriz de fecha yhora que se está cargando.

DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords++++++++++++++++++++DARC S 3A DIM(12) PERRCD(5) CTDATA

**CTDATA ARC48K16343J64044HAquí pueden colocarse los comentarios12648A47349K346Aquí pueden colocarse los comentarios50B125 Aquí pueden colocarse los comentarios

48K 163 43J 640

Esta es la matriz de tiempo de compilación, ARC.

44H 126 48A 473 49K 346 50B 125

Figura 57. Registro fuente de matriz con comentarios

Capítulo 12. Utilización de matrices y tablas 161

Page 184: RPG Referencia

v Los datos de la matriz se pueden especificar de una de estas dos formas:– **CTDATA nombrematriz: Los datos para la matriz pueden especificarse en

cualquier lugar de la sección de datos de tiempo de compilación.– **b: (b=blanco) Los datos para las matrices deben especificarse en el mismo

orden que el empleado en las especificaciones de definición.

Sólo puede utilizarse una de estas técnicas en un programa.v Las matrices pueden estar en secuencia ascendente (palabra clave ASCEND),

descendente (palabra clave DESCEND) o sin secuencia (no se especifica unapalabra clave).

v Las matrices de tipo gráfico y UCS-2 se clasifican según los valoreshexadecimales.

v Si se especifica L o R en la palabra clave EXTFMT de la especificación dedefinición, cada elemento debe incluir el signo (+ o −). Por ejemplo, una matrizcon un tamaño de elemento 2 con L especificado necesitará 3 posiciones en losdatos fuente (+37−38+52−63).

v Los datos flotantes de tiempo de compilación se especifican en los registrosfuente como literales flotantes o numéricos. Las matrices definidas comoflotantes de 4 bytes necesitan 14 posiciones para cada elemento; las matricesdefinidas como flotantes de 8 bytes necesitan 23 posiciones para cada elemento.

Codificación de una matriz de tiempo de preejecuciónEn las especificaciones de definición, además de las especificaciones de matrizesenciales, puede especificar el nombre del archivo con los datos de entrada de lamatriz, utilizando la palabra clave FROMFILE. Puede utilizar la palabra claveTOFILE para especificar el nombre de un archivo en el que se grabará la matriz alfinalizar el programa. Si el archivo es un archivo combinado (especificadomediante una C en la posición 17 de las especificaciones de descripción dearchivo), el parámetro de las palabras clave FROMFILE y TOFILE debe ser elmismo. Puede utilizar la palabra clave PERRCD para especificar el número deelementos por registro de entrada.

En la palabra clave EXTFMT, especifique:v B si los datos están en formato binariov L para indicar que hay un signo a la izquierda de un elemento de datosv P si los datos de la matriz están en formato decimal empaquetadov R para indicar que hay un signo a la derecha de un elemento de datosv S si los datos de la matriz están en formato decimal con zona

Especifique una T en la posición 18 de las especificaciones de descripción dearchivo del archivo que contiene los datos de entrada de la matriz

Para comparar la codificación de dos matrices de tiempo de preejecución, unamatriz de compilación y una matriz de tiempo de ejecución, consulte la Figura 58en la página 163.

Puede utilizarse la palabra clave ALT para especificar matrices con formatoalternativo. (Consulte la Figura 58 en la página 163.)

Nota: No se puede especificar el formato entero o sin signo para matricesdefinidas con más de diez dígitos.

162 VisualAge RPG Consulta del lenguaje

Page 185: RPG Referencia

Carga de una matriz de preejecuciónPara una matriz de preejecución, entre los datos de entrada de matriz en unarchivo secuencial descrito por programa. Cuando llame a un programa, pero antesde que se procesen las operaciones de entrada, cálculo o salida, se carga la matrizcon los valores iniciales del archivo. Al modificar este archivo, puede alterar losvalores iniciales de la matriz en la llamada siguiente al programa, sin compilar elprograma de nuevo. El archivo se lee en secuencia de llegada. Las reglas para losdatos de matriz de tiempo de ejecución son las mismas que para los datos dematriz de tiempo de compilación, excepto que no hay restricciones sobre lalongitud de cada registro. Consulte el apartado “Reglas para los registros fuente dematriz” en la página 161.

Comprobación de secuencia para las matrices de caracteresCuando se lleva a cabo la comprobación de secuencia para las matrices decaracteres, VisualAge RPG utiliza el orden de clasificación ASCII por omisión.

*....+....1....+....2....+....3....+....4....+....5....+....6....+....*HKeywords+++++++++++++++++++++++++++++++++++++++++++++++++++++++++H DATFMT(*USA) TIMFMT(*HMS)DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords++++++++++++++++++++D* Matriz tiempo ejec.. ARI con 10 elementos de tipo fecha. TienenD* el formato de mes, día, año utilizando una barra inclinada comoD* separador tal y como se ha definido en la especificación deD* control.DARI S D DIM(10) INZ(D'09/15/1994')D* Matrices de tiempo de compilación en formato alternativo.D* Ambas matrices tienen ocho elementos (tres elementosD* por registro). ARC es una matriz de caracteres con unaD* longitud de 15 y ARD es una matriz de hora con unaD* longitud predefinida de 8.DARC S 15 DIM(8) PERRCD(3)D CTDATADARD S T DIM(8) ALT(ARC)D*D* Matriz de tiempo de preejecución. ARE, que debe leerse delD* archivo DISKIN, tiene 250 elementos de caracteresD* (12 elementos por registro). Cada elemento tiene unaD* longitud de cinco posiciones. El tamaño de cada registro esD* 60 (5*12). Los elementos se organizan en secuencia ascendente.DARE S 5A DIM(250) PERRCD(12) ASCENDD FROMFILE(DISKIN)D*D*D* Matriz de tiempo de preejecución especificada como un archivoD* combinado. ARH se graba de nuevo en el mismo archivo delD* que se lee cuando el programa finaliza normalmente con LRD* activado. ARH tiene 250 elementos de caracteres (12 elementosD* por registro). Cada elemento tiene una longitud de cincoD* posiciones. Los elementos se organizan en secuencia ascendente.DARH S 5A DIM(250) PERRCD(12) ASCENDD FROMFILE(DISKOUT)D TOFILE(DISKOUT)

**CTDATA ARCToronto 12:15:00Winnipeg 13:23:00Calgary 15:44:00Sydney 17:24:30Edmonton 21:33:00Saskatoon 08:40:00Regina 12:33:00Vancouver 13:20:00

Figura 58. Especificaciones de definición para diferentes tipos de matrices

Capítulo 12. Utilización de matrices y tablas 163

Page 186: RPG Referencia

Inicialización de matricesPara inicializar cada elemento de una matriz de tiempo de ejecución con el mismovalor, especifique la palabra clave INZ en la especificación de definición. Si lamatriz está definida como un subcampo de estructura de datos, se aplican lasnormas generales de solapamiento de la inicialización de estructura de datos (lainicialización se lleva a cabo en el orden en que se declaran los campos en laestructura de datos).

Matrices de tiempo de compilación y de tiempo depreejecución

La palabra clave INZ no puede especificarse para una matriz de tiempo decompilación o de tiempo de preejecución porque los valores iniciales se asignan através de otros medios (datos de tiempo de compilación o datos de un archivo deentrada). Si una matriz de tiempo de compilación o de tiempo de precompilaciónaparece en una estructura de datos globalmente inicializada, no se incluye en lainicialización global.

Nota: Las matrices de tiempo de compilación se inicializan por el orden en el quese declaran los datos después del programa y las matrices de tiempo depreejecución se inicializan por el orden de declaración de los archivos deinicialización, independientemente del orden por el que se declaran estasmatrices en la estructura de datos. Las matrices de tiempo de preejecuciónse inicializan después de las matrices de tiempo de compilación.

Si una inicialización de subcampo solapa una matriz de tiempo de compilación ode preejecución, la matriz se inicializa después del subcampo, independientementedel orden por el que se declaran los campos en la estructura de datos.

Definición de matrices relacionadasPuede cambiar dos matrices de tiempo de compilación o dos matrices depreejecución en formato alternativo utilizando la palabra clave ALT en la definiciónde la matriz alternativa. El nombre de la matriz primaria se especifica comoparámetro de la palabra clave ALT. Los registros para almacenar los datos dedichas matrices tienen el primer elemento de la primera matriz seguido por elprimer elemento de la segunda matriz, el segundo elemento de la primera matrizseguido por el segundo elemento de la segunda matriz, el tercer elemento de laprimera matriz seguida por el tercer elemento de la segunda matriz y asísucesivamente. Los elementos correspondientes deben aparecer en el mismoregistro. La palabra clave PERRCD de la definición de matriz principal especifica elnúmero de pares correspondientes por registro; cada par de elementos cuentacomo una sola entrada. Puede especificar EXTFMT en la matriz principal y en lamatriz alterna.

La Figura 59 en la página 165 muestra dos matrices con formato alternativo.

164 VisualAge RPG Consulta del lenguaje

Page 187: RPG Referencia

Los registros para ARRA y ARRB se parecen a los registros de la Figura 60 cuandose describen como dos archivos de matriz independientes.

Este registro contiene entradas ARRA en las posiciones 1 a 60.

Este registro contiene entradas ARRB en las posiciones 1 a 50.

Los registros para ARRA y ARRB son similares a los registros de la Figura 62cuando se describen como un archivo de matriz con formato alternativo. El primerregistro contiene las entradas de ARRA y ARRB con formato alternativo en lasposiciones 1 a 55. El segundo registro contiene las entradas de ARRA y ARRB conformato alternativo en las posiciones 1 a 55.

345126 373

A R R A(Número de pieza)

A R R B(Coste unitario)

39K143 1297

38A437 498

40B125 93

41C023 3998

42D893 87

43K823 349

Las matrices ARRA y ARRB se pueden describircomo dos archivos de matrices independientes ocomo un archivo de matrices en un formatoalternativo.

44H111 697

45P673 898

46C732 47587

Figura 59. Matrices en formato alternativo y no alternativo

EntradadeARRA

EntradadeARRA

EntradadeARRA

EntradadeARRA

EntradadeARRA

EntradadeARRA

EntradadeARRA

EntradadeARRA

EntradadeARRA

EntradadeARRA

1 . . . . . 13 . . . . 37 . . . .25 . . . . 49 . . . .19 . . . . 43 . . . .31 . . . . 55 . . . .7 . . . . .

Figura 60. Registros de matrices para dos archivos de matriz distintos

EntradadeARRB

EntradadeARRB

EntradadeARRB

EntradadeARRB

EntradadeARRB

EntradadeARRB

EntradadeARRB

EntradadeARRB

EntradadeARRB

EntradadeARRB

1 . . . . . 11 . . . . 21 . . . . 41 . . . .16 . . . . 36 . . . .26 . . . . 31 . . . . 46 . . . .6 . . . . .

Figura 61. Registros de matrices para un archivo de matriz

EntradadeARRA

EntradadeARRA

EntradadeARRA

EntradadeARRA

EntradadeARRA

EntradadeARRB

EntradadeARRB

EntradadeARRB

EntradadeARRB

EntradadeARRB

1 . . . . . 13 . . . . 25 . . . .16 . . . .11 . . . . 19 . . . . 21 . . . .1 . . . . . 7 . . . . . 6 . . . . .

Figura 62. Registros de matriz para un archivo de matriz en formato alternativo

Capítulo 12. Utilización de matrices y tablas 165

Page 188: RPG Referencia

Búsqueda de matricesLa operación LOOKUP puede utilizarse para efectuar búsquedas en matrices.Consulte el apartado “LOOKUP (Buscar un elemento en tabla o matriz)” en lapágina 466 para obtener una descripción de la operación LOOKUP.

Búsqueda en una matriz sin un índiceCuando se busca una matriz sin un índice, utilice el estado (activado odesactivado) de los indicadores resultantes para determinar si un elementodeterminado se encuentra en la matriz. La búsqueda de una matriz sin un índicepuede utilizarse en la comprobación de validez de los datos de entrada paradeterminar si un campo está en una lista de elementos de matriz. Generalmente seutiliza una operación LOOKUP igual.

En el factor 1 de las especificaciones de cálculo, especifique el argumento debúsqueda (los datos para los que desea encontrar una coincidencia en los nombresde matriz) y coloque el factor 2 del nombre de la matriz.

En el factor 2 especifique el nombre de la matriz en la que se ha de buscar. Comomínimo debe especificarse un indicador resultante. No deben realizarse entradas enmayor y menor para la misma operación LOOKUP. Los indicadores de resultadono deben especificarse en mayor o menor si la matriz no está en secuencia(palabras clave ASCEND o DESCEND). También puede utilizarse el nivel decontrol y los indicadores de condición (especificado en las posiciones 7 a 11). Elcampo de resultado no puede utilizarse.

La búsqueda comienza al principio de la matriz y finaliza al final de la matriz ocuando se satisfacen las condiciones de la búsqueda. Siempre que se encuentra unelemento de matriz que satisface el tipo de la búsqueda que está realizándose(igual, mayor, menor), inferior) se activa el indicador resultante.

La Figura 64 en la página 167 muestra un ejemplo de una operación LOOKUP enuna matriz sin un índice.

*....+....1....+....2....+....3....+....4....+....5....+....6....+....*DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++DARRA S 6A DIM(6) PERRCD(1) CTDATADARRB S 5 0 DIM(6) ALT(ARRA)DARRGRAPHIC S 3G DIM(2) PERRCD(2) CTDATADARRC S 3A DIM(2) ALT(ARRGRAPHIC)DARRGRAPH1 S 3G DIM(2) PERRCD(2) CTDATADARRGRAPH2 S 3G DIM(2) ALT(ARRGRAPH1)

**CTDATA ARRA345126 37338A437 49839K143 129740B125 9341C023 399842D893 87**CTDATA ARRGRAPHICok1k2k3iabcok4k5k6iabc**CTDATA ARRGRAPH1ok1k2k3k4k5k6k1k2k3k4k5k6i

Figura 63. Registros de matrices para un archivo de matriz en formato alternativo

166 VisualAge RPG Consulta del lenguaje

Page 189: RPG Referencia

ARRFILE, que contiene números de departamento, está definido en lasespecificaciones de descripción de archivo como un archivo de entrada (I enposición 17) con una designación de archivo de matriz (T en posición 18). Elarchivo está descrito por programa (F en la posición 22) y cada registro tiene 5posiciones de longitud (5 en la posición 27).

En las especificaciones de definición, se define ARRFILE como conteniendo lamatriz DPTNOS. La matriz contiene 50 entradas (DIM(50)). Cada entrada tiene unalongitud de 5 posiciones (posiciones 33-39) con cero posiciones decimales(posiciones 41-42). Cada registro puede contener un número de departamento(PERRCD toma el valor por omisión de 1).

Búsqueda en una matriz con un índicePara averiguar qué elemento satisface una búsqueda LOOKUP, comience labúsqueda en un elemento determinado de la matriz. Para efectuar este tipo debúsqueda, realice las entradas en las especificaciones de cálculo como lo haría parauna matriz sin un índice. Sin embargo, en el factor 2, entre el nombre de la matrizque se ha de buscar, seguido por un campo numérico entre paréntesis (con ceroposiciones decimales) que contenga el número del elemento en el que ha decomenzar la búsqueda. Esta constante o campo numérico se denomina índiceporque señala a cierto elemento de la matriz. El índice se actualiza con el númerode elemento que cumple las condiciones de la búsqueda o se establece en 0 si hafallado la búsqueda.

Puede utilizar una constante numérica como índice para comprobar la existenciade un elemento que cumpla las condiciones de la búsqueda a partir de unelemento distinto de 1.

Todas las demás normas aplicables a una matriz sin un índice se aplican a unamatriz con índice.

En la Figura 65 en la página 168 se muestra una operación LOOKUP en una matrizcon un índice. Este ejemplo muestra la misma matriz de números dedepartamento, DPTNOS, que la Figura 64. Sin embargo, también se define unamatriz alternativa de descripciones de departamento, DPTDSC. Cada elemento deDPTDSC tiene una longitud de 20 posiciones. Si existen datos insuficientes en elarchivo para inicializar toda la matriz, los elementos restantes de DPTNOS serellenan con ceros y los elementos restantes de DPTDSC se rellenan con blancos.

*...1....+....2....+....3....+....4....+....5....+....6....+....7...FFilename++IT.A.FRlen+......A.Device+.Keywords++++++++++++++++++++++++++++++++FARRFILE IT F 5 DISKF*DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++DDPTNOS S 5S 0 DIM(50) FROMFILE(ARRFILE)D*CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq..C* Se procesa la operación LOOKUP y, si se encuentra un elemento DPTNOSC* igual al argumento de búsqueda (DPTNUM), se activa el indicador 20.C DPTNUM LOOKUP DPTNOS 20

Figura 64. Operación LOOKUP para una matriz sin un índice

Capítulo 12. Utilización de matrices y tablas 167

Page 190: RPG Referencia

Utilización de matricesLas matrices pueden utilizarse en especificaciones de entrada, salida o cálculo.

Especificación de una matriz en los cálculosEn las especificaciones de cálculo se puede especificar toda una matriz o elementosindividuales de una matriz. Los elementos individuales se procesan como campos.

Una matriz no contigua definida con la palabra clave OVERLAY no puedeutilizarse con la operación MOVEA o en el campo de resultado de una operaciónPARM.

Para especificar toda una matriz, utilice únicamente el nombre de matriz, quepuede utilizarse como el factor 1, el factor 2 ó el campo de resultado. Puedenutilizarse las operaciones siguientes con un nombre de matriz:

ADD ADDDUR CHECK CHECKR CLEAR

DEFINE DIV EVAL EXTRCT LOOKUP

MOVE MOVEL MOVEA MULT PARM

RESET SCAN SORTA SQRT SUB

SUBDUR XFOOT Z-ADD Z-SUB

Pueden utilizarse otras operaciones sólo con un elemento de matriz, pero no con elnombre de la matriz únicamente. Estas operaciones incluyen, aunque no estánlimitadas a, las siguientes:

BITON BITOFF CABxx CAT COMP

DO DOU DOUxx DOW DOWxx

*...1....+....2....+....3....+....4....+....5....+....6....+....7...FFilename++IT.A.FRlen+......A.Device+.Keywords++++++++++++++++++++++++++++++++FARRFILE IT F 25 DISKF*DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++DDPTNOS S 5S 0 DIM(50) FROMFILE(ARRFILE)DDPTDSC S 20A DIM(50) ALT(DPTNOS)D*CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq..C* La operación Z-ADD comienza la operación LOOKUP en el primerC* elemento de DPTNOS.C Z-ADD 1 X 3 0C* Al final de una operación LOOKUP satisfactoria, al encontrar unC* elemento que contiene una entrada igual al argumento de búsqueda,C* DPTNUM, se activa el indicador 20 y la operación MOVE coloca laC* descripción de departamento correspondiente al número deC* departamento en DPTNAM.C DPTNUM LOOKUP DPTNOS(X) 20C* Si no se encuentra un elemento igual al argumento de búsqueda,C* se mueve el elemento X de DPTDSC a DPTNAM.C IF NOT *IN20C MOVE DPTDSC(X) DPTNAM 20C ENDIF

Figura 65. Operación LOOKUP sobre una matriz con un índice

168 VisualAge RPG Consulta del lenguaje

Page 191: RPG Referencia

IF IFxx MVR SUBST TESTB

TESTN TESTZ WHEN WHENxx

Cuando se especifica con un nombre de matriz sin índice o con un asterisco comoel índice (por ejemplo, ARRAY o ARRAY(*)), se repiten ciertas operaciones paracada elemento de la matriz. Se trata de las siguientes:

ADD ADDDUR DIV EVAL EXTRCT

MOVE MOVEL MULT SQRT SUB

Z-ADD Z-SUB

A estas operaciones se aplican las normas siguientes cuando se especifica unnombre de matriz sin un índice:v Cuando el factor 1, el factor 2 y el campo de resultado son matrices con el

mismo número de elementos, la operación utiliza el primer elemento de cadamatriz, a continuación el segundo elemento de cada matriz hasta que se hanprocesado todos los elementos de las matrices. Si las matrices no tienen elmismo número de entradas, la operación finaliza cuando se ha procesado elúltimo elemento de la matriz que contiene menos elementos. Cuando no seespecifica el factor 1 para las operaciones ADD, SUB, MULT y DIV, se presuponeque el factor 1 es igual que el campo de resultado.

v Cuando uno de los factores es un campo, literal o constante figurativa y el otrofactor y el campo de resultado son matrices, la operación se lleva a cabo una vezpara cada elemento en la matriz más corta. Se utiliza el mismo campo, literal oconstante figurativa en todas las operaciones.

v El campo de resultado debe ser siempre una matriz.v Si un código de operación utiliza únicamente el factor 2 (por ejemplo, puede que

Z-ADD, Z-SUB, SQRT, ADD, SUB, MULT o DIV no tengan el factor 1especificado) y el campo de resultado es una matriz, se lleva a cabo la operaciónuna vez para cada elemento de la matriz. Se utiliza el mismo campo o constanteen todas las operaciones si el factor 2 no es una matriz.

v No pueden utilizarse los indicadores resultantes (posiciones 71 a 76) debido alnúmero de operaciones que están procesándose.

Nota: Cuando se utilizan en una operación EVAL, %ADDR(arr) y %ADDR(arr(*))no tienen el mismo significado. Consulte el apartado “%ADDR (Obtenerdirección de variable)” en la página 314 para obtener más detalles.

Clasificación de matricesPuede clasificar matrices utilizando el código de operación SORTA. La matriz seclasifica en secuencia (ascendente o descendente) según la secuencia especificadapara la matriz en la especificación de definición.

Clasificación utilizando parte de la matriz como una clavePuede utilizar la palabra clave OVERLAY para solapar una matriz con otra. Porejemplo, puede tener una matriz base que contenga nombres y sueldos y dosmatrices de solapamiento (una para los nombres y otra para los sueldos). Acontinuación puede clasificar la matriz base por nombre o sueldo efectuando unaclasificación en la matriz de solapamiento correspondiente.

Capítulo 12. Utilización de matrices y tablas 169

Page 192: RPG Referencia

Salida de matrizPueden grabarse matrices enteras al final del programa solamente cuando se haactivado el indicador LR. Para indicar que se ha de grabar toda una matriz,especifique el nombre del archivo de salida con la palabra clave TOFILE en lasespecificaciones de definición. Este archivo debe describirse como un archivocombinado organizado secuencialmente en las especificaciones de descripción dearchivo.

Si el archivo es un archivo combinado y está descrito externamente como unarchivo físico, la información de la matriz al final del programa sustituye a lainformación que se ha leído en la matriz al comienzo del programa. Los archivoslógicos pueden dar resultados imprevisibles.

Si se ha de grabar toda una matriz en un registro de salida (utilizando lasespecificaciones de salida), describa la matriz junto con los demás campos delregistro:v Las posiciones 30 a 43 de las especificaciones de salida deben contener el

nombre de matriz utilizado en las especificaciones de definición.v Las posiciones 47 a 51 de las especificaciones de salida deben contener la

posición de registro donde ha de finalizar el último elemento de la matriz. Si seespecifica un código de edición, la posición final debe incluir posiciones enblanco y cualquier extensión debida al código de edición (consulte el apartado“Edición de matrices completas” más adelante en este apartado).

Pueden especificarse indicadores de salida (posiciones 21 a 29). Las entrada desupresión de ceros (posición 44), blanco después (posición 45) y formato de datos(posición 52) pertenecen a cada elemento de la matriz.

Edición de toda una matrizCuando se especifica la edición para toda una matriz, se editan todos loselementos de la matriz. Si se requiere una edición diferente para diversoselementos, haga referencia a estos individualmente.

Cuando se especifica un código de edición para toda una matriz (posición 44), seinsertan automáticamente dos espacios en blanco entre los elementos de la matriz:

*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++D DSD Emp_Info 50 DIM(500) ASCENDD Emp_Name 45 OVERLAY(Emp_Info:1)D Emp_Salary 9P 2 OVERLAY(Emp_Info:46)DCSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....CC* Esta operación SORTA clasifica Emp_Info por nombre de empleado.C* Se utiliza la secuencia de Emp_Name para determinar el orden de losC* elementos de Emp_Info.C SORTA Emp_NameC* Esta operación SORTA clasifica Emp_Info por sueldo de empleado.C* Se utiliza la secuencia de Emp_Salary para determinar el orden de losC* elementos de Emp_Info.C SORTA Emp_Salary

Figura 66. Operación SORTA con OVERLAY

170 VisualAge RPG Consulta del lenguaje

Page 193: RPG Referencia

hay espacios en blanco a la izquierda de todos los elementos de la matriz exceptoen el primero. Cuando se especifica una palabra de edición, no se insertan losblancos. La palabra de edición debe contener todos los blancos que se han deinsertar.

TablasLa explicación dada para las matrices se aplica a las tablas excepto en lassiguientes diferencias:

Actividad DiferenciasDefinición Un nombre de tabla debe ser un nombre simbólico exclusivo

que comience por las letras TAB.Utilización y modificaciónde elementos de tabla

Sólo un elemento de una tabla está activo cada vez. El nombrede la tabla se utiliza para hacer referencia al elemento activo.

Búsqueda La operación LOOKUP se especifica de modo diferente paralas tablas.

LOOKUP con una tablaCuando se busca en una sola tabla, deben especificarse el factor 1, el factor 2 ycomo mínimo un indicador resultante. También pueden utilizarse los indicadoresde condición (especificados en las posiciones 7 a 11).

Cuando se encuentra un elemento de tabla que satisface el tipo de búsqueda queestá realizándose (igual, mayor, menor), el elemento de tabla se convierte en elelemento actual para la tabla. Si la búsqueda no es satisfactoria, el elemento actualanterior continúa siendo el elemento actual.

Antes de una operación LOOKUP satisfactoria, el primer elemento es el elementoactual.

Los indicadores resultantes reflejan el resultado de la búsqueda. Si el indicador estáactivado, lo que indica una búsqueda satisfactoria, el elemento que satisface labúsqueda es el elemento actual.

LOOKUP con dos tablasCuando se utilizan dos tablas en una búsqueda, en realidad sólo se busca en una.Cuando se satisface la condición de la búsqueda (mayor, menor, igual), loselementos correspondientes quedan disponibles para su uso.

El factor 1 debe contener el argumento de búsqueda y el factor 2 debe contener elnombre de la tabla en que se ha de buscar. El campo de resultado debe indicarcuál es la tabla desde la que los datos también quedan disponibles para su uso.Debe utilizarse también un indicador resultante. Puede especificarse el nivel decontrol y los indicadores de condición en las posiciones 7 a 11, si es necesario.

Las dos tablas utilizadas deben tener el mismo número de entradas. Si la tabla enla que se realiza la búsqueda contiene más elementos que la segunda tabla, esposible satisfacer la condición de búsqueda. Sin embargo, puede que no haya unelemento en la segunda tabla que corresponda al elemento encontrado en la tablade búsqueda. Pueden producirse resultados no deseados.

Capítulo 12. Utilización de matrices y tablas 171

Page 194: RPG Referencia

Nota: Si especifica un nombre de tabla en una operación distinta de LOOKUPantes de que se produzca una operación LOOKUP satisfactoria, la tabla seestablece en su primer elemento.

Especificación del elemento de tabla encontrado en unaoperación LOOKUP

Cuando se utiliza un nombre de tabla en una operación distinta de LOOKUP, elnombre de tabla hace referencia a los datos recuperados por la última búsquedasatisfactoria. Por lo tanto, cuando se especifica el nombre de tabla de este modo,pueden utilizarse los elementos de una tabla en las operaciones de cálculo.

Si se utiliza la tabla como el factor 1 en una operación LOOKUP, se utiliza elelemento actual como el argumento de búsqueda. De este modo un elemento deuna tabla puede convertirse en un argumento de búsqueda.

También puede utilizarse la tabla como el campo de resultado en operacionesdistintas de LOOKUP. En este caso, el valor del elemento actual se cambiamediante la especificación de cálculo. De este modo, el contenido de la tabla puedemodificarse mediante las operaciones de cálculo. Consulte la Figura 68.

*...1....+....2....+....3....+....4....+....5....+....6....+....7...CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq..C* La operación LOOKUP busca en TABEMP una entrada que sea igual alC* contenido del campo llamado EMPNUM. Si se encuentra una entradaC* igual en TABEMP, se activa el indicador 09 y la entrada TABEMPC* y su entrada relacionada en TABPAY se convierten en los elementosC* actuales.C EMPNUM LOOKUP TABEMP TABPAY 09C* Si está activado el indicador 09, el contenido del campo denominadoC* HRSWKD se multiplica por el valor del elemento actual deC* TABPAY.C IF *IN09C HRSWKD MULT(H) TABPAY AMT 6 2C ENDIF

Figura 67. Búsqueda de una entrada igual

*...1....+....2....+....3....+....4....+....5....+....6....+....7...CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq..C ARGMNT LOOKUP TABLEA 20C* Si se encuentra el elemento se multiplica por 1,5.C* Si el contenido de toda la tabla antes de la operación MULTC* es 1323,5, -7,8 y 113,4 y el valor de ARGMNT es -7,8,C* el segundo elemento es el elemento actual.C* Después de la operación MULT, toda la tabla tieneC* el valor siguiente: 1323,5, -11,7 y 113,4.C* Tenga en cuenta que sólo ha cambiado el segundo elemento, ya queC* este era el elemento actual, establecido por la operación LOOKUP.C IF *IN20C TABLEA MULT 1.5 TABLEAC ENDIF

Figura 68. Especificación del elemento de tabla encontrado en operaciones LOOKUP

172 VisualAge RPG Consulta del lenguaje

Page 195: RPG Referencia

Capítulo 13. Edición de campos numéricos

La edición proporciona un medio de puntuar los campos numéricos, incluyendo laimpresión de símbolos de moneda, comas, puntos, signos menos y menos flotante.También proporciona el movimiento de signo de campo desde el dígito más a laderecha hasta el final del campo, blancos para campos de cero, espaciado enmatrices, edición de campos de fecha y protección de símbolo de moneda oasterisco.

Puede editarse un campo mediante códigos de edición o palabras de edición.Puede imprimir campos en formato de edición utilizando especificaciones de salidao puede obtener el valor editado del campo en las especificaciones de cálculoutilizando las funciones incorporadas %EDITC (código de edición) y %EDITW(palabra de edición).

Nota: Para obtener una descripción de cómo editar partes de los campos deentrada y partes de texto estático, consulte la publicación Programación conVisualAge para RPG, SC10-3067-02 (SC09-2449-02).

Cuando se imprimen campos que no se editan, los campos aparecen exactamentecomo se representan internamente. Los ejemplos siguientes muestran cómo sepuede editar campos de salida numéricos.

Tipo de campo Campo del sistema Impresión de campono editado

Impresión de campoeditado

Alfanumérico

Numérico(positivo)

Numérico(negativo)

JOHN T SMITH

0047652

004765r

JOHN T SMITH

0047652

004765r

JOHN T SMITH

47652

47652-

El campo alfanumérico no editado y el campo numérico positivo no editadoresultan fáciles de leer cuando se imprimen, pero el campo numérico negativo noeditado resulta confuso porque contiene una ’r’, que no es numérica. La ’r’ es unacombinación del dígito 2 y el signo negativo del signo. Se combinan de modo queuna de las posiciones del campo no tenga que reservarse para el signo. Lacombinación resulta conveniente para almacenar el campo en el sistema, pero haceque la salida resulte difícil de leer. Los campos numéricos deben editarse antes deimprimirlos.

Códigos de ediciónLos códigos de edición proporcionan un medio de editar campos numéricos segúnun patrón predefinido. Se dividen en dos categorías: simples (X, Y, Z) y decombinación (1 a 4, A a D, J a Q). Entrar el código de edición en la posición 44 delas especificaciones de salida del campo a editar. O, puede especificar el código deedición como el segundo parámetro de la función incorporada %EDITC en lasespecificaciones de cálculo.

© Copyright IBM Corp. 1994, 2000 173

Page 196: RPG Referencia

Códigos de edición simplesPuede utilizar los códigos de edición simples para editar campos numéricos sintener que especificar ninguna puntuación. Estos códigos y sus funciones son:v El código de edición X asegura un signo hexadecimal 3 para los campos

positivos. Sin embargo, generalmente no tiene que especificar este código, yaque lo hace el sistema. No se suprimen los códigos iniciales. El código deedición X no modifica los números negativos.

v El código de edición Y se utiliza generalmente para editar un campo de fecha de3 a 9 dígitos. Suprime los ceros situados más a la izquierda de los campos defecha hasta, pero no incluyendo, el dígito anterior al primer separador. Lasbarras inclinadas se insertan para separar el día, mes y año. Pueden utilizarse laspalabras clave DATEDIT(fmt{separador}) y DECEDIT(’valor’) en la especificaciónde control para alterar los formatos de edición.

v El código de edición Y no es válido para *YEAR, *MONTH, y *DAY.v El código de edición Z elimina el signo (más o menos) y suprime los ceros

iniciales de un campo numérico. La coma decimal no se coloca en el campo y nose imprime.

Códigos de edición de combinaciónLos códigos de edición de combinación (1 a 4, A a D, J a Q) puntúan un camponumérico.

La palabra clave DECEDIT en la especificación de control determina qué carácterse utiliza como separador decimal y si se suprimen los ceros iniciales. La posicióndecimal del campo de origen determina si se imprime una coma decimal y dóndese imprime. Si se especifican posiciones decimales para el campo de origen y sesuprime el saldo cero, el separador decimal sólo se imprime si el campo no es cero.Si no se ha de imprimir un saldo cero, los campos de ceros se imprimen comoblancos.

Cuando se ha de imprimir un saldo cero y el campo es igual a cero, se imprimecualquiera de los siguientes:v Un separador decimal seguido por n ceros, donde n es el número de posiciones

decimales del campo.v Un cero en la posición de unidades de un campo si no se han especificado

posiciones decimales.

Puede utilizar un símbolo de moneda flotante o protección de asteriscos concualquiera de las 12 combinaciones de códigos de edición. Para especificar unsímbolo de moneda flotante, codifique el símbolo de moneda en las posiciones53-55 de la especificación de salida, junto con un código de edición en la posición44 del campo que se va a editar. El símbolo de moneda flotante aparece a laizquierda del primer dígito significativo. El símbolo de moneda flotante no seimprime en un saldo cero cuando se utiliza un código de edición que suprime elsaldo cero. El símbolo de moneda no aparece en un saldo cero cuando se utiliza uncódigo de edición que suprime el saldo cero.

Se utiliza un signo de dólar ($) como símbolo de moneda a menos que seespecifique otro con la palabra clave CURSYM en la especificación de control.

Una constante de asterisco codificada en las posiciones 53 a 55 de lasespecificaciones de salida (’*’), junto con un código de edición para el campo quese va a editar hace que se imprima un asterisco para cada cero suprimido. Seimprime un campo completo de asteriscos en un campo de origen de saldo cero.

174 VisualAge RPG Consulta del lenguaje

Page 197: RPG Referencia

Para especificar protección de asterisco utilizando la función incorporada %EDITC,especifique *ASTFILL como el tercer parámetro.

El relleno de asterisco y el símbolo de moneda flotante no se pueden utilizar conlos códigos de edición simples (X, Y, Z).

Para la función incorporada %EDITC, especifique un símbolo de divisa flotante enel tercer parámetro. Para utilizar el símbolo de divisa del programa, especifique*CURSYM. Para utilizar otro símbolo de divisa, especifique una constante decarácter de longitud 1.

Un símbolo de moneda puede aparecer antes del relleno de asterisco (símbolo demoneda fijo). Esto requiere dos especificaciones de salida con la codificaciónsiguiente:1. Coloque una constante de símbolo de moneda en la posición 53 de la primera

especificación de salida. La posición final especificada en las posiciones 47-51debe estar un espacio antes del inicio del campo editado.

2. En la segunda especificación de salida, sitúe el campo de edición en lasposiciones 30-43, un código de edición en la posición 44, la posición final delcampo de edición en las posiciones 47-51 y ’*’ en las posiciones 53-55.Puede hacer esto utilizando la función incorporada %EDITC concatenando elsímbolo de moneda con el resultado de %EDITC del modo siguiente:

C EVAL X = '$' + %EDITC(N: 'A' : *ASTFILL)

Cuando se utiliza un código de edición para imprimir toda una matriz, dosespacios en blanco preceden a cada elemento de la matriz (excepto al primerelemento).

Nota: No se puede editar una matriz utilizando la función incorporada %EDITC.

En la Tabla 22 se resumen las funciones de los códigos de edición de combinación.Los códigos editan el campo en el formato listado a la izquierda. Un camponegativo puede puntuarse sin signo, con CR, con un signo menos (−) o con unsigno menos flotante como se muestra en la parte superior de la figura.

Tabla 22. Códigos de edición de combinación

Indicador de saldo negativo

Imprime conseparador degrupo

Imprimesaldo cero Sin signo CR −

Menosflotante

Sí Sí 1 A J N

Sí No 2 B K 0

No Sí 3 C L P

No No 4 D M Q

Consideraciones de ediciónCuando especifique cualquiera de los códigos de edición, realice lo siguiente:v Edite los campos de un archivo no de impresora con precaución. Si edita los

campo de un campo no de impresora, tenga en cuenta el contenido de loscampos editados y el efecto que cualquier operación pudiera producirles. Porejemplo, si utiliza el archivo como entrada, los campos que se graben y editendeben considerarse campos de caracteres, no campos numéricos.

Capítulo 13. Edición de campos numéricos 175

Page 198: RPG Referencia

v Debe prestarse atención a los datos añadidos mediante la operación de edición.La cantidad de puntuación añadida aumenta la longitud total del campo desalida. Si no se tienen en cuenta estos caracteres añadidos al editar enespecificaciones de salida, los campos de salida podrían solaparse.

v La posición final especificada para la salida es la posición final del campoeditado. Por ejemplo, si se especifica cualquiera de los códigos de edición de J aM, la posición final es la posición del signo menos (o espacio en blanco si elcampo es positivo).

v El compilador asigna una posición para el signo incluso para campos numéricossin signo.

Resumen de códigos de ediciónEn la Tabla 23 se resumen los códigos de edición y las opciones que proporcionan.Se imprime una versión simplificada de esta tabla sobre las posiciones 45 a 70 enlas especificaciones de salida. En la Tabla 24 en la página 177 se muestran loscampos después de haberse editado.

En la Tabla 25 en la página 178 se muestra el efecto que los diferentes códigos deedición tienen en el mismo campo con una posición final especificada para salida.

Tabla 23. Códigos de edición

Parámetro de palabra clave DECEDIT

Código deedición Comas

Comadecimal

Signo parasaldonegativo ’.’ ’,’ ’0,’ ’0.’

Supresiónde ceros

1 Sí Sí Sin signo .00 ó 0 ,00 ó 0 0,00 ó 0 0.00 ó 0 Sí

2 Sí Sí Sin signo Blancos Blancos Blancos Blancos Sí

3 Sí Sin signo .00 ó 0 ,00 ó 0 0,00 ó 0 0.00 ó 0 Sí

4 Sí Sin signo Blancos Blancos Blancos Blancos Sí

A Sí Sí CR .00 ó 0 ,00 ó 0 0,00 ó 0 0.00 ó 0 Sí

B Sí Sí CR Blancos Blancos Blancos Blancos Sí

C Sí CR .00 ó 0 ,00 ó 0 0,00 ó 0 0.00 ó 0 Sí

D Sí CR Blancos Blancos Blancos Blancos Sí

J Sí Sí − 5(menos)

.00 ó 0 ,00 ó 0 0,00 ó 0 0.00 ó 0 Sí

K Sí Sí − (menos) Blancos Blancos Blancos Blancos Sí

L Sí − (menos) .00 ó 0 ,00 ó 0 0,00 ó 0 0.00 ó 0 Sí

M Sí − (menos) Blancos Blancos Blancos Blancos Sí

N Sí Sí − (menosflotante)

.00 ó 0 ,00 ó 0 0,00 ó 0 0.00 ó 0 Sí

O Sí Sí − (menosflotante)

Blancos Blancos Blancos Blancos Sí

P Sí − (menosflotante)

.00 ó 0 ,00 ó 0 0,00 ó 0 0.00 ó 0 Sí

Q Sí − (menosflotante)

Blancos Blancos Blancos Blancos Sí

X1 Sí

Y2 Sí

Z3 Sí

176 VisualAge RPG Consulta del lenguaje

Page 199: RPG Referencia

Tabla 23. Códigos de edición (continuación)

Parámetro de palabra clave DECEDIT

Código deedición Comas

Comadecimal

Signo parasaldonegativo ’.’ ’,’ ’0,’ ’0.’

Supresiónde ceros

1The El código de edición X asegura un signo hexadecimal 3 para los valores positivos. Dado que el sistema loefectúa por usted, generalmente no tiene que especificar este código.

2El código de edición Y suprime los ceros situados más a la izquierda de los campos de fecha hasta, pero noincluyendo, el dígito anterior al primer separador. El código de edición Y inserta barras inclinadas (/) entre el mes,día y año según el patrón siguiente:

nn/nnn/nnnn/nn/nnn/nn/nnnnn/nn/nnnn/nn/nnnnnnn/nn/nnnnnnnn/nn/nnnnnnn/nn/nn

3El código de edición Z elimina el signo (más o menos) de un campo numérico y suprime los ceros iniciales.

Tabla 24. Ejemplos de utilización de código de edición

Códigosde edición

Númeropositivo-Dosposicionesdecimales

Númeropositivo-Sinposicionesdecimales

Númeronegativo-Tresposicionesdecimales

Númeronegativo-Sinposicionesdecimales

Saldo cero-Dosposicionesdecimales

Saldo cero-Sinposicionesdecimales

Noeditado

1234567 1234567 00012�4 000000 000000

1 12,345.67 1,234,567 .120 120 .00 0

2 12,345.67 1,234,567 .120 120

3 12345.67 1234567 .120 120 .00 0

4 12345.67 1234567 .120 120

A 12,345.67 1,234,567 .120CR 120CR .00 0

B 12.345.67 1,234,567 .120CR 120CR

C 12345.67 1234567 .120CR 120CR .00 0

D 12345.67 1234567 .120CR 120CR

J 12,345.67 1,234,567 .120− 120− .00 0

K 12,345,67 1,234,567 .120− 120−

L 12345.67 1234567 .120− 120− .00 0

M 12345.67 1234567 .120− 120−

N 12,345.67 1,234,567 −.120 −120 .00 0

O 12,345,67 1,234,567 −.120 −120

P 12345.67 1234567 −.120 −120 .00 0

Q 12345.67 1234567 −.120 −120

X1 1234567 1234567 00012�4 000000 000000

Y2 0/01/20 0/01/20 0/00/00 0/00/00

Z3 1234567 1234567 120 120

Capítulo 13. Edición de campos numéricos 177

Page 200: RPG Referencia

Tabla 24. Ejemplos de utilización de código de edición (continuación)

Códigosde edición

Númeropositivo-Dosposicionesdecimales

Númeropositivo-Sinposicionesdecimales

Númeronegativo-Tresposicionesdecimales

Númeronegativo-Sinposicionesdecimales

Saldo cero-Dosposicionesdecimales

Saldo cero-Sinposicionesdecimales

1El código de edición X asegura un signo hex F para los valores positivos. Dado que elsistema lo efectúa por usted, generalmente no tiene que especificar este código.

2El código de edición Y suprime los ceros situados más a la izquierda de los campos defecha hasta, pero no incluyendo, el dígito anterior al primer separador. El código deedición Y inserta barras inclinadas (/) entre el mes, día y año según el patrón siguiente:

nn/nnn/nnnn/nn/nnn/nn/nn

nnn/nn/nnnn/nn/nnnn Formato utilizado con M, D o blanco en la posición 19nnn/nn/nnnn Formato utilizado con M, D o blanco en la posición 19nnnn/nn/nn Formato utilizado con Y en la posición 19

nnnnn/nn/nnnn Formato utilizado con Y en la posición 19

3 El código de edición Z elimina el signo (más o menos) de un campo numérico y suprimelos ceros iniciales de un campo numérico.

4 El símbolo � representa un espacio en blanco. Esto puede ocurrir si un cero negativo nocorresponde a un carácter imprimible.

Tabla 25. Efectos de los códigos de edición en la posición final

Número negativo, 2 posiciones decimales. Posición finalespecificada como 10.

Posiciones de impresión de salida

Código de edición 3 4 5 6 7 8 9 101r representa un 2 negativo.

No editado 0 0 4 1 r1

1 4 . 1 2

2 4 . 1 2

3 4 . 1 2

4 4 . 1 2

A 4 . 1 2 C R

B 4 . 1 2 C R

C 4 . 1 2 C R

D 4 . 1 2 C R

J 4 . 1 2 −

r 4 . 1 2 −

L 4 . 1 2 −

M 4 . 1 2 −

N − 4 . 1 2

O − 4 . 1 2

P − 4 . 1 2

178 VisualAge RPG Consulta del lenguaje

Page 201: RPG Referencia

Tabla 25. Efectos de los códigos de edición en la posición final (continuación)

Número negativo, 2 posiciones decimales. Posición finalespecificada como 10.

Posiciones de impresión de salida

Código de edición 3 4 5 6 7 8 9 10

Q − 4 . 1 2

X 0 0 4 1 r1

Y 0 / 4 1 / 2

Z 4 1 2

Palabras de ediciónSi tiene requisitos de edición que no pueden satisfacerse utilizando los códigos deedición, puede utilizar una palabra de edición. Una palabra de edición es un literalde caracteres o una constante con nombre especificada en las posiciones 53 - 80 dela especificación de salida. Describe el patrón de edición para un campo numéricoy le permite especificar directamente:v Espacios en blancov Comas y comas decimales y su posiciónv Supresión de ceros no deseadosv Asteriscos inicialesv El símbolo de moneda y su posiciónv Adición de caracteres de constantesv Salida del signo negativo, o CR como un indicador negativo.

La palabra de edición se utiliza como una plantilla que el sistema aplica a los datosfuente para producir la salida.

Puede especificarse la palabra de edición directamente en una especificación desalida o puede especificarse como una constante con nombre con un nombre deconstante con nombre que aparecerá en el campo de palabra de edición de laespecificación de salida. Puede obtener el valor editado del campo en lasespecificaciones de cálculo utilizando la función incorporada %EDITW (palabra deedición).

Las constantes con nombre, utilizadas como palabras de edición, están limitadas a115 caracteres.

Cómo codificar una palabra de ediciónPara utilizar una palabra de edición, codifique la especificación de salida como semuestra a continuación:

Posición Entrada

21-29 Puede contener indicadores de condición.

30-43 Contiene el nombre del campo numérico desde el que se toman losdatos que se van a editar.

44 Código de edición: Debe estar en blanco, si está utilizando unapalabra de edición para editar los datos fuente.

45 Una “B” en esta posición indica que los datos fuente se establecenen cero o blancos después de su edición y salida. De lo contrario,no se modifican los datos fuente.

Capítulo 13. Edición de campos numéricos 179

Page 202: RPG Referencia

47-51 Identifica la posición final (a la derecha) del campo en el registrode salida.

53-80 Palabra de edición: Puede tener una longitud máxima de 26caracteres y debe estar encerrado entre apóstrofos, a menos que seauna constante con nombre. Entre el apóstrofo inicial o comience laconstante con nombre en la columna 53. La palabra de edición, amenos que sea una constante con nombre, debe comenzar en lacolumna 54.

Para editar utilizando una palabra de edición en especificaciones de cálculo, utilicela función incorporada %EDITW, especificando el valor a editar como el primerparámetro y la palabra de edición como el segundo parámetro.

Partes de una palabra de ediciónUna palabra de edición (codificada en las posiciones 53 a 80 de las especificacionesde salida) consta de tres partes: el cuerpo, el estado y la expansión. A continuación,se muestran estas tres partes de una palabra de edición:

El cuerpo es el espacio para los dígitos transferidos desde el campo de datosfuente al registro de salida. El cuerpo comienza en la posición situada más a laizquierda de la palabra de edición. El número de blancos (más un cero o unasterisco) del cuerpo de la palabra de edición debe ser igual a o mayor que elnúmero de dígitos del campo de datos fuente que se ha de editar. El cuerpofinaliza en el carácter situado más a la izquierda y puede sustituirse por un dígito.

El estado define un espacio que permite un indicador negativo, las dos letras CR oun signo menos (−). El indicador negativo especificado sólo aparecerá en la salidasi los datos fuente son negativos. Todos los caracteres de la palabra de ediciónentre el último carácter sustituible (blanco, carácter de supresión de ceros) y elindicador negativo también aparecerán en la salida con el indicador negativoúnicamente si los datos fuente son negativos; si los datos fuente son positivos,estas posiciones de estado se sustituyen por blancos. Las palabras de edición sinlos indicadores CR o − no tienen posiciones de estado.

Debe entrarse el estado después del último blanco de la palabra de edición. Si acontinuación del último blanco hay más de un CR, sólo el primer CR se trata comoun estado; los CR restantes se tratan como constantes. Para que el signo menos seconsidere un estado, debe ser el último carácter de la palabra de edición.

La expansión es una serie de símbolos & y caracteres de constantes que se entrandespués del estado. En la salida, los símbolos & se sustituyen por espacios enblanco y las constantes se dejan tal cual. Si no se especifica el estado, la expansiónsigue al cuerpo.

T TOC R

Cuerpo Estado Expansión

&

P A L A B R A D E E D I C I Ó N

& &.,b b b bb b b0.

180 VisualAge RPG Consulta del lenguaje

Page 203: RPG Referencia

Formación del cuerpo de una palabra de ediciónLos caracteres siguientes tienen significados especiales cuando se utilizan en elcuerpo de una palabra de edición.

Símbolo &: Produce un blanco en el campo editado. Puede utilizarse el ejemplosiguiente para editar un número de teléfono. Tenga en cuenta que el cero de laprimera posición es necesario para imprimir la constante AREA.

Palabra de edición Datos fuente Aparece en el registro desalida como:

'0AREA&���&NO.&���-����' 4165551212 �AREA�416�NO.�555-1212

Asterisco: El primer asterisco del cuerpo de una palabra de edición finalizatambién la supresión de ceros. Los asteriscos subsiguientes que se colocan en lapalabra de edición se tratan como constantes (consulte el apartado Constantes acontinuación). Todos los ceros de la palabra de edición que siguen a este asteriscose tratan también como constantes. En una palabra de edición sólo puede haber uncarácter de finalización de supresión de ceros y dicho carácter es el primerasterisco o el primero cero de la palabra de edición.

Si se utiliza un asterisco como un carácter de finalización de supresión de ceros,todos los ceros iniciales que se supriman se sustituirán por asteriscos en la salida.De lo contrario, el asterisco suprime los ceros iniciales del mismo modo que seindica más abajo para Ceros.

Palabra de edición Datos fuente Aparece en el registro desalida como:

'*������.��' 000000123 *000001.23

'�����*�.��' 000000000 ******0,00

'�����*�.��**' 000056342 ****563,42**

Tenga en cuenta que los ceros iniciales que aparecen después de la posición delasterisco en la salida aparecen como ceros iniciales. Sólo los ceros inicialessuprimidos, incluido el que se encuentra en la posición del asterisco, se sustituyenpor asteriscos.

Blanco: El blanco se sustituye por el carácter que se encuentra en la posicióncorrespondiente del campo de datos fuente especificado mediante el nombre decampo en las posiciones 30 a 43 de las especificaciones de salida. Se hace referenciaa una posición en blanco como una posición de dígito.

Constantes: Todos los demás caracteres que se entran en el cuerpo de la palabrade edición se tratan como constantes. Si los datos fuente son tales que la salidacoloca dígitos significativos o ceros iniciales a la izquierda de una constante,entonces dicha constante aparece en la salida. De lo contrario, se suprime laconstante en la salida. Las comas y la coma decimal siguen las mismas normas quelas constantes. Fíjese que, en los ejemplos siguientes, la presencia del carácter definalización de supresión de ceros, al igual que el número de dígitos significativosde los datos fuente, influyen en la salida de constantes.

Pueden utilizarse las palabras de edición siguientes para imprimir cheques. Tengaen cuenta que el segundo asterisco se trata como una constante y que, en el tercerejemplo, las constantes anteriores al primer dígito significativo no aparecen en lasalida.

Capítulo 13. Edición de campos numéricos 181

Page 204: RPG Referencia

Palabra de edición Datos fuente Aparece en el registro desalida como:

'$������**DOLLARS&��&CTS' 000012345 $****123*DOLLARS�45�CTS

'$������**DOLLARS&��&CTS' 000000006 $********DOLLARS�06�CTS

'$�������&DOLLARS&��&CTS' 000000006 $�����������������6�CTS

Puede imprimirse una fecha utilizando cualquiera de las palabras de edición:

Palabra de edición Datos fuente Aparece en el registro desalida como:

'��/��/��' 010388 �1/03/88

'0��/��/��' 010389 �01/03/89

Tenga en cuenta que los ceros o asteriscos que siguen a la primera aparición deuna palabra de edición se tratan como constantes. Esta misma norma se aplica a −y CR:

Palabra de edición Datos fuente Aparece en el registro desalida como:

'��0.��000' 01234 �12.34000

'��*.��000' 01234 *12,34000

Símbolo de moneda: A un símbolo de moneda seguido directamente de unprimer cero en la palabra de edición (carácter de finalización de supresión deceros) se le llama flotante. Se suprimen todos los ceros iniciales en la salida y elsímbolo de moneda aparece en la salida inmediatamente a la izquierda del dígitomás significativo.

Palabra de edición Datos fuente Aparece en el registro desalida como:

'��,���,�$0.��' 000000012 ���������$.12

'��,���,�$0.��' 000123456 ����$1,234.56

Si el símbolo de moneda se pone en la primera posición de la palabra de edición,siempre aparecerá en dicha posición en la salida. Esto se llama un símbolo demoneda fijo.

Palabra de edición Datos fuente Aparece en el registro desalida como:

'$�,���,��0.��' 000123456 $����1,234.56

'$��,���,0�0.��' 000000000 $��������00.00

'$�,���,*��.��' 000123456 $****1.234,56

Un símbolo de moneda en cualquier lugar de la palabra de edición que no vayaseguido inmediatamente de un carácter de finalización de supresión de ceros setrata como una constante (consulte el apartado Constantes más arriba).

182 VisualAge RPG Consulta del lenguaje

Page 205: RPG Referencia

Decimales y comas: Los decimales y comas en el campo de salida editado estánen la misma posición que en la palabra de edición a menos que aparezcan a laizquierda del primer dígito significativo de la palabra de edición. En tal caso, sesustituyen por blancos o por un asterisco.

En los ejemplos siguientes, se suprimirán todos los ceros iniciales (por omisión) amenos que haya un dígito significativo a su izquierda.

Palabra de edición Datos fuente Aparece en el registro desalida como:

'�������' 0000072 �����72

'�������.��' 000000012 ��������12

'�������.��' 000000123 ������1.23

Ceros: El primer cero del cuerpo de la palabra de edición se interpreta como uncarácter de finalización de supresión de ceros. El cero se coloca donde finaliza lasupresión de ceros. Los ceros subsiguientes que se coloquen en la palabra deedición se tratan como constantes (consulte el apartado Constantes más arriba).

Cualquier cero inicial de los datos fuente se suprimen hasta e incluida la posicióndel carácter de finalización de supresión de ceros. Los dígitos significativosaparecerán en la salida en la posición del carácter de finalización de supresión deceros, o a la izquierda de este.

Palabra de edición Datos fuente Aparece en el registro desalida como:

'���0������' 00000004 ����000004

'���0������' 012345 ����012345

'���0������' 012345678 ��12345678

Si los ceros iniciales incluyen o se extienden a la derecha del carácter definalización de supresión de ceros, dicha posición se sustituye por un blanco. Estosignifica que si desea que en la salida aparezca el mismo número de ceros inicialesque existen en los datos fuente, el cuerpo de la palabra de edición debe ser másancho que los datos fuente.

Palabra de edición Datos fuente Aparece en el registro desalida como:

'0���' 0156 �156

'0����' 0156 �0156

Las constantes (incluidas las comas y la coma decimal) que se colocan a la derechadel carácter de finalización de supresión de ceros son salida, incluso si no existendatos fuente. Las constantes que se colocan a la izquierda del carácter definalización de supresión de datos sólo son salida si los datos fuente tienen dígitossignificativos que se colocarían a la izquierda de estas constantes.

Palabra de edición Datos fuente Aparece en el registro desalida como:

'������0.��' 000000001 �������.01

'������0.��' 000000000 �������.00

Capítulo 13. Edición de campos numéricos 183

Page 206: RPG Referencia

Palabra de edición Datos fuente Aparece en el registro desalida como:

'���,�0�.��' 00000012 ������0.12

'���,�0�.��' 00000123 ������1.23

'�0�,���.��' 00000123 ��0,001.23

Formación del estado de una palabra de ediciónLos caracteres siguientes pueden tener significados especiales cuando se utilizan enel estado de una palabra de edición:

Símbolo &: Produce un blanco en el campo de salida editado. Un símbolo & nopuede sustituirse en el campo de salida editado.

CR o símbolo menos: Si el signo de la salida editada es más (+), estas posicionesse dejan en blanco. Si el signo del campo de salida editado es menos (−), estasposiciones no se modifican.

El ejemplo siguiente añade una indicación de valor negativo. El signo menos sólose imprimirá cuando el valor del campo sea negativo. Un símbolo CR cumple lamisma función que un signo menos.

Palabra de edición Datos fuente Aparece en el registro desalida como:

'�������.��−' 000000123− ������1.23−

'�������.��−' 000000123 ������1.23�

Las constantes entre el último carácter sustituible y el signo − o CR sólo seimprimirán si el campo es negativo; de lo contrario, se imprimirán blancos en estasposiciones. Fíjese en la utilización de los símbolos & para representar blancos:

Palabra de edición Datos fuente Aparece en el registro desalida como:

'�,���,��0.��&30&DAY&CR' 000000123− ���������1.23�30�DAY�CR

'�,���,��0.��&30&DAY&CR' 000000123 ���������1.23����������

Formato de la expansión de una palabra de ediciónLos caracteres de la parte de expansión de una palabra de edición siempre segraban. La expansión no puede contener blancos. Si es necesario un blanco en elcampo de salida editado, especifique un símbolo & en el cuerpo de la palabra deedición.

Pueden añadirse constantes para imprimir en cada línea:

Palabra de edición Datos fuente Aparece en el registro desalida como:

'�,��0.��&CR&NET' 000123− ����1.23�CR�NET

'�,��0.��&CR&NET' 000123 ����1.23����NET

Tenga en cuenta que CR en medio de una palabra puede detectarse como unaindicación de un valor de campo negativo. Si es necesaria una palabra comoSECRET, utilice la codificación del ejemplo siguiente.

184 VisualAge RPG Consulta del lenguaje

Page 207: RPG Referencia

Palabra de edición Datos fuente Aparece en el registro desalida como:

'��0.��&SECRET' 12345− 123.45�SECRET

'��0.��&SECRET' 12345 123.45�����ET

'��0.��&CR&&SECRET' 12345 123.45�����SECRET

Resumen de reglas de codificación para palabras de ediciónLas reglas siguientes se aplican a las palabras de edición:v La posición 44 (códigos de edición) debe estar en blanco.v Las posiciones 30 a 43 (nombre de campo) deben contener el nombre de un

campo numérico.v Una palabra de edición debe estar encerrada entre apóstrofos, a menos que sea

una constante con nombre. Entre el apóstrofo inicial o comience un nombre deconstante con nombre en la posición 53. La palabra de edición debe comenzar enla posición 54.

v La palabra de edición puede contener más posiciones de dígitos (blancos más elcero inicial o asterisco) que el campo que se va a editar, pero no debe contenermenos. Si hay más posiciones de dígitos en la palabra de edición que dígitos enel campo que se va a editar, se añaden ceros iniciales al campo antes de editarlo.

v Si se desean ceros iniciales de los datos fuente, la palabra de edición debecontener una posición más que el campo que se va a editar y debe colocarse uncero en la posición de orden superior de la palabra de edición.

v En el cuerpo de la palabra de edición únicamente se cuentan como posiciones dedígitos los blancos y los caracteres de finalización de supresión de ceros (cero yasterisco). El símbolo de moneda flotante no se cuenta como una posición dedígitos.

v Cuando se utiliza el símbolo de moneda flotante, la suma del número de blancosy el carácter de finalización de supresión de ceros (posiciones de dígitos)contenido en la palabra de edición debe ser igual a o mayor que el número deposiciones del campo que se ha de editar.

v Los ceros o asteriscos que vayan a continuación del cero o asterisco situado mása la izquierda se consideran constantes; no son caracteres sustituibles.

v Al editar un campo entero sin signo, están permitidos DB y CR y siempre seimprimirán como blancos.

Edición de archivos descritos externamentePara editar la salida de archivos de disco remotos, deben especificarse códigos deedición en las especificaciones de descripción de datos (DDS).

Nota: No se pueden utilizar códigos de edición para archivos especiales.

Capítulo 13. Edición de campos numéricos 185

Page 208: RPG Referencia

186 VisualAge RPG Consulta del lenguaje

Page 209: RPG Referencia

Capítulo 14. Inicialización de los datos

En este apartado se describe cómo se inicializan los datos. La inicialización de losdatos consta de tres partes: la subrutina de inicialización (*INZSR), los códigos deoperación CLEAR y RESET y la inicialización de los datos (palabra clave INZ).Para obtener más información sobre la inicialización de componentes lógicos,consulte el apartado “Inicializar componentes lógicos” en la página 29.

Subrutina de inicialización (*INZSR)La subrutina de inicialización le permite procesar las especificaciones de cálculo. Sedeclara como cualquier otra subrutina, pero con *INZSR en el factor 1. En estasubrutina puede entrar cualquier operación, salvo la operación RESET. *INZSRtambién puede ser llamada explícitamente mediante el código de operación EXSRo CASxx.

Códigos de operación CLEAR y RESETEl código de operación CLEAR establece las variables de una ventana o estructuraen sus valores por omisión. Si especifica una estructura (formato de registro,estructura de datos o matriz), todos los campos de dicha estructura se borran en elmismo orden en que han sido declarados.

El código de operación RESET establece de una ventana o estructura en sus valoresiniciales. Puede utilizar la inicialización de la estructura de datos para asignar losvalores iniciales a los subcampos y después modificar los valores durante laejecución del programa, y utilice el código de operación RESET para establecer denuevo los valores campo en sus valores iniciales.

Inicialización de datosLos datos se inicializan con la palabra clave INZ en la especificación de definición.Puede especificar un valor inicial como un parámetro en la palabra clave, o bienpuede especificar la palabra clave sin ningún parámetro y utiliza los valoresiniciales por omisión. Los valores iniciales por omisión de los diversos tipos dedatos se describen en el Capítulo 9. Tipos de datos y formatos de datos. Consulteel Capítulo 12. Utilización de matrices y tablas para obtener información sobre lainicialización de matrices.

© Copyright IBM Corp. 1994, 2000 187

Page 210: RPG Referencia

188 VisualAge RPG Consulta del lenguaje

Page 211: RPG Referencia

Parte 3. Especificaciones

En este apartado se describen las especificaciones de VisualAge RPG:v Información común a diversas especificaciones como, por ejemplo, la sintaxis de

palabras clave y las reglas de continuación.v Todas las especificaciones se describen en el orden en que deberán ser entradas

en el programa. Cada descripción de especificación da una lista de todos loscampos de la especificación y explica todas las entradas posibles.

© Copyright IBM Corp. 1994, 2000 189

Page 212: RPG Referencia

190 VisualAge RPG Consulta del lenguaje

Page 213: RPG Referencia

Capítulo 15. Acerca de las especificaciones VisualAge RPG

El lenguaje VisualAge RPG consiste en una mezcla de código dependiente de laposición y código de formato libre. Un programa VisualAge RPG se codifica envarias especificaciones. Cada especificación tiene un conjunto específico defunciones.

Existen tres grupos de registros fuente que se pueden codificar en un programaVisualAge RPG: la sección fuente principal, la sección de subprocedimiento y lasección de datos de programa. La estructura de la sección fuente principaldepende del tipo de objeto resultante de la compilación: componente, NOMAINDLL o EXE. La sección fuente principal contiene todas las definiciones globales deun módulo. Para un destino de componente, esta sección también incluye lassubrutinas de usuario y de acción. El diseño de la sección fuente principal paracada destino de compilación se muestra en “Ubicación de definiciones y ámbito”en la página 228.

La sección de subprocedimientos contiene especificaciones que definen todos losprocedimientos codificados en un módulo. La sección de datos de programacontiene registros fuente con datos que se proporcionan en tiempo de compilación.

La ilustración siguiente muestra los tipos de registros fuente que se pueden entraren cada grupo y el orden de éstos.

Nota: El programa fuente de VisualAge RPG se debe entrar en el sistema en elorden que se muestra. Los tipos de especificación pueden estar ausentes,pero como mínimo uno debe estar presente.

© Copyright IBM Corp. 1994, 2000 191

Page 214: RPG Referencia

«H¬ Las especificaciones de control (cabecera) proporcionan información sobrela generación de programas y la ejecución del programa compilado.Consulte el apartado Capítulo 16. Especificaciones de control para obteneruna descripción de las entradas de esta especificación.

«F¬ Las especificaciones de descripción de archivo definen todos los archivosdel programa. Consulte el apartado Capítulo 17. Especificaciones dedescripción de archivo para obtener una descripción de las entradas deesta especificación.

«D¬ Las especificaciones de definición definen los elementos que se utilizan enel programa. En esta especificación se definen las matrices, las tablas, lasestructuras de datos, los subcampos, las constantes, los campos autónomos,los atributos de eventos y los prototipos y sus parámetros. Consulte elapartado Capítulo 18. Especificaciones de definición para obtener unadescripción de las entradas de esta especificación.

«I¬ Las especificaciones de entrada describen los registros y campos de losarchivos de entrada e indican cómo el programa utiliza los registros y loscampos. Consulte el apartado Capítulo 19. Especificaciones de entrada paraobtener una descripción de las entradas de esta especificación.

«C¬ Las especificaciones de cálculo describen los cálculos que ha de realizar elprograma e indican el orden en el que se llevan a cabo. Lasespecificaciones de cálculo pueden controlar ciertas operaciones de entraday salida. Cuando el destino son los componentes, esta sección incluyesubrutinas de acción y subrutinas de usuario autónomas. EXE y NOMAINDLL no tienen una sección de especificaciones de cálculo. Consulte elapartado Capítulo 20. Especificaciones de cálculo para obtener unadescripción de las entradas de esta especificación. En el apartadoCapítulo 25. Códigos de operación se describen los códigos de operaciónque se codifican en la especificación de cálculo.

** b

Datosdeprograma

Procedimiento

Cálculo

Definición

Procedimiento

Subprocedimiento

Matrizen tiempodecompilaciónydatosde tabla

Salida

Cálculo

Entrada

Definición

Descripciónarchivo

Control

P

DD

FF

HH

DD

PP

O

C

I

C

Figura 69. Orden de los tipos de especificaciones en un programa fuente VisualAge RPG

192 VisualAge RPG Consulta del lenguaje

Page 215: RPG Referencia

«O¬ Las especificaciones de salida describen los registros y los campos eindican cuándo los ha de grabar el programa. Consulte el apartadoCapítulo 21. Especificaciones de salida para obtener una descripción de lasentradas de esta especificación.

Especificaciones de subprocedimiento«P¬ Las especificaciones de procedimiento describen la definición de interfaz

de procedimiento de un programa o procedimiento con prototipo. Consulteel apartado Capítulo 22. Especificaciones de procedimiento para obteneruna descripción de las entradas de esta especificación.

«D¬ Las especificaciones de definición definen los elementos utilizados en losprocedimientos con prototipo. En esta especificación se incluyen lasdefiniciones de interfaz de procedimiento, los parámetros de entrada yotros elementos locales. Consulte el apartado Capítulo 18. Especificacionesde definición para obtener una descripción de las entradas de estaespecificación.

«C¬ Las especificaciones de cálculo llevan a cabo la lógica de un procedimientocon prototipo. Consulte el apartado Capítulo 20. Especificaciones de cálculopara obtener una descripción de las entradas de esta especificación.

Datos de programaA continuación de todas las especificaciones fuente se incluyen registros fuente condatos de programa. La primera línea de la sección de datos debe empezar con **.Si lo desea, puede indicar el tipo de datos de programa que se incluirácontinuación de **, especificando la palabra clave CTDATA . Al asociar los datosde programa con esta palabra clave, puede situar los grupos de datos de programaen cualquier orden a continuación de los registros fuente.

La primera entrada de cada registro de entrada debe empezar en la posición 1. Noes necesario rellenar todo el registro con entradas. Los elementos de matriz conentradas no utilizadas se inicializarán con el valor por omisión.

Para obtener más información acerca de cómo entrar registros de matrices entiempo de compilación, vea “Reglas para los registros fuente de matriz” en lapágina 161.

Las especificaciones que ofrecen soporte para las palabras clave (Control,Descripción de archivo, Definición y Procedimiento) permiten formato libre en loscampos de palabras clave. La especificación de cálculo permite formato libre conlos códigos de operación que ofrecen soporte para el factor 2 ampliado. De locontrario las entradas son especificas según la posición. Para representar esto, cadailustración del código VisualAge RPG está en formato de listado con una escaladibujada en la parte superior.

Esta referencia contiene una descripción detallada de las especificacionesindividuales. Se describe cada campo y sus entradas posibles. El “Capítulo 25.Códigos de operación” en la página 367, describe los códigos de operación que secodifican en la especificación de Cálculo, que se describe en el “Capítulo 20.Especificaciones de cálculo” en la página 281.

Capítulo 15. Acerca de las especificaciones VisualAge RPG 193

Page 216: RPG Referencia

Entradas comunesLas entradas siguientes son comunes a todas las especificaciones VisualAge RPG:v Las posiciones 1-5 pueden utilizarse para comentarios.v La posición 6 indica el tipo de especificación. Puede utilizar los códigos de letra

siguientes:

EntradaTipo de especificación

H Control

F Descripción de archivo

D Definición

I Entrada

C Cálculo

O Salida

P Procedimientov Sentencias de comentarios

– La posición 7 contiene un asterisco (*). Indica que se trata de una línea decomentarios independientemente de cualquier otra entrada de laespecificación.

– Las posiciones 6 - 80 están en blancov Las posiciones 7 - 80 están en blanco y la posición 6 contiene una especificación

válida. Esta es una línea válida, no un comentario, y entran en vigor las reglasde secuencia.

Sintaxis de las palabras claveLas palabras clave pueden no tener parámetros, tener parámetros opcionales otener parámetros obligatorios. La sintaxis de las palabras clave es la siguiente:

Palabra clave(parámetro1 : parámetro2)

donde:v Los parámetros van entre paréntesis ().

Nota: No se deben especificar paréntesis si no hay parámetros.v Se utilizan signos de dos puntos (:) para separar varios parámetros.

Se han utilizado los convenios de notación siguientes para mostrar qué parámetrosson opcionales y cuáles son obligatorios:v Las llaves { } indican parámetros opcionales o elementos opcionales de los

parámetros.v Unos puntos suspensivos (...) indican que el parámetro puede repetirse.v Un signo de dos puntos (:) establece una separación entre los parámetros e

indica que es posible especificar más de uno. Todos los parámetros que estánseparados por dos puntos son obligatorios a menos que vayan entre llaves.

v Una barra vertical (|) indica que sólo se puede especificar un parámetro para lapalabra clave.

v Un espacio en blanco entre los parámetros de la palabra clave indica que sepuede especificar más de uno.

Nota: Las llaves, los puntos suspensivos y las barras verticales no son parte de lasintaxis de las palabras clave y no deben figurar en el fuente.

194 VisualAge RPG Consulta del lenguaje

Page 217: RPG Referencia

Tabla 26. Ejemplos de notación de palabras clave

Notación Ejemplo de notaciónutilizada

Descripción Ejemplo defuente entrado

llaves {} PRTCTL (data_struct{:*COMPAT})

El parámetro data_struct esobligatorio y el parámetro*COMPAT es opcional.

PRTCTL(data_struct1)

llaves {} TIME(format{separator})

El parámetro format{separator} esobligatorio, pero la parte{separator} del parámetro esopcional.

TIME(*HMS&)

dos puntos(:)

RENAME(Ext_format:Int_format)

Los parámetros Ext_format yInt_format son obligatorios.

RENAME(nameE: nameI)

puntossuspensivos(...)

IGNORE(recformat{:recformat...})

El parámetro recformat esobligatorio y puede especificarsemás de una vez.

IGNORE(recformat1:recformat2:recformat3)

barravertical (|)

FLTDIV{(*NO |*YES)}

Especificar *NO o *YES o ningúnparámetro.

FLTDIV

espacio enblanco

OPTIONS(*OMIT*VARSIZE *STRING*RIGHTADJ)

Uno de los parámetros *OMIT,*VARSIZE, *STRING o*RIGHTADJ es obligatorio ypuede especificarse más de uno.

OPTIONS(*OMIT:*VARSIZE:*STRING:*RIGHTADJ)

Reglas de continuaciónLos campos que pueden continuarse son:v El campo de palabras clave de la especificación de controlv El campo de palabras clave de la especificación de descripción de archivov El campo de palabras clave de la especificación de definiciónv El campo factor 2 ampliado de la especificación de cálculov El campo constante/palabra de edición en la especificación de salidav El campo Nombre en la definición o la especificación de procedimiento

Las reglas generales para la continuación son las siguientes:v La línea de continuación debe ser una línea válida para la especificación que se

está continuando (H, F, D, C o O en la posición 6).v No debe utilizarse caracteres especiales cuando se continúa especificaciones en

varias líneas, excepto cuando debe dividirse un literal o nombre. Por ejemplo,los siguientes pares de líneas son equivalentes. En el primer par, el signo más (+)es un operador, aún cuando aparezca al final de una línea. En el segundo par, elsigno más es un carácter de continuación.C eval x = a + bC eval x = a +C b

C eval x = 'abc'C eval x = 'ab+C c'

v Únicamente se permiten líneas en blanco, líneas de especificación vacías o líneasde comentario entre líneas continuadas.

v La continuación puede aparecer después de un símbolo completo. Los símbolosson:– Nombres (por ejemplo, palabras clave, nombres de archivo, nombres de

campo)

Capítulo 15. Acerca de las especificaciones VisualAge RPG 195

Page 218: RPG Referencia

– Paréntesis– El carácter separador (:)– Operadores de expresión– Funciones incorporadas– Palabras especiales– Literales

v También puede producirse una continuación en un literal:– En el caso de los literales de caracteres, fecha, hora e indicación de la hora:

- Un guión (-) indica que la continuación está en la primera posicióndisponible del campo continuado

- Un signo más (+) indica continuación con el primer carácter no en blanco odespués de la primera posición del campo continuado

– Para los literales gráficos:- Puede utilizarse el guión (-) o el signo más (+) para indicar una

continuación.– Para los literales numéricos:

- Se utiliza un carácter no de continuación- Un literal numérico continúa con un carácter numérico o coma decimal en

la línea de continuación del campo continuado– Para los literales hexadecimales y UCS-2:

- Puede utilizarse un guión (-) o un signo más (+) para indicar unacontinuación

- El literal se continuará con el primer carácter no en blanco en la líneasiguiente

v También puede tener lugar una continuación dentro de un nombre en entradasde formato libre– En la entrada de nombres para especificaciones de Definición y

procedimiento. Para obtener más información acerca de la continuación denombres en la entrada de nombres, vea “Campo de nombre de especificaciónde definición y procedimiento” en la página 199.

– En la entrada de palabras clave para especificaciones de Archivo y definición.– En la entrada de factor 2 ampliado de las especificaciones de Cálculo.

En todos los casos, el nombre se continúa codificando con puntos suspensivos(...) al final del nombre parcial, sin espacios en blanco.

196 VisualAge RPG Consulta del lenguaje

Page 219: RPG Referencia

Campo de palabras clave de especificación de controlLa regla para la continuación de la especificación de control es que laespecificación continúa en la posición 7 o en la posición posterior de laespecificación de control siguiente.

Campo de palabras clave de especificación de descripción dearchivoLas reglas de continuación en la especificación de descripción de archivo son lassiguientes:v La especificación continúa en la posición 44 o en la posición posterior de la

especificación de descripción de archivo siguientev Las posiciones 7-43 de la línea de continuación deben estar en blanco

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8DName++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++D Keywords-cont++++++++++++++++++++++++* Definir un campo de 10 caracteres con un nombre largo.* La segunda definición es un puntero inicializado con la dirección* de la variable con el nombre largo.D NombreDeCampoBastanteLargoQueNoSiempreCabeEnUnaLínea...D S 10AD Ptr S * inz(%addr(NombreDeCampoBastanteLargo...D QueNoSiempreCabe...D EnUnaLínea))D NombreCorto S 5A

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8CSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++++++C Extended-factor2-++++++++++++++++++++++++++++* Utilizar el nombre largo en una expresión* Puede dividirse el nombre siempre que sea necesario.C EVAL NombreDeCampoBastanteLargoQue...C NoSiempreCabeEnUnaLínea = 'abc'

* Puede dividirse así cualquier nombreC EVAL P...C tr = %addr(Nombre...C Corto)

Figura 70. Ejemplo

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8HKeywords++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++H DATFMT(H *MDY&H )

Figura 71. Continuación en una especificación de control

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8FFilename++IT.A.FRlen+......A.Device+.Keywords++++++++++++++++++++++++++++F RECNOF (F *INU1F )

Figura 72. Campo de palabras clave de especificación de descripción de archivo

Capítulo 15. Acerca de las especificaciones VisualAge RPG 197

Page 220: RPG Referencia

Campo de palabras clave de especificación de definiciónLas reglas para la continuación de la especificación de definición son:v La especificación continúa en la posición 44 ó en una posición posterior de la

especificación de definición siguiente dependiendo del carácter de continuaciónespecificado.

v Las posiciones 7-43 de la línea de continuación deben estar en blanco.

Factor 2 ampliado de especificación de cálculoLas reglas para la continuación de la especificación de cálculo son:v La especificación continúa en la posición 36 o en una posición posterior de la

siguiente especificación de cálculov Las posiciones 7-35 de la línea de continuación deben estar en blanco.

Campo de constante/palabra de edición de especificación desalidaLas reglas para la continuación de la especificación de salida son:

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++D Keywords-cont++++++++++++++++++++++++*

DMARY C CONST(D 'Cinco lobitos tiene la loba, blancos-D* Aquí sólo se permite una línea de comentarios o completamente en blancoD y negros detrás de la escoba.'D )D* Literal numérico, continúa con la primera posición no en blancoD* en/posterior a la posición 44D*DNUMERIC C 12345D 67D* Constante con nombre de gráficosDGRAF C G'AABBCCDD+D EEFFGG'

Figura 73. Ejemplo de campo de palabras clave de especificación de definición

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8CSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++++++C Extended-factor2-++++++++++++++++++++++++++++*

C EVAL MARY='Cinco lobitos tiene la loba, blancos +C* Aquí sólo se permite una línea de comentarios o completamente en blancoC y negros detrás de la escoba.'C*C* Continuación de la expresión aritmética, NO un carácter deC* continuaciónCC EVAL A = (B*D)/ C +C 24C* La primera utilización de '+' en este ejemplo es el operador deC* concatenación. La segunda utilización es la continuación delC* literal de carácterC EVAL ERRMSG = NAME +C ' no se ha encontrado +C en el archivo.'

Figura 74. Ejemplo de factor 2 ampliado de especificación de cálculo

198 VisualAge RPG Consulta del lenguaje

Page 221: RPG Referencia

v La especificación continúa en la posición 53 o en una posición posterior de lasiguiente especificación de salida

v Las posiciones 7-52 de la línea de continuación deben estar en blanco.

Campo de nombre de especificación de definición yprocedimientoLas reglas para la continuación del nombre en las especificaciones de la definicióny del procedimiento son:v Las reglas de continuación se aplican a nombres con más de 15 caracteres.

Cualquier nombre (incluso alguno con 15 caracteres o menos) puede continuaren varias líneas si se codifican puntos suspensivos (...) al final del nombreparcial.

v Una definición de nombre consta de los componentes siguientes:1. Cero o más líneas de nombre continuadas. Las líneas de nombre continuadas

se identifican al tener puntos suspensivos como últimos caracteres no enblanco de la entrada. El nombre debe empezar dentro de las posiciones 7 - 21y puede finalizar en cualquier lugar hasta la posición 77 (finalizando lospuntos suspensivos en la posición 80). No puede haber espacios en blancoentre los caracteres del principio del nombre y los puntos suspensivos (...) .Si alguna de estas condiciones no es verdadera, la línea se considera comouna línea de definición principal.

2. Una línea de definición principal que contenga el nombre, los atributos dedefinición y las palabras clave. Si se codifica una línea de nombrecontinuada, la entrada de nombre de la línea de definición principal sepuede dejar en blanco.

3. Cero o más líneas de continuación de palabra clave.

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8*

O.............N01N02N03Field+++++++++YB.End++PConstant/editword/DTformat+++O Continue Constant/editword+++

O 80 'Cinco lobitos tiene la loba-O* Aquí sólo se permite una línea de comentarios o completamente en blancoO , blancos y negros '

Figura 75. Ejemplo de campo de constante/palabra de edición de especificación de salida

Capítulo 15. Acerca de las especificaciones VisualAge RPG 199

Page 222: RPG Referencia

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8DName++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++D Keywords-cont++++++++++++++++++++++++D* Nombre largo sin líneas de nombre continuados:D RatherLongName S 10AD* Nombre largo que utiliza 1 línea de nombre continuado:D NameThatIsEvenLonger...D C 'Esta es la constante -D que representa el nombre.'D* Nombre largo que utiliza 1 línea de nombre continuado:D NameThatIsSoLongItMustBe...D Continued S 10AD* Las matrices de tiempo de compilación pueden tener nombres largos:D CompileTimeArrayContainingDataRepresentingTheNamesOfTheMonthsOf...D TheYearInGermanLanguage...D S 20A DIM(12) CTDATA PERRCD(1)D* Nombre largo que utiliza 3 líneas de nombre continuado:D ThisNameIsSoMuchLongerThanThe...D PreviousNamesThatItMustBe...D ContinuedOnSeveralSpecs...D PR 10AD parm_1 10A VALUECSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C* Nombres largos definidos en espec. cálc:C LongTagName TAGC *LIKE DEFINE RatherLongNameQuiteLongName +5PName+++++++++++..B...................Keywords+++++++++++++++++++++++++++++PContinuedName+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++P* Nombre largo especificado en espec. Procedimiento:P ThisNameIsSoMuchLongerThanThe...P PreviousNamesThatItMustBe...P ContinuedOnSeveralSpecs...P BD ThisNameIsSoMuchLongerThanThe...D PreviousNamesThatItMustBe...D ContinuedOnSeveralSpecs...D PI 10AD parm_1 10A VALUED* Cuerpo del procedimientoD*P ThisNameIsSoMuchLongerThanThe...P PreviousNamesThatItMustBe...P ContinuedOnSeveralSpecs...P E

Figura 76. Definición de nombres largos en RPG

200 VisualAge RPG Consulta del lenguaje

Page 223: RPG Referencia

Capítulo 16. Especificaciones de control

La sentencia de especificación de control, identificada mediante una H en lacolumna 6, proporciona información acerca de la generación y la ejecución deprogramas. Esta información se proporciona al compilador mediante unaespecificación de control incluida en el fuente. Si no se incluye ningunaespecificación de control, se asignan los valores por omisión a las palabras clave dela especificación de control.

Vea los valores por omisión en la descripción de las entradas individuales.

Las palabras clave de especificación de control se aplican a nivel modular, lo quesignifica que si existe más de un procedimiento codificado en un módulo, losvalores especificados en la especificación de control se aplican a todos losprocedimientos.

Sentencia de especificación de controlLa especificación de control consta únicamente de palabras clave. Las palabrasclave pueden situarse en cualquier lugar entre las posiciones 7 a 80. Las posiciones81-100 pueden utilizarse para comentarios.

Lo siguiente es un ejemplo de una especificación de control:

Posición 6 (Tipo de formulario)En la posición 6 debe aparecer una H para identificar esta línea como laespecificación de control.

Posiciones 7-80 (Palabras clave)Las palabras clave de especificación de control se utilizan para determinar cómomaneja el programa los dispositivos y cómo se representan ciertos tipos deinformación.

Sintaxis de las palabras claveLas palabras clave de especificación de control pueden no tener parámetros,parámetros opcionales ni parámetros obligatorios. La sintaxis de las palabras clavees la siguiente:

Palabra clave(parámetro1 : parámetro2)

donde:v Los parámetros van entre paréntesis ().

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8 ...+... 9 ...+... 10HKeywords++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Comments++++++++++++

Figura 77. Diseño de especificación de control

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8HKeywords++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++H CURSYM('$') DATEDIT(*MDY) DATFMT(*MDY/)H DECEDIT('.') TIMFMT(*ISO)

© Copyright IBM Corp. 1994, 2000 201

Page 224: RPG Referencia

Nota: No especifique paréntesis si no hay parámetros.v Se utilizan signos de dos puntos (:) para separar varios parámetros.

Se han utilizado los convenios de notación siguientes para mostrar qué parámetrosson opcionales y cuáles son obligatorios:v Las llaves { } indican parámetros opcionales o elementos opcionales de los

parámetros.v Unos puntos suspensivos (...) indican que el parámetro puede repetirse.v Un signo de dos puntos (:) establece una separación entre los parámetros e

indica que es posible especificar más de uno. Todos los parámetros que estánseparados por dos puntos son obligatorios a menos que vayan entre llaves.

v Una barra vertical (|) indica que sólo se puede especificar un parámetro para lapalabra clave.

v Un espacio en blanco entre los parámetros de la palabra clave indica que sepuede especificar más de uno.

Nota: Las llaves, los puntos suspensivos y las barras verticales no son parte de lasintaxis de las palabras clave y no deben figurar en el fuente.

Si se necesita más espacio para las palabras clave de especificación de control, elcampo de palabra clave puede continuarse en las líneas que le siguen. Consulte losapartados “Sentencia de especificación de control” en la página 201 y “Campo depalabras clave de especificación de control” en la página 197.

ALWNULL(*NO | *INPUTONLY | *USRCTL)La palabra clave ALWNULL especifica cómo se utilizarán los registros quecontienen campos con posibilidad de nulos procedentes de archivos de base dedatos descritos externamente.

Si se especifica ALWNULL(*NO), no se podrán procesar aquellos registros quetengan campos con posibilidad de nulos procedentes de archivos descritosexternamente. Si intenta recuperar un registro que contenga valores nulos, ningunode los datos del registro será accesible y se producirá un error de correlación dedatos.

Si se especifica ALWNULL(*INPUTONLY), se podrán leer satisfactoriamente losregistros que tengan campos con posibilidad de nulos que contengan valores nulosprocedentes de archivos de base de datos de sólo entrada descritos externamente.Cuando se recupere un registro que contenga valores nulos, no se produciráningún error de correlación de datos y los valores por omisión de la base de datosse colocarán en los campos que contengan valores nulos. No obstante, no se puedehacer lo siguiente:v Utilizar campos de clave con posibilidad de nulosv Crear o actualizar registros que contengan campos con posibilidad de nulosv Determinar si un campo con posibilidad de nulos es realmente nulo mientras se

ejecuta el programav Establecer un campo con posibilidad de nulos de manera que sea nulo.

Si se especifica ALWNULL(*USRCTL), se podrán leer, grabar y actualizar registroscon valores nulos procedentes de archivos de base de datos descritos externamente.Los registros con claves nulas pueden recuperarse utilizando operaciones porclave. Se puede determinar si un campo con posibilidad de nulos es realmentenulo y se puede establecer un campo con posibilidad de nulos de manera que seanulo para salida o actualización. Es responsabilidad suya el asegurarse de que loscampos que contienen valores nulos se utilicen correctamente.

202 VisualAge RPG Consulta del lenguaje

Page 225: RPG Referencia

Si no se especifica la palabra clave ALWNULL, se utilizará el valor especificado enel mandato.

Si desea obtener más información, consulte el apartado “Soporte de valores nulosde base de datos” en la página 128

CACHE(*YES | *NO)La palabra clave CACHE especifica que la aplicación utilizará las descripciones dearchivos remotos que están almacenadas en la carpeta de antememoria de laestación de trabajo. La primera vez que se utilice la opción CACHE(*YES), secreará una lista de descripciones de archivos remotos. Cada vez que se utilice conposterioridad, el proceso de compilación accederá a esta información en lugar deacceder a los archivos de AS/400.

CACHEREFRESH(*YES | *NO)La palabra clave CACHEREFRESH especifica que las descripciones de archivosremotos que hay en la carpeta de antememoria deben actualizarse antes de quecomience el proceso de compilación. Si especifica CACHE(*NO), se utilizarán lasdescripciones existentes de archivos remotos.

CCSID(*GRAPH : parámetro | *UCS2 : número)Esta palabra clave establece los códigos CCSID gráfico (*GRAPH) y UCS-2(*UCS-2) por omisión del módulo. Estos valores por omisión se utilizan en losdatos de tiempo de compilación, campos de entrada y salida descritos por elprograma y definiciones de datos que no codifiquen la palabra clave CCSID.

CCSID(*GRAPH : *IGNORE | *SRC | número)Establece el CCSID gráfico por omisión del módulo. Los valores posiblesson:

*IGNOREPor omisión, esta opción está seleccionada. No se permiten lasconversiones entre campos gráficos y UCS-2 en el módulo. No puedeutilizarse la función incorporada %GRAPH.

*SRCSe utilizará el CCSID gráfico asociado al CCSID del archivo fuente.

númeroUn CCSID gráfico.

CCSID(*UCS2 : número)Establece el CCSID UCS-2 por omisión del módulo. Si no se especifica estapalabra clave, el valor que toma por omisión el CCSID UCS-2 es 13488.

número debe ser un CCSID UCS-2. Los códigos CCSID válidos son 13844 y17584 (que incluye el Euro).

Si se especifica CCSID(*GRAPH : *SRC) o CCSID(*GRAPH : número):v Los campos gráficos y UCS-2 de las estructuras de datos descritas externamente

utilizarán el CCSID del archivo externo.v Los campos gráficos o UCS-2 descritos por el programa utilizarán el CCSID

gráfico o UCS-2 por omisión del módulo, respectivamente. Esta especificaciónpuede alterarse temporalmente utilizando la palabra clave CCSID(número) en ladefinición del campo. (Véase “CCSID(número | *DFT)” en la página 239.)

v Se asume que los campos y claves de entrada y salida gráficos o UCS-2 descritospor el programa tienen el CCSID por omisión del módulo.

Capítulo 16. Especificaciones de control 203

Page 226: RPG Referencia

COPYNEST(número)La palabra clave COPYNEST especifica la profundidad máxima a la que se puedellevar la jerarquización para instrucciones /COPY. La profundidad puede sermayor o igual a 1 y menor o igual a 2048. La profundidad por omisión es 32.

COPYRIGHT(’serie de copyright’)La palabra clave COPYRIGHT proporciona información de copyright. La serie decopyright es un literal de caracteres con una longitud máxima de 256. El literalpuede seguir en una especificación de continuación. (En el apartado “Reglas decontinuación” en la página 195 hallará la reglas que rigen para la utilización delíneas de continuación.) Si no se especifica la palabra clave COPYRIGHT, lainformación de copyright no se añade al módulo o programa creado.

CURSYM(’sim’)La palabra clave CURSYM especifica un carácter utilizado como un símbolo demoneda en la edición. El símbolo debe ser un solo carácter entre comillas. Sepuede utilizar cualquier carácter del juego de caracteres VisualAge RPG. (Véase“Capítulo 1. Nombres simbólicos y palabras reservadas” en la página 3.) Loscaracteres siguientes son excepciones:

0 (cero) * (asterisco) , (coma)

& (símbolo &) . (punto) − (signo más)

C (letra C) R (letra R) Blanco

Si no se especifica la palabra clave, el símbolo del dólar ($) es el valor por omisiónpara el símbolo de moneda.

CVTOEM(*YES | *NO)La palabra clave CVTOEM especifica que debe utilizarse la conversión OEMcuando se realizan operaciones de E/S en los archivos locales. Si se especificaCVTOEM(*NO), no se llevará a cabo la conversión OEM.

CVTOPT(*{NO}VARCHAR *{NO}VARGRAPHIC)La palabra clave CVTOPT sirve para determinar cómo manejará el compiladorVARPG los tipos de datos de longitud variable que se recuperen de archivos debase de datos descritos externamente.

Se puede especificar parte o la totalidad de los tipos de datos en el orden en quese desee. No obstante, si se especifica un tipo de datos, no se puede utilizar elparámetro *NOxxxx correspondiente a dicho tipo de datos y viceversa. Porejemplo, si especifica *VARCHAR, no puede especificar *NOVARCHAR yviceversa. Separe los parámetros un signo de dos puntos. El mismo parámetro nopuede especificarse más de una vez.

Nota: Si la palabra clave CVTOPT no contiene un miembro de un par, se utilizaráel valor especificado en el mandato para el tipo de datos en concreto. Porejemplo, si se especifica la palabra clave CVTOPT(*NOVARCHAR) en laespecificación de control, para el par (*VARGRAPHIC, *NOVARGRAPHIC)se utilizará lo que se haya especificado de forma implícita o explícita en elmandato.

204 VisualAge RPG Consulta del lenguaje

Page 227: RPG Referencia

Si se especifica *VARCHAR, los datos de tipo carácter de longitud variable sedeclaran como campos de tipo carácter de longitud fija.

Si se especifica *NOVARCHAR, no se convertirán los datos de tipo carácter delongitud variable.

Si se especifica *VARGRAPHIC, los datos de tipo gráfico DBCS (juego de caracteresde doble byte) de longitud variable se declaran como campos de tipo carácter delongitud fija.

Si se especifica *NOVARGRAPHIC, no se convertirán los datos de tipo gráficoDBCS (juego de caracteres de doble byte) de longitud variable.

Si no se especifica la palabra clave CVTOPT, se utilizarán los valores especificadosen el mandato.

DATEDIT(fmt{separador})La palabra clave DATEDIT especifica el formato de los campos numéricos cuandose utiliza el código de edición Y. El carácter separador es opcional. El valor (fmt)puede ser *DMY, *MDY o *YMD. El separador por omisión es /. Puede utilizarseel carácter separador & para especificar un separador en blanco.

DATFMT(fmt{separador})La palabra clave DATFMT especifica el formato de fecha interno para los literalesde fecha y el formato por omisión para los campos de fecha dentro del programa.Puede especificar un formato de fecha interno diferente para un campodeterminado especificando el formato con la palabra clave DATFMT en laespecificación de definición para dicho campo.

El valor por omisión es el formato *ISO. Para obtener más información acerca delos formatos externos, consulte el apartado “Formatos internos y externos” en lapágina 95.

En la Tabla 27 se describen los diferentes formatos de fecha y sus separadores.

Tabla 27. Formatos de fecha externos para tipos de datos de fecha

NombreRPG

Descripción Formato(separador poromisión)

Separadoresválidos

Longitud Ejemplo

*MDY Mes/Día/Año mm/dd/aa / - . , ’&’ 8 01/15/91

*DMY Día/Mes/Año dd/mm/aa / - . , ’&’ 8 15/01/91

*YMD Año/Mes/Día aa/mm/dd / - . , ’&’ 8 91/01/15

*JUL Juliana aa/ddd / - . , ’&’ 6 91/015

*ISO International Standards Organization aaaa-mm-dd - 10 1991-01-15

*USA Estándar EE.UU. IBM mm/dd/aaaa / 10 01/15/1991

*EUR Estándar europeo IBM dd.mm.aaaa . 10 15.01.1991

*JIS Estándar industrial japonés eracristiana

aaaa-mm-dd - 10 1991-01-15

DEBUG{(*NO | *YES)}La palabra clave DEBUG determina si se genera información de depuración.

Capítulo 16. Especificaciones de control 205

Page 228: RPG Referencia

Si no se especifica esta palabra clave o bien si se especifica con *NO, no segenerará información de compilación alguna.

DECEDIT(’valor’)Esta palabra clave especifica el carácter utilizado como coma decimal paranúmeros decimales editados. Los ceros iniciales se imprimen cuando el valorabsoluto del número es menor que 1. El valor por omisión es ’.’ (punto).

Los valores posibles son:

’.’ La coma decimal es un punto; no se imprime el cero inicial (.123)

’,’ La coma decimal es una coma; no se imprime el cero inicial (,123)

’0.’ La coma decimal es un punto; se imprime el cero inicial (0.123)

’0,’ La coma decimal es una coma; se imprime el cero inicial (0,123)

EXELa palabra clave EXE indica que se trata de un módulo compuesto de unprocedimiento principal y de subprocedimientos. Todas las subrutinas (BEGSR)deben ser locales a un procedimiento. El EXE debe contener un procedimientocuyo nombre coincida con el nombre del archivo fuente. Será el punto de entradaprincipal para el EXE, es decir, el procedimiento principal.

Para módulos EXE, debe tener en cuenta lo siguiente:v En este fuente no se permiten códigos de operación GUI, lo que incluye START,

STOP, SETATR, GETATR, %SETATR, %GETATR, SHOWWIN, CLSWIN yREADS. Se puede utilizar DSPLY.

v No se permiten *INZSR y *TERMSR.v No se permiten parámetros *ENTRY.

Si existen parámetros de entrada, se especifican en la definición de parámetrospara el procedimiento principal y se deben pasar por valor, es decir, se debeespecificar la palabra clave VALUE para cada parámetro.v La palabra clave EXPORT no está permitida en la especificación P Begin.v El valor de retorno para el procedimiento principal se debe definir como un

número binario o entero de precisión cero(0).

EXPROPTS(*MAXDIGITS | *RESDECPOS)La palabra clave EXPROPTS (opciones de expresión) especifica el tipo de reglas deprecisión que deben utilizarse para un programa completo. Si no se especifica o sise especifica con *MAXDIGITS, se aplican las reglas de precisión por omisión. Si seespecifica EXPROPTS, con *RESDECPOS, se aplican las reglas de precisión de″Posición decimal de resultado″ y se fuerzan los resultados intermedios en lasexpresiones para que no tengan menos posiciones decimales que el resultado.

Nota: Los ampliadores de códigos de operaciones R y M son los mismos queEXPROPTS(*RESDECPOS) y EXPROPTS(*MAXDIGITS) respectivamente,pero para expresiones individuales de formato libre.

EXTBININT{(*NO | *YES)}La palabra clave EXTBININT se utiliza para procesar campos descritosexternamente con formato externo binario y cero posiciones decimales como siestuvieran en formato de entero externo. Si no se especifica o si se especifica con*NO, un campo binario descrito externamente se procesa con un formato binario

206 VisualAge RPG Consulta del lenguaje

Page 229: RPG Referencia

externo. Si se especifica EXTBININT, opcionalmente con *YES, un campo descritoexternamente se procesa tal y como se indica a continuación:

Definición DDS Formato externo RPGB(n,0) donde 1 ≤ n ≤ 4 I(5)B(n,0) donde 5 ≤ n ≤ 9 I(10)

Al especificar la palabra clave EXTBININT, el programa puede utilizar todo elrango de valores binarios DDS disponibles. (El rango de valores binarios DDS es elmismo que para los enteros con signo: de -32768 a 32767 para un campo de 5dígitos o de -2147483648 a 2147483647 para un campo de 10 dígitos.)

Nota: Cuando se especifica la palabra clave EXTBININT, todos los subcamposdescritos externamente que sean binarios con posiciones decimales cero sedefinen con un formato de entero interno.

FLTDIV{(*NO | *YES)}La palabra clave FLTDIV indica que todas las operaciones de división de lasexpresiones se calculan en punto flotante y devuelven un valor de tipo flotante. Sino se especifica o si se especifica con *NO, las operaciones de división se llevan acabo en formato decimal empaquetado (a menos que uno de los dos operandos yaesté en formato flotante).

Si se especifica FLTDIV, opcionalmente con *YES, todas las operaciones de divisiónse llevan a cabo en formato flotante (garantizando que el resultado siempre tenga15 dígitos de precisión).

GENLVL(número)La palabra clave GENLVL controla la creación del objeto. El objeto se crea si elnivel de gravedad de todos los errores que se han encontrado en el transcurso decompilación es menor o igual que el nivel de gravedad de generación especificado.El valor debe estar comprendido entre 0 y 20, inclusive. Si los errores superan elnivel de gravedad 20, no se creará el objeto.

Si no se especifica la palabra clave GENLVL, se utilizará el valor especificado en elmandato.

INDENT(*NONE | ’valor-carácter’)La palabra clave INDENT especifica si se debe sangrar las operacionesestructuradas en el listado de fuente con el fin de facilitar la lectura de las mismas.También especifica los caracteres que se utilizarán para marcar las cláusulas de lasoperaciones estructuradas.

Si se especifica *NONE, no se sangrarán las operaciones estructuradas en el listadodel fuente.

Si se especifica valor-carácter, se sangrará el listado del fuente en las cláusulas delas operaciones estructuradas. Se marcará la alineación de las sentencias y de lascláusulas utilizando los caracteres que desee. Puede escoger un literal cualquieraque tenga una longitud máxima de 2 caracteres.

Nota: Es posible que el sangrado no aparezca tal y como estaba previsto si hayerrores en el fuente.

Capítulo 16. Especificaciones de control 207

Page 230: RPG Referencia

Si no se especifica la palabra clave INDENT, se utilizará el valor especificado en elmandato.

INTPREC(10 | 20)La palabra clave INTPREC se utiliza para especificar la precisión decimal de losvalores intermedios enteros y sin signo en las operaciones de aritmética binaria queocurren en las expresiones. Los valores intermedios enteros y sin signo semantienen siempre en el formato de 8 bytes. Esta palabra clave afecta solamente almodo en que se convierten los valores intermedios enteros y sin signo a formatodecimal cuando se utilizan en operaciones de aritmética binaria (+, -, *, /).

INTPREC(10), el valor por omisión, indica una precisión decimal de 10 dígitos paralas operaciones enteras y sin signo. No obstante, si por lo menos un operando dela expresión es un campo entero o sin signo de 8 bytes, el resultado de la expresióntiene una precisión decimal de 20 dígitos a pesar del valor de INTPREC.

INTPREC(20) indica que la precisión decimal de las operaciones de entero y sinsigno es de 20 dígitos.

LIBLIST(’archivo1 archivo2 ... archivon’)La palabra clave LIBLIST especifica la lista de archivos de biblioteca que debeutilizarse a la hora de enlazar la aplicación. Los nombres de archivo deben irseparados por un espacio en blanco y la lista debe ir entre apóstrofos. Si alguno delos nombres de archivo contiene espacios en blanco, debe ir entre comillas dobles.

NOMAINLa palabra clave NOMAIN indica que no existe ninguna acción, ni subrutinas deusuario autónomas en el módulo. Un módulo NOMAIN únicamente contienesubprocedimientos. El objeto resultante de la compilación es una DLL, que puedenutilizar otras aplicaciones.

Para las DLL NOMAIN, debe tenerse en cuenta lo siguiente:v La DLL sólo debe constar de procedimientos. Todas las subrutinas (BEGSR)

deben ser locales a un procedimiento.v En este fuente no se permiten códigos de operación GUI, lo que incluye START,

STOP, SETATR, GETATR, %SETATR,%GETATR;, SHOWWIN, CLSWIN yREADS. Se puede utilizar DSPLY. No obstante, si se llama al procedimiento quelo contiene desde una DLL VisualAge RPG, el código de operación DSPLY norealiza ninguna función.

v No se permite *INZSR; ni *TERMSR;.v No se permiten parámetros *ENTRY;.

Vea Programación con VisualAge para RPG para obtener más información acerca dela codificación y la llamada de varios procedimientos.

OPTION(*{NO}XREF *{NO}GEN *{NO}SECLVL *{NO}SHOWCPY*{NO}EXPDDS *{NO}EXT *{NO}SHOWSKP)

La palabra clave OPTION especifica las opciones que deben utilizarse al compilarel miembro fuente.

Se puede especificar parte o la totalidad de las opciones en el orden en que sedesee. No obstante, si se especifica una opción de compilación, no se puede utilizarel parámetro *NOxxxx correspondiente a dicha opción de compilación y viceversa.

208 VisualAge RPG Consulta del lenguaje

Page 231: RPG Referencia

Por ejemplo, si especifica *XREF, no puede especificar también *NOXREF yviceversa. Separe las opciones con un signo de dos puntos. La misma opción nopuede especificarse más de una vez.

Nota: Si la palabra clave OPTION no contiene un miembro de un par, se utilizaráel valor especificado en el mandato para la opción en concreto. Por ejemplo,si se especifica la palabra clave OPTION(*XREF : *NOGEN : *NOSECLVL :*SHOWCPY) en la especificación de control, para los pares (*EXT, *NOEXT),(*EXPDDS, *NOEXPDDS) y (*SHOWSKP, *NOSHOWSKP) se utilizará lo quese haya especificado de forma implícita o explícita en el mandato.

Si se especifica *XREF, se elaborará un listado de referencias cruzadas (segúnconvenga) para el miembro fuente. *NOXREF indica que no se elaborará ningúnlistado de referencias cruzadas.

Si se especifica *GEN, se creará un objeto programa si el nivel de gravedad másalto devuelto por el compilador no supera el nivel de gravedad especificado en laopción GENLVL. *NOGEN no crea ningún objeto.

Si se especifica *SECLVL, se imprimirá el texto de los mensajes de segundo nivelen la línea que sigue al texto de los mensajes de primer nivel en la sección deresumen de mensajes. *NOSECLVL no imprimirá el texto de los mensajes desegundo nivel en la línea que sigue al texto de los mensajes de primer nivel.

Si se especifica *SHOWCPY, en el listado del compilador figurarán los registrosfuente de los miembros incluidos por la directiva del compilador /COPY.*NOSHOWCPY no muestra los registros fuente de los miembros incluidos por ladirectiva del compilador /COPY.

Si se especifica *EXPDDS, en la información de los campos de clave y en el listadose visualizará la ampliación de los archivos descritos externamente. *NOEXPDDSno muestra en la información de los campos de clave ni en el listado la ampliaciónde los archivos descritos externamente.

Si se especifica *EXT, en el listado se incluirán los procedimientos y camposexternos a los que se hecho referencia en el transcurso de la compilación. *NOEXTno muestra en el listado la lista de los procedimientos y campos externos a los quese hecho referencia en el transcurso de la compilación.

Si se especifica *SHOWSKP, se mostrarán todas las sentencias en la parte del fuentedel listado, independientemente de si el compilador se las ha saltado o no.*NOSHOWSKP no muestra en la parte del fuente del listado las sentencias que seha saltado el compilador. El compilador se salta sentencias como resultado de lasdirectivas /IF, /ELSEIF o /ELSE.

Si no se especifica la palabra clave OPTION, se utilizarán los valores especificadosen el mandato.

SQLBINDFILE(’archivo’)La palabra clave SQLBINDFILE especifica que se puede crear un archivo de enlaceSQL. Si lo desea, puede especificar un nombre de archivo de enlace totalmentecalificado entre apóstrofos. Dicho nombre puede tener una longitud máxima de 8caracteres.

Capítulo 16. Especificaciones de control 209

Page 232: RPG Referencia

Un archivo de enlace permite a la aplicación retrasar el enlace a una base de datosy acceder a muchas bases de datos. Esto se lleva a cabo utilizando el mandatoSQLBIND antes de ejecutar la aplicación.

No se generará ningún archivo de paquete a menos que se especifique la palabraclave SQLPACKAGENAME. Las aplicaciones se pueden construir con enlacehabilitado, es decir, con la palabra clave SQLPACKAGENAME especificada, o conenlace diferido (sin nombre de paquete). La construcción con el enlace habilitadogenera un archivo de paquete y lo almacena en la base de datos. La construccióncon el enlace diferido extrae del archivo fuente los datos necesarios para crear elpaquete y almacena esta información en un archivo de enlace.

SQLDBBLOCKING(*YES | *NO)La palabra clave SQLDBBLOCKING especifica si se realiza una agrupación porbloques en algún cursor. Especifique SQLDBBLOCKING(*YES) para realizar unaagrupación por bloques en algún cursor.

Si utiliza la agrupación de registros por bloques y especificaSQLISOLATIONLVL(*RR), un nivel de aislamiento de cursor de sólo lectura, elGestor de Bases de Datos del servidor de base de datos devolverá un bloque defilas al cliente de base de datos en una transmisión de red. Estas filas se recuperande una en una del cliente de base de datos cuando el Gestor de Bases de Datosprocesa una petición FETCH. Cuando todas las filas del bloque se hayanrecuperado mediante la operación FETCH, el Gestor de Bases de Datos del clientede base de datos envía otra petición a la base de datos remota, hasta que serecuperan todas las filas de salida.

La agrupación de registros por bloques puede dar resultados que no seantotalmente coherentes con la base de datos cuando se utiliza con los niveles deaislamiento de estabilidad de cursor, SQLISOLATIONLVL(*CS), o lectura nocomprometida, SQLISOLATIONLVL(*UR). Con la estabilidad de cursor y la lecturano comprometida, la fila que la aplicación está recuperando del bloque no sebloquea en la base de datos remota. Por lo tanto, otra aplicación puede estaractualizando la fila de la base de datos mientras su aplicación está leyendo la filadel bloque. Si se especifica el nivel de aislamiento de lectura repetible, se bloqueantodas las filas de la base de datos a las que se accede hasta que finaliza la unidadde trabajo, pero restringe las actualizaciones por parte de otros procesos.

Especifique SQLDBBLOCKING(*NO) si no desea que se efectúe ningunaagrupación por bloques en ningún cursor. Cuando una sentencia SELECT devuelvevarias filas, la aplicación debe declarar un cursor y utilizar la sentencia FETCHpara recuperar las filas de una en una. Con una base de datos remota, estosignifica que cada petición y cada respuesta pasan por la red. Si el número de filases elevado, el tráfico de la red aumentará significativamente.

SQLDBNAME(’base de datos’)La palabra clave SQLDBNAME especificar el nombre de la base de datos DB2 a laque hacen referencia las sentencias SQL intercaladas en la aplicación. El nombredebe estar entre apóstrofos y puede tener una longitud máxima de 8 caracteres.

SQLDTFMT(*EUR | *ISO | *USA | *JIS)La palabra clave SQLDTFMT especifica el formato de fecha y hora que se utilizaráen la aplicación. Los valores posibles son:

*EUR Formato estándar para Europa de IBM.

210 VisualAge RPG Consulta del lenguaje

Page 233: RPG Referencia

*ISO Formato de la International Standards Organization.

*USA Formato estándar para los EE.UU. de IBM.

*JIS Formato estándar de la industria japonesa para la era cristiana.

SQLISOLATIONLVL(*RR | *CS | *UR)La palabra clave SQLISOLATIONLVL, especifica cómo leerá la aplicación losregistros de base de datos SQL. Los valores posibles son:

*RR La lectura repetible mantiene un bloqueo en todas las filas a las que laaplicación accede desde el último punto de compromiso. Si la aplicaciónlee otra vez la misma fila, los valores no habrán cambiado. El efecto delnivel de aislamiento *RR es que una aplicación puede impedir que otrasaplicaciones o los usuarios modifiquen las tablas. Como resultado, laconcurrencia global puede verse reducida.

Por lo general, debe elegir la lectura repetible sólo si la aplicación precisael bloqueo de filas; de lo contrario, es preferible utilizar *CS.

*CS Estabilidad de cursor; *CS mantiene un bloqueo de fila solamente mientrasel cursor está situado en esa fila. Cuando el cursor se desplace a otra fila,el bloqueo desaparecerá. Sin embargo, si los datos se modifican, el bloqueodebe mantenerse hasta que los datos estén comprometidos. La estabilidadde cursor se aplica sólo a los datos que se leen. Todos los datosmodificados permanecen bloqueados hasta que se procesa una operaciónCOMMIT o ROLLBACK.

Especifique estabilidad de cursor si se va a acceder a una fila determinadauna sola vez durante la transacción. De este modo, el bloqueo tiene unimpacto mínimo en los usuarios y las aplicaciones concurrentes.

*UR Lectura no comprometida; *UR sirve para ver las filas sin esperar bloqueos.La lectura no comprometida se aplica a las operaciones FETCH y SELECTINTO. En el caso de otras operaciones, con *UR se consigue lo mismo quecon *CS, estabilidad de cursor. Una aplicación que utilice este nivel lee ydevuelve todas las filas, incluso si contienen cambios no comprometidosefectuados por otras aplicaciones. Puesto que este nivel de aislamiento noespera a los bloqueos de concurrencia, el rendimiento global puedeaumentar.

SQLPACKAGENAME(’paquete.txt’)La palabra clave SQLPACKAGENAME especifica que se creará un archivo depaquete que contendrá las sentencias SQL ejecutables. Si lo desea, puedeespecificar un nombre de paquete totalmente calificado entre apóstrofos. Dichonombre puede tener una longitud máxima de 8 caracteres.

Una aplicación del Gestor de Base de Datos utiliza un archivo de paquete paracada archivo fuente construido y utilizado para construir la aplicación. Cadapaquete es una entidad por separado y no tiene relación con otros paquetesutilizados en la misma o en otras aplicaciones. Los paquetes se crean ejecutando elprecompilador contra un archivo fuente con el enlace habilitado o ejecutando elenlazador (mandato SQLBIND) contra uno o varios nombres de DB2.

SQLPASSWORD(’contraseña’)La palabra clave SQLPASSWORD especifica la contraseña del ID de usuario queaccede a la base de datos SQL. La contraseña debe estar entre apóstrofos.

Capítulo 16. Especificaciones de control 211

Page 234: RPG Referencia

SQLUSERID(’ID de usuario’)La palabra clave SQLUSERID especifica el ID de usuario que se conecta a la basede datos SQL. El ID de usuario debe estar entre apóstrofos.

TIMFMT(fmt{separador})La palabra clave TIMFMT especifica el formato interno de literales de hora y elformato por omisión para campos de hora en el programa. Puede especificar unformato de hora interno diferente para un campo determinado especificando elformato con la palabra clave TIMFMT en la especificación de definición para dichocampo.

El valor por omisión es *ISO. Si desea obtener más información acerca de losformatos internos, consulte el apartado “Formatos internos y externos” en lapágina 95

En la Tabla 28 se muestran los formatos de hora soportados y sus separadores:

Tabla 28. Formatos de hora externos para tipos de datos de hora

NombreRPG Descripción

Formato(separadorporomisión)

Separadoresválidos Longitud Ejemplo

*HMS Horas:Minutos:Segundos hh:mm:ss : . , & 8 14:00:00

*ISO International StandardsOrganization

hh.mm.ss . 8 14.00.00

*USA Estándar EE.UU. IBM. AMy PM pueden ser cualquiercombinación demayúsculas y minúsculas

hh:mm AMo hh:mmPM

: 8 02:00 PM

*EUR Estándar europeo IBM hh.mm.ss . 8 14.00.00

*JIS Estándar industrial japonésera cristiana

hh:mm:ss : 8 14:00:00

TRUNCNBR(*YES | *NO)La palabra clave TRUNCNBR especifica si se traslada el valor truncado al campode resultado o si se genera un error cuando se produzca un desbordamientonumérico mientras de ejecuta el objeto.

Nota: La opción TRUNCNBR no se aplica a los cálculos realizados dentro deexpresiones. (Las expresiones se hallan en el campo Factor ampliado 2.) Si seproduce un desbordamiento en dichos cálculos, se producirá siempre unerror.

Si se especifica *YES, no se tendrá en cuenta el desbordamiento numérico y setrasladará el valor truncado al campo de resultado.

Si se especifica *NO, se generará un error en tiempo de ejecución cuando se detecteun desbordamiento numérico.

Si no se especifica la palabra clave TRUNCNBR, se utilizará el valor especificadoen el mandato.

212 VisualAge RPG Consulta del lenguaje

Page 235: RPG Referencia

Capítulo 17. Especificaciones de descripción de archivo

Las especificaciones de descripción de archivo identifican cada uno de los archivosque utiliza un programa. Cada archivo de un programa debe tener una sentenciade especificación de descripción de archivo correspondiente.

Un archivo puede estar descrito por programa o descrito externamente. En losarchivos descritos por programa, se incluyen las descripciones de registro y decampo en el programa utilizando las especificaciones de entrada y salida. Lasdescripciones de registro y de campo de los archivos descritos externamente sedefinen en un servidor AS/400 utilizando DDS o mandatos SQL/400™.

Para cada programa se aplican las limitaciones siguientes:v No existe un límite del número máximo de archivos permitidosv Archivos DISK:

– Los archivos DISK pueden ser remotos o locales– Los archivos remotos deben estar descritos externamente– Los archivos locales deben estar descritos por programa

v Archivos PRINTER:– Se permite un máximo de ocho archivos PRINTER– Los archivos PRINTER deben estar descritos por programa

v Archivos SPECIAL:– Los archivos SPECIAL deben estar descritos por programa.

Sentencia de especificación de descripción de archivoLa disposición general de la especificación de archivo es la siguiente:v El tipo de especificación de descripción de archivo (F) se entra en la posición 6v La parte no de comentario de la especificación abarca de la posición 7 a la 80:

– Las entradas de formato fijo abarcan de la posición 7 a la 42– Las entradas de palabra clave abarcan de la posición 44 a la 80

v La sección de comentarios de la especificación abarca de la posición 81 a la 100.

Línea de continuación de palabras clave de descripción dearchivo

Si se requiere espacio adicional para palabras clave, el campo de palabras clave sepuede continuar en las líneas subsiguientes de este modo:v la posición 6 de la línea de continuación debe contener una Fv las posiciones 7 a 43 de la línea de continuación debe estar en blancov la especificación continúa en la posición 44 o después

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8 ...+... 9 ...+... 10FFilename++IT.A.FRlen+......A.Device+.Keywords+++++++++++++++++++++++++++++Comments++++++++++++

Figura 78. Diseño de especificación de descripción de archivo

© Copyright IBM Corp. 1994, 2000 213

Page 236: RPG Referencia

Posición 6 (Tipo de formulario)En esta posición debe entrarse una F.

Posiciones 7-16 (Nombre de archivo)Entrada Explicación

Un nombre de archivo válido Todos los archivos utilizados en un programadeben tener un nombre exclusivo. El nombre dearchivo puede tener una longitud de 1 a 10caracteres y deben comenzar en la posición 7.

Para un archivo descrito externamente, el archivo debe existir tanto en el tiempode compilación como en el de ejecución. Para un archivo descrito por programa, elarchivo únicamente debe existir en el tiempo de ejecución.

Cuando se abren los archivos en tiempo de ejecución, se abren en orden inverso alindicado en las especificaciones de descripción de archivo. El nombre dedispositivo define las operaciones que pueden procesarse en el archivo asociado.

Archivo descrito por programaEn los archivos descritos por programa, el nombre de archivo entrado en lasposiciones 7 a 16 debe entrarse también en:v Las especificaciones de entradav Las especificaciones de salida o en una línea de operación de cálculo de salida si

el archivo es un archivo de salida, de actualización o combinado, o si para elarchivo se especifica la adición en archivo.

v Las especificaciones de definición si el archivo es un archivo de tabla o matriz.v Las especificaciones de cálculo si se requiere el nombre de archivo para el

código de operación especificado.

Archivo descrito externamenteEn los archivos descritos externamente, el nombre de archivo entrado en lasposiciones 7 a 16 es el nombre utilizado para localizar las descripciones de registrodel archivo. Se aplican las reglas siguientes a los archivos descritos externamente:v Las especificaciones de entrada y salida para los archivos descritos externamente

son optativas. Sólo son necesarias si está añadiendo funciones VisualAge RPG,como por ejemplo indicadores de identificación de registros, a la descripciónexterna recuperada.

v Cuando se recupera una descripción externa, puede hacerse referencia a unadefinición de registro mediante su nombre de formato de registro en lasespecificaciones de entrada, salida o cálculo.

v Un nombre de formato de registro debe ser un nombre simbólico exclusivo.v No se permite un archivo lógico descrito externamente con dos formatos de

registro con el mismo nombre.

Posición 17 (Tipo de archivo)Entrada

Explicación

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8 ...+... 9 ...+... 10F.....................................Keywords+++++++++++++++++++++++++++++Comments++++++++++++

Figura 79. Diseño de la línea de continuación de las palabras clave de descripción de archivo

214 VisualAge RPG Consulta del lenguaje

Page 237: RPG Referencia

I Un archivo de entrada puede ser un archivo DISK local o remoto

O Un archivo de salida puede ser un archivo DISK local o remoto

U Un archivo de actualización puede ser un archivo DISK local o remoto

C Un archivo combinado (entrada/salida) debe ser un archivo DISK remoto

Archivos de entradaUn programa lee información desde un archivo de entrada. El archivo de entradapuede contener registros de datos, matrices o tablas.

Archivos de salidaUn archivo de salida es un archivo en el que se graba información.

Archivos de actualizaciónUn archivo de actualización es un archivo cuyos registros pueden leerse yactualizarse. La actualización altera los datos en uno o más campos de cualquierregistro contenido en el archivo y vuelve a grabar dicho registro en el mismoarchivo en el que lo ha leído. Si se han de suprimir registros, debe especificarse elarchivo como un archivo de actualización.

Archivos combinadosUn archivo combinado es un archivo de entrada y de salida. Cuando se procesa unarchivo combinado, el registro de salida contiene sólo los datos representados porlos campos del registro de salida. Es distinto de un archivo de actualización, en elque el registro de salida contiene el registro de entrada modificado por los camposdel registro de salida.

Un archivo combinado es válido para un archivo SPECIAL y para un archivo DISKsi la posición 18 contiene una T (un archivo de sustitución de matriz o tabla).

Posición 18 (Designación de archivo)Entrada

Explicación

BlancoArchivo de salida

T Archivo de matriz o tabla

F Archivo controlado en cálculo

Archivos de matrices o tablasLos archivos de matriz o tabla especificados mediante una T en la posición 18 secargan en el tiempo de inicialización del programa. El archivo de matriz o tablapuede ser de entrada o combinado. Deje esta entrada en blanco para los archivosde salida de matriz o tabla. No puede especificar SPECIAL como el dispositivopara los archivos de entrada de matriz y tabla. No puede especificar un archivodescrito externamente como un archivo de matriz o tabla.

Si especifica T en la posición 18, puede especificar un tipo de archivo combinado(C en la posición 17) para un archivo DISK. Un tipo de archivo combinado permiteque un archivo de matrices o de tablas lea o grabe en el mismo archivo (un archivode sustitución de matrices o tablas) o en otro diferente. Además, también se debeespecificar el nombre de archivo en las posiciones de la 7 a la 16 como parámetropara la palabra clave TOFILE en la especificación de la definición.

Capítulo 17. Especificaciones de descripción de archivo 215

Page 238: RPG Referencia

Archivo controlado en cálculoEn un archivo controlado en cálculo, la entrada se controla mediante lasoperaciones de cálculo. Los códigos de operación de archivo, como por ejemploCHAIN o READ, se utilizan para realizar funciones de entrada.

Posición 19 (Reservada)Entrada

Explicación

BlancoEsta entrada debe estar en blanco.

Posición 20 (Adición de archivo)La posición 20 indica si se ha de añadir registros a un archivo de entrada o deactualización. Esta entrada se pasa por alto para los archivos de actualización.

EntradaExplicación

BlancoNo pueden añadirse registros en un archivo de entrada o de actualización(I o U en la posición 17).

A Se añaden registros en un archivo de entrada o de actualización cuando lasposiciones 18 a 20 de las especificaciones de registro de salida del archivocontienen ″ADD″ o cuando se utiliza el código de operación WRITE en lasespecificaciones de cálculo.

Consulte la Tabla 29 para saber cuál es la relación entre la posición 17 y la posición20 de las especificaciones de descripción de archivo y las posiciones 18 a 20 de lasespecificaciones de salida.

Tabla 29. Funciones de proceso para archivos

Función

Especificación

Descripción de archivo Salida

Posición 17 Posición 20 Posiciones 18-20

Crear un nuevo archivo1

o

Añadir registros a archivoexistente

O

O

Blanco

A

Blanco

ADD

Procesar archivo I Blanco Blanco

Procesar archivo y añadir registrosal archivo existente

I A ADD

Procesar archivo y actualizar losregistros (actualizar o suprimir)

U Blanco Blanco

Procesar archivo y añadir nuevosregistros a un archivo existente

U A ADD

Procesar archivo y suprimirregistro existente del archivo

U Blanco DEL

: 1En RPG, el término crear un nuevo archivo significa añadir registros a un archivo creadorecientemente. De este modo, las primeras dos entradas de la tabla realizan la mismafunción. Ambas se listan para mostrar que existen dos modos de especificar dicha función.

216 VisualAge RPG Consulta del lenguaje

Page 239: RPG Referencia

Posición 21 (Reservada)Entrada

Explicación

BlancoEsta entrada debe estar en blanco.

Posición 22 (Formato de archivo)Entrada

Explicación

F Archivo descrito por programa

E Archivo descrito externamente

Una F en la posición 22 indica que los registros para el archivo están descritosdentro del programa en las especificaciones de entrada/salida (excepto para losarchivos de matrices/tablas). Los archivos PRINTER y SPECIAL deben estardescritos por programa. Los archivos DISK locales deben estar descritos porprograma.

Una E en la posición 22 indica que las descripciones de registro para el archivo sonexternas al programa fuente VisualAge RPG. El compilador obtiene estasdescripciones en la compilación y las incluye en el programa fuente. Los archivosDISK remotos deben estar descritos externamente.

Posiciones 23-27 (Longitud de registro)Utilice las posiciones 23 a 27 para indicar la longitud de los registros lógicoscontenidos en un archivo descrito por programa. El tamaño máximo de registroque puede especificarse es 32766; sin embargo, los límites de tamaño de registro decualquier dispositivo puede alterar temporalmente este valor. En los archivosPRINTER, especifican una longitud de registro que no sobrepasa el número decolumnas de la salida de impresora. Esta entrada debe estar en blanco para losarchivos descritos externamente.

Posición 28 (Reservada)Entrada

Explicación

BlancoEsta entrada debe estar en blanco.

Posiciones 29-33 (Reservadas)Entrada

Explicación

BlancoEsta entrada debe estar en blanco.

Posición 34 (Tipo de dirección de registro)Entrada

Explicación

Capítulo 17. Especificaciones de descripción de archivo 217

Page 240: RPG Referencia

BlancoLos números relativos de registro se utilizan para procesar el archivo. Losregistros se leen consecutivamente.

K Se utilizan valores de clave para procesar el archivo. Esta entrada sólo esválida para archivos descritos externamente.

Blanco = Proceso no por claveUn blanco indica que el archivo se procesa sin la utilización de claves.

Un archivo procesado sin claves puede procesarse de modo consecutivo o aleatoriopor el número de registro relativo.

El proceso de entrada por el número de registro relativo se determina mediante unblanco en la posición 34 y mediante la utilización del código de operación CHAIN,SETLL o SETGT. El proceso de salida por número de registro relativo se determinamediante un blanco en la posición 34 y mediante la utilización de la palabra claveRECNO en las especificaciones de descripción de archivo.

ClaveUna entrada K indica que el archivo descrito externamente se procesapresuponiendo que la vía de acceso se ha creado sobre valores de clave. Si elproceso es aleatorio, se utilizan los valores de clave para identificar los registros.

Si esta posición está en blanco para un archivo por clave, los registros se recuperanen secuencia de llegada.

Posición 35 (Reservada)Entrada

Explicación

BlancoEsta entrada debe estar en blanco.

Posiciones 36-42 (Dispositivo)Entrada Explicación

PRINTER Este es un archivo de impresora con caracteres de control quepueden enviarse a una impresora.

DISK Este es un archivo de disco. Para los archivos remotos estádisponible el proceso secuencial y aleatorio de lectura/grabación.Para los archivos locales está disponible el proceso secuencial yrelativo de registros.

SPECIAL Este es un archivo especial. La entrada o salida está en undispositivo al que se accede mediante el código suministrado porusuario que está enlazada a la aplicación VisualAge RPG. Elnombre del módulo del código suministrado por usuario debeespecificarse como el parámetro de la palabra clave PROCNAME.Se crea una lista de parámetros para utilizar con este programa queincluye un parámetro de código de opción y un parámetro decódigo de estado. El archivo debe estar en un formato nobloqueado fijo. Consulte “PLIST(nombre_Plist)” en la página 222 y“PROCNAME(nombre_procedimiento)” en la página 223 paraobtener más información.

218 VisualAge RPG Consulta del lenguaje

Page 241: RPG Referencia

Utilice las posiciones 36 a 42 para especificar el nombre del dispositivo que seasociará con el archivo. El nombre de dispositivo define las funciones que puedenefectuarse con el archivo asociado. Ciertas funciones sólo son válidas para unnombre de dispositivo específico.

Posición 43 (Reservada)La posición 43 debe estar en blanco.

Posiciones 44-80 (Palabras clave)Las posiciones 44 a 80 se proporcionan para las palabras clave de especificación dedescripción de archivo. Las palabras clave se utilizan para proporcionarinformación sobre el archivo que está definiéndose.

Las palabras clave de especificación de descripción de archivo pueden no tenerparámetros, parámetros opcionales ni parámetros obligatorios. La sintaxis de laspalabras clave es la siguiente:

Palabra clave(parámetro1 : parámetro2)

donde:v Los parámetros van entre paréntesis ().

Nota: No especifique paréntesis si no hay parámetros.v Se utilizan signos de dos puntos (:) para separar varios parámetros.

Se han utilizado los convenios de notación siguientes para mostrar qué parámetrosson opcionales y cuáles son obligatorios:v Las llaves { } indican parámetros opcionales o elementos opcionales de los

parámetros.v Unos puntos suspensivos (...) indican que el parámetro puede repetirse.v Un signo de dos puntos (:) establece una separación entre los parámetros e

indica que es posible especificar más de uno. Todos los parámetros que estánseparados por dos puntos son obligatorios a menos que vayan entre llaves.

v Una barra vertical (|) indica que sólo se puede especificar un parámetro para lapalabra clave.

v Un espacio en blanco entre los parámetros de la palabra clave indica que sepuede especificar más de uno.

Nota: Las llaves, los puntos suspensivos y las barras verticales no son parte de lasintaxis de las palabras clave y no deben figurar en el fuente.

Si se requiere espacio adicional para palabras clave, el campo de palabras clavepuede continuarse en las líneas subsiguientes. Consulte los apartados “Línea decontinuación de palabras clave de descripción de archivo” en la página 213 y“Campo de palabras clave de especificación de descripción de archivo” en lapágina 197.

La tabla siguiente resume qué palabras clave son aplicables a los archivos descritosexternamente y qué palabras clave son aplicables a los archivos descritos porprograma.

Palabra clave Descrito por programa Descrito externamente

BLOCK S

COMMIT{(rpg_nombre)} S

Capítulo 17. Especificaciones de descripción de archivo 219

Page 242: RPG Referencia

Palabra clave Descrito por programa Descrito externamente

DATFMT(formato{separador}) S S

EXTFILE(nombarch) S

FORMLEN(número) S

IGNORE(formatoreg{:formatoreg...}) S

INCLUDE(formatoreg{:formatoreg...}) S

INFDS(nomESD) S S

INFSR(nomSUBRU) S S

PLIST(nombre_lista_parámetros) S S

PREFIX(nombre_prefijo) S

PROCNAME(nombre_procedimiento) S

PRTCTL(estruct_datos{:*COMPAT}) S

RCDLEN(nombrecampo) S

RECNO(nombrecampo) S S

REMOTE S

RENAME(formato_ext:formato_int) S

TIMFMT(formato{separador}) S S

USROPN S S

BLOCK(*YES|*NO)La palabra clave BLOCK controla la agrupación en bloques de los registrosasociados al archivo. La palabra clave únicamente es válida para archivos DISK.

Si no especifica esta palabra clave, el compilador VARPG deshace los bloques deregistros de entrada y agrupa los registros de salida por bloques con el fin demejorar el rendimiento de los archivos DISK si se cumplen las condicionessiguientes:1. El archivo está descrito externamente y sólo tiene un formato de registro.2. La palabra clave RECNO no se utiliza en la especificación de descripción de

archivo.3. Una de las siguientes es verdadera:

a. Se trata de un archivo de salida.b. Si se trata de un archivo combinado, es un archivo de matrices o de tablas.c. Se trata de un archivo de sólo entrada y en él no se utiliza ninguna de las

operaciones siguientes: READE, READPE, SETGT, SETLL y CHAIN. (Si seutiliza alguna operación READE o READPE, los registros del archivo deentrada no se agruparán por bloques. Si se utiliza alguna operación SETGT,SETLL o CHAIN ocurrirá lo mismo a menos que se especifique la palabraclave BLOCK(*YES) para el archivo de entrada).

Si especifica BLOCK(*YES), se producirá la agrupación por bloques de los registrostal y como se ha indicado anteriormente, con la excepción de que se puedenutilizar operaciones READE, READPE, SETGT, SETLL y CHAIN con un archivo deentrada y la agrupación por bloques tendrá igualmente lugar (véase la condición3c anterior).

Para evitar que se agrupen los registros por bloques, puede especificarseBLOCK(*NO). El compilador no agrupará los registros por bloques.

220 VisualAge RPG Consulta del lenguaje

Page 243: RPG Referencia

COMMIT{(rpg_nombre)}La palabra clave COMMIT permite la opción de procesar archivos remotos bajocontrol de compromiso. Puede especificarse un parámetro opcional, nombre_rpg.El parámetro se define implícitamente como un campo de tipo indicador (es decir,campo de caracteres con una longitud de uno) y se inicializa en ’0’.

Especificando el parámetro opcional, el programador puede controlar si se habilitael control de compromiso en tiempo de ejecución. Si el parámetro contiene un ’1’,se abre el archivo con COMMIT activado; de lo contrario se abre el archivo sinCOMMIT. El parámetro debe establecerse antes de abrir el archivo. Si se abre elarchivo durante la inicialización del programa, puede pasarse el parámetro a travésde otro parámetro. Si el archivo se abre explícitamente, utilizando la operaciónOPEN de las especificaciones de cálculo, puede establecerse con anterioridad a laoperación OPEN.

Utilice los códigos de operación COMMIT y ROLBK para agrupar los cambios paraeste y otros archivos que estén actualmente bajo control de compromiso de modoque los cambios se produzcan todos juntos o que no se produzca ninguno.

Nota: Si el archivo ya está abierto con una vía de acceso de datos abiertacompartida, el valor de control de compromiso debe coincidir con el valorde la operación OPEN anterior.

DATFMT(formato{separador})La palabra clave DATFMT permite especificar un formato de fecha externo poromisión y un separador por omisión (que es opcional) para todos los campos defecha del archivo descrito por el programa. Si el archivo, para el que se haespecificado la palabra clave, es un archivo indexado y el campo de clave es unafecha, también se proporciona el formato por omisión para el campo de clave. Elarchivo puede ser remoto o local.

Puede especificar un formato externo diferente para campos de fecha de entrada ode salida individuales en el archivo especificando un formato/separador de fechapara el campo en la especificación de entrada (posiciones de la 31 a la 35) o en laespecificación de salida (posiciones de la 53 a la 57) correspondientes.

Para los campos de entrada de fecha, especifica el formato/separador de la fechaexterna por omisión (las posiciones de especificación de entrada 31-35).

Para los campos de salida de fecha, especifica el formato/separador de fechaexterna por omisión (las posiciones de especificación de salida 53-57).

Consulte “DATFMT(fmt{separador})” en la página 205 para obtener másinformación sobre formatos y separadores de fecha. Para obtener más informaciónacerca de los formatos externos, vea “Formatos internos y externos” en lapágina 95.

EXTFILE(nombrearchivo)La palabra clave EXTFILE le permite especificar un nombre de archivo real en laejecución en lugar de facilitarlo en la compilación. El archivo debe ser un archivoDISK o PRINTER local. Con la palabra clave EXTFILE también se debe especificarla palabra clave USROPN.

Capítulo 17. Especificaciones de descripción de archivo 221

Page 244: RPG Referencia

FORMLEN(número)La palabra clave FORMLEN sirve para especificar la longitud de formulario de unarchivo PRINTER. La longitud de formulario debe ser mayor o igual a 1 y menor oigual a 255. El parámetro especifica el número exacto de líneas disponible en elformulario o página que se utilizará. Cuando el número de líneas coincide conFORMLEN, se inserta la alimentación automática de formulario.

IGNORE(formatoreg{:formatoreg...})La palabra clave IGNORE permite no tener en cuenta un formato de registro de unarchivo descrito externamente. El nombre externo del formato de registro que se hade ignorar se especifica en el parámetro formatoreg. Se pueden especificar variosformatos de registro, separados mediante dos puntos (:). El programa se ejecutacomo si el(los) formato(s) de registro especificado(s) no existieran. Todos los demásformatos de registro contenidos en el archivo se incluirán.

Cuando se especifica la palabra clave IGNORE para un archivo, no se puedeespecificar la palabra clave INCLUDE.

INCLUDE(formatoreg{:formatoreg...})La palabra clave INCLUDE especifica los nombres de formato de registro que sevan a incluir. Todos los demás formatos de registro contenidos en el archivo seignorarán. Se pueden especificar varios formatos de registro, separados mediantedos puntos (:).

Cuando se especifica la palabra clave INCLUDE para un archivo, no se puedeespecificar la palabra clave IGNORE.

INFDS(nombreDS)La palabra clave INFDS le permite definir y dar nombre a una estructura de datosque contendrá la información de retorno asociada al archivo. El nombre de laestructura de datos se especifica como el parámetro de INFDS. Si se especificaINFDS para más de un archivo, cada estructura de datos asociada debe tener unnombre exclusivo. Una INFDS únicamente se puede definir en la sección fuenteprincipal.

INFSR(nombreSUBR)La subrutina de errores de excepción de archivo especificada como el parámetropara esta palabra clave puede recibir el control después de los errores de excepciónde archivo. El nombre de la subrutina puede ser *PSSR, que indica que lasubrutina de excepciones/errores del programa definido por el usuario controlarálos errores de este archivo.

La palabra clave INFSR no se puede especificar si un subprocedimiento ha deacceder al archivo.

PLIST(nombre_Plist)PLIST suministra, como su parámetro, el nombre de la lista de parámetros que seha de pasar al programa para el archivo SPECIAL. El procedimiento se especificautilizando la palabra clave PROCNAME(nombre_procedimiento). Esta entrada sóloes válida cuando el dispositivo especificado en la línea de descripción de archivo(posiciones 36 a 42) es SPECIAL. Los parámetros que identifica esta entrada seañaden al final de la lista de parámetros que pasa el programa.

222 VisualAge RPG Consulta del lenguaje

Page 245: RPG Referencia

PREFIX(serie_prefijo{:núm_de_car_sustit})La palabra clave PREFIX se utiliza para redenominar parcialmente los campos deun archivo descrito externamente. Los caracteres especificados como ’serie_prefijo’se añaden como prefijo a los nombres de todos los campos definidos en todos losregistros de archivo especificado en las posiciones de la 7 a la 16. Además,opcionalmente puede especificar un valor numérico para indicar el número decaracteres, si existe alguno, a sustituir del nombre existente. Si no se especifica’núm_de_car_sustit’, la serie se une al principio del nombre.

Si se especifica ’núm_de_car_sustit’, debe ser una constante numérica que contengaun valor entre 0 y 9 sin posiciones decimales. Por ejemplo, la especificaciónPREFIX(YE:3) cambiaría el nombre de campo ’YTDTOTAL’ por ’YETOTAL’.Especificar un valor de cero es equivalente a no especificar ’núm_de_car_sustit’ enabsoluto.

Normas:v Se puede redenominar un campo de modo explícito en una especificación de

entrada, incluso si se ha especificado la palabra clave PREFIX para un archivo.El compilador reconocerá (y requerirá) el nombre que se UTILIZA primero en elprograma. Por ejemplo, si especifica que el nombre con prefijo de unaespecificación de entrada se asocie al campo con un indicador y, a continuación,intenta redenominar el campo que hace referencia al nombre sin prefijo,obtendrá un error. Por el contrario, si primero redenomina el campo para que nosea un nombre con prefijo y, a continuación, utiliza el nombre con prefijo en unaespecificación, obtendrá un error en el tiempo de compilación.

v La longitud total del nombre una vez aplicado el prefijo no debe exceder lalongitud máxima de un nombre de campo VisualAge RPG.

v El número de caracteres del nombre al que se añadirá el prefijo no debe serinferior o igual al valor que representa el parámetro ’núm_de_car_sustit’. Esdecir, después de aplicar el prefijo, el nombre resultante no debe ser igual a laserie del prefijo.

PROCNAME(nombre_procedimiento)Cuando la entrada de dispositivo es SPECIAL (posiciones 36 a 47), el módulo delcódigo suministrado por usuario especificado como el parámetro en PROCNAMEmaneja el soporte del dispositivo de E/S especial. Consulte “Posiciones 36-42(Dispositivo)” en la página 218 y “PLIST(nombre_Plist)” en la página 222 paraobtener más información.

PRTCTL(estruct_datos{:*COMPAT})La palabra clave PRTCTL especifica la utilización del control dinámico deimpresora. La estructura de datos especificada como el parámetro estructura_datoshace referencia a la información de control de formularios y al valor total de líneas.La palabra clave PRTCTL sólo es válida para un archivo descrito por programa.

El parámetro opcional *COMPAT indica que la disposición de estructura de datoses compatible con RPG III. Si no se especifica *COMPAT, debe utilizarse laestructura de datos de longitud ampliada.

Estructura de datos PRTCTL de longitud ampliadaPara esta estructura de datos se requiere un mínimo de 15 bytes. La disposición dela estructura de datos PRTCTL es la siguiente:

Capítulo 17. Especificaciones de descripción de archivo 223

Page 246: RPG Referencia

Posiciones de laestructura dedatos

Contenido de subcampo

1-3 Un campo de caracteres de 3 posiciones que contiene el valor deespacio antes (blanco ó 0-255)

4-6 Un campo de caracteres de 3 posiciones que contiene el valor deespacio posterior (blanco ó 0-255)

7-9 Un campo de caracteres de 3 posiciones que contiene el valor de saltarantes (entradas válidas: blanco ó 1-255)

10-12 Un campo de caracteres de 3 posiciones que contiene el valor de saltardespués (blanco ó 1-255)

13-15 Un campo numérico de tres dígitos (decimal con zona) con ceroposiciones decimales que contiene el valor total de líneas actual.

Estructura de datos *COMPAT PRTCTL

Posiciones de laestructura dedatos

Contenido de subcampo

1 Un campo de caracteres de una posición que contiene el valor deespacio antes (blanco ó 0-3)

2 Un campo de caracteres de una posición que contiene el valor deespacio antes (entradas válidas: blanco ó 0-3)

3-4 Un campo de caracteres de dos posiciones que contiene el valor de saltarantes (blanco, 1-99, A0-A9 para 100-109, B0-B2 para 110-112)

5-6 Un campo de caracteres de dos posiciones que contiene el valor de saltardespués (blanco, 1-99, A0-A9 para 100-109, B0-B2 para 110-112)

7-9 Un campo numérico de tres dígitos (decimal con zona) con ceroposiciones decimales que contiene el valor total de líneas actual.

Los valores de los primeros cuatro subcampos de la estructura de datos delongitud ampliada son iguales a los permitidos en las posiciones 40 a 51 (entradasde espacio y saltar) de las especificaciones de salida. Si las entradas de espacio ysaltar (posiciones 40 a 51) de las especificaciones de salida están en blanco y si lossubcampos 1 a 4 también están en blanco, el valor por omisión es 1 espaciodespués. Si se especifica la opción PRTCTL, sólo se utiliza para los registros desalida que tienen blancos en las posiciones 40 a 51. Puede controlar el valor deespacio y saltar (subcampos 1 a 4) para el archivo PRINTER cambiando los valoresde estos subcampos mientras se está ejecutando el programa.

El subcampo 5 contiene el valor total de líneas actual. El compilador VisualAgeRPG no inicializa el subcampo 5 hasta que se imprime la primera línea de salida.A continuación el compilador VisualAge RPG cambia el subcampo 5 después decada operación de salida en el archivo.

RCDLEN(nombre de campo)La palabra clave RCDLEN se puede utilizar para los archivos DISK locales. Elparámetro de nombre de campo debe ser numérico con cero posiciones decimales.En los archivos de entrada, el nombre de campo contiene la longitud del registroque se ha leído. En los archivos de salida, el nombre del campo especifica lalongitud del registro que se ha de grabar. La longitud de registro especificada enlas posiciones 23 - 27 define la longitud máxima de campo. RCDLEN debe sermenor o igual que esta longitud de registro. La longitud de registro más pequeñaque puede grabarse es cero. Si el valor especificado con RECLEN es inferior a cero,se efectúa un redondeo por exceso a cero.

224 VisualAge RPG Consulta del lenguaje

Page 247: RPG Referencia

Si la palabra clave RCDLEN está incluida, el archivo se trata como si contuvieraregistros de longitud variable. Si la palabra clave no está incluida, el archivo setrata como si contuviera registros de longitud fija.

Nota: Si el campo RCDLEN se establece en la salida, prevalece sobre la longitudde cualquier estructura de datos que se utilice.

RECNO(nombre de campo)Esta palabra clave es opcional para los archivos DISK que se han de procesar pornúmero de registro relativo. Debe especificarse la palabra clave RECNO para losarchivos de salida procesados por número relativo de registro, para archivos desalida a los que se hace referencia mediante una operación de cálculo WRITEaleatoria, o para los archivos de salida que se utilizan con ADD en lasespecificaciones de salida.

Nota: Si no se especifica la palabra clave RECNO, se produce la agrupación enbloques.

Puede especificarse la palabra clave RECNO para los archivos deentrada/actualización. El número relativo del registro que se recupera se coloca en’nombrecampo’, para todas las operaciones que reposicionan el archivo (como porejemplo READ, SETLL u OPEN). Debe definirse como numérico con ceroposiciones decimales. La longitud de campo debe ser suficiente para contener elnúmero de registro más largo del archivo.

Cuando se especifica la palabra clave RECNO para archivos de entrada oactualización con adición en archivo (’A’ en la posición 20), el valor del parámetronombrecampo debe hacer referencia a un número relativo de registro de unregistro suprimido, para que la operación de salida sea satisfactoria.

Nota: Se ignora la palabra clave RECNO si se graba (WRITE) en un archivo local.

REMOTELa palabra clave REMOTE especifica que el dispositivo de disco reside en unservidor AS/400.

RENAME(formato_externo:formato_interno)La palabra clave RENAME le permite redenominar formatos de registros en unarchivo descrito externamente. El nombre externo del formato de registro que se hade redenominar se entra como el parámetro formato_externo. El parámetroformato_interno es el nombre del registro como se utiliza en el programa. Elnombre externo se sustituye por este nombre en el programa.

Para redenominar todos los campos añadiendo un prefijo, utilice la palabra clavePREFIX.

TIMFMT(formato{separador})La palabra clave TIMFMT permite especificar un formato de hora externo poromisión y un separador por omisión (que es opcional) para todos los campos dehora de los campos descritos por el programa. Si el archivo en el que se haespecificado esta palabra clave es un archivo indexado y el campo de clave es unahora, el formato de hora especificado también proporciona el formato por omisiónpara el campo de clave. El archivo puede ser local o remoto.

Capítulo 17. Especificaciones de descripción de archivo 225

Page 248: RPG Referencia

Puede especificar un formato externo diferente para campos de hora de entrada ode salida individuales en el archivo especificando un formato/separador de horapara el campo en la especificación de entrada (posiciones de la 31 a la 35) o en laespecificación de salida (posiciones de la 53 a la 57) correspondientes.

Consulte la Tabla 20 en la página 127 para obtener información sobre formatos yseparadores válidos. Para obtener más información acerca de los formatos externos,vea “Formatos internos y externos” en la página 95.

USROPNLa palabra clave USROPN hace que el archivo no se abra durante la inicializacióndel programa. Esto da control al programador sobre la primera apertura delarchivo. El archivo debe abrirse explícitamente utilizando la operación OPEN enlas especificaciones de cálculo. Esta palabra clave no es válida para archivos deentrada designados como archivos de tabla.

Es necesaria la palabra clave USROPN para que el programador tenga controlsobre la primera apertura del archivo. Por ejemplo, si se abre un archivo y se cierraposteriormente mediante una operación CLOSE, puede volver a abrirse el archivo(utilizando la operación OPEN) sin haber especificado la palabra clave USROPN enla especificación de descripción de archivo.

Tipos de archivo y métodos de procesoLa tabla siguiente muestra las entradas válidas para las posiciones 28, 34 y 35 delas especificaciones de descripción de archivo para los diferentes tipos de archivosy métodos de acceso. Los métodos de proceso de archivos de disco son:v Proceso de número relativo de registrov Proceso consecutivov Proceso secuencial por clavev Proceso aleatorio por clave

Nota: Los archivos DISK locales sólo pueden procesarse secuencialmente omediante un registro relativo.

Tabla 30. Métodos de proceso para archivos DISK

Acceso Método Código deoperación

Posición28

Posición34

Posición35

Explicación

Aleatorio RRN CHAIN Blanco Blanco Blanco Acceso pororden físico deregistros

Secuencial Clave READREADEREADPREADPE

Blanco K Blanco Accesosecuencial porclave

Secuencial RRN READ Blanco Blanco Blanco Accesosecuencial

Aleatorio Clave CHAIN Blanco K Blanco Accesosecuencial porclave

226 VisualAge RPG Consulta del lenguaje

Page 249: RPG Referencia

Capítulo 18. Especificaciones de definición

Las especificaciones de definición se pueden utilizar para definir estructuras dedatos, subcampos de estructuras de datos, prototipos, interfaces de procedimientos,parámetros con prototipo, campos autónomos, constantes con nombre y ventanasde mensajes.

Dependiendo del lugar en el que se produce la definición, existen diferencias tantosobre lo que se puede definir como sobre el ámbito de la definición. Especifique eltipo de definición en las posiciones 24 a 25, tal y como se indica a continuación:

EntradaTipo de definición

BlancoUn subcampo de estructura de datos o definición de parámetro

C Constante con nombre

DS Estructura de datos

PI Interfaz de procedimiento

PR Prototipo

S Campo autónomo

Las definiciones de estructuras de datos, prototipos e interfaces de procedimientofinalizan con la primera especificación de definición sin espacios en blanco en lasposiciones 24-25 o con la primera especificación que no sea de definición.

Las especificaciones de definición pueden aparecer en dos lugares dentro de unmódulo o programa: en la sección de fuente principal y en un subprocedimiento.Dentro de la sección de fuente principal, debe definir todas las definicionesglobales. Dentro de un subprocedimiento, debe definir la interfaz de procedimientoy sus parámetros, según lo requiera el prototipo. También debe definir todos loselementos de datos locales que precise el procedimiento con prototipo cuando sevaya a procesar. Todas las definiciones de un procedimiento con prototipo sonlocales. No las conocen los demás procedimientos (incluyendo el procedimientoprincipal). Para obtener más información acerca de la estructura de la sección defuente principal y cómo afecta la ubicación de definiciones al ámbito, vea“Ubicación de definiciones y ámbito” en la página 228.

En la especificación de definición pueden definirse matrices y tablas como unsubcampo de estructura de datos o como un campo autónomo. Para obtenerinformación adicional acerca de cómo definir y utilizar matrices y tablas, vea el“Capítulo 12. Utilización de matrices y tablas” en la página 157.

En las especificaciones de definición se pueden especificar funciones incorporadas(BIF) en el campo de palabra clave como un parámetro para una palabra clave. Enla especificación de definición sólo se permite una función incorporada si seconocen los valores de todos los argumentos en el momento de la compilación.Todos los argumentos de una BIF deben definirse antes en las especificaciones alespecificarlas como parámetros para las palabras clave de especificación dedefinición DIM, OCCURS, OVERLAY y PERRCD. Para obtener más información

© Copyright IBM Corp. 1994, 2000 227

Page 250: RPG Referencia

acerca de cómo utilizar las funciones incorporadas, consulte el “Capítulo 23.Funciones incorporadas” en la página 309.

Para obtener más información sobre estructuras de datos, constantes, tipos dedatos y formatos de datos, consulte el “Capítulo 9. Tipos de datos y formatos dedatos” en la página 95, el “Capítulo 11. Estructuras de datos” en la página 147, y el“Capítulo 10. Literales y constantes con nombre” en la página 139. Para obtenermás información acerca de los prototipos, vea “Prototipos y parámetros” en lapágina 67.

Ubicación de definiciones y ámbitoDependiendo de dónde tiene lugar la definición, ésta tendrá un ámbito diferente.El ámbito hace referencia al rango de líneas de fuente en el que se conoce unnombre. Existen dos tipos de ámbitos: global y local. La Figura 80 muestra larelación entre la ubicación de definiciones en un módulo y el ámbito. La Figura 81en la página 229 muestra el diseño de la sección de fuente principal para cada

destino de compilación posible: componente, NOMAIN DLL o EXE.

Ámbitoglobal

Ámbitolocal

Ámbitolocal

Subprocedimiento 1

Subprocedimiento 2

Datos de programa - parte de la secciónfuente principal

Sección fuente principal

*MÓDULO

Figura 80. Ámbito de definiciones

228 VisualAge RPG Consulta del lenguaje

Page 251: RPG Referencia

Por lo general, todos los elementos que se han definido en la sección de fuenteprincipal son globales y, por consiguiente, conocidos en todo el módulo. Lasdefiniciones globales son definiciones que pueden utilizar tanto las sentencias delprocedimiento principal como cualquier subprocedimiento del módulo.

Por otra parte, los elementos de un subprocedimiento son locales. Las definicioneslocales son definiciones que únicamente se conocen en el subprocedimiento. Si unelemento se define con el mismo nombre que un elemento global, todas lasreferencias respecto a éste desde el subprocedimiento utilizarán la definición local.

Sin embargo, debe tener en cuenta las excepciones siguientes:v Sólo el procedimiento para el que se han definido conoce los nombres de las

subrutinas y de las etiquetas. Esto incluye los nombres de las subrutinas o de lasetiquetas que se han definido en el procedimiento principal.

v Todos los campos especificados en las especificaciones de entrada y de salidason globales. Por ejemplo, si un subprocedimiento lleva a cabo una operaciónutilizando un formato de registro, como una operación WRITE, se utilizarán loscampos globales, incluso si existen definiciones locales con los mismos nombres

HFDIO

PPP

COMPONENTE - - Omita las palabras clave NOMAIN y EXE dela especificación de control

HFDICCCO

PPP

Subrutinas de acciónSubrutinas de usuario

Los procedimientos siguenlas subrutinas de usuarioy de acción

NOMAIN DLL - - Especifique la palabra NOMAINen la especificación de control

Secciónfuente principal

Definicionesglobales

Sección fuente principalcon

definiciones globales

EXE - - Especifique la palabra clave EXEen la especificación de control

HFDIO

PPPPP

Sección fuente principalcon

definiciones globales

Uno de éstoses el

procedimiento principal

Figura 81. Sección de fuente principal para cada Destino de compilación

Capítulo 18. Especificaciones de definición 229

Page 252: RPG Referencia

que los campos de formato de registro. La regla también se aplica a laLECTURA y la ESCRITURA de ventanas.

Algunas veces puede haber una combinación de definiciones globales y locales.Por ejemplo, las KLIST y las PLIST pueden ser globales o locales. Los camposasociados a las KLIST y PLIST globales únicamente contienen campos globales. Loscampos asociados a las KLIST y PLIST locales pueden contener campos globales ylocales. Si desea obtner más información sobre el comportamiento de lossubprocedimientos internos KLIST y KFLD, consulte el apartado “Ámbito dedefiniciones” en la página 62.

Almacenamiento de definicionesLas definiciones locales utilizan almacenamiento automático. El almacenamientoautomático es un tipo de almacenamiento que únicamente existe durante lallamada del procedimiento. Las variables del almacenamiento automático noguardan sus valores entre las llamadas.

Por otra parte, las definiciones globales utilizan almacenamiento estático. Elalmacenamiento estático es un tipo de almacenamiento que tiene una ubicaciónconstante en la memoria para todas las llamadas de un programa o procedimiento.Conserva su valor a través de las llamadas.

Especifique la palabra clave STATIC para indicar que una definición de campolocal utilice almacenamiento estático, en cuyo caso, conservará su valor en cadallamada al procedimiento. Si se especifica la palabra clave STATIC, el elemento seinicializará en el tiempo de inicialización del módulo.

La utilización del almacenamiento automático reduce el almacenamiento quenecesita el programa en el tiempo de ejecución. El almacenamiento se reduce engran parte debido a que el almacenamiento automático sólo se asigna mientras seejecuta el procedimiento. Por otra parte, al arrancar el programa se asigna todo elalmacenamiento estático asociado a éste, incluso si no se llama a ningúnprocedimiento que utilice el almacenamiento estático.

Sentencia de especificación de definiciónLa disposición general de la especificación de definición es la siguiente:v El tipo de especificación de definición (D) se entra en la posición 6v La sección no de comentario de la especificación abarca de la posición 7 a la

posición 80– Las entradas de formato fijo abarcan de la posición 7 a la 42– Las entradas de palabra clave abarcan de la posición 44 a la 80

v La sección de comentarios de la especificación abarca de la posición 81 a la 100

Línea de continuación de palabras clave de especificación dedefinición

Si se requiere espacio adicional para palabras clave, el campo de palabras clave sepuede continuar en las líneas subsiguientes de este modo:v La posición 6 de la línea de continuación debe contener una D

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8 ...+... 9 ...+... 10DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++Comments++++++++++++

Figura 82. Diseño de especificación de definición

230 VisualAge RPG Consulta del lenguaje

Page 253: RPG Referencia

v Las posiciones 7 a 43 de la línea de continuación deben estar en blancov La especificación continúa a partir de la posición 44

Línea de nombre continuado de especificación de definiciónEn la entrada de Nombre de la especificación de definición se puede especificar unnombre de hasta 15 caracteres de longitud sin que requiera continuación.Cualquier nombre (incluso alguno con 15 caracteres o menos) puede continuar envarias líneas si se codifican puntos suspensivos (...) al final del nombre parcial. Unadefinición de nombre consta de los componentes siguientes:1. Cero o más líneas de nombre continuado. Las líneas de nombre continuado se

identifican al tener puntos suspensivos como último carácter no en blanco de laentrada. El nombre debe empezar dentro de las posiciones de la 7 a la 21 ypuede finalizar en cualquier lugar hasta la posición 77 (finalizando los puntossuspensivos en la posición 80). No puede haber espacios en blanco entre loscaracteres del principio del nombre y los puntos suspensivos. Si alguna de estascondiciones no es verdadera, la línea se analiza como una línea de definiciónprincipal.

2. Una línea de definición principal que contenga el nombre, los atributos dedefinición y las palabras clave. Si se codifica una línea de nombre continuado,la entrada de nombre de la línea de definición principal se puede dejar enblanco.

3. Cero o más líneas de continuación de palabra clave.

Posición 6 (Tipo de formulario)Debe entrarse A D en esta posición para las especificaciones de definición.

Posiciones 7-21 (Nombre)Entrada

Explicación

NombreEl nombre de la estructura de datos, subcampo de estructura de datos,campo autónomo, constante con nombre, programa local y parámetrospara el programa local que se va a definir.

BlancoEspecifica campos de relleno en las definiciones de subcampo de estructurade datos o una estructura de datos sin nombre en las definiciones deestructura de datos.

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8 ...+... 9 ...+... 10D.....................................Keywords+++++++++++++++++++++++++++++Comments++++++++++++

Figura 83. Diseño de la línea de continuación de las palabras clave de especificación de definición

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8 ...+... 9 ...+... 10DContinuedName+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Comments++++++++++++

Figura 84. Diseño de línea de nombre continuado de especificación de definición

Capítulo 18. Especificaciones de definición 231

Page 254: RPG Referencia

Utilice las posiciones 7-21 para especificar el nombre del elemento de datos que seva a definir. El nombre puede comenzar en cualquier posición del espacioproporcionado. Se puede utilizar el sangrado para indicar la forma de los datos enlas estructuras de datos.

Para las líneas de nombres continuados, se especifica un nombre en las posiciones7 a 80 de las líneas de nombres continuados y en las posiciones 7 a 21 de la líneade definición principal. Como en el caso de las definiciones tradicionales denombres, no tiene importancia si los caracteres están en mayúsculas o enminúsculas.

Para un subcampo descrito externamente, un nombre especificado aquí sustituye alnombre de subcampo externo especificado en la palabra clave EXTFLD.

Para una definición de parámetro con prototipo, la entrada de nombre es opcional.Si se especifica un nombre, éste se ignora. (Un parámetro con prototipo es unaespecificación de definición con espacios en blanco en las posiciones 24-25 situadoa continuación de una especificación PR o de otra definición de parámetro conprototipo.)

Si está definiendo un prototipo y, el nombre especificado en las posiciones 7-21 nosirve como nombre externo del procedimiento, utilice la palabra clave EXTPROCpara especificar el nombre externo válido. Por ejemplo, quizá sea necesario que elnombre externo esté en minúsculas, puesto que se está definiendo un prototipopara un procedimiento escrito en C.

Posición 22 (Descripción externa)Esta posición identifica una estructura de datos o un subcampo de estructura dedatos descrita externamente. Si en esta especificación no se define una estructurade datos o un subcampo, este campo debe dejarse en blanco.

EntradaExplicación de estructuras de datos

E Identifica una estructura de datos como descrita externamente: lasdefiniciones de subcampo se definen externamente. Si no se especifica lapalabra clave EXTNAME, las posiciones 7-21 deben contener el nombre delarchivo descrito externamente que contiene la definición de estructura dedatos.

BlancoDescrita por programa: le siguen a esta especificación definiciones desubcampo para esta estructura de datos.

EntradaExplicación de subcampos

E Identifica un subcampo de estructura de datos como descritoexternamente- Es necesaria la especificación de un subcampo descritoexternamente sólo cuando se requieren palabras clave, como por ejemploEXTFLD y INZ.

BlancoDescrito por programa: el subcampo de estructura de datos se define enesta línea de especificación.

232 VisualAge RPG Consulta del lenguaje

Page 255: RPG Referencia

Posición 23 (Tipo de estructura de datos)Esta entrada se utiliza para identificar el tipo de estructura de datos que se estádefiniendo. Si no está definiendo una estructura de datos, esta entrada debedejarse en blanco.

EntradaExplicación

BlancoLa estructura de datos que está definiéndose no es un estado de programani una estructura de datos; o en esta especificación no se está definiendouna estructura de datos.

S Estructura de datos de estado del programa. Sólo puede designarse unaestructura de datos como la estructura de datos de estado del programa.

U Estructura de datos de área de datos. El área de datos se recupera en lainicialización y se vuelve a grabar al final del programa:v Si se especifica la palabra clave DTAARA, se utiliza el parámetro de la

palabra clave DTAARA como el nombre del área de datos externa.v Si no se especifica la palabra clave DTAARA, se utiliza el nombre de las

posiciones 7-21 como el nombre del área de datos externa.

Posiciones 24-25 (Tipo de definición)

Entrada ExplicaciónBlanco La especificación define un subcampo de estructura de datos o un

parámetro dentro de una definición de interfaz de procedimientoo prototipo.

C (columna 24) La especificación define una constante. La posición 25 debe estaren blanco.

DS La especificación define una estructura de datos.M (columna 24) La especificación define una ventana de mensaje para utilizarla

con el código de operación DSPLY. La posición 25 debe estar enblanco.

PI La especificación define una interfaz de procedimiento y el valorde retorno, si hay alguno.

PR La especificación define un prototipo para una llamada a unarchivo local EXE, CMD o BAT. La especificación PR va seguidapor cero o más definiciones de parámetros (un blanco en lasposiciones 24-25), indicando el número y tipo de parámetros querequiere el programa. Una definición con prototipo finaliza con laprimera especificación de definición que no tenga blancos en lasposiciones 24-25 o con la primera especificación que no sea unaespecificación de definición.

S (columna 24) La especificación define un campo autónomo, una matriz o tabla.Los campos autónomos le permiten definir campos individualesde trabajo que no requieren la definición de una estructura dedatos. En los campos autónomos se permite lo siguiente:v Un campo autónomo tiene un tipo de datos internos

especificable.v Un campo autónomo puede definirse como una matriz, tabla o

campo.v Sólo se permite la anotación de longitud.

Las definiciones de estructuras de datos, prototipos e interfaces de procedimientofinalizan con la primera especificación de definición sin espacios en blanco en lasposiciones 24-25 o con la primera especificación que no sea de definición.

Capítulo 18. Especificaciones de definición 233

Page 256: RPG Referencia

Puede que las especificaciones de definición de campos autónomos y constantescon nombre no se incluyan en las especificaciones de definición para unaestructura de datos y sus subcampos.

Para consultar una lista de palabras clave válidas, agrupadas según el tipo dedefinición, vea “Resumen según el tipo de especificación de definición” en lapágina 262.

Posiciones 26-32 (Desde posición)Las posiciones 26-32 sólo pueden contener una entrada si se está definiendo laubicación de un subcampo en una estructura de datos.

EntradaExplicación

BlancoUna posición DESDE en blanco indica que el valor del campoA/LONGITUD especifica la longitud del subcampo o que no se estádefiniendo un subcampo en esta línea de especificación.

nnnnnnnPosición inicial absoluta del subcampo en una estructura de datos. El valorespecificado debe estar entre 1 y 65535para una estructura de datos connombre ( y entre 1 y 9999999 para una estructura de datos sin nombre) yestar justificado a la derecha en dichas posiciones.

Palabras reservadasSe permiten palabras reservadas para la estructura de datos de estado deprograma o para la estructura de datos de información de archivo(justificado a la izquierda) en los campos DESDE-A/LONGITUD(posiciones 26-39). Estas palabras reservadas especiales definen la ubicaciónde los subcampos en las estructuras de datos. Las palabras reservadas parala estructura de datos de estado del programa son *STATUS, *PROC,*PARM y *ROUTINE. Las palabras reservadas para la estructura de datosde información de archivo (INFDS) son *FILE, *RECORD, *OPCODE,*STATUS y *ROUTINE.

Posiciones 33-39 (Hasta posición/Longitud)Entrada

Explicación

BlancoSi las posiciones 33-39 están en blanco:v Se está definiendo una constante con nombre en esta línea de

especificación, ov Se está definiendo el campo autónomo o subcampo utilizando LIKE

(COMO) otro campo, ov El campo autónomo o subcampo tiene un tipo en el que la longitud es

implícita, ov Los atributos del subcampo están definidos en otro lugar, ov Se está definiendo una estructura de datos. La longitud de la estructura

de datos es el valor máximo del subcampo A-posiciones.

nnnnnnnLas posiciones 33-39 pueden contener un valor numérico (justificado a laderecha) entre 1 y 65535 para una estrctura de datos con nombre (y entre 1y 9999999 para una estructura de datos sin nombre), del modo siguiente:

234 VisualAge RPG Consulta del lenguaje

Page 257: RPG Referencia

v Si el campo Desde (posición 26-32) contiene un valor numérico, entoncesun valor numérico en este campo especifica la posición final absoluta delsubcampo en una estructura de datos.

v Si el campo Desde está en blanco, un valor numérico en este campoespecifica:– La longitud de toda la estructura de datos o– La longitud del campo autónomo o– La longitud del parámetro o– La longitud del subcampo.

En la estructura de datos, este subcampo se posiciona de tal modoque su posición inicial es mayor que el valor máximo de ″a posición″de todos los subcampos definidos en la estructura de datos. Se insertael relleno si el subcampo se define con el puntero de tipo base o conel puntero de procedimiento para asegurarse de que el subcampo estéalineado adecuadamente.

Nota: En los campos de tipo gráfico o UCS-2, el número que aquí seespecifica es el número de caracteres gráficos o UCS-2, NO elnúmero de bytes (1 carácter gráfico o UCS-2 = 2 bytes). En loscampos numéricos, el número que aquí se especifica es el númerode dígitos (para campos numéricos empaquetados y con zona :1-30; para campos numéricos binarios : 1-9; para camposnuméricos enteros y sin signo: 3, 5, 10 o 20).

+|-nnnnnEsta entrada es válida para campos autónomos o subcampos definidosutilizando la palabra clave LIKE. La longitud del campo autónomo osubcampo que se está definiendo en esta especificación de línea sedetermina sumando o restando el valor entrado en estas posiciones a lalongitud del campo especificado como el parámetro de la palabra claveLIKE.

Nota: En los campos de tipo gráfico o UCS-2, el número que aquí seespecifica es el número de caracteres gráficos o UCS-2, NO elnúmero de bytes (1 carácter gráfico o UCS-2 = 2 bytes). En loscampos numéricos, el número especificado aquí es el número dedígitos.

Palabras reservadasSi se utilizan las posiciones 26-32 para entrar palabras especialesreservadas, este campo se convierte en una extensión de la anterior,creando un campo de gran tamaño (posiciones 26-39), con lo que en estecampo se permite que se amplíen palabras reservadas cuyos nombrestengan una longitud superior a 7 caracteres. Consulte el apartado“Posiciones 26-32 (Desde posición)” en la página 234.

Posición 40 (Tipo de datos internos)Esta entrada le permite especificar cómo se almacena internamente un campoautónomo o un subcampo de estructura de datos. Esta entrada perteneceestrictamente a la representación interna del elemento de datos que se estádefiniendo, independientemente de cómo se ha almacenado externamente elelemento de datos (es decir, si se ha almacenado externamente). Para definir elformato de tipo carácter, gráfico y UCS-2 de longitud variable, debe especificar lapalabra clave VARYING; de lo contrario, el formato será de longitud fija.

EntradaExplicación

Capítulo 18. Especificaciones de definición 235

Page 258: RPG Referencia

BlancoSi no se especifica la palabra clave LIKE: el elemento está definiéndosecomo carácter si las posiciones decimales están en blanco. Si la entrada deposiciones decimales no está en blanco, el elemento está definiéndose comonumérico empaquetado si es un campo autónomo o como numérico conzona si es un subcampo.

Nota: La entrada debe estar en blanco cuando se especifica la palabraclave LIKE.

A Carácter (formato de longitud variable o fija)

N Carácter (formato indicador)

C UCS-2 (formato de longitud fija o variable)

G Gráfico (formato de longitud variable o fija)

T Hora

D Fecha

Z Indicación de la hora

P Numérico (Formato decimal empaquetado)

B Numérico (Formato binario)

I Numérico (Formato de entero)

S Numérico (Formato con zona)

U Numérico (Formato sin signo)

F Numérico (formato flotante)

O Objeto (sólo para aplicaciones Java™)

* Puntero de base o puntero de procedimiento

Posiciones 41-42 (Posiciones decimales)Las posiciones 41-42 se utilizan para indicar el número de posiciones decimales enun subcampo numérico o en un campo autónomo. Si el campo es numérico, debehaber siempre una entrada en estas posiciones; si no hay posiciones decimales,entre un 0.

EntradaExplicación

BlancoEl valor no es numérico o se ha definido con la palabra clave LIKE.

0-30 Posiciones decimales: el número de posiciones a la derecha del decimal enun campo numérico.

Esta entrada sólo suministrarse en combinación con el campo A/longitud. Si elcampo A/longitud está en blanco, el valor de esta entrada se define en otro lugardel programa (por ejemplo, a través de un archivo de base de datos descritoexternamente).

Posición 43 (Reservada)La posición 43 debe estar en blanco.

236 VisualAge RPG Consulta del lenguaje

Page 259: RPG Referencia

Posiciones 44-80 (Palabras clave)Las posiciones 44 a 80 se proporcionan para las palabras clave de especificación dedefinición. Las palabras clave se utilizan para describir y definir datos y susatributos. Consulte “Palabras clave de especificación de definición” para obteneruna descripción de cada palabra clave.

Utilice esta área para especificar cualquier palabra clave necesaria para definir porcompleto el campo.

Palabras clave de especificación de definiciónLas palabras clave de especificación de definición pueden no tener parámetros,tener parámetros opcionales o tener parámetros necesarios. La sintaxis de laspalabras clave es la siguiente:

Palabra clave(parámetro1 : parámetro2)

donde:v Los parámetros van entre paréntesis ().

Nota: No especifique paréntesis si no hay parámetros.v Se utilizan signos de dos puntos (:) para separar varios parámetros.

Se han utilizado los convenios de notación siguientes para mostrar qué parámetrosson opcionales y cuáles son obligatorios:v Las llaves { } indican parámetros opcionales o elementos opcionales de los

parámetros.v Unos puntos suspensivos (...) indican que el parámetro puede repetirse.v Un signo de dos puntos (:) establece una separación entre los parámetros e

indica que es posible especificar más de uno. Todos los parámetros que estánseparados por dos puntos son obligatorios a menos que vayan entre llaves.

v Una barra vertical (|) indica que sólo se puede especificar un parámetro para lapalabra clave.

v Un espacio en blanco entre los parámetros de la palabra clave indica que sepuede especificar más de uno.

Nota: Las llaves, los puntos suspensivos y las barras verticales no son parte de lasintaxis de las palabras clave y no deben figurar en el fuente.

Si se requiere espacio adicional para palabras clave, el campo de palabras clavepuede continuarse en las líneas subsiguientes. Consulte los apartados “Línea decontinuación de palabras clave de especificación de definición” en la página 230 y“Campo de palabras clave de especificación de definición” en la página 198.

ALIGNLa palabra clave ALIGN se utiliza para alinear subcampos flotantes, enteros y sinsigno. Al especificar ALIGN, los subcampos de 2 bytes se alinean en un límite de 2bytes, los subcampos de 4 bytes se alinean en un límite de 4 bytes y los subcamposde 8 bytes se alinean en un límite de 8 bytes. Quizá sea necesaria la alineaciónpara mejorar el rendimiento al acceder a subcampos flotantes, enteros y sin signo.

Especifique ALIGN en la definición de la estructura de datos, pero no puedeespecificar ALIGN para la estructura de datos de información de archivo (INFDS),ni para la estructura de datos del estado del programa (PSDS).

Capítulo 18. Especificaciones de definición 237

Page 260: RPG Referencia

La alineación únicamente se lleva a cabo para los subcampos de estructura dedatos definidos con notación de longitud y sin la palabra clave OVERLAY. Si loscampos que se están definiendo con notación absoluta o utilizando la palabra claveOVERLAY no están alineados correctamente, se emite un mensaje de diagnóstico.

Los subcampos de puntero siempre se alinean en un límite de 4 bytes, seespecifique o no ALIGN.

Consulte el apartado “Alineación de los subcampos de la estructura de datos” en lapágina 148 si desea más información.

ALT(nombre_matriz)La palabra clave ALT indica que la matriz de tiempo de compilación, o la matrizde tiempo de pre-ejecución o la tabla tiene un formato alternativo.

La matriz definida con la palabra clave ALT es la matriz alternativa y el nombre dematriz especificado como el parámetro es la matriz principal. La definición dematriz alternativa debe preceder o seguir la definición de matriz principal.

Las palabras clave de la matriz principal definen la carga de ambas matrices. Losdatos de inicialización están en orden alternativo, comenzando por la matrizprincipal, del modo siguiente: principal/alt/principal/alt/...

En la definición de matriz alternativa no son válidas las palabras clave PERRCD,FROMFILE, TOFILE y CTDATA.

ASCENDLa palabra clave ASCEND describe la secuencia de los datos de una matriz o tablacargada durante el tiempo de preejecución o durante el tiempo de compilación.Consulte el apartado “DESCEND” en la página 241.

La secuencia ascendente significa que las entradas de matriz o tabla debencomenzar con la entrada de datos inferior (según la clasificación ASCII poromisión) y seguir hasta la mayor. Se permiten los elementos de igual valor.

Al cargar datos en la matriz o tabla se comprueba la secuencia especificada de unamatriz o tabla de tiempo de preejecución. Si la matriz o tabla no está en secuencia,se pasa el control a la rutina de manejo de excepciones/errores. No se compruebala secuencia en una matriz de tiempo de ejecución (cargada mediante entrada y/oespecificaciones de cálculo).

Si se utiliza la operación LOOKUP para buscar una entrada en una matriz o tabla,debe especificarse una secuencia (ascendente o descendente) para determinar si laentrada es superior o inferior comparada con el argumento de búsqueda.

Si se utiliza el código de operación SORTA con una matriz y no se especifica unasecuencia, se presupone la secuencia ascendente.

BASED(nombre_puntero_de base)Cuando se especifica la palabra clave BASED para una estructura de datos o uncampo autónomo, se crea un puntero de base utilizando el nombre especificadocomo el parámetro de palabra clave. Este puntero de base contiene la dirección(ubicación de almacenamiento) de la estructura de datos o campo autónomo que se

238 VisualAge RPG Consulta del lenguaje

Page 261: RPG Referencia

está definiendo. En otras palabras, el nombre especificado en las posiciones 7-21 seutiliza para hacer referencia a los datos almacenados en la ubicación contenida enel puntero de base.

Nota: Antes de que pueda utilizarse la estructura de base de datos o el campoautónomo, debe asignarse una dirección válida al puntero de base.

Una matriz definida como campo autónomo basado debe ser una matriz de tiempode ejecución.

Si se define un campo basado dentro de un subprocedimiento, tanto el campocomo el puntero basado con locales.

BUTTON(botón1:botón2....)La palabra clave BUTTON define los pulsadores de la ventana de mensaje que seespecifiquen en el factor 2 del código de operación DSPLY. Puede especificar unmáximo de 3 parámetros de pulsador por palabra clave. Las combinaciones válidasde botones son las siguientes:

*OK *OK: *CANCEL *RETRY: *CANCEL*YESBUTTON: *NOBUTTON *RETRY: *ABORT: *IGNORE *YESBUTTON: *NOBUTTON:

*CANCEL

Esta palabra clave no se puede utilizar si se usan las palabras clave MSGDATA,MSGNBR o MSGTEXT.

CCSID(número | *DFT)Esta palabra clave establece el CCSID para las definiciones de tipos gráfico yUCS-2.

número debe ser un entero entre 0 y 65535. Debe ser un valor de CCSID gráfico oUCS-2 válido. Los CCSID UCS-2 válidos son 13488 y 17584.

En los campos descritos por el programa, CCSID(número) altera temporalmente losvalores por omisión establecidos con la palabra clave CCSID(*GRAPH: *SRC),CCSID(*GRAPH: número) o CCSID(*UCS2: número) en la especificación decontrol.

CCSID(*DFT) indica que debe utilizarse el CCSID por omisión del módulo. Estaopción resulta de utilidad cuando se utiliza la palabra clave LIKE, ya que, de locontrario, el nuevo campo heredaría el CCSID del campo fuente.

Si no se especifica esta palabra clave, se asume el CCSID gráfico o UCS-2 poromisión del módulo. (No se permite esta palabra clave en los campos gráficoscuando se especifica o se asume CCSID(*GRAPH : *IGNORE)).

Si no se especifica esta palabra clave y se especifica la palabra clave LIKE, el nuevocampo tendrá el mismo CCSID que el del campo LIKE.

CLASS(*JAVA:nombre_clase)

Restricción: Una palabra clave de sólo Java

Capítulo 18. Especificaciones de definición 239

Page 262: RPG Referencia

Para declarar campos que puedan almacenar objetos, especifique O en la columna40 de la especificación D y utilice la palabra clave CLASS para proporcionar laclase del objeto. La palabra clave CLASS necesita dos parámetros:CLASS(*JAVA:nombre_clase)

*JAVA identifica el objeto como objeto Java. nombre_clase especifica la clase delobjeto. El nombre de clase debe ser un literal de tipo carácter y con él la clase Javadebe quedar totalmente calificada. El nombre de clase es sensible a las mayúsculasy minúsculas.

Los campos de tipo O no pueden definirse como subcampos de estructuras dedatos. Es posible disponer de matrices de campos de tipo O, pero no estánpermitidas las tablas de tipo O porque éstas deben precargarse en tiempo deejecución.

Las palabras clave siguientes no pueden utilizarse con la palabra clave CLASS: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

Si desea obtener más información sobre las llamadas a métodos Java, así comoejemplos, consulte la publicación Programación con VisualAge para RPG.

CLTPGM(nombre de programa)Se utiliza la palabra clave CLTPGM para especificar el nombre del programa localal que llama el programa VisualAge RPG, utilizando la operación CALLP.

El programa local al que se llama puede ser un archivo EXE, PIF, COM o BAT.

La extensión por omisión es EXE.

Nota: Para cada parámetro se debe codificar una especificación de definición.

CONST(constante)Se utiliza la palabra clave CONST para especificar el valor de una constante connombre. Esta palabra clave es opcional (puede especificarse el valor de la constantecon o sin la palabra clave CONST) y sólo es válida para definiciones de constantescon nombre (C en la posición 24).

El parámetro debe ser un literal, una constante figurativa o una funciónincorporada. Puede continuarse la constante en las líneas subsiguientes siguiendolas reglas de continuación adecuadas. Consulte el apartado “Reglas decontinuación” en la página 195.

Si se utiliza una constante con nombre como un parámetro para las palabras claveDIM, OCCURS, PERRCD o OVERLAY, antes de utilizarla se debe definir laconstante con nombre.

Cuando se especifica un parámetro de referencia de sólo lectura, se especifica lapalabra clave CONST en la especificación de definición de la definición deparámetro de la interfaz del procedimiento y del prototipo. No se permite ningúnparámetro para la palabra clave.

240 VisualAge RPG Consulta del lenguaje

Page 263: RPG Referencia

Cuando se especifica la palabra clave CONST, el compilador puede copiar elparámetro en uno temporal y pasar la dirección de este último. Algunascondiciones que podrían causar esto son: el parámetro pasado es una expresión oel parámetro pasado tiene un formato diferente.

No utilice esta palabra clave como una definición de prototipo a menos que estéseguro de que el programa o procedimiento no cambiarán el parámetro.

Si el procedimiento o programa llamado se compilan utilizando una interfaz deprocedimiento con el mismo prototipo, el usuario no deberá preocuparse, puestoque el compilador se encarga de comprobarlo.

Pasar un parámetro por valor de constante ofrece las mismas ventajas que pasarlopor valor. En particular, le permite pasar literales y expresiones.

CTDATALa palabra clave CTDATA indica que la matriz o tabla se carga utilizando los datosde tiempo de compilación. Los datos se especifican al final del programa despuésde la especificación ** o **CTDATA(nombre matriz/tabla).

Cuando se carga una matriz o tabla en tiempo de compilación, se compila juntocon el programa fuente y se incluye en el programa. No es necesario cargarindependientemente dicha matriz o tabla cada vez que se ejecuta el programa.

DATFMT(formato{separador})La palabra clave DATFMT especifica el formato de fecha interno para un campo deFecha y opcionalmente el carácter separador. Esta palabra clave se generaautomáticamente para un subcampo de estructura de datos descrita externamentede tipo Fecha y se determina en tiempo de compilación.

Esta palabra clave se puede utilizar al definir parámetros CALLP.

Consulte el apartado “DATFMT(fmt{separador})” en la página 205.

La jerarquía utilizada al determinar el formato interno y el separador para unamatriz o campo de fecha proviene de:1. La palabra clave DATFMT especificada en la especificación de definición2. La palabra clave DATFMT indicada en la especificación de control3. *ISO

DESCENDLa palabra clave DESCEND describe la secuencia de los datos en una matriz otabla cargada durante el tiempo de preejecución o durante el tiempo decompilación. Consulte el apartado “ASCEND” en la página 238.

La secuencia descendente significa que las entradas de matriz o tabla debencomenzar por la entrada de datos superior (según la secuencia de clasificación) ycontinuar hasta la inferior. Se permiten los elementos de igual valor.

Al cargar datos en la matriz o tabla se comprueba la secuencia especificada de unamatriz o tabla de tiempo de preejecución. Si la matriz o tabla no está en secuencia,se pasa el control a la rutina de manejo de excepciones/errores. No se compruebala secuencia en una matriz de tiempo de ejecución (cargada mediante entrada y/oespecificaciones de cálculo).

Capítulo 18. Especificaciones de definición 241

Page 264: RPG Referencia

Si se utiliza la operación LOOKUP para buscar una entrada en una matriz o tabla,debe especificarse una secuencia (ascendente o descendente) para determinar si laentrada es superior o inferior comparada con el argumento de búsqueda.

Si se utiliza el código de operación SORTA con una matriz y no se especifica unasecuencia, se presupone la secuencia ascendente.

DIM(constante_numérica)La palabra clave DIM define el número de elementos de una matriz o tabla.

La constante numérica debe tener cero (0) posiciones decimales. Puede ser unliteral, una constante con nombre o una función incorporada.

El valor de constante debe conocerse en el momento de procesar la palabra clave ode lo contrario se producirá un error de tiempo de compilación.

Esta palabra clave se puede utilizar al definir parámetros CALLP.

DLL(nombre)La palabra clave DLL, junto con la palabra clave LINKAGE, se utiliza para crear elprototipo de un procedimiento que llama a funciones contenidas en bibliotecasDLL de Windows®, incluyendo las API de Windows.

El siguiente ejemplo muestra cómo codificar el prototipo y llamar a la funciónGetCurrentDirectory de la API de Windows:

La A del nombre de procedimiento externo (GetCurrentDirectoryA) indica que seva a llamar la versión de un solo byte de la DLL. Para llamar a la versión Unicode,especifique una W.

DTAARA{(nombre_área_datos)}La palabra clave DTAARA se utiliza para asociar un campo autónomo, estructurade datos, subcampo de estructura de datos o estructura de datos del área de datoscon un área de datos externa. La palabra clave DTAARA tiene la misma funciónque el código de operación *DTAARA DEFINE. Consulte el apartado “Definiciónde un campo como un área de datos” en la página 429.

Si no se especifica nombre_área_datos, el nombre especificado en las posiciones 7 a21 será también el nombre de área de datos. Si se especifica, debe ser un nombrede área de datos.

Si no se especifica el parámetro, debe especificarse el nombre de la estructura dedatos.

D GetCurDir PR 10I 0 ExtProc('GetCurrentDirectoryA')

D DLL('KERNEL32.DLL')D Linkage(*StdCall)D 10I 0 ValueD 255AD CurDir S 255AD CurDirSiz S 10I 0 Inz(%Size(CurDir))D RCLong S 10I 0

C Eval RCLong = GetCurDir(CurDirSiz:CurDir)

242 VisualAge RPG Consulta del lenguaje

Page 265: RPG Referencia

Cuando se especifica la palabra clave DTAARA, pueden utilizarse los códigos deoperación IN, OUT y UNLOCK en el área de datos.

EXTFLD(nombre_campo)La palabra clave EXTFLD se utiliza para redenominar un subcampo de unaestructura de datos descrita externamente. El parámetro nombre_campo es elnombre externo del subcampo. El nombre del programa a utilizar se especifica enel campo de nombre (posiciones 7-21).

La palabra clave es opcional. Si no se especifica, se utiliza el nombre extraído de ladefinición externa como el nombre del subcampo de estructura de datos.

Si se especifica la palabra clave PREFIX para la estructura de datos, no se aplicaráel prefijo a los campos redenominados con EXTFLD.

EXTFMT(código)La palabra clave EXTFMT especifica el tipo de datos externos para las matrices ylas tablas numéricas de tiempo de compilación y de tiempo de preejecución. El tipode datos externos es el formato de los datos de los registros del archivo. Estaentrada no tiene ningún efecto en el formato utilizado para el proceso interno (eltipo de datos internos) de la matriz o tabla del programa.

Los valores posibles para el parámetro son:

S Los datos para la matriz o tabla están en formato decimal con zona.

P Los datos para la matriz o tabla están en formato decimal empaquetado.

B Los datos para la matriz o tabla están en formato binario.

C Los datos para la matriz o tabla están en formato UCS-2.

I Los datos para la matriz o tabla están en formato de entero.

L Los datos para un elemento de tabla o matriz numérica tienen un signomás o un signo menos a la izquierda.

R Los datos para una matriz numérica o elemento de tabla tienen un signomás o menos a continuación (derecha).

U Los datos para la matriz o tabla están en formato sin signo.

F Los datos para la matriz o tabla están en formato numérico flotante.

Notas:

1. Si no se especifica la palabra clave EXTFMT, el formato externo toma el valorpor omisión ’S’ para las matrices y las tablas de no flotantes y la representaciónflotante de visualización externa para las matrices y tablas de flotantes detiempo de preejecución.

2. Para las matrices y tablas de tiempo de compilación, únicamente se permitenlos valores S, L y R, a menos que el tipo de datos sea flotante, en cuyo caso, nose permite la palabra clave EXTFMT.

3. No se permite EXTFMT(I) ni EXTFMT(U) para las matrices definidas con másde 10 dígitos. Las matrices definidas como de 1 a 5 dígitos ocuparán 2 bytes.Las matrices definidas como de 6 a 10 dígitos ocuparán 4 bytes.

4. Cuando se utiliza EXTFMT(I) o EXTFMT(U), las matrices que se definan paratener de 1 a 5 dígitos ocuparán 2 bytes por elemento. Las matrices que se

Capítulo 18. Especificaciones de definición 243

Page 266: RPG Referencia

definan para tener de 6 a 10 dígitos ocuparán 4 bytes por elemento. Lasmatrices que se definan para tener de 11 a 20 dígitos ocuparán 8 bytes porelemento.

5. El formato externo por omisión de las matrices UCS-2 es de carácter. El númerode caracteres que se permite tener en los datos UCS-2 en tiempo decompilación es el número de caracteres de doble byte de la matriz UCS-2.

6. No puede utilizarse la palabra clave EXTFMT si los datos para la matriz o tablaresiden en la estación de trabajo.

EXTNAME(nombre_archivo{:nombre_formato})La palabra clave EXTNAME especifica el nombre del archivo que contiene lasdescripciones de campo utilizadas como descripción de subcampo para laestructura de datos que está definiéndose.

El parámetro nombre_archivo es obligatorio. Opcionalmente, puede especificarseun nombre de formato para dirigir el compilador a un formato específico en unarchivo. Si no se especifica nombre_formato, se utiliza el primer formato deregistro.

Si la definición de la estructura de datos contiene una E en la columna 22 y no seespecifica la palabra clave EXTNAME, se utiliza el nombre especificado en lasposiciones 7-21.

El compilador genera las entradas de especificación de definición siguientes paratodos los campos de la estructura de datos descrita externamente:v Nombre de subcampo: este nombre es el mismo que el nombre externo, a menos

que se le cambie el nombre mediante la palabra clave EXTFLD o se utilice lapalabra clave PREFIX para aplicar un prefijo.

v Longitud de subcampov Tipo de datos interno de subcampo: este nombre es el mismo que el tipo

externo, a menos que se especifique la palabra clave de especificación de controlCVTOPT para el tipo. En tal caso, el tipo de datos será carácter.

Con la palabra clave EXTNAME se permite todas las palabras clave de laestructura de datos.

EXTPROC(nombre)La palabra clave EXTPROC indica el nombre externo del procedimiento cuyoprototipo se está definiendo. El nombre puede ser una constante de caracteres o unpuntero de procedimiento. Cuando se especifica EXTPROC, se debe llamar alprocedimiento utilizando CALLB o CALLP.

Si no se especifica EXTPROC, el compilador asume que se está definiendo unprocedimiento y le asigna el nombre externo que se encuentra en las posiciones7-21.

Si el nombre especificado para EXTPROC (o el nombre de prototipo si no se haespecificado EXTPROC) empieza con ″CEE″ o un subrayado (’_’), el compilador lotratará como una incorporación del sistema. Si en realidad no es una incorporacióndel sistema, aparecerá un mensaje de aviso en el listado; Para evitar la confusióncon las API que proporciona el sistema, se aconseja que el nombre de losprocedimientos no empiece por ″CEE″.

244 VisualAge RPG Consulta del lenguaje

Page 267: RPG Referencia

Si se especifica un puntero de procedimiento, debe asignársele una dirección válidaantes de utilizarlo en una llamada. Debe señalar a un procedimiento cuyo valor deretorno y parámetros sean coherentes con la definición de prototipo.

Por ejemplo, para definir el prototipo para el procedimiento SQLAllocEnv, que estáen el programa QSQCLI, se puede codificar la especificación de definiciónsiguiente:

D SQLEnv PR EXTPROC('SQLAllocEnv')

La Figura 85 muestra un ejemplo de la palabra clave EXTPROC con un puntero deprocedimiento como parámetro.

La forma extendida de la palabra clave EXTPROC sólo puede utilizarse para crearprototipos de metodos Java a los que se llama desde aplicaciones Java de VARPG.Consulte el apartado “Prototipos de métodos Java”.

Prototipos de métodos JavaLos métodos Java deben ser prototipos para que las aplicaciones Java de VARPGpuedan llamarlos correctamente. El compilador debe conocer el nombre delmétodo, la clase a la que pertenece, los tipos de datos de los parámetros y el tipode datos del valor de retorno (si lo hubiera), así como si el método es estático o no.

Para especificar el nombre del método y la clase a la que pertenece, se utiliza lapalabra clave EXTPROC extendida. El formato de la palabra clave EXTPROC es:EXTPROC(*JAVA:nombre_clase:nombre_método | *JAVARPG:nombre_clase:nombre_método)

Los valores de parámetro posibles son:

*JAVA:nombre_clase:nombre_métodoIdentifica el método como método Java que ha sido generado a partir decódigo escrito inicialmente en Java.

*JAVARPG:nombre_clase:nombre_métodoIdentifica un método Java generado por VARPG.

D* Da por supuesto que se está llamando a un procedimiento que tiene unD* puntero de procedimiento como el EXTPROC. Así es como se defineD* el prototipo:D*D DspMsg PR 10A EXTPROC(DspMsgPPtr)D Msg 32767AD Length 4B 0 VALUED*D* Así es como debe definirse el prototipo que se podríaD* that DspMsgPPtr could be assigned to.D*D MyDspMsg PR LIKE(DspMsg)D Msg 32767AD Length 4B 0 VALUEC*C* Antes de llamar a DSPMSG, debe asignar DSPMSGPPTRC* para el nombre de procedimiento real de MyDspMsg,C* es decir, MYDSPMSG.C*C EVAL DspMsgPPtr = %paddr('MYDSPMSG')C EVAL Reply = DspMsg(Msg, %size(Msg))...

P MyDspMsg B

Figura 85. Especificación del nombre externo de un procedimiento de prototipo

Capítulo 18. Especificaciones de definición 245

Page 268: RPG Referencia

Los métodos generados por VARPG permiten que ciertos tipos de datos seanpasados por referencia cuando normalmente no pueden pasarse por referenciaen Java. Esto permite utilizar el mismo código ya sea para tener como destinouna aplicación Windows o para generar código fuente Java.

El nombre de clase y el de método deben ser literales de tipo carácter y sonsensibles a las mayúsculas y minúsculas. El nombre de clase debe ser un nombrede clase Java totalmente calificado. El nombre de método debe ser el nombre delmétodo al que debe llamarse.

Los tipos de datos de los parámetros y el valor de retorno del método seespecifican de la misma forma que cuando se crea un prototipo de un subproceso.No obstante, el compilador correlaciona tipos de datos VARPG con los tipos dedatos Java tal como se indica a continuación:

Tipo de datos Java Tipo de datos VARPGboolean indicador (N)byte[] alfanumérico (A de cualquier longitud)byte entero (3I)int entero (10I)short entero (5I)long entero (20I)float coma flotante (4F)double coma flotante (8F)cualquier objeto objeto (O)

Cuando se llama a métodos generados por VARPG (*JAVARPG), se puedeespecificar el tipo de datos con zona, empaquetado, binario y sin signo como tipode datos de los parámetros y los valores de retorno. Los métodos generados apartir de código escrito inicialmente en Java no pueden utilizar estos tipos de datosen el prototipo para parámetros o valores de retorno.

Al llamar a un método, el compilador acepta matrices como parámetros si éste esun prototipo que utiliza la palabra clave DIM. En caso contrario, sólo se aceptaránlos campos escalares, las estructuras de datos y las tablas.

No se puede llamar a métodos que esperan el tipo de datos Java char ni a los quedevuelven este tipo de valor.

Si el valor de retorno de un método es un objeto, la clase del objeto se proporcionacodificando la palabra clave CLASS en el prototipo. El nombre de claseespecificado será el del objeto que se devuelve.

Si el método invocado es estático, se debe especificar la palabra clave STATIC en elprototipo.

En Java, los tipos de datos siguientes sólo pueden pasarse por valor:byteintshortlongfloatdouble

246 VisualAge RPG Consulta del lenguaje

Page 269: RPG Referencia

Se debe especificar la palabra clave VALUE en el prototipo de los parámetros quesean de estos tipos. La palabra clave VALUE no es necesaria si se llama a métodosgenerados por VARPG, ya que estos tipos de datos pueden pasarse por referencia.

Los objetos sólo se pueden pasar por referencia. La palabra clave VALUE no puedeespecificarse con tipo ’O’. Debido a que Java percibe las matrices como objetos, losparámetros correlacionados con matrices deben también pasarse por referencia.Esto incluye a las matrices de bytes.

Si desea obtener más información sobre las llamadas a métodos Java, así comoejemplos, consulte la publicación Programación con VisualAge para RPG.

FROMFILE(nombre_archivo)La palabra clave FROMFILE especifica el archivo con los datos de entrada para lamatriz o tabla de tiempo de preejecución que se está definiendo. Se debeespecificar la palabra clave FROMFILE para cada matriz o tabla de tiempo depreejecución utilizada en el programa.

Consulte el apartado “TOFILE(nombre_archivo)” en la página 261.

INZ{(valor inicial)}La palabra clave INZ inicializa el campo autónomo, estructura de datos osubcampo de estructura de datos con el valor por omisión para su tipo de datos uopcionalmente en la constante especificada entre paréntesis. Cuando se utiliza parainicializar una estructura de datos, no se permite el parámetro de constante. Enuna estructura de datos descrita por el programa no se permite ningún parámetroen la palabra clave INZ.

La constante especificada debe corresponderse con el tipo que está inicializándose.La constante puede ser un literal, una constante con nombre, una constantefigurativa o una función incorporada. Cuando se inicializan campos de tipo dedatos de fecha u hora, o constantes con nombre con valores de fecha u hora, elformato del literal debe corresponderse con el formato por omisión derivado de laespecificación de control, independientemente del formato real del campo de fechau hora.

Un campo numérico se puede inicializar con cualquier tipo de literal numérico. Sinembargo, un literal numérico sólo se puede utilizar con un campo flotante. Todocampo numérico puede inicializarse con un literal hexadecimal de 16 dígitos omenos. En este caso, se considera que el literal hexadecimal es un valor numéricosin signo.

Si se especifica INZ(*EXTDFT), los subcampos de estructuras de datos descritasexternamente se inicializan con los valores por omisión de la palabra clave DFT delas DDS. Si no se especifica DFT ni un valor de constante, se utiliza el valor poromisión correspondiente al tipo de archivo. El valor especificado en las DDS puedealterarse temporalmente codificando INZ con o sin parámetros en la especificaciónde subcampo.

Si se especifica INZ(*EXTDFT) en la definición de estructura de datos externa, seinicializarán todos los subcampos descritos externamente tomando el valor poromisión de las DDS. Si la estructura de datos descrita externamente tienesubcampos descritos por programa adicionales, éstos se inicializan tomando losvalores por omisión RPG.

Capítulo 18. Especificaciones de definición 247

Page 270: RPG Referencia

Cuando utilice INZ(*EXTDFT), tenga en cuenta lo siguiente:v Si el valor de las DDS correspondiente al campo de fecha o de la hora no tiene

el formato interno RPG, se convertirá al formato interno que esté en vigor parael programa.

v Las descripciones externas deben estar en archivo físicos.v Si se especifica *NULL para un campo con posibilidad de nulos en las DDS, el

compilador utilizará el valor por omisión de las DDS correspondiente a dichocampo como valor inicial.

v Si se especifica DFT(’’) para un campo de longitud variable, el campo seinicializará con una serie de longitud 0.

v INZ(*EXTDFT) no está permitido si la opción CVTOPT está en vigor.v Si no se especifica ningún valor inicial, o si se especifica *NULL, para los

campos de fecha, hora o indicación de la hora, el valor inicial del campo seestablece en *LOVAL.

Una estructura de datos, un subcampo de estructura de datos o un campoautónomo definido con la palabra clave INZ no puede especificarse como unparámetro en una entrada *ENTRY PLIST.

Nota: Cuando no se especifica el parámetro INZ:v Los campos autónomos estáticos y los subcampos de estructuras de datos

inicializados se inicializan con sus valores iniciales por omisión (porejemplo, espacios en blanco para carácter, 0 para número).

v Los subcampos de estructuras de datos no inicializados estáticos (INZ noespecificado en la especificación de definición para la estructura de datos)se inicializan mediante espacios en blanco (sin tener en cuenta el tipo dedatos).

v Los campos del almacenamiento automático no se inicializan.

Esta palabra clave no es válida en combinación con BASED.

LIKE(nombre_RPG)La palabra clave LIKE se utiliza para definir un elemento similar a otro existente.Cuando se especifica la palabra clave LIKE, el elemento que está definiéndosetoma la longitud y el formato de datos del elemento especificado como parámetro.Los campos autónomos, los prototipos, los parámetros y los subcampos deestructuras de datos se pueden definir utilizando esta palabra clave. El parámetrode LIKE puede ser un campo autónomo, una estructura de datos, un subcampo deestructura de datos, un parámetro en una definición de interfaz de procedimiento oun nombre de prototipo. La entrada de tipo de datos (posición 40) debe estar enblanco.

Esta palabra clave es similar al código de operación *LIKE DEFINE (véase elapartado “Definición de un campo basándose en otro campo” en la página 428). Noobstante, se diferencia de *LIKE DEFINE en que los datos que se definen adoptantambién el formato de datos y CCSID además de la longitud.

Nota: El elemento definido no hereda atributos tales como NOOPT, ASCEND,CONST y la posibilidad de nulo del parámetro de LIKE. Únicamente seheredan el tipo de datos, la longitud, las posiciones decimales y el CCSID.

Si el parámetro de LIKE es un prototipo, el elemento que se está definiendo tendráel mismo tipo de datos que el valor de retorno del prototipo. Si no existe ningúnvalor de retorno, se emite un mensaje de error.

248 VisualAge RPG Consulta del lenguaje

Page 271: RPG Referencia

Esta palabra clave se puede utilizar al definir parámetros CALLP. Consulte elapartado “Definición de un campo basándose en otro campo” en la página 428.

Puede utilizarse LIKE para definir campos de caracteres, campos gráficos, camposnuméricos y matrices. A continuación se indican algunas consideraciones a tener encuenta al utilizar la palabra clave LIKE con distintos tipos de datos:v En los campos de caracteres, el número especificado en la entrada A/Longitud

es el número de caracteres adicionales (o menor)v En los campos gráficos o UCS-2, el número especificado en la entrada

A/Longitud es el número de caracteres gráficos o UCS-2 adicionales (o menor)(1 carácter gráfico o UCS-2 = 2 bytes).

v En los campos numéricos, el número especificado en la entrada A/Longitud esel número de dígitos adicionales (o menor). En los campos enteros o sin signo,los valores de ajuste deben ser tales que el número resultante de dígitos delcampo sea 3, 5, 10 o 20. Para campos flotantes, no se permite el ajuste delongitud.

v En los campos de fecha, hora, indicación de la hora, puntero de base opuntero de procedimiento, la entrada A/Longitud (posiciones 33-39) debe estaren blanco.

Cuando se utiliza LIKE para definir una matriz, sigue siendo necesaria la palabraclave DIM para definir las dimensiones de la matriz. Sin embargo, puede utilizarseDIM(%elem(matriz)) para definir una matriz exactamente igual que otra matriz.

A continuación se facilitan ejemplos de cómo definir datos utilizando la palabraclave LIKE.

LINKAGE(tipo_enlace)Cuando define un nombre de programa que se utilizará con las operaciones CALLy START, la palabra clave LINKAGE especifica la ubicación del programa al que sellama. Utilice el valor de parámetro *SERVER con esta palabra clave en laoperación CALL. El parámetro *SERVER especifica que el programa que estállamando existe en un servidor AS/400. Utilice el valor del parámetro *CLIENTcon esta palabra clave en la operación START.

La palabra clave LINKAGE, junto con la palabra clave DLL, especifica el conveniode enlace (interfaz) que deberá utilizarse cuando se invoquen funciones en una

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++D.....................................Keywords+++++++++++++++++++++++++++++D*D* Definir un campo como otro con un aumento de longitud de 5 caracteres.D*D Name S 20D Long_name S +5 LIKE(Name)D*D* Definir una matriz de subcampo de estructura de datos con DIM(20) comoD* otro campo e inicializar cada elemento de matriz con el valor *ALL'X'.D* Asimismo, declarar otro subcampo de tipo puntero inmediatamenteD* a continuación del primer subcampo. El puntero se define implícitamenteD* con una longitud de 4 bytes.D*D Struct DSD Dim20 LIKE(Name) DIM(20) INZ(*ALL'X')D Pointer *

Figura 86. Definición de campos LIKE como otros campos

Capítulo 18. Especificaciones de definición 249

Page 272: RPG Referencia

DLL. El convenio de enlace especificado debe coincidir con el de la DLL externa ala que ha de accederse. Las API de sistema Windows utilizan el convenio de enlaceStdCall. Así pues, cuando vaya a crear un prototipo de una API de sistemaWindows, especifique LINKAGE(*STDCALL).

No utilice la palabra clave LINKAGE si utiliza la palabra clave DLL para crear unprototipo de un subprocedimiento VARPG en una aplicación NOMAIN. Elcompilador utilizará el convenio de enlace por omisión OptLink.

Cuando cree prototipos de DLL propias, hágalo con el convenio de enlace*STDCALL o bien *OPTLINK. La utilización de otros convenios de enlace puedetener un resultado imprevisible o provocar errores de ejecución.

MSGDATA(msgdata1:msgdata2....)La palabra clave MSGDATA define el texto de substitución, utilizado en el factor 1del código de operación DSPLY, en forma de lista de nombres de campo que sedefinen en el programa. El compilador VisualAge RPG sustituye cada variable desubstitución por el correspondiente campo definido. Por ejemplo, %1 se sustituiríapor el primer campo definido en MSGDATA, %2 por el segundo campo definidoen MSGDATA, etc. Las variables de sustitución se definen entrando el carácter detanto por ciento (%) seguido de un solo dígito (1 a 9). Puede especificar unmáximo de 3 parámetros por palabra clave.

Las palabras clave MSGDATA y MSGNBR se utilizan juntas.

MSGNBR(*MSGnnnn o nombre de campo)La palabra clave MSGNBR define el número de mensaje utilizado en el factor 1 delcódigo de operación DSPLY. El número de mensaje puede tener una longitudmáxima de 4 dígitos. Debe especificar uno de los elementos siguientes:v El identificador de mensaje (por ejemplo, *MSG0001)v Un campo que contenga el número de mensaje (por ejemplo, *MSG0001)

Si el mensaje tiene texto de sustitución, utilice las palabras clave MSGNBR yMSGDATA conjuntamente.

MSGTEXT(’texto mensaje’)La palabra clave MSGTEXT define el texto del mensaje, que se especifica entreapóstrofos (’). Este texto se utiliza en el factor 1 del código de operación DSPLY.Esta palabra clave no se puede utilizar si se usan las palabras clave BUTTON,MSGDATA, MSGNBR, MSGTITLE o STYLE.

MSGTITLE(’título’)La palabra clave MSGTITLE especifica el texto del título de la ventana de mensaje(factor 2 del código de operación DSPLY). Puede especificar un identificador demensaje de 8 caracteres encerrado entre apóstrofos (’), por ejemplo, ’*MSG0001’, oun número de mensaje de 4 dígitos. Si utiliza un número de mensaje, el texto serecuperará del archivo de mensajes. (Utilice la opción Definir mensajes delDiseñador GUI para especificar títulos con formato de mensaje.)

Esta palabra clave no se puede utilizar si se usan las palabras clave MSGDATA,MSGNBR o MSGTEXT.

250 VisualAge RPG Consulta del lenguaje

Page 273: RPG Referencia

NOOPTNo se llevará a cabo ninguna optimización en el campo autónomo, en elparámetro, o en la estructura de datos para la que se ha especificado esta palabraclave. De este modo se asegura que el contenido del elemento de datos sea elúltimo valor asignado. Esto puede ser necesario para aquellos campos cuyosvalores se utilicen en el manejo de excepciones.

Nota: El optimizador puede mantener algunos valores en los registros yrestaurarlos sólo para el almacenamiento en puntos definidos previamentedurante la ejecución normal del programa. El manejo de excepciones puederomper esta secuencia de ejecución normal y, consecuentemente, puede quelas variables contenidas en registros no se devuelvan a sus ubicaciones dealmacenamiento asignadas. Como resultado, cuando se utilizan dichasvariables en el manejo de excepciones, es posible que no contengan elúltimo valor asignado. La palabra clave NOOPT garantiza su actualización.

Si un elemento de datos que se va a pasar mediante referencia se define con lapalabra clave NOOPT, todas las definiciones de parámetros de interfaz deprocedimiento o prototipos también deben tener especificada la palabra claveNOOPT. Este requisito no se aplica a los parámetros que se pasan mediante valor.

Todas las palabras clave permitidas para definiciones de campos autónomosparámetros o definiciones de estructuras de datos están permitidas con NOOPT.

Esta palabra clave se puede utilizar al definir parámetros CALLP.

NOWAITLa palabra clave NOWAIT permite llamar a un programa AS/400 que utilice unarchivo de estación de trabajo. Consulte la sección “Llamada a un programaAS/400 que utiliza un archivo de estación de trabajo” en la página 406 paraobtener más detalles.

OCCURS(constante_numérica)La palabra clave OCCURS especifica el número de apariciones de una estructurade datos de múltiples apariciones.

El parámetro constante_numérica debe ser un valor mayor que cero sin posicionesdecimales. Puede ser un literal numérico, una función incorporada que devuelveun valor numérico o una constante numérica. El valor de constante debe conocerseen el momento de procesar la palabra clave o de lo contrario se producirá un errorde tiempo de compilación.

Esta palabra clave no es válida para una estructura de datos de estado deprograma, una estructura de datos de información de archivo o una estructura dedatos de área de datos.

Si una estructura de datos de múltiples apariciones contiene subcampos depuntero, la distancia entre las apariciones debe ser un múltiple exacto de 4 debidoa las limitaciones de almacenamiento del sistema para punteros. Esto significa quela distancia entre apariciones puede ser mayor que la longitud de cada aparición.

El ejemplo siguiente muestra la asignación del almacenamiento de una estructurade datos de múltiples apariciones con subcampos de puntero.

Capítulo 18. Especificaciones de definición 251

Page 274: RPG Referencia

OPTIONS(*OMIT *VARSIZE *STRING *RIGHTADJ)La palabra clave OPTIONS se utiliza para especificar:v Si puede pasarse el valor especial *OMIT para el parámetro pasado por

referenciav Si un parámetro que se pasa mediante referencia puede ser de longitud más

corta de lo que se ha especificado en el prototipo.v Si el programa o procedimiento llamado espera un puntero para una serie con

terminación de nulo, permitiendo especificar una expresión de carácter como elpuntero pasado.

No puede especificarse la palabra clave OPTIONS sin un parámetro. Se puedeespecificar más de un parámetro en una especificación de definición, pero cadaparámetro debe ser diferente.

El valor puede ser *OMIT, *STRING, *VARSIZE o *RIGHTADJ.

Cuando se especifica OPTIONS(*OMIT), se permite el valor *OMIT para dichoparámetro. *OMIT sólo está permitido para parámetros CONST y parámetros quese pasan por referencia.

OPTIONS(*VARSIZE) sólo es válido para los parámetros pasados por referenciaque tengan un tipo de datos carácter, gráfico o UCS-2 o que representen unamatriz de cualquier tipo.

Cuando se especifica OPTIONS(*VARSIZE), el parámetro pasado puede tener unalongitud menor o mayor que la definida en el prototipo. Asegurarse de que seaccede sólo a los datos que se han pasado exactamente depende del programa osubprocedimiento al que se llame. Para comunicar el volumen de datos que se hapasado, se puede pasar un parámetro más que contenga la longitud o bien utilizarlos descriptores operativos del subprocedimiento. Si se trata de campos de

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... *DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords++++++++++++++++++++++++++++D DS1 DS OCCURS(2)D POINTER 4*D FLD5 5D DS2 DS OCCURS(2)D CHAR16 4D CHR5 5

Asignación de campos en el almacenamiento. Las apariciones de DS1 están separadas por 8bytes, mientras que las apariciones de DS2 están separadas por 9 bytes.

DS1 APARICIÓN 1

DS2 APARICIÓN 1

DS1 APARICIÓN 2

DS2 APARICIÓN 2

PUNTERO

CAR4

PUNTERO

CAR4

FLD5

CAR5

FLD5

CAR5

(rellenar) (rellenar)

Figura 87. Asignación de almacenamiento de estructuras de datos de múltiples aparicionescon subcampos de puntero

252 VisualAge RPG Consulta del lenguaje

Page 275: RPG Referencia

longitud variable, puede utilizar la función incorporada %LEN para determinarcuál es la longitud actual del parámetro pasado.

Si no se especifica OPTIONS(*VARSIZE) para los campos de longitud fija, debepasar como mínimo tantos datos como requiera el prototipo; en el caso de loscampos de longitud variable, el parámetro debe tener la misma longitud máximadeclarada que la indicada en la definición.

Nota: En las opciones de paso de parámetros *OMIT y *VARSIZE, esresponsabilidad del programador del procedimiento asegurarse de quedichas opciones se manejen.

Al especificar OPTIONS(*STRING) para un parámetro de puntero de base pasadomediante valor o mediante una referencia de constante, se puede pasar tanto unpuntero como una expresión de caracteres. Si se pasa una expresión de carácter, secrea un valor temporal que contiene el valor de la expresión de carácter seguida deun terminador de nulo (x’00’). La dirección de este valor temporal se pasa alprograma o procedimiento llamados.

Cuando en un prototipo de función se especifica OPTIONS(*RIGHTADJ) para unparámetro CONST o VALUE, el valor del parámetro de tipo carácter, gráfico oUCS-2 se ajusta a la derecha. No se permite esta palabra clave en un parámetro delongitud variable dentro del prototipo de una función. Los valores de longitudvariable pueden pasarse como parámetros en una llamada a procedimiento cuandose define el correspondiente parámetro con OPTIONS(*RIGHTADJ).

El ejemplo siguiente muestra cómo codificar un prototipo y un procedimientoutilizando OPTIONS(*OMIT) para indicar que es posible pasar el valor especial*OMIT como parámetro.

Capítulo 18. Especificaciones de definición 253

Page 276: RPG Referencia

El ejemplo siguiente muestra cómo codificar un prototipo y un procedimiento quepermitan parámetros de longitud variable, con OPTIONS(*VARSIZE).

F*FQSYSPRT O F 10 PRINTER USROPND*D* En el prototipo siguiente se describe un procedimiento que permiteD* pasar como parámetro el valor especial *OMIT.D* Si se pasa el parámetro, se establece en '1' si se produce un errorD* y en '0' si no.D OpenFile PRD Error 1A OPTIONS(*OMIT)C*C SETOFF 10C* En la primera llamada a OpenFile se supone que no habrá errores,C* por lo que no se preocupa del código de error y pasa *OMIT.C CALLP OpenFile(*OMIT)C*C* La segunda llamada a OpenFile pasa un indicador, de manera queC* se pueda comprobar si se ha producido un error.C CALLP OpenFile(*IN10)C IF *IN10C ... an error occurredC ENDIFC RETURNP*----------------------------------------------------------------P* OpenFileP* Este procedimiento debe comprobar el número de parámetros desdeP* que se ha definido el segundo con OPTIONS(*NOPASS).P* Debe utilizar el segundo parámetro sólo si se ha pasado.P*----------------------------------------------------------------P OpenFile BD OpenFile PID Error 1A OPTIONS(*OMIT)D SaveIn01 S 1AC* Guardar el valor actual del indicador 01 por si se utilizaC* en otro sitio.C EVAL SaveIn01 = *IN01C* Abrir el archivo. *IN01 inidicará si se produce un error.C OPEN QSYSPRT 01C* Si se ha pasado el parámetro Error, actualizarlo con el indicadorC IF %ADDR(Error) <> *NULLC EVAL Error = *IN01C ENDIFC* Restaurar *IN01 a su valor original.C EVAL *IN01 = SaveIn01P OpenFile E

Figura 88. Utilización de OPTIONS(*OMIT)

254 VisualAge RPG Consulta del lenguaje

Page 277: RPG Referencia

D* En el prototipo siguiente se describe un procedimiento que permiteD* pasar una matriz de longitud variable y un campo de tipo carácterD* de longitud variable. El resto de parámetros indican las longitudes.D Search PR 5U 0D SearchIn 50A OPTIONS(*VARSIZE)D DIM(100) CONSTD ArrayLen 5U 0 VALUED ArrayDim 5U 0 VALUED SearchFor 50A OPTIONS(*VARSIZE) CONSTD FieldLen 5U 0 VALUED*D Arr1 S 1A DIM(7) CTDATA PERRCD(7)D Arr2 S 10A DIM(3) CTDATAD Elem S 5U 0C* Llamar a Search para buscar una matriz de 7 elementos de longitud 1C* con un arcgumento de búsqueda de longitud 1. Dado que '*' es el 5ºC* elemento de la matriz, el valor de Elem será 5.C EVAL Elem = Search(Arr1 :C %SIZE(Arr1) : %ELEM(Arr1) :C '*' : 1)C* Llamar a Search para buscar una matriz de 3 elementos de longitud 10C* con un arcgumento de búsqueda de longitud 4. Dado que 'Pink' no estáC* en la matriz, el valor de Elem será 0.C EVAL Elem = Search(Arr2 :C %SIZE(Arr2) : %ELEM(Arr2) :C 'Pink' : 4)C RETURN

Figura 89. Utilización de OPTIONS(*VARSIZE) (Pieza 1 de 2)

Capítulo 18. Especificaciones de definición 255

Page 278: RPG Referencia

El ejemplo siguiente muestra cómo utilizar OPTIONS(*STRING) para codificarprototipo y un procedimiento que utilicen una serie terminada en nulo variable.

P*------------------------------------------------------------P* Search:P* Busca SearchFor en la matriz SearchIn. DevuelveP* el elemento en el que se encuentra el valor ó 0 si no se encuentra.P* Los parámetros de tipo carácter pueden tener una longitud oP* dimensión cualquiera, ya que OPTIONS(*VARSIZE) está especificadoP* para ambas.P*------------------------------------------------------------P Search BD Search PI 5U 0D SearchIn 50A OPTIONS(*VARSIZE)D DIM(100) CONSTD ArrayLen 5U 0 VALUED ArrayDim 5U 0 VALUED SearchFor 50A OPTIONS(*VARSIZE) CONSTD FieldLen 5U 0 VALUED I S 5U 0C* Comprobar los elementos de la matriz para ver si iguales queC* en SearchFor. Utilizar la dimensión que se ha pasado comoC* parámetro en lugar de la dimensión declarada. UtilizarC* %SUBST con la longitud de parámetro, ya que éstos puedenC* no tener la longitud declarada.C 1 DO ArrayDim I 5 0C* Si este elemento coincide con SearchFor, volver al índice.C IF %SUBST(SearchIn(I) : 1 : ArrayLen)C = %SUBST(SearchFor : 1 : FieldLen)C RETURN IC ENDIFC ENDDOC* No se ha encontrado ningún elemento coincidente.C RETURN 0P Search E

**CTDATA ARR1A2$@*jM**CTDATA ARR2RojoAzulAmarillo

Figura 89. Utilización de OPTIONS(*VARSIZE) (Pieza 2 de 2)

256 VisualAge RPG Consulta del lenguaje

Page 279: RPG Referencia

OVERLAY(nombre{:pos | *NEXT})La palabra clave OVERLAY solapa el almacenamiento de un subcampo con el deotro o con el de la estructura de datos en sí. Esta palabra clave únicamente sepermite para subcampos de estructuras de datos.

El subcampo Nombre de entrada solapa el almacenamiento especificado medianteel nombre de parámetro en la posición especificada por el parámetro de posición.Si no se especifica posición, toma por omisión el valor de 1.

Nota: El parámetro de posición está en unidades de bytes, independientemente delos tipos de los subcampos.

Al especificar OVERLAY(nombre:*NEXT) coloca el subcampo en la siguienteposición disponible dentro del campo solapado. (Esta posición será el primer bytesituado después de todos los otros subcampos anteriores a este subcampo quesolapen el mismo subcampo.)

Las reglas siguientes se aplican a la palabra clave OVERLAY:v El parámetro de nombre debe ser el nombre de un subcampo definido

anteriormente en la estructura de datos actual o el nombre de la estructura dedatos actual.

D* En el prototipo siguiente se describe un procedimiento que esperaD* un parámetro de serie terminado en nulo. Devuelve la longitudD* de la serie.D StringLen PR 5U 0D Pointer * VALUE OPTIONS(*STRING)D P S *D Len S 5U 0C*C* Llamar a StringLen con un literal de tipo carácter. El resultado seráC* 4, ya que el literal tiene una logitud de 4 bytes.C EVAL Len = StringLen('abcd')C*C* Llamara a StringLen con un puntero que señala a una serie. Utilizar ALLOCC* para conseguir almacenamiento para el puntero y %STR para inicializar elC* almacemiento en 'My string¬' donde '¬' representa el carácterC* de terminación nula x'00'.C* El resultado será 9, que es la longitud de 'My string'.C ALLOC 25 PC EVAL %STR(P:25) = 'My string'C EVAL Len = StringLen(P)C* Liberar el almacenamiento.C DEALLOC PC RETURNP*------------------------------------------------------------P* StringLen:P* Devuelve la longitud de la serie a la que señala elP* parámetro.P*------------------------------------------------------------P StringLen BD StringLen PI 5U 0D Pointer * VALUE OPTIONS(*STRING)C RETURN %LEN(%STR(Pointer))P StringLen E

Figura 90. Utilización de OPTIONS(*STRING)

Capítulo 18. Especificaciones de definición 257

Page 280: RPG Referencia

v El parámetro de posición (si se especifica) debe ser un valor mayor que 0 sinposiciones decimales. Puede ser un literal numérico, una función incorporadaque devuelve un valor numérico o una constante numérica. Si el parámetro deposición es una constante con nombre, debe definirse antes de estaespecificación.

v La palabra clave OVERLAY no está permitida cuando no está en blanco laentrada Desde posición.

v Si el parámetro de nombre es un subcampo, el subcampo que se está definiendodebe estar contenido completamente dentro del subcampo especificado por elparámetro de nombre.

v El campo que se está definiendo debe estar contenido completamente dentro delsubcampo especificado por el parámetro de nombre.

v La alineación de subcampos definidos utilizando la palabra clave OVERLAY sedebe llevar a cabo manualmente. Si no están alineados correctamente, se emiteun mensaje de aviso.

v Si el subcampo especificado como el primer parámetro de la palabra claveOVERLAY es una matriz, la palabra clave OVERLAY se aplica a cada elementode la matriz. Es decir, el campo se define como una matriz con el mismo númerode elementos. El primer elemento de esta matriz solapa el primer elemento de lamatriz solapada, el segundo elemento de esta matriz solapa el segundo elementode la matriz solapada, y así sucesivamente. No se pueden especificar palabrasclave de matriz para el subcampo con la palabra clave OVERLAY en estasituación. Consulte la Figura 91 en la página 259 y “SORTA (Clasificar unamatriz)” en la página 539.Si el nombre de subcampo, especificado como el primer parámetro de la palabraclave OVERLAY, es una matriz y su longitud de elemento es mayor que lalongitud del subcampo que está definiéndose, no se almacenarán de modocontiguo los elementos de matriz del subcampo que está definiéndose. Dichamatriz no está permitida como el campo de resultado de una operación PARM odel Factor 2 ni como el campo de resultado de una operación MOVEA.

v Si se especifica la palabra clave ALIGN en la estructura de datos, los subcamposdefinidos con OVERLAY(nombre:*NEXT) se alinean utilizando su alineaciónpreferida. Los subcampos de puntero siempre se alinean en un límite de 4 bytes.

v Si un subcampo con subcampos solapados no se define de otro modo, se defineimplícitamente del modo siguiente:– La posición inicial es la primera posición disponible en la estructura de datos.– Su longitud es la longitud mínima que puede contener todos los campos

solapados. Si el subcampo se define como una matriz, su longitud seaumentará para garantizar una alineación correcta de todos los subcampossolapados.

Ejemplos

258 VisualAge RPG Consulta del lenguaje

Page 281: RPG Referencia

El siguiente ejemplo muestra dos modos equivalentes de definir posicionessolapadas de subcampos: explícitamente con (nombre:pos) e implícitamente con(nombre:*NEXT).

PACKEVENLa palabra clave PACKEVEN indica que la matriz o campo empaquetado tiene unacantidad par de dígitos. La palabra clave sólo es válida para los subcampos deestructura de datos descritos por programa empaquetados que se han definido

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... *DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords++++++++++++++++++++++++++++D DataStruct DSD A 10 DIM(5)D B 5 OVERLAY(A)D C 5 OVERLAY(A:6)

Asignación de campos en el almacenamiento:

A(1) A(2) A(3) A(4) A(5)

B(1) C(1) B(2) C(2) B(3) C(3) B(4) C(4) B(5) C(5)

Figura 91. Asignación de almacenamiento de subcampos con palabras clave DIM yOVERLAY

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... *DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords++++++++++++++++++++++++++++D DataStruct DSD A 5D B 1 OVERLAY(A) DIM(4)

Asignación de campos en el almacenamiento:

A

B(1) B(2) B(3) B(4)

Figura 92. Asignación de almacenamiento de subcampos con palabras clave DIM yOVERLAY

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... *DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++* Definir explícitamente posiciones solapadas de subcampos

D DataStruct DSD PartNumber 10AD Family 3A OVERLAY(PartNumber)D Sequence 6A OVERLAY(PartNumber:4)D Language 1A OVERLAY(PartNumber:10)

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... *DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++* Definir posiciones solapadas de subcampos con *NEXT

D DataStruct DSD PartNumberD Family 3A OVERLAY(PartNumber)D Sequence 6A OVERLAY(PartNumber:*NEXT)D Language 1A OVERLAY(PartNumber:*NEXT)

Figura 93. Definición de posiciones solapadas de subcampos con *NEXT

Capítulo 18. Especificaciones de definición 259

Page 282: RPG Referencia

utilizando las posiciones DESDE/A. Para un elemento de campo o matriz delongitud N, si no se ha especificado la palabra clave PACKEVEN, el número dedígitos es 2N - 1; si se ha especificado la palabra clave PACKEVEN, el número dedígitos es 2(N-1).

PERRCD(constante_numérica)La palabra clave PERRCD especifica el número de elementos por registro para unamatriz o tabla de tiempo de preejecución o tiempo de compilación. Si no seespecifica la palabra clave PERRCD, el número de elementos por registro toma elvalor por omisión de uno (1).

El parámetro constante_numérica debe ser un valor mayor que cero sin posicionesdecimales. Puede ser un literal numérico, una función incorporada que devuelveun valor numérico o una constante numérica. Si el parámetro no es una constantecon nombre, debe definirse antes de esta especificación.

La palabra clave PERRCD únicamente es válida cuando se especifica la palabraclave FROMFILE, TOFILE o CTDATA.

PREFIX(serie_prefijo{:núm_de_car_sustit})La palabra clave PREFIX especifica una serie que ha de ser un prefijo de losnombres de subcampo de la estructura de datos descrita externamente que se estádefiniendo. Además, opcionalmente puede especificar un valor numérico paraindicar el número de caracteres, si existe alguno, a sustituir del nombre existente.Si no se especifica el parámetro ’num_de_car_sustit’, la serie se une al principio delnombre.

Si se especifica ’núm_de_car_sustit’, debe ser un valor numérico comprendidoentre 0 y 9 sin posiciones decimales. Especificar un valor de cero es equivalente ano especificar ’núm_de_car_sustit’ en absoluto. Por ejemplo, la especificaciónPREFIX(YE:3) cambiaría el nombre de campo ’YTDTOTAL’ por ’YETOTAL’.

Se aplican las reglas siguientes:v Los subcampos que se redenominan explícitamente utilizando la palabra clave

EXTFLD no están afectados por esta palabra clave.v La longitud total de un nombre después de aplicar el prefijo no debe exceder de

la longitud máxima de un nombre de campo RPG.v Si el número de caracteres del nombre al que se añade el prefijo es inferior o

igual al valor que representa el parámetro ’num_de_car_sustit’, se sustituye elnombre completo por serie_prefix.

PROCPTRLa palabra clave PROCPTR define un elemento como un puntero deprocedimiento. El campo Tipo de datos internos (posición 40) debe contener un *.

STATICLa palabra clave STATIC especifica que el elemento de datos se guardará en unalmacenamiento estático y, por consiguiente, mantendrá su valor a través de lasllamadas al procedimiento en el que se ha definido. La palabra clave únicamentese puede utilizar dentro de un subprocedimiento. Todos los campos globales sonestáticos.

El elemento de datos se inicializa al activar el subprocedimiento en el que estácontenido. No se reinicializa, aunque se vuelva a llamar al subprocedimiento.

260 VisualAge RPG Consulta del lenguaje

Page 283: RPG Referencia

Si no se especifica STATIC, todos los elementos de datos definidos localmente sealmacenan en almacenamiento automático. Los datos almacenados enalmacenamiento automático se inicializan al principio de cada llamada. Cuando sellama a un procedimiento reiteradamente, cada invocación obtiene su propia copiadel almacenamiento.

STYLE(tipo_estilo)La palabra clave STYLE indica el tipo de estilo utilizado para la ventana demensaje (factor 2 del código de operación DSPLY). El tipo de estilo puede ser unade las constantes figurativas siguientes:v *INFOv *WARNv *HALT

Esta palabra clave no se puede utilizar si se usan las palabras clave MSGDATA,MSGNBR o MSGTEXT.

TIMFMT(formato{separador})La palabra clave TIMFMT especifica un formato horario interno y, opcionalmente,el separador horario para cualquiera de estos elementos de tipo Hora: campoindependiente; subcampo de estructura de datos; parámetro de prototipo o valorde retorno en una definición de interfaz de procedimiento o de prototipo. Estapalabra clave se genera automáticamente para un subcampo de estructura de datosdescrito externamente de tipo Hora.

Si no se especifica TIMFMT, los campos de tipo Hora tendrán el formato horario yel separador del campo especificados en la palabra clave TIMFMT de laespecificación de control, si está presente. Si no se especifica en la especificación decontrol, tendrá el formato *ISO.

Consulte la Tabla 20 en la página 127 para ver cuáles son los formatos y losseparadores válidos.

La jerarquía utilizada al determinar el formato interno y el separador para unamatriz o campo de hora proviene de:1. La palabra clave TIMFMT indicada en la especificación de definición2. La palabra clave TIMFMT indicada en la especificación de control3. *ISO

TOFILE(nombre_archivo)La palabra clave TOFILE especifica un archivo de destino en el que se escribe unatabla o matriz de tiempo de preejecución o de tiempo de compilación.

Si se ha de grabar una matriz o tabla, especifique como el parámetro de la palabraclave el nombre del archivo combinado. Este archivo también debe definirse en lasespecificaciones de descripción de archivo. Una matriz o tabla sólo puede grabarseen un dispositivo de salida.

Si se ha de grabar una matriz o archivo en el mismo archivo desde el que se haleído, debe especificarse como parámetro TOFILE el mismo nombre de archivo quese ha especificado como parámetro FROMFILE. Este archivo debe definirse comoun archivo combinado (C en la posición 17 de la especificación de descripción dearchivo).

Capítulo 18. Especificaciones de definición 261

Page 284: RPG Referencia

VALUELa palabra clave VALUE indica que el parámetro se pasa por valor en lugar de porreferencia. Los parámetros se pueden pasar por valor al llamar al procedimiento alque están asociados utilizando una llamada de procedimiento.

Cuando se utiliza la palabra clave CLTPGM, los parámetros deben pasarse porvalor.

Las reglas sobre qué se puede pasar como parámetro por valor a un procedimientollamado son las mismas por que rigen lo se puede asignar utilizando la operaciónEVAL. El parámetro recibido por el procedimiento corresponde al lado izquierdode la expresión; al parámetro pasado corresponde al lado derecho. Consulte elapartado “EVAL (Evaluar expresión)” en la página 446 si desea más información.

VARYINGLa palabra clave VARYING indica que un campo de tipo carácter, gráfico o UCS-2,definido en las especificaciones de definición, debe tener un formato de longitudvariable. Si no se especifica esta palabra clave en los campos de tipo carácter,gráfico o UCS-2, se definirán con una longitud fija.

Si desea más información, consulte el apartado “Formato carácter, gráfico y UCS-2de longitud variable” en la página 105.

Resumen según el tipo de especificación de definiciónLa Tabla 31 en la página 263 lista las entradas obligatorias y permitidas para cadatipo de especificación de definición.

La Tabla 32 en la página 263 y la Tabla 33 en la página 264 contienen las listas delas palabras clave permitidas para cada tipo de especificación de definición.

En cada una de estas tablas, una R indica que es obligatoria una entrada en estasposiciones y, una A indica que se permite una entrada en estas posiciones.

262 VisualAge RPG Consulta del lenguaje

Page 285: RPG Referencia

Tabla 31. Entradas obligatorias/permitidas para cada Tipo de especificación de definición

Tipo Pos. 7-21Nombre

Pos. 22Externa

Pos. 23Tipo DS

Pos.24-25TipoDefn.

Pos.26-32 De

Pos.33-39 A /Longitud

Pos. 40Tipo dedatos

Pos.41-42Pos.decimal

Pos.44-80Palabrasclave

Estructura dedatos

A A A R A A

Subcampo deestructura dedatos

A A A A A A

Subcampoexterno

A R A

Campoautónomo

R R A A A A

Constante connombre

R R R

Prototipo R R A A A A

Parámetro deprototipo

A A A A A

Interfaz deprocedimiento

A R A A A A

Parámetro deinterfaz deprocedimiento

R A A A A

Tabla 32. Palabras clave de estructura de datos, campos autónomos, constantes connombre y ventana de mensajes

Palabra claveEstructurade datos

Subcampode

estructurade datos

Subcampoexterno

Campoautónomo

Constanteconnombre

Ventanademensaje

ALIGN A

ALT A A A

ASCEND A A A

BASED A A

BUTTON A

CCSID A A

CONST (1.) R

CTDATA (2.) A A A

DATFMT A A

DESCEND A A A

DIM A A A

DTAARA (2.) A A A

EXTFLD A

EXTFMT A A A

EXTNAME(4.)

A

Capítulo 18. Especificaciones de definición 263

Page 286: RPG Referencia

Tabla 32. Palabras clave de estructura de datos, campos autónomos, constantes connombre y ventana de mensajes (continuación)

Palabra claveEstructurade datos

Subcampode

estructurade datos

Subcampoexterno

Campoautónomo

Constanteconnombre

Ventanademensaje

FROMFILE(2.)

A A A

INZ A A A A

LIKE A A

LINKAGE R R

MSGDATA A

MSGNBR A

MSGTEXT A

MSGTITLE A

NOOPT A A

OCCURS A

OVERLAY A

PACKEVEN A

PERRCD A A A

PREFIX (4.) A

PROCPTR A A

STATIC (3.) A A

STYLE A

TIMFMT A A

TOFILE (2.) A A A

VARYING A A

Nota:

1 Cuando se define una constante con nombre, la palabra clave es opcional, pero elparámetro para la palabra clave es obligatorio. Por ejemplo, para asignar el valor’10’ a una constante con nombre, se puede especificar CONST(’10’) o ’10’.

2 Esta palabra clave sólo se aplica a definiciones globales.

3 Esta palabra clave sólo se aplica a definiciones locales.

4 Esta palabra clave sólo se aplica a estructuras de datos descritas externamente.

Tabla 33. Palabras clave de prototipo, interfaz de procedimiento y parámetro

Palabra clave Prototipo (PR) Interfaz deprocedimiento (PI)

Parámetro PR o PI

ASCEND A

CLTPGM A

CONST A

DATFMT A A A

DESCEND A

264 VisualAge RPG Consulta del lenguaje

Page 287: RPG Referencia

Tabla 33. Palabras clave de prototipo, interfaz de procedimiento y parámetro (continuación)

Palabra clave Prototipo (PR) Interfaz deprocedimiento (PI)

Parámetro PR o PI

DIM A A A

EXTPROC A

LIKE A A A

NOOPT A

OPTIONS A

PROCPTR A A A

TIMFMT A A A

VALUE A

VARYING A A A

Capítulo 18. Especificaciones de definición 265

Page 288: RPG Referencia

266 VisualAge RPG Consulta del lenguaje

Page 289: RPG Referencia

Capítulo 19. Especificaciones de entrada

En un archivo de entrada descrito por programa, las especificaciones de entradadescriben los tipos de registro del archivo, los datos de un campo y los indicadoresbasados en el contenido de los campos.

En un archivo descrito externamente, las especificaciones de entrada sonopcionales y pueden utilizarse para añadir funciones a la descripción externa.

Hallará información detallada sobre las especificaciones de entrada en:v “Archivos descritos por programa” en la página 268v “Archivos descritos externamente” en la página 276

Sentencia de especificación de entradaLa disposición general de la especificación de salida es:v El tipo de especificación de entrada (I) se entra en la posición 6v La sección no de comentario de la especificación abarca de la posición 7 a la

posición 80v La sección de comentarios de la especificación abarca de la posición 81 a la

posición 100.

Descrito por programaEn los archivos descritos por programa, las entradas de la especificaciones deentrada se dividen en dos categorías:v Las entradas de identificación de registro (posiciones 7 a 46), que describen el

registro de entrada y su relación con otros registros del archivo.

v Las entradas de descripción de campo (posiciones 31 a 74), que describen loscampos de los registros. Cada campo está descrito en una línea diferente, debajode su entrada de identificación de registro correspondiente.

Descrito externamenteEn los archivos descritos externamente, las entradas de las especificaciones deentrada se dividen en las categorías siguientes:v Entradas de identificación de registro (posiciones 7 a 16 y 21 a 22), que

identifican el registro (el formato de registro descrito externamente) al que seañadirán funciones VARPG.

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8 ...+... 9 ...+... 10IFilename++Sq..RiPos1+NCCPos2+NCCPos3+NCC..................................Comments++++++++++++I.........And..RiPos1+NCCPos2+NCCPos3+NCC..................................Comments++++++++++++

Figura 94. Diseño de registro descrito por programa

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8 ...+... 9 ...+... 10I........................Fmt+SPFrom+To+++DcField+++++++++....FrPlMnZr......Comments++++++++++++

Figura 95. Diseño de campo descrito por programa

© Copyright IBM Corp. 1994, 2000 267

Page 290: RPG Referencia

v Entradas de descripción de campo (posiciones 21 a 30, 49 a 66 y 69 a 74), quedescriben las funciones VARPG a añadir a los campos del registro. Las entradasde descripción de campo se graban en las líneas a continuación de las entradasde identificación de registro correspondientes.

Archivos descritos por programaLos archivos descritos por programa incluyen las entradas siguientes en lasespecificaciones de entrada:

Posición 6 (Tipo de formulario)Debe aparecer una I en la posición 6 para identificar esta línea como una sentenciade especificación de entrada.

Entradas de identificación de registroLas entradas de identificación de registro (posiciones 7 a 46) para un archivodescrito por programa describen el registro de entrada y su relación con otrosregistros del archivo.

Posiciones 7-16 (Nombre de archivo)Entrada

Explicación

Un nombre de archivo válido

Es el mismo nombre de archivo que aparece en las especificaciones dedescripción de archivo para el archivo de entrada.

Entre el nombre del archivo a describir en estas posiciones. Este nombredebe ser el mismo que el que se ha definido para el archivo en lasespecificaciones de descripción de archivo. Este debe ser un archivo deentrada, un archivo de actualización o un archivo combinado. El nombrede archivo debe entrarse en la primera línea de identificación de registrode cada archivo y puede entrarse en las líneas de identificación de registrosubsiguientes de dicho archivo. Todas las entradas que describan unarchivo de entrada deben aparecer juntas; no pueden mezclarse con lasentradas de otros archivos.

Posiciones 16-18 (Relación lógica)Entrada

Explicación

AND Se utilizan más de tres códigos de identificación.

OR Dos o más tipos de registros tienen campos comunes.

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8 ...+... 9 ...+... 10IRcdname+++....Ri..........................................................Comments++++++++++++

Figura 96. Diseño de registro descrito externamente

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8 ...+... 9 ...+... 10I..............Ext-field+..................Field+++++++++......PlMnZr......Comments++++++++++++

Figura 97. Diseño de campo descrito externamente

268 VisualAge RPG Consulta del lenguaje

Page 291: RPG Referencia

Puede utilizarse un número ilimitado de líneas AND/OR. Para obtener másinformación consulte “Relación AND” en la página 271 y “Relación OR” en lapágina 271.

Posiciones 17-18 (Secuencia)Entrada

Explicación

Cualquier par de caracteres alfanuméricosNo se efectúa una comprobación de secuencia especial

Posición 19 (Reservada)Entrada

Explicación

BlancoNo se comprueba en los tipos de registro la existencia de una secuenciaespecial (las posiciones 17 y 18 tienen entradas alfanuméricas).

Posición 20 (Opción)Entrada

Explicación

BlancoEsta entrada debe estar en blanco cuando las posiciones 17 y 18 contienenuna entrada alfanumérica.

Posiciones 21-22 (Indicador de identificación de registro)Entrada

Explicación

BlancoNo se utiliza indicador

01-99 Indicador general

LR Indicador de nivel de control utilizado para un indicador de identificaciónde registro

Los indicadores especificados en estas posiciones se utilizan junto con los códigosde identificación de registro (posiciones 23 a 46).

IndicadoresLas posiciones 21 y 22 asocian un indicador con el tipo de registro definido en estalínea. Puede entrar 01 a 99 o LR.

Cuando se selecciona un registro para su proceso y satisface las condicionesindicadas por los códigos de identificación de registro, se activa el indicador deidentificación de registro correspondiente. Este indicador puede utilizarse paracondicionar las operaciones de cálculo y salida. El programador puede activar odesactivar los indicadores de identificación de registro.

Posiciones 23-46 (Códigos de identificación de registro)Las entradas de las posiciones 23 a 46 identifican cada tipo de registro del archivode entrada. En cada línea de especificación se pueden entrar de uno a tres códigos

Capítulo 19. Especificaciones de entrada 269

Page 292: RPG Referencia

de identificación. Pueden especificarse más de tres códigos de identificación deregistro en líneas adicionales con la relación AND/OR. Si el archivo contiene sóloun tipo de registro, los códigos de identificación pueden dejarse en blanco; sinembargo, debe realizarse una entrada de indicador de identificación de registro(posiciones 21 y 22) y una entrada de secuencia (posiciones 17 y 18).

Nota: Los códigos de identificación de registro no son aplicables para el procesodel tipo de datos gráfico UCS-2: se efectúa una identificación de registro sóloen las posiciones de un solo byte.

Pueden realizarse tres series de entradas en las posiciones 23 a 46: 23 a 30, 31 a 38y 39 a 46. Cada serie se divide en cuatro grupos: ,,, . posición, no, componente decódigo y carácter.

La tabla siguiente muestra qué posiciones de cada serie utilizan las categorías.

Categoría 23-30 31-38 39-46Posición 23-27 31-35 39-43No 28 36 44Componente de código 29 37 45Carácter 30 38 46

No es necesario que las entradas de estas series estén en secuencia. Por ejemplo,puede realizarse una entrada en las posiciones 31 a 30 sin que se requiera unaentrada en las posiciones 23 a 30. No son necesarias las entradas para los códigosde identificación de registro si los registros de entrada de un archivo son delmismo tipo. Una especificación de entrada que no contenga un código deidentificación de registro define el último tipo de registro para el archivo,permitiendo de este modo el manejo de cualquier tipo de registros no definidos. Sino se satisface ningún código de identificación de registro, el control pasa a larutina VARPG que maneja las excepciones/errores.

Posiciones 23-27, 31-35 y 39-43 (Posición)Entrada Explicación

Blanco El código de identificación de registro no está presente.

1-32766 Esta es la posición que contiene el código de identificación delregistro. La posición que contiene el código debe estar contenida enla longitud de registro especificada para el archivo. Esta entradadebe ajustarse a la derecha, pero pueden omitirse los cerosiniciales.

Posiciones 28, 36 y 44 (No)Entrada

Explicación

BlancoEl código de identificación de registro debe estar presente.

N Una N en esta posición significa que el código de identificación de registrono debe estar presente en la posición de registro especificada.

Posiciones 29, 37 y 45 (Componente de código)Esta entrada especifica qué componente del carácter del código de identificación deregistro se ha de comprobar.

270 VisualAge RPG Consulta del lenguaje

Page 293: RPG Referencia

EntradaExplicación

C Todo el carácter

D Dígito

Carácter (C): La entrada C indica que se ha de comprobar toda la estructura (zonay dígito) del carácter.

Dígito (D): La entrada D indica que se ha de comprobar la parte de dígito delcarácter. Los cuatro bits situados más a la derecha se comparan con el carácterespecificado en la entrada de posición.

Posiciones 30, 38 y 46 (Carácter)Una entrada en esta posición indica el carácter de identificación que se comparacon el carácter de la posición especificada en el registro de entrada.

La comprobación de tipo de registro comienza por el primer tipo de registroespecificado. Si los datos de un registro satisfacen más de un grupo de códigos deidentificación de registro, el primer tipo de registro satisfecho determina los tiposde registro.

Cuando para un archivo se especifica más de un tipo de registro, los códigos deidentificación de registro deben codificarse de modo que cada registro de entradatenga una serie exclusiva de códigos de identificación.

Relación ANDLa relación AND se utiliza cuando más de tres códigos de identificación deregistros identifican un registro.

Para utilizar la relación AND, entre como mínimo un código de identificación deregistro en la primera línea y entre los códigos de identificación de registrorestantes en las líneas siguientes con AND codificado en las posiciones 16 a 18para cada línea adicional que se utilice. Las posiciones 7 a 15, 19 a 20 y 46 a 80 decada línea con AND en las posiciones 16 a 18 deben estar en blanco. Las entradasdel indicador de identificación de registro y secuencia se efectúan en la primeralínea del grupo y no pueden especificarse en las líneas adicionales.

Puede utilizarse un número ilimitado de líneas AND/OR en las especificaciones deentrada.

Relación ORLa relación OR se utiliza cuando dos o más tipos de registros tienen camposcomunes.

Para utilizar la relación OR, entre OR en las posiciones 16 y 17. Las posiciones 7 a15, 18 a 20 y 46 a 80 deben estar en blanco. Puede entrarse un indicador deidentificación de registro en las posiciones 21 y 22. Si se realiza la entrada delindicador y se satisfacen los códigos de identificación de registro de la línea OR, seactiva el indicador especificado en las posiciones 21 y 22 de dicha línea. Si no seefectúa ninguna entrada de indicador, se activa el indicador de la línea anterior.

Puede utilizarse un número ilimitado de líneas AND/OR en las especificaciones deentrada.

Capítulo 19. Especificaciones de entrada 271

Page 294: RPG Referencia

Entradas de descripción de campoLas entradas de descripción de campo (posiciones 31 a 74) deben seguir a lasentradas de identificación de registro (posiciones 7 a 46) para cada archivo.

Posición 6 (Tipo de formulario)Debe aparecer una I en la posición 6 para identificar esta línea como una sentenciade especificación de entrada.

Posiciones 7-30 (Reservado)

Las posiciones 7-30 deben estar en blanco.

Posiciones 31-34 (Atributos de datos)Las posiciones 31-34 especifican el formato externo para un campo de fecha, hora,carácter de longitud variable, gráfico o UCS-2.

Si esta entrada está en blanco para un campo de fecho o de hora, se utiliza elformato/separador especificado para el archivo (con DATFMT o TIMFMT oambas). Si no se ha especificado ningún formato externo de fecha u hora para elarchivo, se emite un mensaje de error. Consulte “Datos de fecha” en la página 112y “Datos de hora” en la página 126 para obtener información sobre formatos defecha y hora.

La jerarquía utilizada para determinar el formato externo y el separador de camposde fecha y hora proviene de:1. El formato de fecha y el separador especificado en las posiciones 31-352. A partir de la palabra clave DATFMT/TIMFMT especificada para el archivo

actual3. A partir de la palabra clave DATFMT/TIMFMT especificada en la

especificación de control4. *ISO

Los campos de fecha y hora se convierten del formato de fecha/hora externodeterminado anteriormente al formato interno del campo de fecha/hora.

En el caso de los datos de tipo carácter, gráfico o UCS-2, se utiliza el atributo dedatos *VAR para especificar campos de entrada de longitud variable. Si estaentrada está en blanco para los datos de tipo carácter, gráfico o UCS-2, el formatoexterno debe ser de longitud fija. El formato interno y externo debe coincidir, si elcampo se define en cualquier otra parte del programa. Para obtener másinformación sobre los campos de longitud variable, consulte el apartado “Formatocarácter, gráfico y UCS-2 de longitud variable” en la página 105.

Para obtener más información acerca de los formatos externos, vea “Formatosinternos y externos” en la página 95.

Posición 35 (Separador fecha/hora)La posición 35 especifica un carácter separador que se utilizará para los campos defecha/hora. Puede utilizarse el símbolo & para especificar un separador en blanco.Consulte “Datos de fecha” en la página 112 y “Datos de hora” en la página 126para formatos de fecha y hora y sus separadores por omisión.

272 VisualAge RPG Consulta del lenguaje

Page 295: RPG Referencia

Para efectuar una entrada en este campo, debe realizarse también una entrada enlas posiciones 31-34 (formato de fecha/hora externo).

Posición 36 (Formato de datos)El campo de entrada es:

EntradaExplicación

BlancoFormato decimal con zona o carácter

A Campo de tipo carácter (formato de longitud variable o fija)

N Campo de tipo carácter (formato indicador)

G Campo gráfico (formato de longitud variable o fija)

C Campo UCS-2 (formato de longitud variable o fija)

B Formato binario

F Campo numérico (formato flotante)

I Formato numérico (formato de entero)

L Campo numérico precedido (izquierda) de un signo más o de un signomenos (formato decimal con zona)

P Campo numérico (formato decimal empaquetado)

R Campo numérico seguido (derecha) por un signo más o por un signomenos (formato decimal con zona)

S Campo numérico (campo decimal con zona)

U Campo numérico (formato sin signo)

D Campo de fecha – el formato externo de la fecha se especifica en lasposiciones 31–34 o el formato de fecha del archivo por omisión.

T Campo de hora – el formato externo de la hora se especifica en lasposiciones 31–34 o el formato de hora del archivo por omisión.

Z Campo de indicación de la hora

La entrada en la posición 36 especifica el tipo de datos y, si son numéricos, elformato externo de los datos en el archivo descrito por programa. Esta entrada noafecta al formato utilizado para el proceso interno en el campo de entrada delprograma.

Posiciones 37-46 (Ubicación de campo)Entrada

Explicación

Dos números de 1-5 dígitosInicio de un campo (desde) y fin de un campo (a).

Esta entrada describe la ubicación y el tamaño de cada campo del registro deentrada. Las posiciones 37 a 41 especifican la ubicación de la posición inicial delcampo; las posiciones 42 a 46 especifican la ubicación de la posición final delcampo. Para definir un campo de una sola posición, entre el mismo número en lasposiciones 37 a 41 y en las posiciones 42 a 46. Las entradas numéricas debenajustarse por la derecha; pueden omitirse los ceros iniciales.

Capítulo 19. Especificaciones de entrada 273

Page 296: RPG Referencia

El número máximo de posiciones del registro de entrada para cada tipo de campoes:

Número deposiciones

Tipo de campo

30 Numérico con zona (30 dígitos)16 Numérico empaquetado (30 dígitos)4 Binario (9 dígitos)8 Entero (20 dígitos)8 Sin signo (20 dígitos)8 Flotante (8 bytes)31 Numérico con signo inicial o de cola (30 dígitos)10 Fecha8 Hora26 Indicación de la hora32766 Carácter (32766 caracteres)32766 Carácter de longitud variable (32764 caracteres)32766 Gráfico o UCS-2 (16383 caracteres de doble byte)32766 Gráfico o UCS-2 de longitud variable (16382 caracteres de doble

byte)32766 Estructura de datos

El tamaño máximo de un campo de tipo carácter o estructura de datos especificadocomo campo de entrada descrito por programa es 32766, ya que ésta es la longitudmáxima de registro de un archivo.

A la hora de especificar un campo de entrada de tipo carácter, gráfico o UCS-2 delongitud variable, la longitud incluye el prefijo de longitud de 2 bytes.

Para matrices, entre la posición inicial de la matriz en las posiciones 37 a 41 y laposición final en las posiciones 42 a 46. La longitud de la matriz debe ser unmúltiplo entero de la longitud de un elemento. La posición Desde-a no tiene quetener en cuenta todos los elementos de la matriz. La ubicación de los datos en lamatriz comienza por el primer elemento.

Posiciones 47-48 (Posiciones decimales)Entrada

Explicación

BlancoCampo de tipo carácter, gráfico, UCS-2, flotante, fecha, hora o indicaciónde la hora.

0-30 Número de posiciones decimales del campo numérico.

Esta entrada, utilizada con la entrada de formato de datos en la posición 36,describe el formato del campo. Una entrada en este campo identifica el campo deentrada como numérico (excepto numérico flotante); si se trata de un camponumérico, se debe efectuar una entrada. El número de posiciones decimalesespecificado para un campo numérico no puede sobrepasar la longitud del campo.

Posiciones 49-62 (Nombre de campo)Entrada

Explicación

274 VisualAge RPG Consulta del lenguaje

Page 297: RPG Referencia

Nombre simbólicoNombre de campo, nombre de estructura de datos, nombre de subcampode estructura de datos, nombre de matriz, elemento de matriz PAGE,PAGE1-PAGE7, *IN, *INxx o *IN(xx).

Estas posiciones nombran los campos de un registro de entrada que se utilizan enun programa VARPG. Estos nombres deben seguir las reglas de los nombressimbólicos.

Para hacer referencia a toda una matriz en las especificaciones de entrada, entre elnombre de matriz en las posiciones 49 a 62. Si se entra un nombre de matriz en lasposiciones 49 a 62, los indicadores de campo (posiciones 67 a 68) deben estar enblanco.

Para hacer referencia a un elemento de una matriz, especifique el nombre de lamatriz, seguido por un índice entre paréntesis. El índice es un campo numéricocon cero posiciones decimales o el número real del elemento de matriz que se hade utilizar. El valor del índice puede variar de 1 a n, donde n es el número deelementos contenidos en la matriz.

Posiciones 63-64 (Reservadas)Entrada

Explicación

BlancoEsta entrada debe estar en blanco.

Posiciones 65-66 (Reservadas)Entrada

Explicación

BlancoEsta entrada debe estar en blanco.

Posiciones 67-68 (Relación de registro de campo)Entrada

Explicación

BlancoEl campo es común a todos los tipos de registro.

01-99 Indicadores generales.

Los indicadores de relación de registro de campo se utilizan para asociar camposen un tipo de registro determinado cuando el tipo de registro es uno de los quefiguran en una relación OR. Esta entrada reduce el número de líneas que debengrabarse.

El campo descrito en una línea se extrae del registro sólo cuando el indicadorcodificado en las posiciones 67 y 68 está activado o cuando las posiciones 67 y 68están en blanco. Cuando las posiciones 67 y 68 están en blanco, el campo es comúna todos los tipos de registros definidos mediante la relación OR.

Capítulo 19. Especificaciones de entrada 275

Page 298: RPG Referencia

Posiciones 69-74 (Indicadores de campo)Entrada

Explicación

BlancoNo se ha especificado un indicador

01-99 Indicadores generales

Las entradas en las posiciones 69 a 74 comprueban el estado de un campo o de unelemento de matriz a medida que se lee en el programa. Los indicadores de campose especifican en la misma línea que el campo que se va a comprobar.Dependiendo del estado del campo (más, menos, cero o blanco), se activa elindicador correspondiente y puede utilizarse para condicionar especificacionesposteriores. Puede especificarse el mismo indicador en dos posiciones, pero nodebe utilizarse para las tres posiciones. No pueden utilizarse los indicadores decampo con matrices que estén indexadas.

Las posiciones 69 y 70 (más) y las posiciones 71 y 72 (menos) son válidas sólo paracampos numéricos. Las posiciones 73 y 74 pueden utilizarse para averiguar si uncampo numérico contiene ceros o un campo de tipo carácter, gráfico o UCS-2contiene blancos.

Los indicadores de campo se activan si el campo o elemento de matriz reúne lacondición especificada cuando se lee el registro. Cada indicador de campo estárelacionado sólo con un tipo de registro; por lo tanto, los indicadores no serestablecerán (activan o desactivan) hasta que se vuelva a leer el registrorelacionado o hasta que el indicador se defina en alguna otra especificación.

Archivos descritos externamenteLos archivos descritos externamente incluyen las entradas siguientes en lasespecificaciones de entrada.

Posición 6 (Tipo de formulario)Debe aparecer una I en la posición 6 para identificar esta línea como una sentenciade especificación de entrada.

Entradas de identificación de registro

Cuando se recupera la descripción de un archivo descrito externamente, serecuperan también las definiciones de registro. Para hacer referencia a lasdefiniciones de registro, especifique el nombre del formato de registro de lasespecificaciones de entrada, de cálculo y de salida del programa. Se requieren lasespecificaciones de entrada para un archivo descrito externamente si:v Se han de especificar indicadores de identificación de registrov Se ha de redenominar para el programa un campo contenido en un registrov Se han de utilizar indicadores de campo.

Para un archivo descrito externamente, las especificaciones de descripción decampo deben seguir inmediatamente a la especificación de identificación deregistro.

Una línea de registro para un archivo descrito externamente define el inicio de lasespecificaciones de alteración temporal para el registro. Todas las especificaciones

276 VisualAge RPG Consulta del lenguaje

Page 299: RPG Referencia

de registro que sigan a la línea de registro forman parte de la alteración temporaldel registro hasta que se encuentre otro nombre de formato de registro o nombrede archivo en las posiciones 7 a 16 de las especificaciones de entrada. Todas laslíneas de registro que pertenecen a un archivo descrito externamente debenaparecer juntas; no pueden mezclarse con entradas para otros archivos.

Posiciones 7-16 (Nombre de registro)Entre uno de estos valores:v El nombre externo del formato de registro. Este nombre de archivo no puede

utilizarse para un archivo descrito externamente.v El nombre especificado por la palabra clave RENAME en las especificaciones de

descripción de archivo si se ha redenominado el formato de registro externo. Unnombre de formato de registro puede aparecer sólo una vez en las posiciones 7 a16 de las especificaciones de entrada para un programa.

Posiciones 17-20 (Reservadas)Las posiciones 17 a 20 deben estar en blanco.

Posiciones 21-22 (Indicador de identificación de registro)La especificación de los indicadores de identificación de registro en esta posición esopcional, pero si está presente, sigue las reglas para los . archivos descritos porprograma. Consulte el apartado “Archivos descritos por programa” en lapágina 268.

Posiciones 23-80 (Reservadas)Las posiciones 23-80 deben estar en blanco.

Entradas de descripción de campoLas especificaciones de descripción de campo para un archivo descritoexternamente pueden utilizarse para redenominar un campo de un registro de unprograma o para especificar funciones de indicador de campo. Las definiciones decampo (atributos) se recuperan del archivo descrito externamente y no las puedecambiar el programa. Si los atributos de un campo no son válidos para unprograma VisualAge RPG (como, por ejemplo, la longitud numérica tiene más de30 dígitos), el campo no se puede utilizar. La comprobación de diagnóstico se llevaa cabo en los campos contenidos en un formato de registro externo del mismomodo que para las sentencias fuente.

Normalmente, los campos de entrada descritos externamente se leen durante lasoperaciones de entrada sólo si el campo se utiliza realmente en alguna parte delprograma.

Posiciones 7-20 (Reservadas)Las posiciones 7 a 20 deben estar en blanco.

Posiciones 21-30 (Nombre de campo externo)Si se ha de cambiar el nombre de un campo contenido en un registro de unarchivo descrito externamente, entre el nombre externo del campo en estasposiciones. Un campo puede tener que cambiar de nombre si el nombre es elmismo que el del campo especificado en el programa y son necesarios dosnombres diferentes.

Capítulo 19. Especificaciones de entrada 277

Page 300: RPG Referencia

Posiciones 31-48 (Reservadas)Las posiciones 31 a 48 deben estar en blanco.

Posiciones 49-62 (Nombre de campo)La entrada de nombre de campo sólo se efectúa cuando se requiere para funcionescomo, por ejemplo, niveles de control añadidos a la descripción externa. La entradade nombre de campo contiene uno de los siguientes valores:v El nombre del campo como está definido en la descripción de registro externa (si

tiene 10 caracteres o menos)v El nombre especificado para ser utilizado en el programa que ha sustituido al

nombre externo especificado en las posiciones 21 a 30.

El nombre de campo debe cumplir las reglas para la utilización de nombressimbólicos.

Los indicadores no pueden tener posibilidad de nulos.

Posiciones 63-64 (Reservadas)Entrada

Explicación

BlancoEsta entrada debe estar en blanco.

Posiciones 65-66 (Reservadas)Entrada

Explicación

BlancoEsta entrada debe estar en blanco.

Posiciones 67-68 (Reservadas)Las posiciones 67 y 68 deben estar en blanco.

Posiciones 69-74 (Indicadores de campo)Entrada

Explicación

BlancoNo se ha especificado un indicador

01-99 Indicadores generales

Los indicadores de campo únicamente están permitidos para campos conposibilidad de nulos si se ha especificado la opción Control del usuario o lapalabra clave ALWNULL(*USRCTL).

Si el campo con posibilidad de nulos contiene un valor nulo, el indicador sedesactiva.

Vea “Posiciones 69-74 (Indicadores de campo)” en la página 276 para los archivosdescritos por programa.

278 VisualAge RPG Consulta del lenguaje

Page 301: RPG Referencia

Posiciones 75-80 (Reservadas)Las posiciones 75 a 80 deben estar en blanco.

Capítulo 19. Especificaciones de entrada 279

Page 302: RPG Referencia

280 VisualAge RPG Consulta del lenguaje

Page 303: RPG Referencia

Capítulo 20. Especificaciones de cálculo

Las especificaciones de cálculo indican las operaciones que se llevan a cabo en losdatos de un programa.

En “Capítulo 25. Códigos de operación” en la página 367 hallará información másdetallada acerca de cómo se deben especificar las especificaciones de cálculo paracódigos de operaciones individuales.

Sentencia de especificación de cálculoLa disposición general para la especificación de cálculo es la siguiente:v El tipo de especificación de cálculo (C) se indica en la posición 6v La parte no de comentario de la especificación abarca de la posición 7 a la

posición 80. Estas posiciones están divididas en tres partes que especifican losiguiente:– Cuándo se llevan a cabo los cálculos: Los indicadores de condicionamiento

especificados de la posición 7 a la posición 11 determinan cuándo y bajo quécondiciones se llevarán a cabo los cálculos.

– Qué tipo de cálculos se realizan: Las entradas especificadas desde la posición12 hasta la posición 70 (12 a 80 para las operaciones que utilizan el factor 2ampliado, vea “Sentencia de especificación del Cálculo del factor 2 ampliado”en la página 286 y “Operaciones que utilizan expresiones” en la página 380)

indican el tipo de cálculos que se han llevado a cabo, los datos (tales comocampos o archivos) en los que se ha basado la operación y el campo quecontiene los resultados del cálculo.

– Qué pruebas se realizan con los resultados de la operación: Los indicadoresespecificados en las posiciones 71 a 76 se utilizan para comprobar losresultados de los cálculos y pueden condicionar los cálculos y operaciones desalida subsiguientes. Las posiciones de indicador resultante tienen diferentesutilizaciones, dependiendo del código de operación.

v La sección de comentarios de la especificación abarca de la posición 81 a la 100

Especificación de cálculo Factor 2 ampliado Línea de continuaciónEl campo Factor 2 ampliado puede continuarse en las líneas siguientes de lamanera siguiente:v La posición 6 de la línea de continuación debe contener una Cv Las posiciones 7 a 35 de la línea de continuación deben estar en blancov La especificación continúa en o después de la posición 36

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8 ...+... 9 ...+... 10CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....Comments++++++++++++CSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++++++Comments++++++++++++

Figura 98. Diseño de especificación de cálculo

© Copyright IBM Corp. 1994, 2000 281

Page 304: RPG Referencia

Posición 6 (Tipo de formulario)Debe aparecer una C en la posición 6 para identificar esta línea como unasentencia de especificación de cálculo.

Posiciones 7-8 (Nivel de control)Entrada Explicación

Blanco La operación de cálculo se lleva a cabo si los indicadores de lasposiciones 9 a 11 lo permiten o el cálculo forma parte de unasubrutina. También se utiliza un blanco para los códigos deoperación declarativos.

SR La operación de cálculo forma parte de una subrutina. También esválida una entrada en blanco para los cálculos que forman parte deun subrutina.

AN, OR Los indicadores situados en más de una línea condicionan elcálculo.

Identificador de subrutinaUna entrada SR en las posiciones 7 y 8 puede utilizarse opcionalmente paraoperaciones en subrutinas como una ayuda para fines de documentación. Loscódigos de operación BEGACT y ENDACT sirven como delimitadores para unasubrutina de acción. Los códigos de operación BEGSR y ENDSR sirven comodelimitadores para una subrutina.

Identificador de líneas AND/ORLas posiciones 7 y 8 pueden contener AN u OR para definir indicadoresadicionales (posiciones 9 a 11) para un cálculo.

La entrada en las posiciones 7 y 8 de la línea que precede inmediatamente unalínea AND/OR o un grupo de líneas AND/OR determina cuándo se ha deprocesar el cálculo. La entrada en las posiciones 7 y 8 de la primera línea de ungrupo se aplica a todas las líneas AND/OR del grupo.

Posiciones 9-11 (Indicadores)Las posiciones 10 y 11 contienen un indicador que se comprueba para determinarsi se ha de procesar un cálculo determinado:

EntradaExplicación

BlancoLa operación se procesa en todos los registros

01-99 Indicadores generales

LR Indicador de último registro

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8 ...+... 9 ...+... 10C.............................Extended-factor2-continuation++++++++++++++++Comments++++++++++++

Figura 99. Especificación de cálculo Factor 2 ampliado Línea de continuación

282 VisualAge RPG Consulta del lenguaje

Page 305: RPG Referencia

Un blanco en la posición 9 indica que el indicador debe estar activado para que selleve a cabo el cálculo. Una N en la posición 9 indica que el indicador asociadodebe estar desactivado para que se lleve a cabo el cálculo.

Posiciones 12-25 (Factor 1)El factor 1 nombra un campo o proporciona datos reales (literales) en los que selleva a cabo una operación, o contiene una palabra especial VARPG (por ejemplo,*LOCK) que proporciona información adicional sobre cómo se ha de realizar laoperación. La entrada debe comenzar en la posición 12. Las entradas para el factor1 dependen del código de operación especificado en las posiciones 26 a 35. Para lasentradas específicas para el factor 1 de un código de operación determinado,consulte “Capítulo 25. Códigos de operación” en la página 367. Con algunoscódigos de operación, se pueden especificar dos operandos separados por dospuntos.

Posiciones 26-35 (Operación y ampliador)Las posiciones 26 a 35 especifican la clase de operación que se llevará a caboutilizando el factor 1, el factor 2 y las entradas del campo de resultado. El códigode operación debe comenzar en la posición 26. Si desea más información acerca delos códigos de operación, consulte “Capítulo 25. Códigos de operación” en lapágina 367.

Ampliador de operaciónEntrada

Explicación

BlancoNo se ha suministrado un ampliador de operación

H El resultado de la operación numérica se redondea y los indicadoresresultantes se establecen según el valor del campo de resultado despuésdel redondeo

N El registro se ha leído, pero no se ha bloqueado para las operacionesREAD, READE, READP, READPE o CHAIN de un archivo de disco deactualización

Establece el puntero para *NULL después de DEALLOC satisfactorio

P Si el campo de resultado es mayor que el resultado de la operación, rellenaeste campo con espacios en blanco

Pasa descriptores de operación en una llamada enlazada

D Campo de fecha

T Campo de hora

Z Campo de indicación de la hora

M Reglas de precisión por omisión

R Reglas de precisión de ″Posición decimal de resultado″

E Manejo de errores

Los ampliadores de operación proporcionan atributos adicionales a las operacionesque acompañan. Los ampliadores de operación se especifican en las posiciones 26 a35 de las especificaciones de cálculo. Deben empezar a la derecha del código de

Capítulo 20. Especificaciones de cálculo 283

Page 306: RPG Referencia

operación y estar incluidas entre paréntesis; se pueden utilizar espacios en blancopara facilitar la lectura. Por ejemplo, las siguientes son entradas válidas: MULT(H),MULT (H), MULT (H).

Se puede especificar más de un ampliador de operación. Por ejemplo, la operaciónEVAL puede especificar tanto las reglas de redondeo como las de precisión poromisión con EVAL(HM).

Una H indica si debe redondearse el contenido del campo del resultado. Losindicadores resultantes se establecen según el valor del campo del resultadodespués de haberse realizado el redondeo.

Una N en una operación READ, READE, READP, READPE o CHAIN en unarchivo de disco de actualización indica que el registro se va a leer, pero no se va abloquear. Si no se especifica ningún valor, se lleva a cabo la acción de bloqueo poromisión.

Una N en una operación DEALLOC indica que el puntero del campo de resultadodebe establecerse para *NULL después de una desasignación satisfactoria.

Una P indica que el campo de resultado se rellenará después de ejecutar lainstrucción si el campo del resultado es mayor que el resultado de la operación.

Con el código de operación TEST se pueden utilizar los ampliadores D, T y Z paraindicar un campo de fecha, de hora o de indicación de la hora.

R y M se especifican para la precisión de expresiones individuales de formato libre.Si desea más información, consulte “Reglas de precisión para operacionesnuméricas” en la página 358.

M indica que se utilizan las reglas de precisión por omisión.

R indica que se calculará la precisión de un intermedio decimal, de modo que elnúmero de posiciones decimales nunca sea inferior al número de posicionesdecimales del resultado de la asignación.

E indica que los errores relacionados con las operaciones se comprobarán con lafunción incorporada %ERROR.

Posiciones 36-49 (Factor 2)El factor 2 nombra un campo, formato de registro o archivo, o proporciona datosreales en los que se ha de llevar a cabo una operación, o contiene una palabraespecial (por ejemplo *ALL) que ofrece información adicional sobre la operaciónque se llevará a cabo. La entrada debe comenzar en la posición 36. Las entradasválidas para el factor 2 dependen del código de operación especificado en lasposiciones 26 a 35. Con algunos códigos de operación, se pueden especificar dosoperandos separados por dos puntos. Para ver las entradas específicas para elfactor 2 de un código de operación determinado, consulte el “Capítulo 25. Códigosde operación” en la página 367

Posiciones 50-63 (Campo del resultado)El campo de resultado nombra el campo o formato de registro que contiene elresultado de la operación de cálculo especificada en las posiciones 26 a 35. Elcampo especificado debe ser modificable. Por ejemplo, no puede ser un campo defecha de usuario. Con algunos códigos de operación, se pueden especificar dos

284 VisualAge RPG Consulta del lenguaje

Page 307: RPG Referencia

operandos separados por dos puntos. Consulte el “Capítulo 25. Códigos deoperación” en la página 367 para obtener las reglas de campo de resultado para loscódigos de operación individuales.

Posiciones 64-68 (Longitud de campo)Entrada Explicación

1-30 Longitud de campo numérico.

1-65535 Longitud de campo de caracteres.

Blanco El campo de resultado se define en otro lugar o no puede definirseun campo utilizando este código de operación

Las posiciones 64 a 68 especifican la longitud del campo de resultado. Esta entradaes optativa, pero puede utilizarse para definir un campo numérico o de caracteresno definido en otro lugar del programa. Estas definiciones de las entradas decampo se permiten si el campo de resultado contiene un nombre de campo. Debendefinirse otros tipos de datos en la especificación de definición o en laespecificación de cálculo utilizando la operación *LIKE DEFINE.

La entrada especifica el número de posiciones que se han de reservar para elcampo de resultado. La entrada debe estar ajustada por la derecha. Debeespecificarse la longitud no empaquetada (número de dígitos) para los camposnuméricos.

Si se define el campo de resultado en otro lugar del programa, no se requiere unaentrada para la longitud. Sin embargo, si se especifica la longitud y si se define elcampo de resultado en otro lugar del programa, la longitud debe ser igual a lalongitud definida anteriormente. Si la longitud del campo de resultado es diferentede la longitud definida anteriormente, se utiliza el valor definido anteriormente.

Posiciones 69-70 (Posiciones decimales)Entrada

Explicación

BlancoEl campo de resultado son datos de caracteres, se ha definido en otro lugardel programa o no se ha especificado una longitud de campo.

0-30 Número de posiciones decimales de un campo de resultado numérico:v Si el campo de resultado numérico no contiene posiciones decimales,

entre un ’0’ (cero).v El número de posiciones decimales especificadas no puede sobrepasar la

longitud del campo.

Las posiciones 69-70 indican el número de posiciones a la derecha del decimal deun campo de resultado numérico.

Posiciones 71-76 (Indicadores resultantes)Estas posiciones se pueden utilizar para comprobar el valor de un campo deresultado después de la finalización de una operación o para indicar condicionescomo fin de archivo, error o registro no encontrado. En algunas operaciones, puedecontrolar el modo en que se lleva a cabo la operación especificando combinacionesdiferentes de tres indicadores resultantes (por ejemplo, LOOKUP). Las posicionesde indicador resultante tienen utilizaciones diferentes, dependiendo del código de

Capítulo 20. Especificaciones de cálculo 285

Page 308: RPG Referencia

operación especificado. Consulte los códigos de operación individuales en el“Capítulo 25. Códigos de operación” en la página 367 para obtener una descripciónde los indicadores resultantes asociados. En las operaciones aritméticas, el campode resultado sólo se comprueba después de que se haya truncado el campo yefectuado el redondeo (si se especifica). Se establecen los indicadores dependiendode los resultados de las pruebas especificadas.

EntradaExplicación

BlancoNo se especifica un indicador resultante

01-99 Indicadores generales

LR Indicador de último registro

Los indicadores resultantes no pueden utilizarse cuando el campo de resultadoutiliza una matriz no indexada.

Si se utiliza el mismo indicador como indicador resultante en más de unaespecificación de cálculo, la especificación procesada más recientemente determinael estado de dicho indicador.

Nota: Cuando se lleva a cabo la operación de cálculo, los indicadores resultantesespecificados se desactivan y si se satisface una condición especificada porun indicador resultante, se activa dicho indicador.

Sentencia de especificación del Cálculo del factor 2 ampliadoCiertos códigos de operación permiten utilizar una expresión en el campo delfactor 2 ampliado.

Posiciones 7-8 (Nivel de control)Consulte el apartado “Posiciones 7-8 (Nivel de control)” en la página 282.

Posiciones 9-11 (Indicadores)Consulte el apartado “Posiciones 9-11 (Indicadores)” en la página 282.

Posiciones 12-25 (Factor 1)El factor 1 debe estar en blanco.

Posiciones 26-35 (Operación y ampliador)Las posiciones 26 a 35 especifican la clase de operación que se ha de llevar a caboutilizando la expresión del campo del factor 2 ampliado. El código de operacióndebe comenzar en la posición 26. Si desea más información acerca de los códigosde operación, consulte “Capítulo 25. Códigos de operación” en la página 367.

El programa procesa las operaciones en el orden especificado en el formulario deespecificaciones de cálculo.

Ampliador de operaciónEntrada

Explicación

286 VisualAge RPG Consulta del lenguaje

Page 309: RPG Referencia

BlancoNo se ha suministrado una extensión de operación

H Resultado redondeado de la operación numérica

M Reglas de precisión por omisión

R Reglas de precisión de ″Posición decimal de resultado″

E Manejo de errores

Se puede especificar redondeo, utilizando el ampliador H, en las operacionesaritméticas EVAL y RETURN.

Se puede especificar el tipo de precisión, utilizando el ampliador M o R, enoperaciones DOU, DOW, EVAL, IF, RETURN y WHEN.

Se puede especificar manejo de errores, utilizando el amplidor ’E’.

Posiciones 36-80 (Factor 2 ampliado)En este campo se utiliza una sintaxis de formato libre. Consta de combinaciones deoperandos y operadores y puede abarcar opcionalmente varias líneas. Si seespecifica en varias líneas, las líneas de continuación deben estar en blanco en lasposiciones que van de la 7 a la 35

Las operaciones que toman un factor 2 ampliado son:v “CALLP (Llamar a un procedimiento o programa con prototipo)” en la

página 408v “DOU (Hacer hasta)” en la página 435v “DOW (Hacer mientras)” en la página 438v “EVAL (Evaluar expresión)” en la página 446v “EVALR (Evaluar expresión, ajuste por la derecha)” en la página 447v “FOR (Para)” en la página 453v “IF (Si)” en la página 457v “RETURN (Volver al llamador)” en la página 525v “WHEN (Seleccionar cuando sea verdadero)” en la página 558

Vea los códigos de operación específicos para obtener más información. En “Reglasde continuación” en la página 195 hallará más información acerca de la codificaciónde líneas de continuación.

Capítulo 20. Especificaciones de cálculo 287

Page 310: RPG Referencia

288 VisualAge RPG Consulta del lenguaje

Page 311: RPG Referencia

Capítulo 21. Especificaciones de salida

Las especificaciones de salida describen el registro y el formato de los campos deun archivo de salida descrito por programa e indican cuándo se ha de grabar elregistro. Las especificaciones de salida son opcionales para un archivo descritoexternamente. Si se codifica NOMAIN en una especificación de control,únicamente se puede llevar a cabo la salida de excepciones.

Las especificaciones de salida pueden dividirse en dos categorías: identificación ycontrol de registro (posiciones 7 a 51) y descripción y control de campo (posiciones21 a 80). Estas especificaciones se entran en las especificaciones de salida.

Puede encontrar una información detallada sobre las especificaciones de salida en:v “Archivos descritos por programa” en la página 290.v “Archivos descritos externamente” en la página 300.

Para los archivos de salida se aplican las reglas siguientes:v Archivos DISK:

– Los archivos DISK pueden ser remotos o locales– Los archivos remotos deben estar descritos externamente– Los archivos locales deben estar descritos por programa

v Archivos PRINTER:– Los archivos PRINTER deben estar descritos por programa

v Archivos SPECIAL:– Los archivos SPECIAL deben estar descritos por programa.

Sentencia de especificación de salidaLa disposición general de la especificación de salida es la siguiente:v El tipo de especificación de salida (O) se indica en la posición 6v La parte no de comentario de la especificación abarca de la posición 7 a la 80v La sección de comentarios de la especificación abarca de la posición 81 a la 100

Descrito por programaEn los archivos descritos por programa, las entradas de la especificaciones desalida se dividen en dos categorías:v Identificación y control de registro (posiciones de la 7 a la 51)

v Descripción y control de campo (posiciones 21 a 80). Cada campo está descritoen una línea independiente, debajo de su entrada de identificación de registrocorrespondiente.

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8 ...+... 9 ...+... 10OFilename++EF..N01N02N03Excnam++++B++A++Sb+Sa+.............................Comment+++++++++++++OFilename++EAddN01N02N03Excnam++++.........................................Comment+++++++++++++O.........And..N01N02N03Excnam++++.........................................Comment+++++++++++++

Figura 100. Diseño de registro descrito por programa

© Copyright IBM Corp. 1994, 2000 289

Page 312: RPG Referencia

Descrito externamenteEn los archivos descritos externamente, las entradas de las especificaciones desalida se dividen en las categorías siguientes:v Identificación y control de registro (posiciones de la 7 a la 39)

v Descripción y control de campo (posiciones de la 21 a la 43 y 45).

Archivos descritos por programaLos archivos descritos por programa incluyen las entradas siguientes en lasespecificaciones de salida.

Posición 6 (Tipo de formulario)Debe aparecer una O en la posición 6 para identificar esta línea como unasentencia de especificaciones de salida.

Identificación de registro y entradas de controlLas entradas de las posiciones 7 a 51 identifican los registros de salida quecomponen los archivos, proporcionan el espaciado correcto en los informesimpresos y determinan bajo qué condiciones se han de grabar los registros.

Posiciones 7-16 (Nombre de archivo)Entrada

Explicación

Un nombre de archivoEspecifique el nombre de archivo en la primera línea que define unregistro de salida para el archivo. El nombre de archivo especificado debeser el mismo nombre de archivo asignado al archivo de salida, deactualización o combinado de las especificaciones de descripción dearchivo. Si en las especificaciones de salida los registros de archivos estánmezclados, el nombre de archivo debe especificarse cada vez que se cambieel archivo.

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8 ...+... 9 ...+... 10O..............N01N02N03Field+++++++++YB.End++PConstant/editword/DTformat++Comment+++++++++++++O..............................................Constant/editword-ContinutioComment+++++++++++++

Figura 101. Diseño de campo descrito por programa

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8 ...+... 9 ...+... 10ORcdname+++E...N01N02N03Excnam++++.........................................Comment+++++++++++++ORcdname+++EAddN01N02N03Excnam++++.........................................Comment+++++++++++++O.........And..N01N02N03Excnam++++.........................................Comment+++++++++++++

Figura 102. Diseño de registro descrito externamente

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8 ...+... 9 ...+... 10O..............N01N02N03Field+++++++++.B...................................Comment+++++++++++++

Figura 103. Diseño de campo descrito externamente

290 VisualAge RPG Consulta del lenguaje

Page 313: RPG Referencia

Para los archivos especificados como de salida, de actualización, combinado o deentrada con ADD, se requiere como mínimo una especificación de salida, a menosque en los cálculos se utilice un código de operación de archivo explícito con unnombre de estructura de datos especificado en el campo de resultado. Por ejemplo,una operación WRITE no requiere especificaciones de salida.

Posiciones 16-18 (Relación lógica)Entrada

Explicación

AND u ORAND/OR indica una relación entre las líneas de los indicadores de salida.Las líneas AND/OR son válidas para registros de salida, pero no paracampos. Para especificar esta relación, entre AND/OR en las posiciones 16a 18 en cada línea adicional a continuación de la línea que contiene elnombre de archivo. Debe especificarse como mínimo un indicador en cadalínea AND. Puede especificarse un número ilimitado de líneas AND/ORen las especificaciones de salida.

Las posiciones 7 a 15 deben estar en blanco cuando se especifica AND/OR.

Posición 17 (Tipo - Archivo descrito por programa)Entrada

Explicación

E Los registros de excepción se graban durante el proceso de cálculo. Losregistros de excepción sólo pueden especificarse cuando se utiliza el códigoEXCEPT. Consulte “Capítulo 25. Códigos de operación” en la página 367para obtener más información sobre el código de operación EXCEPT.

Posiciones 18-20 (Adición/supresión de registro)Entrada

Explicación

ADD Añade un registro al archivo de entrada, archivo de salida, archivo deactualización o subarchivo. En el caso de los archivos locales, todos losregistros se añaden al final del archivo. Las actualizaciones se efectúan enel registro actual.

DEL Suprime el último registro que se ha leído del archivo. El registrosuprimido no se puede recuperar, ya que se elimina del sistema.

Posiciones 21-29 (Indicadores ID de registro de archivo)Entrada

Explicación

BlancoLa línea o el campo se convierte en salida cada vez que se lleva a cabo unacomprobación de salidas del registro.

01-99 Se utiliza un indicador general como indicador de resultados, indicador decampo o indicador de identificación de registros.

LR Indicador de último registro.

Capítulo 21. Especificaciones de salida 291

Page 314: RPG Referencia

Los indicadores de salida no son necesarios en las líneas de salida. Si no seespecifican indicadores de condición, se efectúa una salida de la línea cada vez quese lleva a cabo una comprobación de salidas del registro. Pueden entrarse unmáximo de tres indicadores en una línea de especificación para controlar cuándo segraba un registro o un campo determinado en un registro. Los indicadores quecondicionan la salida se codifican en las posiciones 22 y 23, 25 y 26 y 28 y 29.Cuando se entra una N en las posiciones 21, 24 ó 27, el indicador de la posiciónasociada debe estar desactivado para la línea o campo que se ha de grabar. De locontrario, debe estar activado el indicador para la línea o campo que se ha degrabar. Consulte “PAGE, PAGE1-PAGE7” en la página 295 para obtener másinformación sobre cómo los indicadores afectan los campos PAGE.

Si se especifica más de un indicador en una línea, se considera que todos losindicadores están en una relación AND.

Si en una relación AND el registro de salida debe condicionarse mediante más detres indicadores, entre las letras AND en las posiciones 16 a 18 de la línea siguientey especifique los indicadores adicionales en las posiciones 21 a 29 de dicha línea.

Las posiciones 40 a 51 (espacio y saltar) deben estar en blanco para todas las líneasAND.

Si el registro de salida se ha de grabar cuando existen una de dos o más series decondiciones (una relación OR), entre las letras OR en las posiciones 16-18 de lalínea de especificación siguiente y especifique los indicadores OR adicionales endicha línea.

Cuando se especifica una línea OR para un archivo de impresora, las entradas desaltar y espacio (posiciones 40 a 51) pueden estar todas en blanco, por lo que eneste caso se utilizan las entradas de espacio y saltar de la línea anterior. Si difierende las de la línea anterior, entre las entradas de espacio y saltar en la línea OR.

Posiciones 30-39 (Nombre EXCEPT)

Cuando un tipo de registro es un registro de excepción (indicado mediante una Een la posición 17), puede colocarse un nombre en estas posiciones de la línea deregistro. La operación EXCEPT puede especificar como salida el nombre asignado aun grupo de registros. Este nombre se denomina un nombre EXCEPT. Un nombreEXCEPT debe seguir las reglas de utilización de nombres simbólicos. Un grupo decualquier número de registros de salida puede utilizar el mismo nombre EXCEPT ylos registros no han de ser registros consecutivos.

Cuando se especifica la operación EXCEPT sin un nombre EXCEPT, sólo secomprueban y graban aquellos registros de excepción que no tengan un nombreEXCEPT si se satisfacen los indicadores de condición.

Cuando la operación EXCEPT especifica un nombre EXCEPT, sólo se compruebany graban los registros de excepción con dicho nombre si se satisfacen losindicadores de condición.

El nombre EXCEPT se especifica en la línea de registro principal y se aplica a todaslas líneas AND/OR.

Puede utilizarse una operación EXCEPT sin campos para liberar un bloqueo deregistro en un archivo. La operación UNLOCK también puede utilizarse para este

292 VisualAge RPG Consulta del lenguaje

Page 315: RPG Referencia

fin. En el gráfico siguiente, se libera el bloqueo de registro del archivo RCDAmediante la operación EXCEPT.

Posiciones 40-51 (Espacio y saltar)

Utilice las posiciones 40 a 51 para especificar espacio y saltar línea para un archivode impresora. Espacio se refiere a avanzar una línea cada vez y saltar a saltar deuna línea de impresión a otra.

Si se especifica espacio y saltar para la misma línea, las operaciones de espacio ysaltar se procesan en la secuencia siguiente:1. Saltar antes2. Espacio antes3. Imprimir una línea4. Saltar después5. Espacio después.

Si en las especificaciones de descripción de archivo no se especifica la palabra clavePRTCTL (opción de control de impresora), debe efectuarse una entrada en lassiguientes posiciones cuando el dispositivo sea PRINTER: 40-42 (espacio antes),43-45 (espacio después), 46-48 (línea de saltar antes) o 49-51 (línea de saltardespués). Si la entrada de espacio/saltar se deja en blanco, no se produce lafunción cuya entrada esté en blanco (por ejemplo, espacio antes o espaciodespués). Si se efectúan entradas en las posiciones 40-42 (espacio antes) o en lasposiciones 46-51 (saltar antes y saltar después) y no se efectúa una entrada en lasposiciones 43 - 45 (espacio después), no se producirá ningún espacio después de laimpresión. Cuando se especifica PRTCTL, se utiliza únicamente en los registros conblancos especificados en las posiciones 40 a 51,

Si se especifica línea de saltar antes o línea de saltar después en una nueva página,pero la impresora se encuentra en dicha línea, no se producirá el salto.

Posiciones 40-42 (Espacio antes)Entrada Explicación

0 o Blanco Sin espaciado

1-255 Valores de espaciado

Posiciones 43-45 (Espacio después)Entrada Explicación

0 o Blanco Sin espaciado

*...1....+....2....+....3....+....4....+....5....+....6....+....7...CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq..C*C KEY CHAIN RCDAC EXCEPT RELESEORcdname+++D...N01N02N03Excnam++++.......................................OO*ORCDA E RELESEO* (sin campos)

Figura 104. Bloqueo de registro en archivo liberado mediante la operación EXCEPT

Capítulo 21. Especificaciones de salida 293

Page 316: RPG Referencia

1-255 Valores de espaciado

Posiciones 46-48 (Saltar antes)Entrada

Explicación

BlancoNo se produce un salto.

1-255 Valores de salto.

Posiciones 49-51 (Saltar después)Entrada

Explicación

BlancoNo se produce un salto.

1-255 Valores de salto.

Descripción de campo y entradas de controlCada campo se describe en una línea diferente. Estas entradas determinan bajo quécondiciones y en qué campos de formato de un registro se han de grabar. Lainformación de descripción y control de campo para un campo comienza en lalínea siguiente de la línea de identificación de registro.

Posiciones 21-29 (Indicadores de salida)

Los indicadores especificados en las líneas de descripción de campo determinan sise ha de incluir un campo en el registro de salida, excepto para los camposreservados PAGE. Consulte “PAGE, PAGE1-PAGE7” en la página 295 para obtenermás información sobre cómo los indicadores afectan los campos PAGE. Paracontrolar los campos pueden utilizarse los mismos tipos de indicadores que seutilizan para controlar registros. Consulte “Posiciones 21-29 (Indicadores ID deregistro de archivo)” en la página 291. Los indicadores que se utilizan paracondicionar las líneas de descripción de campo no pueden especificarse en unarelación AND/OR.

Posiciones 30-43 (Nombre de campo)

En las posiciones 30 a 43, utilice una de las entradas siguientes para especificarcada campo que se ha de grabar:v Un nombre de campov Blancos si se especifica una constante en las posiciones 53 a 80v Un nombre de tabla, nombre de matriz o elemento de matrizv Una constante con nombrev Las palabras reservadas PAGE, PAGE1 a PAGE7, *PLACE, UDATE, *DATE,

UDAY, *DAY, UMONTH, *MONTH, UYEAR, *YEAR, *IN, *INxx o *IN(xx)v Un nombre de estructura de datos o un nombre de subcampo de estructura de

datos.

Nota: Un campo de puntero no es un campo de salida válido, es decir, los camposde puntero no pueden grabarse.

294 VisualAge RPG Consulta del lenguaje

Page 317: RPG Referencia

Nombres de campo, espacios en blanco, tablas y matrices

Los nombres de campo utilizados deben definirse en el programa. No entre unnombre de campo si se utiliza una constante en las posiciones 53-80. Si se entra unnombre de campo en las posiciones 30 a 43, las posiciones 7 a 20 deben estar enblanco.

Pueden especificarse los campos en cualquier orden porque la secuencia en la queaparecen queda determinada por la entrada de las posiciones 47 a 51. Si loscampos se solapan, el último campo especificado es el único campo totalmentegrabado.

Cuando se especifica un nombre de matriz no indexado, se graba toda la matriz.Un nombre de matriz con un índice constante o un índice variable hace que segrabe un elemento. Cuando se especifica un nombre de tabla, se graba el últimoelemento encontrado en la operación LOOKUP. El primer elemento de una tabla segraba si no se ha llevado a cabo una operación LOOKUP satisfactoria.

Antes de que se grabe el campo deben satisfacerse las condiciones para un registroy para el campo que contiene.

PAGE, PAGE1-PAGE7

Para utilización la numeración automática de páginas, entre PAGE en lasposiciones 30 a 43 como el nombre del campo de salida. Los indicadoresespecificados en las posiciones 21 a 29 condicionan el restablecimiento del campoPAGE, no si se imprime o no. El campo PAGE se incrementa siempre en 1 y seimprime. Si se cumplen los indicadores de condición, se restablece en cero antes deincrementarlo en 1 e imprimirlo. Si se necesitan números de página para variosarchivos de salida (o para numeración diferente en un archivo), pueden utilizarsePAGE1 a PAGE7. En los campos PAGE se efectúa automáticamente una supresiónde ceros mediante el código de edición Z.

Para obtener más información sobre palabras reservadas PAGE, consulte “Palabrascon funciones especiales y palabras reservadas” en la página 4.

*PLACE

*PLACE se utiliza para repetir datos en un registro de salida. Los campos oconstantes que se han especificado en líneas de especificación anteriores puedenrepetirse en el registro de salida sin que se nombren el campo y las posicionesfinales en una nueva línea de especificación. Cuando se entra *PLACE en lasposiciones 30 a 43, se repiten todos los datos contenidos entre la primera posicióny la posición final más alta especificada anteriormente para un campo de dichoregistro de salida hasta que se alcanza la posición final del registro de salida en lalínea de especificación *PLACE. La posición final especificada en la línea deespecificación *PLACE debe ser como mínimo el doble de la posición final delgrupo de campos que se ha de duplicar. Puede utilizarse *PLACE con cualquiertipo de salida. Con *PLACE no se puede utilizar blanco después (posición 45),edición (posiciones 44, 53 a 80), formato de datos (posición 52) y las posicionesfinales relativas.

Palabras reservadas de fecha de usuario

UDATE, *DATE, UDAY, *DAY, UMONTH, *MONTH, UYEAR y *YEAR le permitenproporcionar una fecha para el programa en tiempo de ejecución. Para obtener más

Capítulo 21. Especificaciones de salida 295

Page 318: RPG Referencia

información sobre palabras reservadas de fecha de usuario, consulte “Palabrasespeciales de fecha de usuario” en la página 7.

*IN, *INxx, *IN(xx)*IN, *INxx y *IN(xx) le permiten hacer referencia a y manipular los indicadorescomo datos.

Posición 44 (Códigos de edición)

Entrada ExplicaciónBlanco No se utiliza un código de edición1-4, A-D, J-Q, X, Y, Z En los campos numéricos se efectúa la supresión de ceros y la

puntuación según un patrón predefinido sin la utilización depalabras de edición.

La posición 44 se utiliza para especificar códigos de edición que suprimen los cerosiniciales en un campo numérico o para puntuar un campo numérico sin utilizaruna palabra de edición. Las entradas permitidas son 1 a 4, A a D, J a Q, X, Y, Z yblanco.

Posición 45 (Blanco después)Entrada

Explicación

BlancoNo se restablece el campo. Esta posición debe estar en blanco para palabrasreservadas de fecha de usuario de consulta anticipada, *PLACE, constantescon nombre y literales.

B El campo especificado en las posiciones 30 a 43 se restablece con el valorblanco, cero o el valor de fecha/hora/indicación de la hora por omisiónuna vez completada la operación de salida.

La posición 45 se utiliza para restablecer un campo numérico en ceros o un campode tipo carácter, gráfico o UCS-2 en blancos. Los campos de fecha, hora eindicación de la hora se restablecen con sus valores por omisión.

Si el campo está condicionado mediante indicadores en las posiciones 21 a 29,también se condiciona el blanco después.

Si se especifica blanco después (posición 45) para un campo que se ha de grabarmás de una vez, debe entrarse la B en la última línea que especifique la salida paradicho campo, o de lo contrario el campo nombrado se imprimirá como el valorblanco después para todas las líneas después de la que está efectuando blancodespués.

Posiciones 47-51 (Posición final)Entrada

Explicación

1-n Posición final

Las posiciones 47 a 51 definen la posición final de un campo o constante en elregistro de salida.

296 VisualAge RPG Consulta del lenguaje

Page 319: RPG Referencia

Las entradas válidas para las posiciones finales son blancos, +nnnn, −nnnn ynnnnn. Todas las entradas en estas posiciones deben finalizar en la posición 51.Entre la posición del carácter situado más a la derecha del campo o constante. Laposición final no debe sobrepasar la longitud de registro para el archivo.

Si se ha grabar toda una matriz, entre la posición final del último elemento de lamatriz en las posiciones 47 a 51. Si se ha de editar la matriz, asegúrese de que alespecificar la posición final haya posiciones suficientes para grabar todos loselementos editados. Cada elemento se edita según el código de edición o palabrade edición.

La entrada +nnnn o −nnnn especifica la ubicación del campo o constante enrelación con la posición final del campo anterior. El número (nnnn) debe estarajustado por la derecha, pero no se requieren ceros iniciales. Entre el signo encualquier lugar a la izquierda del número dentro del campo de entrada. Paracalcular la posición final, utilice estas fórmulas:posición final = longitud de campo +nnnn + posición final anterior

posición final = longitud de campo −nnnn + posición final anterior

Para la primera especificación de campo del registro, la posición final anterior esigual a cero. La longitud de campo es la longitud del campo después de editarlo, ola longitud de la constante indicada en esta especificación. La utilización de +nnnnes equivalente a colocar nnnn posiciones entre los campos. -nnnn hace que sesolapen los campos en nnnn posiciones. Por ejemplo, si la posición final anterior es6, el número de posiciones que se ha colocar entre los campos (nnnn) es 5 y lalongitud de campo es 10, la posición final será igual a 21.

Cuando se utiliza *PLACE, debe especificarse una posición final real; no puede serun blanco o un desplazamiento.

Una entrada de blanco se trata como una entrada de +0000. No hay posiciones queseparen los campos

Posición 52 (Formato de datos)Entrada

Explicación

BlancoEsta posición debe estar en blanco si se especifica edición.v Para campos numéricos, los datos se graban en formato decimal con

zona.v Para campos numéricos flotantes, los datos se graban en la

representación de pantalla externa.v En los campos de tipo UCS-2, los datos se escribirán en formato UCS-2.v Para campos de fecha, hora e indicación de la hora, los datos se graban

sin realizar conversión de formato.v En los campos de caracteres, los datos se han de grabar como se

almacenan.

A Sólo es válido para campos de caracteres. El campo de caracteres debegrabarse en formato de longitud fija o variable, dependiendo de laausencia o la presencia del atributo de datos *VAR.

N El campo de caracteres se debe grabar en formato de indicador.

Capítulo 21. Especificaciones de salida 297

Page 320: RPG Referencia

C El campo de tipo UCS-2 debe grabarse en formato de longitud fija ovariable, dependiendo de la ausencia o la presencia del atributo de datos*VAR.

G Sólo es válido para campos de gráficos en archivos descritos por programa.El campo gráfico se grabará en formato de longitud fija o variable,dependiendo de la ausencia o la presencia del atributo de datos *VAR.

B El campo numérico se debe grabar en formato binario.

F El campo numérico se grabará en formato flotante

I El campo numérico se debe grabar en formato de entero.

L El campo numérico se debe grabar precedido (izquierda) de un signo máso de un signo menos en formato decimal con zona.

P El campo numérico se debe grabar en formato decimal empaquetado.

R A continuación del campo numérico (derecha) se debe incluir un signo máso un signo menos en formato decimal con zona.

S El campo numérico se debe grabar en formato decimal con zona.

U El campo numérico se debe grabar en formato de entero sin signo.

D Campo de fecha− el campo de fecha se convierte al formato especificadoen las posiciones 53-80 o al formato de fecha de archivo por omisión.

T Campo de hora− el campo de hora se convierte al formato especificado enlas posiciones 53-80 o al formato de hora de archivo por omisión.

Z Sólo es válido para campos de indicación de la hora

La entrada en la posición 52 especifica el formato externo de los datos de losregistros del archivo. Esta entrada no afecta al formato utilizado para el procesointerno en el campo de salida del programa.

Para campos numéricos, el número de bytes necesarios para el registro de salidadepende de este formato. Por ejemplo, un campo numérico con 5 dígitos requiere:v 5 bytes al grabarlo en formato con zonav 3 bytes al grabarlo en formato empaquetadov 6 bytes al grabarlo en formato L o Rv 4 bytes al grabarlo en formato binariov 2 bytes al grabarlo en formato I o U. Puede causar un error en el tiempo de

ejecución si el valor es superior al valor máximo para un campo de entero de 2bytes o sin signo. Para el caso de campos de 5 dígitos, quizá el formato binarioresulte más adecuado.Los campos numéricos flotantes escritos con la entrada de Formato de datos enblanco ocupan 14 ó 23 posiciones (para los campos flotantes de 4 y de 8 bytesrespectivamente) en el registro de salida.

Nota: Debe especificarse una ’G’ o un blanco en un campo de gráficos de unarchivo descrito por programa.

Posiciones 53-80 (Constante, Palabra de edición, Atributos dedatos)

Las posiciones 53 a 80 se utilizan para especificar una constante, una palabra deedición o un atributo de datos.

298 VisualAge RPG Consulta del lenguaje

Page 321: RPG Referencia

ConstantesLas constantes contienen de datos de caracteres (literales) que no cambian de unproceso del programa al siguiente. Una constante son los datos reales utilizados enel registro de salida en lugar de un nombre que representa la ubicación de losdatos.

Una constante puede situarse en las posiciones 53 a 80. La constante debecomenzar en la posición 54 (apóstrofo en la posición 53) y debe finalizar con unapóstrofo incluso si contiene sólo caracteres numéricos. Los apóstrofos utilizadosdentro de la constante deben entrarse dos veces; sin embargo, cuando se graba laconstante sólo aparece un apóstrofo. El nombre de campo (posiciones 30 a 43) debeestar en blanco. Las constantes se pueden continuar. (Consulte el apartado “Reglasde continuación” en la página 195 para obtener información acerca de las reglas decontinuación.) En lugar de entrar una constante, puede utilizar una constante connombre.

No se permiten los literales de tipo gráfico y UCS-2 o las constantes con nombrecomo palabras de edición, aunque pueden especificarse como constantes.

Palabra de edición

Una palabra de edición especifica la puntuación de los campos numéricos, incluidala impresión de signos de dólar, comas, puntos y estado de signo. Consulte elapartado “Partes de una palabra de edición” en la página 180 para obtener detalles.

Las palabras de edición deben ser literales de caracteres o constantes con nombre.No están permitidos los literales de tipo gráfico, UCS-2 o hexadecimal ni lasconstantes con nombre.

Atributos de datos

Los atributos de datos especifican el formato externo para una fecha, una hora oun campo de tipo carácter, gráfico o UCS-2 de longitud variable.

Si no se especifica ningún formato de fecha u hora para los datos de fecha y hora,se utiliza el formato/separador especificado para el archivo (con DATFMT oTIMFMT o ambos). Si no se ha especificado ningún formato externo de fecha o dehora para el archivo, se emite un mensaje de error. Consulte los apartados“DATFMT(fmt{separador})” en la página 205 y “TIMFMT(fmt{separador})” en lapágina 212 para obtener información sobre los formatos de fecha y hora.

La jerarquía utilizada para determinar el formato externo y el separador de camposde fecha y hora proviene de:1. El formato de fecha y el separador especificado en las posiciones 53-58 (o

53-57).2. A partir de la palabra clave DATFMT/TIMFMT especificada para el archivo

actual3. A partir de la palabra clave DATFMT/TIMFMT especificada en la

especificación de control4. *ISO

Los campos de fecha y hora se convierten del formato de fecha/hora interno alformato externo determinado anteriormente.

En los datos de tipo carácter, gráfico y UCS-2, se utiliza el atributo de datos *VARpara especificar campos de salida de longitud variable. Si esta entrada está en

Capítulo 21. Especificaciones de salida 299

Page 322: RPG Referencia

blanco para los datos de tipo carácter, gráfico y UCS-2, el formato externo tendráuna longitud fija. Para obtener más información sobre los campos de longitudvariable, consulte el apartado “Formato carácter, gráfico y UCS-2 de longitudvariable” en la página 105.

Nota: El número de bytes ocupados en el registro de salida depende del formatoespecificado. Por ejemplo, una fecha escrita en formato *MDY ocupa 8 bytes,pero una fecha escrita en formato *ISO requiere 10 bytes.

Para obtener más información acerca de los formatos externos, vea “Formatosinternos y externos” en la página 95.

Archivos descritos externamenteLos archivos descritos externamente incluyen las entradas siguientes en lasespecificaciones de entrada.

Posición 6 (Tipo de formulario)Debe aparecer una O en la posición 6 para identificar esta línea como unasentencia de especificaciones de salida.

Identificación de registro y entradas de controlLas especificaciones de salida para un archivo descrito externamente sonopcionales. Las entradas en las posiciones 7 a 39 de la línea de identificación deregistro identifican el formato de registro y determinan en qué condiciones se hande grabar los registros.

Posiciones 7-16 (Nombre de registro)Entrada Explicación

Nombre de formato de registro válidoDebe especificarse un nombre de formato deregistro para un archivo descrito externamente.

Posiciones 16-18 (Relación lógica externa)Entrada Explicación

AND u OR AND/OR indica una relación entre las líneas de los indicadores desalida. Las líneas AND/OR son válidas para registros de salidapero no para campos.

Consulte el apartado “Posiciones 16-18 (Relación lógica)” en la página 291 si deseamás información.

Posición 17 (Tipo)Entrada

Explicación

E Registros de excepción.

La posición 17 indica el tipo de registro que se ha de grabar.

300 VisualAge RPG Consulta del lenguaje

Page 323: RPG Referencia

Consulte el apartado “Posición 17 (Tipo - Archivo descrito por programa)” en lapágina 291 si desea más información.

Posiciones 18-20 (Adición de registros)Entrada

Explicación

ADD Añadir un registro a un archivo

DEL Suprimir un registro del archivo

Posiciones 21-29 (Indicadores de salida)

Los indicadores de salida para los archivos descritos externamente se especificandel mismo modo que para los archivos descritos por programa. Para obtener másinformación sobre los indicadores de salida, consulte “Posiciones 21-29(Indicadores ID de registro de archivo)” en la página 291.

Posiciones 30-39 (Nombre EXCEPT)

Puede especificarse un nombre EXCEPT en estas posiciones para una línea deregistro de excepción. Consulte el apartado “Posiciones 30-39 (Nombre EXCEPT)”en la página 292 si desea más información.

Descripción de campo y entradas de controlEn los archivos descritos externamente, las únicas descripciones de campo válidasson los indicadores de salida (posiciones 21 a 29), el nombre de campo (posiciones30 a 43) y blanco después (posición 45).

Posiciones 21-29 (Indicadores de salida)Los indicadores especificados en las líneas de descripción de campo determinan sise ha de incluir un campo en el registro de salida. Para controlar los campos sepueden utilizar los mismos tipos de indicadores que se utilizan para controlarregistros. Consulte el apartado “Posiciones 21-29 (Indicadores ID de registro dearchivo)” en la página 291 si desea más información.

Posiciones 30-43 (Nombre de campo)Entrada Explicación

Nombre de campo válido Un nombre de campo especificado para un archivodescrito externamente debe estar presente en ladescripción externa a menos que se hayaredenominado el nombre externo para el programa.

*ALL Especifica la inclusión de todos los campos delregistro.

En los archivos descritos externamente, sólo los campos especificados se colocan enel registro de salida. Puede especificarse *ALL para incluir todos los campos delregistro. Si se especifica *ALL, no pueden especificarse otras líneas de descripciónde campo para dicho registro. Sobretodo, no puede especificar una B (blancodespués) en la posición 45.

Capítulo 21. Especificaciones de salida 301

Page 324: RPG Referencia

En un registro de actualización, sólo los campos especificados en lasespecificaciones de campo de salida que reúnan las condiciones especificadas porlos indicadores de salida se colocan en el registro de salida para volverlos a grabar.Los valores que se han leído se utilizan para volver a grabar todos los demáscampos.

Para la creación de un nuevo registro (ADD especificado en las posiciones 18-20),los campos especificados se colocan en el registro de salida. Los campos noespecificados o que no reúnan las condiciones especificadas por los indicadores desalida se graban como ceros o blancos, dependiendo del formato de datosespecificado en la descripción externa.

Posición 45 (Blanco después)Entrada

Explicación

BlancoNo se restablece el campo.

B El campo especificado en las posiciones 30 a 43 se restablece con el valorblanco, cero o el valor de fecha/hora/indicación de la hora por omisiónuna vez completada la operación de salida.

La posición 45 se utiliza para restablecer un campo numérico en ceros o un campode tipo carácter, gráfico o UCS-2 en blancos. Los campos de fecha, hora eindicación de la hora se restablecen con sus valores por omisión.

Si el campo está condicionado mediante indicadores en las posiciones 21 a 29,también se condiciona el blanco después. Esta posición debe estar en blanco parapalabras reservadas de fecha de usuario de consulta anticipada, *PLACE,constantes con nombre y literales.

Si se especifica blanco después (posición 45) para un campo que se ha de grabarmás de una vez, debe entrarse la B en la última línea que especifique la salida paradicho campo, o de lo contrario el campo nombrado se imprimirá como el valorblanco después para todas las líneas después de la que está efectuando blancodespués.

302 VisualAge RPG Consulta del lenguaje

Page 325: RPG Referencia

Capítulo 22. Especificaciones de procedimiento

Las especificaciones de procedimiento se utilizan para definir prototipos deprocedimientos especificados después de la sección fuente principal, tambiéndenominados subprocedimientos.

El prototipo del subprocedimiento debe estar definido en la sección fuenteprincipal del módulo que contiene la definición del subprocedimiento. Unsubprocedimiento incluye lo siguiente:1. Una especificación de Inicio de procedimiento (B en la posición 24 de una

especificación de procedimiento)2. Una definición de Interfaz del procedimiento, que especifica el valor de

retorno y los parámetros, si procede. La definición de interfaz de procedimientoes opcional si el subprocedimiento no devuelve un valor y no se le pasa ningúnparámetro. La interfaz de procedimiento debe coincidir con el prototipocorrespondiente.

3. Otras especificaciones de definición de variables, constantes y prototipos quenecesita el subprocedimiento. Se trata de definiciones locales.

4. Todas las especificaciones de cálculo necesarias para llevar a cabo la tarea delprocedimiento. Todas las subrutinas incluidas dentro del subprocedimiento sonlocales. No se pueden utilizar fuera del subprocedimiento. Si elsubprocedimiento devuelve un valor, se debe codificar una operación RETURNdentro del subprocedimiento. Debe asegurarse de que se lleve a cabo unaoperación RETURN antes de llegar al final del procedimiento.

5. Una especificación de Fin de procedimiento (E en la posición 24 de unaespecificación de procedimiento)

Excepto para una definición de interfaz del procedimiento, que se puede ubicar elcualquier lugar de las especificaciones de definición, un subprocedimiento se debecodificar en el orden indicado anteriormente.

Para obtener más información acerca de la estructura de la sección de fuenteprincipal y cómo afecta la ubicación de definiciones al ámbito, vea el apartado“Ubicación de definiciones y ámbito” en la página 228. Consulte el apartado“Capítulo 6. Subprocedimientos y prototipos” en la página 59 para obtenerinformación sobre subprocedimientos y prototipos.

Sentencia de especificación de procedimientoEl diseño general para la especificación del procedimiento es el siguiente:v El tipo de especificación de procedimiento (P) se entra en la posición 6v la sección no de comentario de la especificación abarca de la posición 7 a la

posición 80:– Las entradas de formato fijo abarcan de la posición 7 a la 24– Las entradas de palabra clave abarcan de la posición 44 a la 80

v La sección de comentarios de la especificación abarca de la posición 81 a laposición 100.

© Copyright IBM Corp. 1994, 2000 303

Page 326: RPG Referencia

Línea de continuación de palabra clave de especificación deprocedimiento

Si se requiere espacio adicional para palabras clave, el campo de palabras clave sepuede continuar en las líneas subsiguientes de este modo:v La posición 6 de la línea de continuación debe contener una Pv Las posiciones 7 a 43 de la línea de continuación deben estar en blancov La especificación continúa a partir de la posición 44

Línea de nombre continuada de especificación deprocedimiento

En la entrada de Nombre de la especificación de Procedimiento se puedeespecificar un nombre de hasta 15 caracteres de longitud sin que requieracontinuación. Cualquier nombre (incluso alguno con 15 caracteres o menos) puedecontinuar en varias líneas si se codifican puntos suspensivos (...) al final delnombre parcial.

Una definición de nombre consta de los componentes siguientes:1. Cero o más líneas de nombre continuado. Las líneas de nombre continuadas se

identifican al tener puntos suspensivos como últimos caracteres no en blancode la entrada. El nombre debe empezar dentro de las posiciones 7 - 21 y puedefinalizar en cualquier lugar hasta la posición 77 (finalizando los puntossuspensivos en la posición 80). No puede haber espacios en blanco entre loscaracteres del principio del nombre y los puntos suspensivos (...) . Si alguna deestas condiciones no es verdadera, la línea se analiza como una línea dedefinición principal.

2. Una línea de definición principal que contenga el nombre, los atributos dedefinición y las palabras clave. Si se codifica una línea de nombre continuada,la entrada de nombre de la línea de definición principal se puede dejar enblanco.

3. Cero o más líneas de continuación de palabra clave.

Posición 6 (Tipo de formulario)Entre una P en esta posición para una especificación de procedimiento

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8 ...+... 9 ...+... 10

PName+++++++++++..B...................Keywords+++++++++++++++++++++++++++++Comments++++++++++++

Figura 105. Diseño de especificación de procedimiento

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8 ...+... 9 ...+... 10P.....................................Keywords+++++++++++++++++++++++++++++Comments++++++++++++

Figura 106. Diseño de línea de continuación de palabra clave de especificación de procedimiento

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8 ...+... 9 ...+... 10

DContinuedName+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Comments++++++++++++

Figura 107. Línea de nombre continuada de especificación de procedimiento

304 VisualAge RPG Consulta del lenguaje

Page 327: RPG Referencia

Posiciones 7-21 (Nombre)Entrada

Explicación

NombreEl nombre del subprocedimiento a definir.

Utilice las posiciones 7-21 para especificar el nombre del subprocedimiento que seestá definiendo. Si el nombre tiene más de 15 caracteres, se especifica un nombreen las posiciones 7 - 80 de las líneas de nombre continuadas. El nombre puedecomenzar en cualquier posición del espacio proporcionado.

El nombre especificado debe ser el mismo que el nombre del prototipo quedescribe el procedimiento. Si la posición 24 contiene una E, el nombre es opcional.

Posición 24 (Inicio/fin de procedimiento)Entrada

Explicación

B La especificación marca el inicio del subprocedimiento que se estádefiniendo.

E La especificación marca el fin del subprocedimiento que se está definiendo.

Una codificación de subprocedimiento consta como mínimo de una especificaciónde inicio de procedimiento y de una especificación de fin de procedimiento.Cualquier parámetro y valor de retorno, así como otras definiciones y cálculos delsubprocedimiento se especifican entre las especificaciones del procedimiento.

Posiciones 44-80 (Palabras clave)Las posiciones 44 a 80 se proporcionan para las palabras clave de especificación deprocedimientos. Únicamente una especificación de Inicio de procedimiento (B en laposición 24) puede tener entradas de palabra clave.

Palabras clave de especificación de procedimientoLas especificaciones de procedimiento actualmente permiten “EXPORT”.

EXPORTLa especificación de la palabra clave EXPORT permite exportar el procedimientode una DLL NOMAIN. El nombre situado en las posiciones 7-21 se exporta enformato de mayúsculas.

Si no se ha especificado la palabra clave EXPORT, únicamente se puede llamar alprocedimiento desde el módulo.

Capítulo 22. Especificaciones de procedimiento 305

Page 328: RPG Referencia

306 VisualAge RPG Consulta del lenguaje

Page 329: RPG Referencia

Parte 4. Funciones incorporadas, Expresiones y Códigos deoperación

En este apartado se describen las distintas maneras de manipular datos odispositivos. Los temas principales incluyen:v El “Capítulo 23. Funciones incorporadas” en la página 309 describe las funciones

incorporadas y su utilización en las especificaciones de definición y cálculo.v El “Capítulo 24. Expresiones” en la página 351 describe las expresiones y las

reglas que rigen su utilización.v El “Capítulo 25. Códigos de operación” en la página 367 ofrece una visión

general de los códigos de operación agrupados por funciones.v El “Los detalles de los códigos de operación” en la página 392 describe

detalladamente todos los códigos de operación. Las descripciones de códigos deoperación están agrupadas por orden alfabético.

© Copyright IBM Corp. 1994, 2000 307

Page 330: RPG Referencia

308 VisualAge RPG Consulta del lenguaje

Page 331: RPG Referencia

Capítulo 23. Funciones incorporadas

Las funciones incorporadas se parecen a los códigos de operación, ya que tambiénefectúan operaciones en los datos que se especifican. Todas las funcionesincorporadas tienen un símbolo de tanto por ciento (%) como primer carácter. Lasintaxis de las funciones incorporadas es la siguiente:nombre-función{(argumento{:argumento...})}

Los argumentos de la función pueden ser variables, constantes, expresiones, unprocedimiento con prototipo u otras funciones incorporadas. Un argumentoexpresión puede incluir una función incorporada. En el ejemplo siguiente se ilustraeste caso.

Consulte las descripciones de cada función incorporada para obtener informaciónmás detallada sobre los argumentos que están permitidos. A diferencia de loscódigos de operación, las funciones no colocan un valor en un campo de resultado,sino que devuelven ese valor. En el ejemplo siguientes se ilustra esta diferencia.

CSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++++C*C* En este ejemplo se muestra una expresión compleja con variasC* funciones incorporadas anidadas.C*C* %TRIM toma como argumento una serie. En este ejemplo, elC* argumento es la concatenación de la serie A y la serieC* devuelta por la función incorporada %SUBST. Esta función devolveráC* una subserie de la serie B empezando por la posición 11 queC* tendrá la longitud devuelta por %SIZE menos 20. %SIZE devolveráC* la longitud de la serie B.C*C* Si A es la serie " Toronto," y B es la serieC* ' Ontario, Canadá ' el argumento de %TRIMC* será " Toronto, Canadá " y RES tendrá el valorC* "Toronto, Canadá".C*C EVAL RES = %TRIM(A + %SUBST(B:11:%SIZE(B) - 20))

Figura 108. Ejemplo de argumentos de función incorporada

© Copyright IBM Corp. 1994, 2000 309

Page 332: RPG Referencia

Observe que los argumentos utilizados en este ejemplo (la variable CITY y laexpresión C+1) se corresponden con los valores de los factores de la operaciónSUBST. El valor de retorno de la función también se corresponde con el resultado.Por lo general, los argumentos de las funciones incorporadas son similares a loscampos de los factores 1 y 2 de los códigos de operación.

Otra característica de interés de las funciones incorporadas es que simplifican elmantenimiento del código cuando se utiliza en la especificación de definición. Enel ejemplo siguiente se ilustra esta característica.

Las funciones incorporadas se pueden utilizar en expresiones en la especificaciónde cálculo del factor 2 ampliado y con palabras clave en la especificación dedefinición. Cuando se utilizan con palabras clave de especificación de definición, elvalor de las funciones incorporadas debe saberse en el momento de realizar lacompilación, y el argumento no puede ser una expresión.

CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* En el ejemplo siguiente, CITY contiene la serieC* "Toronto, Ontario". Se utiliza la operación SCAN para localizarC* el espacio en blanco de separación, que está en la posición 9 enC* este ejemplo. SUBST coloca la serie "Ontario" en el campo TCNTRE.C*C* A continuación, TCNTRE se compara con el literal "Ontario" yC* se suma 1 a CITYCNT.C*C ' ' SCAN CITY CC ADD 1 CC SUBST CITY:C TCNTREC 'Ontario' IFEQ TCNTREC ADD 1 CITYCNTC ENDIFC*C* En este ejemplo, CITY contiene el mismo valor, pero la variableC* TCNTRE no es necesaria, ya que la función incorporada %SUBSTC* devuelve el valor adecuado. Además, el paso intermedioC* de la suma de 1 a C se simplifica, ya que %SUBST aceptaC* expresiones como argumentos.C*C ' ' SCAN CITY CC IF %SUBST(CITY:C+1) = 'Ontario'C EVAL CITYCNT = CITYCNT+1C ENDIF

Figura 109. Ejemplo de función incorporada

DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++D*D* en este ejemplo, CUSTNAME es un campo de laD* estructura de datos descrita externamente CUSTOMER.D* Si se cambia la longitud de CUSTNAME, los atributos deD* TEMPNAME y NAMEARRAY se cambiarán al volver aD* compilar. La utilización de la función incorporada %SIZE significaD* que no es necesario realizar modificaciones en el código.D*D CUSTOMER E DSD DSD TEMPNAME LIKE(CUSTNAME)D NAMEARRAY 1 OVERLAY(TEMPNAME)D DIM(%SIZE(TEMPNAME))

Figura 110. Mantenimiento simplificado con funciones incorporadas

310 VisualAge RPG Consulta del lenguaje

Page 333: RPG Referencia

En la tabla siguiente se facilita una lista de las funciones incorporadas, susargumentos y el valor que devuelven.

Nombre de funciónincorporada Argumento(s) Valor devuelto

%ABS expresión numéricavalor absoluto de laexpresión

%ADDR nombre de variable dirección de variable

%CHAR expresión gráfica, de fecha,de hora o de indicación de lahora

valor con el tipo de datoscarácter

%DEC expresiónnumérica{:dígitos:decpos}

valor en formato numéricoempaquetado

%DECH expresiónnumérica:dígitos:decpos}

valor redondeado en formatonumérico empaquetado

%DECPOS expresión numérica número de dígitos decimales

%DIV dividendo: divisor el cociente de la división delos dos argumentos

%EDITC expresión numérica noflotante:códigoedición{:*CURSYM|*ASTFILL|símbolo de moneda}

serie que representa el valoreditado

%EDITFLT expresión numérica representación devisualización externa decaracteres flotantes

%EDITW expresión numérica noflotante:palabra edición

serie que representa el valoreditado

%ELEM nombre de matriz, tabla oestructura de datos demúltiples apariciones

número de elementos oapariciones

%EOF {archivo} ’1’ si la operación de entradade archivo o la grabación enun subarchivo (para unarchivo en concreto, si seespecifica) más reciente hafinalizado con una condiciónde fin de archivo o principiode archivo

’0’ en caso contrario

%EQUAL {archivo} ’1’ si la operación SETLL(para un archivo en concreto,si se especifica) o LOOKUPmás reciente ha encontradouna coincidencia exacta

’0’ en caso contrario

%ERROR ’1’ si el código de operaciónmás reciente con elampliador ’E’ especificado hadado como resultado unerror.

’0’ en caso contrario

%FLOAT expresión numérica valor con formato flotante

Capítulo 23. Funciones incorporadas 311

Page 334: RPG Referencia

Nombre de funciónincorporada Argumento(s) Valor devuelto

%FOUND {archivo} ’1’ si la operación pertinente(para un archivo en concreto,si se especifica) más recienteha encontrado un registro(CHAIN, DELETE, SETGT,SETLL), un elemento(LOOKUP) o unacoincidencia (CHECK,CHECKR y SCAN)

’0’ en caso contrario

%GETATR nombre de ventana, decomponente, de atributo,%PART, %WINDOW

valor de atributo

%GRAPH carácter, gráfico o expresiónUCS-2

valor en formato gráfico

%INT expresión numérica valor en formato de entero

%INTH expresión numérica valor redondeado en formatode entero

%LEN cualquier expresión longitud en dígitos ocaracteres

%NULLIND nombre de campo conposibilidad de nulos

valor con formato indicadorque representa el valor deindicador nulo del campocon posibilidad de nulos

%OPEN nombre de archivo ’1’ si el archivo especificadoestá abierto

’0’ si el archivo especificadoestá cerrado

%PADDR nombre de procedimiento dirección de procedimiento

%REM dividendo: divisor el resto de la división de losdos argumentos

%REPLACE serie de sustitución: serie delfuente{:posición inicial{:longitud del fuente asustituir}}

serie obtenida al insertar laserie de sustitución en laserie del fuente, empezandopor la posición inicial ysustituyendo el númeroespecificado de caracteres.

%SCAN argumento de búsqueda:seriea buscar{:posición inicial}

primera posición delargumento de búsqueda enla serie o cero si no seencuentra.

%SETATR nombre de ventana, decomponente, de atributo,%PART, %WINDOW

ninguno

%SIZE variable, matriz oliteral{:*ALL}

tamaño de variable o literal

312 VisualAge RPG Consulta del lenguaje

Page 335: RPG Referencia

Nombre de funciónincorporada Argumento(s) Valor devuelto

%STATUS {archivo} 0 si no se ha producidoningún error de programa nide archivo desde el códigode operación más recientecon el ampliador ’E’especificado

el valor más recienteestablecido para cualquierestado de archivo oprograma, si se ha producidoun error

si se ha especificado unarchivo, el valor devuelto esel estado más reciente dedicho archivo

%STR puntero{:longitud máxima} caracteres direccionados porargumento de puntero hastael primer x’00’, exclusive

%SUBST serie:inicio{:longitud} subserie

%TRIM serie serie con blancos truncadospor la derecha y por laizquierda

%TRIML serie serie con blancos truncadospor la izquierda

%TRIMR serie serie con blancos truncadospor la derecha

%UCS2 carácter o expresión gráfica valor en formato UCS-2

%UNS expresión numérica valor en formato sin signo

%UNSH expresión numérica valor redondeado en formatosin signo

%XFOOT expresión de matriz suma de los elementos

Para obtener más información acerca de la utilización de las funcionesincorporadas, consulte:v “Capítulo 18. Especificaciones de definición” en la página 227v “Sentencia de especificación del Cálculo del factor 2 ampliado” en la página 286v “Operaciones que utilizan expresiones” en la página 380v “DOU (Hacer hasta)” en la página 435v “DOW (Hacer mientras)” en la página 438v “EVAL (Evaluar expresión)” en la página 446v “IF (Si)” en la página 457v “RETURN (Volver al llamador)” en la página 525v “WHEN (Seleccionar cuando sea verdadero)” en la página 558

Funciones incorporadas (por orden alfabético)En los apartados siguientes se describen las funciones incorporadas.

%ABS (Valor absoluto de la expresión)%ABS

Capítulo 23. Funciones incorporadas 313

Page 336: RPG Referencia

%ABS devuelve el valor absoluto de la expresión numérica especificada comoparámetro. Si el valor de la expresión numérica es no negativo, el valor sedevuelve sin ningún cambio. Si el valor es negativo, se devuelve el valor de laexpresión, pero sin el signo negativo.

%ABS se puede utilizar en expresiones o como parámetros para palabras clave.Cuando se utiliza con palabras clave, el operando debe ser un literal numérico, unnombre de constante que represente un valor numérico o una función incorporadacon un valor numérico conocido en el tiempo de compilación.

%ADDR (Obtener dirección de variable)%ADDR(variable)%ADDR(variable(índice))%ADDR(variable(expresión))

%ADDR devuelve un valor de tipo puntero base. Este valor es la dirección de lavariable especificada. Sólo se puede comparar con y asignar a elementos de tipopuntero base.

Si se especifica %ADDR con un parámetro de índice de matriz en las palabrasclave INZ o CONST de especificación de definición, el índice de matriz debeconocerse en la compilación. El índice debe ser un literal o una constantenuméricos.

En una operación EVAL en la que el resultado de la asignación es una matriz siníndice, %ADDR situada en la parte derecha del operador de asignación tiene unsignificado diferente según el argumento que tenga. Si el argumento de %ADDR esun nombre de matriz sin índice y el resultado es un nombre de matriz, cadaelemento de la matriz resultante contiene la dirección del principio del argumentomatriz. Si el argumento de %ADDR es un nombre de matriz cuyo índice es (*),cada elemento de la matriz resultante contendrá la dirección del elementocorrespondientes en el argumento matriz. Esto se ilustra en la Figura 112 en lapágina 315.

DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++

D f8 s 8f inz (-1)D i10 s 10i 0 inz (-123)D p7 s 7p 3 inz (-1234.567)

CSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++

C eval f8 = %abs (f8)C eval i10 = %abs (i10 - 321)C eval p7 = %abs (p7)

C* El valor de "f8" ahora es 1.C* El valor de "i10" ahora es 444.C* El valor de "p7" ahora es 1234.567.

Figura 111. %ABS

314 VisualAge RPG Consulta del lenguaje

Page 337: RPG Referencia

Si la variable especificada como parámetro es una tabla, una estructura de datos demúltiples apariciones o un subcampo de una estructura de datos de múltiplesapariciones, la dirección es la del índice actual de la tabla o del número deaparición.

Si la variable está basada, %ADDR devuelve el valor del puntero base de lavariable. Si la variable es un subcampo de una estructura de datos basada, el valorde %ADDR es el valor del puntero base más el desplazamiento del subcampo.

Si la variable se especifica como parámetro (PARM) de *ENTRY PLIST, %ADDRdevuelve la dirección que el llamador ha pasado al programa.

DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++D*D* El conjunto siguiente de definiciones es válido, ya que el índiceD* de la matriz tiene un valor de tiempo de compilaciónD*D ARRAY S 20A DIM (100)D* Establece el puntero en la dirección del séptimo elemento de la matriz.D PTR S * INZ (%ADDR(ARRAY(SEVEN)))D SEVEN C CONST (7)D*D DS1 DS OCCURS (100)D 20AD SUBF 10AD 30AD CHAR10 S 10A BASED (P)D PARRAY S * DIM(100)

Figura 112. Ejemplo de %ADDR

Capítulo 23. Funciones incorporadas 315

Page 338: RPG Referencia

%CHAR (Convertir a datos de tipo carácter)%CHAR(expresión)

%CHAR convierte el valor de la expresión de datos gráficos, UCS-2, numéricos, defecha, de hora o de indicación de la hora a tipo carácter. El valor convertido nosufre cambio alguno, pero es devuelto en un formato compatible con los datos detipo carácter.

Si el parámetro es una constante, la conversión se efectuará en tiempo decompilación.

Si una conversión de UCS-2 provoca caracteres de sustitución, en el listado delcompilador aparecerá un mensaje de aviso si el parámetro es una constante. De locontrario, en tiempo de ejecución se establecerá el estado 00050 pero no se daráningún mensaje de error.

En el caso de los datos gráficos, el valor devuelto es dos bytes para cada campográfico. Por ejemplo, si se convierte un campo gráfico de 5 caracteres, el valor

CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq..CSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++++C*C 23 OCCUR DS1C EVAL SUBF = *ALL'abcd'C EVAL P = %ADDR (SUBF)CC IF CHAR10 = SUBFC* Esta condición se cumpleC ENDIFCC IF %ADDR (CHAR10) = %ADDR (SUBF)C* Esta condición también se cumpleC ENDIFCC* La sentencia siguiente también cambia el valor de SUBFC EVAL CHAR10 = *ALL'efgh'CC IF CHAR10 = SUBFC* Esta condición también se cumpleC ENDIF*--------------------------------------------------------------

C 24 OCCUR DS1C IF CHAR10 = SUBFC* Esta condición ya no se cumpleC ENDIF*--------------------------------------------------------------

C* La dirección de un elemento de matriz se toma utilizando unaC* expresión como índice de la matrizC*C EVAL P = %ADDR (ARRAY (X + 10))*--------------------------------------------------------------

C* Cada elemento de la matriz PARRAY contiene la dirección delC* primer elemento de la matriz ARRAY.C EVAL PARRAY = %ADDR(ARRAY)C* Cada elemento de la matriz PARRAY contiene la dirección delC* elemento correspondiente de la matriz ARRAYC EVAL PARRAY = %ADDR(ARRAY(*))

Figura 113. Ejemplo de %ADDR

316 VisualAge RPG Consulta del lenguaje

Page 339: RPG Referencia

devuelto es 10 caracteres (10 bytes de datos gráficos). Si el valor de la expresióntiene una longitud variable, el valor devuelto tiene el formato variable.

Para datos de fecha, de hora o de indicación de la hora, el valor devuelto incluyelos caracteres de separador. El formato y los separadores del resultado son losmismos que el del parámetro.

%DEC (Convertir a formato decimal empaquetado)%DEC(expresión numérica{:precisión:posiciones decimales})

%DEC convierte el valor de la expresión numérica a formato decimal(empaquetado) con dígitos de precisión y posiciones decimales. La precisión y lasposiciones decimales deben ser literales numéricos, constantes con nombre querepresenten literales numéricos o funciones incorporadas con un valor numérico,que debe conocerse en el momento de realizar la compilación.

Los parámetros de posición y las posiciones decimales se pueden omitir si el tipode expresión numérica es no flotante. Si se omiten estos parámetros, la precisión ylas posiciones decimales se toman de los atributos de la expresión numérica.

DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++D ChineseName S 20G VARYING INZ(G'XXYYZZ')D date S D INZ(D'1997/02/03')D time S T INZ(T'12:23:34')D result S 100A VARYING

CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq..CSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++++

C EVAL result = 'It is ' + %CHAR(time)C + ' on ' + %CHAR(date)

C* result = 'It is 12:23:34 on 1997/02/03'C*C EVAL result = 'The time is now 'C + %SUBST(%CHAR(time):1:5) + '.'

C* result = 'The time is now 12:23.'C*C EVAL result = 'The customer''s name is 'C + %CHAR(ChineseName) + '.'

C* result = 'The customer's name is XXYYZZ.'

Figura 114. Ejemplo de %CHAR

Capítulo 23. Funciones incorporadas 317

Page 340: RPG Referencia

%DECH (Convertir a formato decimal empaquetado conredondeo)

%DECH(expresión numérica:precisión:posiciones decimales)

%DECH es igual a %DEC, excepto si la expresión numérica es un valor decimal oflotante, en cuyo caso se aplica el redondeo al valor de la expresión numérica alefectuar la conversión para la precisión deseada. Si no se puede llevar a cabo elredondeo, no se emite ningún mensaje.

A diferencia de %DEC, son obligatorios los tres parámetros.

%DECPOS (Obtener el número de posiciones decimales)%DECPOS(expresión numérica)

DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++

D p7 s 7p 3 inz (1234.567)D s9 s 9s 5 inz (73.73442)D f8 s 8f inz (123.456789)D result1 s 15p 5D result2 s 15p 5D result3 s 15p 5

CSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++

C eval result1 = %dec (p7) + 0.011C eval result2 = %dec (s9 : 5: 0)C eval result3 = %dech (f8: 5: 2)

C* El valor de "result1" ahora es 1234.57800.C* El valor de "result2" ahora es 73.00000.C* El valor de "result3" ahora es 123.46000.

Figura 115. Ejemplo de %DEC y %DECH

DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++

D p7 s 7p 3 inz (1234.567)D s9 s 9s 5 inz (73.73442)D f8 s 8f inz (123.456789)D result1 s 15p 5D result2 s 15p 5D result3 s 15p 5

CSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++

C eval result1 = %dec (p7) + 0.011C eval result2 = %dec (s9 : 5: 0)C eval result3 = %dech (f8: 5: 2)

* El valor de "result1" ahora es 1234.57800.* El valor de "result2" ahora es 73.00000* El valor de "result3" ahora es 123.46000.

Figura 116. Ejemplo de %DEC y %DECH

318 VisualAge RPG Consulta del lenguaje

Page 341: RPG Referencia

%DECPOS devuelve el número de posiciones decimales de la expresión o variablenumérica. El valor devuelto es una constante, por lo que puede participar en laacomodación de constantes.

La expresión numérica no debe ser una expresión ni una variable flotante.

%DIV (Devolver la porción entera del cociente)%DIV(n:m)

%DIV devuelve la porción entera del cociente que es el resultado de dividir losoperandos n por m. Los dos operandos deben ser valores numéricos con ceroposiciones decimales. Si alguno de los operandos es un valor numéricoempaquetado, con zona o binario, el resultado es un valor numérico empaquetado.Si alguno de los operandos es un valor numérico entero, el resultado es un entero.De lo contrario, el resultado es un valor numérico sin signo. No se permitenoperandos numéricos de coma flotante. (Véase también “%REM (Devolver restoentero)” en la página 334.)

Si los operandos son constantes que pueden caber en campos enteros o sin signode 8 bytes, la función incorporada aplica la evaluación de constantes en tiempo decompilación. En este caso, es posible codificar la función incorporada %DIV en lasespecificaciones de definiciones.

Esta función se ilustra en la Figura 139 en la página 335.

%EDITC (Editar valor utilizando un Editcode)%EDITC(numérico : código de edición {: *ASTFILL | *CURSYM | símbolo de moneda})

Esta función devuelve un resultado de tipo carácter que representa el valornumérico editado según el código de edición. Por lo general, las reglas del valornumérico y del código de edición son idénticas a las de los valores numéricos deedición en las especificaciones de salida. El tercer parámetro es opcional y, si seespecifica, debe ser uno de los siguientes:

*ASTFILLIndica que se utilizará la protección de asterisco. De este modo, los ceros

DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++

D p7 s 7p 3 inz (8236.567)D s9 s 9s 5 inz (23.73442)D result1 s 5i 0D result2 s 5i 0D result3 s 5i 0

CSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++C eval result1 = %decpos (p7)C eval result2 = %decpos (s9)C eval result3 = %decpos (p7 * s9)

C* El valor de "result1" ahora es 3.C* El valor de "result2" ahora es 5.C* El valor de "result3" ahora es 8.

Figura 117. Ejemplo de %DECPOS

Capítulo 23. Funciones incorporadas 319

Page 342: RPG Referencia

iniciales se sustituyen por asteriscos en el valor devuelto. Por ejemplo,%EDITC(-0012.5 : ’K’ : *ASTFILL) devuelve ’**12.5–’.

*CURSYMIndica que se utilizará un símbolo de moneda flotante. El símbolo real seráel que se haya especificado en la palabra clave CURSYM de laespecificación de control o, el valor por omisión, ’$’. Si se especifica*CURSYM, el símbolo de moneda se sitúa en el resultado justo antes delprimer dígito significativo. Por ejemplo, %EDITC(0012.5 : ’K’ : *CURSYM)devuelve ’ $12.5 ’.

símbolo de monedaIndica que se utilizará moneda flotante con el símbolo de monedaproporcionado. Debe ser una constante de tipo carácter de 1 byte (literal,constante con nombre o expresión que pueda evaluarse en tiempo decompilación). Por ejemplo, %EDITC(0012.5 : ’K’ : ’X’) devuelve ’ X12.5 ’.

El resultado de %EDITC tiene siempre la misma longitud, y puede contenerblancos iniciales y de cola. Por ejemplo, %EDITC(NUM : ’A’ : ’$’) puede devolver’$1,234.56CR’ para un valor de NUM y ’ $4.56 ’ para otro valor.

No se permiten expresiones flotantes en el primer parámetro (se puede utilizar%DEC para convertir una expresión flotante en un formato que se puede editar).El código de edición se especifica como una constante de tipo carácter; los códigosde edición para los que se ofrece soporte son los siguientes: ’A’ – ’D’, ’J’ – ’Q’, ’X’ –’Z’, ’1’ – ’9’. La constante puede ser un literal, una constante con nombre o unaexpresión cuyo valor puede determinarse al efectuar la compilación.

Un requisito común es editar un campo, tal y como se indica a continuación:v Los ceros iniciales se suprimenv Se sitúan paréntesis en torno al valor si es negativo

DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++D msg S 100AD salary S 9P 2 INZ(1000)* Si el valor de salary es 1000, el valor de salary * 12* es 12000.00. La versión editada salary * 12 utilizando el* código de edición A con moneda flotante es ' $12,000.00 '.* El valor de msg es 'The annual salary is $12,000.00'

CL0N01Factor1+++++++Opcode&ExtExtended-factor2+++++++++++++++++++++++++++C EVAL msg = 'The annual salary is 'C + %trim(%editc(salary * 12C :'A': *CURSYM))* En el ejemplo siguiente, el valor de msg es 'The annual salary is &12,000.00'

C EVAL msg = 'The annual salary is 'C + %trim(%editc(salary * 12C :'A': '&'))

* En el ejemplo siguiente, el valor de msg es 'Salary is $*****12,000.00'* '$' procede del texto, no del código de edición.

C EVAL msg = 'Salary is $'C + %trim(%editc(salary * 12C :'B': *ASTFILL))

* En el ejemplo siguiente, el valor de msg es 'The date is 1/14/1999'C EVAL msg = 'The date is 'C + %trim(%editc(*date : 'Y'))

Figura 118. Ejemplo 1 de %EDITC

320 VisualAge RPG Consulta del lenguaje

Page 343: RPG Referencia

Utilizando un %EDITC en un subprocedimiento, lo siguiente cumple estas reglas:

%EDITFLT (Convertir en representación flotante externa)%EDITFLT(expresión numérica)

%EDITFLT convierte el valor de la expresión numérica para la representación de lavisualización externa de caracteres flotantes. El resultado son 14 ó 23 caracteres. Siel argumento es un campo flotante de 4 bytes, el resultado son 14 caracteres. De locontrario, son 23 caracteres.

Si se especifica como un parámetro para una palabra clave de especificación dedefinición, el parámetro debe ser un literal numérico, un literal flotante o unnombre de constante de valor numérico o función incorporada. Cuando se

D neg S 5P 2 inz(-12.3)D pos S 5P 2 inz(54.32)D editparens PR 50AD val 30P 2 valueD editedVal S 10A

C EVAL editedVal = editparens(neg)

C* Ahora, editedVal tiene el valor '(12.30) '

C EVAL editedVal = editparens(pos)

C* Ahora, editedVal tiene el valor ' 54.32 '

*---------------------------------------------------------------* Subprocedimiento EDITPARENS*---------------------------------------------------------------

P editparens BD editparens PI 50AD val 30P 2 valueD lparen S 1A inz(' ')D rparen S 1A inz(' ')D res S 50A

C* Utiliza paréntesis si el valor es negativo

C IF val < 0C EVAL lparen = '('C EVAL rparen = ')'C ENDIF

C* Devolver el valor editadoC* El código de edición '1' no incluye ningún signo, por lo queC* no es necesario calcular el valor absoluto.

C RETURN lparen +C %editc(val : '1') +C rparen

P editparens E

Figura 119. Ejemplo 2 de %EDITC

Capítulo 23. Funciones incorporadas 321

Page 344: RPG Referencia

especifica en una expresión, la acomodación de constantes se aplica si la expresiónnumérica tiene un valor constante.

%EDITW (Editar valor utilizando una Palabra de edición)%EDITW(numérico : palabra de edición)

Esta función devuelve un resultado de tipo carácter que representa el valornumérico editado según la palabra de edición. Las reglas del valor numérico y dela palabra de edición son idénticas a las de los valores numéricos de edición en lasespecificaciones de salida.

No se permiten expresiones flotantes en el primer parámetro. Se puede utilizar%DEC para convertir un formato flotante en un formato que se puede editar.

La palabra de edición debe ser una constante de tipo carácter.

%ELEM (Obtener número de elementos)%ELEM(nombre_tabla)%ELEM(nombre_matriz)%ELEM(nombre_estructura_datos_múltiples_apariciones)

%ELEM devuelve el número de elementos de la matriz, tabla o estructura de datosde múltiples apariciones. Se puede especificar en cualquier posición de lasespecificaciones de definición en que se permita una constante numérica o en unaexpresión en el campo del factor 2 ampliado.

DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++

D f8 s 8f inz (50000)D string s 40a

CSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++

C eval string = 'Float value is 'C + %editflt (f8 - 4e4) + '.'

C* El valor de "string" es 'Float value is +1.000000000000000E+004. '

Figura 120. Ejemplo de %EDITFLT

DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++

D amount S 30AD salary S 9P 2D editwd C '$ , , **Dollars& &Cents;'

C* Si el valor de salary es 2451.53, la versión editada deC* (salary * 12) es '$***29,418*Dollars 36 Cents'. El valor deC* amount es 'The annual salary is $***29,418*Dollars 36 Cents'.

CSRN01Factor1+++++++Opcode&ExtExtended-factor2+++++++++++++++++++++++++++

C EVAL amount = 'The annual salary is 'C + %editw(salary * 12 : editwd)

Figura 121. Ejemplo de %EDITW

322 VisualAge RPG Consulta del lenguaje

Page 345: RPG Referencia

El parámetro debe ser el nombre de una matriz, de una tabla o de una estructurade datos de múltiples apariciones.

%EOF (Devolver condición de fin o principio de archivo)%EOF{(archivo)}

%EOF devuelve ’1’ si la operación de lectura o la grabación en un subarchivo másreciente ha finalizado con una condición de fin de archivo o principio de archivo;en caso contrario, devuelve ’0’.

Las operaciones que establecen %EOF son:v “READ (Leer un registro)” en la página 510v “READC (Leer siguiente registro modificado)” en la página 513v “READE (Leer clave igual)” en la página 514v “READP (Leer registro anterior)” en la página 516v “READPE (Leer igual anterior)” en la página 518v “WRITE (Crear nuevos registros)” en la página 561 (subarchivo sólo).

Cuando se especifica un archivo controlado en cálculo, esta función devuelve ’1’ sila operación anterior de la lista que figura más arriba, para el archivo especificado,ha dado como resultado una condición de fin o principio de archivo. En el caso dearchivos primarios y secundarios, %EOF está disponible sólo si se especifica elnombre de archivo. Se establece en ’1’ si la operación de entrada más reciente en eltranscurso del proceso *GETIN ha dado como resultado una condición de fin oprincipio de archivo. En caso contrario, devuelve ’0’.

Esta función está permitida para archivos de entrada, actualización y de direcciónde registro, así como para archivos de pantalla que permitan la realización deoperaciones WRITE en registros de subarchivos.

DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++DD arr1d S 20 DIM(10)D table S 10 DIM(20) ctdataD mds DS 20 occurs(30)D like_array S like(arr1d) dim(%elem(arr1d))D array_dims C const (%elem (arr1d))CSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++++CC* En los ejemplos siguientes, num será igual a 10, 20 y 30.C*C EVAL num = %elem (arr1d)C EVAL num = %elem (table)C EVAL num = %elem (mds)

Figura 122. Ejemplo de %ELEM

Capítulo 23. Funciones incorporadas 323

Page 346: RPG Referencia

%EQUAL (Devolver condición de coincidencia exacta)%EQUAL{(archivo)}

*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....FFilename++IT.A.FRlen+......A.Device+.Keywords+++++++++++++++++++++++++++++F* El formato de registro del archivo INFILE es INRECFINFILE IF E DISKCSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C* Leer un registroC READ INRECC* Si se ha alcanzado el fin de archivo ...C IF %EOFC ...C ENDIF

Figura 123. %EOF sin el parámetro de nombre de archivo

*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....FFilename++IT.A.FRlen+......A.Device+.Keywords+++++++++++++++++++++++++++++F* Este programa compara dos archivosF*FFILE1 IF E DISKFFILE2 IF E DISKFCSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C* Ejecutar el bucle hasta que FILE1 o FILE2 llegen alC* final de archivoC DOU %EOF(FILE1) OR %EOF(FILE2)C* Leer un registro de cada archivo y comparar losC* registrosC*C READ REC1C READ REC2

C SELECT

C WHEN %EOF(FILE1) AND %EOF(FILE2)C* Ambos archivos han llegado al final de archivoC EXSR EndCompare

C WHEN %EOF(FILE1)C* FILE1 es más pequeño que FILE2C EXSR F1Short

C WHEN %EOF(FILE2)C* FILE2 es más pequeño que FILE1C EXSR F2ShortC OTHERC* Ambos archivos tienen registros que aún no se hanC* comparadoC EXSR CompareRecsC ENDSL

C ENDDO

...

Figura 124. %EOF con el parámetro de nombre de archivo

324 VisualAge RPG Consulta del lenguaje

Page 347: RPG Referencia

%EQUAL devuelve ’1’ si la operación pertinente más reciente ha encontrado unacoincidencia exacta; en caso contrario, devuelve ’0’.

Las operaciones que establecen %EQUAL son:v “SETLL (Establecer límite inferior)” en la página 534v “LOOKUP (Buscar un elemento en tabla o matriz)” en la página 466

Si se utiliza %EQUAL sin el parámetro opcional de nombre de archivo, devuelve elvalor establecido para la operación apropiada más reciente.

Para la operación SETLL, esta función devuelve ’1’ si existe un registro cuya claveo cuyo número relativo sea igual al argumento de búsqueda.

Para la operación LOOKUP con el indicador EQ especificado, esta funcióndevuelve ’1’ si se encuentra un elemento que coincida exactamente con elargumento de búsqueda.

Si se especifica un nombre de archivo, esta función se aplica a la operación SETLLmás reciente para el archivo especificado. Esta función está permitida sólo paraaquellos archivos que permiten el código de operación SETLL.

%ERROR (Devolver condición de error)%ERROR devuelve ’1’ si la operación más reciente con el ampliador ’E’especificado ha dado como resultado una condición de error. Es lo mismo queactivar el indicador de error para la operación. Antes de que comience unaoperación con el ampliador ’E’ especificado, %ERROR se establece de manera quedevuelva ’0’ y no sufre cambio alguno después de la operación si no se produceningún error. Todas las operaciones que permiten un indicador de error puedenestablecer también la función incorporada %ERROR.

Si desea ver ejemplos de la función incorporada, consulte la Figura 144 en lapágina 340 y la Figura 145 en la página 341.

%FLOAT (Convertir en formato flotante)%FLOAT(expresión numérica)

%FLOAT convierte el valor de la expresión numérica en formato flotante. Estafunción incorporada únicamente se puede utilizar en expresiones.

*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....FFilename++IT.A.FRlen+......A.Device+.Keywords+++++++++++++++++++++++++++++F* El formato de registro del archivo CUSTS es CUSTRECFCUSTS IF E K DISKCSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C* Comprobar si el archivo contiene un registro con una claveC* Cust coincidenteC Cust SETLL CUSTRECC IF %EQUALC ... se ha encontrado una coincidencia exacta en el archivoC ENDIF

Figura 125. Ejemplo de %EQUAL con SETLL

Capítulo 23. Funciones incorporadas 325

Page 348: RPG Referencia

%FOUND (Devolver condición de encontrado)%FOUND{(archivo)}

%FOUND devuelve ’1’ si la operación de archivo apropiada más reciente haencontrado un registro, si una operación de serie ha encontrado una coincidencia osi una operación de búsqueda ha encontrado un elemento. En caso contrario, estafunción devuelve ’0’.

Si se utiliza %FOUND sin el parámetro opcional de nombre de archivo, devuelveel valor establecido para la operación apropiada más reciente. Si se especifica unnombre de archivo, se aplica a la operación apropiada más reciente sobre dichoarchivo.

Para las operaciones de archivo, %FOUND es funcionalmente lo contrario delindicador NR (″no se ha encontrado ningún registro″).

Para las operaciones de serie, %FOUND es funcionalmente lo mismo que elindicador FD (″encontrado″).

En el caso de la operación LOOKUP, %FOUND devuelve ’1’ si la operaciónencuentra un elemento que cumpla las condiciones de búsqueda.

DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++

D p1 s 15p 0 inz (1)D p2 s 25p13 inz (3)D result1 s 15p 5D result2 s 15p 5D result3 s 15p 5

CSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++

C eval result1 = p1 / p2C eval result2 = %float (p1) / p2C eval result3 = %float (p1 / p2)

C* El valor de "result1" ahora es 0.33000.C* El valor de "result2" ahora es 0.33333.C* El valor de "result3" ahora es 0.33333.

Figura 126. Ejemplo de %FLOAT

*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....FFilename++IT.A.FRlen+......A.Device+.Keywords+++++++++++++++++++++++++++++F* El formato de registro del archivo CUSTS es CUSTRECFCUSTS IF E K DISKCSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C* Comprobar si el cliente figura en el archivoC Cust CHAIN CUSTRECC IF %FOUNDC ...C ENDIF

Figura 127. %FOUND utilizado para probar una operación de archivo sin ningún parámetro

326 VisualAge RPG Consulta del lenguaje

Page 349: RPG Referencia

%GETATR (Recuperar atributo)%GETATR(nombre_ventana:nombre_componente:nombre_atributo)

%GETATR devuelve el valor de atributo de un componente de una ventana. Tantoel primero como el segundo parámetro pueden ser %WINDOW o %PART.

Notas:

1. La función incorporada %GETATR no afecta a los campos del programacorrespondientes a los componentes. Si desea que el campo de programacorrespondiente para el componente contenga el valor actual de un campo deentrada, conviértalo en el destino de %GETATR incorporada; por ejemplo:

*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....FFilename++IT.A.FRlen+......A.Device+.Keywords+++++++++++++++++++++++++++++F* El archivo MASTER contiene todos los clientesF* El archivo GOLD contiene sólo los clientes "preferentes"FMASTER IF E K DISKFGOLD IF E K DISKCSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C* Comprobar si existe el cliente, pero no es preferenteC Cust CHAIN MASTRECC Cust CHAIN GOLDRECC* Observe que se utiliza el nombre de archivo para %FOUND y no elC* nombre de registroC IF %FOUND(MASTER) AND NOT %FOUND(GOLD)C ...C ENDIF

Figura 128. %FOUND utilizado para probar una operación de archivo con un parámetro

*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++D Numbers C '0123456789'D Position S 5I 0CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C* Si no se requiere la posición real del nombre, basta con usarC* %FOUND para probar los resultados de la operación SCAN.C* Si el valor de Name es 'Barbara' y el de Line esC* 'in the city of Toronto. ', %FOUND devolverá '0'.C* Si el valor de Line es 'the city of Toronto where Barbara lives, 'C* %FOUND devolverá '1'.C Name SCAN LineC IF %FOUNDC EXSR PutLineC ENDIFC* Si Value contiene el valor '12345.67', Position se estableceráC* en 6 y %FOUND devolverá el valor '1'.C* Si Value contiene el valor '10203040', Position se estableceráC* en 0 y %FOUND devolverá el valor '0'.C Numbers CHECK Value PositionC IF %FOUNDC EXSR HandleNonNumC ENDIF

Figura 129. %FOUND utilizado para probar una operación de serie

Capítulo 23. Funciones incorporadas 327

Page 350: RPG Referencia

2. La función incorporada %GETATR no soporta valores enteros con signo y sinsigno de 1 y 8 bytes ni valores Unicode.

%GRAPH (Convertir a valor gráfico)%GRAPH(char-expr | graph-expr | UCS-2-expr { : ccsid })

%GRAPH convierte el valor de la expresión de tipo carácter, gráfico o UCS-2 ydevuelve un valor gráfico. El resultado tendrá una longitud variable si elparámetro tiene una longitud variable.

El segundo parámetro, ccsid, es opcional e indica el CCSID de la expresiónresultante. El CCSID toma por omisión el CCSID gráfico relacionado con el CCSIDde la estación de trabajo. Si se especifica CCSID(*GRAPH : *IGNORE) en laespecificación de control o se asume para el módulo, no se permite la función%GRAPH incorporada.

Si el parámetro es una constante, la conversión se efectuará en tiempo decompilación. En este caso, el CCSID es el CCSID gráfico relacionado con el CCSIDdel archivo fuente.

Si la conversión provoca caracteres de sustitución, se emite un mensaje de aviso entiempo de compilación. En tiempo de ejecución, se establece el estado 00050 y nose emite ningún mensaje de error.

Nota: No se soportan las conversiones entre dos CCSID Unicode. Para obtener unalista de los valores de CCSID soportados, consulte el tema “Apéndice D.Valores CCSID soportados” en la página 585

CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....Comments++++++CSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++++++Comments++++++C EVAL ENT0000B = %GETATR('INVENTORY':'ENT0000B':'TEXT')

Figura 130. Ejemplo de %GETATR

328 VisualAge RPG Consulta del lenguaje

Page 351: RPG Referencia

%INT (Convertir en formato de entero)%INT(expresión numérica)

%INT convierte el valor de la expresión numérica en entero. Todos los dígitosdecimales se truncan. Esta función incorporada únicamente se puede utilizar enexpresiones. %INT se puede utilizar para truncar las posiciones decimales de unvalor flotante o decimal, permitiendo que se puedan utilizar como un índice dematriz.

HKeywords++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++H CCSID(*GRAPH : 942)DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++D char S 5A INZ('abcde')D* Se utiliza la función %GRAPH incorporada para inicializar un campo gráficoD graph S 10G INZ(%GRAPH('AABBCCDDEE'))D ufield S 2C INZ(%UCS2('FFGG'))D graph2 S 2G CCSID(951) INZ(*HIVAL)D isEqual S 1ND proc PRD gparm 2G CCSID(951) VALUECSRN01Factor1+++++++Opcode&ExtExtended-factor2+++++++++++++++++++++++++++C EVAL graph = %GRAPH(char) + %GRAPH(ufield)* Ahora graph tiene los 7 caracteres gráficos AABBCCDDEEFFGG.

C EVAL isEqual = graph = %GRAPH(graph2 : 942)* El resultado de la función incorporada %GRAPH es el valor de* graph2, cuyo CCSID 951 se convierte a CCSID 942.

C EVAL graph2 = graph* El valor de graph se convierte de CCSID 942 a CCSID 951* y se almacena en graph2.* Esta conversión la realiza implícitamente el compilador.

C CALLP proc(graph)* El valor de graph se convierte de CCSID 942 a CCSID 951* de forma implícita, como parte del paso del parámetro por valor.

Figura 131. Ejemplos de %GRAPH

DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++D p7 s 7p 3 inz (1234.567)D s9 s 9s 5 inz (73.73442)D f8 s 8f inz (123.789)D result1 s 15p 5D result2 s 15p 5D result3 s 15p 5D array s 1a dim (200)D a s 1aCSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++C eval result1 = %int (p7) + 0.011C eval result2 = %int (s9)C eval result3 = %inth (f8)C* El valor de "result1" ahora es 1234.01100.C* El valor de "result2" ahora es 73.00000.C* El valor de "result3" ahora es 124.00000.C eval a = array (%inth (f8))C* %INT y %INTH se pueden utilizar como índices de matriz

Figura 132. Ejemplo de %INT e %INTH

Capítulo 23. Funciones incorporadas 329

Page 352: RPG Referencia

%INTH (Convertir en formato de entero con redondeo)%INTH(expresión numérica)

%INTH es igual a %INT, pero si la expresión numérica es un valor flotante odecimal, se aplica redondeo al valor de la expresión numérica al efectuar laconversión al tipo entero. Si no se puede llevar a cabo el redondeo, no se emiteningún mensaje.

%LEN (Obtener o establecer longitud)%LEN(expresión)

%LEN sirve para obtener la longitud de una expresión variable o para establecer lalongitud actual de un campo de longitud variable.

El parámetro no debe ser una constante figurativa.

%LEN utilizado por su valorSi se utiliza en la parte derecha de una expresión, esta función devuelve el númerode dígitos o caracteres de la expresión variable.

Para las expresiones numéricas, el valor devuelto representa la precisión de laexpresión y, no necesariamente, el número real de dígitos significativos. Para unaexpresión o variable flotante, el valor devuelto es 4 u 8. Cuando el parámetro es unliteral numérico, la longitud devuelta es el número de dígitos del literal.

Para expresiones de carácter, gráficas o UCS-2, el valor devuelto es el número decaracteres del valor de la expresión. Para valores de longitud variable, como porejemplo el valor devuelto por una función incorporada o un campo de longitudvariable, el valor devuelto por %LEN es la longitud actual del valor de carácter,gráfico o UCS-2.

Se debe tener en cuenta que si el parámetro es una función incorporada oexpresión con un valor calculable al llevar a cabo la compilación, la longituddevuelta es el número real de dígitos del valor constante, en lugar del valormáximo posible que puede devolver la expresión.

DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++D p7 s 7p 3 inz (1234.567)D s9 s 9s 5 inz (73.73442)D f8 s 8f inz (123.789)D result1 s 15p 5D result2 s 15p 5D result3 s 15p 5D array s 1a dim (200)D a s 1aCSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++C eval result1 = %int (p7) + 0.011C eval result2 = %int (s9)C eval result3 = %inth (f8)C* El valor de "result1" ahora es 1234.01100.C* El valor de "result2" ahora es 73.00000.C* El valor de "result3" ahora es 124.00000.C eval a = array (%inth (f8))C* %INT y %INTH se pueden utilizar como índices de matriz

Figura 133. Ejemplo de %INT e %INTH

330 VisualAge RPG Consulta del lenguaje

Page 353: RPG Referencia

Para todos los demás tipos de datos, el valor devuelto es el número de bytes delvalor.

%LEN utilizado para establecer la longitud de campos delongitud variableSi se utiliza en la parte izquierda de una expresión, esta función establece lalongitud actual de un campo de longitud variable. Si la longitud establecida essuperior a la actual, los caracteres del campo comprendidos entre la longitudantigua y la nueva se establecen en espacios en blanco.

Nota: Se puede utilizar %LEN en la parte izquierda de una expresión sólo si elparámetro es de longitud variable.

DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++D num1 S 7P 2D num2 S 5S 1D num3 S 5I 0 inz(2)D chr1 S 10A inz('Toronto ')D chr2 S 10A inz('Munich ')D ptr S *

CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq..CSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++++

C* Expresiones numéricas:C eval num1 = %len(num1) <=== 7C eval num1 = %decpos(num2) <=== 1C eval num1 = %len(num1*num2) <=== 12C eval num1 = %decpos(num1*num2) <=== 3C* Expresiones de carácter:C eval num1 = %len(chr1) <=== 10C eval num1 = %len(chr1+chr2) <=== 20C eval num1 = %len(%trim(chr1)) <=== 7C eval num1 = %len(%subst(chr1:1;:num3;)C + ' ' + %trim(chr2)) <=== 9C* %len y %decpos pueden ser útiles con otras funciones incorporadas.C* Aunque esta división se realiza en formato flotante, el resultado seC* convierte para la misma precisión que el resultado de la eval:C eval num1 = 27 + %dec (%float(num1)/num3C : %len(num1)C : %decpos(num1))C* Se debe asignar espacio suficiente para el resultado de la concate-C* nación (además de un byte adicional para un carácter nulo final):C eval num3 = %len(chr1+chr2)+1C alloc num3 ptrC eval %str(ptr : num3) = chr1 + chr2

Figura 134. Ejemplo de %DECPOS y %LEN

Capítulo 23. Funciones incorporadas 331

Page 354: RPG Referencia

%NULLIND (Consultar o establecer indicador de nulo)%NULLIND(nombre de campo)

La función incorporada %NULLIND se puede utilizar para consultar o establecerel indicador de nulo para los campos con posibilidad de nulos. Esta funciónincorporada sólo se puede utilizar si se especifica la opción de compilación Controlde usuario o la palabra clave ALWNULL(*USRCTL). El nombre de campo puedeser un elemento de matriz con posibilidad de nulos, una estructura de datos, uncampo autónomo, un subcampo o una estructura de datos de varias apariciones.

%NULLIND sólo se puede utilizar en expresiones de factor ampliado 2.

Si se utiliza en la parte derecha de una expresión, esta función devuelve el valordel indicador de nulo del campo con posibilidad de nulos. El valor puede ser *ONu *OFF.

Si se utiliza en la parte izquierda de una expresión, esta función sirve paraestablecer en *ON o en *OFF el indicador de nulo de los campos con posibilidadde nulos. El contenido de un campo con posibilidad de nulos no se modifica.

En “Soporte de valores nulos de base de datos” en la página 128 hallará másinformación referente al manejo de registros con claves y campos con posibilidadde nulos.

DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++D*D city S 40A VARYING INZ('North York')D n1 S 5i 0CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq..CSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++++C* Se utiliza %LEN para obtener la longitud actual de un campo deC* longitud variable:C EVAL n1 = %LEN(city)C* Longitud actual, n1 = 10C*C* Se utiliza %LEN para establecer la longitud actual de un campoC* de longitud variable:C EVAL %LEN(city) = 5C* city = 'North' (length is 5)C*C EVAL %LEN(city) = 15C* city = 'North ' (length is 15)

Figura 135. Ejemplo de %LEN con campo de longitud variable

332 VisualAge RPG Consulta del lenguaje

Page 355: RPG Referencia

%OPEN (Devolver condición de apertura de archivo)%OPEN(archivo)

%OPEN devuelve ’1’ si el archivo especificado está abierto. Se considera que unarchivo está ″abierto″ si lo ha abierto el programa RPG en el transcurso de lainicialización, o bien una operación OPEN, y no se ha cerrado posteriormente. Si elarchivo está condicionado por un indicador externo y éste estaba desactivado en lainicialización del programa, se considera que el archivo está cerrado y %OPENdevuelve ’0’.

%PADDR (Obtener dirección de procedimiento)%PADDR(serie)

%PADDR devuelve un valor de tipo puntero de procedimiento. Este valor es ladirección del punto de entrada especificado como argumento.

%PADDR sólo se puede comparar con y asignar a elementos del tipo puntero deprocedimiento.

El parámetro de %PADDR debe ser un literal hexadecimal o de caracteres o bienun nombre de constante que represente a un literal hexadecimal o de caracteres. Elnombre de punto de entrada especificado en la serie de caracteres debe encontrarseen el momento de enlazar el programa y la combinación de mayúsculas yminúsculas debe ser correcta.

CSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++++C*C* Comprobar el indicador de nulo para el campo con posibilidad de nulo.C*C IF %NULLIND(fieldname1)C :C ENDIFCSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++++C*C* Establecer el indicador de nulo para un campo con posibilidad de nulo.C*C EVAL %NULLIND(fieldname1) = *ONC EVAL %NULLIND(fieldname2) = *OFF

Figura 136. Ejemplo de %NULLIND

*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....FFilename++IT.A.FRlen+......A.Device+.Keywords+++++++++++++++++++++++++++++F* Se abre el archivo de impresora en las especificaciones de cálculoFQSYSPRT O F 132 PRINTER USROPN

CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C* Abrir el archivo si no lo está yaC IF NOT %OPEN(QSYSPRT)C OPEN QSYSPRTC ENDIF...

Figura 137. Ejemplo de %OPEN

Capítulo 23. Funciones incorporadas 333

Page 356: RPG Referencia

%REM (Devolver resto entero)%REM(n:m)

%REM devuelve el resto de la división entre los operandos n y m. Los dosoperandos deben ser valores numéricos con cero posiciones decimales. Si algunode los operandos es un valor numérico empaquetado, con zona o binario, elresultado es un valor numérico empaquetado. Si alguno de los operandos es unvalor numérico entero, el resultado es un entero. De lo contrario, el resultado es unvalor numérico sin signo. No se permiten operandos numéricos de coma flotante.El resultado tiene el mismo signo que el dividendo. (Véase también “%DIV(Devolver la porción entera del cociente)” en la página 319.)

%REM y %DIV presentan la siguiente relación entre sí:%REM(A:B) = A - (%DIV(A:B) * B)

Si los operandos son constantes que pueden caber en campos enteros o sin signode 8 bytes, la función incorporada aplica la evaluación de constantes en tiempo decompilación. En este caso, es posible codificar la función incorporada %REM en lasespecificaciones de definiciones.

DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++DD PROC S * PROCPTRD INZ (%PADDR ('FIRSTPROG'))D PROC1 S * PROCPTRCSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq..CSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++++C*C* La sentencia siguiente llama al procedimiento 'FIRSTPROG'.C*C CALLB PROC*-----------------------------------------------------------------

C* La sentencia siguiente llama al procedimiento 'NextProg'.C* Se trata de un procedimiento en C y combina mayúsculas y minúsculas.C* Tenga en cuenta que el nombre de procedimiento es sensible a lasC* mayúsculas y a las minúsculas.C*C EVAL PROC1 = %PADDR ('NextProg')C CALLB PROC1

Figura 138. Ejemplo de %PADDR

334 VisualAge RPG Consulta del lenguaje

Page 357: RPG Referencia

%REPLACE (Sustituir serie de caracteres)%REPLACE(serie de sustitución: serie fuente{:posición inicial :longitud dela serie fuentea sustituir})

%REPLACE devuelve la serie de caracteres obtenida al insertar una serie desustitución en la serie fuente, empezando por la posición inicial y sustituyendo elnúmero especificado de caracteres.

El primer y segundo parámetro deben ser de tipo carácter, gráfico o UCS-2 y suformato puede ser de longitud variable o fija. El segundo parámetro debe ser delmismo tipo que el primero.

El tercer parámetro representa la posición inicial, medida en caracteres, de la seriede sustitución. Si no se especifica, la posición inicial será el principio de la seriefuente. El valor puede estar comprendido ente uno y la longitud actual de la seriefuente más uno.

El cuarto parámetro representa el número de caracteres de la serie fuente quedeben sustituirse. Si se especifica cero, la serie de sustitución se inserta antes de laposición inicial especificada. Si no se especifica el parámetro, el número decaracteres sustituidos es el mismo que la longitud de la serie de sustitución. Elvalor debe ser mayor o igual que cero y menor o igual que la longitud actual de laserie fuente.

La posición inicial y la longitud pueden ser una expresión o valor numéricoscualesquiera sin posiciones decimales.

El valor devuelto será de longitud variable si la serie fuente o la de sustitución loson o bien si la posición inicial o la longitud del fuente a sustituir son variables. Encaso contrario, el resultado será de longitud fija.

DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++*

D A S 10I 0 INZ(123)D B S 10I 0 INZ(27)D DIV S 10I 0D REM S 10I 0D E S 10I 0*

CL0N01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++++*

C EVAL DIV = %DIV(A:B)C EVAL REM = %REM(A:B)C EVAL E = DIV*B + REM* Ahora, DIV = 4, REM = 15 y E = 123

Figura 139. Ejemplo de %DIV y %REM

Capítulo 23. Funciones incorporadas 335

Page 358: RPG Referencia

DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++D var1 S 30A INZ('Windsor') VARYINGD var2 S 30A INZ('Ontario') VARYINGD var3 S 30A INZ('Canada') VARYINGD fixed1 S 15A INZ('California')D date S D INZ(D'1997-02-03')D result S 100A VARYINGCSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq..CSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++++CC EVAL result = var1 + ', ' + 'ON'C* result = 'Windsor, ON'C*C* %REPLACE con 2 parámetros para sustituir el texto que hay alC* principio de la serie:C EVAL result = %REPLACE('Toronto': result)C* result = 'Toronto, ON'C*

Figura 140. Ejemplo de %REPLACE (Pieza 1 de 2)

C*C* %REPLACE con 3 parámetros para sustituir el texto que hay en laC* posición especificada:C EVAL result = %REPLACE(var3: result:C %SCAN(',': result)+2)C* result = 'Toronto, Canada'C*C* %REPLACE con 4 parámetros para insertar texto:C EVAL result = %REPLACE(', '+var2: result:C %SCAN(',': result): 0)C* result = 'Toronto, Ontario, Canada'C*C* %REPLACE con 4 parámetros para sustituir series con longitudesC* diferentes:C EVAL result = %REPLACE('Scarborough': result:C 1: %SCAN(',': result)-1)C* result = 'Scarborough, Ontario, Canada'C*C* %REPLACE con 4 parámetros para suprimir texto:C EVAL result = %REPLACE('': result: 1:C %SCAN(',': result)+1)C* result = 'Ontario, Canada'C*C* %REPLACE con 4 parámetros para añadir texto al final de la serie:C EVAL result = %REPLACE(', ' + %CHAR(date):C result:C %LEN(result)+1: 0)C* result = 'Ontario, Canada, 1997-02-03'C*C* %REPLACE con 3 parámetros para sustituir el texto de longitud fijaC* specified position: (fixed1 has fixed-length of 15 chars)C EVAL result = %REPLACE(fixed1: result:C %SCAN(',': result)+2)C* result = 'Ontario, California -03'C*C* %REPLACE con 4 parámetros para añadir texto de prefijo alC* principio:C EVAL result = %REPLACE('Somewhere else: ':C result: 1: 0)C* result = 'Somewhere else: Ontario, California -03'

Figura 140. Ejemplo de %REPLACE (Pieza 2 de 2)

336 VisualAge RPG Consulta del lenguaje

Page 359: RPG Referencia

%SCAN (Explorar caracteres)%SCAN(argumento de búsqueda : serie de origen {: inicio})

%SCAN devuelve la primera posición del argumento de búsqueda dentro de laserie de origen, o 0 si no se ha encontrado. Si se ha especificado la posición deinicio, la búsqueda empieza a partir de la posición de inicio. El resultado siemprees la posición dentro de la serie de origen, incluso si se especifica la posición deinicio. El valor por omisión de la posición de inicio es 1.

El primer parámetro debe ser de tipo carácter, gráfico o UCS-2. El segundoparámetro debe ser del mismo tipo que el primer parámetro. El tercer parámetro,si se especifica, debe ser numérico con cero posiciones decimales.

Si algún parámetro es de longitud variable, los valores de los restantes parámetrosse cotejarán con la longitud actual y no con la longitud máxima.

El tipo del valor de retorno es entero sin signo. Esta función incorporada se puedeutilizar en cualquier lugar en que una expresión de entero sin signo sea válida.

Nota: A diferencia del código de operación SCAN, %SCAN no puede devolveruna matriz que contenga todas las apariciones de la serie de búsqueda y suresultado no puede comprobarse con la función incorporada %FOUND.

%SETATR (Establecer atributo)%SETATR(nombre_ventana:nombre_componente:nombre_atributo)

%SETATR establece el valor de atributo de un componente de una ventana. Tantoel primero como el segundo parámetro pueden ser %WINDOW o %PART.

Notas:

1. La función incorporada %SETATR no afecta a los campos del programacorrespondientes a los componentes. Para asegurar que el valor de atributo y elvalor del campo del programa sean iguales, utilice el campo del programa paradefinir el valor del atributo. Esto se aplica a los atributos que tienen campos deprograma correlacionados, como los campos de entrada con el atributo TEXT.

2. La función incorporada %SETATR no soporta valores enteros con signo y sinsigno de 1 y 8 bytes ni valores Unicode.

D source S 15A inz('Dr. Doolittle')D pos S 5U 0

C EVAL pos = %scan('oo' : source)C* Después de EVAL, pos = 6 puesto que 'oo' empieza en la posición 6C* 'Dr. Doolittle'.C EVAL pos = %scan('D' : source : 2)C* Después de EVAL, pos = 5 puesto que la primera 'D' localizada a partir deC* la posición 2 está en la posición 5.C EVAL pos = %scan('abc' : source)C* Después de EVAL, pos = 0 puesto que no se ha encontrado 'abc'C* 'Dr. Doolittle'.C EVAL pos = %scan('Dr.' : source : 2)C* Después de EVAL, pos = 0 puesto que no se ha encontrado 'Dr.'C* en 'Dr. Doolittle', si la búsqueda empieza a partir de la posición 2.

Figura 141. Ejemplo de %SCAN

Capítulo 23. Funciones incorporadas 337

Page 360: RPG Referencia

%SIZE (Tamaño de constante o campo)%SIZE(variable)%SIZE(literal)%SIZE(matriz{:*ALL})%SIZE(tabla{:*ALL})%SIZE(estructura de datos de múltiples apariciones{:*ALL})

%SIZE devuelve el número de bytes que ocupa la constante o el campo. Elargumento puede ser un literal, una constante con nombre, un subcampo deestructura de datos, un campo, una matriz o un nombre de tabla. No puede, sinembargo, contener una expresión. El valor devuelto tiene el formato entero sinsigno (tipo U).

En el caso de un literal gráfico, el tamaño es el número de bytes que ocupan loscaracteres gráficos. Para un literal hexadecimal o UCS-2, el tamaño devuelto es lamitad del número de dígitos hexadecimales del literal.

En el caso de los campos de longitud variable, %SIZE devuelve el número total debytes que ocupa el campo (dos bytes más que la longitud máxima declarada).

Si el argumento es un nombre de matriz, de tabla o de estructura de de datos demúltiples apariciones, el valor que se devuelve es el tamaño de un elemento oaparición. Si se especifica *ALL como segundo parámetro de %SIZE, el valor quese devuelve es el almacenamiento que ocupan todos los elementos o apariciones.Con una estructura de datos de múltiples apariciones que contiene subcampos depuntero, el tamaño puede ser mayor que el resultado de multiplicar el de unaaparición por el número de apariciones. Esto se debe que el sistema precisa que lospunteros se coloquen el el almacenamiento en direcciones divisibles por 16. Ellosignifica que la longitud de cada aparición puede haberse aumentado para que seaun múltiplo exacto de 16 con el objetivo de que los subcampos de puntero secoloquen correctamente en el almacenamiento de cada aparición.

%SIZE se puede especificar en cualquier posición de la especificación de definiciónen la que se permita una constante numérica y en una expresión en el campo delfactor 2 ampliado de la especificación de cálculo.

CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....Comments++++++CSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++++++Comments++++++

EVAL ENT0000B = *BLANKSEVAL %setatr('inventory':'ent0000b':'text') = ENT0000B

Figura 142. Ejemplo de %SETATR

338 VisualAge RPG Consulta del lenguaje

Page 361: RPG Referencia

%STATUS (Devolver estado de archivo o de programa)%STATUS{(archivo)}

%STATUS devuelve el valor más reciente establecido para el estado de archivo ode programa. %STATUS se establece cada vez que cambia el estado del programa ocualquier estado de archivo, normalmente al producirse un error.

Si se utiliza %STATUS sin el parámetro opcional de nombre de archivo, devuelveel estado del último programa o archivo que se ha cambiado. Si se ha especificadoun archivo, se devuelve el valor contenido en el campo INFDS *STATUS delarchivo especificado. No es necesario que se haya especificado INFDS para elarchivo.

%STATUS empieza con un valor de retorno de 00000 y se restablece a 00000 antesde que comience cualquier operación con el ampliador ’E’ especificado.

El mejor momento para comprobar %STATUS es inmediatamente después de unaoperación con el ampliador ’E’ o un indicador de error especificado, o bien alprincipio de INFSR o la subrutina *PSSR.

DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++DD arr1 S 10 DIM(4)D table1 S 5 DIM(20)D field1 S 10D field2 S 9B 0D field3 S 5P 2D mds DS 20 occurs(10)D mds_size C const (%size (mds: *all))D mds_ptr DS 20 OCCURS(10)D pointer *DD vCity S 40A VARYING INZ('North York')D fCity S 40A INZ('North York')CSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++++C ResultC eval num = %SIZE(field1) 10C eval num = %SIZE('HH') 2C eval num = %SIZE(123.4) 4C eval num = %SIZE(-03.00) 4C eval num = %SIZE(arr1) 10C eval num = %SIZE(arr1:*ALL) 40C eval num = %SIZE(table1) 5C eval num = %SIZE(table1:*ALL) 100C eval num = %SIZE(mds) 20C eval num = %SIZE(mds:*ALL) 200C EVAL num = %SIZE(mds_ptr) 20C EVAL num = %SIZE(mds_ptr:*ALL) 320C eval num = %SIZE(field2) 4C eval num = %SIZE(field3) 3C eval n1 = %SIZE(vCity) 42C EVAL n2 = %SIZE(fCity) 40

Figura 143. Ejemplo de %SIZE

Capítulo 23. Funciones incorporadas 339

Page 362: RPG Referencia

*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C* El ampliador 'E' indica que si se produce un error, ésteC* debe manejarse como si se hubiese codificado un indicador de error.C* El éxito de la operación puede comprobarse utilizando laC* función incorporada %ERROR. El estado asociado con el errorC* puede comprobarse con la función incorporada %STATUS.C EXFMT(E) INFILEC IF %ERRORC EXSR CheckErrorC ENDIFC ...C*-------------------------------------------------------------------C* CheckError: Subrutina para procesar un error de E/S de archivoC*-------------------------------------------------------------------C CheckError BEGSRC SELECT

C WHEN %STATUS < 01000C* No se ha producido ningún error

C WHEN %STATUS = 01211C* Se ha intentado leer un archivo que no está abiertoC EXSR InternalError

C OTHERC* Se ha producido un error de otra índoleC EXSR FileError

C ENDSL

C ENDSR

Figura 144. %STATUS y %ERROR con el ampliador ’E’

340 VisualAge RPG Consulta del lenguaje

Page 363: RPG Referencia

%STR (Obtener o almacenar serie con terminación de nulo)%STR(puntero de base{: long.máx})(lado derecho)%STR(puntero de base : long.máx)(lado izquierdo)

%STR se utiliza para crear o utilizar series de caracteres con terminación de nulo,que se utilizan comúnmente en aplicaciones C y C++.

El primer parámetro debe ser una variable basada en puntero. El segundoparámetro, si se especifica, debe ser un valor numérico con cero posicionesdecimales. Si no se especifica, toma el valor por omisión de 65535.

El primer parámetro debe señalar al almacenamiento que sea como mínimo de lamisma longitud que la que proporciona el segundo parámetro.

DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords++++++++++++++++++++++++++D Zero S 5P 0 INZ(0)CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C* %STATUS empieza con un valor de 0C*C* La operación SCAN siguiente provocará una bifurcación a *PSSRC* porque la posición inicial tiene un valor de 0.C 'A' SCAN 'ABC':Zero PosC BAD_SCAN TAG

C* La operación EXFMT siguiente tiene un ampliador 'E', por lo queC* se establecerá %STATUS a 0 antes de que empiece la operación.C* Así pues, es válido comprobar %STATUS después de la operación.C* Dado que se ha codificado el ampliador 'E', también se puedeC* utilizar %ERROR para comprobar si se ha producido un error.C READ(E) REC1C IF %ERRORC SELECTC WHEN %STATUS = 01211C ...C WHEN %STATUS = 01299C ...C* La operación SCAN siguiente tiene un indicador de error. No seC* establecerá %STATUS a 0 antes de que empiece la operación, pero esC* razonable comprobar %STATUS si el indicador de error está activado.C 'A' SCAN 'ABC':Zero Pos 10C IF *IN10 AND %STATUS = 00100C ...

C* La operación SCAN siguiente no produce ningún error.C* Dado que no hay ningún ampliador 'E', no se establecerá %STATUSC* a 0, con lo que devolvería un valor de 00100 del error anterior.C* Por lo tanto, no es aconsejable utilizar %STATUS después de unaC* operación que no tiene codificado ningún indicador de error niC* el ampliador 'E', ya que no se puede estar seguro de que el valorC* pertenezca a la operación anterior.C 'A' SCAN 'ABC' PosC ...C *PSSR BEGSRC* Se puede utilizar %STATUS en *PSSR, ya que debe haberse producido un error.C IF %STATUS = 00100C GOTO BAD_SCANC ...

Figura 145. %STATUS y %ERROR con el ampliador ’E’, indicador de error y *PSSR

Capítulo 23. Funciones incorporadas 341

Page 364: RPG Referencia

Condiciones de error:1. Si el parámetro de longitud no se encuentra entre 1 y 65535, se producirá un

error con el estado 00100.2. Si no se establece el puntero, se producirá un error con el código de estado

00222.3. Si el almacenamiento que indica el puntero es menor que el que indica el

parámetro de longitud:a. Se puede producir un error con el código de estado 00222b. Pueden dañarse los datos

%STR (lado derecho)

Cuando se utiliza a la derecha de una expresión, esta función devuelve los datos alos que señala el primer parámetro, pero sin incluir el primer carácter nulo (x’00’)hallado en la longitud especificada. Esta función incorporada se puede utilizar encualquier lugar en que la expresión de caracteres sea válida. Durante el tiempo deejecución no se proporcionará ningún error si el terminador de nulo no seencuentra dentro de la longitud especificada. En este caso, el valor de resultadotiene la misma longitud que la longitud especificada.

Lo siguiente es un ejemplo de %STR con el segundo parámetro especificado.

En este ejemplo, se ha encontrado el terminador de nulo dentro de la longitudmáxima especificada.

%STR (lado izquierdo)

Cuando se utiliza en el lado izquierdo de una expresión, %STR(ptr:longitud)asigna el valor del lado derecho de la expresión al almacenamiento hacia el que

D String1 S *D Fld1 S 10AC EVAL Fld1 = '<' + %str(String1) + '>'C* Suponiendo que String1 señala a '123|' en donde '|' representa elC* carácter nulo, después de EVAL, Fld1 = '<123> '.

Figura 146. Ejemplo 1 de %STR (lado derecho)

D String1 S *D Fld1 S 10AC EVAL Fld1 = '<' + %str(String1 : 2) + '>'C* Suponiendo que String1 señala a '123|' en donde '|' representa elC* carácter nulo, después de EVAL, Fld1 = '<12> '.C* Puesto que longitud máxima de lectura de la operación ha sido 2,C* no se han tenido en cuenta ni el '3' ni '|'.

Figura 147. Ejemplo 2 de %STR (lado derecho)

D String1 S *D Fld1 S 10AC EVAL Fld1 = '<' + %str(String1 : 5) + '>'C* Suponiendo que String1 señala a '123|' en donde '|' representa elC* carácter nulo, después de EVAL, Fld1 = '<123> '.C* Puesto que la longitud máxima de lectura de la operación ha sido 5,C* se ha encontrado el terminador de nulo de la posición 4, por lo queC* se han utilizado todos los datos hasta el terminador de nulo.

Figura 148. Ejemplo 3 de %STR (lado derecho)

342 VisualAge RPG Consulta del lenguaje

Page 365: RPG Referencia

señala el puntero, añadiendo un byte con terminación de nulo situado al final. Lalongitud máxima que se puede especificar es 65535. Esto significa que comomáximo se pueden utilizar 65534 bytes del lado derecho, puesto que se debereservar un byte para el terminador de nulo situado al final.

La longitud indica la cantidad de almacenamiento señalada por el puntero y debeser superior a la longitud máxima de la que dispondrá el lado derecho. Se debeestablecer el puntero para que señale hacia un almacenamiento como mínimo delmismo tamaño que la longitud del parámetro. Si la longitud del lado derecho de laexpresión es superior a la longitud especificada, el valor del lado derecho setruncará.

Nota: Si las dos siguientes son ciertas, los datos se dañarán:1. El parámetro de longitud es mayor que la longitud real de los datos que

direcciona el puntero.2. La longitud del lado derecho es mayor o igual que la longitud real de los

datos que direcciona el puntero.

Si asigna de modo dinámico el almacenamiento para que lo utilice %STR,debe hacer un seguimiento de la longitud que ha asignado.

%SUBST (Devolver una serie)%SUBST(serie:inicio{:longitud})

%SUBST devuelve una parte de un argumento serie. También se puede utilizarcomo resultado de una asignación con el código de operación EVAL.

El parámetro inicio representa la posición inicial de la subserie.

El parámetro longitud representa la longitud de la subserie. Si no se especifica,será la longitud del parámetro serie menos el valor inicial más uno.

La serie debe ser de datos de tipo carácter, gráfico o UCS-2. La posición inicial y lalongitud pueden ser una expresión o valor numérico sin posiciones decimales. Laposición inicial debe ser mayor que cero. La longitud debe ser mayor o igual acero.

Si el parámetro de serie es de longitud variable, los valores de los restantesparámetros se cotejarán con la longitud actual y no con la longitud máxima.

D String1 S *D Fld1 S 10A...C EVAL %str(String1: 25) = 'abcdef'C* El almacenamiento hacia el que señala String1 ahora contiene 'abcdef|'C* Los bytes 8-25 a continuación del terminador de nulo no han cambiado.D String1 S *D Fld1 S 10A...C EVAL %str(String1 : 4) = 'abcdef'C* El almacenamiento hacia el que señala String1 ahora contiene 'abc|'

Figura 149. Ejemplos de %STR (lado izquierdo)

Capítulo 23. Funciones incorporadas 343

Page 366: RPG Referencia

Cuando se especifican como parámetros de una palabra clave de especificación dedefinición, deben ser literales o constantes con nombre que representen a literales.Cuando se especifican en una especificación de cálculo de formato libre, puede sercualquier expresión.

%SUBST Utilizado para su valor%SUBST devuelve una subserie de la serie especificada. Esta serie puede ser unaexpresión o un campo de caracteres, gráficos o UCS-2. Se pueden utilizar matricesno indexadas como serie, inicio y longitud. La subserie comienza en la posicióninicial especificada de la serie y tiene la longitud indicada. Si la longitud no seespecifica, la subserie continúa hasta el final de la serie. Por ejemplo:El valor de %subst('Adiós amigo': 5+2) es 'amigo'El valor de %subst('Adiós amigo':5+2:10-7) es 'ami'El valor de %subst('abcd' + 'efgh':4:3) es 'def'

En los caracteres gráficos o UCS-2, la posición inicial y la longitud es coherente conla longitud de caracteres de doble byte (la posición 3 es el tercer carácter de doblebyte y la longitud 3 indica 3 caracteres de doble byte sobre los que se realizará laoperación).

%SUBST Utilizado como resultado de una asignaciónCuando se utiliza como resultado de una asignación, esta función incorporada hacereferencia a determinadas posiciones del argumento serie. No se pueden utilizarmatrices no indexadas como inicio o como longitud.

El resultado comienza en la posición inicial especificada de la variable y tiene lalongitud que se indica. Si no se especifica la longitud o ésta hace referencia acaracteres situados después del final de la serie, se utiliza el final de la serie.

Cuando %SUBST se utiliza como el resultado de una asignación, el primerparámetro debe hacer referencia a una ubicación de almacenamiento. Es decir, elprimer parámetro de la operación %SUBST debe ser uno de los siguientes:v Campov Estructura de datosv Subcampo de estructura de datosv Nombre de matrizv Elemento de matrizv Elemento de tabla

Se permite utilizar expresiones válidas como segundo y tercer parámetros de%SUBST si ésta aparece como resultado de una asignación con una operaciónEVAL.

344 VisualAge RPG Consulta del lenguaje

Page 367: RPG Referencia

%TRIM (Eliminar blancos iniciales y de cola)%TRIM(serie)

%TRIM devuelve la serie dada sin los blancos iniciales ni de cola.

La serie puede tener datos de tipo carácter, gráficos o UCS-2.

Cuando se especifica como parámetro de una palabra clave de especificación dedefinición, el parámetro serie debe ser una constante.

%TRIML (Eliminar blancos iniciales)%TRIML(serie)

%TRIML devuelve la serie dada sin los blancos iniciales.

La serie puede tener datos de tipo carácter, gráficos o UCS-2.

Cuando se especifica como parámetro de una palabra clave de especificación dedefinición, el parámetro serie debe ser una constante.

CSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++++C*C* En este ejemplo, CITY contiene "Toronto, Ontario"C* %SUBST devuelve el valor 'Ontario'.C*C ' ' SCAN CITY CC IF %SUBST(CITY:C+1) = 'Ontario'C EVAL CITYCNT = CITYCNT+1C ENDIFC*C* Antes de EVAL, A tiene el valor "abcdefghijklmno".C* Después de EVAL, A tiene el valor "ab****ghijklmno"C*C EVAL %SUBST(A:3:4) = '****'

Figura 150. Ejemplo de %SUBST

DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++DD LOCATION S 16ACSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq..CSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++++C*C* LOCATION tendrá el valor "Toronto, Ontario".C*C EVAL LOCATION = %TRIM(' Toronto, Ontario ')C*C* NAME tendrá el valor "Chris Smith".C*C MOVE(P) 'Chris' FIRSTNAME 10C MOVE(P) 'Smith' LASTNAME 10C EVAL NAME =C %TRIM(FIRSTNAME) +' '+ %TRIM(LASTNAME)

Figura 151. Ejemplo de %TRIM

Capítulo 23. Funciones incorporadas 345

Page 368: RPG Referencia

%TRIMR (Eliminar blancos de cola)%TRIMR(serie)

%TRIMR devuelve la serie dada sin los blancos de cola.

La serie puede tener datos de tipo carácter, gráficos o UCS-2.

Cuando se especifica como parámetro de una palabra clave de especificación dedefinición, el parámetro serie debe ser una constante.

%UCS2 (Convertir a valor UCS-2)%UCS2(char-expr | graph-expr)

%UCS2 convierte el valor de la expresión de tipo carácter o gráfico y devuelve unvalor UCS-2. El resultado tendrá una longitud variable si el parámetro tiene unalongitud variable o si el parámetro es un carácter de un solo byte.

El segundo parámetro, ccsid, es opcional e indica el CCSID de la expresiónresultante. El CCSID toma por omisión el valor de 13488.

Si el parámetro es una constante, la conversión se efectuará en tiempo decompilación.

Si la conversión provoca caracteres de sustitución, se emite un mensaje de aviso entiempo de compilación. En tiempo de ejecución, se establece el estado 00050 y nose emite ningún mensaje de error.

CSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++++C*C* LOCATION tendrá el valor "Toronto, Ontario".C*C EVAL LOCATION = %TRIML(' Toronto, Ontario ')

Figura 152. Ejemplo de %TRIML

DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++DD LOCATION S 18ACSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq..CSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++++C*C* LOCATION tendrá el valor "Toronto, Ontario".C*C EVAL LOCATION = %TRIMR(' Toronto, Ontario ')C*C* NAME tendrá el valor "Chris Smith".C*C MOVEL(P) 'Chris' FIRSTNAME 10C MOVEL(P) 'Smith' LASTNAME 10C EVAL NAME =C %TRIMR(FIRSTNAME) +' '+ %TRIMR(LASTNAME)

Figura 153. Ejemplo de %TRIMR

346 VisualAge RPG Consulta del lenguaje

Page 369: RPG Referencia

%UNS (Convertir en formato sin signo)%UNS(expresión numérica)

%UNS convierte el valor de la expresión numérica en formato sin signo. Todos losdígitos decimales se truncan. %UNS se puede utilizar para truncar las posicionesdecimales de un valor flotante o decimal, permitiendo que se puedan utilizar comoun índice de matriz.

HKeywords++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++H CCSID(*UCS2 : 13488)DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++D char S 5A INZ('abcde')D graph S 2G INZ(G'oAABBi')* Se utiliza la función %UCS2 incorporada para inicializar un campo UCS-2.

D ufield S 10C INZ(%UCS2('abcdefghij'))D ufield2 S 1C CCSID(61952) INZ(*LOVAL)D isLess 1ND proc PRD uparm 2G CCSID(13488) CONSTCSRN01Factor1+++++++Opcode&ExtExtended-factor2+++++++++++++++++++++++++C EVAL ufield = %UCS2(char) + %UCS2(graph)* ufield ahora tiene 7 caracteres UCS-2 que representan* 'a.b.c.d.e.AABB' donde 'x.' representa la forma UCS-2 de 'x'

C EVAL isLess = ufield < %UCS2(ufield2:13488)* El resultado de la función incorporada %UCS2 es el valor de* ufield2, convertido de CCSID 61952 a CCSID 13488* a efectos de la comparación.

C EVAL ufield = ufield2* El valor de ufield2 se convierte de CCSID 61952 a* CCSID 13488 y se almacena en ufield.* Esta conversión la maneja implícitamente el compilador.

C CALLP proc(ufield2)* El valor de ufield2 se convierte a CCSID 13488* de forma implícita, como parte del paso del parámetro* por referencia a constante.

Figura 154. Ejemplos de %UCS2

Capítulo 23. Funciones incorporadas 347

Page 370: RPG Referencia

%UNSH (Convertir en formato sin signo con redondeo)%UNSH(expresión numérica)

%UNSH es igual a %UNS, excepto si la expresión numérica es un valor decimal oflotante, en cuyo caso se aplica el redondeo al valor de la expresión numérica alefectuar la conversión al tipo sin signo. Si no se puede llevar a cabo el redondeo,no se emite ningún mensaje.

%XFOOT (Sumar elementos de expresión de matriz)%XFOOT(expresión de matriz)

%XFOOT realiza la suma de todos los elementos de la expresión de matriznumérica especificada.

DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++D p7 s 7p 3 inz (8236.567)D s9 s 9s 5 inz (23.73442)D f8 s 8f inz (173.789)D result1 s 15p 5D result2 s 15p 5D result3 s 15p 5D array s 1a dim (200)D a s 1aCSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++C eval result1 = %uns (p7) + 0.1234C eval result2 = %uns (s9)C eval result3 = %unsh (f8)C* El valor de "result1" ahora es 8236.12340.C* El valor de "result2" ahora es 23.00000C* El valor de "result3" ahora es 174.00000.C eval a = array (%unsh (f8))C* %UNS y %UNSH se pueden utilizar como índices de matriz

Figura 155. Ejemplo de %UNS y %UNSH

DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++D p7 s 7p 3 inz (8236.567)D s9 s 9s 5 inz (23.73442)D f8 s 8f inz (173.789)D result1 s 15p 5D result2 s 15p 5D result3 s 15p 5D array s 1a dim (200)D a s 1aCSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++C eval result1 = %uns (p7) + 0.1234C eval result2 = %uns (s9)C eval result3 = %unsh (f8)C* El valor de "result1" ahora es 8236.12340.C* El valor de "result2" ahora es 23.00000C* El valor de "result3" ahora es 174.00000.C eval a = array (%unsh (f8))C* %UNS y %UNSH se pueden utilizar como índices de matriz

Figura 156. Ejemplo de %UNS y %UNSH

348 VisualAge RPG Consulta del lenguaje

Page 371: RPG Referencia

La precisión del resultado es la mínima que pueda alojar el resultado de la sumade todos los elementos de la matriz, hasta un máximo de 30 dígitos. El número delugares decimales del resultado es siempre el mismo que el de la expresión dematriz.

Por ejemplo, si ARR es una matriz de 500 elementos de precisión (17, 4), elresultado de %XFOOT(ARR) será (20,4).

Para %XFOOT(X), donde X tiene una precisión de (m, n), la siguiente tablamuestra la precisión del resultado basándose en el número de elementos de X:Elementos de X Precisión de %XFOOT(X)1 (m,n)2-10 (m+1,n)11-100 (m+2,n)101-1000 (m+3,n)1001-10000 (m+4,n)10001-32767 (m+5,n)

Son aplicables las reglas normales para las expresiones de matriz. Por ejemplo, siARR1 tiene 10 elementos y ARR2 tiene 20 elementos, %XFOOT(ARR1+ARR2) serála suma de los primeros 10 elementos de ARR1+ARR2.

Esta función incorporada es similar a la operación XFOOT, excepto en que lasmatrices flotantes se suman del mismo modo que todos los restantes tipos,empezando en el índice 1 y siguientes.

Capítulo 23. Funciones incorporadas 349

Page 372: RPG Referencia

350 VisualAge RPG Consulta del lenguaje

Page 373: RPG Referencia

Capítulo 24. Expresiones

Las expresiones son un modo de expresar la lógica del programa utilizandosintaxis sin formato. Se pueden utilizar para escribir sentencias de programa demanera más concisa que si se utilizan las sentencias de formato fijo.

Las expresiones son simplemente grupos de operandos y operaciones, como lassiguientes:A + B * CSERIEA + SERIECD = %ELEM(ARRAYNAME)

Las expresiones se codifican en la entrada 2 del factor ampliado de laespecificación de cálculo. Se pueden codificar en las sentencias siguientes:v “CALLP (Llamar a un procedimiento o programa con prototipo)” en la

página 408v “DOU (Hacer hasta)” en la página 435v “DOW (Hacer mientras)” en la página 438v “EVAL (Evaluar expresión)” en la página 446v “EVALR (Evaluar expresión, ajuste por la derecha)” en la página 447v “FOR (Para)” en la página 453v “IF (Si)” en la página 457v “RETURN (Volver al llamador)” en la página 525v “WHEN (Seleccionar cuando sea verdadero)” en la página 558

Operadores de expresiónLos operadores de expresión pueden ser cualquiera de los siguientes:

Operaciones unitariasLas operaciones unitarias se codifican especificando la operación seguidade un operando. Son las siguientes:

+ La operación más unitaria mantiene el valor del operandonumérico.

− La operación menos unitaria niega el valor del operando numérico.

NOT La negación lógica devuelve ’1’ si el valor del operando de tipoindicador es ’0’ y ’0’ si el operando de tipo indicador es ’1’. Sedebe tener en cuenta que el resultado de cualquier operación decomparación u operación AND u OR es un valor de tipoindicador.

Operaciones binariasLas operaciones binarias se codifican especificando la operación entreambos operandos. Son las siguientes:

+ El significado de esta operación depende de los tipos deoperandos. Se puede utilizar para:v La adición de dos valores numéricosv La concatenación de dos valores de carácter, gráficos o UCS-2v La adición de un desplazamiento numérico a un puntero de base

− El significado de esta operación depende de los tipos deoperandos. Se puede utilizar para:

© Copyright IBM Corp. 1994, 2000 351

Page 374: RPG Referencia

v Restar dos valores numéricosv Restar un desplazamiento numérico de un puntero de basev Restar dos punteros

* La operación de multiplicación se utiliza para multiplicar dosvalores numéricos.

/ La operación de división se utiliza para dividir dos valoresnuméricos.

** La operación exponencial se utiliza para elevar un número a lapotencia de otro.

= La operación de igualdad devuelve ’1’ si ambos operandos soniguales y ’0’ en el caso contrario.

<> La operación de desigualdad devuelve ’0’ si ambos operandos soniguales y ’1’ en el caso contrario.

> La operación de signo mayor que devuelve ’1’ si el primeroperando es mayor que el segundo.

>= La operación de signo mayor que o igual a devuelve ’1’ si elprimer operando es mayor o igual que el segundo.

< La operación de signo menor que devuelve ’1’ si el primeroperando es menor que el segundo.

<= (menor que o igual aLa operación menor que o igual a devuelve ’1’ si el primeroperando es menor que o igual al segundo.

AND La operación AND lógica devuelve ’1’ si ambos operandos tienenel valor de indicador ’1’.

OR La operación lógica or devuelve ’1’ si uno de los operandos tiene elvalor de indicador ’1’.

Funciones incorporadasLas funciones incorporadas se tratan en el “Capítulo 23. Funcionesincorporadas” en la página 309.

Funciones definidas por el usuarioEn una expresión se puede utilizar cualquier procedimiento para el que sehaya establecido un prototipo que devuelva un valor. La llamada alprocedimiento se puede situar en cualquier lugar donde se pueda utilizarun valor del mismo tipo que el valor de retorno del procedimiento. Porejemplo, supongamos que el procedimiento MYFUNC devuelve un valorde tipo carácter. El ejemplo siguiente muestra tres llamadas a MYFUNC:

Prioridad de las operacionesLas reglas de prioridad indican el orden en que se efectúan las operaciones de lasexpresiones. Las operaciones cuya prioridad es mayor se efectúan antes que lasoperaciones de prioridad inferior.

Puesto que los paréntesis tiene la prioridad más alta, en primer lugar se realizanlas operaciones que están entre paréntesis.

C IF MYFUNC(string1) = %TRIM(MYFUNC(string2))C EVAL %subst(X: 3) = MYFUNC('abc')C ENDIF

352 VisualAge RPG Consulta del lenguaje

Page 375: RPG Referencia

Las operaciones de la misma prioridad se evalúan por orden de izquierda aderecha, excepto para **, que se evalúa de derecha a izquierda.

Se debe tener en cuenta que, aunque una expresión se evalúa de izquierda aderecha, no significa que los operandos también se evalúen de izquierda a derecha.Vea “Orden de evaluación” en la página 365, donde obtendrá más informaciónacerca de las consideraciones adicionales.

En esta lista se indica la prioridad de los operadores de mayor a menor:1. ()2. funciones incorporadas3. + unitario, − unitario, NOT4. **5. *,/6. + binario, − binario7. =,>=,>,<=,<,<>8. AND9. OR

El ejemplo siguiente muestra cómo funciona la prioridad.

Operandos de expresiónUn operando puede ser cualquier nombre de campo, constante con nombre, literalo procedimiento con prototipo que devuelva un valor. Además, también se puedeutilizar el resultado de cualquier operación como un operando para otra operación.Por ejemplo, en la expresión A+B*21, el resultado de B*21 es un operando para laoperación de suma.

En las expresiones se permiten todos los tipos de datos. Sin embargo, lasoperaciones específicas únicamente ofrecen soporte para tipos de datosdeterminados como operandos. Por ejemplo, la operación * sólo permite valoresnuméricos como operandos. Se debe tener en cuenta que las operacionesrelacionales y lógicas devuelven un valor de tipo indicador, que es un tipo especialde datos de caracteres. Por este motivo, cualquier resultado relacional o lógico sepuede utilizar como operando para cualquier operación en espera de operandos detipo carácter.

*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....CSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++++C*C* Las dos operaciones siguientes generan resultados distintosC* aunque el orden de los operandos y los operadores esC* el mismo. Si PRECIO = 100, DESCUENT = 10 yC* TIPO = 0,15, el resultado de la primera operación EVALC* será IMP = 98,5. Puesto que la multiplicación tiene prioridadC* sobre la resta, DESCUENT * TIPO es la primera operaciónC* que se efectúa. El resultado de la misma (1,5) se restaC* de PRECIO.C*C* La segunda operación EVAL daría como resultado IMP = 13,50.C* Como los paréntesis tienen la prioridad más alta, en primerC* lugar se realiza la operación entre paréntesis y el resultadoC* de la misma (90) se multiplica por TIPO.C*C EVAL IMP = PRECIO - DESCUENT * TIPOC EVAL IMP = (PRECIO - DESCUENT) * TIPO

Figura 157. Ejemplos de expresiones

Capítulo 24. Expresiones 353

Page 376: RPG Referencia

Las tablas siguientes resumen los tipos de datos soportados por los operandos deexpresión.v En la Tabla 34 se describe el tipo de operando permitido para cada operador

unitario y el tipo de resultadov En la Tabla 35 se describe el tipo de operandos permitido para cada operador

binario y el tipo de resultadov En la Tabla 36 en la página 355 se describe el tipo de operandos permitido para

cada función incorporada y el tipo de resultado. Los procedimientos para losque se ha establecido un prototipo ofrecen soporte para todos los tipos de datosdefinidos en la definición del prototipo.

Tabla 34. Tipos soportados para las operaciones unitarias

Operación Tipo de operando Tipo de resultado

− (negación) Numérico Numérico

+ Numérico Numérico

NOT Indicador Indicador

Tabla 35. Operandos soportados para las operaciones binarias

Operador Tipo de operando 1 Tipo de operando 2 Tipo de resultado

+ (suma) Numérico Numérico Numérico

− (resta) Numérico Numérico Numérico

* (multiplicación) Numérico Numérico Numérico

/ (división) Numérico Numérico Numérico

** (exponencial) Numérico Numérico Numérico

+ (concatenación) Carácter Carácter Carácter

+ (concatenación) Gráfico Gráfico Gráfico

+ (concatenación) UCS-2 UCS-2 UCS-2

+ (añadirdesplazamientodesde el puntero)

Puntero de base Numérico Puntero de base

- (restar punteros) Puntero de base Puntero de base Numérico

- (restardesplazamiento alpuntero)

Puntero de base Numérico Puntero de base

Nota: Para las operaciones siguientes, los operandos pueden ser de cualquier tipo, peroambos deben ser del mismo tipo.

= (igual a) Cualquiera Cualquiera Indicador

>= (mayor que oigual a)

Cualquiera Cualquiera Indicador

> (mayor que) Cualquiera Cualquiera Indicador

<= (menor que oigual a)

Cualquiera Cualquiera Indicador

< (menor que) Cualquiera Cualquiera Indicador

<> (no igual a) Cualquiera Cualquiera Indicador

AND (y lógico) Indicador Indicador Indicador

OR (o lógico) Indicador Indicador Indicador

354 VisualAge RPG Consulta del lenguaje

Page 377: RPG Referencia

Tabla 36. Tipos soportados para las funciones incorporadas

Operación Operandos Tipo de resultado

%ABS Numérico Numérico

%CHAR Gráfico, numérico, UCS-2, fecha, hora oindicación de la hora

Carácter

%DEC Numérico {: constante numérica : constantenumérica}

Numérico (empaquetado)

%DECH Numérico : constante numérica : constantenumérica

Numérico (empaquetado)

%DECPOS Numérico Numérico (sin signo)

%DIV Numérico: Numérico Numérico

%EDITC Numérico no flotante : constante de tipocarácter de longitud 1 {: *CURSYM |*ASTFILL | símbolo de moneda de tipocarácter}

Carácter (de longitud fija)

%EDITFLT Numérico Carácter (de longitud fija)

%EDITW Numérico no flotante : constante de tipocarácter

Carácter (de longitud fija)

%EOF {Archivo} Indicador

%EQUAL {Archivo} Indicador

%ERROR Indicador

%FLOAT Numérico Numérico (flotante)

%FOUND {Archivo} Indicador

%GETATR Carácter : carácter : carácter Cualquier tipo exceptoPuntero

%GRAPH Carácter, gráfico o UCS-2 {: ccsid} Gráfico

%INT Numérico Numérico (entero)

%INTH Numérico Numérico (entero)

%LEN Cualquiera Numérico (sin signo)

%OPEN Nombre de archivo Indicador

%REM Numérico: Numérico Numérico

%REPLACE Carácter : carácter {: numérico {: numérico}} Carácter

%REPLACE Gráfico : gráfico {: numérico {: numérico}} Gráfico

%REPLACE UCS-2 : UCS-2 {: numérico {: numérico}} UCS-2

%SCAN Carácter : carácter {: numérico} Numérico (sin signo)

%SCAN Gráfico : gráfico {: Numérico} Numérico (sin signo)

%SCAN UCS-2 : UCS-2 {: numérico} Numérico (sin signo)

%SETATR Carácter : carácter : carácter

%STATUS {Archivo} Numérico (decimal conzona)

%STR Puntero de base {: numérico} Carácter

Nota: Cuando %STR aparece a la izquierda de una expresión, el segundo operando esobligatorio.

%SUBST Carácter : numérico {: numérico} Carácter

%SUBST Gráfico : numérico {: numérico} Gráfico

Capítulo 24. Expresiones 355

Page 378: RPG Referencia

Tabla 36. Tipos soportados para las funciones incorporadas (continuación)

Operación Operandos Tipo de resultado

%SUBST UCS-2 : numérico {: numérico} UCS-2

%TRIM Carácter Carácter

%TRIM Gráfico Gráfico

%TRIM UCS-2 UCS-2

%TRIML Carácter Carácter

%TRIML Gráfico Gráfico

%TRIML UCS-2 UCS-2

%TRIMR Carácter Carácter

%TRIMR Gráfico Gráfico

%TRIMR UCS-2 UCS-2

%UCS2 Carácter o gráfico{:ccsid} Valor UCS-2 de longitudvariable

%UNS Numérico Numérico (sin signo)

%UNSH Numérico Numérico (sin signo)

Nota: Para las funciones incorporadas siguientes, los argumentos pueden ser literales,constantes con nombre o variables.

%XFOOT Numérico Numérico

%PADDR Carácter Puntero de procedimiento

%SIZE Cualquiera {: *ALL} Numérico (sin signo)

Nota: Para las funciones incorporadas siguientes, los argumentos deben ser literales. Sinembargo, si se especifica un índice de matriz, puede ser cualquier expresión numérica.

%ADDR Cualquiera Puntero de base

%ELEM Cualquiera Numérico (sin signo)

%NULLIND Cualquiera Indicador

Reglas de las expresionesLas reglas generales siguientes se aplican a todas las expresiones:v Las expresiones se codifican en la entrada 2 del Factor ampliado de la

Especificación de cálculo.v Una expresión se pueden continuar en más de una especificación. En una

especificación de continuación, las únicas entradas permitidas son C en lacolumna 6 y la entrada Factor ampliado 2.No se necesita ningún carácter de continuación especial, a menos que laexpresión esté dividida dentro de un literal o de un nombre.

v Los espacios en blanco (como los paréntesis) sólo son necesarios para resolverambigüedades. No obstante, también se pueden utilizar para que los datos seanmás legibles. Tenga en cuenta que RPG leerá tantos caracteres como le seaposible al analizar cada elemento de una expresión. Por ejemplo,X**DAY es X elevado a la potencia de DAYX* *DAY es X multiplicado por *DAY

v La palabra clave TRUNCNBR de una especificación de control no se aplica a loscálculos realizados dentro de las expresiones. Si se produce un desbordamientoen el transcurso de una operación de expresión, se emite siempre una excepción.

356 VisualAge RPG Consulta del lenguaje

Page 379: RPG Referencia

En el ejemplo siguiente se muestra cómo se pueden utilizar las expresiones.

Formato de los resultados numéricos intermediosEn las operaciones binarias que involucran campos numéricos, el formato delresultado intermedio depende del formato de los operandos.

Para los operadores +, - y *:v Si por lo menos un operando tiene un formato flotante, el resultado tendrá un

formato flotante.v De lo contrario, si por lo menos un operando tiene un formato decimal

empaquetado, decimal con zona o binario, el resultado tendrá un formatodecimal empaquetado.

v De lo contrario, si ambos operandos tienen un formato entero o sin signo,entonces:

*...1....+....2....+....3....+....4....+....5....+....6....+....7...CSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++++C*C* Las operaciones del grupo DOU se repetirán hasta que laC* expresión lógica se cumpla. Es decir, hasta que COUNTER seaC* menor que MAXITEMS o hasta que el indicador 03 está activado.C*C DOU COUNTER < MAXITEMS OR *IN03C*C* Las operaciones controladas por la operación IF se efectuarán siC* DUEDATE (que es una variable de fecha) corresponde a una fechaC* anterior al 31 de diciembre de 1994.C*C IF DUEDATE < D'12-31-94'C*C* En esta expresión numérica, a COUNTER se le asigna el valor deC* COUNTER más 1.C*C EVAL COUNTER = COUNTER + 1C*C* Esta expresión numérica utiliza una función incorporada para asignarC* el número de elementos de la matriz ARRAY a la variableC* ARRAYSIZE.C*C EVAL ARRAYSIZE = %ELEM(ARRAY)C*C* Esta expresión calcula el interés y redondea el resultado,C* que se coloca en la variableINTEREST.C*C EVAL (H) INTEREST = BALANCE * RATEC*C* Esta expresión de caracteres crea una sentencia a partir de unC* nombre y un número concatenándolos. Ya que no puede concatenarseC* datos numéricos, debe utilizar %CHAR, %EDITC, %EDITW o %EDITFLTC* para convertirlos a datos de tipo carácter.C* No es necesario un carácter de continuación para continuar laC* expresión. El signo + final de la primera línea es un operadorC* de concatenación, no un carácter de continuación.C* Esta sentencia produce 'Id number for John Smith is 231 364'C EVAL STRING = 'Id number for ' +C %TRIMR(First) + ' '+ %TRIMR(Last)C + ' is ' + %EDITW(IdNum : ' & ')

Figura 158. Ejemplos de expresiones

Capítulo 24. Expresiones 357

Page 380: RPG Referencia

– si el operador es -, el resultado será un entero– de lo contrario, si ambos operandos son sin signo, el resultado será sin signo– de lo contrario, el resultado será un entero.

v Un literal numérico de 10 dígitos o menos y 0 posiciones decimales seconsiderará que tiene un formato entero o sin signo siempre que sea posible, enfunción de si es un número positivo o negativo.

Para el operador /:Si un operando es flotante, el resultado será flotante. De lo contrario, el resultadoserá un decimal empaquetado.

Para el operador **:El resultado se representa en formato flotante.

Rendimiento y aritmética de 8 bytesPor omisión, el compilador realiza una aritmética de 4 bytes. La aritmética de 8bytes sólo se produce si por lo menos un operando es un entero de 8 bytes. Desdeel punto de vista del rendimiento, la aritmética de 8 bytes es cara y debe evitarseen lo posible.

Reglas de precisión para operaciones numéricasA diferencia de los códigos de operaciones de formato fijo, en los que se debeespecificar siempre el resultado de cada operación individual, RPG debedeterminar el formato y la precisión del resultado de cada operación de unaexpresión.

Si el resultado de una operación es formato flotante, entero o sin signo, la precisiónes el tamaño máximo para dicho formato. Las operaciones de entero y sin signoproducen valores de 4 bytes y las operaciones flotantes producen valores de 8bytes.

Sin embargo, si la operación tiene un formato binario, de decimal con zona o dedecimal empaquetado, la precisión del resultado depende de las precisiones de losoperandos.

Es importante observar las reglas de precisión de las operaciones decimales, puestoque incluso una operación relativamente sencilla puede tener un resultadoinesperado. Por ejemplo, si los dos operandos de una multiplicación sonsuficientemente grandes, el resultado de la multiplicación tendrá cero posicionesdecimales. Si multiplica dos números de 20 dígitos, necesitará un resultado de 40dígitos para contener todos los resultados posibles de la multiplicación. Sinembargo, puesto que RPG únicamente ofrece soporte para valores numéricos dehasta 30 dígitos, el resultado se ajustará para 30 dígitos. En este caso, se eliminarán10 dígitos decimales del resultado.

Existen dos conjuntos de reglas de precisión que pueden utilizarse para controlar eltamaño de los valores intermedios:1. Las reglas por omisión proporcionan resultados intermedios con la máxima

extensión posible para minimizar la posibilidad de desbordamiento numérico.Desgraciadamente, en casos determinados puede producir resultados conposiciones decimales cero si el resultado es demasiado grande.

2. La regla de precisión de ″Posiciones decimales de resultado″ funciona delmismo modo que la regla por omisión, excepto si la sentencia implica unaasignación a una variable numérica o una conversión a una precisión decimal

358 VisualAge RPG Consulta del lenguaje

Page 381: RPG Referencia

específica, en cuyo caso, el número de posiciones decimales de cualquierresultado intermedio no se reduce nunca por debajo de las posicionesdecimales deseadas de resultado.En la práctica, no debe preocuparse acerca de las precisiones exactas si examinael listado de compilación al codificar expresiones numéricas. Un mensaje dediagnóstico indica que se van a eliminar posiciones decimales en un resultadointermedio. Si la expresión implica una asignación, puede asegurar que semantengan las posiciones decimales utilizando la regla de precisión de″Posiciones decimales de resultado″ para la sentencia mediante el ampliador decódigo de operación (R).Si no se puede utilizar la regla de precisión de ″Posiciones decimales deresultado″ (por ejemplo, en una expresión relacional), se puede usar la funciónincorporada %DEC para convertir el resultado de una subexpresión a unaprecisión menor, que puede evitar la pérdida de posiciones decimales.

Utilización de la regla de precisión por omisiónUtilizando la regla de precisión por omisión, se calcula la precisión de un valordecimal intermedio en una expresión para minimizar la posibilidad dedesbordamiento numérico. Sin embargo, si la expresión implica numerosasoperaciones de números decimales largos, los intermedios pueden finalizar concero posiciones decimales. (Especialmente, si la expresión tiene dos o másdivisiones anidadas.) Quizá no sea lo que espera el programador, en particular enuna asignación.

Al determinar la precisión de un valor decimal intermedio, se llevan a cabo dospasos:1. Se calcula la precisión deseada o ″natural″ del resultado.2. Si la precisión natural tiene más de 30 dígitos, se ajusta de modo que se adapte

a 30 dígitos. Normalmente en primer lugar implica reducir el número deposiciones decimales y, a continuación, si es necesario, reducir el número totalde dígitos del intermedio.

Este comportamiento es el tratamiento por omisión y se puede especificar para unmódulo completo (utilizando la palabra clave de especificación de controlEXPROPTS(*MAXDIGITS) o para expresiones individuales de formato libre(utilizando el ampliador de código de operación M).

Precisión de los resultados intermediosLa Tabla 37 describe con más detalle las reglas de precisión por omisión.

Tabla 37. Precisión de los resultados intermedios

Operación Precisión del resultado

Nota: Las operaciones siguientes generan un resultado numérico. Ln es la longitud deloperando en dígitos, siendo n una r para el resultado o bien un número que representa aloperando. Dn es el número de dígitos que hay a la derecha de la coma decimal, siendo nuna r para el resultado o un número que representa al operando. T es el valor temporal.

Tenga en cuenta que si algún operando tiene una representación de coma flotante (porejemplo, es el resultado del operador de exponencial), el resultado también es un valor decoma flotante, y las reglas de precisión no se aplican. Un valor de coma flotante tiene laprecisión disponible de la representación de coma flotante de doble precisión.

Capítulo 24. Expresiones 359

Page 382: RPG Referencia

Tabla 37. Precisión de los resultados intermedios (continuación)

Operación Precisión del resultado

N1+N2 T=mín (máx (L1-D1, L2-D2)+1, 30)

Dr=mín (máx (D1,D2), 30-t)

Lr=t+Dr

N1-N2 T=mín (máx (L1-D1, L2-D2)+1, 30)

Dr=mín (máx (D1,D2), 30-t)

Lr=t+Dr

N1*N2 Lr=mín (L1+L2, 30)

Dr=mín (D1+D2, 30-mín ((L1-D1)+(L2-D2), 30))

N1/N2 Lr=30

Dr=máx (30-((L1-D1)+D2), 0)

N1**N2 Flotante doble

Nota: Las operaciones siguientes generan un resultado de caracteres. Ln representa lalongitud del operando en cantidad de caracteres.

C1+C2 Lr=min(L1+L2,65535)

Nota: Las operaciones siguientes generan un resultado DBCS. Ln representa la longituddel operando en cantidad de caracteres DBCS.

D1+D2 Lr=mín(L1+L2,16383)

Nota: Las operaciones siguientes generan un resultado de tipo carácter con indicador desubtipo. El resultado siempre es un valor de indicador (1 carácter).

V1=V2 1 (indicador)

V1>=V2 1 (indicador)

V1>V2 1 (indicador)

V1<=V2 1 (indicador)

V1<V2 1 (indicador)

V1<>V2 1 (indicador)

V1 AND V2 1 (indicador)

V1 OR V2 1 (indicador)

Ejemplo de reglas de precisión por omisiónEste ejemplo muestra cómo funcionan las reglas de precisión por omisión.

360 VisualAge RPG Consulta del lenguaje

Page 383: RPG Referencia

Al procesar la especificación de cálculo anterior, el valor resultante asignado aFLD1 tendrá una precisión de cero decimales, no los cuatro decimales esperados.La razón es que al llegar a la última evaluación (:rk.4:erk. en el ejemplo anterior),el número al que se escala el factor es negativo. Para comprenderlo, observe cómose evalúa la expresión.

«1¬ Evaluar FLD3/100

Normas:Lr = 30Dr=máx (30-((L1-D1)+D2), 0)

= máx(30-((5-2)+0),0)= máx(30-3,09)= 27

«2¬ Evaluar (Resultado de 1 * FLD4)

Normas:Lr = mín(L1+L2,30)

= mín(30+9,30)= 30

Dr = mín(D1+D2,30-mín((L1-D1)+(L2-D2),30))= mín(27+4,30-mín((30-27)+(9-4),30))= mín(31,30-mín(3+5,30)= mín(31,30-8)= 22

«3¬ Evaluar (Resultado de 2 + FLD5)

Normas:T = mín(máx(L1-D1,L2-D2)+1,30)

= mín(máx(30-22,9-4)+1,30)= mín(máx(8,5)+1,30)= mín(9,30)= 9

Dr = mín(máx(D1,D2),30-T)= mín(máx(22,4),30-9)= mín(22,21)= 21

Lr = T + Dr= 9 + 21 = 30

«4¬ Evaluar FLD2/Resultado de 3

Normas:

DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++D FLD1 S 15P 4D FLD2 S 15P 2D FLD3 S 5P 2D FLD4 S 9P 4D FLD5 S 9P 4CSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++++C EVAL FLD1 = FLD2/(((FLD3/100)*FLD4)+FLD5)

( «1¬ )( «2¬ )( «3¬ )

( «4¬ )

Figura 159. Precisión de los resultados intermedios

Capítulo 24. Expresiones 361

Page 384: RPG Referencia

Lr = 30Dr=máx (30-((L1-D1)+D2), 0)

= máx(30-((15-2)+ 21),0)= máx(30-(13+21),0)= máx(-4,0) ** NÚMERO NEGATIVO AL CUAL SE ESCALA EL FACTOR **= 0

Para evitar este problema, puede cambiar la expresión anterior de modoque la primera evaluación sea una multiplicación en lugar de una división,es decir, FLD3 * 0.01 o utilice la función incorporada %DEC para establecerla subexpresión FLD3/100: %DEC(FLD3/100 : 15 : 4) o utilice el ampliadorde operación (R) para asegurar que el número de posiciones decimalesnunca sea inferior a 4.

Utilización de las Reglas de precisión de ″Posición decimal deresultado ″

La regla de precisión de ″Posición decimal de resultado″ significa que la precisiónde un valor intermedio decimal se calculará de modo que el número de posicionesdecimales nunca sea inferior al número de posiciones decimales del resultado de laasignación. Se especifica mediante:1. EXPROPTS(*RESDECPOS) en la especificación de control. Utilícelo para

especificar este comportamiento para un módulo completo.2. El ampliador de código de operación R especificado para una operación de

formato libre.

Las reglas de Posición decimal de resultado se aplican en las circunstanciassiguientes:1. Las reglas de Posición decimal de resultado únicamente se aplican para los

resultados intermedios decimales empaquetados. Este comportamiento no seaplica a los resultados intermedios de las operaciones que tienen resultadosflotantes, sin signo o enteros.

2. Las reglas de precisión de Posición decimal de resultado únicamente se aplicansi existe una asignación (tanto explícita como implícita) a un destino decimal(empaquetado, con zona o binario).Puede producirse en las situaciones siguientes:a. Para una sentencia EVAL, el número mínimo de posiciones decimales lo

proporcionan las posiciones decimales del destino de la asignación y seaplica a la expresión situada a la derecha de la asignación. Si también seaplica redondeo a la sentencia, se añade un dígito adicional al númeromínimo de posiciones decimales (siempre que el mínimo sea inferior a 30).

b. Para una sentencia RETURN, el número mínimo de posiciones decimales loproporcionan las posiciones decimales del valor de retorno definido en laespecificación PI para el procedimiento. Si también se aplica redondeo a lasentencia, se añade un dígito adicional al número mínimo de posicionesdecimales (siempre que el mínimo sea inferior a 30).

c. Para un parámetro VALUE o CONST, el número mínimo de posicionesdecimales lo proporcionan las posiciones decimales del parámetro formal(especificado en el prototipo de procedimiento) y se aplica a la expresiónespecificada como el parámetro pasado.

d. Para la función incorporada %DEC y %DECH con longitud explícita yposiciones decimales especificadas, el número mínimo de posicionesdecimales lo proporciona el tercer parámetro de la función incorporada y seaplica a la expresión especificada como el primer parámetro.

El número mínimo de posiciones decimales se aplica a la subexpresióncompleta, a menos que se haya alterado temporalmente mediante otra de las

362 VisualAge RPG Consulta del lenguaje

Page 385: RPG Referencia

operaciones anteriores. Si se especifica redondeo (tanto con el ampliador decódigo de operación H como mediante la función incorporada %DECH), elnúmero de posiciones decimales del resultado intermedio nunca se reduce pordebajo de N+1, en donde N es el número de posiciones decimales delresultado.

3. Las reglas de Posición decimal de resultado normalmente no se aplican a lasexpresiones condicionales, puesto que no existe resultado correspondiente. (Sideben llevarse a cabo comparaciones para una precisión determinada, se debeutilizar %DEC o %DECH en ambos argumentos.)Por otra parte, si la expresión condicional está incorporada en una expresiónpara la que se han proporcionado las posiciones decimales mínimas (utilizandouna de las técnicas anteriores), se aplican las reglas de Posiciones decimales deresultado.

Ejemplo de Reglas de precisión de ″Posición decimal deresultado ″

Los ejemplos siguientes muestran las reglas de precisión de ″Posición decimal deresultado″:

Capítulo 24. Expresiones 363

Page 386: RPG Referencia

Evaluación de circuito cortoLas operaciones relacionales AND y OR se evalúan de izquierda a derecha. Sinembargo, en cuanto se conoce el valor, se detiene la evaluación de la expresión y sedevuelve el valor. Como resultado, no es necesario evaluar todos los operandos dela expresión.

En el caso de la operación AND, si el primer operando es falso, el segundooperando no se evalúa. Asimismo, para la operación OR, si el primer operando esverdadero, el segundo operando no se evalúa.

Existen dos implicaciones de este comportamiento. En primer lugar, un índice dematriz se puede probar y utilizar dentro de la misma expresión. La expresión

I<=%ELEM(ARRAY) AND I>0 AND ARRAY(I)>10

nunca podrá ser resultado de una excepción de indexación de matrices.

* Este ejemplo muestra la precisión de los valores intermedios* utilizando las dos reglas de precisión.

D p1 s 13p 2D p2 s 13p 2D p3 s 13p 2D p4 s 15p 9D s1 s 13s 2D s2 s 13s 2D i1 s 10i 0D f1 s 8f 0D proc pr 8p 3D parm1 20p 5 valorC* En los ejemplos siguientes, se muestran dos precisiones para cadaC* subexpresión. En primer lugar, la precisión natural y, aC* continuación, la precisión ajustada.C* Ejemplo 1:C eval p1 = p1 * p2 * p3C* p1*p2 -> P(26,4); P(26,4)C* p1*p2*p3 -> P(39,6); P(30,0) (las posiciones decimales se truncan)C eval(r) p1 = p1 * p2 * p3C* p1*p2 -> P(26,4); P(26,4)C* p1*p2*p3 -> P(39,6); P(30,2) (las posiciones decimales no se reducenC* por debajo de las posiciones decimalesC* de destino)C eval(rh) p1 = p1 * p2 * p3C* p1*p2 -> P(26,4); P(26,5)C* p1*p2*p3 -> P(39,6); P(30,3) (las posiciones decimales no se sitúanC* por debajo de decimales destino + 1)

C* Ejemplo 2:C eval p4 = p1 * p2 * proc (s1*s2*p4)C* p1*p2 -> P(26,4); P(26,4)C* s1*s2 -> P(26,4); P(26,4)C* s1*s2*p4 -> P(41,13); P(30,2) (las posiciones decimales se truncan)C* p1*p2*proc() -> P(34,7); P(30,3) (las posiciones decimales se truncan)C eval(r) p4 = p1 * p2 * proc (s1*s2*p4)C* p1*p2 -> P(26,4); P(26,4)C* s1*s2 -> P(26,4); P(26,4)C* s1*s2*p4 -> P(41,13); P(30,5)C* p1*p2*proc() -> P(34,7); P(30,7) (se mantienen todos los decimales,C* puesto que ya se está por debajo deC* los decimales de destino)

Figura 160. Ejemplos de reglas de precisión

364 VisualAge RPG Consulta del lenguaje

Page 387: RPG Referencia

La segunda implicación es que si el segundo operando es una llamada a unafunción definida por el usuario, no se llamará a la función. Esto es importante si lafunción cambia el valor de un parámetro o de una variable global.

Orden de evaluaciónEl orden de evaluación de operandos dentro de una expresión no está garantizado.Por consiguiente, si se utiliza una variable dos veces en cualquier lugar de unaexpresión y existe la posibilidad de efectos laterales, quizá los resultados no seanlos esperados.

Por ejemplo, considere el fuente que se muestra en la Figura 161, en donde A esuna variable y FN es un procedimiento que modifica a A. Existen dos aparicionesde A en la parte de expresión de la segunda operación EVAL. Si el lado izquierdo(operando 1) de la operación de suma se evalúa en primer lugar, se asigna el valorde 17 a X, (5 + FN(5) = 5 + 12 = 17). Si el lado derecho (operando 2) de laoperación de suma se evalúa en primer lugar, se asigna el valor de 18 a X, (6 +FN(5) = 6 + 12 = 18).

C* A es una variable. FN es el procedimiento que modifica a A.C EVAL A = 5C EVAL X = A + FN(A)P FN BD FN PI 5P 0D PARM 5P 0C EVAL PARM = PARM + 1C RETURN 2 * PARMP FN E

Figura 161. Codificación de ejemplo de una llamada con efectos laterales

Capítulo 24. Expresiones 365

Page 388: RPG Referencia

366 VisualAge RPG Consulta del lenguaje

Page 389: RPG Referencia

Capítulo 25. Códigos de operación

El lenguaje de programación VisualAge RPG le permite realizar un gran númerode operaciones distintas sobre los datos. Los códigos de operación, que se entranen las especificaciones de cálculo, indican la operación que se realizará.Generalmente son abreviaturas del nombre de la operación.

Los códigos de operación se dividen por funciones. La primera parte de estasección contiene información general acerca de estas categorías. La última partedescribe cada código de operación, ordenados alfabéticamente, y muestra uno ovarios ejemplos de la mayor parte de operaciones.

Operaciones aritméticasLas operaciones aritméticas son las siguientes:v “ADD (Añadir)” en la página 392v “DIV (Dividir)” en la página 432v “MULT (Multiplicar)” en la página 497v “MVR (Mover resto)” en la página 498v “SQRT (Raíz cuadrada)” en la página 540v “SUB (Restar)” en la página 543v “XFOOT (Sumar los elementos de una matriz)” en la página 563v “Z-ADD (Poner a cero y sumar)” en la página 565v “Z-SUB (Poner a cero y restar)” en la página 566.

La figura siguiente contiene ejemplos de operaciones aritméticas:

© Copyright IBM Corp. 1994, 2000 367

Page 390: RPG Referencia

Las normas siguientes se aplican al especificar operaciones aritméticas:v Las operaciones aritméticas solo pueden llevarse a cabo en números:

– subcampos numéricos– matrices numéricas– elementos numéricos de matriz– elementos numéricos de tabla– constantes numéricas con nombre– constantes figurativas numéricas– literales numéricos

v En general, las operaciones se efectúan utilizando el formato decimalempaquetado. Significa que se convierten los campos al formato decimalempaquetado antes de efectuarse la operación aritmética y luego se vuelven aconvertir a los formatos especificados, si es necesario, antes de colocarse elresultado en el campo correspondiente. Sin embargo debe tener en cuenta lasexcepciones siguientes:– Si todos los operandos son sin signo, la operación utilizará la aritmética sin

signo.– Si son todos enteros o enteros y sin signo, la operación utilizará la aritmética

de los enteros.– Si alguno de los operandos es de coma flotante, los demás operandos se

convertirán a coma flotante.

Sin embargo, el operador DIV utiliza tanto el formato decimal empaquetadocomo el de coma flotante para efectuar sus operaciones. Para obtener más

*...1....+....2....+....3....+....4....+....5....+....6....+....7...CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....CommentsC*C* En el ejemplo siguiente, los valores iniciales de los campos son:C*C* A = 1C* B = 10,0C* C = 32C* D = -20C* E = 6C* F = 10,0C* G = 2,77C* H = 70C* J = 0,6C* K = 25C* L = 1,0 , 1,7 , -1,1 Resultado:C*C ADD 1 A 3 0 A = 002C B ADD C V 5 2 V = 042,00C B ADD D V V = -10,00C Z-ADD C V V = 032,00C SUB 1 E 3 0 E = 005C C SUB B W 5 1 W = 0022,0C C SUB D W W = 0052,0C Z-SUB C W W = -0032,0C MULT E F 3 0 F = 060C B MULT G X 8 4 X = 0027,7000C B MULT D X X = -200,0000C DIV B H 3 0 H = 007C C DIV J Y 6 2 Y = 0053,33C MVR Z 5 3 Z = 00,002C SQRT K Z Z = 05,000C XFOOT L Z Z = 01,600

Figura 162. Ejemplos de operaciones aritméticas

368 VisualAge RPG Consulta del lenguaje

Page 391: RPG Referencia

información acerca de la aritmética de números enteros y sin signo, consulte elapartado “Aritmética de enteros y sin signo”

v La alineación decimal se lleva a cabo para todas las operaciones aritméticas.Aunque se puede producir truncamiento, no afecta a la posición de la comadecimal en el campo del resultado.

v La longitud de los campos especificados en una operación aritmética no puedesobrepasar los 30 dígitos. De lo contrario, los dígitos se truncan por uno o porambos extremos, según la posición de la coma decimal.

v La opción TRUNCNBR determina si se produce el truncamiento por la izquierdacon desbordamiento numérico o si se genera un error en tiempo de ejecución.Esta opción se puede especificar en la ventana Crear. Si desea más información,consulte la publicación Iniciación a VisualAge RPG y CODE/400.

v Una operación numérica no cambia el factor 1 y el factor 2 a menos que sean elmismo que el campo del resultado.

v El resultado de una operación aritmética sustituye los datos que había en elcampo del resultado.

v El redondeo se efectúa añadiendo 5 (-5 si el campo es negativo) una posición ala derecha de la última posición decimal especificada en el campo del resultado.La entrada de redondeo sólo está permitida con operaciones aritméticas, pero nocon una operación MVR ni con una operación DIV seguida de la operaciónMVR. El redondeo sólo afecta al resultado si el número de posiciones decimalesdel resultado calculado es mayor que el número de posiciones decimales delcampo de resultado. El redondeo se produce después de la operación pero antesde situar el resultado en el campo del resultado. Los indicadores resultantes seestablecen según el valor del campo del resultado después de haberse realizadoel redondeo.

v Si utiliza indicadores de condicionamiento con las operaciones DIV y MVR,tendrá que asegurarse de que la operación DIV se produzca inmediatamenteantes de la operación MVR. Si los indicadores de condicionamiento de laoperación DIV provocan la ejecución de la operación MVR sin que se hayaejecutado la operación DIV situada inmediatamente antes, pueden producirseresultados no deseados.

Para operaciones aritméticas en las que se utilizan los tres campos:v El factor 1, el factor 2 y el campo del resultado pueden ser tres campos

diferentesv El factor 1, el factor 2 y el campo del resultado pueden ser el mismo campov El factor 1 y el factor 2 pueden ser el mismo campo, pero distintos del campo

del resultadov El factor 1 ó el factor 2 puede ser el mismo campo que el campo del resultado.

Si desea obtener información acerca de cómo se utilizan las matrices con lasoperaciones aritméticas, consulte el apartado “Especificación de una matriz en loscálculos” en la página 168.

Consideraciones sobre el rendimientoLas operaciones aritméticas se efectuarán a la máxima velocidad cuando todos losoperandos tengan el formato de números enteros o sin signo. La siguientevelocidad más alta se produce cuando todos los operandos tengan el formato deempaquetado, porque de este modo no serán necesarias las conversiones a unformato común.

Aritmética de enteros y sin signoPara todas las operaciones aritméticas (sin incluir las que forman parte de lasexpresiones), si el factor 1, el factor 2 y el campo del resultado están definidos con

Capítulo 25. Códigos de operación 369

Page 392: RPG Referencia

el formato sin signo, la operación se efectuará utilizando el formato sin signo.Igualmente, si el factor 1, el factor 2 y el campo del resultado están definidos tantocon el formato de enteros como con el formato sin signo, la operación se efectuaráutilizando el formato de enteros. Si algún campo no tiene uno de estos dosformatos, entero o sin signo, la operación se efectuará utilizando el formato poromisión, el decimal empaquetado.

Los puntos que figuran a continuación sólo son aplicables a las operacionesaritméticas de enteros y sin signo:v Si alguno de los campos está definido como campo de 4 bytes, se convertirán

todos los campos a 4 bytes antes de efectuarse la operación.v Los valores enteros y sin signo pueden utilizarse juntos en una operación. Sin

embargo, si el factor 1, el factor 2 ó el campo del resultado es con signo, todoslos valores sin signo se convierten a enteros. Si es necesario, los valores sin signode 2 bytes se convierten a valores enteros de 4 bytes para disminuir laposibilidad de que se produzca un desbordamiento numérico.

v Si un literal tiene un máximo de 10 dígitos con cero posiciones decimales, y estácomprendido en el intervalo permitido para los campos de enteros y sin signo,se cargará en formato de entero o sin signo, según sea un valor negativo opositivo respectivamente.

Nota: La aritmética de los enteros o sin signo puede tener un rendimientosuperior. No obstante, puede aumentar la posibilidad de que se produzca undesbordamiento numérico cuando se utiliza uno de estos dos tipos dearitmética.

370 VisualAge RPG Consulta del lenguaje

Page 393: RPG Referencia

Operaciones de matricesLas operaciones de matrices son las siguientes:v “LOOKUP (Buscar un elemento en tabla o matriz)” en la página 466v “MOVEA (Mover matriz)” en la página 483v “SORTA (Clasificar una matriz)” en la página 539v “XFOOT (Sumar los elementos de una matriz)” en la página 563.

Mientras que numerosas operaciones trabajan con matrices, estas operacionesllevan a cabo funciones específicas de matriz. Vea cada operación para unaexplicación de su función.

Operaciones de bitsLas operaciones de bits son las siguientes:v “BITOFF (Desactivar los bits)” en la página 400v “BITON (Activar los bits)” en la página 401v “TESTB (Comprobar bit)” en la página 551.

Los bits de un byte se numeran de izquierda a derecha. El bit situado más a laizquierda es el bit 0. En estas operaciones, el factor 2 contiene la trama de bits(números de bit) y el campo de resultado contiene un campo de tipo carácter deun byte en el que se realizará la operación. Para especificar los números de bit enel factor 2, se permite utilizar un literal hexadecimal de 1 byte o un campo de tipocarácter de 1 byte. Los números de bit se indican mediante los bits que se activan

*...1....+....2....+....3....+....4....+....5....+....6....+....7...CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....CommentsC*C* En el ejemplo siguiente, los valores iniciales de los campos son:C*C* A = 1C* B = 10,0C* C = 32C* D = -20C* E = 6C* F = 10,0C* G = 2,77C* H = 70C* J = 0,6C* K = 25C* L = 1,0 , 1,7 , -1,1 Resultado:C*C ADD 1 A 3 0 A = 002C B ADD C V 5 2 V = 042,00C B ADD D V V = -10,00C Z-ADD C V V = 032,00C SUB 1 E 3 0 E = 005C C SUB B W 5 1 W = 0022,0C C SUB D W W = 0052,0C Z-SUB C W W = -0032,0C MULT E F 3 0 F = 060C B MULT G X 8 4 X = 0027,7000C B MULT D X X = -200,0000C DIV B H 3 0 H = 007C C DIV J Y 6 2 Y = 0053,33C MVR Z 5 3 Z = 00,002C SQRT K Z Z = 05,000C XFOOT L Z Z = 01,600

Figura 163. Resumen de las operaciones aritméticas

Capítulo 25. Códigos de operación 371

Page 394: RPG Referencia

en el literal o en el campo. Alternativamente, también se puede especificar en elfactor 2 un literal que contenga los números de bit.

Vea cada operación para una explicación de su función.

Operaciones de bifurcaciónLas operaciones de bifurcación son las siguientes:v “CABxx (Comparar y bifurcar)” en la página 402v “GOTO (Ir a)” en la página 457v “ITER (Iterar)” en la página 461v “LEAVE (Abandonar un grupo DO/FOR)” en la página 464v “TAG (Etiqueta)” en la página 548.

Vea cada operación para una explicación de su función.

Operaciones de llamadaLas operaciones de llamada son las siguientes:v “CALL (Llamar a un programa AS/400)” en la página 404v “CALLB (Llamar a una función)” en la página 407v “CALLP (Llamar a un procedimiento o programa con prototipo)” en la

página 408v “PARM (Identificar parámetros)” en la página 506v “PLIST (Identificar una lista de parámetros)” en la página 508v “RETURN (Volver al llamador)” en la página 525v “START (Iniciar un componente lógico o Llamar a programa local)” en la

página 541.

Vea cada operación para una explicación de su función.

CALLP es un tipo de llamada con prototipo. El segundo tipo es una llamada desdedentro de una expresión. Una llamada con prototipo es una llamada para la quese ha definido un prototipo para la interfaz de llamada.

Las operaciones de llamada permiten que un procedimiento de VisualAge RPGtransfiera el control a otros programas o procedimientos. Sin embargo, las llamadascon prototipo se diferencian de las operaciones CALL y CALLB por permitir unasintaxis de formato libre.

La operación RETURN transfiere el control nuevamente al programa oprocedimiento de llamada y devuelve un valor, si hay alguno. Las operacionesPLIST y PARM pueden utilizarse con las operaciones CALL y CALLB para indicarqué parámetros se han de pasar a la llamada. En una llamada con prototipo, losparámetros se pasan en la llamada.

La forma recomendada de llamar a un programa o procedimiento (escrito encualquier lenguaje) es codificar una llamada con prototipo.

Llamadas con prototipoEn una llamada con prototipo se puede llamar (con la misma sintaxis) a:v Programas que están en el sistema en tiempo de ejecuciónv Procedimientos exportados en otros módulos que están enlazados en el mismo

programav Subprocedimientos del mismo módulo.

372 VisualAge RPG Consulta del lenguaje

Page 395: RPG Referencia

Se ha de incluir un prototipo en las especificaciones de definición del programa oprocedimiento que realiza la llamada. El compilador lo utiliza para llamarcorrectamente al programa o procedimiento y para asegurar que el llamador pasalos parámetros correctos.

Cuando un programa o procedimiento tiene prototipo, no es necesario conocer losnombres de los elementos de datos utilizados en el programa o procedimiento;sólo el número y el tipo de parámetros.

Los prototipos mejoran la comunicación entre programas y procedimientos.Algunas ventajas de la utilización de llamadas con prototipo son:v Se simplifica la sintaxis porque no se requieren operaciones PARM o PLIST.v Para algunos parámetros, se pueden pasar literales y expresiones.v El compilador ayuda a pasar el número adecuado de parámetros, con el tipo,

formato y longitud correctos, dando un error en tiempo de compilación si lallamada no es correcta.

v El compilador ayuda a pasar suficientes parámetros con el formato y la longitudcorrecta para algunos tipos de parámetros, realizando una conversión en tiempode ejecución.

La figura Figura 164 muestra un ejemplo que utiliza el prototipo ProcName, quepasa tres parámetros. El prototipo ProcName puede referirse tanto a un programacomo a un procedimiento. No es importante saber esto al efectuar la llamada;conviene tenerlo en cuenta al definir el prototipo.

Al llamar a un procedimiento en una expresión, debe utilizar el nombre delprocedimiento de manera coherente con el tipo de datos del valor de retornoespecificado. Por ejemplo, si se ha definido un procedimiento para que devuelvaun valor numérico, la llamada al procedimiento dentro de una expresión ha deestar donde se espera un valor numérico.

Si desea más información acerca de cómo llamar a los programas y procedimientoy de cómo pasar parámetros, consulte la publicación Programación con VisualAgepara RPG. Si desea más información acerca de la definición de prototipos yparámetros, consulte la sección “Prototipos y parámetros” en la página 67.

Sintaxis de los nombres de los programas en una llamadaLos nombres de los programas se especifican en el factor 2 de una operaciónCALL. Si se especifica el nombre de la biblioteca, debe seguirle una barra inclinaday, a continuación, el nombre del programa (por ejemplo, ’LIB/PROG’). Si no seespecifica ninguna biblioteca, se utiliza la lista de bibliotecas para encontrar elprograma. El valor *CURLIB no se soporta.

Observe las reglas siguientes:v La longitud total de un literal, incluyendo la barra inclinada, no puede

sobrepasar los 12 caracteres.v La longitud total de los datos que no son espacios en blanco en un campo o

constante con nombre, incluyendo la barra inclinada, no puede sobrepasar los 21caracteres.

* El código siguiente llama a ProcName con los 3* parámetros CharField, 7 y Field2:

C CALLP ProcName (Charfield: 7: Field2)

Figura 164. Ejemplo de la operación CALLP

Capítulo 25. Códigos de operación 373

Page 396: RPG Referencia

v Si el nombre del programa o de la biblioteca sobrepasa los 10 caracteres, setruncará a 10 caracteres.

El nombre del programa se utiliza tal como está especificado en el literal, campo,constante con nombre o elemento de matriz, para determinar el programa que seha de llamar. Específicamente:v Se ignoran todos los blancos iniciales o de cola.v Si el primer carácter de la entrada es una barra inclinada, se utiliza la lista de

bibliotecas para encontrar el programa.v Si el último carácter de la entrada es una barra inclinada, se emitirá un mensaje

en tiempo de compilación.v Los caracteres en minúsculas no se convierten a mayúsculas.v Un nombre entre comillas, por ejemplo, ’″ABC″’, incluye siempre las comillas

como parte del nombre del programa que se ha de llamar.

Las referencias a un programa se agrupan para evitar el coste general de laresolución en el programa destino. Todas las referencias a un programa específicomediante una constante con nombre o un literal se agrupan de modo que elprograma se resuelva sólo una vez y todas las referencias ulteriores a dichoprograma (por medio de una constante con nombre o un literal) no provocan larepetición de una resolución.

Las referencias al programa se agrupan si los nombres del programa y de labiblioteca son idénticos. Todas las referencias a un programa realizadas mediante elnombre de una variable se agrupan por el nombre de la variable. Cuando serealiza una referencia al programa con una variable, se compara su valor actualcon el valor utilizado en la operación anterior de referencia al programa que utilizódicha variable. Si el valor no ha cambiado, no se realiza ninguna resolución. Si hacambiado, se realiza una resolución en el nuevo programa especificado. Observeque esta regla sólo se aplica a las referencias que utilizan un nombre de variable.Las referencias que utilizan una constante con nombre o un literal nunca sevuelven a resolver y no afectan al hecho de si se vuelve a resolver una referencia aprograma mediante una variable. La figura siguiente ilustra cómo se agrupan lasreferencias a un programa.

374 VisualAge RPG Consulta del lenguaje

Page 397: RPG Referencia

Operaciones de comparaciónLas operaciones de comparación son las siguientes:v “ANDxx (Y)” en la página 396v “COMP (Comparar)” en la página 426v “CABxx (Comparar y bifurcar)” en la página 402v “CASxx (Invocar subrutina condicionalmente)” en la página 409v “DOU (Hacer hasta)” en la página 435v “DOUxx (Hacer hasta)” en la página 436v “DOW (Hacer mientras)” en la página 438v “DOWxx (Hacer mientras)” en la página 439v “IF (Si)” en la página 457v “IFxx (Si)” en la página 458v “ORxx (O)” en la página 503v “WHEN (Seleccionar cuando sea verdadero)” en la página 558v “WHENxx (Seleccionar cuando sea verdadero)” en la página 559

En las operaciones ANDxx, CABxx, CASxx, DOUxx, DOWxx, IFxx, ORxx, yWHENxx, xx puede ser:

*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++D Pgm_Ex_A C 'LIB1/PGM1'D Pgm_Ex_B C 'PGM1'D PGM_Ex_C C 'LIB/PGM2'D**...1....+....2....+....3....+....4....+....5....+....6....+....7...+....CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C CALL Pgm_Ex_AC*C* Las dos llamadas siguientes se agruparán juntas porque las dos tienenC* el mismo nombre de programa (PGM1) y el mismo nombre de bibliotecaC* (ninguno). Observe que éstas no se van a agrupar con la llamada queC* más arriba utiliza el nombre Pgm_Ex_A, porque Pgm_Ex_A tiene especificadoC* un nombre de biblioteca distinto (LIB1).C*C CALL 'PGM1'C CALL Pgm_Ex_BC*C* Las dos siguientes referencias a programa se agruparán juntas porqueC* las dos tienen el mismo nombre de programa (PGM2) y el mismo nombre deC* biblioteca (LIB).C*C CALL 'LIB/PGM2'C CALL Pgm_Ex_CC**...1....+....2....+....3....+....4....+....5....+....6....+....7...+....CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* La primera llamada del programa mediante CALLV, más abajo, provocará laC* realización de una resolución para la variable CALLV en el programa PGM1.C* Es independiente de cualquier llamada mediante un literal o constanteC* con nombre a PGM1 que ya pueda haberse realizado en el programa. LaC* segunda llamada mediante CALLV no provocará una resolución en PGM1C* porque el valor de CALLV no ha cambiado.C*C MOVE 'PGM1' CALLV 21C CALL CALLVC CALL CALLV

Figura 165. Ejemplo de cómo agrupar las referencias a un programa

Capítulo 25. Códigos de operación 375

Page 398: RPG Referencia

xx Significado

GT El factor 1 es mayor que el factor 2.

LT El factor 1 es menor que el factor 2.

EQ El factor 1 es igual que el factor 2.

NE El factor 1 no es igual que el factor 2.

GE El factor 1 es mayor o igual que el factor 2.

LE El factor 1 es menor o igual que el factor 2.

Blancos Proceso sin condiciones (CASxx o CABxx).

Las operaciones de comparación comprueban campos para las condicionesespecificadas en las operaciones. Estas operaciones no cambian los valores de loscampos. Para COMP, CABXX y CASXX, los indicadores resultantes asignados enlas posiciones 71 y 76 se establecen según los resultados de la operación. Todos lostipos de datos pueden compararse con campos del mismo tipo de datos.

Cuando utilice las operaciones de comparación recuerde lo siguiente:v Si se comparan campos numéricos, se alinean campos de longitudes diferentes

en la coma decimal implicada. Los campos se rellenan con ceros a la izquierday/o a la derecha de la coma decimal para igualar la longitud de los campos y elnúmero de posiciones decimales para la comparación.

v Todas las comparaciones numéricas son algebraicas. Un valor más (+) siempre essuperior que un valor menos (-).

v Todas las comparaciones de tipo gráfico y UCS-2 se efectúan utilizando larepresentación hexadecimal de los caracteres gráficos.

v Si se comparan campos de tipo carácter, gráfico o UCS-2, los campos delongitudes diferentes se alinean por el carácter situado más a la izquierda. Elcampo con la longitud menor se rellena con caracteres en blanco para igualar lalongitud del campo más largo y así igualar los longitudes de los campos para sucomparación.

v Los campos de fecha se convierten a un formato común cuando se comparan.v Los campos de hora se convierten en un formato común cuando se comparan.v Cuando se comparan los campos de puntero de base, excepto su igualdad o

desigualdad, los resultados pueden ser imprevisibles a menos que los punterosseñalen hacia las direcciones del almacenamiento contiguo (por ejemplo, hacialas posiciones dentro de la misma estructura de datos, matriz o campoautónomo).

v Cuando la comparación de campos de puntero de procedimiento no se refiere asu igualdad o desigualdad, los resultados pueden ser imprevisibles.

v No puede especificarse un nombre de matriz en una operación de comparaciónpero sí puede especificarse un elemento de matriz.

v Pueden utilizarse las operaciones ANDxx y ORxx a continuación de DOUxx,DOWxx, IFxx y WHENxx.

v Al comparar un literal de tipo carácter, gráfico o UCS-2 de longitud cero con uncampo (fijo o variable) que contenga blancos, la comparación dará el resultadode iguales. Si quiere comprobar si el valor tiene longitud 0, utilice la funciónincorporada %LEN.

Operaciones de área de datosLas operaciones de área de datos son las siguientes:v “IN (Recuperar un área de datos)” en la página 460v “OUT (Grabar un área de datos)” en la página 505

376 VisualAge RPG Consulta del lenguaje

Page 399: RPG Referencia

v “UNLOCK (Desbloquear un área de datos o Liberar un registro)” en lapágina 556 .

Si la aplicación accede a un área de datos de AS/400, el nombre de dicha área dedatos puede ser el nombre del área de datos de AS/400 o un nombre queprevalezca sobre él que se haya definido utilizando el elemento de menú Definirinformación de AS/400. Si desea más información acerca de cómo utilizar elDiseñador GUI para definir la información de AS/400, consulte la publicaciónIniciación a VisualAge RPG y CODE/400.

Se utilizan los estados de bloqueo siguientes:

Operación IN con *LOCK Un estado de bloqueo exclusivo que permite lalectura se coloca sobre el área de datos

Operación OUT con *LOCK El área de datos permanece bloqueada después dela operación de grabación

Operación OUT con espacio en blanco El área de datos se desbloquea después deactualizarse

UNLOCK Se desbloquea el área de datos, se liberan losbloqueos de los registros y no se actualizan las áreasde datos y/o los registros.

Cuando se trasladan datos a un área de datos y fuera de ella, el sistema bloquea elárea de datos. Si varios usuarios están interesados en el misma área de datos,algún usuario puede recibir un mensaje de error indicando que el área de datos noestá disponible.

Las reglas siguientes se aplican a las operaciones de área de datos:v No se puede efectuar una operación de área de datos en un área de datos que

no se haya definido para el sistema operativo.v Para que una operación de área de datos pueda llevarse a cabo, el área de datos

debe estar especificada en la especificación de definición o en el código deoperación DEFINE. Para obtener más información, consulte el apartado“DEFINE (Definición de campo)” en la página 428.

v Un área de datos bloqueada no puede actualizarse ni bloquearse por otroprograma.

v Un nombre de área de datos no puede ser el nombre de una estructura de datosde múltiples apariciones, un campo de registro de entrada, un elemento dematriz ni una tabla.

v Un área de datos no puede ser un subcampo de una estructura de datos demúltiples apariciones, una estructura de datos de área de datos, una estructurade datos de estado de programa, una estructura de datos de información dearchivo (INFDS) ni una estructura de datos que aparezca en una sentencia*DTAARA DEFINE.

Operaciones de fechaLas operaciones de fecha le permiten efectuar operaciones aritméticas de fecha yde hora, extraer partes de un campo de fecha, de hora o de indicación de la hora; ocomprobar si los campos son válidos. Operan en campos de fecha, hora eindicación de la hora y en campos numéricos y de caracteres que representanfechas, horas e indicaciones de la hora. Las operaciones de fecha son las siguientes:v “ADDDUR (Añadir duración)” en la página 393v “EXTRCT (Extraer fecha/hora/indicación de la hora)” en la página 452v “SUBDUR (Restar duración)” en la página 543

Capítulo 25. Códigos de operación 377

Page 400: RPG Referencia

v “TEST (Comprobar fecha/hora/indicación de la hora)” en la página 549

Los códigos de duración se pueden utilizar con ADDDUR y SUBDUR. Los códigosde duración y sus formas abreviadas son los siguientes:v *YEARS para el año (*Y)v *MONTHS para el mes (*M)v *DAYS para el día del mes (*D)v *HOURS para las horas (*H)v *MINUTES para los minutos (*MN)v *SECONDS para los segundos (*S)v *MSECONDS para los microsegundos (*MS).

Adición o resta de fechasCuando se añade (o resta) una duración en meses a (o de) una fecha, la reglageneral es que se incrementa (o reduce) la parte de mes en el número de meses dela duración y la parte de día no se modifica. La excepción a esta regla es cuando laparte de día resultante sobrepasa el número real de días del mes resultante. En estecaso, la parte de día resultante se ajusta a la fecha real del fin de mes.

Por ejemplo, si añadimos un mes a la fecha ’95/05/30’ (formato *YMD) obtenemos’95/06/30’, como era de esperar. La parte de mes resultante se ha incrementado en1; la parte de día no se ha modificado. Por otra parte, si añadimos un mes a’95/05/31’, obtenemos ’95/06/30’. La parte de mes resultante se ha incrementadoen 1 y la parte de día resultante se ha ajustado porque el mes de junio sólo tiene30 días.

Si restamos un mes a ’95/03/30’, obtenemos ’95/02/28’. En este caso, la parte demes resultante se reduce en 1 y la parte de día resultante se ajusta porque el mesde febrero sólo tiene 28 días (en los años no bisiestos).

Los resultados son parecidos cuando se añade o resta la duración de un año. Porejemplo, si añadimos un año a ’92/02/29’ obtenemos ’93/02/28’, ajustando el valorporque el año resultante no es bisiesto.

Cálculo de las duraciones entre fechasPuede utilizarse la operación SUBDUR para calcular una duración restando dosfechas, horas o indicaciones de la hora. El resultado del cálculo se expresa enunidades completas; el redondeo se realiza hacia abajo. El cálculo de las duracionesincluye los microsegundos.

Por ejemplo, si la duración real es de 384 días, y se pide el resultado en años, elresultado será 1 año completo porque hay 1,05 años en 384 días. Una duración de59 minutos expresada en horas dará como resultado 0 horas.

378 VisualAge RPG Consulta del lenguaje

Page 401: RPG Referencia

A continuación se exponen algunos ejemplos adicionales.

Tabla 38. Duraciones resultantes mediante la operación SUBDUR

Unidad deduración Factor 1 Factor 2 Resultado

Meses 1999-03-28 1999-02-28 1 mes

1999-03-14 1998-03-15 11 meses

1999-03-15 1998-03-15 12 meses

Años 1999-03-14 1998-03-15 0 años

1999-03-15 1998-03-15 1 año

1999-03-14-12.34.45.123456 1998-03-14-12.34.45.123457 0 años

Horas 1990-03-14-23.00.00.000000 1990-03-14-22.00.00.000001 0 horas

Resultados inesperadosSi se efectúa el redondeo en una adición o resta de fechas y horas, lo más probablees que un cálculo de duración ulterior dé como resultado una duración distinta dela que se añadió o restó al principio. Esto se debe a que la duración calculada yano va a contener una unidad completa, por lo que, al redondear hacia abajo, seobtendrá una unidad menos de la esperada. Esto se muestra en los ejemplos 1 y 2,más abajo.

Puede verse un segundo caso de resultado inesperado en los ejemplos 3 y 4.Distintas fechas iniciales dan el mismo resultado después de añadir 1 mes. Alrestar un mes del resultado, es imposible volver a obtener las dos fechas iniciales.1. '95/05/31' ADDDUR 1:*MONTH da '95/06/30'

'95/06/30' SUBDUR '95/05/31' da 0 meses

Podía esperarse que el resultado de SUBDUR fuese 1 mes.

2. '95/06/30' ADDDUR 1:*MONTH da '95/07/30''95/07/30' SUBDUR '95/06/30' da 1 mes

Éste es el resultado "esperado".

3. '95/01/31' ADDDUR 1:*MONTH da '95/02/28''95/01/28' ADDDUR 1:*MONTH da '95/02/28'

Dos fechas distintas dan una misma fecha resultante debido al redondeo.

4. '95/02/28' SUBDUR 1:*MONTH da '95/01/28'

Si se invierte la adición, no se obtienen las dos fechas originales.

Operaciones declarativasLas operaciones declarativas son las siguientes:v “DEFINE (Definición de campo)” en la página 428v “KFLD (Definir partes de una clave)” en la página 462v “KLIST (Definir una clave compuesta)” en la página 463v “PARM (Identificar parámetros)” en la página 506v “PLIST (Identificar una lista de parámetros)” en la página 508v “TAG (Etiqueta)” en la página 548.

Se utilizan las operaciones declarativas para declarar las propiedades de loscampos o para marcar las partes de un programa. La entrada de nivel de control

Capítulo 25. Códigos de operación 379

Page 402: RPG Referencia

(posiciones 7 y 8) puede estar en blanco o puede contener una entrada para ungrupo de sentencias dentro de la sección adecuada del programa.

Operaciones que utilizan expresionesLas operaciones que utilizan expresiones son las siguientes:v “DOU (Hacer hasta)” en la página 435v “DOW (Hacer mientras)” en la página 438v “EVAL (Evaluar expresión)” en la página 446v “IF (Si)” en la página 457v “WHEN (Seleccionar cuando sea verdadero)” en la página 558

Se pueden utilizar expresiones en formato libre en el campo del factor 2 ampliadopara todas estas expresiones.

Operaciones de archivosLos códigos de las operaciones de archivos son los siguientes:v “CHAIN (Recuperación aleatoria desde un archivo)” en la página 414v “CLOSE (Cerrar archivos)” en la página 424v “COMMIT (Comprometer)” en la página 425v “CLSWIN (Cerrar ventana)” en la página 424v “DELETE (Suprimir registro)” en la página 431v “EXCEPT (Salida en tiempo de cálculo)” en la página 448v “FEOD (Forzar fin de datos)” en la página 453v “OPEN (Abrir archivo para proceso)” en la página 502v “POST (Anotar)” en la página 509v “READ (Leer un registro)” en la página 510v “READC (Leer siguiente registro modificado)” en la página 513v “READE (Leer clave igual)” en la página 514v “READP (Leer registro anterior)” en la página 516v “READPE (Leer igual anterior)” en la página 518v “READS (Leer seleccionados)” en la página 520v “ROLBK (Retrotraer)” en la página 526v “SETGT (Establecer mayor que)” en la página 532v “SETLL (Establecer límite inferior)” en la página 534v “SHOWWIN (Visualizar ventana)” en la página 538v “UNLOCK (Desbloquear un área de datos o Liberar un registro)” en la

página 556v “UPDATE (Modificar registro existente)” en la página 557v “WRITE (Crear nuevos registros)” en la página 561

Puede utilizar las operaciones de archivo para trabajar con archivos locales,archivos de AS/400 o con los componentes de una ventana:

Operación ArchivoAS/400

Archivolocal

Subarchivo Textoestático

Campo deentrada

Archivosespeciales

CHAIN S S S

CLOSE S S S

COMMIT S

DELETE S S S S

EXCEPT S S

FEOD S S

380 VisualAge RPG Consulta del lenguaje

Page 403: RPG Referencia

Operación ArchivoAS/400

Archivolocal

Subarchivo Textoestático

Campo deentrada

Archivosespeciales

OPEN S S S

POST S S

READ S S S S S

READC S

READE S

READP S S

READPE S

READS S

SETGT S

SETLL S

UNLOCK S

UPDATE S S S S

WRITE S S S S S S

Cuando se utiliza un archivo descrito externamente con ciertas operaciones dearchivo, puede especificarse un nombre de formato de registro, en lugar de unnombre de archivo, en el factor 2. De esta forma, el código de operación deproceso recupera y/o sitúa el archivo en un formato de registro del tipoespecificado según las reglas del código de operación de cálculo utilizado.

Las operaciones WRITE y UPDATE que especifican un nombre de archivo descritopor programa en el factor 2 deben tener un nombre de estructura de datosespecificado en el campo de resultado. Las operaciones CHAIN, READ y READPque especifican un nombre de archivo descrito por programa en el factor 2 puedentener un nombre de estructura de datos especificado en el campo de resultado.Con las operaciones CHAIN, READ y READP, los datos se transfieren directamenteentre el archivo y la estructura de datos, sin procesar las especificaciones deentrada para el archivo. Así pues, no se activan indicadores de campo o deidentificación de registro como resultado de una operación de entrada en unaestructura de datos. Si todas las operaciones de entrada y salida del archivo tienenuna estructura de datos especificada en el campo de resultado, las especificacionesde entrada y salida no son obligatorias.

Si una operación de entrada (CHAIN, READ, READC, READE, READP, READPE)no recupera un registro porque no se ha encontrado ninguno, porque se haproducido un error en la operación o porque ya se recuperó el último registro (findel archivo), entonces no se extraen datos y todos los campos del programapermanecen sin cambios.

Si especifica N como el ampliador de operación de una operación CHAIN, READ,READE, READP o READPE para un archivo de disco de actualización, se lee unregistro sin bloqueo. Si no se especifica ningún ampliador de operación, el registrose bloquea si el archivo es un archivo de disco de actualización.

Para manejar las excepciones y los errores que se producen durante las operacionesde archivos, debe especificarse un indicador de errores o una subrutina de erroresde archivo. De lo contrario, las excepciones y los errores los maneja el gestor deerrores por omisión.

Capítulo 25. Códigos de operación 381

Page 404: RPG Referencia

Nota: Las operaciones de entrada y salida de subprocedimientos que incluyenespecificaciones de entrada y salida siempre utilizan el nombre global,incluso aunque exista una variable local del mismo nombre. Por ejemplo, siel nombre del campo TOTALS está definido en la sección fuente principalademás de en un subprocedimiento, cualquier operación de entrada o salidaen el subprocedimiento utilizará el campo según la definición de la secciónfuente principal.

Consulte el apartado “Soporte de valores nulos de base de datos” en la página 128para obtener información sobre el manejo de archivos con campos con posibilidadde nulos.

Operaciones de establecimiento de indicador

Las operaciones de establecimiento de indicador son las siguientes:v “SETOFF (Desactivar indicador)” en la página 537v “SETON (Activar indicador)” en la página 537

Las operaciones SETON y SETOFF activan o desactivan respectivamente losindicadores especificados en las posiciones 71 a 76. Se debe especificar unindicador resultante como mínimo en estas posiciones.

Vea cada operación para una explicación de su función.

Operaciones de informaciónLas operaciones de información son las siguientes:v “TIME (Hora del día)” en la página 554.

La operación TIME permite el acceso del programa a la hora y a la fecha delsistema en cualquier momento durante la ejecución del programa. La fecha que serecupera puede ser la del sistema local o la de un servidor AS/400.

Operaciones de inicializaciónLas operaciones de inicialización son las siguientes:v “CLEAR (Borrar)” en la página 422v “RESET (Restablecer)” en la página 522

Las operaciones de inicialización proporcionan el borrado y el restablecimiento entiempo de ejecución de todos los elementos de una ventana (componentes decampo de entrada), estructura (formato de registro, estructura de datos, matriz otabla) o de una variable (campo, subcampo o indicador).

Operaciones de gestión de memoriaLas operaciones de gestión de memoria asignan almacenamiento.

Las operaciones de gestión de memoria son las siguientes:v “ALLOC (Asignar almacenamiento)” en la página 395v “DEALLOC (Liberar almacenamiento)” en la página 426v “REALLOC (Reasignar almacenamiento con longitud nueva)” en la página 521

La operación ALLOC asigna el almacenamiento dinámico y establece el punterodel campo del resultado para que señale al almacenamiento. El almacenamiento noestá inicializado.

382 VisualAge RPG Consulta del lenguaje

Page 405: RPG Referencia

La operación REALLOC modifica la longitud del almacenamiento dinámico al queseñala el puntero del campo del resultado. Se asigna almacenamiento nuevo y seinicializa al valor del almacenamiento antiguo. Los datos se truncan si el nuevotamaño es inferior al antiguo. Si el nuevo tamaño es superior al antiguo, elalmacenamiento que sigue a los datos copiados no está inicializado. Elalmacenamiento antiguo se libera. Se establece el puntero del campo del resultadopara que señale al nuevo almacenamiento.

La operación DEALLOC libera el almacenamiento dinámico para el que seestablece el puntero del campo del resultado. Si está especificado el ampliador deoperación (N), el puntero se establece a *NULL después de una desasignaciónsatisfactoria.

El almacenamiento se libera implícitamente al finalizar el grupo de activación. Si seactiva LR, no se liberará ningún almacenamiento dinámico que haya asignado elmódulo, pero se perderán los punteros al almacenamiento dinámico.

Si no se utiliza bien el almacenamiento dinámico, pueden surgir problemas. Elejemplo siguiente ilustra un caso hipotético que se debe evitar:

A continuación se exponen más situaciones problemáticas:v Puede producirse un error parecido si se copia un puntero antes de reasignarse

o desasignarse. Se ha de tener mucho cuidado al copiar punteros aalmacenamiento asignado, asegurándose de que no se utilicen después dedesasignar o reasignar el almacenamiento.

v Si se copia un puntero a un almacenamiento dinámico, puede utilizarse la copiapara desasignar o reasignar el almacenamiento. En este caso, el puntero originalno debe utilizarse hasta establecerlo a un nuevo valor.

v Si un puntero a un almacenamiento dinámico se pasa como un parámetro, elprocedimiento llamado podría desasignar o reasignar el almacenamiento.Después de volver de la llamada, pueden surgir problemas si se intenta accederal almacenamiento mediante el puntero.

v Si se establece un puntero a un almacenamiento dinámico en el *INZSR, unaoperación RESET posterior del puntero puede provocar que éste se establezca aun almacenamiento que ya no esté asignado.

v Puede surgir otro tipo de problema si se pierde un puntero a unalmacenamiento dinámico (porque se ha borrado, por ejemplo, o establecido aun nuevo puntero mediante una operación ALLOC). Una vez perdido elpuntero, no podrá liberarse el almacenamiento al que señalaba. Estealmacenamiento no estará disponible porque no puede liberarse el

D Fld1 S 25A BASED(Ptr1)D Fld2 S 5A BASED(Ptr2)D Ptr1 S *D Ptr2 S *....

C ALLOC 25 Ptr1C DEALLOC Ptr1C* Después de este punto, no debe accederse a Fld1 porque el punteroC* de base Ptr1 ya no señala al almacenamiento asignado.

C CALL 'SOMEPGM'

C* Durante la llamada anterior a 'SOMEPGM', pueden haberse realizadoC* varias asignaciones de almacenamiento. En cualquier caso, esC* extremadamente peligroso realizar la asignación siguiente, ya queC* 25 bytes de almacenamiento se rellenarán con 'a'. Es imposibleC* saber para qué se está utilizando actualmente este almacenamiento.C EVAL Fld1 = *ALL'a'

Capítulo 25. Códigos de operación 383

Page 406: RPG Referencia

almacenamiento al que apuntaba. Este almacenamiento no estará disponible parasu asignación debido a que el sistema no está informado de que elalmacenamiento ya no es direccionable. El almacenamiento se liberará sólocuando finalice el grupo de activación.

Operaciones de mensajeLa operación de mensaje DSPLY visualiza una ventana Mensaje. Si desea másinformación, consulte el apartado “DSPLY (Visualizar ventana de mensaje)” en lapágina 441.

Operaciones MoverLas operaciones Mover son las siguientes:v “MOVE (Mover)” en la página 468v “MOVEA (Mover matriz)” en la página 483v “MOVEL (Mover a la izquierda)” en la página 489

Las operaciones mover transfieren todo o parte del factor 2 al campo de resultado.Si desea una descripción de la forma en que se trasladan los datos, consulte cadaoperación. Si desea obtener una descripción de cómo se trasladan los datos defecha y hora al utilizar MOVE y MOVEL, consulte la sección “Cómo mover losdatos de fecha y hora” en la página 386.

El origen y el destino de la operación mover pueden ser del mismo tipo o de tiposdistintos, pero existen algunas restricciones:v Para los movimientos de puntero, el origen y el destino han de ser del mismo

tipo, los dos punteros de base o los dos punteros de procedimiento.v Cuando se utiliza MOVEA, el origen y el destino deben ser del mismo tipo.v No se permite la operación MOVEA para los campos de fecha, hora o indicación

de la hora.v No se permiten las operaciones MOVE y MOVEL para los campos de coma

flotante o literales.

El factor 2 no se modifica.

Sólo pueden especificarse indicadores resultantes para campos de tipo carácter,gráfico, UCS-2 y de resultado numérico. En las operaciones MOVE y MOVEL no sepermiten los indicadores resultantes si el campo de resultado es una matriz noindexada. En la operación MOVEA no se permiten los indicadores resultantes si elcampo de resultado es una matriz, esté o no indexada.

El expansor de operación P sólo puede especificarse si el campo de resultado es detipo carácter, gráfico, UCS-2 o numérico.

Cómo mover datos de tipo carácter, gráfico, UCS-2 ynumérico

Cuando un campo de caracteres se mueve a un campo del resultado numérico, seconvierte la parte de dígito de cada carácter al carácter numérico correspondientey, a continuación, se mueve al campo del resultado. Los espacios en blanco setransfieren como ceros. Para la operación MOVE, la parte de zona del caráctersituado más a la derecha se convierte al signo correspondiente y se mueve a laposición situada más a la derecha del campo de resultado numérico. Será el signodel campo. Para la operación MOVEL, se convierte la parte de zona del caráctersituado más a la derecha del factor 2 y se utiliza como signo del campo del

384 VisualAge RPG Consulta del lenguaje

Page 407: RPG Referencia

resultado (a no ser que el factor 2 sea más corto que el campo del resultado)independientemente de que el carácter situado más a la derecha intervenga en laoperación.

Si se especifican las operaciones mover entre campos numéricos, se ignoran lasposiciones decimales especificadas para el campo del factor 2. Por ejemplo, si semueve 1,00 a un campo numérico de tres posiciones con una posición decimal, elresultado es 10,0.

El factor 2 puede contener las constantes figurativas *ZEROS para traslados decampos de caracteres o numéricos. Si el usuario desea lograr la misma funciónpara los campos de tipo gráfico, debe codificar *ALLG’xx’ (donde ’xx’ representaceros gráficos).

Cuando se mueven los datos desde un origen de tipo carácter a campos de tipográfico, si el origen es un literal de tipo carácter, constante con nombre o *ALLm,debe tener una longitud par y 2 bytes como mínimo. Si se mueve desde un campode tipo literal hexadecimal o *ALLx a uno de tipo gráfico, el literal hexadecimal (opatrón) debe tener un número par de bytes.

Cuando un campo de caracteres está involucrado en un movimiento desde/haciaun campo de tipo gráfico, el campo de origen debe tener una longitud par y 2bytes como mínimo.

Cuando se utilizan operaciones de mover para convertir datos de tipo carácter aUCS-2 y viceversa, el número de caracteres movidos es variable, ya que los datosde tipo carácter pueden o no contener caracteres gráficos. Por ejemplo, cincocaracteres UCS-2 pueden convertirse a:v Cinco caracteres de un solo bytev Cinco caracteres de byte doblev Una combinación de caracteres de un solo byte y doble

Si los datos resultantes tienen una longitud superior a la del campo de resultado,los datos se truncarán. Si el resultado es un carácter de un solo byte, esresponsabilidad del usuario garantizar que el resultado contenga caracterescompletos.

Si se especifica el ampliador de operación P para una operación mover, el campodel resultado se rellena a partir de la derecha para MOVEL y MOVEA, y a partirde la izquierda para MOVE. Los caracteres de relleno son los siguientes:v Espacio en blanco para carácterv Espacios en blanco de doble byte para gráficov Espacios en blanco UCS-2 para UCS-2v 0 (cero) para numéricov ’0’ para indicador

Se realiza el relleno después de la operación. Si se utiliza MOVE o MOVEL paramover un campo a una matriz, se rellenará cada elemento de la matriz. Si seutilizan estas operaciones para mover una matriz a una matriz y el resultadocontiene más elementos que la matriz del factor 2, tendrá lugar el mismo rellenopero no afectará a los elementos adicionales. Una operación MOVEA con unnombre de matriz en el campo del resultado rellenará el último elemento afectadopor la operación además de todos los elementos ulteriores.

Cuando se especifican indicadores resultantes para operaciones de traslado, elcampo del resultado determina el indicador a activar. Si el campo del resultado es

Capítulo 25. Códigos de operación 385

Page 408: RPG Referencia

un campo de tipo carácter, gráfico o UCS-2, sólo puede especificarse el indicadorresultante en las posiciones 75 y 76. Este indicador se activa si el campo delresultado sólo tiene espacios en blanco. Cuando el campo del resultado esnumérico, se pueden utilizar las tres posiciones del indicador resultante. Estosindicadores se activan de la forma siguiente:

Superior (71-72)Se activa si el campo del resultado es superior a 0.

Inferior (73-74)Se activa si el campo del resultado es inferior a 0.

Igual (75-76)Se activa si el campo del resultado es igual a 0.

Cómo mover los datos de fecha y horaLos códigos de operación MOVE y MOVEL se pueden utilizar para trasladarcampos de tipo de Fecha, Hora e Indicación de la hora.

Para los códigos de operación MOVE y MOVEL, se permiten las combinacionessiguientes:v Fecha a Fecha, Fecha a Indicación de la Hora, Fecha a Caracteres o Numéricov Hora a Hora, Hora a Caracteres o Numérico, Hora a Indicación de la Horav Indicación de la Hora a Indicación de la Hora, Indicación de la Hora a Fecha,

Indicación de la Hora a Hora, Indicación de la Hora a Caracteres o Numéricov Caracteres o Numérico a Fecha, Caracteres o Numérico a Hora, Caracteres o

Numérico a Indicación de la Hora

El factor 1 ha de estar en blanco si tanto el origen como el destino del movimientoson campos de fecha, hora o indicación de la hora. Si el Factor 1 está en blanco, seutiliza el formato del campo Fecha, Hora o Indicación de la hora.

De lo contrario, el factor 1 contiene el formato de fecha o de hora compatible conel campo numérico o de caracteres que es el origen o el destino de la operación.Puede especificarse cualquier formato válido. Consulte las secciones “Datos defecha” en la página 112, “Datos de hora” en la página 126 y “Datos de indicaciónde la hora” en la página 128.

Recuerde lo siguiente cuando especifique el factor 1:v No se permite el formato de hora *USA para el movimiento entre los campos de

hora y los numéricos.v En el factor 1 se permiten los formatos *LONGJUL, *CYMD, *CMDY y *CDMY.

(Para obtener más información, consulte el apartado Tabla 17 en la página 113.)v Un cero (0) especificado al final de un formato (por ejemplo *MDY0), indica que

el campo de caracteres no contiene separadores.v Un formato de año de dos dígitos ( *MDY, *DMY, *YMD y *JUL) sólo puede

representar fechas comprendidas entre 1940 y 2039. Un formato de fecha de 3dígitos (*CYMD, *CMDY, *CDMY) sólo puede representar fechas comprendidasentre 1900 y 2899. Se emitirá un error si se solicita la conversión a un formato deaño de 2 ó 3 dígitos para fechas no comprendidas en este intervalo.

v Cuando se utilizan MOVE y MOVEL para mover valores numéricos o decaracteres a o desde una indicación de la hora, se supone que el valor numéricoo de caracteres contiene una indicación de la hora.

El Factor 2 es obligatorio y debe ser un valor de caracteres, numérico, de fecha,hora o indicación de la hora. El factor contiene el campo, la matriz, el elemento dematriz, el nombre de tabla, el literal o la constante con nombre a convertir.

386 VisualAge RPG Consulta del lenguaje

Page 409: RPG Referencia

Las reglas siguientes aplican al factor 2:v Los caracteres separadores deben ser válidos para el formato especificado.v Si el factor 2 no es una representación válida de una fecha o de una hora, o si su

formato no coincide con el formato especificado en el factor 1, se genera unerror.

v Si el factor 2 contiene UDATE o *DATE, el factor 1 es opcional y se correspondecon la palabra clave DATEDIT de las especificaciones de cabecera.

v Si el factor 2 contiene UDATE y la entrada del factor 1 está codificada, debetener un formato de fecha con un año de 2 dígitos. Si el factor 2 contiene *DATEy el factor 1 está codificado, debe tener un formato de fecha con un año de 4dígitos.

El campo del resultado debe ser una variable de fecha, hora, indicación de la hora,numérica o de caracteres. Puede ser un campo, una matriz, un elemento de matrizo un nombre de tabla. La fecha o la hora se sitúan en el campo del resultado segúnel formato definido en éste o según el código de formato especificado en el factor1. Si el campo del resultado es numérico, se eliminarán los caracteres separadoresantes de la operación. La longitud es la longitud después de eliminar los caracteresseparadores.

Cuando se mueve desde un campo de fecha a un campo de indicación de la hora,la hora y la parte de microsegundos de la indicación de la hora no se venafectadas, aunque se comprueba la indicación de la hora entera y se generará unmensaje de error si no es válida.

Al trasladarse desde un campo de hora a un campo de indicación de la hora, laparte de microsegundos de la indicación de la hora se establecerá en 000000. Laparte de fecha no se ve afectada, pero se comprueba la indicación de la hora enteray se generará un error cuando no sea válida.

Si los datos de caracteres o numéricos son más largos de lo necesario, sólo seutilizarán los datos situados más a la izquierda (más a la derecha para la operaciónMOVE). Recuerde que el factor 1 determina la longitud de los datos a mover. Porejemplo, si el formato del factor 1 es *MDY para una operación MOVE desde unafecha numérica, sólo se utilizarán los 6 dígitos situados más a la derecha del factor2.

Sólo puede especificarse el ampliador de operación P si el resultado es de tipocarácter o numérico.

Ejemplos de conversión de un campo de caracteres en uncampo de fecha

La Figura 166 en la página 388 muestra algunos ejemplos de cómo definir y moverfechas con años de 2 y 4 dígitos entre campos de fecha o entre campos decaracteres y fecha.

Capítulo 25. Códigos de operación 387

Page 410: RPG Referencia

* Definir campos de caracteres de 8 bytes.D CHR_8a s 8a inz('95/05/21')D CHR_8b s 8a inz('abcdefgh')** Definir dos campos de fecha de 8 bytes. Para tener un año de 2* dígitos en lugar de 4 (formato *ISO), se definen con un formato* de fecha con años de 2 dígitos, *YMD. Para D_8a, también se* especifica un separador (.). El formato del literal de fecha* especificado con la palabra clave INZ debe ser el mismo que el* especificado en la especificación de control *. En este caso, no* se especifica ninguno, por lo que toma por omisión *ISO.*

D D_8a s d datfmt(*ymd.)D D_8b s d inz(d'1995-07-31') datfmt(*ymd)** Definir un campo de fecha de 10 bytes. Por omisión tiene formato *ISO

D D_10 s d inz(d'1994-06-10')** Mover el campo de 8 caracteres al campo de fecha D_10.* Contendrá la fecha inicializada en CHR_8a, pero con un año* de cuatro dígitos y el formato de D_10, es decir,* 1995-05-21 (formato *ISO).** Un formato debe especificarse en el factor 1 para indicar el* formato del campo de caracteres.*

C *YMD MOVE CHR_8a D_10*

Figura 166. Utilización de MOVE con campos de caracteres y fecha (Pieza 1 de 2)

** Mover la fecha de 10 caracteres al campo CHR_8b de 8 caracteres.* Contendrá la fecha que acaba de pasarse a D_10, pero con un año* de 2 dígitos y el separador por omisión indicado por el formato* *YMD del factor 1.*

C *YMD MOVE D_10 CHR_8b** Mover la fecha de 10 caracteres al campo de fecha D_8a de 8.* Contendrá la fecha que acaba de pasarse a D_10, pero con un* año de 2 dígitos y un separador ., ya que se ha definido D_8a* con el formato *YMD.*

C MOVE D_10 D_8a** Mover la fecha de 8 caracteres a la fecha D_10 de 10.* Contendrá la fecha incializada en D_8b, pero con un año* de 4 dígitos, 1995-07-31.*

C MOVE D_8b D_10** Tras el último movimiento, los campos contendrán* D_10: 1995-05-21* CHR_8b: 95/05/21* D_8a: 95.05.21* D_10: 1995-07-31*

C SETON LR

Figura 166. Utilización de MOVE con campos de caracteres y fecha (Pieza 2 de 2)

388 VisualAge RPG Consulta del lenguaje

Page 411: RPG Referencia

El siguiente ejemplo muestra cómo convertir un campo de caracteres con elformato CYYMMDD a un campo de fecha con el formato *ISO. Esto esparticularmente útil cuando se utilizan parámetros de mandato de tipo *DATE.

Operaciones de serieLas operaciones de serie son las siguientes:v “CAT (Concatenar dos series)” en la página 411v “CHECK (Comprobar caracteres)” en la página 417v “CHECKR (Comprobación inversa)” en la página 419v “SCAN (Buscar serie)” en la página 527v “SUBST (Subserie)” en la página 546v “XLATE (Convertir)” en la página 564

Las operaciones de serie incluyen concatenación, búsqueda, subserie, conversión yverificación. Las operaciones de serie sólo se pueden utilizar en campos de tipocarácter, gráfico o UCS-2.

Nota:v Las series se indexan a partir de la posición 1.v No se pueden utilizar constantes figurativas en el factor 1, en el factor 2

ni en los campos de resultado.v No se permite solapado en una estructura de datos para el factor 1 y el

campo del resultado o para el factor 2 y el campo del resultado.

Cuando se utilizan operaciones de serie en campos de tipo gráfico, todos los datosdel factor 1, del factor 2 y del campo del resultado deben ser gráficos. Cuando seespecifican valores numéricos para la longitud, la posición inicial y el número deespacios en blanco para caracteres gráficos, los valores representan caracteres dedoble byte.

Cuando se utilizan operaciones de serie en campos de tipo UCS-2, todos los datosdel factor 1, del factor 2 y del campo del resultado deben ser UCS-2. Cuando se

CMD PROMPT('Utilizar parámetro DATE')PARM KWD(DATE) TYPE(*DATE)

Figura 167. Fuente para un mandato que utilice un parámetro de fecha.

DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++*----------------------------------------------------------* Declarar un tipo de datos con el formato de fecha *ISO.*----------------------------------------------------------

D ISO_DATE S D DATFMT(*ISO)CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq..*

C *ENTRY PLISTC PARM DateParm 7*----------------------------------------------------------* El formato del parámetro DATE es CYYMMDD, por lo que se codifica* *CYMD0 en el factor 1. Se utiliza MOVE para convertir la fecha* de un valor de caracteres a una fecha *ISO.*----------------------------------------------------------

C *CYMD0 MOVE DATEPARM ISO_DATE

Figura 168. Fragmento del programa de proceso de mandato RPG IV para este mandato.

Capítulo 25. Códigos de operación 389

Page 412: RPG Referencia

especifican valores numéricos para la longitud, la posición inicial y el número deespacios en blanco para caracteres UCS-2, los valores representan caracteres dedoble byte.

Cuando se utilizan operaciones de serie en la parte de gráfico de los datos decaracteres de modalidad mixta, la posición inicial, la longitud y el número deespacios en blanco representan caracteres de un byte.

Nota: Es responsabilidad del usuario conservar la integridad de los datos.

Operaciones de programación estructuradasLas operaciones de programación estructuradas son las siguientes:v “ANDxx (Y)” en la página 396v “DO (Hacer)” en la página 433v “DOUxx (Hacer hasta)” en la página 436v “DOWxx (Hacer mientras)” en la página 439v “ELSE (En caso contrario)” en la página 442v “ENDyy (Finalizar un grupo estructurado)” en la página 443v “FOR (Para)” en la página 453v “IF (Si)” en la página 457v “IFxx (Si)” en la página 458v “ITER (Iterar)” en la página 461v “LEAVE (Abandonar un grupo DO/FOR)” en la página 464v “ORxx (O)” en la página 503v “OTHER (De lo contrario, seleccionar)” en la página 504v “SELECT (Iniciar un grupo de selección)” en la página 530v “WHEN (Seleccionar cuando sea verdadero)” en la página 558v “WHENxx (Seleccionar cuando sea verdadero)” en la página 559

Las normas para llevar a cabo la comparación en los códigos de operación ANDxx,DOUxx, DOWxx, IFxx, ORxx y WHENxx son las mismas que las que seproporcionan en “Operaciones de comparación” en la página 375.

En las operaciones ANDxx, DOUxx, DOWxx, IFxx, ORxx y WHENxx, xx puedeser:

xx Significado

GT El factor 1 es mayor que el factor 2.

LT El factor 1 es menor que el factor 2.

EQ El factor 1 es igual que el factor 2.

NE El factor 1 no es igual que el factor 2.

GE El factor 1 es mayor o igual que el factor 2.

LE El factor 1 es menor o igual que el factor 2.

En la operación ENDyy, yy puede ser:

yy Significado

CS Fin de la operación CASxx.

DO Fin de la operación DO, DOUxx y DOWxx.

FOR Fin de la operación FOR.

IF Fin de la operación IFxx.

390 VisualAge RPG Consulta del lenguaje

Page 413: RPG Referencia

SL Fin de la operación SELECT.

BlancosFin de cualquier operación estructurada.

Nota: En la operación ENDyy, yy es opcional.

Si un grupo estructurado, en este caso un grupo hacer, contiene otro grupoestructurado completo, juntos forman un grupo estructurado jerarquizado. Losgrupos estructurados se pueden jerarquizar hasta una profundidad máxima de 10niveles. A continuación se proporciona un ejemplo de grupos estructuradosjerarquizados con una profundidad de tres niveles:

Recuerde lo siguiente al especificar grupos estructurados:v Cada grupo estructurado jerarquizado debe estar completamente contenido

dentro del grupo estructurado de nivel superior.v Cada grupo estructurado debe contener una de las operaciones DO, DOUxx,

DOWxx, FOR, IFxx o SELECT y su operación ENDyy asociada.v La bifurcación de un grupo estructurado externo al mismo puede provocar

resultados no deseables.

Operaciones de subrutinaLas operaciones de subrutina son las siguientes:v “BEGACT (Empezar subrutina de acción)” en la página 397v “ENDACT (Fin de subrutina de acción)” en la página 444v “BEGSR (Empezar subrutina de usuario)” en la página 400v “ENDSR (Fin de subrutina de usuario)” en la página 445v “EXSR (Invocar subrutina de usuario)” en la página 449v “CASxx (Invocar subrutina condicionalmente)” en la página 409v “LEAVESR (Abandonar una subrutina)” en la página 465

Una subrutina es un grupo de especificaciones de cálculo en un programa quepuede procesarse varias veces en dicho programa.

Las especificaciones de subrutina deben ir a continuación de todas las demásoperaciones de cálculo que se puedan procesar para un programa; sin embargo, lasoperaciones PLIST, PARM, KLIST, KFLD y DEFINE pueden especificarse entre unaoperación ENDSR (el fin de una subrutina) y una operación BEGSR (el principiode otra subrutina) o después de todas las subrutinas. Se puede llamar a unasubrutina utilizando una operación EXSR o CASxx en cualquier lugar de lasespecificaciones de cálculo. Las líneas de subrutina pueden identificarse por SR enlas posiciones 7 y 8. Las únicas entradas válidas en las posiciones 7 y 8 de unalínea de subrutina son SR, AN, OR o blancos.

DODOENDDOIFxxSELECTWHENxxENDSLELSEENDIFENDDO

Capítulo 25. Códigos de operación 391

Page 414: RPG Referencia

Para obtener información acerca de cómo codificar una subrutina, vea“Codificación de subrutinas de usuario” en la página 450.

Operaciones de comprobaciónLas operaciones de comprobación son las siguientes:v “TEST (Comprobar fecha/hora/indicación de la hora)” en la página 549v “TESTB (Comprobar bit)” en la página 551v “TESTN (Comprobar numérico)” en la página 553v “TESTZ (Comprobar zona)” en la página 554

El resultado de estas operaciones se indica mediante los indicadores resultantes.

Operaciones de GUILas operaciones de VisualAge RPG son las siguientes:v “BEGACT (Empezar subrutina de acción)” en la página 397v “CLSWIN (Cerrar ventana)” en la página 424v “DSPLY (Visualizar ventana de mensaje)” en la página 441v “ENDACT (Fin de subrutina de acción)” en la página 444v “GETATR (Recuperar atributo)” en la página 455v “READS (Leer seleccionados)” en la página 520v “SETATR (Establecer atributo)” en la página 531v “SHOWWIN (Visualizar ventana)” en la página 538v “START (Iniciar un componente lógico o Llamar a programa local)” en la

página 541v “STOP (Detener un componente lógico)” en la página 542

Las operaciones de VisualAge RPG operan en la interfaz de usuario de laaplicación (por ejemplo, SHOWWIN) o en componentes de la operación (porejemplo, STOP). Vea cada operación para una explicación de su función.

Los detalles de los códigos de operaciónEn las siguientes secciones se describe detalladamente cada código de operación.

ADD (Añadir)

Código Factor 1 Factor 2Campo deresultado Indicadores

ADD (H) Sumando Sumando Suma + − Z

Si se especifica el factor 1, la operación ADD lo suma al factor 2 y coloca elresultado en el campo del resultado. Si no se especifica el factor 1, el contenido delfactor 2 se suma al campo del resultado y la suma se coloca en el campo delresultado.

El factor 1 y el factor 2 deben ser numéricos y pueden contener uno de lossiguientes: una matriz, un elemento de matriz, una constante, un nombre decampo, un literal, un subcampo o un nombre de tabla.

En el apartado “Operaciones aritméticas” en la página 367 se describen las normasgenerales para la especificación de operaciones aritméticas.

392 VisualAge RPG Consulta del lenguaje

Page 415: RPG Referencia

ADDDUR (Añadir duración)

Código Factor 1 Factor 2Campo deresultado Indicadores

ADDDUR(E)

Fecha/Hora Duración:Código deduración

Fecha/Hora _ ER _

La operación ADDDUR añade la duración especificada en el factor 2 a una fecha uhora y coloca en el campo del resultado la Fecha, Hora o Indicación de la Horaresultante.

Si se especifica el factor 1, debe contener un campo, subcampo, matriz, elementode matriz, literal o constante de Fecha, Hora o Indicación de la Hora.

Si el factor 1 contiene un nombre de campo, una matriz o un elemento de matriz,su tipo de datos debe ser el mismo tipo de datos del campo especificado en elcampo del resultado. Si no se especifica el factor 1, la duración se añade al campoespecificado en el campo del resultado.

El factor 2 debe contener dos subfactores. El primero es una duración y puede serun campo, un elemento de matriz o una constante numérica con cero posicionesdecimales. Si la duración es negativa, se resta de la fecha. El segundo subfactordebe ser un código de duración válido que indique el tipo de duración. El códigode duración debe ser coherente con el tipo de datos del campo de resultado. Sepuede añadir un año, un mes o un día a un campo de fecha. No se puede añadiruna duración de un minuto a un campo de fecha. “Operaciones de fecha” en lapágina 377 describe los códigos de duración.

El campo de resultado debe ser un campo, matriz o elemento de matriz del tipo dedatos de fecha, hora o indicación de la hora. Si el factor 1 se encuentra en blanco,la duración se añade al valor del campo de resultado. Si el campo del resultado esuna matriz, el valor del factor 2 se añade a cada elemento de la matriz. Si el campodel resultado es un campo de hora, el resultado siempre será una hora válida. Porejemplo, añadir 59 minutos a 23:59:59 da 24:58:59. Como esta hora no es válida, elcompilador la ajusta a 00:59:59.

Cuando a una fecha se le añade una duración expresada en meses, la regla generales que la parte de mes se incrementa en el número de meses de la duración y laparte de día no se modifica. La excepción a esta regla es cuando la parte de díaresultante sobrepasa el número real de días del mes resultante. En este caso, laparte de día resultante se ajusta a la fecha real del fin de mes. Los ejemplossiguientes (que presuponen un formato *YMD) ilustran este punto.

*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* Se suma el valor 1 a RECNO.C ADD 1 RECNOC* Se suma el contenido de EHWRK y CURHRS.C ADD EHWRK CURHRSC* Los contenidos de OVRTM y REGHRS se suman y colocan juntosC* en TOTPAY.C OVRTM ADD REGHRS TOTPAY

Figura 169. Operación ADD

Capítulo 25. Códigos de operación 393

Page 416: RPG Referencia

'98/05/30' ADDDUR 1:*MONTH da como resultado '98/06/30'

La parte de mes resultante se ha incrementado en 1; la parte de día no se hamodificado.

'98/05/31' ADDDUR 1:*MONTH da como resultado '98/06/30'

La parte de mes resultante se ha incrementado en 1; la parte de día resultante seha ajustado porque el mes de junio sólo tiene 30 días.

Se producen resultados parecidos cuando se añade la duración de un año. Porejemplo, si añadimos un año a ’92/02/29’ obtenemos ’93/02/28’, ajustando el valorporque el año resultante no es bisiesto.

Si desea obtener más información, consulte la sección “Operaciones de gestión dememoria” en la página 382.

Se produce un error cuando se da una de las condiciones siguientes:v El valor del campo Fecha, Hora o Indicación de la hora en el factor 1 no es

válidov El factor 1 está en blanco y el valor del campo de resultado antes de la

operación no es válidov Se ha producido un desbordamiento o un subdesbordamiento (es decir, el valor

resultante es mayor que *HIVAL o menor que *LOVAL).

En una situación de error,v Se señala un error (código de estado 112 ó 113).v Se activa el indicador de error (columnas 73-74), si se ha especificado, o se

establece que la función incorporada %ERROR devuelva ’1’, si se ha especificadoel ampliador ’E’.

v El valor del campo de resultado permanece inalterado.

Para manejar las excepciones con los códigos de estado de programa 112 ó 113,puede especificarse el ampliador de código de operación ’E’ o un indicador deerror ER, pero no ambos. Para obtener más información sobre la gestión de errores,consulte el apartado “Excepciones y errores de programa” en la página 48.

El sistema establece un límite de 15 dígitos para las duraciones. Añadir unaduración con más de 15 dígitos significativos provocará un error o untruncamiento. Esto se puede evitar limitando el primer subfactor del Factor 2 a 15dígitos.

394 VisualAge RPG Consulta del lenguaje

Page 417: RPG Referencia

ALLOC (Asignar almacenamiento)

Código Factor 1 Factor 2 Campo deresultado

Indicadores

ALLOC (E) Longitud Puntero _ ER _

La operación ALLOC asigna almacenamiento en el área de almacenamientodinámico por omisión de la longitud especificada en el factor 2. El puntero delcampo del resultado se establece para que señale al nuevo almacenamientodinámico. El almacenamiento no está inicializado.

El factor 2 debe ser numérico con cero posiciones decimales. Puede ser un literal,constante, campo autónomo, subcampo, nombre de tabla o elemento de matriz. Elvalor ha de estar comprendido entre 1 y 16776704. Si el valor no pertenece a esteintervalo en tiempo de ejecución, se producirá un error con el estado 00425. Si nose ha podido asignar el almacenamiento, se producirá un error con el estado 426.Si se producen estos errores, el puntero del campo de resultado permaneceráinalterado.

*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....HKeywords+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++H TIMFMT(*USA) DATFMT(*MDY&)DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++D*DDateconst C CONST(D'12 31 92')D*D* Define e inicializa un campo de FechaD*DLoandate S D DATFMT(*EUR) INZ(D'12 31 92')DDuedate S D DATFMT(*ISO)Dtimestamp S ZDanswer S T

CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....

C* Determina DUEDATE que es xx años, yy meses, zz días más tardeC* que LOANDATE.C LOANDATE ADDDUR XX:*YEARS DUEDATEC ADDDUR YY:*MONTHS DUEDATEC ADDDUR ZZ:*DAYS DUEDATEC* Determina la fecha 23 días más tardeC*C ADDDUR 23:*D DUEDATE

C* Añade 1234 microsegundos a una indicación de la horaC*C ADDDUR 1234:*MS timestamp

C* Añade 12 HRS y 16 minutos a la medianocheC*C T'00:00 am' ADDDUR 12:*Hours answerC ADDDUR 16:*Minutes answer

C* Resta 30 días a la fecha de vencimiento de un préstamoC*C ADDDUR -30:*D LOANDUE

Figura 170. Operación ADDDUR

Capítulo 25. Códigos de operación 395

Page 418: RPG Referencia

El campo del resultado debe ser una variable escalar de puntero de base (uncampo autónomo, subcampo de estructura de datos, nombre de tabla o elementode matriz).

Para manejar las excepciones con los códigos de estado del programa 425 ó 426,puede especificarse el ampliador de código de operación ’E’ o un indicador deerror ER, pero no ambos. Para obtener más información sobre la gestión de errores,consulte el apartado “Excepciones y errores de programa” en la página 48.

Si desea obtener más información, consulte la sección “Operaciones de gestión dememoria” en la página 382.

ANDxx (Y)

Código Factor 1 Factor 2Campo deresultado Indicadores

ANDxx Comparando Comparando

La operación ANDxx debe ir inmediatamente después de una de las siguientesoperaciones:v ANDxxv DOUxxv DOWxxv IFxxv ORxxv WHENxx

Con ANDxx, puede especificar una condición compleja para las operacionesDOUxx, DOWxx, IFxx y WHENxx. La operación ANDxx tiene prioridad sobre laoperación ORxx. Consulte la Figura 173 en la página 397 para ver un ejemplo.

El factor 1 y el factor 2 deben contener un literal, una constante con nombre, unaconstante figurativa, un nombre de tabla, un elemento de matriz, un nombre deestructura de datos o un nombre de campo. El factor 1 y el factor 2 deben ser delmismo tipo. Por ejemplo, un campo de caracteres no puede compararse con unnumérico. La comparación de los factores 1 y 2 sigue las mismas normas dadaspara las operaciones de comparación.

D Ptr1 S *D Ptr2 S *

C ALLOC 7 Ptr1* Ahora el Ptr1 señala a 7 bytes de almacenamiento

C ALLOC (E) 12345678 Ptr2

* Ésta es una gran cantidad de almacenamiento y puede no estar disponible* algunas veces. Si no ha podido asignarse el almacenamiento,* %ERROR devolverá '1', el estado del programa se establece en* 00426 y %STATUS devolverá 00426.

Figura 171. Operación ALLOC

396 VisualAge RPG Consulta del lenguaje

Page 419: RPG Referencia

“Operaciones de comparación” en la página 375 y “Operaciones de programaciónestructuradas” en la página 390 describen las normas para la especificación de laoperación ANDxx.

BEGACT (Empezar subrutina de acción)

Código Factor 1 Factor 2Campo deresultado Indicadores

BEGACT Nombre decomponente

Nombre de evento Nombre deventana

La operación BEGACT define el inicio de una subrutina de acción. Cuando seproduce un evento para un componente, se llama a la subrutina de acción.

El factor 1 contiene el nombre del componente. El factor 2 contiene el nombre delevento. El campo de resultado contiene el nombre de la ventana que contiene elcomponente.

*...1....+....2....+....3....+....4....+....5....+....6....+....7...CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* Si ACODE es igual a A y el indicador 50 está activado, se procesanC* las operaciones MOVE y WRITE.C ACODE IFEQ 'A'C *IN50 ANDEQ *ONC MOVE 'A' ACRECC WRITE RCRSNC* Si no se dieron las condiciones anteriores pero ACODE es igual a A,C* el indicador 50 está desactivado, y ACREC es igual a D, se procesaC* la operación MOVE siguiente.C ELSEC ACODE IFEQ 'A'C *IN50 ANDEQ *OFFC ACREC ANDEQ 'D'C MOVE 'A' ACRECC ENDIFC ENDIF

Figura 172. Operación ANDxx

*...1....+....2....+....3....+....4....+....5....+....6....+....7...CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* En el ejemplo siguiente, el indicador 25 se activará sólo si lasC* dos primeras condiciones se cumplen o si se cumple la terceraC* condición.C*C* Como expresión, se escribiría:C* EVAL *IN25 = ((FIELDA > FIELDB) AND (FIELDA >= FIELDC)) OR (FIELDA < FIELDD)C*C*C FIELDA IFGT FIELDBC FIELDA ANDGE FIELDCC FIELDA ORLT FIELDDC SETON 25C ELSEC SETOFF 25C ENDIF

Figura 173. Ejemplo de la prioridad de AND/OR

Capítulo 25. Códigos de operación 397

Page 420: RPG Referencia

Se utiliza el Diseñador GUI para crear la subrutina de acción y para enlazar lasubrutina de acción con al menos una combinación ventana/componente/evento.El nombre de la subrutina de acción se crea utilizando el factor 1, factor 2 y elcampo de resultado. Cada entrada está separada de las otras por un carácter más(+). La tabla siguiente muestra ejemplos de enlaces creados utilizando el DiseñadorGUI:

Tabla 39. Subrutinas de acción de único enlace y de múltiples enlaces

Ventana Componente Evento Subrutina de acción

INVENTORY PSB0001 PRESS PSB0001+PRESS+INVENTORY

INVENTORY PSB0004 PRESS SETCOLORS

INVENTORY PSB0005 PRESS PSB0005+PRESS+INVENTORY

ADDPART PSB0008 PRESS SETCOLORS

INVENTORY PSB0002 PRESS PSB0002++INVENTORY

INVENTORY PSB0002 MOUSEMOVE PSB0002++INVENTORY

ADDPART PSB0009 MOUSEMOVE PSB0009+MOUSEMOVE

Los siguientes ejemplos ilustran cómo se crea un nombre de subrutina de acciónmediante la información descrita en la Tabla 39.

Nombres de la subrutina de acción mediante el factor 1 y elfactor 2Si el factor 1 contiene PSB0009, el factor 2 contiene MOUSEMOVE y el campo deresultado no contiene ninguna entrada, el nombre de subrutina de acción esPSB0009+MOUSEMOVE.

Nombres de la subrutina de acción mediante el factor 1 y elcampo del resultadoSi el factor 1 contiene PSB0002, el factor 2 no contiene ninguna entrada y el campode resultado contiene INVENTORY, el nombre de la subrutina de acción esPSB0002++INVENTORY.

Nombres de la subrutina de acción mediante el factor 1, el factor2 y el campo del resultadoSi el factor 1 contiene PSB0001, el factor 2 contiene PRESS y el campo de resultadocontiene INVENTORY, el nombre de subrutina de acción esPSB0001+PRESS+INVENTORY.

CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....CSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++++++C PSB0009 BEGACT MOUSEMOVE

Figura 174. Nombre de la subrutina de acción - Factor 1 y factor 2

CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....CSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++++++C PSB0002 BEGACT INVENTORY

Figura 175. Nombre de la subrutina de acción - Factor 1 y campo del resultado

398 VisualAge RPG Consulta del lenguaje

Page 421: RPG Referencia

Nombres de la subrutina de acción mediante el factor 1Si el factor 1 contiene SETCOLORS y ni el factor 2 ni el campo del resultadocontienen entradas, el nombre de la subrutina de acción es SETCOLORS. Estenombre se utiliza para recuperar información sobre la(s) ventana(s), componente(s)y evento(s) enlazado(s) con la subrutina de acción SETCOLORS.

Subrutinas de acción de único enlace y de múltiples enlacesLas subrutinas de acción que sólo están enlazadas a una combinación deventana/componente/evento se denominan subrutinas de acción de único enlace.

Las subrutinas de acción que están enlazadas a más de una combinación deventana/componente/evento se denominan subrutinas de acción de múltiplesenlaces.

Nota: Todas las subrutinas del usuario se consideran subrutinas de acción demúltiples enlaces. En la ejecución, la ventana o evento por omisión para lassubrutinas de usuario son la ventana o evento por omisión de la subrutinade acción que llama a la subrutina de usuario, directamente o a través deotras subrutinas de usuario.

La Tabla 39 en la página 398 ilustra las subrutinas de acción de único enlace y demúltiples enlaces. Por ejemplo, los elementos 1, 3 y 7 son subrutinas de acción deúnico enlace. Los elementos 2 y 4 y los elementos 5 y 6 son subrutinas de acciónde múltiples enlaces.

Utilice las siguientes directrices cuando trabaje con subrutinas de acción:v Los nombres duplicados de subrutinas de acción no están permitidos. El

programa no puede contener nombres duplicados de subrutinas de acción. Si elfactor 1 es la única entrada para la operación BEGACT, no puede ser igual aningún nombre de campo, a ningún nombre de subrutina de usuario ni alnombre de ninguna otra construcción del programa.

v Las subrutinas de acción sin ningún evento asociado no se ejecutan nunca. Estopuede producirse si se elimina el enlace de acción utilizando el Diseñador GUI.

Se utiliza el Diseñador GUI para crear subrutinas de acción y para enlazar lassubrutinas de acción con al menos una combinación ventana/componente/evento.Cuando se compila una subrutina de acción, el compilador hace referencia a losenlaces que se han creado utilizando el Diseñador GUI. Se pueden utilizar losnombres de subrutinas de acción creados por el Diseñador GUI o se puedensustituir dichos nombres por otros. Para obtener más información sobre cómo

CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....CSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++++++C PSB0001 BEGACT PRESS INVENTORYC PSB0005 BEGACT PRESS INVENTORY

Figura 176. Nombre de la subrutina de acción - Factor 1, factor 2 y campo del resultado

CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....CSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++++++C SETCOLORS BEGACT

Figura 177. Nombre de la acción de subrutina - Factor 1

Capítulo 25. Códigos de operación 399

Page 422: RPG Referencia

utilizar el Diseñador GUI para crear y enlazar subrutinas de acción, consulte lapublicación Iniciación a VisualAge RPG y CODE/400.

BEGSR (Empezar subrutina de usuario)

Código Factor 1 Factor 2Campo deresultado Indicadores

BEGSR Nombre desubrutina

La operación BEGSR identifica el inicio de una subrutina de usuario.

El factor 1 debe contener una nombre simbólico exclusivo o una de las palabrasclave siguientes: *TERMSR, *PSSR o *INZSR. Si especifica un nombre de subrutina,debe especificar el mismo nombre en el factor 2 de la operación EXSR que hacereferencia a la subrutina o en el campo del resultado de la operación CASxx quehace referencia a la subrutina.

Si especifica una palabra clave, sólo se puede definir una subrutina mediante estaspalabras clave:v *TERMSR especifica una subrutina que se ha de ejecutar durante la terminación

normal.v *PSSR especifica que es una subrutina de excepción/error del programa para

manejar excepciones/errores detectados en el programa.v *INZSR especifica una subrutina que se ha de ejecutar durante la inicialización.

“EXSR (Invocar subrutina de usuario)” en la página 449 describe cómo invocarsubrutinas.

Nota: Cuando haga referencia a los componentes de una subrutina, tenga encuenta lo siguiente: Todas las subrutinas de usuario se consideran subrutinasde acción de múltiples enlaces. En la ejecución, la ventana o evento poromisión para las subrutinas de usuario son la ventana o evento por omisiónde la subrutina de acción que llama a la subrutina de usuario, directamenteo a través de otras subrutinas de usuario.

BITOFF (Desactivar los bits)

Código Factor 1 Factor 2Campo deresultado Indicadores

BITOFF Números de bit Campo decaracteres

La operación BITOFF hace que se desactiven los bits identificados en el factor 2 (seestablecen a 0) en el campo de resultado. Los bits no identificados en el factor 2

*...1....+....2....+....3....+....4....+....5....+....6....+....7...CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq...C Extended-factor2++++++++++++++++++++++++++++C*C *TERMSR BEGSRC .C .C .C ENDSR

Figura 178. Operación Empezar subrutina de usuario

400 VisualAge RPG Consulta del lenguaje

Page 423: RPG Referencia

permanecen inalterados. Cuando se utiliza BITOFF para dar formato a un carácter,debe utilizarse tanto BITON como BITOFF: BITON especifica los bits que se hande activar (establecer en 1) y BITOFF especifica los bits que se han de desactivar(establecer en 0). Si no se activan o desactivan explícitamente todos los bits delcarácter, es posible que no se obtenga el carácter que se desea.

El factor 2 puede contener:v Números de bit 0-7: Pueden desactivarse de 1 a 8 bits por operación. Se

identifican por los números del 0 al 7 (0 es el bit situado más a la izquierda).Encierre los números de bit entre apóstrofes. Por ejemplo, para desactivar losbits 0, 2 y 5, entre ‘025’ en el factor 2.

v Nombre de campo: Especifique en el factor 2 el nombre de un campo, un elementode tabla o un elemento de matriz de caracteres de una posición. Los bits que seencuentran activados en el campo, elemento de tabla o elemento de matriz, sedesactivan en el campo del resultado; los bits que se encuentran desactivados noafectan al resultado.

v Literal o constante con nombre hexadecimal: Especifique un literal o constante connombre hexadecimal de 1 byte. Los bits que se encuentran activos en el factor 2se desactivan en el campo de resultado; los bits que se encuentran desactivadosno quedan afectados.

v Constante con nombre: Especifique una constante de caracteres con nombre, de unmáximo de ocho posiciones de longitud, que contenga los números de bit que sehan de desactivar.

En el campo de resultado, especifique un campo de caracteres de una posición.Puede ser un elemento de matriz si todos los elementos de la matriz son camposde caracteres de una posición.

Vea en la Figura 179 en la página 402 un ejemplo de operaciones BITOFF y BITON.

Si desea asignar un patrón de bit en particular a un campo de caracteres, utilice laoperación MOVE con un literal hexadecimal en el factor 2.

BITON (Activar los bits)

Código Factor 1 Factor 2Campo deresultado Indicadores

BITON Números de bit Campo decaracteres

La operación BITON hace que se activen los bits identificados en el factor 2 (seestablecen a 1) en el campo de resultado. Los bits no identificados en el factor 2permanecen inalterados. Cuando se utiliza BITON para dar formato a un carácter,debe utilizarse tanto BITON como BITOFF:: BITON especifica los bits que se hande activar (establecer en 1) y BITOFF especifica los bits que se han de desactivar(establecer en 0). A menos de que active o desactive explícitamente todos los bitsen el carácter, puede que no obtenga el carácter deseado.

El factor 2 puede contener:v Números de bit 0-7: Pueden activarse de 1 a 8 bits por operación. Se identifican

por los números del 0 al 7 (0 es el bit situado más a la izquierda). Encierre losnúmeros de bit entre apóstrofes. Por ejemplo, para activar los bits 0, 2 y 5, entre‘025’ en el factor 2.

v Nombre de campo: Puede especificar en el factor 2 el nombre de un campo, unelemento de tabla o un elemento de matriz de caracteres de una posición. Los

Capítulo 25. Códigos de operación 401

Page 424: RPG Referencia

bits que se encuentran activados en el campo, elemento de tabla o elemento dematriz, se activan en el campo del resultado; los bits que se encuentrandesactivados no quedan afectados.

v Literal o constante con nombre hexadecimal: Puede especificar un literal hexadecimalde 1 byte. Los bits que se encuentran activos en el factor 2 se activan en elcampo de resultado; los bits que se encuentran desactivados no afectan alresultado.

v Constante con nombre: Puede especificar una constante de caracteres con nombre,de un máximo de ocho posiciones de longitud, que contenga los números de bitque se han de activar.

En el campo de resultado, especifique un campo de caracteres de una posición.Puede ser un elemento de matriz si todos los elementos de la matriz son camposde caracteres de una posición.

Vea en la Figura 179 un ejemplo de operaciones BITOFF y BITON.

Si desea asignar un patrón de bit en particular a un campo de caracteres, utilice laoperación MOVE con un literal hexadecimal en el factor 2.

CABxx (Comparar y bifurcar)

Código Factor 1 Factor 2Campo deresultado Indicadores

CABxx Comparando Comparando Etiqueta HI LO EQ

La operación CABxx compara el factor 1 con el factor 2. Si se cumple la condiciónespecificada por xx, el programa bifurca a la operación TAG o ENDSR asociadacon la etiqueta especificada en el campo de resultado. De lo contrario, el programacontinúa con la siguiente operación de la secuencia. Si el campo de resultado no

*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++D BITNC C '01234567'D HEXNC C X'0F'CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* Los valores de los bits son:C* Antes de las operaciones: Tras las operaciones:

C* FieldA = 00000000 FieldA = 10001111C* FieldB = 00000000 FieldB = 00010000C* FieldC = 11111111 FieldC = 11111111C* FieldD = 11000000 FieldD = 11010000C* FieldE = 11000000 FieldE = 11000001C* FieldG = 11111111 FieldG = 01111111C* FieldH = 00000000 FieldH = 00001110C* FieldI = 11001010 FieldI = 00001111C*C BITON '04567' FieldAC BITON '3' FieldBC BITON '3' FieldCC BITON '3' FieldDC BITON '01' FieldHC BITOFF '0' FieldGC BITOFF BITNC FieldIC BITON HEXNC FieldI

Figura 179. Operaciones BITON y BITOFF

402 VisualAge RPG Consulta del lenguaje

Page 425: RPG Referencia

está especificado, los indicadores de resultado se establecen de acuerdo a ello y elprograma continúa con la siguiente operación de la secuencia.

“Operaciones de comparación” en la página 375 describe los distintos valores paraxx.

El factor 1 y el factor 2 deben contener un literal, una constante con nombre, unaconstante figurativa, un nombre de tabla, un elemento de matriz, un nombre deestructura de datos o un nombre de campo. El factor 1 y el factor 2 deben ser delmismo tipo.

Una operación CABxx en el procedimiento principal puede especificar unabifurcación a una línea de una especificación anterior o subsiguiente. Unaoperación CABxx en un subprocedimiento puede especificar una bifurcación:v Desde una línea del cuerpo del subprocedimiento a otra línea del cuerpo del

subprocedimientov Desde una línea de una subrutina a otra línea de la misma subrutinav Desde una línea de una subrutina a una línea del cuerpo del subprocedimiento

La operación CABxx no puede especificar una bifurcación desde fuera de unasubrutina a una operación TAG o ENDSR dentro de dicha subrutina. La etiquetaespecificada en el campo del resultado ha de estar asociada a una operación TAGexclusiva y debe tener un nombre simbólico exclusivo.

Los indicadores resultantes son opcionales. En caso de especificarse, se establecenpara reflejar el resultado de la operación de comparación. Por ejemplo:v HI se activa cuando el factor 1 es mayor que el factor 2v LO se activa cuando el factor 1 es menor que el factor 2v EQ se activa cuando el factor 1 y el factor 2 son iguales.

Capítulo 25. Códigos de operación 403

Page 426: RPG Referencia

CALL (Llamar a un programa AS/400)

Código Factor 1 Factor 2Campo deresultado Indicadores

CALL (E) Nombre delprograma

NombrePlist

_ ER _

La operación CALL pasa el control a un programa AS/400 representado por elnombre de programa especificado en el factor 2.

El factor 2 debe ser el nombre de una especificación de definición que defina elnombre del programa que se ha de llamar. El nombre del programa puede ser unnombre de AS/400 (opcionalmente calificado con la biblioteca) o bien un nombreque prevalezca sobre él, que se haya definido utilizando el elemento de menúDefinir información de AS/400. Si desea más información acerca de cómo utilizarel Diseñador GUI para definir la información de AS/400, consulte la publicaciónIniciación a VisualAge RPG y CODE/400.

Si se ha especificado el campo de resultado, debe contener el nombre de una PLISTpara comunicar valores entre el programa de llamada y el programa llamado. Elcampo de resultado puede estar en blanco si el programa llamado no accede aparámetros o si las sentencias PARM siguen inmediatamente a la operación CALL.

*...1....+....2....+....3....+....4....+....5....+....6....+....7...CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* Los valores del campo son:C* FieldA = 100,00C* FieldB = 105,00C* FieldC = ABCC* FieldD = ABCDEC*C* Bifurcar a TAGX.C FieldA CABLT FieldB TAGXC*C* Bifurcar a TAGX.C FieldA CABLE FieldB TAGXC*C* Bifurcar a TAGX; indicador 16 desactivado.C FieldA CABLE FieldB TAGX 16C*C* Bifurcar a TAGX; indicador 17 desactivado, indic. 18 activado.C FieldA CAB FieldB TAGX 1718C*C* Bifurcar a TAGX; indicador 19 activado.C FieldA CAB FieldA TAGX 19C*C* No hay bifurcación.C FieldA CABEQ FieldB TAGXC*C* No hay bifurcación; indicador 20 activado.C FieldA CABEQ FieldB TAGX 20C*C* No hay bifurcación; indicador 21 desactivado.C FieldC CABEQ FieldD TAGX 21C :C TAGX TAG

Figura 180. Operaciones CABxx

404 VisualAge RPG Consulta del lenguaje

Page 427: RPG Referencia

Los parámetros asociados con una operación CALL para un programa AS/400tienen las siguientes restricciones:v Los parámetros no pueden contener punteros. Si un parámetro contiene un

puntero, el compilador genera un mensaje de error en el momento de lacompilación.

v Una estructura de datos no puede tener campos no de caracteres que se solapen.Los campos solapados deben ser de caracteres.

v El paso del valor *HIVAL (X’FF’) como parámetro de tipo carácter o gráficopuede producir resultados imprevistos.

v Los programas con llamadas remotas que pasen un campo de caracteres que nopueda convertirse a EBCDIC produce la detención de la conversión.Normalmente, esto se produce cuando un campo numérico solapa un campo decaracteres.

v Puede especificar un máximo de 25 parámetros.v El número total de bytes asignados para los parámetros no puede exceder de

32K.

Si se especifica un indicador de resultado en las posiciones 73 y 74, se activacuando se produce un error durante la operación CALL.

Para manejar las excepciones de CALL (códigos de estado de programa 202, 211 ó231), puede especificarse el ampliador de código de operación ’E’ o un indicadorde error ER, pero no ambos. Para obtener más información sobre la gestión deerrores, consulte el apartado “Excepciones y errores de programa” en la página 48.

*...1....+....2....+....3....+....4....+....5....+....6....+....7...DName+++++++++++ETDsFrom+++To/L+++IDc.Functions+++++++++++++++++++++++++D Functions-cont++++++++++++++++++++DD*Constante con nombreD Remote1 C CONST('PROG1')D LINKAGE(*SERVER) NOWAITD*D*Campo autónomoD Remote2 S 13A INZ('MYLIB/REMPROG')D LINKAGE(*SERVER)D parm1 S 8P 2D parm2 DSD name 1 20AD first 1 8AD last 9 20ACSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEqC* CALL a un programa remotoC*C CALL Remote1 90C PARM parm1C PARM parm2C*C* Llamada remotaC*C CALL Remote2 PLIST1 90C*C*C*C PLIST1 PLISTC PARM Fld1 10 2C PARM Charfld 50

Figura 181. Operación CALL

Capítulo 25. Códigos de operación 405

Page 428: RPG Referencia

Llamada a un programa AS/400 que utiliza un archivo deestación de trabajoPara utilizar un programa VisualAge RPG que llama a un programa AS/400 queutiliza un archivo de estación de trabajo, realice lo siguiente:v Especifique la palabra clave NOWAIT en la especificación de definiciónv Cuando cree el archivo de estación de trabajo AS/400 en el servidor AS/400,

especifique lo siguiente para el mandato CRTDSPF:– Valor de dispositivo de pantalla: el nombre de la sesión en la que se ha de

visualizar el archivo de pantalla.– Número máximo de dispositivos: cualquier valor mayor que 1.

v En el programa AS/400 remoto, no utilice la operación ACQ para adquirir undispositivo de pantalla. Se produciría un conflicto que provocaría un error.

Nota: Al utilizar este método, se pueden pasar parámetros al programa remoto.Sin embargo, el programa remoto no puede devolver ningún parámetro.

Llamada de programas de sistema principal que utilizan archivosde pantallaCuando el compilador VARPG llama a un programa de sistema principal AS/400que utiliza archivos de pantalla, es necesario determinar el dispositivo de sesiónválido que puede utilizarse. Para determinar un dispositivo de sesión válido quepueda utilizarlo el programa de sistema principal, puede utilizar un programa CLen el sistema principal AS/400 para ubicar una sesión válida.

El siguiente ejemplo ilustra tal programa CL. Asume que se está utilizando elprotocolo SNA con uuna emulación 5250 o Graphical Access ejecutándose en ClientAccess.

406 VisualAge RPG Consulta del lenguaje

Page 429: RPG Referencia

Cómo llamar a los mandatos CL del AS/400Si el programa VisualAge RPG llama a mandatos CL de AS/400:,v Especifique CALL para QCMDDDM si el mandato CL emite mandatos para

archivos AS/400v Especifique CALL para QCMDEXC si el mandato CL emite mandatos para

programas AS/400 y/o áreas de datos AS/400.

CALLB (Llamar a una función)

Código Factor 1 Factor 2Campo deresultado Indicadores

CALLB (DE)

Nombre deprocedimiento opuntero deprocedimiento

NombrePlist

_ ER _

Utilice CALLB para llamar a una función Windows. Las funciones son nombresexportados de bibliotecas de enlace dinámico (DLL) que se enlazan con laaplicación VisualAge RPG cuando se compila la aplicación. Para obtener másinformación acerca de cómo compilar una aplicación que llama a una función C deWindows, consulte la publicación Iniciación a VisualAge RPG y CODE/400.

El factor 2 debe contener un nombre de procedimiento o un puntero a unprocedimiento que contenga la dirección de la función que se ha de llamar.

PGM PARM(&SESS)/*-------------------------------------------------------*//* *//* DECLARAR VARIABLES DE TRABAJO *//* *//*-------------------------------------------------------*/DCL VAR(&JOBN) TYPE(*CHAR) LEN(10)DCL VAR(&SESS) TYPE(*CHAR) LEN(10)DCL VAR(&SUB) TYPE(*CHAR) LEN(2)DCL VAR(&STS) TYPE(*DEC) LEN(5 0)DCL &ITLEN TYPE(*DEC) VALUE(2)DCL &ITPTR TYPE(*DEC) LEN(5 0)DCL VAR(&SUBFIX) TYPE(*CHAR) LEN(40) +

VALUE('A B C D E F G H I J G0G1G2G3G4G5G6G7G8G9')

RTVJOBA JOB(&JOBN)/*-------------------------------------------------------*//* BUSCAR EL POSIBLE NOMBRE DE DISPOSITIVO Y *//* COMPROBAR SI UNO DE ELLOS TIENE LA PANTALLA DE *//* INICIO DE SESIÓN *//*-------------------------------------------------------*/CHGVAR &ITPTR 1

LOOP1:IF (&ITPTR *GT 40) THEN(DO)

CHGVAR &SESS VALUE('NO VÁLIDO ')GOTO END

ENDDO

CHGVAR VAR(&SUB) VALUE(%SST(&SUBFIX &ITPTR &ITLEN))CHGVAR VAR(&SESS) VALUE(&JOBN *TCAT &SUB)RTVCFGSTS CFGD(&SESS) CFGTYPE(*DEV) STSCDE(&STS)MONMSG MSGID(CPF9801)IF (&STS = 50) THEN(GOTO END)CHGVAR &ITPTR (&ITPTR + &ITLEN)GOTO LOOP1

END: ENDPGM

Capítulo 25. Códigos de operación 407

Page 430: RPG Referencia

El nombre del procedimiento es sensible a las mayúsculas y minúsculas. Estosignifica que el nombre que se entra en el factor 2 debe coincidir en las mayúsculasy minúsculas con la función que se llama. El nombre del procedimiento debe tener255 caracteres o menos. Si el nombre tiene más de 255 caracteres, se truncará a 255.

Si el factor 2 contiene un puntero a un procedimiento, se borra *ROUTINE dePSDS y se rellena con blancos. Si el factor 2 contiene un literal o constante connombre, *ROUTINE de PSDS contiene los ocho primeros dígitos del nombre delprocedimiento.

Si se especifica el campo del resultado, debe contener un nombre PLIST.

Si se especifica un indicador de resultado en las posiciones 73 y 74, se activacuando se produce un error durante la operación CALLB.

Para manejar las excepciones de CALLB (códigos de estado de programa 202, 211 ó231), puede especificarse el ampliador de código de operación ’E’ o un indicadorde error ER, pero no ambos. Para obtener más información sobre la gestión deerrores, consulte el apartado “Excepciones y errores de programa” en la página 48.

Debe utilizarse el convenio de enlace __cdecl, en la función llamada.

Nota: El compilador VisualAge RPG utiliza este convenio de enlace para lossubprocedimientos VARPG.

Consulte la publicación Programación con VisualAge para RPG para obtener ejemplosacerca de cómo utilizar la operación CALLB.

CALLP (Llamar a un procedimiento o programa con prototipo)

Código Factor 1 Factor 2

CALLP (M/R) NAME{ (Parm1 {:Parm2...}) }

La operación CALLP se utiliza para llamar a programas locales o procedimientoscon prototipo en la estación de trabajo. Este es el modo recomendado de llamar alos programas.

CALLP puede llamar a un archivo EXE, BAT, COM o DOS EXE. No se permitenparámetros UCS-2.

A diferencia de las demás operaciones de llamada, CALLP utiliza una sintaxis deformato libre. Se utiliza la entrada del factor 2 ampliado para especificar el nombredel prototipo del programa o procedimiento llamado, así como también losparámetros que se han de pasar. (Se parece al modo de llamar a una funciónincorporada.) Se permite un máximo de 255 parámetros para una llamada a unprograma y un máximo de 399 para una llamada a un procedimiento.

El compilador utiliza entonces el nombre del prototipo para obtener un nombreexterno, si es necesario, para la llamada. Si se especifica la palabra clave CLTPGMen el prototipo, la llamada será una llamada dinámica externa; de lo contrario, seráuna llamada a un procedimiento.

Se ha de incluir un prototipo del programa o procedimiento al que se estállamando en las especificaciones de definición que preceden a la operación CALLP.

408 VisualAge RPG Consulta del lenguaje

Page 431: RPG Referencia

Observe que si CALLP se utiliza para llamar a un procedimiento que devuelve unvalor, éste no estará disponible para el llamador. Si se requiere el valor, llame alprocedimiento prototipo desde dentro de una expresión. Cuando se utiliza lapalabra clave CLTPGM en el prototipo, no puede haber ningún valor de retorno ylos parámetros se han de pasar por valor.

Para obtener información sobre cómo definir un programa local y para las normaspara pasar parámetros, consulte el “Capítulo 18. Especificaciones de definición” enla página 227. Para obtener información acerca de procedimientos,subprocedimientos y cómo realizar prototipos, consulte el “Capítulo 6.Subprocedimientos y prototipos” en la página 59. Consulte la publicaciónProgramación con VisualAge para RPG para obtener información acerca de comollamar a los programas y utilizar varios procedimientos.

Si desea obtener información acerca de cómo utilizar los ampliadores de operaciónM y R, consulte la sección “Reglas de precisión para operaciones numéricas” en lapágina 358.

Nota: Los programas que se llaman utilizando CALLP completan su ejecuciónantes de que se ejecuten las sentencias posteriores a CALLP.

En el ejemplo siguiente, se pasa el parámetro fld1 al programa pgm1.

CASxx (Invocar subrutina condicionalmente)

Código Factor 1 Factor 2Campo deresultado Indicadores

CASxx Comparando Comparando Nombre desubrutina

HI LO EQ

La operación CASxx se utiliza para seleccionar una subrutina condicionalmentepara su proceso. La selección está basada en la relación entre el factor 1 y el factor2, como xx lo especifica. Si existe la relación denotada por xx entre el factor 1 y elfactor 2, se procesa la subrutina especificada en el campo del resultado. Si noexiste, el programa continúa con la siguiente operación CASxx del grupo CAS. Sidesea ver una lista de valores de xx, consulte “Operaciones de comparación” en lapágina 375.

Un grupo CAS sólo puede contener operaciones CASxx. Una operación ENDCSdebe seguir a la última operación CASxx. Después de procesarse la subrutina, elprograma continúa con la operación que sigue a la operación ENDCS, a menos quela subrutina pase el control a una operación diferente.

Si se especifican el factor 1 y el factor 2, pueden contener un literal, una constantecon nombre, una constante figurativa, un nombre de campo, un nombre de tabla,un elemento de matriz, un nombre de estructura de datos o espacios en blanco.

*...1....+....2....+....3....+....4....+....5....+....6....+....7...DName+++++++++++ETDsFrom+++To/L+++IDc.Functions+++++++++++++++++++++++++D Functions-cont++++++++++++++++++++D pgm1 PR CLTPGM('testprog')D fld1 20A VALUECSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEqC*C CALLP pgm1(fld1) 90

Figura 182. Operación CALLP

Capítulo 25. Códigos de operación 409

Page 432: RPG Referencia

Tanto el factor 1 como el factor 2 deben ser del mismo tipo de datos. Los espaciosen blanco sólo son válidos si xx está en blanco y no se han especificadoindicadores de resultado.

El campo resultante debe contener el nombre de una subrutina de usuario o unade las siguientes palabras clave: *TERMSR, *PSSR o *INZSR:v *TERMSR especifica una subrutina que se ha de ejecutar durante la terminación

normal.v *PSSR especifica que es una subrutina de excepción/error del programa para

manejar excepciones/errores detectados en el programa.v *INZSR especifica una subrutina que se ha de ejecutar durante la inicialización.

Se pueden especificar indicadores de condición para la operación CASxx, sinembargo, no se pueden especificar indicadores de condición en la operaciónENDCS para un grupo CAS.

En una operación CASbb, el factor 1 y el factor 2 sólo son necesarios si se hanespecificado los indicadores de resultado en las posiciones 71 a 76. La operaciónCASbb sin ningún indicador de resultado especificado en las posicionescomprendidas entre 71 y 76 tiene una función idéntica a la de la operación EXSR,porque provoca la ejecución incondicional de la subrutina nombrada en el campodel resultado de la operación CASbb. Cualquier operación CASxx que siga a unaoperación CASbb incondicional en el mismo grupo CAS no se comprueba nunca.Por lo tanto, la colocación normal de la operación CASbb incondicional es despuésde todas las demás operaciones CASxx del grupo CAS.

Si se especifican indicadores de resultado, se establecen como se indica acontinuación:v Superior: (71-72) El factor 1 es mayor que el factor 2.v Inferior: (73-74) El factor 1 es menor que el factor 2.v Igual: (75-76) El factor 1 es igual al factor 2.

410 VisualAge RPG Consulta del lenguaje

Page 433: RPG Referencia

CAT (Concatenar dos series)

Código Factor 1 Factor 2Campo deresultado Indicadores

CAT (P) Serie de origen 1 Serie de origen 2:número de blancos

Serie dedestino

La operación CAT concatena la serie especificada en el factor 2 al final de la serieespecificada en el factor 1 y la coloca en el campo de resultado. Las series origen ydestino deben ser del mismo tipo, o bien todo caracteres, o bien todo gráficos obien todo UCS-2.

Si se especifica el factor 1, debe contener una serie que puede ser un nombre decampo, un elemento de matriz, una constante con nombre, un nombre deestructura de datos, un nombre de tabla o un literal. Si no se especifica el factor 1,el factor 2 se concatena con el fin de la serie del campo de resultado.

Nota: En la siguiente descripción de la operación CAT, las referencias al factor 1 seaplican al campo de resultado si no se ha especificado el factor 1.

El factor 2 debe contener una serie y puede contener el número de espacios enblanco que se insertarán entre las series concatenadas. Su formato es la serieseguida de dos puntos (:) y del número de espacios en blanco. Los blancos tienenel formato de los datos. Por ejemplo, en los datos de tipo carácter, un blanco esx’20’, mientras que en los datos UCS-2 es x’0020’. Si se concatenan series gráficas,los espacios en blanco son de doble byte. La parte de serie puede contener unnombre de campo, un elemento de matriz, una constante con nombre, un nombrede estructura de datos, un nombre de tabla, un literal o un nombre de subcampo

*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* La operación CASGE compara FieldA con FieldB. Si FieldA esC* mayor o igual que FieldB, se procesa Subr01 y elC* programa continúa con la operación posterior a ENDCS.C*C FieldA CASGE FieldB Subr01C*C* Si FieldA no es mayor o igual que FieldB, el programaC* compara FieldA con FieldC. Si FieldA es igual a FieldC,C* se procesa SUBR02 y el programa continúa con la operaciónC* siguiente a la operación ENDCS.C*C FieldA CASEQ FieldC Subr02C*C* Si FieldA no es igual que FieldC, la operación CAS hace que Subr03C* se procese antes de que el programa continúe con la operaciónC* siguiente a la operación ENDCS.C* La sentencia CAS se utiliza para proporcionar una subrutina siC* no se ha realizado ninguna de las operaciones CASxx anteriores.C*C CAS Subr03C*C* La operación ENDCS indica el final del grupo CAS.C*C ENDCS

Figura 183. Operaciones CASxx

Capítulo 25. Códigos de operación 411

Page 434: RPG Referencia

de estructura de datos. El número de espacios en blanco debe ser numérico concero posiciones decimales y puede contener una constante con nombre, unelemento de matriz, un literal, un nombre de tabla o un nombre de campo.

Si se especifican dos puntos, debe especificarse el número de espacios en blanco. Sino se especifican los dos puntos, la concatenación se produce con los blancos decola, si los hay, del factor 1, o con el campo de resultado si no se especifica elfactor 1.

Si se especifica el número de blancos (N), el factor 1 se copia al campo deresultado ajustado por la izquierda. Si no se especifica el factor 1, se utiliza la seriede campo del resultado. Los N espacios en blanco se añaden a continuación delúltimo carácter que no está en blanco. El factor 2 se añade, entonces, a esteresultado. Los espacios en blanco de guía del factor 2 no se contabilizan cuando seañaden N espacios en blanco al resultado; sólo se consideran parte del factor 2. Sino se especifica el número de espacios en blanco, los blancos de cola y de guía delfactor 1 y el factor 2 se incluyen en el resultado.

El campo del resultado debe ser una serie y puede contener un nombre de campo,un elemento de matriz, un nombre de estructura de datos o un nombre de tabla.Su longitud debe ser la del factor 1 y el factor 2 combinadas más los espacios enblanco existentes; si no es así, se produce truncamiento por la derecha.

Un ampliador de operación P indica que el campo de resultado debe rellenarse porla derecha con espacios en blanco después de producirse la concatenación si elcampo de resultado es mayor que el resultado de la operación. Si no se especificael relleno, sólo queda afectada la parte situada más a la izquierda del campo.

En el tiempo de ejecución, si el número de espacios en blanco es menor que cero,el compilador toma el valor por omisión cero como número de espacios en blanco.

No se pueden utilizar constantes figurativas en el factor 1, en el factor 2 ni en loscampos de resultado. No se permite el solapamiento en las estructuras de datospara el factor 1 y el campo de resultado o para el factor 2 y el campo de resultado.

En el apartado “Operaciones de serie” en la página 389 se describen las normasgenerales para la especificación de operaciones de serie.

412 VisualAge RPG Consulta del lenguaje

Page 435: RPG Referencia

*...1....+....2....+....3....+....4....+....5....+....6....+....7...CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* CAT concatena LAST a NAME e inserta un blanco tal como se especificaC* en el factor 2. TEMP contiene 'Mr.bSmith'.C MOVE 'Mr. ' NAME 6C MOVE 'Smith ' LAST 6C NAME CAT LAST:1 TEMP 9C*C* CAT concatena 'OS' a STRING y coloca 'OSXX' en TEMP.C MOVE 'XX' STRING 2C 'OS' CAT STRING TEMP 4C*C* El siguiente ejemplo es igual que el anterior excepto en queC* TEMP se define como un campo de 10 bytes. El ampliador de operación PC* especifica que se utilizarán espacios en blanco en las posiciones de laC* derecha del campo de resultado que el resultado de la concatenación,C* 'OSXX', no rellene. Como resultado, TEMP contendrá 'OSXXbbbbbb'C* después de la concatenación.C MOVE *ALL'*' TEMP 10C MOVE 'XX' STRING 2C 'OS' CAT(P) STRING TEMPC**...1....+....2....+....3....+....4....+....5....+....6....+....7...CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* El ejemplo siguiente muestra espacios en blanco de guía del factor 2.C* Después de CAT, RESULT contiene 'MR.bSMITH'.C*C MOVE 'MR.' NAME 3C MOVE ' SMITH' FIRST 6C NAME CAT FIRST RESULT 9C*C* El ejemplo siguiente muestra la utilización de CAT sin el factor 1.C* FLD2 es una serie de 9 caracteres. Antes de la concatenación,C* contiene 'ABCbbbbbb'. FLD1 contiene 'XYZ'. Después de laC* concatenación FLD2 contendrá 'ABCbbXYZb'.C*C MOVEL(P) 'ABC' FLD2 9C MOVE 'XYZ' FLD1 3C CAT FLD1:2 FLD2

Figura 184. Operaciones CAT

*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....** El siguiente ejemplo muestra la utilización de series gráficas*

DName+++++++++++ETDsFrom+++To/L+++IDc.Functions+++++++++++++++++++++++++* El valor de Graffld es 'AACCBBGG'.* El valor de Graffld2 tras CAT 'aa AACCBBGG '* El valor de Graffld3 tras CAT 'AABBCCDDEEFFGGHHAACC'*

D Graffld 4G INZ(G'AACCBBGG')D Graffld2 10G INZD Graffld3 10G INZ(G'AABBCCDDEEFFGGHH')CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq.* El valor 2 representa 2 blancos gráficos como separadores

C G'aa' cat Graffld:2 Graffld2C cat Graffld Graffld3

Figura 185. Operación CAT con datos gráficos

Capítulo 25. Códigos de operación 413

Page 436: RPG Referencia

CHAIN (Recuperación aleatoria desde un archivo)

Código Factor 1 Factor 2Campo deresultado Indicadores

CHAIN (EN)

Argumento debúsqueda

Nombre decomponenteSubarchivo, Archivoo Formato de registro

Estructurade datos

NR ER _

La operación CHAIN recupera un registro desde un archivo controlado en cálculo(F en la posición 18 de las especificaciones de descripción de archivo) o unsubarchivo, activa un indicador de identificación de registro (si se ha indicado enlas especificaciones de entrada) y coloca los datos del registro en los campos deentrada.

Recuperación de los datos desde un archivo o formato deregistroEl archivo debe especificarse en las especificaciones de descripción de archivo.Puede ser un archivo remoto AS/400 o un archivo local.

Factor 1, el argumento de búsqueda, debe contener la clave, el número relativo deregistro o el nombre KLIST utilizado para recuperar el registro:v Si el acceso es por clave, el factor 2 debe ser un archivo remoto AS/400. El factor

1 puede ser un nombre de campo, una constante con nombre, una constantefigurativa o un literal. Si el archivo está descrito externamente, el factor 1 puedeser un nombre de KLIST.

v Si el acceso se efectúa por número relativo de registro, el factor 1 debe contenerun literal entero o un campo numérico con cero posiciones decimales.

v Los campos de clave de tipo gráfico y UCS-2 deben tener el mismo CCSID quela clave del archivo.

El factor 2 especifica el nombre de archivo o nombre de formato de registro que seha de leer:v Si el factor 2 es un nombre de archivo, se recupera el primer registro que

coincida con el argumento de búsqueda.v Si el factor 2 es un nombre de archivo AS/400 y se especifica *MBR ALL, sólo se

procesa el miembro de archivo abierto actual.v Si el factor 2 es un archivo de disco local, debe estar descrito por un programa.v Si el factor 2 es un nombre de formato de registro, el archivo puede estar

descrito externamente.v Si el factor 2 es un nombre de formato de registro y el acceso es por clave, se

recupera el primer registro del tipo de registro especificado cuya clave coincidacon el argumento de búsqueda.

Nota: Se da soporte al bloqueo de registros para archivos remotos AS/400. No seda soporte al bloqueo de registros para archivos locales.

Puede especificar un nombre de estructura de datos en el campo de resultadosolamente si el archivo especificado en el factor 2 es un archivo descrito porprograma (identificado por una F en la posición 22 de la especificación dedescripción de archivo). Cuando especifica un nombre de estructura de datos en elcampo de resultado, la operación CHAIN recupera el primer registro cuyoidentificador de registro coincide con el argumento de búsqueda en el factor 1 y lo

414 VisualAge RPG Consulta del lenguaje

Page 437: RPG Referencia

coloca en la estructura de datos. Consulte el apartado “Operaciones de archivos”en la página 380 para obtener información sobre la transferencia de datos entre el

archivo y la estructura de datos.

Si el archivo especificado en el factor 2 es un archivo DISK de entrada AS/400, nose permite ningún ampliador de operación. Todos los registros se leen sinbloqueos.

Si el archivo especificado en el factor 2 es un archivo UPDATE AS/400 y si no seespecifica el ampliador de operación N, la operación CHAIN bloquea el registro. Elregistro permanece bloqueado hasta que:v El registro se actualizav El registro se suprimev Se lea otro registro del archivo para su entrada o actualizaciónv Se ejecute un SETLL o SETGT en el archivov Se realice una operación UNLOCK en el archivov Se realice en el archivo una operación de salida definida en una especificación

de salida sin nombres de campos.

Las operaciones de salida que añaden un registro a un archivo no hacen quedesaparezca el bloqueo del registro.

Puede especificar un indicador en las posiciones 71-72 que se active si ningúnregistro del archivo coincide con el argumento de búsqueda. Esta informacióntambién puede obtenerse de la función incorporada %FOUND, que devuelve ’0’ sino se ha encontrado ningún registro y ’1’ si se ha encontrado alguno.

Para manejar las excepciones de CHAIN (códigos de estado de archivo mayoresque 1000), puede especificarse el ampliador de código de operación ’E’ o unindicador de error ER, pero no ambos. Para obtener más información sobre lagestión de errores, consulte el apartado “Excepciones/errores de archivo” en lapágina 37.

Las posiciones 75 y 76 deben estar en blanco.

Cuando la operación CHAIN es satisfactoria, el archivo se sitúa de manera queuna operación de lectura posterior recupere el registro que de forma lógica sigue oprecede al registro recuperado. Cuando la operación CHAIN no se completasatisfactoriamente, los campos del programa permanecen sin cambios y el archivodebe volverse a situar para que pueda realizarse la siguiente operación de lecturasobre el archivo.

Si se actualiza el archivo inmediatamente después de una operación CHAINsatisfactoria, se actualiza el último registro recuperado.

Si no se encuentra ningún registro, si se produce un error durante la operaciónCHAIN o si ya se ha recuperado el último registro (fin de archivo), no se recuperaningún dato y todos los campos permanecen sin cambios.

Capítulo 25. Códigos de operación 415

Page 438: RPG Referencia

Recuperación de un registro desde un componente desubarchivoSi el factor 2 es un componente de subarchivo, el factor 1 debe ser un índice. Laoperación CHAIN lee un registro del subarchivo utilizando el índice.

*...1....+....2....+....3....+....4....+....5....+....6....+....7...CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* La operación CHAIN recupera el primer registro del archivo,C* FILEX, que tiene un campo clave con el mismo valor que elC* argumento de búsqueda KEY (factor 1).C*C KEY CHAIN RECXC*C*C* Si no se encuentra un registro con un valor de clave igual alC* argumento de búsqueda, %FOUND devuelve '0' y la operación EXSRC* se procesa. Si se encuentra un registro con un valor de claveC* igual al argumento de búsqueda, el programa continúa con losC* cálculos después de la operación EXSR.C*C IF NOT %FOUNDC EXSR Not_FoundC ENDIF

Figura 186. Operación CHAIN con un nombre de archivo en el factor 2

*...1....+....2....+....3....+....4....+....5....+....6....+....7...CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* La operación CHAIN utiliza el valor del argumento de búsquedaC* KEY para recuperar un registro del tipo REC1 de un archivoC* descrito externamente. Si no se encuentra ningún registro del tipoC* especificado con una clave igual al argumento de búsqueda,C* se activa el indicador 72. Se utiliza una clave compleja con una KLISTC* para recuperar registros de archivos que tienen una clave compuesta.C* Si se encuentra un registro del tipo especificado cuyo campo de claveC* es igual al argumento de búsqueda, el indicador 72 se desactiva y,C* por lo tanto, la operación UPDATE se procesa.C*C KEY CHAIN REC1 72C KEY KLISTC KFLD Field1C KFLD Field2C IF NOT *IN72C*CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* La operación UPDATE modifica todos los campos del registro REC1.C*C UPDATE REC1C ENDIFC*CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* El ejemplo siguiente muestra una operación CHAIN sin bloqueo.C*C MOVE 3 Rec_NoC Rec_No CHAIN (N) INPUT 99

Figura 187. Operación CHAIN con un nombre de formato de registro y sin bloqueo

416 VisualAge RPG Consulta del lenguaje

Page 439: RPG Referencia

Para poder actualizar o suprimir un registro de un componente de subarchivo, éstedebe estar situado en el registro. *START y *END no se pueden utilizar con uncomponente de subarchivo. Los valores de los campos del componente desubarchivo se asignan a los valores del programa correspondiente para los camposde subarchivo. El programa puede modificar dichos valores.

CHECK (Comprobar caracteres)

Código Factor 1 Factor 2Campo deresultado Indicadores

CHECK (E) Serie delcomparador

Serie base:inicio Posición ala izquierda

_ ER FD

La operación CHECK verifica que cada carácter de la serie base (factor 2) seencuentra entre los caracteres indicados en la serie del comparador (factor 1). Laserie base y la serie del comparador deben ser del mismo tipo, ambas del tipocarácter, gráfico o UCS-2. (Los tipos gráfico y UCS-2 deben tener el mismo valor deCCSID.) La verificación empieza por el carácter más a la izquierda del factor 2 ycontinúa carácter por carácter, de izquierda a derecha. Cada carácter de la seriebase se compara con los caracteres del factor 1. Si existe una coincidencia de uncarácter en el factor 2 y el factor 1, se verifica el siguiente carácter de la serie base.Si no se encuentran coincidencias, se coloca un valor entero en el campo delresultado para indicar la posición del carácter incorrecto.

La operación detiene la comprobación cuando encuentra el primer carácterincorrecto o el final de la serie base. Si no se encuentran caracteres incorrectos, elcampo de resultado se establece a cero.

El factor 1 debe ser una serie y puede contener un nombre de campo, un elementode matriz, una constante con nombre, un nombre de estructura de datos, unsubcampo de estructura de datos, un literal o un nombre de tabla.

El factor 2 debe contener la serie base, o la serie base seguida de dos puntos y, acontinuación, la posición de inicio. La serie base debe contener un nombre decampo, un elemento de matriz, una constante con nombre, un nombre deestructura de datos, un literal o un nombre de tabla. La posición inicial debe sernumérica sin posiciones decimales, y puede ser una constante con nombre, unelemento de matriz, un nombre de campo, un literal o un nombre de tabla. Si nose especifica ninguna posición de inicio, se utiliza el valor 1. Si la posición de inicioes mayor que 1, el valor del campo de resultado es relativo a la posición más a laizquierda de la serie base, sin tener en cuenta la posición de inicio.

Si se especifica un campo de resultado, éste puede ser una variable numérica, unelemento de matriz numérica, un nombre de tabla numérica o una matriznumérica. Si el campo de resultado no se especifica, es necesario especificar elindicador de encontrado en las posiciones 75 y 76.

No utilice posiciones decimales en el campo de resultado.

Si el campo de resultado es una matriz, la operación continúa la comprobacióndespués de encontrar el primer carácter incorrecto tantas veces como elementos dematriz existan. Si hay más elementos de matriz que caracteres incorrectos, todoslos elementos restantes toman el valor cero. Si se utilizan datos de tipo gráfico oUCS-2, el campo de resultado contendrá posiciones de carácter gráfico (esto es, laposición 3, el tercer carácter gráfico, será la posición de carácter 5).

Capítulo 25. Códigos de operación 417

Page 440: RPG Referencia

Para manejar las excepciones de CHECK (código de estado del programa 100),puede especificarse el ampliador de código de operación ’E’ o un indicador deerror ER, pero no ambos. Para obtener más información sobre la gestión de errores,consulte el apartado “Excepciones y errores de programa” en la página 48.

Puede especificar un indicador en las posiciones 75-76 que se active si seencuentran caracteres incorrectos. También puede obtener esta información desdela función incorporada %FOUND, que devuelve ’1’ si se encuentran caracteresincorrectos.

No se pueden utilizar constantes figurativas en el factor 1, en el factor 2 ni en loscampos de resultado. No se permite el solapamiento de la estructura de datos delfactor 1 y el campo de resultado, o del factor 2 y el campo de resultado.

En el apartado “Operaciones de serie” en la página 389 se describen las normasgenerales para la especificación de operaciones de serie.

*...1....+....2....+....3....+....4....+....5....+....6....+....7...DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++D* Después del ejemplo siguiente, N=6 y el indicador de búsqueda 90D* está activado. Debido a que la posición de inicio es 2, el primercarácter no numérico que seD* encuentra es '.'.D*DD Digits C '0123456789'CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*CC MOVE '$2000.' SalarioC Dígitos CHECK Salario:2 N 90C*CC MOVE '$2000.' SalarioC Dígitos CHECK Salario:2 NC IF %FOUNDC EXSR NonNumericC ENDIFC*C*C* Debido a que el factor 1 es un espacio en blanco, CHECK indica laC* posición del primer carácter que no es un espacio en blanco. SiC* STRING contiene '���the', NUM contendrá el valor 4.C*CC ' ' CHECK String Num 2 0*...1....+....2....+....3....+....4....+....5....+....6....+....7......

Figura 188. Operación CHECK (Pieza 1 de 2)

418 VisualAge RPG Consulta del lenguaje

Page 441: RPG Referencia

CHECKR (Comprobación inversa)

Código Factor 1 Factor 2Campo deresultado Indicadores

CHECKR(E)

Serie delcomparador

Serie base:inicio Posición ala derecha

_ ER FD

La operación CHECKR verifica si cada carácter de la serie base está entre loscaracteres indicados en la serie del comparador. La serie base y la serie delcomparador deben ser del mismo tipo, ambas del tipo carácter, gráfico o UCS-2.(Los tipos gráfico y UCS-2 deben tener el mismo valor de CCSID.). La verificación

.

.

.DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++D* El ejemplo siguiente comprueba que FIELD contiene sólo las letrasD* A a J. Como resultado, ARRAY=(136000) tras la operación CHECK.D* El indicador 90 se activa.D*DD Letter C 'ABCDEFGHIJ'DCSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*CC MOVE '1A=BC*' Field 6C Letter CHECK Field Array 90CC*C* En el ejemplo siguiente, debido a que FIELD contiene sólo lasC* letras A a J, ARRAY=(000000). El indicador 90 se desactiva.C*CC MOVE 'FGFGFG' Field 6C Letter CHECK Field Array 90CC

Figura 188. Operación CHECK (Pieza 2 de 2)

*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++D* El siguiente ejemplo comprueba la existencia de caracteres* gráficos en un campo DBCS empezando en la posición gráfica* 2 del campo.

D* El valor de Graffld es 'DDBBCCDD'.* El valor de num tras CHECK es 4, ya que éste es el primer* carácter 'DD' no contenido en la serie.

DD Graffld 4G INZ(G'DDBBCCDD')D Num 5 0DCSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq.CCC G'AABBCC' check Graffld:2 Num

Figura 189. Operación CHECK con datos gráficos

Capítulo 25. Códigos de operación 419

Page 442: RPG Referencia

empieza en el carácter situado más a la derecha del factor 2 y continúa, carácter acarácter, de derecha a izquierda. Cada carácter de la serie base se compara con loscaracteres del factor 1. Si existe una coincidencia del carácter del factor 2 en elfactor 1, se verifica el siguiente carácter de origen. Si no se encuentrancoincidencias, se coloca un valor entero en el campo del resultado para indicar laposición del carácter incorrecto. Aunque la comprobación se realiza desde laderecha, la posición situada en el campo de resultado será relativa a la izquierda.

El factor 1 debe ser una serie y puede contener un nombre de campo, un elementode matriz, una constante con nombre, un nombre de estructura de datos, unsubcampo de estructura de datos, un literal o un nombre de tabla.

El factor 2 debe contener la serie base, o la serie base seguida de dos puntos y, acontinuación, la posición de inicio. La serie base debe contener un nombre decampo, un elemento de matriz, una constante con nombre, un nombre deestructura de datos, un nombre de subcampo de estructura de datos, un literal oun nombre de tabla. La posición inicial debe ser numérica sin posicionesdecimales, y puede ser una constante con nombre, un elemento de matriz, unnombre de campo, un literal o un nombre de tabla. Si no se especifica ningunaposición de inicio, se utiliza la longitud de la serie.

Si se especifica un campo de resultado, éste puede ser una variable numérica, unelemento de matriz numérica, un nombre de tabla numérica o una matriznumérica. Si el campo de resultado no se especifica, es necesario especificar elindicador de encontrado en las posiciones 75 y 76. El valor en el campo deresultado es relativo a la posición situada más a la izquierda de la serie origen,independientemente de la posición de inicio.

No utilice posiciones decimales en el campo de resultado.

Si el campo de resultado es una matriz, la operación continúa la comprobacióndespués de encontrar el primer carácter incorrecto tantas veces como elementos dematriz existan. Si hay más elementos de matriz que caracteres incorrectos, todoslos elementos restantes toman el valor cero. Si el campo de resultado no es unamatriz, la operación detiene la comprobación al encontrar el primer carácterincorrecto o al encontrar el final de la serie base. Si no se encuentran caracteresincorrectos, el campo de resultado se establece a cero.

Si se utilizan datos de tipo gráfico o UCS-2, el campo de resultado contendráposiciones de carácter gráfico (esto es, la posición 3, el tercer carácter gráfico, serála posición de carácter 5).

Para manejar las excepciones de CHECKR (código de estado de programa 100),puede especificarse el ampliador de código de operación ’E’ o un indicador deerror ER, pero no ambos. Para obtener más información sobre la gestión de errores,consulte el apartado “Excepciones y errores de programa” en la página 48.

Puede especificar un indicador en las posiciones 75-76 que se active si seencuentran caracteres incorrectos. También puede obtener esta información desdela función incorporada %FOUND, que devuelve ’1’ si se encuentran caracteresincorrectos.

No se pueden utilizar constantes figurativas en el factor 1, en el factor 2 ni en loscampos de resultado. No se permite el solapamiento en las estructuras de datospara el factor 1 y el campo de resultado o para el factor 2 y el campo de resultado.

420 VisualAge RPG Consulta del lenguaje

Page 443: RPG Referencia

*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* Como el factor 1 está en blanco, CHECKR indica la posición del primerC* carácter distinto a blanco. Esta utilización de CHECKR le permiteC* determinar la longitud de una cadena. Si STRINGC* contiene 'ABCDEF ', NUM contendrá el valor 6.C* Si se produce un error, %ERROR devolverá '1' yC* %STATUS devolverá el código de estado 00100.C*CC ' ' CHECKR(E) String NumCC SELECTC WHEN %ERRORC ... se ha producido un errorC WHEN %FOUNDC ... NUM es menor que la longitud de la serieC ENDIFC**...1....+....2....+....3....+....4....+....5....+....6....+....7...+....DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++D*D* Tras el ejemplo siguiente, N=1 y el indicador de encontrado 90D* está activado. Como la posición inicial es 5, la operaciónD* empieza con el 0 situado más a la derecha y el primer carácter noD* numérico encontrado es '$'.D*D Digits C '0123456789'DD*

Figura 190. Operación CHECKR (Pieza 1 de 2)

CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....CC MOVE '$2000.' Salary 6C Digits CHECKR Salary:5 N 90C...*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....D*D* El ejemplo siguiente comprueba que FIELD contiene sólo las letrasD* A a J. Como resultado, ARRAY=(876310) tras la operación CHECKR.D* El indicador 90 se activa.DDName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++D Array S 1 DIM(6)D Letter C 'ABCDEFGHIJ'DCSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....CC MOVE '1A=BC***' Field 8C Letter CHECKR Field Array 90C

Figura 190. Operación CHECKR (Pieza 2 de 2)

Capítulo 25. Códigos de operación 421

Page 444: RPG Referencia

CLEAR (Borrar)

Código Factor 1 Factor 2Campo deresultado Indicadores

CLEAR *NOKEY *ALL Estructura oVariable

CLEAR Ventana osubarchivo

La operación CLEAR establece en blanco o en cero lo siguiente, según el tipo dedatos:v Elementos de una estructura (formatos de registro, estructuras de datos,

matrices, tablas)v Variables (campos, subcampos, indicadores)v Componentes de campos de entrada de una ventanav Subarchivos

Cómo borrar elementos, estructuras o variablesLas estructuras se pueden borrar globalmente o elemento por elemento:v Si el campo de resultado contiene un nombre de formato de registro DISK se

puede especificar *NOKEY en el factor 1 para borrar todos los campos exceptolos campos de clave.

v Si el campo del resultado contiene una estructura de datos de múltiplesapariciones, un nombre de formato de registro o un nombre de tabla, se puedeespecificar *ALL en el factor 2 para borrar todas las apariciones, todos loscampos del formato de registro o todos los elementos de la tabla. El nivel deaparición se establece en 1.

v Si el campo de resultado contiene un formato de registro y no se especifica *ALLen el factor 2, sólo se borran los campos de salida del formato de registro.

v Si el campo de resultado contiene un formato de registro o una estructura dedatos, se borran todos los campos en el orden en el cual están definidos en laestructura.

v Si el campo de resultado contiene una estructura de datos de múltiplesapariciones, sólo se borran los campos de la aparición actual.

v Si el campo de resultado es una tabla, se borra el elemento actual de la tabla.v Si el campo de resultado es una matriz, se borra toda la matriz.v Si el campo de resultado es un elemento de matriz o un indicador con un índice,

sólo se borra el elemento especificado.

422 VisualAge RPG Consulta del lenguaje

Page 445: RPG Referencia

Cómo borrar campos de entrada de una ventanaSi el campo de resultado contiene un nombre de ventana, el factor 1 y el factor 2deben estar en blanco. La ventana debe contener campos de entrada.

Se borran todos los campos de entrada de la ventana y se establecen en sus valorespor omisión:v Los campos numéricos se borran con cerosv Los campos de caracteres se borran con blancos.

Los campos del programa correspondiente también se establecen en cero o enespacios en blanco, según su tipo. Por ejemplo, si la ventana INVENTORY contieneel campo de entrada de caracteres ENT0000B y el campo de entrada numéricoENT0000C, la operación CLEAR realiza lo equivalente a lo siguiente:

Cómo borrar subarchivosSi el campo de resultado contiene un nombre de subarchivo, el factor 1 y el factor2 deben estar en blanco. Se borran todas las entradas del subarchivo y su atributoCuenta se establece en cero.

*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++D*DD DS1 DSD Num 2 5 0D Char 20 30ADD MODS DS OCCURS(2)D Fld1 1 5D Fld2 6 10 0DCSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* En el ejemplo siguiente, CLEAR establece todos los subcampos deC* la estructura de datos DS1 a sus valores por omisión, CHAR aC* blancos, NUM a cero.CC CLEAR DS1CC*C* En el ejemplo siguiente, CLEAR establece todas las apariciones deC* la estructura de datos de apariciones múltiples MODS a sus valoresC* por omisión, Fld1 a blancos, Fld2 a cero.CC CLEAR *ALL MODSC

Figura 191. Operación CLEAR para estructuras de datos

CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....CSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++++++

EVAL ENT0000B = *BLANKSEVAL ENT0000C = *ZEROEVAL %setatr('inventory':'ent0000b':'text') = ENT0000BEVAL %setatr('inventory':'ent0000c':'text') = ent0000c

Figura 192. Cómo borrar ventanas

Capítulo 25. Códigos de operación 423

Page 446: RPG Referencia

CLOSE (Cerrar archivos)

Código Factor 1 Factor 2Campo deresultado Indicadores

CLOSE (E) Nombre de archivo obien *ALL

_ ER _

La operación CLOSE cierra uno o varios archivos. El archivo no se puede volver autilizar a menos que se especifique una operación OPEN para dicho archivo. Elarchivo puede ser un archivo local o un archivo AS/400.

Una operación CLOSE sobre un archivo previamente cerrado no produce un error.

El factor 2 debe contener el nombre del archivo que se ha de cerrar o la palabraclave *ALL. *ALL cierra todos los archivos a la vez. El factor 2 no puede contenerun archivo de matriz o de tabla (se identifica con una T en la posición 18 de lasespecificaciones de descripción de archivo).

Para manejar las excepciones de CLOSE (códigos de estado de archivo mayoresque 1000), puede especificarse el ampliador de código de operación ’E’ o unindicador de error ER, pero no ambos. Para obtener más información sobre lagestión de errores, consulte el apartado “Excepciones/errores de archivo” en lapágina 37.

Las posiciones 71, 72, 75 y 76 deben estar en blanco.

CLSWIN (Cerrar ventana)

Código Factor 1 Factor 2Campo deresultado Indicadores

CLSWIN(E)

Nombre de ventana _ ER _

La operación CLSWIN cierra una ventana y la elimina de la pantalla. Se genera unevento Destroy para la ventana. La ventana debe estar definida en la aplicación.

El factor 2 contiene el nombre de la ventana que se ha de cerrar.

Para manejar las excepciones de CHECKR puede especificarse el ampliador decódigo de operación ’E’ o un indicador de error ER, pero no ambos. Para obtener

*...1....+....2....+....3....+....4....+....5....+....6....+....7...CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* La operación CLOSE explícita cierra FILEB.CC CLOSE FILEBCC* La operación CLOSE *ALL cierra todos los archivos del programa.C* Debe especificar una operación OPEN explícita para los archivosC* que desee volver a utilizar. Si la operación CLOSE no se completaC* satisfactoriamente, %ERROR devuelve '1'.CC CLOSE (E) *ALLC

Figura 193. Operación CLOSE

424 VisualAge RPG Consulta del lenguaje

Page 447: RPG Referencia

más información sobre la gestión de errores, consulte el apartado “Excepciones yerrores de programa” en la página 48.

COMMIT (Comprometer)

Código Factor 1 Factor 2Campo deresultado Indicadores

COMMIT(E)

_ ER _

La operación COMMIT procesa un grupo de cambios en la base de datos deAS/400 como una unidad. Los cambios asociados con la unidad puedenretrotraerse mediante la operación ROLBK.

La operación COMMIT sólo puede utilizarse con archivos de AS/400. No se puedeutilizar con archivos locales.

Para abrir un archivo de base de datos de AS/400 para control de compromiso,especifique COMMIT en la especificación de descripción del archivo. Sólo losarchivos abiertos bajo el control de compromiso se ven afectados por la operaciónCOMMIT, sin tener en cuenta el componente que ha emitido dicha operación.

La operación COMMIT no modifica la posición del archivo. Se liberan todos losbloqueos de los registros para los archivos bajo control de compromiso.

Sólo se puede iniciar un entorno de control de compromiso en un servidor AS/400.Se pueden utilizar estos archivos en otros servidores AS/400, sin embargo, no sepuede trabajar con ellos bajo control de compromiso.

El control de compromiso finaliza cuando la aplicación termina. Si hay cambiospendientes en la base de datos de AS/400 que no se han comprometido niretrotraído explícitamente, se retrotraerán cuando la aplicación termina. Antes deejecutar una operación bajo un entorno de control de compromiso, debe utilizarseel Diseñador GUI para definir el nivel de compromiso. Si desea más informaciónacerca de cómo utilizar el Diseñador GUI para definir la información de AS/400,consulte la publicación Iniciación a VisualAge RPG y CODE/400.

Para manejar las excepciones de COMMIT (códigos de estado de programa 802 a805), puede especificarse el ampliador de código de operación ’E’ o un indicadorde error ER, pero no ambos. Por ejemplo, se produce un error si el control decompromiso no está activo. Para obtener más información sobre la gestión deerrores, consulte el apartado “Excepciones y errores de programa” en la página 48.

*...1....+....2....+....3....+....4....+....5....+....6....+....7...CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq...C Extended-factor2++++++++++++++++++++++++++++C*C* Se cierra una ventana denominada UPDCUST.C CLSWIN 'UPDCUST'

Figura 194. Operación CLSWIN

Capítulo 25. Códigos de operación 425

Page 448: RPG Referencia

COMP (Comparar)

Código Factor 1 Factor 2Campo deresultado Indicadores

COMP Comparando Comparando HI LO EQ

La operación COMP compara el factor 1 con el factor 2.

El factor 1 y el factor 2 deben contener un literal, una constante con nombre, unnombre de campo, un nombre de tabla, un elemento de matriz, una estructura dedatos o una constante figurativa. El factor 1 y el factor 2 deben tener el mismo tipode datos. No especifique el mismo indicador para las tres condiciones. Una vezespecificados, los indicadores resultantes se activan o desactivan para reflejar losresultados de la comparación.

Como resultado de la comparación, los indicadores se activan de la formasiguiente:v Superior: (71-72) El factor 1 es mayor que el factor 2.v Inferior: (73-74) El factor 1 es menor que el factor 2.v Igual: (75-76) El factor 1 es igual al factor 2.

En el apartado “Operaciones de comparación” en la página 375 se describen lasnormas generales para la especificación de operaciones de comparación.

DEALLOC (Liberar almacenamiento)

Código Factor 1 Factor 2 Campo deresultado

Indicadores

DEALLOC(E/N)

Puntero _ ER _

*...1....+....2....+....3....+....4....+....5....+....6....+....7...CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* Los valores iniciales de los campos son:C* FLDA = 100.00C* FLDB = 105.00C* FLDC = 100.00C* FLDD = ABCC* FLDE = ABCDEC*C* El indicador 12 está activado; los indicadores 11 y 13 estánC* desactivados.C FLDA COMP FLDB 111213C*C* El indicador 15 está activado; el indicador 14 está desactivado.C FLDA COMP FLDB 141515C*C* El indicador 18 está activado; el indicador 17 está desactivado.C FLDA COMP FLDC 171718C*C* El indicador 21 está activado; los indicadores 20 y 22 estánC* desactivados.C FLDD COMP FLDE 202122

Figura 195. Operación COMP

426 VisualAge RPG Consulta del lenguaje

Page 449: RPG Referencia

La operación DEALLOC libera una asignación anterior de almacenamientodinámico. El campo del resultado de la operación DEALLOC es un puntero que hade contener el valor que ha establecido anteriormente una operación de asignaciónde almacenamiento dinámico (puede ser una operación ALLOC en RPG o algúnotro mecanismo de asignación de almacenamiento dinámico). No es suficienteseñalar simplemente al almacenamiento dinámico; se ha de establecer que elpuntero señale al principio de una asignación.

El almacenamiento al que señala el puntero se libera para una asignación ulteriorque pueda realizar este programa o cualquier otro del grupo de activación.

Si está especificado el ampliador de operación N, el puntero se establece a *NULLdespués de una desasignación satisfactoria.

Para manejar las excepciones de DEALLOC (código de estado de programa 426),puede especificarse el ampliador de código de operación ’E’ o un indicador deerror ER, pero no ambos. El puntero del campo de resultado no se modificará si seproduce un error, incluso aunque se especifique ’N’. Para obtener más informaciónsobre la gestión de errores, consulte el apartado “Excepciones y errores deprograma” en la página 48.

El campo del resultado debe ser una variable escalar de puntero de base (uncampo autónomo, subcampo de estructura de datos, nombre de tabla o elementode matriz).

No se obtiene ningún error en el momento de la ejecución si el puntero ya es*NULL.

Si desea obtener más información, consulte la sección “Operaciones de gestión dememoria” en la página 382.

Capítulo 25. Códigos de operación 427

Page 450: RPG Referencia

DEFINE (Definición de campo)

Código Factor 1 Factor 2Campo deresultado Indicadores

DEFINE *LIKE Campo al que sehace referencia

Campodefinido

DEFINE *DTAARA Área de datosexternos

Campointerno

Utilice la operación DEFINE para definir un campo basándose en los atributos(longitud y posiciones decimales) de otro campo o para definir un campo con unárea de datos de AS/400.

Los indicadores de condicionamiento (posiciones 9 a 11) no están permitidos.

Definición de un campo basándose en otro campoEl factor 1 debe contener *LIKE.

El factor 2 debe contener el nombre del campo al que se hace referencia. Estecampo puede estar descrito por un programa o externamente. Los atributos delcampo especificado en el factor 2 se utilizan para el campo que se está definiendoen el campo de resultado. Este campo puede estar descrito por un programa oexternamente. El factor 2 no puede ser un literal ni una constante con nombre. Si elfactor 2 es una matriz, un elemento de matriz, una estructura de datos o unnombre de tabla, se utilizan los atributos de un elemento de la matriz o tabla paradefinir el campo.

D Ptr1 S *D Fld1 S 1AD BasedFld S 7A BASED(Ptr1)C* Se asignan 7 bytes del almacenamiento dinámico y se estableceC* que el puntero Ptr1 señale a dicho almacenamiento.C ALLOC 7 Ptr1C*C* La operación DEALLOC libera el almacenamiento. Este almacenamientoC* está disponible para su asignación por este programa o cualquierC* otro programa del grupo de activación. (Observe que la asignaciónC* siguiente no necesariamente volverá a obtener el mismo almacenamiento).C DEALLOC Ptr1C* Ptr1 señala aún al almacenamiento desasignado, pero no debe utilizarseC* este puntero con su valor actual. No es válido cualquier intento deC* acceder a BasedFld que se base en el puntero Ptr1.C*C EVAL Ptr1 = %addr(Fld1)C*C* No es válida la operación DEALLOC porque el puntero se ha establecidoC* a la dirección de almacenamiento de programa. Se establece que %ERRORC* devuelva '1', el estado del programa se establece en 00426 (%STATUSC* devuelve 00426) y no se modifica el puntero.C DEALLOC(E) Ptr1C*C* Se vuelve a asignar y desasignar almacenamiento. Debido a que estáC* especificado el ampliador de operación (N), el puntero Ptr1 tieneC* el valor *NULL después de la operación DEALLOC.C ALLOC 7 Ptr1C DEALLOC(N) Ptr1

Figura 196. Operación DEALLOC

428 VisualAge RPG Consulta del lenguaje

Page 451: RPG Referencia

El campo de resultado contiene el nombre del campo que se define. No puede seruna matriz, un elemento de matriz ni un nombre de tabla.

Puede utilizar las posiciones 64 a 68 (longitud de campo) para hacer que la entradadel campo de resultado sea más larga o más corta que la entrada del factor 2. Laposición 64 puede contener un signo más (+) para indicar un aumento de lalongitud de campo o un signo menos (−) para indicar una reducción de la longitudde campo. Las posiciones 65 a 68 pueden contener el aumento o reducción de lalongitud (ajustado a la derecha) o pueden estar en blanco. La entrada de longitudde campo sólo se permite para campos de tipo gráfico, UCS-2,, numéricos ycarácter. Para campos de tipo gráfico o UCS-2, la diferencia de longitud de campose calcula en caracteres de doble byte.

Si las posiciones 64 a 68 están en blanco, la entrada del campo del resultado sedefine con la misma longitud que la entrada del factor 2.

Nota: No puede modificar el número de posiciones decimales del campo que sedefine.

Si el factor 2 es un campo de tipo gráfico o UCS-2, el campo de resultado sedefinirá con el mismo tipo, esto es, como gráfico o UCS-2. El nuevo campo tendráel CCSID gráfico o UCS-2 por omisión. Si desea que el nuevo campo tenga elmismo CCSID que el campo del factor 2, utilice la palabra clave LIKE en unaespecificación de definición. El ajuste de longitud se expresa en bytes dobles.

Vea ejemplos de *LIKE DEFINE en la Figura 197 en la página 431.

Definición de un campo como un área de datosEl factor 1 debe contener *DTAARA.

Si se especifica el factor 2, debe contener el área de datos de AS/400 a la que sehace referencia. Si no se especifica el factor 2, se utiliza el campo de resultadocomo nombre del área de datos.

El nombre del área de datos puede ser un nombre de área de datos de AS/400 oun nombre que prevalezca sobre él que se haya definido utilizando el elemento demenú Definir información de AS/400. Si desea más información acerca de cómoutilizar el Diseñador GUI para definir la información de AS/400, consulte lapublicación Iniciación a VisualAge RPG y CODE/400.

El campo de resultado debe contener un campo, una estructura de datos, unsubcampo de estructura de datos o una estructura de datos de área de datos. Es elmismo nombre que el que se utiliza en las operaciones IN y OUT para recuperardatos o grabar datos en el área de datos especificada en el factor 2. Cuando seespecifica una estructura de datos de área de datos en el campo del resultado, laaplicación VisualAge RPG recupera los datos desde el área de datos en el momentode arrancar el programa y graba los datos en el área de datos al finalizar elprograma.

El campo de resultado no puede contener lo siguiente:v El nombre de una estructura de datos de estado de programa ni el nombre de

un subcampo de una estructura de datos de estado de programav Una estructura de datos de información de archivo ni el nombre de un

subcampo de una estructura de datos de información de archivov El nombre de un subcampo de una estructura de datos de área de datos

Capítulo 25. Códigos de operación 429

Page 452: RPG Referencia

v Una estructura de datos de múltiples apariciones ni el nombre de un subcampode una estructura de datos de múltiples apariciones.

v Una estructura de datos que aparezca en otra sentencia *DTAARA DEFINEv El nombre de área de datos de la palabra clave DTAARA de la especificación de

definiciónv Un campo de registro de entradav Una matrizv Un elemento de matrizv Una tabla

Nota: Si el campo de resultado es una estructura de datos del área de datos quecontiene un subcampo decimal empaquetado, el área de datos de AS/400debe contener un valor decimal empaquetado válido que se hayainicializado.

En las áreas de datos numéricas, la longitud máxima es de 24 dígitos con 9 lugaresdecimales. Tenga en cuenta que existe un máximo de 15 dígitos a la izquierda delos lugares decimales, aunque el número de decimales sea inferior a 9.

Puede utilizar las posiciones 64 a 70 para definir la longitud y el número deposiciones decimales para el campo de resultado. Debe coincidir con la descripciónexterna del área de datos especificada en el factor 2.

Vea ejemplos de *DTAARA DEFINE en la Figura 197 en la página 431.

430 VisualAge RPG Consulta del lenguaje

Page 453: RPG Referencia

DELETE (Suprimir registro)

Código Factor 1 Factor 2Campo deresultado Indicadores

DELETE (E) Argumento debúsqueda, índicede subarchivo

Nombre de formatode registro, nombrede subarchivo oarchivo

NR ER _

La operación DELETE suprime un registro. Cuando se ha suprimido un registro,no puede volverse a recuperar.

*...1....+....2....+....3....+....4....+....5....+....6....+....7...CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....*C* FLDA es un campo de caracteres de 7 posiciones.C* FLDB es un campo de 5 dígitos con 2 posiciones decimales.C*C*C* FLDP es un campo de caracteres de 7 posiciones.C *LIKE DEFINE FLDA FLDPC*C* FLDQ es un campo de caracteres de 9 posiciones.C *LIKE DEFINE FLDA FLDQ +2C*C* FLDR es un campo de caracteres de 6 posiciones.C *LIKE DEFINE FLDA FLDR - 1C*C* FLDS es un campo numérico de 5 posiciones con 2 posiciones decimales.C *LIKE DEFINE FLDB FLDSC*C* FLDT es un campo numérico de 6 posiciones con 2 posiciones decimales.C *LIKE DEFINE FLDB FLDT + 1C*C* FLDU es un campo numérico de 3 posiciones con 2 posiciones decimales.C *LIKE DEFINE FLDB FLDU - 2C*C* FLDX es un campo numérico de 3 posiciones con 2 posiciones decimales.C *LIKE DEFINE FLDU FLDX*...1....+....2....+....3....+....4....+....5....+....6....+....7...CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* Los atributos (longitud y posiciones decimales) delC* área de datos (TOTGRS) deben ser los mismos que los delC* área de datos externos.CC *DTAARA DEFINE TOTGRS 10 2CC*C* La entrada de campo de resultado (TOTNET) es el nombre del área deC* datos a utilizar dentro del programa VRPG. La entrada del factor 2C* (TOTAL) es el nombre del área de datos tal como se ha definido en elC* sistema.CC *DTAARA DEFINE TOTAL TOTNETC

Figura 197. Operación DEFINE

Capítulo 25. Códigos de operación 431

Page 454: RPG Referencia

Si no se especifica el factor 1, la operación DELETE suprime el registro actual. Elregistro actual es el último registro recuperado. El registro debe haber sidobloqueado por una operación de entrada anterior como, por ejemplo, unaoperación CHAIN o READ.

Si se especifica el factor 1, debe contener una clave, un número relativo de registroo un número de índice de subarchivo que identifique el registro a suprimir:v Si el acceso es por clave, el factor 2 debe ser un archivo remoto AS/400. El factor

1 debe ser un nombre de campo, una constante con nombre o un literal. Siexisten registros duplicados para la clave, sólo se suprime del archivo el primerode los registros duplicados. Si el archivo se describe externamente, el factor 1puede ser una klist.

v Si el acceso se efectúa por número de registro relativo o número de índice desubarchivo, el factor 1 debe contener una constante o variable numérica con ceroposiciones decimales.

v Los campos de clave de tipo gráfico y UCS-2 deben tener el mismo CCSID quela clave del archivo.

El factor 2 debe contener el nombre del archivo o el nombre de un formato deregistro del archivo del que debe suprimirse un registro:v El archivo puede ser un archivo AS/400 o un archivo local.v Un nombre de formato de registro sólo puede utilizarse con un archivo AS/400

descrito externamente. Si no se especifica el factor 1, el nombre de formato delregistro debe ser el nombre del último registro leído del archivo; de lo contrario,se produce un error.

Si el factor 1 tiene una entrada, las posiciones 71 y 72 pueden contener unindicador que se active si el registro a suprimir no se encuentra en el archivo. Si elfactor 1 no tiene una entrada, deje estas posiciones en blanco. Esta informacióntambién puede obtenerse de la función incorporada %FOUND, que devuelve ’0’ sino se ha encontrado ningún registro y ’1’ si se ha encontrado alguno.

Para manejar las excepciones de DELETE (códigos de estado de archivo mayoresque 1000), puede especificarse el ampliador de código de operación ’E’ o unindicador de error ER, pero no ambos. Para obtener más información sobre lagestión de errores, consulte el apartado “Excepciones/errores de archivo” en lapágina 37.

Deje las posiciones 75 y 76 en blanco.

Tenga en cuenta lo siguiente al suprimir registros:v La supresión de un registro de un componente de subarchivo provoca un

desplazamiento de los números de índice de registro del subarchivo para losregistros restantes del subarchivo.

v Si se realiza una operación de lectura secuencial en el archivo después de unaoperación DELETE satisfactoria para dicho archivo, se obtiene el registro situadoa continuación del registro suprimido.

DIV (Dividir)

Código Factor 1 Factor 2Campo deresultado Indicadores

DIV (H) Dividendo Divisor Cociente + − Z

Si se especifica el factor 1, la operación DIV divide el factor 1 por el factor 2; de locontrario, divide el campo del resultado por el factor 2. El cociente se coloca en el

432 VisualAge RPG Consulta del lenguaje

Page 455: RPG Referencia

campo de resultado. Si el factor 1 es 0, el resultado de la operación es 0. El factor 2no puede ser cero. Si es cero, la rutina de manejo de excepciones/errores deVARPG recibe el control. El factor 1 y el factor 2 han de ser numéricos; cada unopuede contener uno de los siguientes: una matriz, elemento de matriz, campo,constante figurativa, literal, constante con nombre, subcampo o nombre de tabla.

El factor 2 no puede ser cero. Si lo es, la rutina de manejo de excepciones/erroresde VRPG recibe el control. El factor 2 debe ser numérico y puede contener unamatriz, un elemento de matriz, un campo, una constante figurativa, un literal, unaconstante con nombre, un subcampo o un nombre de tabla.

Todo resto que resulte de la operación de división se pierde a menos que seespecifique la operación mover resto (MVR) como operación siguiente. Si utilizaindicadores de condicionamiento, la operación DIV debe especificarseinmediatamente antes de la operación MVR.

No puede redondearse el resultado de la operación dividir si está especificado quela operación MVR ha de efectuarse después de la operación DIV.

Nota: La operación MVR no puede efectuarse a continuación de una operaciónDIV si cualquier operando de la operación DIV tiene el formato de comaflotante. Sin embargo, puede especificarse una variable de coma flotantecomo el resultado del código de operación MVR.

En el apartado “Operaciones aritméticas” en la página 367 se describen las normasgenerales para la especificación de operaciones aritméticas.

La figura Figura 162 en la página 368 muestra ejemplos de la operación DIV.

DO (Hacer)

Código Factor 1 Factor 2Campo deresultado Indicadores

DO Valor inicial Valor límite Valor deíndice

La operación DO inicia un grupo de operaciones e indica el número de veces quese procesará el grupo. Para indicar el número de veces que se procesará el grupo,especifique un campo de índice, un valor inicial y un valor límite. Una sentenciaENDDO asociada marca el final del grupo. Si desea más información acerca degrupos DO, consulte “Operaciones de programación estructuradas” en lapágina 390.

Si se especifica el factor 1, debe contener un literal numérico, una constante connombre o un nombre de campo. Si no se especifica el factor 1, el valor inicial es 1.

Si se especifica el factor 2, debe contener un nombre de campo numérico, un literalo una constante con nombre. El factor 2 debe especificarse con cero posicionesdecimales. Si no se especifica el factor 2, el valor límite es 1.

Si se especifica el campo del resultado, debe ser un nombre de campo numéricoque sea lo suficientemente grande para contener el valor límite más el incremento.Cualquier valor del campo del resultado se sustituye por el factor 1 cuandoempieza la operación DO.

Capítulo 25. Códigos de operación 433

Page 456: RPG Referencia

El factor 2 de la operación ENDDO asociada especifica el valor que se ha de añadiral campo de índice (el campo del resultado de la operación DO). Debe ser unliteral numérico o un campo numérico sin posiciones decimales. Si no se especifica,se añade 1 al campo de índice.

Además de la propia operación DO, los indicadores de condición de las sentenciasDO y ENDDO controlan el grupo DO. Los indicadores de condición de lasentencia DO controlan si se inicia o no la operación DO. Estos indicadores sólo secomprueban una vez, al inicio del bucle DO. Los indicadores de condición de lasentencia ENDDO asociada controlan si el grupo DO se repite otra vez. Estosindicadores se comprueban al final de cada bucle.

La operación DO sigue estos 7 pasos:1. Si se cumplen los indicadores de condición de la línea de sentencia DO, se

procesa la operación DO (paso 2). Si no se cumplen, el control pasa a lasiguiente operación a procesar tras la sentencia ENDDO asociada (paso 7).

2. EL valor inicial (factor 1) se mueve al campo del índice (campo de resultado)cuando se inicia la operación DO.

3. Si el valor del índice es mayor al valor límite, el control pasa a la operación decálculo que sigue a la sentencia ENDDO asociada (paso 7). En caso contrario, elcontrol pasa a la primera operación tras la sentencia DO (paso 4).

4. Se procesan todas las operaciones del grupo DO.5. Si no se cumplen los indicadores de condición de la sentencia ENDDO, el

control pasa a la operación de cálculo que sigue a la sentencia ENDDOasociada (paso 7). En caso contrario, se procesa la operación ENDDO (paso 6).

6. La operación ENDDO se procesa añadiendo el incremento al campo del índice.El control pasa al paso 3. (Observe que los indicadores de condición de lasentencia DO no se comprueban otra vez (paso 1) cuando el control pasa alpaso 3.)

7. La sentencia siguiente a la sentencia ENDDO se procesa cuando los indicadoresde condición de las sentencias DO o ENDDO no se cumplen (paso 1 ó 5), ocuando el valor del índice es mayor al valor límite (paso 3).

Nota: El índice, incremento, valor límite e indicadores pueden modificarse dentrodel bucle para afectar la finalización del grupo DO.

Consulte “LEAVE (Abandonar un grupo DO/FOR)” en la página 464 y “ITER(Iterar)” en la página 461 para una descripción de cómo estas operaciones afectan ala operación DO.

Consulte el tema “FOR (Para)” en la página 453 si desea obtener información sobrela realización de bucles repetitivos con expresiones de formato libre para losvalores de inicio, incremento y límite.

434 VisualAge RPG Consulta del lenguaje

Page 457: RPG Referencia

DOU (Hacer hasta)

Código Factor 1 Factor ampliado 2

DOU (M/R) Expresión

La operación DOU es similar a la operación DOUxx. El código de operación DOUprecede a un grupo de operaciones que desea ejecutar una vez como mínimo yposiblemente más de una vez. Una sentencia ENDDO asociada marca el final delgrupo. Se diferencia en que la condición lógica se indica mediante una expresiónde valoración de indicador en la entrada del Factor 2 ampliado.

El factor 1 debe estar en blanco. El factor 2 ampliado contiene la expresión que seha de evaluar. Las operaciones controladas por la operación DOU se ejecutan hastaque es cierta la expresión del campo del factor 2 ampliado. Si desea obtenerinformación acerca de cómo utilizar los ampliadores de operación M y R, consultela sección “Reglas de precisión para operaciones numéricas” en la página 358.

En el apartado “Operaciones que utilizan expresiones” en la página 380 se describecómo especificar expresiones.

En el apartado “Operaciones de comparación” en la página 375 se describen lasnormas para especificar las operaciones de comparación.

*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* El grupo DO se procesa 10 veces cuando el indicador 17 estáC* activado; el proceso se detiene cuando el valor del índiceC* en el campo X, el campo del resultado, es mayor al valorC* límite (10) en el factor 2. Al detener su ejecución el grupoC* DO, el control pasa a la operación inmediatamente posteriorC* a la operación ENDDO. Debido a que no se ha especificado el factor 1C* en la operación DO, el valor inicial es 1. Debido a que no se haC* especificado el factor 2 en la operación ENDDO, el valor deC* incremento es 1.CC 17 DO 10 X 3 0C :C ENDDOC*C* El grupo DO puede procesarse 10 veces. El grupo DO detieneC* su ejecución cuando el valor del índice en el campo X es mayorC* que el valor límite (20) en el factor 2, o si el indicadorC* 50 no está activado al encontrar la operación ENDDO. CuandoC* el indicador 50 no está activado, la operación ENDDO no seC* procesa; por lo tanto, el control pasa a la operación queC* sigue a la operación ENDDO. El valor inicial 2 se especificaC* en el factor 1 de la operación DO, y el valor de incremento 2C* se especifica en el factor 2 de la operación ENDDO.C*C 2 DO 20 X 3 0C :C :C :C 50 ENDDO 2

Figura 198. Operación DO

Capítulo 25. Códigos de operación 435

Page 458: RPG Referencia

DOUxx (Hacer hasta)

Código Factor 1 Factor 2Campo deresultado Indicadores

DOUxx Comparando Comparando

El código de operación DOUxx precede a un grupo de operaciones que deseaejecutar una vez como mínimo y posiblemente más de una vez. Una sentenciaENDDO asociada marca el final del grupo. Para obtener más información acerca delos grupos DO y del significado de xx, consulte “Operaciones de programaciónestructuradas” en la página 390.

El factor 1 y el factor 2 deben contener un literal, una constante con nombre, unnombre de campo, un nombre de tabla, un elemento de matriz, una constantefigurativa o un nombre de estructura de datos. El factor 1 y el factor 2 deben tenerel mismo tipo de datos.

En la sentencia DOUxx, se indica una relación xx. Para especificar una condiciónmás compleja, sitúe las sentencias ANDxx ó ORxx inmediatamente después de lasentencia DOUxx. Las operaciones del grupo DO se procesan una vez, y acontinuación se repite el grupo mientras exista la relación entre el factor 1 y elfactor 2 o exista la condición especificada por la combinación de las operacionesDOUxx, ANDxx o ORxx. El grupo se procesa siempre una vez como mínimoincluso si la condición no se cumple al inicio del grupo.

Además de la propia operación DOUxx, los indicadores de condición de lassentencias DOUxx y ENDDO controlan el grupo DO. Los indicadores de condiciónde la sentencia DOUxx controlan si empieza o no la operación DOUxx. Losindicadores de condición de la sentencia ENDDO asociada pueden provocar queun bucle DO finalice de forma prematura.

CSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++++..C Extended-factor2-continuation+++++++++++++++C* En este ejemplo, el bucle hacer se repetirá hasta pulsar F3.C DOU *INKCC :C :C ENDDOCC* El bucle hacer siguiente se repetirá hasta que *In01 esté activadoC* o hasta que FIELD2 sea mayor que FIELD3CC DOU *IN01 OR (Field2 > Field3)C :C :C ENDDOC* El bucle siguiente se repetirá hasta que X sea mayor que el númeroC* de elementos en ArrayCC DOU X > %elem(Array)C EVAL Total = Total + Array(x)C EVAL X = X + 1C ENDDOCC*

Figura 199. Ejemplo de la operación DOU

436 VisualAge RPG Consulta del lenguaje

Page 459: RPG Referencia

La operación DOUxx sigue estos pasos:1. Si se cumplen los indicadores de condición en la línea de sentencia DOUxx, se

procesa la operación DOUxx (paso 2). Si no se cumplen los indicadores, elcontrol pasa a la siguiente operación a procesar tras la sentencia ENDDOasociada (paso 6).

2. La operación DOUxx se procesa pasando el control a la siguiente operación quepuede procesarse (paso 3). La operación DOUxx no compara el factor 1 y elfactor 2 ni comprueba la condición especificada es este punto.

3. Se procesan todas las operaciones del grupo DO.4. Si no se cumplen los indicadores de condición de la sentencia ENDDO, el

control pasa a la operación de cálculo que sigue a la sentencia ENDDOasociada (paso 6). En caso contrario, se procesa la operación ENDDO (paso 5).

5. La operación ENDDO se procesa comparando el factor 1 y el factor 2 de laoperación DOUxx o comprobando la condición especificada por una operacióncombinada. Si existe la relación xx entre el factor 1 y el factor 2 ó existe lacondición especificada, finaliza el grupo DO y el control pasa a la siguienteoperación de cálculo tras la sentencia ENDDO (paso 6). Si no existe la relaciónxx entre el factor 1 y el factor 2 ó no existe la condición especificada, se repitenlas operaciones del grupo DO (paso 3).

6. La sentencia siguiente a la sentencia ENDDO se procesa cuando los indicadoresde condición de las sentencias DOUxx o ENDDO no se cumplen (pasos 1 ó 4),o cuando existe la relación xx entre el factor 1 y el factor 2 en el paso 5.

Consulte “LEAVE (Abandonar un grupo DO/FOR)” en la página 464 e “ITER(Iterar)” en la página 461 para obtener información acerca de cómo afectan estasoperaciones a la operación DOUxx.

Capítulo 25. Códigos de operación 437

Page 460: RPG Referencia

DOW (Hacer mientras)

Código Factor 1 Factor ampliado 2

DOW(M/R)

Expresión

El código de operación DOW precede a un grupo de operaciones que deseaprocesar cuando exista una condición dada. Una sentencia ENDDO asociada marcael final del grupo. Su función es similar a la del código de operación DOWxx. Sediferencia en que la condición lógica se indica mediante una expresión devaloración de indicador en la entrada del Factor 2 ampliado. Las operacionescontroladas por la operación DOW se ejecutan hasta que se cumple la expresión en

*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* La operación DOUEQ ejecuta la operación del grupo DO una vez comoC* mínimo.CC FLDA DOUEQ FLDBCC*C* En la operación ENDDO, se procesa una comprobación para determinar siC* FLDA es igual a FLDB. Si FLDA no es igual a FLDB, seC* vuelven a procesar las operaciones anteriores. Este bucle continúaC* procesándose hasta que FLDA sea igual a FLDB. Cuando FLDA es igualC* a FLDB, el programa se bifurca a la operación que sigueC* a la operación ENDDO.CC SUB 1 FLDAC ENDDOCC*C* La operación combinada DOUEQ ANDEQ OREQ procesa la operaciónC* del grupo DO una vez como mínimo.CC FLDA DOUEQ FLDBC FLDC ANDEQ FLDDC FLDE OREQ 100CC*C* En la operación ENDDO, se realiza una comprobación para determinarC* la condición especificada, FLDA igual a FLDB y FLDC igual aC* FLDD, se cumple. Si se cumple, el programa se bifurca aC* la operación que sigue a la operación ENDDO. No es necesarioC* comprobar la condición OREQ, si FLDE es igual a 100, si lasC* condiciones DOUEQ y ANDEQ se cumplen. Si la condición especificadaC* no se cumple, se comprueba la condición OREQ. Si éstaC* se cumple, el programa se bifurca a la operaciónC* que sigue a ENDDO. De lo contrario, las operaciones queC* siguen a la operación OREQ se procesan y el programaC* procesa las comprobaciones condicionales comenzando por la segundaC* operación DOUEQ. Si no se cumple la condición DOUEQ, ANDEQ niC* OREQ, las operaciones que siguen a la operación OREQC* se procesan de nuevo.CC SUB 1 FLDAC ADD 1 FLDCC ADD 5 FLDEC ENDDO

Figura 200. Operaciones DOUxx

438 VisualAge RPG Consulta del lenguaje

Page 461: RPG Referencia

el campo del factor 2 ampliado. Si desea obtener información acerca de cómoutilizar los ampliadores de operación M y R, consulte la sección “Reglas deprecisión para operaciones numéricas” en la página 358.

En el apartado “Operaciones de comparación” en la página 375 se describen lasnormas para especificar las operaciones de comparación.

DOWxx (Hacer mientras)

Código Factor 1 Factor 2Campo deresultado Indicadores

DOWxx Comparando Comparando

El código de operación DOWxx precede a un grupo de operaciones que deseaprocesar cuando exista una condición dada. Para especificar una condición máscompleja, inmediatamente a continuación de la sentencia DOWxx debe colocarseuna sentencia ANDxx u ORxx. Una sentencia ENDDO asociada marca el final delgrupo. Para más información acerca de los grupos DO y del significado de xx, vea“Operaciones de programación estructuradas” en la página 390.

El factor 1 y el factor 2 deben contener un literal, una constante con nombre, unaconstante figurativa, un nombre de campo, un nombre de tabla, un elemento dematriz o un nombre de estructura de datos. El factor 1 y el factor 2 deben tener elmismo tipo de datos. La comparación de los factores 1 y 2 sigue las mismasnormas dadas para las operaciones de comparación. Consulte “Operaciones decomparación” en la página 375.

Además de la propia operación DOWxx, los indicadores de condición de lassentencias DOWxx y ENDDO controlan el grupo DO. Los indicadores de condiciónde la sentencia DOWxx controlan si empieza o no la operación DOWxx. Losindicadores de condición en la sentencia ENDDO asociada controlan si el grupoDOW se repite otra vez.

La operación DOWxx sigue estos pasos:1. Si se cumplen los indicadores de condición en la línea de sentencia DOWxx, se

procesa la operación DOWxx (paso 2). Si no se cumplen los indicadores, elcontrol pasa a la siguiente operación a procesar tras la sentencia ENDDOasociada (paso 6).

2. La operación DOWxx se procesa comparando el factor 1 y el factor 2 ócomprobando la condición especificada por una operación combinada DOWxx,ANDxx o ORxx. Si no existe la relación xx entre el factor 1 y el factor 2 ó lacondición especificada por una operación combinada, el grupo DO finaliza y elcontrol pasa a la siguiente operación de cálculo tras la sentencia ENDDO (paso

CSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++++..C Extended-factor2-continuation+++++++++++++++C* En este ejemplo, el bucle hacer se repetirá mientras la condiciónC* sea falsa. Es decir, cuando A > 5 y/o B+C no sean iguales a cero.CC DOW A <= 5 AND B+C = 0C :C :C ENDDOC

Figura 201. Ejemplo de la operación DOW

Capítulo 25. Códigos de operación 439

Page 462: RPG Referencia

6). Si existe la relación xx entre el factor 1 y el factor 2 ó existe la condiciónespecificada, se repiten las operaciones del grupo DO (paso 3).

3. Se procesan todas las operaciones del grupo DO.4. Si no se cumplen los indicadores de condición de la sentencia ENDDO, el

control pasa a la siguiente operación a ejecutar tras la sentencia ENDDOasociada (paso 6). En caso contrario, se procesa la operación ENDDO (paso 5).

5. La operación ENDDO se procesa pasando el control a la operación DOWxx(paso 2). (Observe que los indicadores de condición de la sentencia DOWxx nose comprueban de nuevo en el paso 1.)

6. La sentencia siguiente a la sentencia ENDDO se procesa cuando los indicadoresde condición en las sentencias DOWxx o ENDDO no se cumplen (pasos 1 ó 4),o cuando existe la relación xx entre el factor 1 y el factor 2 en el paso 2.

Consulte “LEAVE (Abandonar un grupo DO/FOR)” en la página 464 e “ITER(Iterar)” en la página 461 para obtener información sobre cómo afectan estasoperaciones a la operación DOWxx.

*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* La operación DOWLT sólo permite que se procese la operaciónC* del grupo DO si FLDA es menor que FLDB. Si FLDA no es menorC* que FLDB, el programa se bifurca a la operación inmediatamenteC* posterior a la operación ENDDO. Si FLDA es menor que FLDB,C* se procesa la operación del grupo DO.CC FLDA DOWLT FLDBCC*C* La operación ENDDO hace que el programa se bifurque a la primeraC* operación DOWLT donde se realiza una comprobación para determinarC* si FLDA es menor que FLDB. Este bucle sigue procesándose hasta queC* FLDA sea igual o mayor que FLDB; entonces el programa se bifurcaC* a la operación inmediatamente posterior a la operación ENDDO.CC MULT 2.08 FLDAC ENDDOCC* En este ejemplo se comprueban varias condiciones. La operaciónC* DOWLT ORLT combinada permite que se procese la operación del grupoC* DO sólo mientras FLDA sea menor que FLDB o FLDC. Si no se cumpleC* ninguna de las condiciones especificadas, el programa se bifurcaC* a la operación inmediatamente posterior a la operación DO. SiC* se cumple alguna de las condiciones especificadas, se procesa laC* operación tras la operación ORLT.CC FLDA DOWLT FLDBC FLDA ORLT FLDCCC* La operación ENDDO hace que el programa se bifurque a la segundaC* operación DOWLT donde una comprobación determina si se cumplen lasC* condiciones especificadas. Este bucle sigue hasta que FLDA seaC* igual o mayor que FLDB y FLDC; entonces el programa se bifurca a laC* operación inmediatamente posterior a la operación ENDDO.CC MULT 2.08 FLDAC ENDDO

Figura 202. Operaciones DOWxx

440 VisualAge RPG Consulta del lenguaje

Page 463: RPG Referencia

DSPLY (Visualizar ventana de mensaje)

Código Factor 1 Factor 2Campo deresultado Indicadores

DSPLY (E) Mensaje Nombre deespecificación dedefinición

Camponumérico

_ ER _

La operación DSPLY visualiza una ventana Mensaje. El programa se para, visualizala ventana de mensaje y espera una respuesta.

El factor 1 debe contener uno de los siguientes elementos:v Un nombre de campov Un nombre de campo definido en la palabra clave MSGNBRv Literal de tipo carácter, literal numérico, literal hexadecimal, literal DBCS, literal

de fecha, literal de hora o literal de indicación de la horav Un nombre de especificación de definiciónv Atributos de eventov Identificador de mensaje

El factor 1 puede contener un atributo de evento siempre que la operación DSPLYesté en una subrutina de acción para un evento adecuado (esto es, el evento tieneel atributo de evento especificado) o la operación DSPLY es una subrutina deusuario ejecutada por una subrutina de acción para un evento. Si se especifica lapalabra clave EXE o NOMAIN en una especificación de control, no se puedeutilizar una descripción de cuadro de mensajes o un identificador de mensaje comonombre de campo.

No se permiten campos de puntero. Con la excepción de los números de mensaje,todos los datos del factor 1 se convierten a caracteres antes de ser visualizados.

Si se especifica el factor 2, debe contener el nombre de Especificación de definiciónque define el estilo. El factor 2 es opcional cuando:v El factor 1 contiene un identificador de mensaje (*MSGnnnn)v El factor 1 contiene un nombre de Especificación de definición y la

Especificación de definición a la que se hace referencia contiene la palabra claveMSGNBR. MSGNBR puede ser el número de mensaje o un campo que contengael número de mensaje.

El factor 2 se ignora si se especifica la palabra clave EXE o NOMAIN en unaespecificación de control.

El campo del resultado contiene un valor que representa el botón que pulsa elusuario en la ventana Mensaje. El valor corresponde a una de las constantesfigurativas que se utilizan para definir los botones que aparecen en el Recuadro deMensaje (por ejemplo, *RETRY). Estas constantes deben utilizarse para comprobarqué botón ha pulsado el usuario. El campo del resultado debe ser un valornumérico con una longitud de 9 y sin posiciones decimales.

Si se especifica la palabra clave EXE o NOMAIN, el campo del resultado puede sernumérico con precisión 9,0 o de caracteres. Los campos de respuesta de lasventanas Mensaje tienen un comportamiento distinto para campos numéricos y decaracteres. Los campos de respuesta numéricos se comportan de la forma siguiente:v Al pulsar Intro o Retorno en el campo se devuelve el valor 0.v El campo sólo acepta 9 dígitos, si se especifican más de 9, se ignoran.v Si se especifica un carácter incluyendo la coma decimal, se produce un error de

tiempo de ejecución y el programa finaliza.

Capítulo 25. Códigos de operación 441

Page 464: RPG Referencia

Los campos de caracteres se comportan de la forma siguiente:v Al pulsar Intro o Retorno el campo se llena de espacios en blanco.v Se ignoran los caracteres adicionales tecleados en el campo. El campo puede

aceptar una o varias palabras.

Cuando se utiliza la palabra clave NOMAIN, los procedimientos llamados desdelas aplicaciones GUI de Windows 95 o Windows NT® se comportan de la formasiguiente:v Para los campos de caracteres o DBCS, no se visualiza ningún mensaje y el

campo de respuesta se llena de espacios en blanco.v Los campos numéricos reciben el valor 0.

Cuando se utiliza la palabra clave EXE o NOMAIN en las aplicaciones deWindows 3.1, no se visualiza ningún mensaje. Los campos de respuesta decaracteres o DBCS se llenan de espacios en blanco; los campos numéricos con elvalor 0.

Para manejar las excepciones de DSPLY puede especificarse el ampliador de códigode operación ’E’ o un indicador de error ER, pero no ambos. Si se produce unerror en la operación, la excepción se maneja mediante el método especificado.Para obtener más información sobre la gestión de errores, consulte el apartado“Excepciones y errores de programa” en la página 48.

Varias palabras clave de la Especificación de definición se utilizan para definir laventana Mensaje. Las palabras clave BUTTON, MSGTITLE y STYLE definen elestilo de la ventana. Las palabras clave MSGDATA, MSGNBR y MSGTEXT definenel texto del mensaje que aparece en la ventana. Consulte la sección “Palabras clavede especificación de definición” en la página 237.

ELSE (En caso contrario)

Código Factor 1 Factor 2Campo deresultado Indicadores

ELSE

*...1....+....2....+....3....+....4....+....5....+....6....+....7...DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++D Box1 M STYLE(*WARN) BUTTON(*RETRY:*ABORT:*IGNORE)D*CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq...C *MSG9999 DSPLY BOX1 REPLY 9 0C IF reply = *RETRY* Se ha pulsado el botón Reintentar

C .....C ELSEC IF reply = *ABORT* Se ha pulsado el botón Cancelar anómalamente

C .....C ELSE* Se ha pulsado el botón Ignorar

C .....C ENDIFC ENDIF

Figura 203. Operación DSPLY

442 VisualAge RPG Consulta del lenguaje

Page 465: RPG Referencia

La operación ELSE es una parte opcional de las operaciones IFxx e IF. Si se cumplela comparación IFxx, se procesan los cálculos anteriores a ELSE; en caso contrariose procesan los cálculos que siguen a ELSE.

No se permiten entradas de indicador de condicionamiento (posiciones 9 a 11).

Para cerrar el grupo IFxx/ELSE, utilice una operación ENDIF.

En la Figura 216 en la página 459 se muestra un ejemplo de una operación ELSEcon una operación IFxx.

ENDyy (Finalizar un grupo estructurado)

Código Factor 1 Factor 2Campo deresultado Indicadores

END Valor de incremento

ENDCS

ENDDO Valor de incremento

ENDFOR

ENDIF

ENDSL

La operación ENDyy finaliza un grupo de operaciones CASxx, DO, DOU, DOW,DOUxx, DOWxx, FOR, IF, IFxx o SELECT.

La operación ENDyy finaliza un grupo de operaciones CASxx, DO, DOU, DOW,DOUxx, DOWxx, FOR, IF, IFxx o SELECT.

A continuación se indican las operaciones ENDyy:

END Finaliza un grupo CASxx, DO, DOU, DOUxx, DOW, DOWxx, FOR,IF, IFxx o SELECT

ENDCS Finaliza un grupo CASxx

ENDDO Finaliza un grupo DO, DOU, DOUxx, DOW o DOWxx

ENDFOR Finaliza un grupo FOR

ENDIF Finaliza un grupo IF o IFxx

ENDSL Finaliza un grupo SELECT

El factor 2 sólo se permite en una operación ENDyy que delimite un grupo DO.Contiene el valor de incremento del grupo DO. Puede ser positivo o negativo, debetener cero posiciones decimales y puede ser un elemento de matriz, un nombre detabla, una estructura de datos, un campo, una constante con nombre o un literalnumérico. Si no se especifica el factor 2, el incremento por omisión es 1. Si el factor2 es negativo, el grupo DO no termina nunca.

Se pueden especificar indicadores de condicionamiento para una operaciónENDDO o ENDFOR. No están permitidos para las operaciones ENDCS, ENDIF yENDSL.

Capítulo 25. Códigos de operación 443

Page 466: RPG Referencia

No se permiten indicadores resultantes. El factor 1, el factor 2 y el campo delresultado han de estar todos en blanco para las operaciones ENDCS, ENDIF yENDSL.

Si se utiliza una forma ENDyy con un grupo de operación distinto (por ejemplo,ENDIF con un grupo estructurado), se produce un error en tiempo de compilación.

Si desea obtener más información, consulte las secciones siguientes, en las queencontrará ejemplos que utilizan la operación ENDyy:v “CASxx (Invocar subrutina condicionalmente)” en la página 409v “DO (Hacer)” en la página 433v “DOUxx (Hacer hasta)” en la página 436v “DOWxx (Hacer mientras)” en la página 439v “IFxx (Si)” en la página 458v “DOU (Hacer hasta)” en la página 435v “DOW (Hacer mientras)” en la página 438v “FOR (Para)” en la página 453v “IF (Si)” en la página 457v “SELECT (Iniciar un grupo de selección)” en la página 530

ENDACT (Fin de subrutina de acción)

Código Factor 1 Factor 2Campo deresultado Indicadores

ENDACT Punto de retorno

La operación ENDACT define el final de una subrutina de acción. ENDACT debeser la última operación de una subrutina de acción.

Si se especifica el factor 2, debe contener uno de los elementos siguientes:

*DEFAULTLa subrutina de acción actual termina y se ejecuta el proceso por omisióncorrespondiente al evento actual.

*NODEFAULTLa subrutina de acción actual termina y NO se ejecuta el proceso poromisión correspondiente al evento actual.

un nombre de campoEl nombre de campo debe tener 12 caracteres y puede contener *DEFAULTo *NODEFAULT Si el campo contiene un valor no válido, el gestor deerrores por omisión recibe el control.

Si no se especifica el factor 2, finaliza la subrutina de acción actual y se ejecuta elproceso por omisión correspondiente al evento actual.

Cuando el proceso llega a la operación ENDACT y si LR está activado, se terminael componente. *DEFAULT y *NODEFAULT se ignoran. Si las subrutinas de acciónestán jerarquizadas, LR no se comprueba y se ignoran *DEFAULT y *NODEFAULT.

No se permiten entradas de indicadores de condicionamiento.

444 VisualAge RPG Consulta del lenguaje

Page 467: RPG Referencia

ENDSR (Fin de subrutina de usuario)

Código Factor 1 Factor 2Campo deresultado Indicadores

ENDSR Etiqueta Punto de retorno

La operación ENDSR define el final de una subrutina de usuario. Origina unavuelta a la sentencia que está a continuación de la operación EXSR. ENDSR debeser la última operación de la subrutina.

Si se especifica el factor 1, debe contener una etiqueta. Una operación GOTO puedebifurcar a esta etiqueta.

El factor 2 sólo puede especificarse al final de una subrutina *PSSR o *INFSR. Debecontener uno de los elementos siguientes:

*CANCLLa subrutina de acción que se estaba ejecutando cuando se produjo el errorfinaliza y el componente lógico termina anormalmente.

*ENDCOMPLa subrutina de acción que se estaba ejecutando cuando se produjo el errorfinaliza y el componente lógico termina anormalmente.

*DEFAULTSe devuelve el control desde la subrutina de acción actual y se ejecuta elproceso por omisión correspondiente al evento actual. Si LR está activado,el componente lógico termina normalmente. Si LR está activado, lasubrutina de acción finaliza y se ejecuta cualquier acción por omisióncorrespondiente al evento.

*NODEFAULTSe devuelve el control desde la subrutina de acción actual y no se ejecutael proceso por omisión correspondiente al evento actual. Si LR estáactivado, el componente lógico termina normalmente. Si LR NO estáactivado, la subrutina de acción finaliza y NO se ejecuta ninguna acciónpor omisión correspondiente al evento.

*ENDAPPLLa subrutina de acción que se estaba ejecutando cuando se ha producido elerror finaliza y finalizan todos los componentes activados actualmente pororden jerárquico inverso. El componente que estaba activo cuando se haproducido el error termina normalmente y todos los demás componentesterminan normalmente.

un nombre de campoUn nombre de campo puede contener *CANCL, *ENDCOMP, *DEFAULT,*NODEFAULT o *ENDAPPL. Si el campo contiene un valor no válido, elmanejador de errores por omisión recibe el control.

*...1....+....2....+....3....+....4....+....5....+....6....+....7...CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq...C Extended-factor2++++++++++++++++++++++++++++C*C ENDACT '*DEFAULT'

Figura 204. Operación ENDACT

Capítulo 25. Códigos de operación 445

Page 468: RPG Referencia

No se permiten los indicadores de condicionamiento.

EVAL (Evaluar expresión)

Código Factor 1 Factor ampliado 2

EVAL(H/M/R)

Sentencia de asignación

La operación EVAL evalúa una sentencia de asignación que tenga la formaresultado=expresión. Se evalúa la expresión y el resultado se sitúa en el resultado.El resultado debe ser un nombre de campo, un nombre de matriz, un elemento dematriz, una estructura de datos, un subcampo de estructura de datos o una serieque utilice la función incorporada %SUBST. Un resultado de tipo carácter, gráfico oUCS-2 se justificará por la izquierda y se rellenará con blancos, o bien se truncarási es necesario. El resultado no puede ser un literal ni una constante.

Si el resultado representa una matriz sin índice o una matriz especificada comoarray(*), el valor de la expresión se asigna a cada elemento del resultado, deacuerdo a las normas descritas en el capítulo de matrices. En caso contrario, laexpresión se evalúa una vez y el valor se coloca en cada elemento de la matriz osubmatriz.

El tipo de la expresión debe ser el mismo que el tipo del resultado. Paraexpresiones numéricas, se permite el ampliador del código de operación deredondeo. Las normas para redondear son equivalentes a las de las operacionesaritméticas.

Consulte el apartado “Capítulo 24. Expresiones” en la página 351 para obtenerinformación sobre expresiones. Consulte la sección “Reglas de precisión paraoperaciones numéricas” en la página 358 si desea obtener información acerca de lasreglas de precisión para las expresiones numéricas. Esto adquiere una importanciaespecial si la expresión contiene operaciones de dividir o si la operación EVALutiliza alguno de los ampliadores de operación.

*...1....+....2....+....3....+....4....+....5....+....6....+....7...CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq...C Extended-factor2++++++++++++++++++++++++++++C*C Label BEGSRC .C .C .C ENDSR '*ENDCOMP'

Figura 205. Operación ENDSR

446 VisualAge RPG Consulta del lenguaje

Page 469: RPG Referencia

EVALR (Evaluar expresión, ajuste por la derecha)

Código Factor 1 Factor ampliado 2

EVALR (M/R) Sentencia de asignación

El código de operación EVALR evalúa una sentencia de asignación que tenga laforma resultado=expresión. Se evalúa la expresión y el resultado se sitúa ajustadopor la derecha en el resultado. Por lo tanto, el resultado no puede ser un literal oconstante, pero sí debe ser un nombre de campo de tipo carácter, gráfico o UCS-2de longitud fija, un nombre de matriz, un elemento de matriz, una estructura dedatos, un subcampo de estructura de datos o una serie que utilice la funciónincorporada %SUBST. El tipo de la expresión debe ser el mismo que el tipo delresultado. El resultado se alineará a la derecha y se rellenará con blancos a laizquierda, o se truncará por la izquierda si es necesario.

Nota: A diferencia de la operación EVAL, el resultado de EVALR sólo puede ser detipo carácter, gráfico o UCS-2. Además, sólo se permiten campos de

CSRN01Factor1+++++++Opcode(E)+Extended-factor2++++++++++++++++++++++++++++C* Suponer FIELD1 = 10C* FIELD2 = 9C* FIELD3 = 8C* FIELD4 = 7C* ARR se define con DIM(10)C* *IN01 = *ONC* A = 'abcdefghijklmno' (definido long 15)C* CHARFIELD1 = 'There' (definido long 5)C* El contenido de RESULT tras la operación es 20C EVAL RESULT=FIELD1 + FIELD2+(FIELD3-FIELD4)C* El indicador *IN03 se establecerá en *TRUEC EVAL *IN03 = *IN01 OR (FIELD2 > FIELD3)C* Se asignará el valor 72 a cada elemento de la matriz ARRC EVAL ARR(*) = FIELD2 * FIELD3C* Tras la operación, el contenido de A = 'Hello There 'C EVAL A = 'Hello ' + CHARFIELD1C* Tras la operación, el contenido de A = 'HelloThere 'C EVAL A = %TRIMR('Hello ') + %TRIML(CHARFIELD1)C* Fecha en la asignaciónC EVAL ISODATE = DMYDATEC* Expresión relacionalC* Tras la operación, el valor de *IN03 = *ONC EVAL *IN03 = FIELD3 > FIELD2C* Fecha en expresión relacionalC EVAL *IN05 = Date1 > Date2C* Tras EVAL el valor original de A contiene 'ab****ghijklmno'C EVAL %SUBST(A:3:4) = '****'C :C* Tras EVAL, PTR tiene la dirección de la variable CHARFIELD1C EVAL PTR = %ADDR(CHARFIELD1)C :C* Ejemplo para mostrar que el resultado de una expresión lógicaC* es compatible con el tipo de datos de caracteresC* La sentencia EVAL siguiente consta de 3 expresiones lógicasC* cuyos resultados se concatenan usando el operador '+'C* El valor resultante del campo de caracteres RES es '010'C :C EVAL RES = (FIELD1<10) + *in01 + (field2 >= 17)

Figura 206. Operaciones EVAL

Capítulo 25. Códigos de operación 447

Page 470: RPG Referencia

resultado de longitud fija, aunque %SUBST puede contener un campo delongitud variable si esta función incorporada forma la parte izquierda de laexpresión.

Si el resultado representa una matriz sin índice o una matriz especificada comoarray(*), el valor de la expresión se asigna a cada elemento del resultado, según lasnormas descritas en el apartado “Especificación de una matriz en los cálculos” enla página 168. En caso contrario, la expresión se evalúa una vez y el valor se colocaen cada elemento de la matriz o submatriz.

Consulte el apartado “Capítulo 24. Expresiones” en la página 351 para obtenerinformación sobre expresiones. Consulte la sección “Reglas de precisión paraoperaciones numéricas” en la página 358 si desea obtener información acerca de lasreglas de precisión para las expresiones numéricas. Esto adquiere una importanciaespecial si la expresión contiene operaciones de dividir o si la operación EVALRutiliza alguno de los ampliadores de operación.

EXCEPT (Salida en tiempo de cálculo)

Código Factor 1 Factor 2Campo deresultado Indicadores

EXCEPT nombre EXCEPT

La operación EXCEPT permite que se graben uno o más registros de excepcióndurante el tiempo de cálculo. El archivo en el que se graban los registros puede serun archivo local o un archivo AS/400.

Los registros de excepción que se han de grabar en tiempo de cálculo se indicancon E (en la posición 17) en las especificaciones de salida. El nombre EXCEPT delfactor 2 ha de ser igual al nombre EXCEPT de las especificaciones de salida(posiciones 30 a 39) de los registros de excepción.

Si se especifica un nombre en el factor 2, sólo se comprueban los registros deexcepción con el mismo nombre EXCEPT y se graban si se satisfacen losindicadores de condicionamiento. Si no se especifica el factor 2, sólo secomprueban los registros de excepción de las especificaciones de salida (posiciones30 a 39) y se graban si se satisfacen los indicadores de condicionamiento.

DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++*

D Name S 20A*

CSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++++*

C EVAL Name = 'Kurt Weill'* Name ahora es 'Kurt Weill '

C EVALR Name = 'Johann Strauss'* Name ahora es ' Johann Strauss'

C EVALR %SUBST(Name:1:12) = 'Richard'* Name ahora es ' Richard Strauss'

C EVAL NAME = 'Wolfgang Amadeus Mozart'* Name ahora es 'Wolfgang Amadeus Moz'

C EVALR NAME = 'Wolfgang Amadeus Mozart'* Name ahora es 'fgang Amadeus Mozart'

Figura 207. Operaciones EVALR

448 VisualAge RPG Consulta del lenguaje

Page 471: RPG Referencia

Si se especifica una salida de excepción en un formato que no contiene campos,tiene lugar lo siguiente:v Si se especifica un archivo de salida, se graba un registro con valores por

omisión.v Si un registro está bloqueado, el sistema trata la operación como una petición

para desbloquear el registro. Esta es la forma alternativa de solicitar undesbloqueo. Para ello, es preferible utilizar la operación UNLOCK.

EXSR (Invocar subrutina de usuario)

Código Factor 1 Factor ampliado 2

EXSR Nombre de subrutina de usuario

La operación EXSR hace que se procese la subrutina de usuario nombrada en elfactor 2. El nombre de subrutina de usuario debe ser un nombre simbólicoexclusivo y debe aparecer como el factor 1 de una operación BEGSR. La operaciónEXSR puede aparecer en cualquier lugar de las especificaciones de cálculo. Cuandola subrutina de usuario es una subrutina de excepción/error con una entrada en elfactor 2 de la operación ENDSR, no se procesa la sentencia que figura acontinuación de EXSR.

*...1....+....2....+....3....+....4....+....5....+....6....+....7...CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* Cuando se procesa la operación EXCEPT con HDG especificado en el factorC* factor 2, se graban todos los registros de excepción con el nombreC* EXCEPT HDG. En este ejemplo, se imprimiría UDATE y PAGE y despuésC* la impresora dejaría un espacio de 2 líneas.C* El segundo registro HDG imprimiría una línea de puntos y despuésC* la impresora dejaría un espacio de 3 líneas.C EXCEPT HDGC*C* Cuando se procesa la operación EXCEPT sin entrada en el factor 2,C* se graban todos los registros de excepción que no tienen un nombreC* EXCEPT especificado en las posiciones de 30 a 39 si se cumplen losC* indicadores de condición. Una operación EXCEPT sin entrada en elC* factor 2 graba los registros de excepción sin indicadoresC* de condición y sin un nombre EXCEPT.C* En este ejemplo, si el indicador 10 está activado, se imprimiránC* TITLE y AUTH y después la impresora dejará un espacio de 1 línea.C EXCEPTO*OFilename++DF..N01N02N03Excnam++++B++A++Sb+Sa+.............................O..............N01N02N03Field+++++++++YB.End++PConstant/editword/DTformat++O E 10 1O TITLEO AUTHO E HDG 2O UDATEO PAGEO E HDG 3O '...............'O '...............'O E DETAIL 1O AUTHO VERSNO

Figura 208. Operaciones EXCEPT

Capítulo 25. Códigos de operación 449

Page 472: RPG Referencia

El factor 2 debe contener un nombre simbólico exclusivo o la palabra clave*TERMSR, *PSSR o *INZSR:v *TERMSR especifica que se ha de procesar la subrutina de terminación normalv *PSSR especifica que se ha de procesar la subrutina de excepción/error de

programav *INZSR especifica que se ha de procesar la subrutina de inicialización.

No puede utilizarse la operación EXSR para procesar una subrutina de acción.

Codificación de subrutinas de usuarioUna subrutina de usuario puede procesarse desde cualquier punto de lasoperaciones de cálculo. Pueden procesarse todas las operaciones dentro de unasubrutina de usuario, y pueden condicionarse estas operaciones mediante cualquierindicador válido en las posiciones comprendidas entre 9 y 11. En las posiciones 7 y8 pueden aparecer SR o blancos. Pueden indicarse líneas AND/OR de la subrutinade usuario en las posiciones 7 y 8.

Los campos utilizados en una subrutina de usuario pueden definirse en la mismasubrutina de usuario o en otra parte del programa. En cualquier caso, los campospueden utilizarse tanto por el programa como por la subrutina de usuario.

Una subrutina de usuario no puede contener otra subrutina de usuario. Unasubrutina de usuario puede llamar a otra subrutina de usuario; esto es, unasubrutina puede contener una operación EXSR o CASxx. Sin embargo, unaoperación EXSR o CASxx en una subrutina de usuario no puede llamarse a símisma directamente. No deben efectuarse llamadas indirectas a sí misma a travésde otra subrutina, porque se producen resultados imprevisibles. Utilice los códigosde operación GOTO y TAG si desea bifurcar a otro punto de la misma subrutina.

No es necesario especificar las subrutinas por el mismo orden en que se van autilizar. Cada subrutina debe tener un nombre simbólico exclusivo y debe conteneruna operación BEGSR y una operación ENDSR.

Se permite la utilización de la operación GOTO en una subrutina. GOTO puedeespecificar la etiqueta de la operación ENDSR asociada a esa subrutina; no puedeespecificar el nombre de una operación BEGSR. No puede emitirse GOTO a unTAG o ENDSR en una subrutina a menos que GOTO esté en la misma subrutinaque TAG o ENDSR. Puede utiliza la operación LEAVESR para salir de unasubrutina desde cualquier punto de su interior. El control pasa a la operaciónENDSR de la subrutina. Utilice LEAVESR sólo en el interior de una subrutina.

450 VisualAge RPG Consulta del lenguaje

Page 473: RPG Referencia

*...1....+....2....+....3....+....4....+....5....+....6....+....7...CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C*C :C :C EXSR SUBRTBC :C :C :C EXSR SUBRTAC :C :C :C SUBRTA BEGSRC :C :C :C*C* Una subrutina puede llamar a otra subrutina.C*C EXSR SUBRTCC :C :C :C ENDSRC SUBRTB BEGSRC :C :C :C*

Figura 209. Ejemplo de cómo codificar subrutinas de usuario - utilización de BEGSR y EXSR

*...1....+....2....+....3....+....4....+....5....+....6....+....7...CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* Las operaciones GOTO y TAG pueden utilizarse en otra subrutina.C*C START TAGC :C :C :C 23 GOTO ENDC :C :C :C 24 GOTO STARTC END ENDSRC SUBRTC BEGSRC :C :C :C ENDSRC*

Figura 210. Ejemplo de cómo codificar subrutinas de usuario - utilización de GOTO y TAG

Capítulo 25. Códigos de operación 451

Page 474: RPG Referencia

EXTRCT (Extraer fecha/hora/indicación de la hora)

Código Factor 1 Factor 2Campo deresultado Indicadores

EXTRCT (E) Fecha/Hora:Códigode duración

Destino _ ER _

La operación EXTRCT devuelve una de las siguientes salidas en el campo delresultado:v La parte del año, mes o día de un campo de fecha o de indicación de la horav La parte de horas, minutos o segundos de un campo de hora o de indicación de

la horav La parte de microsegundos del campo de indicación de la hora

El factor 2 debe ser un campo, un subcampo, un elemento de tabla o un elementode matriz. Debe especificarse la fecha, la hora o la indicación de la hora seguidadel código de duración. Para obtener una lista de los códigos de duración, consulte“Operaciones de fecha” en la página 377.

El factor 1 debe estar en blanco.

El campo del resultado debe ser un campo numérico o de caracteres, un subcampo,un elemento de tabla o un elemento de matriz. Los datos de tipo carácter seajustan por la izquierda en el campo de resultado.

Cuando se utiliza la operación EXTRCT con una fecha juliana (formato *JUL), laespecificación de un código de duración *D significa la devolución del día del mesy al especificar *M se devolverá el mes del año. Si necesita que el día y el mesestén en formato de 3 dígitos, puede utilizar un puntero base para obtenerlo.

Si se especifica un indicador de resultado en las posiciones 73 y 74, se activacuando se produce un error durante la operación EXTRCT.

Para manejar las excepciones de EXTRCT (código de estado de programa 112),puede especificarse el ampliador de código de operación ’E’ o un indicador deerror ER, pero no ambos. Para obtener más información sobre la gestión de errores,consulte el apartado “Excepciones y errores de programa” en la página 48.

CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C* Extrae el mes de un campo de indicación de la hora a un campo deC* 2 dígitos que se utiliza como índice de una matriz de caracteresC* que contiene los nombres de los meses. A continuación extrae elC* día de la indicación de la hora a un campo de caracteres de 2C* bytes que puede utilizarse en una expresión de concatenaciónC* EVAL para formar una serie que contenga, por ejemplo,C* "Marzo 13"CC EXTRCT LOGONTIME:*M LOGMONTH 2 0C EXTRCT LOGONTIME:*D LOGDAY 2C EVAL DATE_STR = %TRIMR(MONTHS(LOGMONTH)C + ' ' + LOGDAY

Figura 211. Operaciones EXTRCT

452 VisualAge RPG Consulta del lenguaje

Page 475: RPG Referencia

FEOD (Forzar fin de datos)

Código Factor 1 Factor 2Campo deresultado Indicadores

FEOD (E) Nombre de archivo _ ER _

La operación FEOD señala el final lógico de los datos para un archivo AS/400. Elarchivo puede volverse a utilizar para operaciones de archivo subsiguientes sinespecificar la operación OPEN. El archivo todavía está conectado al programa. Esdiferente a la operación CLOSE, en la que se desconecta el archivo del programa yel usuario debe especificar una operación OPEN si desea volver a utilizar elarchivo. Para obtener más información, consulte el apartado “CLOSE (Cerrararchivos)” en la página 424.

La operación FEOD sólo se puede utilizar con archivos AS/400.

El factor 2 contiene el archivo para el que se especifica FEOD.

Para manejar las excepciones de FEOD (códigos de estado de archivo mayores que1000), puede especificarse el ampliador de código de operación ’E’ o un indicadorde error ER, pero no ambos. Para obtener más información sobre la gestión deerrores, consulte el apartado “Excepciones/errores de archivo” en la página 37.

Para procesar otras operaciones secuenciales después de la operación FEOD (porejemplo, utilizando READ o READP), se debe volver a situar el archivo.

La operación FEOD vacía los datos del almacenamiento intermediocorrespondientes a los archivos de salida. Los datos se graban en DISK oPRINTER.

FOR (Para)

Código Factor 1 Factor ampliado 2

FOR nombre-índice = valor-inicial BY incremento TO |DOWNTO límite

La operación FOR inicia un grupo de operaciones y controla el número de vecesque se procesará dicho grupo. Para indicar el número de veces que debeprocesarse el grupo de operaciones, especifique un nombre de índice, un valorinicial, un valor de incremento y un valor de límite. Los valores opcionales deinicio, incremento y límite pueden ser expresiones de formato libre. Una sentenciaEND o ENDFOR asociada marca el final del grupo. Si desea más informaciónacerca de los grupos FOR, consulte el apartado “Operaciones de programaciónestructuradas” en la página 390.

La sintaxis de la operación FOR es la siguiente:FOR nombre-índice { = valor-inicial }

{ BY valor-incremento }{ TO | DOWNTO valor-límite }

{ cuerpo del bucle }ENDFOR | END

El nombre de índice debe ser el nombre de una variable numérica escalar con ceroposiciones decimales. No puede ser una matriz indexada. Valor-inicial,

Capítulo 25. Códigos de operación 453

Page 476: RPG Referencia

valor-incremento y valor-límite pueden ser valores o expresiones numéricos concero posiciones decimales. El valor de incremento, si se especifica, no puede sercero.

Las cláusulas BY y TO (o DOWNTO) se pueden especificar en cualquier orden. Sepermite tanto ″BY 2 TO 10″ como ″TO 10 BY 2″.

Además de la propia operación FOR, los indicadores de condición de las sentenciasFOR y ENDFOR (o END) controlan el grupo FOR. Los indicadores decondicionamiento en la sentencia FOR controlan si empieza o no la operación FOR.Estos indicadores sólo se comprueban una vez, al inicio del bucle FOR. Losindicadores de condición de la sentencia END o ENDFOR asociada controlan si elgrupo FOR se repite otra vez. Estos indicadores se comprueban al final de cadabucle.

La operación FOR se realiza de la siguiente manera:1. Si se cumplen los indicadores de condición en la línea de sentencia FOR, se

procesa la operación FOR (paso 2). Si no se cumplen los indicadores, el controlpasa a la siguiente operación a procesar tras la sentencia END o ENDFORasociada (paso 8).

2. Si se especifica, se asigna el valor inicial al nombre de índice. De lo contrario, elnombre de índice conserva el valor que tenía antes del inicio del bucle.

3. Si se especifica, se evalúa el valor límite y se compara con el nombre de índice.Si no se especifica ningún valor de límite, el bucle se repetirá indefinidamentehasta que encuentre una sentencia que salga del bucle (como por ejemploLEAVE o GOTO) o hasta que finalice el programa o procedimiento (como porejemplo RETURN).Si se especifica la cláusula TO y el valor del nombre de índice es mayor que elvalor de límite, el control pasa a la primera sentencia que sigue a la sentenciaENDFOR. Si se especifica DOWNTO y el valor del nombre de índice es menorque el valor de límite, el control pasa a la primera sentencia que sigue aENDFOR.

4. Se procesan las operaciones del grupo FOR.5. Si no se cumplen los indicadores de condición de la sentencia END o ENDFOR,

el control pasa a la siguiente sentencia después del END o ENDFOR asociado yfinaliza el bucle.

6. Si se especifica el valor de incremento, se evalúa. De lo contrario, el incrementotoma el valor por omisión de 1.

7. El valor de incremento se suma (para TO) o se resta (para DOWNTO) alnombre de índice. El control regresa al paso 3. (Los indicadores decondicionamiento de la sentencia FOR no se comprueban otra vez (paso 1)cuando el control regresa al paso 3.)

8. Se procesa la sentencia siguiente a la sentencia END o ENDFOR cuando no secumplen los indicadores de condicionamiento de las sentencias FOR, END oENDFOR, o cuando el valor del índice es mayor que (para TO) o menor que(para DOWNTO) el valor del límite (paso 3), o cuando se desborda el valor delíndice.

Nota: Si el bucle FOR se realiza n veces, el valor del límite se evalúa n+1 veces yel valor del incremento se evalúa n veces. Este hecho cobra importancia si laevaluación del valor del límite o del valor del incremento es compleja ylaboriosa o si el valor del límite o el valor del incremento contienenllamadas a subprocedimientos con efectos colaterales. Si no se desea laevaluación repetida del límite o del incremento, calcule los valores envariables temporales antes del bucle FOR y utilice dichas variablestamporales en el bucle FOR.

454 VisualAge RPG Consulta del lenguaje

Page 477: RPG Referencia

Tenga en cuenta lo siguiente al especificar la operación FOR:v El nombre de índice no puede declararse en la operación FOR. Las variables

deben declararse en las especificaciones D.v No se permite que un elemento de matriz indexada sea el campo de índice de

una operación FOR.

Consulte los apartados “LEAVE (Abandonar un grupo DO/FOR)” en la página 464y “ITER (Iterar)” en la página 461 para obtener información sobre cómo afectanestas operaciones a la operación FOR.

GETATR (Recuperar atributo)

Código Factor 1 Factor 2Campo deresultado Indicadores

GETATR(E)

nombre decomponente

atributo nombre decampo

_ ER _

CSRN01Factor1+++++++Opcode(E)+Extended-factor2++++++++++++++++++++++++++++** Ejemplo 1* Calcular n!

C EVAL factorial = 1C FOR i = 1 to nC EVAL factorial = factorial * iC ENDFOR** Ejemplo 2* Buscar el último carácter que no sea blanco de un campo.* Si el campo tiene todo blancos, "i" será cero.* De lo contrario, "i" será la posición del carácter no en blanco.*

C FOR i = %len(campo) downto 1C IF %subst(campo: i: 1) <> ' 'C LEAVEC ENDIFC ENDFOR** Ejemplo 3* Extraer todas las palabras delimitadas con blancos de una frase.

C EVAL WordCnt = 0C FOR i = 1 by WordIncr to %len(Frase)* ¿Es un espacio en blanco?

C IF %subst(Frase: i: 1) = ' 'C EVAL WordIncr = 1C ITERC ENDIF* Se ha encontrado una palabra - determinar su longitud:

C FOR j = i+1 to %len(Frase)C IF %SUBST(Frase: j: 1) = ' 'C LEAVEC ENDIFC ENDFOR* Almacenar la palabra:

C EVAL WordIncr = j - iC EVAL WordCnt = WordCnt + 1C EVAL Word(WordCnt)C = %subst(Frase: i: WordIncr)C ENDFOR

Figura 212. Ejemplos de la operación FOR

Capítulo 25. Códigos de operación 455

Page 478: RPG Referencia

La operación GETATR recupera el valor de un atributo de un componente. Elnombre de la ventana padre es el nombre de ventana por omisión. El atributo deun componente sólo se puede recuperar si se ha creado dicho componente.

Notas:

1. Las operaciones GETATR pueden utilizarse en subrutinas de acción demúltiples enlaces. Para una descripción de las subrutinas de acción demúltiples enlaces, consulte “BEGACT (Empezar subrutina de acción)” en lapágina 397. Para recuperar un atributo correspondiente a un componente deuna ventana que no es la ventana padre, utilice la función incorporada%GETATR. Para obtener una descripción de la función incorporada %GETATR,consulte “%GETATR (Recuperar atributo)” en la página 327.

2. La operación GETATR no soporta valores enteros con signo y sin signo de 1 y 8bytes, ni valores Unicode.

El factor 1 debe contener el nombre de un componente (que debe ser un literal decaracteres) o un nombre de campo que contenga el nombre de un componente(que debe ser de caracteres).

El factor 2 debe contener el nombre del atributo que se está recuperando (que debeser un literal de caracteres) o un nombre de campo que contenga el nombre de unatributo (que debe ser de caracteres).

El factor 1 y el factor 2 no pueden contener caracteres gráficos.

El campo del resultado debe contener el nombre del campo que contiene el valorrecuperado del atributo. El tipo del campo del resultado debe ser el mismo que eltipo del atributo.

Para manejar las excepciones de GETATR puede especificarse el ampliador decódigo de operación ’E’ o un indicador de error ER, pero no ambos. Para obtenermás información sobre la gestión de errores, consulte el apartado “Excepciones yerrores de programa” en la página 48.

Nota: La operación GETATR no afecta a los campos del programacorrespondientes a los componentes. Si desea que el campo del programacorrespondiente al componente contenga el valor actual del campo deentrada, haga que éste sea el destino de la operación.

*...1....+....2....+....3....+....4....+....5....+....6....+....7...CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq...C Extended-factor2++++++++++++++++++++++++++++C*C* Recuperar el tipo de un componente denominado MLE01.C*C 'MLE01' GETATR 'PartType' Mle

Figura 213. Operación GETATR

456 VisualAge RPG Consulta del lenguaje

Page 479: RPG Referencia

GOTO (Ir a)

Código Factor 1 Factor 2Campo deresultado Indicadores

GOTO Etiqueta

La operación GOTO permite saltar operaciones de cálculo dando instrucciones alprograma para que vaya a (o bifurque a) una etiqueta especificada del programa.Una operación TAG contiene el destino de una operación GOTO. El TAG puede irdetrás o delante de GOTO.

Puede emitirse GOTO dentro de una subrutina del procedimiento principal para ira una operación TAG dentro de la misma subrutina. Puede emitirse GOTO dentrode una subrutina de un subprocedimiento para ir a una operación TAG dentro dela misma subrutina o dentro del cuerpo del subprocedimiento.

El factor 2 debe contener la etiqueta a la que el programa se bifurcará. Dichaetiqueta se entra en el factor 1 de una operación TAG o ENDSR. La etiqueta debeser un nombre simbólico exclusivo.

Para una descripción de la operación TAG, consulte “TAG (Etiqueta)” en lapágina 548.

IF (Si)

Código Factor 1 Factor ampliado 2

IF (M/R) Blanco Expresión

La operación IF permite procesar una serie de códigos de operación si se cumpleuna condición dada. Su función es similar a la del código de operación IFxx. Sediferencia en que la condición lógica se describe en una expresión de la entrada del

*...1....+....2....+....3....+....4....+....5....+....6....+....7...CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* Si el indicador 10, 15 ó 20 está activado, el programa se bifurcaC* a la etiqueta TAG especificada en las operaciones GOTO.C*C 10 GOTO RTN1C*C*C 15 GOTO RTN2C*C RTN1 TAGC*C :C :C :C 20 GOTO ENDC*C :C :C :C END TAG

Figura 214. Operaciones GOTO y TAG

Capítulo 25. Códigos de operación 457

Page 480: RPG Referencia

Factor 2 ampliado. Las operaciones controladas por la operación IF se efectúancuando se cumple la expresión del campo de factor ampliado 2.

Si desea obtener información acerca de cómo utilizar los ampliadores de operaciónM y R, consulte la sección “Reglas de precisión para operaciones numéricas” en lapágina 358. En el apartado “Operaciones de comparación” en la página 375 sedescriben las normas para especificar las operaciones de comparación.

IFxx (Si)

Código Factor 1 Factor 2Campo deresultado Indicadores

IFxx Comparando Comparando

La operación IFxx permite que se procese un grupo de cálculos si se da unadeterminada relación, especificada por xx, entre los factores 1 y 2. Cuando seutilizan las operaciones ANDxx y ORxx con IFxx, se procesa el grupo de cálculos sise cumple la condición especificada por las operaciones combinadas. (Si deseaconocer el significado de xx, consulte el apartado “Operaciones de programaciónestructuradas” en la página 390.)

El factor 1 y el factor 2 deben contener un literal, una constante con nombre, unaconstante figurativa, un nombre de tabla, un elemento de matriz, un nombre deestructura de datos o un nombre de campo. Las entradas del factor 1 y del factor 2deben ser del mismo tipo de datos.

Si la relación especificada por la operación IFxx y cualquier operación ANDxx uORxx asociada no existe, el control se cede a la operación de cálculo que sigueinmediatamente a la operación ENDIF asociada. Si se especifica también unaoperación ELSE, el control pasa a la primera operación de cálculo que se puedeprocesar después de la operación ELSE.

Las entradas de indicador de condicionamiento en la operación ENDIF asociadacon IFxx deben estar en blanco.

CSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++++..C Extended-factor2-continuation+++++++++++++++C* Las operaciones controladas por la operación IF se realizanC* cuando la expresión es verdadera. Es decir, A es mayor a 10 y elC* indicador 20 está activado.CC IF A>10 AND *IN(20)C :C ENDIFC*C* Las operaciones controladas por la operación IF se realizanC* cuando Date1 representa una fecha posterior a Date2CC IF Date1 > Date2C :C ENDIFC*

Figura 215. Operaciones IF

458 VisualAge RPG Consulta del lenguaje

Page 481: RPG Referencia

Debe utilizarse una sentencia ENDIF para cerrar un grupo IFxx. Si una sentenciaELSE sigue a una sentencia IFxx, se necesita una sentencia ENDIF tras la sentenciaELSE, pero no tras la sentencia IFxx.

Dispone de la opción de sangrar sentencias DO, cláusulas IF-ELSE y cláusulasSELECT-WHENxx-OTHER en el listado de compilación para facilitar su lectura.Consulte la ayuda en línea del diálogo Proyecto>Opciones de creación en elDiseñador GUI para obtener una descripción de las opciones de compilador.

En el apartado “Operaciones de comparación” en la página 375 se describen lasnormas para especificar las operaciones de comparación.

*...1....+....2....+....3....+....4....+....5....+....6....+....7....+....CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* Si FLDA es igual a FLDB, se procesa el cálculo tras la operación IFEQC* Si FLDA no es igual a FLDB, el programa se bifurca a laC* operación inmediatamente posterior al ENDIF.CC FLDA IFEQ FLDBC :C :C :C ENDIFCC* Si FLDA es igual a FLDB, se procesa el cálculo tras la operación IFEQC* y el control pasa a la operación inmediatamente posterior a laC* sentencia ENDIF. SI FLDA no es igual a FLDB, el control pasa aC* la sentencia ELSE y se procesa el cálculo inmediatamenteC* posterior.CC FLDA IFEQ FLDBC :C :C :C ELSEC :C :C :C ENDIF*...1....+....2....+....3....+....4....+....5....+....6....+....7....+....CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* Si FLDA es igual a FLDB y mayor que FLDC o si FLDD es igualC* a FLDE y mayor que FLDF, se procesa el cálculo posterior aC* la operación ANDGT. Si no se da ninguna de las condicionesC* especificadas, el programa se bifurca a la operaciónC* inmediatamente posterior a la sentencia ENDIF.CC FLDA IFEQ FLDBC FLDA ANDGT FLDCC FLDD OREQ FLDEC FLDD ANDGT FLDFC :C :C :C ENDIF

Figura 216. Operaciones IFxx/ENDIF e IFxx/ELSE/ENDIF

Capítulo 25. Códigos de operación 459

Page 482: RPG Referencia

IN (Recuperar un área de datos)

Código Factor 1 Factor 2Campo deresultado Indicadores

IN (E) *LOCK Nombre de área dedatos

_ ER _

La operación IN recupera un área de datos.

Si se especifica el factor 1, debe contener *LOCK. *LOCK indica que ningún otroprograma puede actualizar o bloquear el área de datos hasta que:v Se realice una operación UNLOCKv Se realice una operación OUT sin ninguna entrada en el factor 1v El programa desbloquee de manera implícita el área de datos cuando finalice el

mismo.

Si un área de datos está bloqueada, otros programas la pueden leer pero no lapueden actualizar.

El factor 2 es el nombre del área de datos. Este es el nombre especificado en elcampo del resultado de la operación DEFINE o en la especificación de definición.Si el nombre se especifica en la operación DEFINE (utilizando *DTAARA), serecuperan todas las áreas de datos definidas en el programa.

Para manejar las excepciones de IN (código de estado de programa 401-421, 431 o432), puede especificarse el ampliador de código de operación ’E’ o un indicadorde error ER, pero no ambos. Para obtener más información sobre la gestión deerrores, consulte el apartado “Excepciones y errores de programa” en la página 48.

Las posiciones 71-72 y 75-76 deben estar en blanco.

Para ver una descripción de las normas generales, consulte “Operaciones de áreade datos” en la página 376.

*...1....+....2....+....3....+....4....+....5....+....6....+....7...CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* TOTAMT, TOTGRS y TOTNET se definen como áreas de datos. La operaciónC* IN recupera todas las áreas de datos definidas en el programa y lasC* bloquea. El programa procesa los cálculos y, después, graba yC* desbloquea todas las áreas de datos.C* Después otros programas pueden utilizar las áreas de datos.C*C *LOCK IN *DTAARAC ADD AMOUNT TOTAMTC ADD GROSS TOTGRSC ADD NET TOTNETCC OUT *DTAARACC*C* Definir Áreas de datosC*C *DTAARA DEFINE TOTAMT 8 2C *DTAARA DEFINE TOTGRS 10 2C *DTAARA DEFINE TOTNET 10 2

Figura 217. Operaciones IN y OUT

460 VisualAge RPG Consulta del lenguaje

Page 483: RPG Referencia

ITER (Iterar)

Código Factor 1 Factor 2Campo deresultado Indicadores

ITER

La operación ITER transfiere el control dentro de un grupo DO o FOR a lasentencia ENDDO o ENDFOR del grupo DO. Puede utilizarse en bucles DO, DOU,DOUxx, DOW, DOWxx y FOR para transferir inmediatamente el control a lasentencia ENDDO o ENDFOR del bucle. Hace que se ejecute inmediatamente lasiguiente iteración del bucle. ITER tiene efecto sobre el bucle más interno.

Si se especifican indicadores de condicionamiento en la sentencia ENDDO oENDFOR a la que se pasa el control y no se cumple dicha condición, el procesocontinúa en la sentencia que sigue a la operación ENDDO o ENDFOR.

La operación LEAVE es similar a la operación ITER; no obstante, LEAVE transfiereel control a la sentencia que sigue a la operación ENDDO o ENDFOR.

*...1....+....2....+....3....+....4....+....5....+....6....+....7....+....CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* El ejemplo siguiente utiliza un bucle DOU que contiene unC* bucle DOW. La sentencia IF comprueba el indicador 1. Si elC* indicador 01 está activado, se ejecuta la operación LEAVE,C* transfiriendo el control del bucle DOW más interno a laC* instrucción Z-ADD. Si el indicador 01 no está ACTIVADO, se procesaC* la operación PROC1. Entonces se comprueba el indicador 12.C* Si está desactivado, ITER transfiere el control al ENDDOC* más interno y se evalúa de nuevo la condición del DOW.C* Si el indicador 12 está ACTIVADO, se procesa la subrutina PROC2.CC DOU FLDA = FLDBC :C NUM DOWLT 10C IF *IN01C LEAVEC ENDIFC EXSR PROC1C *IN12 IFEQ *OFFC ITERC ENDIFC EXSR PROC2C ENDDOC Z-ADD 20 RSLT 2 0C :C ENDDOC :

Figura 218. Operación ITER (Pieza 1 de 2)

Capítulo 25. Códigos de operación 461

Page 484: RPG Referencia

KFLD (Definir partes de una clave)

Código Factor 1 Factor 2Campo deresultado Indicadores

KFLD Campo declave

La operación KFLD indica que un campo forma parte de un argumento debúsqueda identificado por un nombre KLIST.

La operación KFLD puede especificarse en cualquier posición de los cálculos, perodebe seguir a una operación KLIST o KFLD. No se permiten entradas de indicadorde condicionamiento (posiciones 9 a 11).

Las operaciones KFLD pueden ser globales o locales. Una operación KLIST de unprocedimiento principal sólo puede tener operaciones KFLD globales asociadas.Una operación KLIST de un subprocedimiento puede tener operaciones KFLDglobales y locales.

El factor 2 puede contener un indicador para un campo de clave con posibilidadde nulos si se especifica la opción Control de usuario o la palabra claveALWNULL(*USRCTL).

Si el indicador está activado, se seleccionan los campos de clave con valores nulos.Si el indicador está desactivado o no se ha especificado, no se seleccionan loscampos de clave con valores nulos. Consulte el apartado “Operaciones por clave”en la página 131 para obtener información sobre cómo acceder a las claves con

posibilidad de nulos.

*...1....+....2....+....3....+....4....+....5....+....6....+....7....+....CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* El ejemplo siguiente utiliza un bucle DOU que contiene unC* bucle DOW. La sentencia IF comprueba el indicador 1. Si elC* indicador está ACTIVADO, se ejecuta la operación MOVE,C* seguida de la operación LEAVE, transfiriendo el controlC* desde el bucle DOW más interno a la instrucción Z-ADD. Si elC* indicador 01 no está ACTIVADO, ITER transfiere el control alC* ENDDO más interno y la condición DOW se evalúa de nuevo.C :C FLDA DOUEQ FLDBC :C NUM DOWLT 10C *IN01 IFEQ *ONC MOVE 'UPDATE' FIELD 20C LEAVEC ELSEC ITERC ENDIFC ENDDOC Z-ADD 20 RSLT 2 0C :C ENDDOC :

Figura 218. Operación ITER (Pieza 2 de 2)

462 VisualAge RPG Consulta del lenguaje

Page 485: RPG Referencia

El campo de resultado debe contener el nombre de un campo que debe ser partedel argumento de búsqueda. El campo del resultado no puede contener un nombrede matriz. Cada campo de KFLD debe tener la misma longitud, tipo de datos yposiciones decimales que el campo correspondiente de la clave compuesta delregistro o archivo. Sin embargo, si el registro tiene un campo de KFLD de longitudvariable, el campo correspondiente de la clave compuesta debe ser variable perono es necesario que tenga la misma longitud. No es necesario que cada campo deKFLD tenga el mismo nombre que el campo correspondiente de la clavecompuesta. El orden en que los campos KFLD se especifican en la KLISTdetermina qué KFLD se asocia a un campo en particular de la clave compuesta.Por ejemplo, el primer campo KFLD que sigue a una operación KLIST se asocia alcampo situado más a la izquierda (de orden superior) de la clave compuesta.

Los campos de clave de tipo gráfico y UCS-2 deben tener el mismo CCSID que laclave del archivo.

La Figura 219 en la página 464 muestra un ejemplo de la operación KLIST conoperaciones KFLD.

KLIST (Definir una clave compuesta)

Código Factor 1 Factor 2Campo deresultado Indicadores

KLIST Nombre KLIST

La operación KLIST da un nombre a una lista de KFLD. Dicha lista se utiliza comoargumento de búsqueda para recuperar registros de los archivos descritosexternamente que tienen una clave compuesta. Una clave compuesta es una claveque contiene una lista de campos de clave. Se crea de izquierda a derecha. Elprimer KFLD especificado es el campo más a la izquierda (orden superior) de unaclave compuesta.

Una KLIST debe ir seguida inmediatamente por un KFLD como mínimo. UnaKLIST finaliza al encontrarse una operación no KFLD. Si un argumento debúsqueda se compone de más de un campo (una clave compuesta), debeespecificar una KLIST con varios KFLD. Puede utilizarse el mismo nombre deKLIST como argumento de búsqueda para varios archivos o puede utilizarse variasveces como argumento de búsqueda para el mismo archivo.

El factor 1 debe contener un nombre exclusivo. Este nombre puede aparecer en elfactor 1 de una operación CHAIN, DELETE, READE, READPE, SETGT o SETLL.

No se permiten entradas de indicador de condicionamiento (posiciones 9 a 11).

Una operación KLIST de un procedimiento principal sólo puede tener operacionesKFLD locales asociadas. Una operación KLIST de un subprocedimiento puedetener operaciones KFLD globales y locales.

Capítulo 25. Códigos de operación 463

Page 486: RPG Referencia

LEAVE (Abandonar un grupo DO/FOR)

Código Factor 1 Factor 2Campo deresultado Indicadores

LEAVE

La operación LEAVE transfiere el control de un grupo DO o FOR a la sentenciaque sigue a la operación ENDDO o ENDFOR.

Puede utilizar LEAVE en un bucle DO, DOU, DOUxx, DOW, DOWxx o FOR paratransferir inmediatamente el control del bucle más interno a la sentencia que siguea la operación ENDDO o ENDFOR del bucle más interno. Cuando se utilizaLEAVE para abandonar un grupo DO o FOR no se incrementa el índice.

En bucles anidados, LEAVE hace que se transfiera el control un solo nivel haciaafuera. LEAVE no se permite fuera de un grupo DO o FOR.

La operación ITER es similar a la operación LEAVE; no obstante, ITER transfiere elcontrol a la sentencia ENDDO o ENDFOR.

*...1....+....2....+....3....+....4....+....5....+....6....+....7...A* Fuente DDSA R RECORDA FLDA 4A SHIFT 1 0A FLDB 10A CLOCK# 5 0A FLDC 10A DEPT 4A FLDD 8A K DEPTA K SHIFTA K CLOCK#A*A* Fin de Fuente DDSA*A************************************************************************...1....+....2....+....3....+....4....+....5....+....6....+....7...CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* La operación KLIST indica el nombre, FILEKY, por el que puedeC* especificarse el argumento de búsqueda.C FILEKY KLISTC KFLD DEPTC KFLD SHIFTC KFLD CLOCK#

Figura 219. Operaciones KLIST y KFLD

464 VisualAge RPG Consulta del lenguaje

Page 487: RPG Referencia

LEAVESR (Abandonar una subrutina)

Código Factor 1 Factor 2Campo deresultado Indicadores

LEAVESR

Puede utilizar la operación LEAVESR para salir de una subrutina desde cualquierpunto de su interior. El control pasa a la operación ENDSR de la subrutina.LEAVESR sólo se permite dentro de una subrutina.

La entrada de nivel de control (posiciones 7 y 8) puede ser SR o estar en blanco.Pueden especificarse entradas de indicador de condicionamiento (posiciones 9 a11).

*...1....+....2....+....3....+....4....+....5....+....6....+....7....+....CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* El ejemplo siguiente utiliza un bucle infinito. Cuando elC* usuario teclea 'q', el control se transfiere a la operaciónC* LEAVE, que a su vez transferirá el control fuera del bucleC* a la operación Z-ADD.C*C 2 DOWNE 1C :C IF ANSWER = 'q'C LEAVEC ENDIFC :C ENDDOC Z-ADD A BC*C* El ejemplo siguiente utiliza un bucle DOUxx que contieneC* un DOWxx. La sentencia IF comprueba el indicador 1. Si estáC* activado, se activa el indicador 99 y el control pasa a laC* operación LEAVE fuera del bucle DOWxx.C*C* Se ejecuta una segunda instrucción LEAVE ya que el indicador 99C* está activado, que a su vez transfiere el control fueraC* del bucle DOUxxC*C :C FLDA DOUEQ FLDBC NUM DOWLT 10C *IN01 IFEQ *ONC SETON 99C LEAVEC :C ENDIFC ENDDOC 99 LEAVEC :C ENDDOC :

Figura 220. Operación LEAVE

Capítulo 25. Códigos de operación 465

Page 488: RPG Referencia

LOOKUP (Buscar un elemento en tabla o matriz)

Código Factor 1 Factor 2Campo deresultado Indicadores

LOOKUP

(matriz) Argumento debúsqueda

Nombre de matriz HI LO EQ

(tabla) Argumento debúsqueda

Nombre de tabla Nombre detabla

HI LO EQ

La operación LOOKUP busca un elemento en una matriz o en una tabla. Elargumento de búsqueda y la tabla o matriz deben tener el mismo tipo y la mismalongitud (excepto los campos Fecha y Hora, que pueden tener una longituddistinta). Si la tabla o matriz es de tipo carácter, gráfico o UCS-2 de longitud fija, elargumento de búsqueda debe ser también de longitud fija. En el caso de longitudvariable, la longitud del argumento de búsqueda puede tener una longitud distintaa la de la matriz o tabla. Debe especificarse una secuencia para la tabla o matriz enla especificación de definición utilizando las palabras clave ASCEND o DESCEND.

El factor 1 debe ser un literal, un nombre de campo, un elemento de matriz, unnombre de tabla, una constante con nombre o una constante figurativa. Lanaturaleza de la comparación depende del tipo de datos:

Datos gráficos y UCS-2La comparación es hexadecimal.

Datos numéricosNo se procesa la alineación decimal.

Otro tipo de datosLas consideraciones de comparación descritas en “Operaciones decomparación” en la página 375 son aplicables a otros tipos.

CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq...*

C CheckCustName BEGSRC Name CHAIN CustFile** Comprueba que el nombre identifique un cliente válido*

C IF not %found(CustFile)C EVAL Result = CustNotFoundC LEAVESRC ENDIF** Comprueba si el cliente disfruta del programa de descuentos

C IF Qualified = *OFFC EVAL Result = CustNotQualifiedC LEAVESRC ENDIF** Si se llega hasta aquí, es que el cliente puede utilizar el* programa de descuentos

C EVAL Result = CustOKC ENDSR

Figura 221. Operaciones de LEAVESR

466 VisualAge RPG Consulta del lenguaje

Page 489: RPG Referencia

En una operación LOOKUP en tabla, el argumento de búsqueda es el últimoelemento seleccionado de la tabla en una operación LOOKUP. Si la últimaoperación LOOKUP no se ha procesado, como argumento de búsqueda se utiliza elprimer elemento de la tabla. Si se especifica el campo del resultado para unaoperación LOOKUP en tabla, debe contener el nombre de una segunda tabla. Laposición de los elementos de la segunda tabla corresponde a la posición de loselementos de la primera tabla. La operación LOOKUP recupera el elemento de lasegunda tabla.

En una operación LOOKUP en matriz, se puede utilizar un índice. La operaciónLOOKUP empieza por el elemento especificado en el índice. El valor del índice seestablece al número de posición del elemento localizado. Si el índice es igual a ceroo mayor que la cantidad de elementos de la matriz cuando empieza la búsqueda,se produce un error. El índice se establece en 1 si la búsqueda no es satisfactoria. Siel índice es una constante con nombre, el valor del índice no se modifica.

Deben especificarse indicadores de resultados para determinar la búsqueda que seha de realizar y después para reflejar el resultado de la búsqueda. También debeespecificarse en la especificación de definición una secuencia para la tabla o matrizutilizando las palabras clave ASCEND o DESCEND. Los indicadores especificadossólo se activan si la búsqueda es satisfactoria. No pueden utilizarse más de dosindicadores. Los indicadores de resultado pueden asignarse a las posiciones deigual y superior, o de igual e inferior. El programa busca una entrada que satisfagacualquier condición dando prioridad a la igualdad; es decir, si no se encuentraninguna entrada igual, se selecciona la entrada inmediatamente menor o mayor.

Si se especifica un indicador en las posiciones 75-76, la función incorporada%EQUAL devuelve ’1’ en el caso de que se encuentre un elemento que coincidaexactamente con el argumento de búsqueda. La función incorporada %FOUNDdevuelve ’1’ en el caso de que una búsqueda especificada sea satisfactoria.

Los indicadores de resultado pueden asignarse a las posiciones de igual e inferioro igual y superior. No se puede especificar superior e inferior en la mismaoperación LOOKUP. El compilador supone la existencia de una matriz o tablaordenada en secuencia cuando se especifica un indicador superior o inferior parala operación LOOKUP. La operación LOOKUP busca una entrada que satisfaga lacondición inferior/igual o superior/igual dando prioridad a la igualdad.v Superior (71-72): Da instrucciones al programa para que busque la entrada más

próxima al argumento de búsqueda que sea superior en la secuencia. La primeraentrada mayor que se encuentre activa el indicador asignado a superior.

v Inferior (73-74): Da instrucciones al programa para que busque la entrada máspróxima al argumento de búsqueda que sea inferior en la secuencia. La primeraentrada de dicho tipo activa el indicador asignado a inferior.

v Igual (75-76): Da instrucciones al programa para que busque la entrada igual alargumento de búsqueda. La primera entrada igual que se encuentra activa elindicador asignado a igual.

Si el indicador de igual es el único indicador especificado, se busca toda la matrizo tabla. Si la tabla o matriz está en orden ascendente y desea una comparación deigualdad, especifique el indicador Superior. De este modo no se produce unabúsqueda de toda la tabla o matriz.

Capítulo 25. Códigos de operación 467

Page 490: RPG Referencia

MOVE (Mover)

Código Factor 1 Factor 2Campo deresultado Indicadores

MOVE (P) Atributos dedatos

Campo de origen Campo dedestino

+ − ZB

La operación MOVE transfiere caracteres del factor 2 al campo del resultado. Latransferencia comienza con el carácter más a la derecha del factor 2.

Cuando se mueven campos de fecha, hora o indicación de la hora, el factor 1debe estar en blanco a menos que el origen o el destino sea un campo numérico ode caracteres.

De lo contrario, el factor 1 contiene el formato de fecha o de hora compatible conel campo numérico o de caracteres que es el origen de la operación. Para obtenerinformación acerca de los formatos que pueden utilizarse, consulte los apartados“Datos de fecha” en la página 112, “Datos de hora” en la página 126 y “Datos deindicación de la hora” en la página 128.

Si el origen o el destino es un campo de caracteres, puede indicar el separador quesigue al formato en el factor 1. Sólo se permiten los separadores que son válidospara ese formato.

*...1....+....2....+....3....+....4....+....5....+....6....+....7....+....CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* En este ejemplo, el programador desea saber qué elemento deC* ARY localiza la operación LOOKUP. La operación Z-ADD estableceC* el campo X en 1. LOOKUP empieza en el elemento de ARY indicadoC* por el campo X y continúa su proceso hasta encontrar el primerC* elemento igual a SRCHWD. El valor del índice, X, se estableceC* en el número de posición del elemento localizado.CC Z-ADD 1 X 3 0C SRCHWD LOOKUP ARY(X) 26CC* En este ejemplo, el programador desea saber si se encuentra unC* elemento igual a SRCHWD. LOOKUP busca en ARY hasta encontrar elC* primer elemento igual a SRCHWD. Cuando esto ocurre, se activaC* el indicador 26 y se establece %EQUAL para que devuelva '1'.CC SRCHWD LOOKUP ARY 26CC* LOOKUP empieza en un número de índice de variable especificadoC* por el campo X. El campo X no necesita establecerse en 1 antes deC* la operación LOOKUP. Cuando LOOKUP localiza el primer elemento deC* ARY igual a SRCHWD, se activa el indicador 26 y %EQUAL seC* establece para que devuelva '1'. El valor del índice, X, seC* establece en el número de posición del elemento localizado.C*CC SRCHWD LOOKUP ARY(X) 26

Figura 222. Operación LOOKUP con matrices

468 VisualAge RPG Consulta del lenguaje

Page 491: RPG Referencia

Si el factor 2 es *DATE o UDATE y el resultado es un campo de fecha, no serequiere el factor 1. Si el factor 1 contiene un formato de fecha, debe ser compatiblecon el formato de *DATE o UDATE, como se especifica en la palabra claveDATEDIT en la especificación de control.

Cuando se transfieren datos de tipo carácter, gráfico, UCS-2 o numérico si elfactor 2 es mayor que el campo de resultado, no se transfieren los caracteres odígitos sobrantes más a la izquierda de factor 2. Si el campo de resultado es mayorque el factor 2, permanecen intactos los caracteres o dígitos más a la izquierda, amenos que se especifique que se rellenen.

No puede especificar indicadores resultantes si el campo de resultado es unamatriz; puede especificarlos si se trata de un elemento de una matriz o un campoque no es de una matriz.

Si el factor 2 es más corto que la longitud del campo de resultado, especificar unaP en la posición del ampliador de operación provoca que se rellene por laizquierda el campo de resultado después de que se produzca el movimiento.

No se permiten los campos ni literales numéricos flotantes como entradas decampo de resultado o de Factor 2.

Si se especifica o se asume CCSID(*GRAPH : IGNORE) para el módulo, no sepermiten las operaciones MOVE entre los datos de tipo gráfico y UCS-2.

Al mover datos de tipo carácter, gráfico o UCS-2 de longitud variable, el campode longitud variable funciona de la misma forma que un campo de longitud fijacon la misma longitud actual. Para obtener ejemplos al respecto, consulte lasfiguras 229 a 234.

Las tablas que aparecen a continuación de los ejemplos (consulte el apartado“Ejemplos de MOVE (Parte 1)” en la página 470) muestran cómo se mueven losdatos del factor 2 al campo de resultado. Para obtener más información acerca dela operación MOVE, vea “Operaciones Mover” en la página 384.

Capítulo 25. Códigos de operación 469

Page 492: RPG Referencia

Ejemplos de MOVE (Parte 1)

Caráctera

carácter

Caráctera

numérico

Numéricoa

numérico

Numéricoa

carácter

Antes de MOVE

Después de MOVE

Antes de MOVE

Después de MOVE

Antes de MOVE

Después de MOVE

Antes de MOVE

Después de MOVE

Antes de MOVE

Después de MOVE

Factor 2 m ás corto que el campo de resultado

Factor 2 Campo de resultado

Factor 2 más largo que el campo de resultado

Factor 2 Campo de resultado

1 3 4 H 4 S N2 P

1 3 4 8 4 2 42 7

1 1 2 8 4 2 52 7

1 3 4 6 7 8 92 5

P H 4 S NA C F G

6 7 8 45

8 4 2 47

8 4 27 5

G X 4 B t

G X 4 B t

+

a. Caráctera

carácter

b.

c.

d.

Caráctera

numérico

Numéricoa

numérico

Numéricoa

carácter

+

_

A C

P H 4 S NA C E G

G X 4 B tA C E G

P H 4 S NA C E G

G X 4 B tA C E G

6 7 4 85

a.

b.

c.

d.

SP H 4 N

SP H 4 N

P H 4 S N

P H 4 S N

1 3 4 6 7 8 42 5

1 2 8 4 2 57

1 2 8 4 2 57

1 2 8 4 2 57

1 2 8 4 2 57

1 2 8 4 2 57

6 7 8 45

8 4 2 57

1 3 4 6 7 8 42 51 3 4 6 7 8 42 5

1 2 8 4 2 57

1 2 8 4 2 57

1 2 8 4 2 57

1 2 8 4 2 57

Antes de MOVE

Después de MOVE

Antes de MOVE

Después de MOVE

Antes de MOVE

Después de MOVE

Figura 223. Operación MOVE (Pieza 1 de 2)

470 VisualAge RPG Consulta del lenguaje

Page 493: RPG Referencia

a.

b.

c.

d.

Antes de MOVE

Después de MOVE

Factor 2 m ás corto que el campo de resultadoCon P en el campo ampliador de operación

Factor 2 Campo de resultado

Factor 2 con la misma longitud que el campo de resultado

Factor 2 Campo de resultado

4 = letra t y 5 = letra u.Nota:

0 0 0 8 4 2 40 7

0 1 2 8 4 2 50 7

1 3 4 6 7 8 92 5

P H 4 S NA C F G

8 4 2 57

6 7 8 45

8 4 2 47

8 4 27 u

A L T 5 F

A L T 5 F

H S NNP 4

P H 4 S N

G X 4 B t

a.

b.

c.

d.

Caráctera

numérico

Numéricoa

numérico

Numéricoa

carácter

+

_

P H 4 S N

1 3 4 6 7 8 42 5

1 3 4 6 7 8 42 5

1 2 8 4 2 57

1 2 8 4 2 57

1 2 8 4 2 57

1 2 8 4 2 57

1 2 8 4 2 57

8 4 2 57

8 4 2 57

6 7 8 45

8 4 2 57

G X 4 B t

SP H 4 N

SP H 4 N

G X 4 B t

G X 4 B t

P H 4 S N

8 4 2 57

Caráctera

carácter

Antes de MOVE

Después de MOVE

Antes de MOVE

Después de MOVE

Antes de MOVE

Después de MOVE

Antes de MOVE

Después de MOVE

Antes de MOVE

Después de MOVE

Antes de MOVE

Después de MOVE

Antes de MOVE

Después de MOVE

Caráctera

numérico

Numéricoa

numérico

Numéricoa

carácter

Caráctera

carácter

Figura 223. Operación MOVE (Pieza 2 de 2)

Capítulo 25. Códigos de operación 471

Page 494: RPG Referencia

*...1....+....2....+....3....+....4....+....5....+....6....+....7....+....H* Formato de fecha de especificación de controlH*H DATFMT(*ISO)HDName++++++++++ETDsFrom+++To/L+++IDc.Functions+++++++++++++++++++++++++++D*D DATE_ISO S DD DATE_YMD S D DATFMT(*YMD)D INZ(D'1992-03-24')D DATE_EUR S D DATFMT(*EUR)D INZ(D'2197-08-26')D DATE_JIS S D DATFMT(*JIS)D NUM_DATE1 S 6P 0 INZ(210991)D NUM_DATE2 S 7P 0D CHAR_DATE S 8 INZ('02/01/53')D CHAR_LONGJUL S 8A INZ('2039/166')D DATE_USA S D DATFMT(*USA)D*CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+H1LoEq..C*C* Mover entre campos Fecha. DATE_EUR contendrá 24.03.1992C*C MOVE DATE_YMD DATE_EURC*C* Convierte un valor numérico en formato ddmmaa a Fecha *ISO.C* DATE_ISO contendrá 1991-09-21 después de cada uno de los 2C* movimientos.C*C *DMY MOVE 210991 DATE_ISOC *DMY MOVE NUM_DATE DATE_ISOC*C* Traslada un valor de carácter que representa una fecha a *MDYC* a una Fecha *JIS.C* DATE_JIS contendrá 1953-02-01 después de cada uno de los dosC* movimientos.C*C *MDY/ MOVE '02/01/53' DATE_JISC *MDY/ MOVE CHAR_DATE DATE_JIS

Figura 224. Operación MOVE con fecha

472 VisualAge RPG Consulta del lenguaje

Page 495: RPG Referencia

C*C* DATE_USA contendrá 12-31-9999C*C MOVE *HIVAL DATE_USAC*C* Error de ejecución, que provoca un código de error 114. El AñoC* no está en el rango de fechas 1940 a 2039. DATE_YMD no se modificará.C*C MOVE DATE_USA DATE_YMDC*C* Mover un valor de caracteres que representa una fechaC* *CYMD a una fecha *USA.C* DATE_USA contendrá 08/07/1961 después del movimiento.C* 0 en *CYMD indica que el valor de caracteres noC* contiene separadoresC* *CYMD0 MOVE CHAR_NO_SEP DATE_USAC*C* Mover un campo de fecha *EUR a un campo numérico queC* representará una fecha *CMDY. NUM_DATE2 contendráC* 2082697 después del movimiento.C *CMDY MOVE DATE_EUR NUM_DATE2C*C* Mover un valor de caracteres que representa una fechaC* *LONGJUL a una fecha *YMD. DATE_YMD será 39/06/15C* después del movimiento.C *LONGJUL MOVE CHAR_LONGJUL DATE_YMD

Figura 225. Operación MOVE con fecha (continuada)

*...1....+....2....+....3....+....4....+....5....+....6....+....7....+....H* Especificar formato por omisión para campos de fechaH DATEFMT(*ISO)H*DName++++++++++ETDsFrom+++To/L+++IDc.Functions+++++++++++++++++++D date_USA S D DATFMT(*USA)D datefield S DD timefield S T INZ(T'14.23.10')D chr_dateA S 6 INZ('041596')D chr_dateB S 7 INZ('0610807')D chr_time S 6CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq..C* Mover un valor de caracteres que representa una fecha *MDYC* a un valor D(Date).C* *MDY0 indica que la fecha de caracteres en el factor 2 noC* contiene separadores.C* datefld contendrá 1996-04-15 después del movimiento.C *MDY MOVE chr_dateA datefldC* Mover un campo que contiene un valor T(Time) a un valor de caracteresC* en el formato *EUR. *EUR0 indica que el campo de resultado no debeC* contener separadores.C* chr_time contendrá '142310' después del movimiento.C *EUR0 MOVE timefld chr_timeC*C* Mover un valor de caracteres que representa unaC* fecha *CYMD a una fecha *USAC* Date_USA contendrá 08/07/1961 después de la operación mover.C* 0 en *CYMD indica que el valor de caracteres noC* contiene separadores.C*C *CYMD0 MOVE chr_dateB date_USA

Figura 226. Operación MOVE con fecha y hora sin separadores

Capítulo 25. Códigos de operación 473

Page 496: RPG Referencia

*...1....+....2....+....3....+....4....+....5....+....6....+....7....+....H* Formato DATEDIT de especificación de controlH*H DATEDIT(*MDY)H*DName+++++++++++ETDsFrom+++To/L+++IDc.Functions+++++++++++++++++++++++D Jobstart S ZD Datestart S DD Timestart S TD Timebegin S T inz(T'05.02.23')D Datebegin S D inz(D'1991-09-24')D TmStamp S Z inzD*C* Establecer la indicación de la hora Jobstart con laC* Fecha y Hora de inicio del trabajoC*C* El factor 1 de MOVE *DATE (*USA = MMDDYYYY) es coherenteC* con el valor especificado para la palabra clave DATEDIT enC* la especificación de control, puesto que DATEDIT(*MDY) indicaC* que *DATE tiene el formato MMDDYYYY.C*C* Nota: No es necesario especificar el factor 1 con *DATE oC* UDATE.C*CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq..C *USA MOVE *DATE DatestartC TIME StrTime 6 0C *HMS MOVE StrTime TimestartC MOVE Datestart JobstartC MOVE Timestart JobstartC*C* Después de que se lleven a cabo las siguientes especificaciones C, elC* campo stampchar contendrá '1991-10-24-05.17.23.000000'.C*C* Primero asigna una indicación de la hora al valor de una horaC* determinada+15 minutos y una fecha determinada + 30 días.C* Mueve tmstamp a un campo de caracteres. El campo stampcharC* contendrá '1991-10-24-05.17.23.000000'.C*C ADDDUR 15:*minutes TimebeginC ADDDUR 30:*days DatebeginC MOVE Timebegin TmStampC MOVE Datebegin TmStampC MOVE TmStamp stampchar 26C* Mueve la indicación de la hora a un campo de caracteres sinC* separadores. Después de la operación mover,C* STAMPCHAR contendrá ' 19911024051723000000'.C *ISO0 MOVE(P) TMSTAMP STAMPCHAR0

Figura 227. Operación MOVE con indicación de la hora

474 VisualAge RPG Consulta del lenguaje

Page 497: RPG Referencia

Ejemplos de MOVE (Parte 2): Campos de longitud variable y fija

*...1....+....2....+....3....+....4....+....5....+....6....+....7....+....DName++++++++++ETDsFrom+++To/L+++IDc.Functions+++++++++++++++++++D*D* Ejemplo de MOVE entre campos gráficos y de caracteresD*D char_fld1 S 8A inz('K1K2K3 ')D dbcs_fld1 S 4GD char_fld2 S 8A inz(*ALL'Z')D dbcs_fld2 S 3G inz(G'K1K2K3')D*C*CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLC*C* El valor de dbcs_fld1 tras la operación MOVE es 'K1K2K3 'C* El valor de char_fld2 tras la operación MOVE es 'ZZK1K2K3'C*C MOVE char_fld1 dbcs_fld1C MOVE dbcs_fld2 char_fld2

Figura 228. MOVE entre campos de caracteres y campos gráficos

*...1....+....2....+....3....+....4....+....5....+....6....+....7....+....DName++++++++++ETDsFrom+++To/L+++IDc.Functions+++++++++++++++++++D*D* Ejemplo de MOVE de longitud variable a longitud variableD* para campos de caracteresD*D var5a S 5A INZ('ABCDE') VARYINGD var5b S 5A INZ('ABCDE') VARYINGD var5c S 5A INZ('ABCDE') VARYINGD var10a S 10A INZ('0123456789') VARYINGD var10b S 10A INZ('ZXCVBNM') VARYINGD var15a S 15A INZ('FGH') VARYINGD var15b S 15A INZ('FGH') VARYINGD var15c S 15A INZ('QWERTYUIOPAS') VARYINGC*C*CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLC*C MOVE var15a var5aC* var5a = 'ABFGH' (longitud=5)C MOVE var10a var5bC* var5b = '56789' (longitud=5)C MOVE var5c var15aC* var15a = 'CDE' (longitud=3)C MOVE var10b var15bC* var15b = 'BNM' (longitud=3)C MOVE var15c var10bC* var10b = 'YUIOPAS' (longitud=7)

Figura 229. Operación MOVE de un campo de longitud variable a un campo de longitudvariable

Capítulo 25. Códigos de operación 475

Page 498: RPG Referencia

*...1....+....2....+....3....+....4....+....5....+....6....+....7....+....DName++++++++++ETDsFrom+++To/L+++IDc.Functions+++++++++++++++++++D*D* Ejemplo de MOVE de longitud variable a longitud fijaD* para campos de caracteresD*D var5 S 5A INZ('ABCDE') VARYINGD var10 S 10A INZ('0123456789') VARYINGD var15 S 15A INZ('FGH') VARYINGD fix5a S 5A INZ('MNOPQ')D fix5b S 5A INZ('MNOPQ')D fix5c S 5A INZ('MNOPQ')D*D*CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLC*C MOVE var5 fix5aC* fix5a = 'ABCDE'C MOVE var10 fix5bC* fix5b = '56789'C MOVE var15 fix5cC* fix5c = 'MNFGH'

Figura 230. Operación MOVE de un campo de longitud variable a un campo de longitud fija

*...1....+....2....+....3....+....4....+....5....+....6....+....7....+....DName++++++++++ETDsFrom+++To/L+++IDc.Functions+++++++++++++++++++D*D* Ejemplo de MOVE de longitud fija a longitud variableD* para campos de caracteresD*D var5 S 5A INZ('ABCDE') VARYINGD var10 S 10A INZ('0123456789') VARYINGD var15 S 15A INZ('FGHIJKL') VARYINGD fix5 S 5A INZ('.....')D fix10 S 10A INZ('PQRSTUVWXY')D*D*CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLC*C MOVE fix10 var5C* var5 = 'UVWXY' (longitud=5)C MOVE fix5 var10C* var10 = '01234.....' (longitud=10)C MOVE fix10 var15C* var15 = 'STUVWXY' (longitud=7)

Figura 231. Operación MOVE de un campo de longitud fija a un campo de longitud variable

476 VisualAge RPG Consulta del lenguaje

Page 499: RPG Referencia

*...1....+....2....+....3....+....4....+....5....+....6....+....7....+....DName++++++++++ETDsFrom+++To/L+++IDc.Functions+++++++++++++++++++D*D* Ejemplo de MOVE(P) de longitud variable a longitud variableD* para campos de caracteresD*D var5a S 5A INZ('ABCDE') VARYINGD var5b S 5A INZ('ABCDE') VARYINGD var5c S 5A INZ('ABCDE') VARYINGD var10 S 10A INZ('0123456789') VARYINGD var15a S 15A INZ('FGH') VARYINGD var15b S 15A INZ('FGH') VARYINGD var15c S 15A INZ('FGH') VARYINGD*D*CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLC*C MOVE(P) var15a var5aC* var5a = 'FGH ' (longitud=5)C MOVE(P) var10 var5bC* var5b = '56789' (longitud=5)C MOVE(P) var5c var15bC* var15b = 'CDE' (longitud=3)C MOVE(P) var10 var15cC* var15c = '789' (longitud=3)

Figura 232. Operación MOVE(P) de un campo de longitud variable a un campo de longitudvariable

*...1....+....2....+....3....+....4....+....5....+....6....+....7....+....DName++++++++++ETDsFrom+++To/L+++IDc.Functions+++++++++++++++++++D*D* Ejemplo de MOVE(P) de longitud variable a longitud fijaD* para campos de caracteresD*D var5 S 5A INZ('ABCDE') VARYINGD var10 S 10A INZ('0123456789') VARYINGD var15 S 15A INZ('FGH') VARYINGD fix5a S 5A INZ('MNOPQ')D fix5b S 5A INZ('MNOPQ')D fix5c S 5A INZ('MNOPQ')D*D*CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLC*C MOVE(P) var5 fix5aC* fix5a = 'ABCDE'C MOVE(P) var10 fix5bC* fix5b = '56789'C MOVE(P) var15 fix5cC* fix5c = 'FGH '

Figura 233. Operación MOVE(P) de un campo de longitud variable a un campo de longitudfija

Capítulo 25. Códigos de operación 477

Page 500: RPG Referencia

Ejemplos de MOVE (Parte 3)Tabla 40. Mover un campo de caracteres a un campo de fecha/hora. El factor 1 especificael formato de la entrada del factor 2.

Campo de resultado

Factor 1 Factor 2 (carácter) Valor Tipo DTZ

*MDY 11-19-75 75/323 D(*JUL)

*JUL 92/114 23/04/92 D(*DMY)

*YMD 14/01/28 01/28/2014 D*(USA)

*YMD0 140128 01/28/2014 D(*USA)

*USA 12/31/9999 31.12.9999 D(*EUR)

*ISO 2036-05-21 21/05/36 D(*DMY)

*JUL 45/333 11/29/1945 D(*USA)

*MDY/ 03/05/33 03.05.33 D(*MDY.)

*CYMD& 121 07 08 08.07.2021 D(*EUR)

*CYMD0 1210708 07,08,21 D(*MDY,)

*CMDY. 107.08.21 21-07-08 D(*YMD-)

*CDMY0 1080721 07/08/2021 D(*USA)

*LONGJUL- 2021-189 08/07/2021 D(*EUR)

*HMS& 23 12 56 23.12.56 T(*ISO)

*USA 1:00 PM 13:00.00 T(*EUR)

*EUR 11.10.07 11:10:07 T(*JIS)

*JIS 14:16:18 14.16.18 T(*HMS.)

*...1....+....2....+....3....+....4....+....5....+....6....+....7....+....DName++++++++++ETDsFrom+++To/L+++IDc.Functions+++++++++++++++++++D*D* Ejemplo de MOVE(P) de longitud fija a longitud variableD* para campos de caracteresD*D var5 S 5A INZ('ABCDE') VARYINGD var10 S 10A INZ('0123456789') VARYINGD var15a S 15A INZ('FGHIJKLMNOPQR') VARYINGD var15b S 15A INZ('FGHIJ') VARYINGD fix5 S 5A INZ('')D fix10 S 10A INZ('PQRSTUVWXY')D*D*CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLC*C MOVE(P) fix10 var5C* var5 = 'UVWXY' (longitud=5 antes y después)C MOVE(P) fix10 var10C* var10 = 'PQRSTUVWXY' (longitud=10 antes y después)C MOVE(P) fix10 var15aC* var15a = ' PQRSTUVWXY' (longitud=13 antes y después)C MOVE(P) fix10 var15bC* var15b = 'UVWXY' (longitud=5 antes y después)

Figura 234. Operación MOVE(P) de un campo de longitud fija a un campo de longitudvariable

478 VisualAge RPG Consulta del lenguaje

Page 501: RPG Referencia

Tabla 40. Mover un campo de caracteres a un campo de fecha/hora. El factor 1 especificael formato de la entrada del factor 2. (continuación)

*ISO 24:00.00 12:00 AM *T(*USA)

Blanco 1991-09-14-13.12.56.123456 1991-09-14-13.12.56.123456

Z(*ISO)

*ISO 1991-09-14-13.12.56.123456 1991-09-14-13.12.56.123456

Z(*ISO)

Tabla 41. Mover un campo numérico a un campo de fecha/hora. El factor 1 especifica elformato de la entrada del factor 2.

Campo de resultado

Factor 1 Factor 2 (Numérico) Valor Tipo DTZ

*MDY 111975 75/323 D(*JUL)

*JUL 92114 23/04/92 D(*DMY)

*YMD 140128 01/28/2014 D(*USA)

*USA (Véasenota 1)

12319999 31.12.9999 D(*EUR)

*ISO 20360521 21/05/36 D(*DMY&)

*JUL 45333 11/29/1945 D(*USA)

*MDY 030533 03.05.33 D(*MDY.)

*CYMD 1210708 08.07.2021 D(*EUR)

*CMDY 1070821 21-07-08 D(*YMD-)

*CDMY 1080721 07/08/2021 D(*USA)

*LONGJUL 2021189 08/07/2021 D(*EUR)

*USA *DATE (092195) (Véase nota3)

1995-09-21 D(*JIS)

Blanco *DATE (092195) (Véase nota3)

1995-09-21 D(*JIS)

*MDY UDATE (092195) (Véasenota 3)

21.09.1995 D(*EUR)

*HMS 231256 23.12.56 T(*ISO)

*EUR 111007 11:10:07 T(*JIS)

*JIS 141618 14.16.18 T(*HMS.)

*ISO 240000 12:00 AM T(*USA)

Blanco (Véasenota 4)

19910914131256123456 1991-09-14-13.12.56.123456 Z(*ISO)

Capítulo 25. Códigos de operación 479

Page 502: RPG Referencia

Tabla 41. Mover un campo numérico a un campo de fecha/hora. El factor 1 especifica elformato de la entrada del factor 2. (continuación)

Notas:

1 No se permite el formato de hora *USA para movimiento entre horas y clasesnuméricas.

2 No se permite un separador de cero (0) en el factor 1 para el movimiento entrecampos de fecha, hora o indicación de la hora y clases numéricas.

3 Para *DATE y UDATE, suponga que la fecha del trabajo en la descripción deltrabajo es de formato *MDY y contiene 092195. El factor 1 es opcional y tomarápor omisión el formato correcto. Si el factor 2 es *DATE y el factor 1 estácodificado, debe ser un formato de fecha con un año de cuatro dígitos. Si el factor2 es UDATE y el factor 1 está codificado, debe ser un formato de fecha con unaño de 2 dígitos.

4 Para movimientos de campos de indicación de la hora, el factor 1 es opcional. Siestá codificado, debe ser *ISO o *ISO0.

Ejemplos de MOVE (Parte 4)Tabla 42. Mover un campo de fecha/hora a un campo de caracteres

Factor 2

Factor 1,entrada

Valor Tipo DTZ Campo de resultado(carácter)

*JUL 11-19-75 D(*MDY-) 75/323

*DMY- 92/114 D(*JUL) 23-04-92

*USA 14/01/28 D(*YMD) 01/28/2014

*EUR 12/31/9999 D(*USA) 31.12.9999

*DMY, 2036-05-21 D(*ISO) 20,05,36

*USA 45/333 D(*JUL) 11/29/1945

*USA0 45/333 D(*JUL) 11291945

*MDY& 03/05/33 D(*MDY) 03 05 33

*CYMD, 03 07 08 D(*DMY) 1080721

*CMDY 21-07-08 D(*YMD-) 107/08/21

*CDMY- 07/08/2021 D(*USA) 108-07-21

*LONGJUL& 08/07/2021 D(*EUR) 2021 189

*ISO 23 12 56 T(*HMS&) 23.12.56

*EUR 11:00 AM T(*USA) 11.00.00

*JIS 11.10.07 T(*EUR) 11:10:07

*HMS, 14:16:18 T(*JIS) 14,16,18

*USA 24.00.00 T(*ISO) 12:00 AM

Blanco 2045-10-27-23.34.59.123456 Z(*ISO) 2045-10-27-23.34.59.123456

Tabla 43. Mover un campo de fecha/hora a un campo numérico

Factor 2

Factor 1,entrada

Valor Tipo DTZ Campo de resultado(numérico)

480 VisualAge RPG Consulta del lenguaje

Page 503: RPG Referencia

Tabla 43. Mover un campo de fecha/hora a un campo numérico (continuación)

*JUL 11-19-75 D(*MDY-) 75323

*DMY- 92/114 D(*JUL) 230492

*USA 14/01/28 D(*YMD) 01282014

*EUR 12/31/9999 D(*USA) 31129999

*DMY 2036-05-21 D(*ISO) 210536

*USA 45/333 D(*JUL) 11291945

*MDY& 03/05/33 D(*MDY) 030533

*CYMD, 03 07 08 D(*MDY&) 1080307

*CMDY 21-07-08 D(*YMD-) 1070821

*CDMY- 07/08/2021 D(*USA) 1080721

*LONGJUL& 08/07/2021 D(*EUR) 2021189

*ISO 231256 T(*HMS&) 231256

*EUR 11:00 AM T(*USA) 110000

*JIS 11.10.07 T(*EUR) 111007

*HMS, 14:16:18 T(*JIS) 141618

*ISO 2045-10-27-23.34.59.123456 Z(*ISO) 20451027233459123456

La tabla siguiente muestra ejemplos de operaciones de mover campos defecha-hora a campos de fecha-hora. Suponga que el valor inicial de la indicaciónde la hora es: 1985-12-03-14.23.34.123456.

Tabla 44. Mover campos de fecha-hora a campos de fecha-hora

Factor 2 Campo de resultado

Factor 1 Valor Tipo DTZ Valor Tipo DTZ

N/A 1986-06-24 D(*ISO) 86/06/24 D(*YMD)

N/A 23 07 12 D(*DMY&) 23.07.2012 D(*EUR)

N/A 11:53 PM T(USA) 23.53.00 T(*EUR)

N/A 19.59.59 T(*HMS) 19:59:59 T(*JIS)

N/A 1985-12-03-14.23.34.123456

Z(*ISO.) 1985-12-03-14.23.34.123456

Z(*ISO)

N/A 75.06.30 D(*YMD) 1975-06-30-14.23.34.123456

Z(*ISO)

N/A 09/23/2234 D(*USA) 2234-09-23-14.23.34.123456

Z(*ISO)

N/A 18,45,59 T(*HMS,) 1985-12-03-18.45.59.000000

Z(*ISO)

N/A 2:00 PM T(*USA) 1985-12-03-14.00.00.000000

Z(*ISO)

N/A 1985-12-03-14.23.34.123456

Z(*ISO.) 12/03/85 D(*MDY)

N/A 1985-12-03-14.23.34.123456

Z(*ISO.) 12/03/1985 D(*USA)

N/A 1985-12-03-14.23.34.123456

Z(*ISO.) 14:23:34 T(*HMS)

Capítulo 25. Códigos de operación 481

Page 504: RPG Referencia

Tabla 44. Mover campos de fecha-hora a campos de fecha-hora (continuación)

N/A 1985-12-03-14.23.34.123456

Z(*ISO) 02:23 PM T(*USA)

Ejemplos de MOVE (Parte 5)La tabla siguiente muestra ejemplos de operaciones de mover un campo de fecha aun campo de caracteres. El campo de resultado es mayor que el factor 2. Supongaque el factor 1 contiene *ISO y que el campo de resultado está definido como:D Result_Fld 20S INZ('ABCDEFGHIJabcdefghij')

Tabla 45. Mover un campo de fecha a un campo de caracteres

Factor 2 Valor del campo de resultado después dela operación MOVE

Código deoperación

Valor Tipo DTZ

MOVE 11 19 75 D(*MDY&) ’ABCDEFGHIJ1975-11-19’

MOVE (P) 11 19 75 D(*MDY&) ’1975-11-19 ’

MOVEL 11 19 75 D(*MDY&) ’1975-11-19abcdefghij’

MOVEL (P) 11 19 75 D(MDY&) ’1975-11-19 ’

La tabla siguiente muestra ejemplos de operaciones de mover un campo de hora aun campo numérico. El campo de resultado es mayor que el factor 2. Suponga queel Factor 1 contiene *ISO y que el campo de resultado está definido como:D Result_Fld 20S INZ(11111111111111111111)

Tabla 46. Mover un campo de hora a un campo numérico

Factor 2

Código deoperación

Valor Tipo DTZ Valor del campo de resultado después dela operación MOVE

MOVE 9:42 PM T(*USA) 11111111111111214200

MOVE (P) 9:42 PM T(*USA) 00000000000000214200

MOVEL 9:42 PM T(*USA) 21420011111111111111

MOVEL (P) 9:42 PM T(*USA) 21420000000000000000

Tabla 47. Mover un campo numérico a un campo de hora. El factor 2 es mayor que elcampo de resultado. La parte resaltada muestra la parte del campo de factor 2 que semueve.

Campo de resultado

Código deoperación

Factor 2 Tipo DTZ Valor

MOVE 11:12:13:14 T(*EUR) 12.13.14

MOVEL 11:12:13:14 T(*EUR) 11.12.13

482 VisualAge RPG Consulta del lenguaje

Page 505: RPG Referencia

Tabla 48. Mover un campo numérico a un campo de indicación de la hora. El factor 2 esmayor que el campo de resultado. La parte resaltada muestra la parte del campo de factor2 que se mueve.

Campo de resultado

Código deoperación

Factor 2 Tipo DTZ Valor

MOVE 12340618230323123420123456 Z(*ISO) 1823-03-23-12.34.21.123456

MOVEL 12340618230323123420123456 Z(*ISO) 1234-06-18-23-.03.23.123420

MOVEA (Mover matriz)

Código Factor 1 Factor 2Campo deresultado Indicadores

MOVEA (P) Origen Destino + − ZB

La operación MOVEA transfiere valores de tipo carácter, gráfico, UCS-2 o numéricodesde el factor 2 al campo de resultado. (Se aplican ciertas limitaciones cuando semueven valores numéricos).

Puede utilizarse la operación MOVEA para:v Mover varios elementos de matriz contiguos a un solo campov Mover un solo campo a varios elementos de matriz contiguosv Mover elementos de matriz contiguos a elementos contiguos de otra matriz.

Mover datos empieza por el primer elemento de una matriz si la matriz no estáindexada o por el elemento especificado si la matriz está indexada. Mover datosfinaliza cuando se ha movido o rellenado el último elemento de matriz. Cuando elcampo del resultado contiene la matriz de indicador, el listado de referenciascruzadas contiene todos los indicadores afectados por la operación MOVEA.

El factor 2 del campo del resultado debe contener una matriz. La matriz puede seruna matriz empaquetada, binaria, con zona, gráfica o de caracteres. El factor 2 y elcampo de resultado no pueden especificar la misma matriz aunque la matriz estéindexada.

Nota: En las operaciones MOVEA de tipo carácter, gráfico, UCS-2 y numéricopuede especificar el ampliador de operación P para que rellene el resultadoa partir de la derecha.

Operaciones MOVEA de tipo carácter, gráfico y UCS-2Tanto el factor como el resultado deben definirse como de tipo carácter, gráfico oUCS-2. Los CCSID gráfico y UCS-2 deben ser los mismos, a no ser que, en el casode los campos de tipo gráfico, se haya especificado CCSID(*GRAPH: *IGNORE) enla especificación de control. Mover datos finaliza cuando el número de caracterestrasladado es igual a la longitud del campo más corto de los especificados por elfactor 2 y el campo del resultado.

La operación MOVEA podría terminar en medio de un elemento de matriz.

No se permiten matrices de longitud variable.

Operaciones MOVEA numéricasLos datos que se mueven entre campos y elementos de matriz deben tener lamisma longitud. El factor 2 y el campo del resultado deben contener campos

Capítulo 25. Códigos de operación 483

Page 506: RPG Referencia

numéricos, elementos de matriz numérica o matrices numéricas. Como mínimouno debe ser una matriz o elemento de matriz. Los tipos numéricos pueden serbinario, decimal empaquetado o decimal con zona. Los tipos numéricos no tienenque ser iguales entre el factor 2 y el campo del resultado.

El factor 2 puede contener un literal numérico si el campo de resultado contieneuna matriz numérica o un elemento de matriz numérica:v El literal numérico no puede contener una coma decimal.v La longitud del literal numérico no puede ser mayor que la longitud de

elemento del elemento de matriz especificado en el campo de resultado.

Se ignoran las posiciones decimales al mover. Los valores numéricos no seconvierten para representar las diferencias en el número de posiciones decimalesdefinidas.

Si el campo del resultado contiene una matriz numérica, el factor 2 no puedecontener las constantes figurativas *BLANK, *ALL, *ON ni *OFF.

Operaciones MOVEA de decimal con zonaPara mover una matriz de formato decimal con zona:v Defina la matriz numérica como un subcampo de una estructura de datosv Vuelva a definir la matriz numérica en la estructura de datos como una matriz

de caracteres.

Después, puede utilizar MOVEA de la misma manera en que lo haría para movermatrices de caracteres.

Especificar constantes figurativas con MOVEAPara mover una constante figurativa, la longitud de la constante debe ser igual a laparte de la matriz que está especificada. En las constantes figurativas de matricesnuméricas, se ignoran los límites del elemento excepto por el signo que se pone encada elemento de matriz. Por ejemplo:v MOVEA *BLANK ARR(X)

A partir del elemento X, el resto de ARR contiene espacios en blanco.v MOVEA *ALL’XYZ’ARRR(X)

ARR tiene elementos de caracteres de 4 bytes. Se ignoran los límites delelemento. A partir del elemento X, el resto de la matriz contiene’XYZXYZXYZYXZ...’.

484 VisualAge RPG Consulta del lenguaje

Page 507: RPG Referencia

*...1....+....2....+....3....+....4....+....5....+....6....+....7....+....CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C MOVEA ARRX ARRYC* Mover de matriz a matriz. Sin indexación; distinta longitud de matriz,C* misma longitud de elementos.

1

1 1

A A2

2 2

B B3

3 3

CC4

4 4

5

5 5

D D6

6 6

7

7 7 F F

E E8

8 8

9

9 9

F F0

0 0

.

. .

ARRX ARRY

Un elemento Un elemento

Antes deMOVEA

Después deMOVEA

Figura 235. Matriz a matriz - Longitud de matriz distinta, longitud de elemento idéntica

*...1....+....2....+....3....+....4....+....5....+....6....+....7....+....CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C MOVEA ARRX ARRY(3)C* Mover de matriz a matriz con un campo de resultado indexado.

Un elemento

ARRXAntes deMOVEA

Después deMOVEA

ARRY

Un elemento

A A B B CC D D E E

A A B B

1 2 3 4 5 6 7 8 9 0.

1 2 3 4 5 6 7 8 9 0. 1 2 3 4 5 6

Figura 236. Matriz a matriz - Campo de resultado indexado

Capítulo 25. Códigos de operación 485

Page 508: RPG Referencia

*...1....+....2....+....3....+....4....+....5....+....6....+....7....+....CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C MOVEA ARRX ARRYC* Mover de matriz a matriz, sin indexación y con elementos deC* matriz de distinta longitud.

Un elemento

ARRXAntes deMOVEA

Después deMOVEA

ARRY

Un elemento

A A A B BB C C C D D D1 2 3 4 5 6 7 8 9 0.

1 2 3 4 5 6 7 8 9 0. 1 2 3 4 5 6 7 D D8 9 0.

Figura 237. Matriz a matriz - Elementos de matriz con longitudes distintas

*...1....+....2....+....3....+....4....+....5....+....6....+....7....+....CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C MOVEA ARRX(4) ARRYC* Mover de matriz a matriz, factor 2 indexado con elementos deC* matriz de distinta longitud.

Un elemento

ARRXAntes deMOVEA

Después deMOVEA

ARRY

Un elemento

A

B B C CC D D D

A A B B B C CC D D D1 2 3 4 5 6 7 8 9 0.

1 2 3 4 5 6 7 8 9 0. 7 8 9 0.

Figura 238. Matriz a matriz - Factor 2 indexado

486 VisualAge RPG Consulta del lenguaje

Page 509: RPG Referencia

*...1....+....2....+....3....+....4....+....5....+....6....+....7....+....CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C MOVEA FIELDA ARRYC* Mover de campo a matriz, sin indexación en la matriz.

FIELDAAntes deMOVEA

Después deMOVEA

ARRY

Un elemento

A

A

B

B C

C

1 2 3 4 5 6 7

1 2 3 4 5 6 7 1

1

12

2

3

3

4

4

5

5

6

6

7

89

0

0

.

.

Figura 239. Matriz a matriz - Sin indexación

*...1....+....2....+....3....+....4....+....5....+....6....+....7....+....CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* En el ejemplo siguiente, N=3. Mover de matriz a campo conC* indexación variable.C MOVEA ARRX(N) FIELDC*

FIELDAntes deMOVEA

Después deMOVEA

ARRY

Un elemento

A A

A

B

BB

C

C

1 1

1

2

22

3

3

0 0

0

0

00

0

0

0

0

0

00

0 0

0

. .

.

.

..

.

.

.

.

.

..

. .

.

Figura 240. Matriz a campo - Indexación variable

Capítulo 25. Códigos de operación 487

Page 510: RPG Referencia

*...1....+....2....+....3....+....4....+....5....+....6....+....7....+....CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C MOVEA ARRB ARRZC*C* Mover de matriz a matriz y mostrar elementos numéricos.

Un elemento Un elemento

Antes de MOVEA

Después de MOVEA1.0 1.0

2.0 3.0 4.0 5.0 6.0

6.0

1.0

1.0 1.0

1.0

1.1 1.1

1.1

1.2 1.2

1.2

. .

. . . . .

.

.

. .

.

Figura 241. Matriz a matriz - Elementos numéricos

*...1....+....2....+....3....+....4....+....5....+....6....+....7....+....CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C MOVEA(P) ARRX ARRYC* Mover de matriz a matriz con relleno. Sin indexación; matriz deC* distinta longitud con la misma longitud de elementos.

Un elemento

ARRXAntes deMOVEA

Después deMOVEA

ARRY

Un elemento

A A B B CC D D E E F F1 2 3 4 5 6 7 8 9 0.

1 2 3 4 5 6 7 8 9 0. 1 2 3 4 5 6 7 8 9 0.

Figura 242. Matriz a matriz - Con relleno

*...1....+....2....+....3....+....4....+....5....+....6....+....7....+....CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C MOVEA(P) ARRB ARRZC*C* Mover de matriz a matriz y mostrar elementos numéricos con relleno.

Un elemento Un elemento

Antes de MOVEA

Después de MOVEA

1.1

1.1 1.1

2.0. . . ..3.0 4.0 5.0 6.0

1.3

1.2

1.2 1.2 0.0

1.0

1.0 1.0

1.0

1.0

.

. .

.

. . .

Figura 243. Matriz a matriz - Elementos numéricos con relleno

488 VisualAge RPG Consulta del lenguaje

Page 511: RPG Referencia

MOVEL (Mover a la izquierda)

Código Factor 1 Factor 2Campo deresultado Indicadores

MOVEL (P) Atributos dedatos

Campo de origen Campo dedestino

+ − ZB

La operación MOVEL transfiere caracteres del factor 2 al campo del resultado. Latransferencia empieza por el carácter situado más a la izquierda en el factor 2.

Si se especifica el factor 1, debe contener un formato de fecha o de hora. Estoespecifica el formato del campo de caracteres o numérico que es el origen o eldestino de la operación.

No pueden especificarse indicadores resultantes si el campo del resultado es unamatriz. Puede especificarlos si el campo de resultado es un elemento de matriz oun campo que no es de matriz.

Si el origen o el destino es un campo de caracteres, puede indicar el separador quesigue al formato en el factor 1. Sólo se permiten los separadores que son válidospara ese formato.

Si el factor 2 es *DATE o UDATE y el resultado es un campo de fecha, no serequiere el factor 1. Si el factor 1 contiene un formato de fecha, debe ser compatiblecon el formato *DATE o UDATE en factor 2, como se especifica en la palabra claveDATEDIT en la especificación de control.

Si el factor 2 es mayor que el campo de resultado, no se transfieren los caracteressobrantes más a la derecha de factor 2. Si el campo del resultado es mayor que elfactor 2, el exceso de caracteres situados más a la derecha del campo del resultadono se modifican, a menos que se especifique un relleno.

No se permiten los campos ni literales numéricos flotantes como Factor 2.

*...1....+....2....+....3....+....4....+....5....+....6....+....7....+....CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C MOVEA(P) ARRX(3) ARRYC* Mover de matriz a matriz con relleno. Sin indexación; matriz deC* distinta longitud con distinta longitud de elemento.

Un elemento

ARRXAntes deMOVEA

Después deMOVEA

ARRY

Un elemento

A A B B CC D D E E F FP

P

P

P

P

P

Q

Q

Q

Q

Q

Q

R

R R

R

R R

R

R R

Figura 244. Matriz a matriz - Con relleno, sin indexación

Capítulo 25. Códigos de operación 489

Page 512: RPG Referencia

Si el factor 2 es de tipo UCS-2 y el campo de resultado es de tipo carácter, o si elfactor 2 es de tipo carácter y el campo de resultado es de tipo UCS-2, el número decaracteres que se mueven es variable. Por ejemplo, cinco caracteres UCS-2 puedenconvertirse a:v Cinco caracteres de un solo bytev Cinco caracteres de byte doblev Una combinación de caracteres de un solo byte y doble

Nota: Al mover datos a un campo numérico, se conserva el signo (+ o −) delcampo del resultado excepto cuando el factor 2 es igual o más largo que elcampo del resultado. En este caso, se utiliza el signo del factor 2 como signodel campo del resultado.

Las siguientes secciones resumen las normas para la operación MOVEL basándoseen la longitud del factor 2 y del campo del resultado.

El factor 2 es de la misma longitud que el campo de resultadoEl factor 2 y el campo de resultado tienen la misma longitud:v Si el factor 2 y el campo del resultado son numéricos, el signo se transfiere a la

posición situada más a la derecha.v Si el factor 2 y el campo de resultado son ambos de caracteres, se transfieren

todos los caracteres.v Si el factor 2 es numérico y el campo del resultado es de caracteres, el signo se

transfiere a la posición situada más a la derecha.v Si el factor 2 es de caracteres y el campo del resultado es numérico, se transfiere

una zona negativa a la posición situada más a la derecha del campo delresultado si la zona de la posición situada más a la derecha del factor 2 es unazona negativa. Sin embargo, si la zona de más a la derecha del factor 2 no esuna zona negativa, se transfiere una zona positiva a la posición de más a laderecha del campo del resultado. Las partes de dígito se convierten a suscaracteres numéricos correspondientes. Si las partes de dígito no son dígitosválidos, se produce un error de excepción de datos.

v Si el factor 2 y el campo del resultado son ambos de tipo gráfico o UCS-2, setransfieren todos los caracteres de tipo gráfico o UCS-2.

v Si el factor 2 es de tipo gráfico y el campo del resultado es de tipo de caracteres,se transfieren todos los caracteres gráficos.

v Si el factor 2 es de caracteres y el campo del resultado es gráfico, se transfierentodos los caracteres.

El factor 2 es mayor que el campo de resultadoEl factor 2 es mayor que el campo de resultado:v Si el factor 2 y el campo del resultado son numéricos, el signo de la posición

situada más a la derecha del factor 2 se transfiere a la posición situada más a laderecha del campo del resultado.

v Si el factor 2 es numérico y el campo del resultado es de caracteres, el campo delresultado sólo contiene caracteres numéricos. Sólo se transfiere el número decaracteres necesarios para rellenar el campo del resultado.

v Si el factor 2 es de caracteres y el campo del resultado es numérico, se transfiereuna zona negativa a la posición situada más a la derecha del campo delresultado si la zona de la posición situada más a la derecha del factor 2 es unazona negativa. Sin embargo, si la zona de más a la derecha del factor 2 no esuna zona negativa, se transfiere una zona positiva a la posición de más a laderecha del campo del resultado. Otras posiciones del campo de resultadocontiene sólo caracteres numéricos.

490 VisualAge RPG Consulta del lenguaje

Page 513: RPG Referencia

v Si el factor 2 y el campo del resultado son ambos de tipo gráfico o UCS-2, sólose transfieren los caracteres de tipo gráfico o UCS-2 necesarios para rellenar elcampo del resultado.

v Si el factor 2 es gráfico y el campo del resultado es de caracteres, se truncan losdatos gráficos.

v Si el factor 2 es de caracteres y el resultado es gráfico, se truncan los datos decaracteres.

Nota: El exceso de caracteres situados más a la derecha del factor 2 no setransfieren. Si el campo del resultado es mayor que el factor 2, el exceso decaracteres situados más a la derecha del campo del resultado no semodifican, a menos que se especifique un relleno.

El factor 2 es más corto que el campo de resultadoEl factor 2 es más corto que el campo de resultado:v Si el factor 2 es numérico o de caracteres y el campo del resultado es numérico,

la parte de dígitos del factor 2 sustituye al contenido de las posiciones situadasmás a la izquierda del campo del resultado. El signo en la posición situada mása la derecha del campo del resultado no se modifica.

v Si el factor 2 es numérico o de caracteres y el campo del resultado es decaracteres, los caracteres del factor 2 sustituyen el número equivalente deposiciones situadas más a la izquierda en el campo del resultado. No se realizaninguna modificación en la zona de la posición situada más a la derecha delcampo del resultado.

El factor 2 es más corto que el campo de resultado y se haespecificado PSi el factor 2 es más corto que el campo del resultado y se especifica P en el campodel ampliador de operación:v La transferencia se realiza de la forma descrita en “El factor 2 es más corto que

el campo de resultado”v El campo del resultado se rellena por la derecha.

Al mover datos de tipo carácter, gráfico o UCS-2 de longitud variable, el campode longitud variable funciona de la misma forma que un campo de longitud fijacon la misma longitud actual. Para obtener ejemplos al respecto, consulte lasfiguras 249 a 254.

Capítulo 25. Códigos de operación 491

Page 514: RPG Referencia

Antes de MOVE

Después de MOVE

Factor 2 con la misma longitud que el campo de resultado

Factor 2 Campo de resultado

28 4 5a. Numérico

anumérico

b.

c.

d.

Caráctera

numérico

Caráctera

carácter

Numéricoa

carácter

8 4

G X t

4 N

_

48

2_

2_

4

7

27 5

B4

P H S

_

24 27

7 8 4 47

BG X t

P H 4 S N

85 6 7 4

27 8 4 5

85 6 7 4

A K T 4 D

_

T D4A K

28 4 t27 4

P H 4 S N

28 4 427 4

+

+

++

_

Antes de MOVE

Después de MOVE

Antes de MOVE

Después de MOVE

Antes de MOVE

Después de MOVE

Figura 245. El factor 2 y el campo de resultado tienen la misma longitud

Antes de MOVE

Después de MOVE

Factor 2 m ás largo que el campo de resultados

Factor 2 Campo de resultados

a.

Caráctera

Carácter

b.

c.

d.

Caráctera

Numérico

Numéricoa

Numérico

Numéricoa

Carácter

85 6 7 4

20 0 0 5

85 6 7 4

A K T 4 D

_

T D4A K

0 719 3

B R W C X

2 832 7

+

+

++

B W C H 4 S tR X

0 2 8 4 2 50 5

9 3 1 8 4 2 50 7

0

0 2 8 4 2 50 50

0 2 8 4 2 50 50

9 3 1 8 4 2 50 7

B W C H 4 S tR X

B W C H 4 S NR X

B W C H 4 S NR X

_

_

_

_Antes de MOVE

Después de MOVE

Antes de MOVE

Después de MOVE

Antes de MOVE

Después de MOVE

Figura 246. El factor 2 es mayor que el campo de resultado

492 VisualAge RPG Consulta del lenguaje

Page 515: RPG Referencia

Factor 2 m ás corto que el campo de resultado

Factor 2 Campo de resultado

0 9 3 2 14

7 4 2 3 2 1 08 5

3 4 5 3 2 1 00 5

7 4 2 H 4 S A8 t

B W C H 4 S AR X

T 5 H 4 S AN

27 8 4 5

C P T 5 E

Caráctera

Carácter

Caráctera

Numérico

Numéricoa

Numérico

Numéricoa

Carácter

+

C P

27 8 4 5

C P T 5 E

27 8 4 4

27 8 4 4

_

_

C P T 5 N

C P T 5 N

0 9 3 2 140 9 3 2 149 3 2 1 041 9 3 2 13 4

1 0 9 3 2 1 03 4

B W C H 4 S AR X

B W C H 4 S AR X

+

+

A. _

B. _

Nota: en el ejemplo anterior, 4 = letra t; la flecha equivale a la coma decimal

+

-

-

_

Antes de MOVE

Después de MOVE

Antes de MOVE

Después de MOVE

Antes de MOVE

Después de MOVE

Antes de MOVE

Después de MOVE

Figura 247. El factor 2 es más corto que el campo de resultado

Capítulo 25. Códigos de operación 493

Page 516: RPG Referencia

Factor 2 más corto que el campo de resultadoCon P en el campo ampliador de operación

Factor 2 Campo de resultado

0 9 3 2 1 04

7 4 2 0 0 0 08 5

3 4 5 0 0 0 00 5

7 4 28 t

B W C S AR X

T 5 N

27 8 4 5

C P T 5 E

Caráctera

Carácter

Caráctera

Numérico

Numéricoa

Numérico

Numéricoa

Carácter

+

C P

27 8 4 5

C P T 5 E

27 8 4 4

27 8 4 4

_

_

C P T 5 N

C P T 5 N

0 9 3 2 1 040 9 3 2 1 040 9 2 1 041 0 9 2 1 03 4

1 0 9 3 2 1 03 4

B W C H 4 S AR X

B W C H 4 S AR X

+

A. _

B. _

Nota: en el ejemplo anterior, 4 = letra t; la flecha equivale a la coma decimal.

_

_ +

+

_

Antes de MOVE

Después de MOVE

Antes de MOVE

Después de MOVE

Antes de MOVE

Después de MOVE

Antes de MOVE

Después de MOVE

Figura 248. El factor 2 es más corto que el resultado con P especificada

494 VisualAge RPG Consulta del lenguaje

Page 517: RPG Referencia

Ejemplos de MOVEL: Movimientos de longitud variable / longitudfija

*...1....+....2....+....3....+....4....+....5....+....6....+....7....+....DName++++++++++ETDsFrom+++To/L+++IDc.Functions+++++++++++++++++++D*D* Ejemplo de MOVEL de longitud variable a longitud variableD* para campos de caracteresD*D var5a S 5A INZ('ABCDE') VARYINGD var5b S 5A INZ('ABCDE') VARYINGD var5c S 5A INZ('ABCDE') VARYINGD var10 S 10A INZ('0123456789') VARYINGD var15a S 15A INZ('FGH') VARYINGD var15b S 15A INZ('FGH') VARYINGD*D*CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLC*C MOVEL var15a var5aC* var5a = 'FGHDE' (longitud=5)C MOVEL var10 var5bC* var5b = '01234' (longitud=5)C MOVEL var5c var15aC* var15a = 'ABC' (longitud=3)C MOVEL var10 var15bC* var15b = '012' (longitud=3)

Figura 249. MOVEL: de campo de longitud variable a campo de longitud variable

*...1....+....2....+....3....+....4....+....5....+....6....+....7....+....DName++++++++++ETDsFrom+++To/L+++IDc.Functions+++++++++++++++++++D*D* Ejemplo de MOVEL de longitud variable a longitud fijaD* para campos de caracteresD*D var5 S 5A INZ('ABCDE') VARYINGD var10 S 10A INZ('0123456789') VARYINGD var15 S 15A INZ('FGH') VARYINGD fix5a S 5A INZ('MNOPQ')D fix5b S 5A INZ('MNOPQ')D fix5c S 5A INZ('MNOPQ')D fix10 S 10A INZ('')D*D*CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLC*C MOVEL var5 fix5aC* fix5a = 'ABCDE'C MOVEL var10 fix5bC* fix5b = '01234'C MOVEL var15 fix5cC* fix5c = 'FGHPQ'

Figura 250. MOVEL: de campo de longitud variable a campo de longitud fija

Capítulo 25. Códigos de operación 495

Page 518: RPG Referencia

*...1....+....2....+....3....+....4....+....5....+....6....+....7....+....DName++++++++++ETDsFrom+++To/L+++IDc.Functions+++++++++++++++++++D*D* Ejemplo de MOVEL de longitud fija a longitud variableD* para campos de caracteresD*D var5 S 5A INZ('ABCDE') VARYINGD var10 S 10A INZ('0123456789') VARYINGD var15a S 15A INZ('FGHIJKLMNOPQR') VARYINGD var15b S 15A INZ('WXYZ') VARYINGD fix10 S 10A INZ('PQRSTUVWXY')D*D*CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLC*C MOVEL fix10 var5C* var5 = 'PQRST' (longitud=5)C MOVEL fix10 var10C* var10 = 'PQRSTUVWXY' (longitud=10)C MOVEL fix10 var15aC* var15a = 'PQRSTUVWXYPQR' (longitud=13)C MOVEL fix10 var15bC* var15b = 'PQRS' (longitud=4)

Figura 251. MOVEL: de campo de longitud fija a campo de longitud variable

*...1....+....2....+....3....+....4....+....5....+....6....+....7....+....DName++++++++++ETDsFrom+++To/L+++IDc.Functions+++++++++++++++++++D*D* Ejemplo de MOVEL(P) de longitud variable a longitud variableD* para campos de caracteresD*D var5a S 5A INZ('ABCDE') VARYINGD var5b S 5A INZ('ABCDE') VARYINGD var5c S 5A INZ('ABCDE') VARYINGD var10 S 10A INZ('0123456789') VARYINGD var15a S 15A INZ('FGH') VARYINGD var15b S 15A INZ('FGH') VARYINGD var15c S 15A INZ('FGHIJKLMN') VARYINGD*D*CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLC*C MOVEL(P) var15a var5aC* var5a = 'FGH ' (longitud=5)C MOVEL(P) var10 var5bC* var5b = '01234' (longitud=5)C MOVEL(P) var5c var15bC* var15b = 'ABC' (longitud=3)C MOVEL(P) var15a var15cC* var15c = 'FGH ' (longitud=9)

Figura 252. MOVEL(P): de campo de longitud variable a campo de longitud variable

496 VisualAge RPG Consulta del lenguaje

Page 519: RPG Referencia

MULT (Multiplicar)

Código Factor 1 Factor 2Campo deresultado Indicadores

MULT (H) Multiplicando Multiplicador Producto + − Z

Si se especifica el factor 1, éste se multiplica por el factor 2 y el producto se sitúaen el campo de resultado. Si no se especifica el factor 1, el factor 2 se multiplicapor el campo de resultado y el producto se sitúa en el campo de resultado.

*...1....+....2....+....3....+....4....+....5....+....6....+....7....+....DName++++++++++ETDsFrom+++To/L+++IDc.Functions+++++++++++++++++++D*D* Ejemplo de MOVEL(P) de longitud variable a longitud fijaD* para campos de caracteresD*D var5 S 5A INZ('ABCDE') VARYINGD var10 S 10A INZ('0123456789') VARYINGD var15 S 15A INZ('FGH') VARYINGD fix5a S 5A INZ('MNOPQ')D fix5b S 5A INZ('MNOPQ')D fix5c S 5A INZ('MNOPQ')D*D*CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLC*C MOVEL(P) var5 fix5aC* fix5a = 'ABCDE'C MOVEL(P) var10 fix5bC* fix5b = '01234'C MOVEL(P) var15 fix5cC* fix5c = 'FGH '

Figura 253. MOVEL(P): de campo de longitud variable a campo de longitud fija

*...1....+....2....+....3....+....4....+....5....+....6....+....7....+....DName++++++++++ETDsFrom+++To/L+++IDc.Functions+++++++++++++++++++D*D* Ejemplo de MOVEL(P) de longitud fija a longitud variableD* para campos de caracteresD*D var5 S 5A INZ('ABCDE') VARYINGD var10 S 10A INZ('0123456789') VARYINGD var15a S 15A INZ('FGHIJKLMNOPQR') VARYINGD var15b S 15A INZ('FGH') VARYINGD fix5 S 10A INZ('.....')D fix10 S 10A INZ('PQRSTUVWXY')D*D*CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLC*C MOVEL(P) fix10 var5C* var5 = 'PQRST' (longitud=5)C MOVEL(P) fix5 var10C* var10 = '..... ' (longitud=10)C MOVEL(P) fix10 var15aC* var15a = 'PQRSTUVWXY ' (longitud=13)

C MOVEL(P) fix10 var15bC* var15b = 'PQR' (longitud=3)

Figura 254. MOVEL(P): de campo de longitud fija a campo de longitud variable

Capítulo 25. Códigos de operación 497

Page 520: RPG Referencia

El factor 1 y el factor 2 deben ser numéricos y cada uno puede contener unamatriz, un elemento de matriz, un campo, una constante figurativa, un literal, unaconstante con nombre, un subcampo o un nombre de tabla.

El campo de resultado debe ser lo suficientemente grande para contener elproducto. Utilice la norma siguiente para determinar la longitud máxima delcampo del resultado: la longitud del campo del resultado es la longitud del factor1 más la longitud del factor 2. El campo de resultado debe ser numérico, pero nopuede ser una constante con nombre o un literal. El resultado se puede redondearsi se especifica.

En el apartado “Operaciones aritméticas” en la página 367 se describen las normasgenerales para la especificación de operaciones aritméticas.

La Figura 162 en la página 368 muestra ejemplos de la operación MULT.

MVR (Mover resto)

Código Factor 1 Factor 2Campo deresultado Indicadores

MVR Resto + − Z

La operación MVR transfiere el resto de la operación previa DIV a un camponombrado en el campo del resultado. La operación MVR debe seguirinmediatamente a la operación DIV. Si utiliza indicadores de condicionamiento, laoperación MVR debe especificarse inmediatamente después de la operación DIV. Elcampo del resultado debe ser numérico y puede contener una matriz, un elementode matriz, un subcampo o un nombre de tabla.

Deje espacio suficiente en el campo de resultado si la operación DIV utilizafactores con posiciones decimales. El número de posiciones decimales significativases el mayor de:v El número de posiciones decimales en el factor 1 de la operación de división

previa.v La suma de las posiciones decimales del factor 2 y del campo de resultado de la

operación de división previa.

El número máximo de posiciones numéricas totales en el resto es igual al numerode posiciones totales en el factor 2 de la operación de división previa.

El signo (+ o -) del resto es el mismo que el del dividendo (factor 1).

No puede especificar redondeo en una operación DIV inmediatamente seguida poruna operación MVR. La operación MVR no puede utilizarse si la operación dedivisión previa tiene una matriz especificada en el campo de resultado. Además,no puede utilizarse la operación MVR si la operación DIV anterior tiene al menosun operando flotante.

En el apartado “Operaciones aritméticas” en la página 367 se describen las normasgenerales para la especificación de operaciones aritméticas.

La Figura 162 en la página 368 muestra ejemplos de la operación MVR.

498 VisualAge RPG Consulta del lenguaje

Page 521: RPG Referencia

OCCUR (Establecer/Obtener aparición de una estructura dedatos)

Código Factor 1 Factor 2Campo deresultado Indicadores

OCCUR (E) Valor de aparición Estructura de datos Valor deaparición

_ ER _

La operación OCCUR especifica la aparición de la estructura de datos que se ha deutilizar a continuación en un programa.

Si en una operación se especifica una estructura de datos con varias apariciones oun subcampo de dicha estructura de datos, se utiliza la primera aparición de laestructura de datos hasta que se especifica una operación OCCUR. Después deespecificar una operación OCCUR, se utiliza la aparición de la estructura de datosindicada por la operación OCCUR.

Si se especifica el factor 1, debe contener un número, un literal con cero posicionesdecimales, un nombre de campo, una constante con nombre o un nombre deestructura de datos. El factor 1 establece la aparición de la estructura de datosespecificada en el factor 2. Si no se especifica el factor 1, el valor de la apariciónactual de la estructura de datos del factor 2 se sitúa en el campo del resultadodurante la operación OCCUR.

Si el factor 1 es un nombre de estructura de datos, debe ser una estructura dedatos de múltiples apariciones. La aparición actual de la estructura de datos en elfactor 1 se utiliza para establecer la aparición de la estructura de datos en el factor2.

El factor 2 debe ser el nombre de una estructura de datos de múltiples apariciones.

Si se especifica el campo del resultado, debe ser un nombre de campo numéricosin posiciones decimales. El valor de la aparición actual de la estructura de datosespecificada en el factor 2, después de haberse establecido por cualquier valor oestructura de datos que se especifique opcionalmente en el factor 1, se sitúa en elcampo del resultado.

Nota: Debe especificarse como mínimo el factor 1 o el campo del resultado.

Si la aparición esta fuera del rango valido establecido para la estructura de datos,se produce un error y la aparición de la estructura de datos en el factor 2permanece igual que antes de procesar la operación OCCUR.

Para manejar las excepciones de OCCUR (código de estado de programa 122),puede especificarse el ampliador de código de operación ’E’ o un indicador deerror ER, pero no ambos. Para obtener más información sobre la gestión de errores,consulte el apartado “Excepciones y errores de programa” en la página 48.

Capítulo 25. Códigos de operación 499

Page 522: RPG Referencia

FLDA FLDB FLDC FLDD

FLDA FLDB FLDC FLDD

FLDA FLDB

50ªaparición

49ªaparición FLDC FLDD

FLDA FLDB FLDC FLDD

FLDA

DS1 DS2

FLDCFLDB FLDD

3ªaparición

2ªaparición

1ªaparición

Figura 255. Ejemplo de operación OCCUR

500 VisualAge RPG Consulta del lenguaje

Page 523: RPG Referencia

*...1....+....2....+....3....+....4....+....5....+....6....+....7....+....DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++D*D* DS1 y DS2 son estructuras de datos de múltiples apariciones.D* Cada una tiene 50 apariciones.D DS1 DS OCCURS(50)D FLDA 1 5D FLDB 6 80D*D DS2 DS OCCURS(50)D FLDC 1 6D FLDD 7 11*...1....+....2....+....3....+....4....+....5....+....6....+....7....+....CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C* DS1 se establece como la tercera aparición. Ahora se pueden usarC* los subcampos FLDA y FLDB de la tercera aparición. Las operacionesC* MOVE y Z-ADD modifican el contenido de FLDA y FLDB,C* respectivamente, en la tercera aparición de DS1.CC 3 OCCUR DS1C MOVE 'ABCDE' FLDAC Z-ADD 22 FLDBC*C* DS1 se establece como la cuarta aparición. Usando los valores deC* FLDA y FLDB de la cuarta aparición de DS1, la operación MOVEC* coloca el contenido de FLDA en el campo de resultado, FLDX,C* y la operación Z-ADD coloca el contenido de FLDB en elC* campo de resultado, FLDY.CC 4 OCCUR DS1C MOVE FLDA FLDXC Z-ADD FLDB FLDYC*C* DS1 se establece como la aparición especificada en el campo X.C* Por ejemplo, si X = 10, DS1 se establece como la décima aparición.C X OCCUR DS1C*C* DS1 se establece como la aparición actual de DS2. Por ejemplo, siC* la aparición actual de DS2 es la décimosegunda aparición, DS1C* se establece como la décimosegunda aparición.C DS2 OCCUR DS1

Figura 256. Ejemplo de operación OCCUR

Capítulo 25. Códigos de operación 501

Page 524: RPG Referencia

OPEN (Abrir archivo para proceso)

Código Factor 1 Factor 2Campo deresultado Indicadores

OPEN (E) Nombre de archivo _ ER _

La operación OPEN abre un archivo. El archivo puede ser un archivo local o unarchivo AS/400. Si el archivo está definido como un archivo local y si no existecuando se produce la operación OPEN, se crea el archivo local. Deben existir losarchivos remotos cuando se produce la operación OPEN; de lo contrario, no secrean.

El factor 2 contiene el nombre del archivo. El archivo no puede ser un archivo detabla. Para permitir que el programa controle cuándo debe abrirse el archivo,especifique la palabra clave USROPN en las especificaciones de descripción dearchivo. Consulte el apartado “Capítulo 17. Especificaciones de descripción dearchivo” en la página 213 para obtener más información acerca de la palabra claveUSROPN.

Si se abre un archivo y después se cierra mediante una operación CLOSE, se puedevolver a abrir el archivo con la operación OPEN. No es obligatoria la palabra claveUSROPN en la especificación de descripción de archivo. Si no se especifica lapalabra clave USROPN en la especificación de definición de archivo, el archivo seabre en la inicialización del programa. Si se especifica una operación OPEN paraun archivo que ya esté abierto, se produce un error.

Son válidas varias operaciones OPEN en un programa para el mismo archivosiempre que el archivo se haya cerrado con anterioridad a la operación OPEN.

C*C* El valor de aparición actual de DS1 se coloca en el campo deC* resultado, Z. El campo Z debe ser numérico sin posicionesC* decimales. Por ejemplo, si la aparición actual de DS1 esC* 15, el campo Z contiene el valor 15.C OCCUR DS1 ZCC* DS1 se establece en la aparición actual de DS2. A continuación,C* el valor de la aparición actual de DS1 se mueve al campo deC* resultado, Z. Por ejemplo, si la aparición actual de DS2 es laC* quinta, DS1 se establece como la quinta aparición. El campo deC* resultado, Z, contiene el valor 5.CC DS2 OCCUR DS1 ZC*C* DS1 se establece como la aparición actual de X. Por ejemplo, siC* X = 15, DS1 se establece como la decimoquinta aparición.C* Si X es menor que 1 o mayor que 50, se produceC* un error y %ERROR se establece para que devuelva '1'.C* Si %ERROR devuelve '1', se activa el indicador LR.CC X OCCUR (E) DS1C IF %ERRORC SETON LRC ENDIF

Figura 257. Ejemplo de operación OCCUR

502 VisualAge RPG Consulta del lenguaje

Page 525: RPG Referencia

Si se especifica un indicador de resultado en las posiciones 73 y 74, se activacuando se produce un error durante la operación OPEN.

Para manejar las excepciones de OPEN (códigos de estado de archivo mayores que1000), puede especificarse el ampliador de código de operación ’E’ o un indicadorde error ER, pero no ambos. Para obtener más información sobre la gestión deerrores, consulte el apartado “Excepciones/errores de archivo” en la página 37.

ORxx (O)

Código Factor 1 Factor 2Campo deresultado Indicadores

ORxx Comparando Comparando

La operación ORxx es opcional con las operaciones DOUxx, DOWxx, IFxx,WHENxx y ANDxx. ORxx se especifica siguiendo de forma inmediata a unasentencia DOUxx, DOWxx, IFxx, WHENxx, ANDxx u ORxx. Utilice ORxx paraespecificar una condición más compleja para las operaciones DOUxx, DOWxx, IFxxy WHENxx. No se permiten entradas de indicadores de condicionamiento(posiciones de 9 a 11).

El factor 1 y el factor 2 deben contener un literal, una constante con nombre, unaconstante figurativa, un nombre de tabla, un elemento de matriz, un nombre de

*...1....+....2....+....3....+....4....+....5....+....6....+....7...FFilename++IT.A.FRlen+......A.Device+.Keywords+++++++++++++++++++++++++++++FEXCEPTN O E DISK REMOTE USROPNFFILEX IF E DISK REMOTE*...1....+....2....+....3....+....4....+....5....+....6....+....7...CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* La operación OPEN explícita abre el archivo EXCEPTN paraC* proceso si el indicador 97 está activado y el indicador 98 estáC* desactivado. Observe que el archivo EXCEPTN de las especificacionesC* de descripción de archivo tiene la palabra clave USROPN especificada.C* %ERROR devolverá '1' si la operación OPEN es anómala.C*C IF *en97 y no *en98C OPEN(E) EXCEPTNC IF no %ERRORC WRITE ERRECC ENDIFC ENDIFC*C* FILEX se abre al inicializar el programa. La operación CLOSEC* explícita cierra FILEX antes de que el control pase a RTNX. AlC* volver, la operación OPEN vuelve a abrir el archivo. Debido a queC* la palabra clave USROPN no está especificada para FILEX, el archivoC* se abre durante la inicialización del programaC*C CLOSE FILEXC CALL 'RTNX'C OPEN FILEX

Figura 258. Operación OPEN con operación CLOSE

Capítulo 25. Códigos de operación 503

Page 526: RPG Referencia

estructura de datos o un nombre de campo. El factor 1 y el factor 2 deben ser delmismo tipo. La comparación de los factores 1 y 2 sigue las mismas normas dadaspara las operaciones de comparación.

En el apartado “Operaciones de comparación” en la página 375 se describen lasnormas generales para la especificación de operaciones de comparación.

La Figura 200 en la página 438 muestra ejemplos de operaciones ORxx y ANDxxcon una operación DOUxx.

OTHER (De lo contrario, seleccionar)

Código Factor 1 Factor 2Campo deresultado Indicadores

OTHER

La operación OTHER empieza la secuencia de operaciones que se ha de procesar sino se satisface ninguna condición WHENxx o WHEN en un grupo SELECT. Lasecuencia finaliza con la operación ENDSL o END.

Normas a recordar al utilizar la operación OTHER:v La operación OTHER es opcional en un grupo SELECT.v Sólo puede especificarse una operación OTHER en un grupo SELECT.v No puede especificarse ninguna operación WHENxx o WHEN tras una

operación OTHER en el mismo grupo SELECT.v La secuencia de operaciones de cálculo en el grupo OTHER puede estar vacía; el

efecto es el mismo que no especificar la sentencia OTHER.v No se permiten entradas de indicadores de condicionamiento (posiciones de 9 a

11).

Para obtener más información acerca de los grupos SELECT, consulte los apartados“SELECT (Iniciar un grupo de selección)” en la página 530 y “WHENxx(Seleccionar cuando sea verdadero)” en la página 559.

504 VisualAge RPG Consulta del lenguaje

Page 527: RPG Referencia

OUT (Grabar un área de datos)

Código Factor 1 Factor 2Campo deresultado Indicadores

OUT (E) *LOCK Nombre de área dedatos

_ ER _

La operación OUT actualiza un área de datos. Antes de que se pueda realizar unaoperación OUT, una operación IN (con *LOCK) debe haber bloqueado el área odebe haberse especificado como una estructura de área de datos en lasespecificaciones de definición.

Si se especifica el factor 1, debe contener *LOCK. El área de datos permanecebloqueada después de haberse actualizado. Si no se especifica el factor 1, el área dedatos se desbloquea después de actualizarse.

Si un área de datos está bloqueada, otros programas la pueden leer pero no lapueden actualizar.

El factor 2 es el nombre del área de datos. Este es el nombre especificado en elcampo del resultado de la operación DEFINE o en la especificación de definición.Si se especifica el nombre en la operación DEFINE (utilizando *DTAARA), seactualizan todas las áreas de datos definidas en el programa.

Si se especifica un indicador de resultado en las posiciones 73 y 74, se activacuando se produce un error durante la operación OUT.

*...1....+....2....+....3....+....4....+....5....+....6....+....7...CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* Ejemplo de un grupo SELECT con WHENxx y OTHER. Si X es igual a 1,C* realiza las operaciones de la secuencia 1; si X no es igual a 1 e YC* es igual a 2, realiza las operaciones de la secuencia 2. Si no seC* cumple ninguna condición, realiza las operaciones de la secuencia 3.C*C SELECTC X WHENEQ 1C*C* Secuencia 1C*C :C :C Y WHENEQ 2C*C* Secuencia 2C*C :C :C OTHERC*C* Secuencia 3C*C :C :C ENDSL

Figura 259. Operación OTHER

Capítulo 25. Códigos de operación 505

Page 528: RPG Referencia

Para manejar las excepciones de OUT (código de estado de programa 401-421, 431o 432), puede especificarse el ampliador de código de operación ’E’ o un indicadorde error ER, pero no ambos. Para obtener más información sobre la gestión deerrores, consulte el apartado “Excepciones y errores de programa” en la página 48.

Las posiciones 71-72 y 75-76 deben estar en blanco.

Para ver una descripción de las normas generales, consulte “Operaciones de áreade datos” en la página 376. Vea en la Figura 217 en la página 460 un ejemplo de laoperación OUT.

PARM (Identificar parámetros)

Código Factor 1 Factor 2Campo deresultado Indicadores

PARM Campo de destino Campo de origen Parámetro

La operación PARM define los parámetros que componen una lista de parámetros(PLIST). Las operaciones PARM deben situarse inmediatamente después de laoperación PLIST, CALL, CALLB o START a la que hacen referencia. Las sentenciasPARM han de estar en el orden en que las espera el programa o función llamados.El número máximo de parámetros que pueden especificarse es:v Para una operación CALL, pueden especificarse hasta 255 parámetrosv En una operación CALLB, START (iniciar componente), PLIST, pueden

especificarse un máximo de 399 parámetros.

La Figura 260 en la página 509 ilustra la operación PARM.

Nota: Si está utilizando CALLP para llamar a un programa local, se definen losparámetros mediante la especificación del prototipo en la especificación dedefinición. Las secciones “Posiciones 24-25 (Tipo de definición)” en lapágina 233 y “OPTIONS(*OMIT *VARSIZE *STRING *RIGHTADJ)” en lapágina 252 describen cómo se especifican los parámetros para lasoperaciones CALLP.

Si se especifica el factor 1, debe ser del mismo tipo que el campo del resultado. Nopuede ser un literal ni una constante con nombre. Puede estar en blanco si elcampo del resultado contiene el nombre de una estructura de datos de múltiplesapariciones.

Si se especifica el factor 2, debe ser del mismo tipo que el campo del resultado.Puede estar en blanco si el campo del resultado contiene el nombre de unaestructura de datos de múltiples apariciones.

Si la comprobación del tipo de parámetro es importante para la aplicación, debedefinir una definición de interfaz de procedimiento y prototipo de la interfaz dellamada, en vez de utilizar las operaciones PLIST y PARM.

El campo del resultado debe contener el nombre de un campo, una estructura dedatos o una matriz:v Si se especifica una matriz, el área definida para la matriz se pasa al programa o

procedimiento llamado.v Si al programa llamado se pasa una estructura de datos con múltiples

apariciones, todas las apariciones de la estructura de datos se pasan como unsolo campo. No obstante, si se especifica un subcampo de una estructura de

506 VisualAge RPG Consulta del lenguaje

Page 529: RPG Referencia

datos de múltiple aparición en el campo del resultado, sólo la aparición actualdel subcampo pasa al programa o procedimiento llamado.

El campo de resultado no puede contener un parámetro UCS-2 a menos que sellame a un programa del lenguaje principal.

En operaciones que no son *ENTRY PLIST PARM, el campo del resultado puedecontener el nombre de un elemento de matriz u *OMIT (sólo para CALLB). Si seespecifica *OMIT, el factor 1 y el factor 2 deben estar en blanco.

En operaciones *ENTRY PLIST PARM, el campo del resultado no puede contenerlo siguiente:v *IN, *INxx, *IN(xx), *OMITv Una etiqueta, literal o constante con nombrev Un nombre de área de datos o un nombre de estructura de datos de área de

datosv Una estructura de datos inicializada globalmente, una estructura de datos con

subcampos inicializados o una estructura de datos con una matriz de tiempo decompilación como un subcampo

v Un nombre de tablav Campos o estructuras de datos definidos con la palabra clave BASEDv Un elemento de matrizv Un nombre de subcampo de estructura de datosv El nombre de una matriz de tiempo de compilaciónv El nombre de un estado de programa o estructura de datos de información de

archivo (INFDS)v No se permiten parámetros UCS-2.

Nota: Un nombre de campo puede especificarse sólo una vez en una *ENTRYPLIST.

No se permiten entradas de indicadores de condicionamiento (posiciones de 9 a11).

Reglas generales acerca de los parámetrosLa ubicación de almacenamiento para cada campo de parámetro está en elprograma o procedimiento de llamada. La dirección de la ubicación dealmacenamiento del campo del resultado en una operación PARM se pasa alprograma llamado. Si el programa o procedimiento llamado cambia el valor de unparámetro, cambia los datos de esa ubicación de almacenamiento. Cuando elcontrol retorna al programa o procedimiento de llamada, cambia el parámetro deéste (es decir, el campo del resultado). Incluso si el programa o procedimiento dellamada termina en error después de cambiar el valor de un parámetro, el valorcambiado existe en el programa o procedimiento de llamada. Para proteger lainformación pasada al programa o procedimiento de llamada para su utilizaciónposterior, especifique en el factor 2 el nombre del campo que contiene lainformación que desea pasar al programa o procedimiento de llamada. Se copia elfactor 2 en el campo del resultado, y las direcciones de almacenamiento pasan alprograma o procedimiento de llamada.

Debido a que se accede a los campos de parámetros mediante dirección, nonombre de campo, los parámetros de llamada y llamados no tienen que utilizar losmismos nombres de campo para los campos que se pasan. Los atributos de loscampos de parámetros correspondientes en los programas o procedimientos dellamada o llamados deben ser los mismos. Si no lo son, pueden producirseresultados indeseables.

Capítulo 25. Códigos de operación 507

Page 530: RPG Referencia

Cómo pasar los parámetros con las operaciones CALL, CALLB ySTARTCuando se ejecuta una operación CALL, CALLB o START (iniciar un componente),se produce lo siguiente:1. En el programa de llamada, se copia el contenido del factor 2 de una operación

PARM en el campo del resultado de la misma operación PARM. Si el campodel resultado de CALLB es *OMIT, se pasa una dirección nula al procedimientollamado.

2. Después de que el programa llamado reciba el control y después de cualquierinicialización normal del programa, el contenido del campo del resultado deuna operación PARM se copia en el campo del factor 1 de la misma operaciónPARM.

3. Cuando se devuelve el control al programa de llamada, el contenido del factor2 de una operación PARM se copia en el campo del resultado de la mismaoperación PARM. Este movimiento no se produce si el programa llamadofinaliza anormalmente.

4. En la operación START, el control se devuelve al programa de llamada tanpronto como se inicializa el componente de destino (después de que se hayacompletado el proceso de *INZSR). Para el resto de los componentes dedestino, el parámetro se puede acceder y modificar por los componentes deorigen y de destino.

5. Al volver al programa de llamada, el contenido del campo del resultado de unaoperación PARM se copia en el campo del factor 1 de la misma operaciónPARM. Este movimiento no se produce si el programa llamado finalizaanormalmente o si se produce un error en la operación de llamada.

PLIST (Identificar una lista de parámetros)

Código Factor 1 Factor 2Campo deresultado Indicadores

PLIST Nombre de PLIST

La operación PLIST define un nombre simbólico exclusivo para una lista deparámetros que se ha de especificar en una operación CALL CALLB, CALLP oSTART. La operación PLIST debe ser inmediatamente seguida por, al menos, unaoperación PARM.

El factor 1 debe contener el nombre de la lista de parámetros. Si la lista deparámetros es la lista de parámetros de entrada, el factor 1 debe contener *ENTRY.Sólo puede especificarse una lista de parámetros *ENTRY en un programa ofunción llamada. La lista de parámetros finaliza cuando se encuentra unaoperación distinta de PARM.

Si la comprobación del tipo de parámetro es importante para la aplicación, debedefinir una definición de interfaz de procedimiento y prototipo para la interfaz dellamada, en vez de utilizar las operaciones PLIST y PARM.

No se permiten entradas de indicadores de condicionamiento (posiciones de 9 a11).

508 VisualAge RPG Consulta del lenguaje

Page 531: RPG Referencia

POST (Anotar)

Código Factor 1 Factor 2Campo deresultado Indicadores

POST (E) Nombre de archivo NombreINFDS

_ ER _

La operación POST pone información en una estructura de datos de informaciónde archivo (INFDS). En los archivos remotos, esta estructura contiene lainformación siguiente:v Información de retorno de archivov Información de retorno de apertura

*...1....+....2....+....3....+....4....+....5....+....6....+....7...CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* En el programa de llamada, la operación CALL llama a PROG1 yC* permite que PROG1 acceda a los datos de los campos de lista deC* parámetros.C CALL 'PROG1' PLIST1C*C* En la segunda sentencia PARM, cuando se procesa CALL, elC* contenido del factor 2, *IN27, se coloca en el campo de resultado,C* BYTE. Cuando PROG1 devuelve el control, el contenido del campoC* de resultado, BYTE, se coloca en el campo del factor 1, *IN30.C* Tenga en cuenta que las entradas de los factores 1 y 2 sonC* opcionales.C*C PLIST1 PLISTC PARM Amount 5 2C *IN30 PARM *IN27 Byte 1*...1....+....2....+....3....+....4....+....5....+....6....+....7...CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C CALLB 'PROG2'...C* En este ejemplo, las operaciones PARM siguen inmediatamente aC* una operación CALLB en lugar de a una operación PLIST.C PARM Amount 5 2C *IN30 PARM *IN27 Byte 1...*...1....+....2....+....3....+....4....+....5....+....6....+....7...CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C* En la función llamada, PROG2, *ENTRY en el factor 1 de la sentenciaC* PLIST la identifica como la lista de parámetros de entrada.C* Cuando el control pasa a PROG2, el contenido de los campos deC* resultado (FieldC y FieldG) de la lista de parámetros se colocaC* en los campos del factor 1 (FieldA y FieldD). Cuando la funciónC* llamada vuelve, el contenido de los campos del factor 2 de laC* lista de parámetros (FieldB y FieldE) se colocan en los campos deC* resultado (FieldC y FieldG). Todos los campos están definidosC* en algún punto de la función llamada.C *ENTRY PLISTC FieldA PARM FieldB FieldCC FieldD PARM FieldE FieldG

Figura 260. Operaciones PLIST/PARM

Capítulo 25. Códigos de operación 509

Page 532: RPG Referencia

v Información de retorno de entrada/salida e información de retorno dependientede dispositivo

En los archivos locales, esta estructura contiene Información de Retorno deArchivo.

Si se especifica el factor 2, debe contener el nombre de un archivo. Puede ser unarchivo local o un archivo AS/400. Este archivo debe abrirse antes de unaoperación POST. La información para este archivo se anota en su INFDS asociada.

Si se especifica un archivo en el factor 2, el campo del resultado puede estar enblanco o puede contener el nombre de la INFDS asociada con el archivo. Si elcampo del resultado está en blanco, se utiliza la INFDS asociada con el archivoespecificado para la palabra clave INFDS en la especificación de archivo.

Si no se especifica el factor 2, el campo del resultado debe contener el nombre deestructura de datos que se ha utilizado para la palabra clave INFDS en laespecificación de archivo.

El archivo debe abrirse antes de una operación POST.

Si un archivo se abre para el proceso de múltiples miembros, la Información deRetorno de Apertura se actualiza cuando una operación como, por ejemplo, READ,READP, READE o READPE hace que se abra un nuevo miembro.

Si los registros de entrada están agrupados en bloques y no hay ninguna operaciónPOST en la aplicación, se copia la clave actual y el número relativo de registro enla Información de Retorno de Entrada/Salida. Si los registros de entrada estánagrupados en bloques y hay una operación POST en la aplicación, entonces seactualiza la Información de Retorno de Entrada/Salida con la clave y númerorelativo de registro del registro actual del bloque.

Si se especifica un indicador de resultado en las posiciones 73 y 74, se activacuando se produce un error durante la operación POST.

Para manejar las excepciones de POST (códigos de estado de archivo mayores que1000), puede especificarse el ampliador de código de operación ’E’ o un indicadorde error ER, pero no ambos. Para obtener más información sobre la gestión deerrores, consulte el apartado “Excepciones/errores de archivo” en la página 37.

READ (Leer un registro)

Código Factor 1 Factor 2Campo deresultado Indicadores

READ (EN)

Nombre de archivo Estructurade datos

_ ER EOF

READ (EN)

Nombre de registro _ ER EOF

READ (E) Nombre de ventana _ ER _

La operación READ lee datos de un archivo, de un formato de registro o de unaventana. El archivo puede ser un archivo AS/400 remoto o un archivo local.

510 VisualAge RPG Consulta del lenguaje

Page 533: RPG Referencia

Lectura desde un archivoEl factor 2 debe contener el nombre de un formato de registro o de un archivocontrolado en cálculo.

Un nombre de formato de registro en el factor 2 sólo se permite con un archivodescrito externamente (E en la posición 22 de las especificaciones de descripción dearchivo). Puede darse el caso de que una operación READ por nombre de formatoreciba un formato distinto al especificado en el factor 2. En ese caso, la operaciónREAD finaliza con un error.

Si el archivo especificado en el factor 2 está descrito por programa, el campo delresultado puede contener el nombre de una estructura de datos. El registro se leehacia dicha estructura de datos sin procesar las especificaciones de entrada para elarchivo. Un archivo descrito por programa se identifica por una letra F situada enla posición 22 de las especificaciones de descripción de archivo. Consulte elapartado “Operaciones de archivos” en la página 380 para obtener informaciónsobre cómo se transfieren datos entre el archivo y la estructura de datos.

Si la operación READ se realiza satisfactoriamente, el archivo se coloca en elsiguiente registro que satisface la lectura. Si se produce un error o una condiciónde fin de archivo, debe volver a posicionar el archivo (utilizando una operaciónCHAIN, SETLL o SETGT).

Si el archivo es un archivo de disco de actualización, puede especificarse elampliador de operación N para indicar que no debe colocarse ningún bloqueo enel registro cuando se lea.

Nota: No se da soporte al bloqueo para archivos locales.

Para manejar las excepciones de READ (códigos de estado de archivo mayores que1000), puede especificarse el ampliador de código de operación ’E’ o un indicadorde error ER, pero no ambos. Para obtener más información sobre la gestión deerrores, consulte el apartado “Excepciones/errores de archivo” en la página 37.

Puede especificar un indicador en las posiciones 75-76 para señalar si se haproducido un fin de archivo en la operación READ. El indicador se activa(condición EOF) o desactiva cada vez que se lleva a cabo la operación READ. Estainformación puede obtenerse también a partir de la función incorporada %EOF,que devuelve ’1’ si se produce una condición EOF y ’0’ en caso contrario. Elarchivo debe volver a posicionarse después de una condición EOF para procesarotras operaciones secuenciales satisfactorias (por ejemplo, READ o READP) para elarchivo.

Consulte la sección “Soporte de valores nulos de base de datos” en la página 128,si desea obtener información acerca de cómo leer registros con campos conposibilidad de nulos.

Capítulo 25. Códigos de operación 511

Page 534: RPG Referencia

Lectura desde una ventanaLas ventanas se manejan como archivos descritos externamente. El nombre deventana se trata como un nombre de formato de registro.

Si se especifica un nombre de ventana para el factor 2, la operación READ obtienelos atributos de los componentes de recuadro de combinación, recuadro deselección, campo de entrada, botón de selección y texto estático de la ventana. Elatributo para los componentes de entrada es TEXT. El atributo para loscomponentes de texto estático es LABEL.

Cuando se lee una ventana, las operaciones de obtención de atributo se realizansobre todos los componentes de texto estático y de campo de entrada. Los valoresse almacenan en campos que coinciden con los valores en la pantalla. Después dela operación READ, los valores almacenados en los campos coinciden con losvalores de la pantalla. Si hay muchos campos de texto estático y de entrada, utilicela operación READ en lugar de múltiples operaciones GETATR. Por ejemplo, si laventana INVENTORY contiene los componentes de campo de entrada ENT0000B yENT0000C, una operación READ de la ventana realiza lo equivalente a losiguiente:

*...1....+....2....+....3....+....4....+....5....+....6....+....7...CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* READ recupera el registro siguiente del archivo FILEA, que debe serC* un archivo controlado en cálculo.C*C* %EOF devolverá '1' si se da un fin de archivo en READC* o si se ha producido anteriormente y no se ha vuelto a posicionarC* el archivo. Cuando %EOF devuelve '1', el programa abandonaC* el bucle.C*C DOW '1'C READ FILEAC IF %EOFC LEAVEC ENDIFC*C* READ recupera el registro siguiente del tipo REC1 (factor 2)C* de un archivo descrito externamente. (REC1 es un nombre de formatoC* del registro.) Se activa el indicador 64 si se produce el fin deC* archivo en READ, o si se ha producido anteriormente y no se ha vueltoC* a situar el archivo. Cuando se activa el indicador 64, el programaC* abandona el bucle. El ampliador de código de operación NC* indica que el registro no está bloqueado.C*C READ(N) REC1 64C 64 LEAVEC ENDDO

Figura 261. Operación READ para archivos

CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....Comments++++++CSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++++++Comments++++++C EVAL ENT0000B = %GETATR('INVENTORY':'ENT0000B':'TEXT')C EVAL ENT0000C = %GETATR('INVENTORY':'ENT0000C':'TEXT')

Figura 262. Operación READ para ventanas

512 VisualAge RPG Consulta del lenguaje

Page 535: RPG Referencia

READC (Leer siguiente registro modificado)

Código Factor 1 Factor 2Campo deresultado Indicadores

READC (E) Nombre desubarchivo

_ ER EOF

La operación READC obtiene el siguiente registro modificado del componente desubarchivo.

El factor 2 debe ser el nombre del componente de subarchivo.

Si se especifica el campo del resultado, debe ser un nombre de campo numéricosin posiciones decimales. El número relativo de registro del registro recuperado secoloca en el campo del resultado.

Para manejar las excepciones de READC (códigos de estado de archivo mayoresque 1000), puede especificarse el ampliador de código de operación ’E’ o unindicador de error ER, pero no ambos. Para obtener más información sobre lagestión de errores, consulte el apartado “Excepciones/errores de archivo” en lapágina 37.

Puede especificar un indicador en las posiciones 75-76 que se activará cuando nohaya más registros cambiados en el subarchivo. Esta información también puedeobtenerse a partir de la función incorporada %EOF que devuelve ’1’ si no hay másregistros cambiados y ’0’ en caso contrario.

Si se especifica un indicador de fin de archivo (EOF), el indicador se activa cuandono hay más registros cambiados en el subarchivo. Si la operación no se harealizado satisfactoriamente, no se modifican los campos del programa.

Capítulo 25. Códigos de operación 513

Page 536: RPG Referencia

READE (Leer clave igual)

Código Factor 1 Factor 2Campo deresultado Indicadores

READE (EN)

Argumento debúsqueda

Nombre de archivo _ ER EOF

READE (EN)

Argumento debúsqueda

Nombre de registro _ ER EOF

La operación READE recupera el siguiente registro secuencial de un archivocontrolado en cálculo (identificado por una F en la posición 18 de lasespecificaciones de descripción de archivo) si la clave del registro coincide con elargumento de búsqueda. Si la clave del registro no coincide con el argumento debúsqueda, se produce una condición EOF y no se devuelve el registro al programa.También se da una condición EOF cuando se produce el fin de archivo.

La operación READE sólo puede utilizarse con archivos AS/400.

El factor 1, el argumento de búsqueda, es opcional e identifica el registro arecuperar. Puede ser un nombre de campo, un literal, una constante con nombre ouna constante figurativa. En el factor 1 puede especificar un nombre KLIST paraun archivo descrito externamente. Si el factor 1 se deja en blanco y la clave delregistro siguiente es igual a la del registro actual, se recupera el siguiente registro

*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....FFilename++IT.A.FRlen+......A.Device+.Keywords+++++++++++++++++++++++++++++F* SUBCUST es un componente subarchivo que muestra una lista de registrosF* del archivo CUSINFO.F*FCUSINFO UF E DISK REMOTEFCSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C* El subarchivo SUBCUST se ha cargado con los registros del archivoC* CUSINFO. Si hay cambios en alguno de los registros visualizados en elC* subarchivo, la operación READC leerá los registros cambiadosC* uno por uno en el bucle DO WHILE.C* Se localizará el registro correspondiente en el archivo CUSINFOC* con la operación CHAIN y se actualizará con el campoC* modificado.C* SCUSNO, SCUSNAM, SCUSADR y SCUSTEL son campos definidos en elC* subarchivo. CUSNAM, CUSADR y CUSTEL son campos definidos en unC* registro, CUSREC, definido a su vez en el archivo CUSINFO.C*C READC SUBCUSTC DOW %EOF = *OFFC SCUSNO CHAIN (E) CUSINFOC* Actualiza el registro sólo si lo encuentra en el archivo.C :C IF NOT %ERRORC EVAL CUSNAM = SCUSNAMC EVAL CUSADR = SCUSADRC EVAL CUSTEL = SCUSTELC UPDATE CUSRECC ENDIFC READC (E) SUBCUSTC ENDDO

Figura 263. Ejemplo de la operación READC

514 VisualAge RPG Consulta del lenguaje

Page 537: RPG Referencia

del archivo. La clave completa se define mediante el formato de registro o elarchivo utilizado en el factor 2. Las claves de tipo gráfico y UCS-2 deben tener elmismo CCSID.

Si el archivo que se lee está definido como de actualización, se solicita un bloqueotemporal en el siguiente registro y el argumento de búsqueda se compara con laclave de ese registro. Si el registro ya está bloqueado, el programa debe esperarhasta que el registro esté disponible antes de obtener el bloqueo temporal yrealizar la comparación. Si la comparación da un resultado de desiguales, seproduce una condición EOF y se elimina el bloqueo temporal del registro. Si no seespecifica ningún bloqueo (ampliador de operación ’N’), no se solicita un bloqueotemporal.

El factor 2 debe contener el nombre del archivo o formato del registro a recuperar.Sólo se permite un nombre de formato de registro en el factor 2 con un archivodescrito externamente (identificado por una E en la posición 22 de lasespecificaciones de descripción de archivo.)

El campo de resultado puede contener el nombre de una estructura de datos a laque se traslada el registro leído únicamente si el archivo nombrado en el factor 2 esun archivo descrito por programa (identificado por una F en la posición 22 de lasespecificaciones de descripción de archivo). Consulte el apartado “Operaciones dearchivos” en la página 380 para obtener una descripción de la forma en que setransfieren los datos entre el archivo y la estructura de datos.

Para manejar las excepciones de READE (códigos de estado de archivo mayoresque 1000), puede especificarse el ampliador de código de operación ’E’ o unindicador de error ER, pero no ambos. Para obtener más información sobre lagestión de errores, consulte el apartado “Excepciones/errores de archivo” en lapágina 37.

Puede especificar un indicador en las posiciones 75-76 que se activará si se da unacondición EOF: es decir, si no se encuentra un registro con una clave igual alargumento de búsqueda o si se encuentra un fin de archivo. Esta informaciónpuede obtenerse también a partir de la función incorporada %EOF, que devuelve’1’ si se produce una condición EOF y ’0’ en caso contrario.

Si la operación READE no se realiza satisfactoriamente, no se modifican loscampos del programa y el archivo debe volverse a situar (por ejemplo, utilizandoCHAIN, SETLL o SETGT). *START y *END pueden utilizarse para situar elarchivo. Para obtener más información acerca de la posición de archivo, consulte elapartado “Posición de archivo” en la página 6.

Una operación READE con el factor 1 especificado situada inmediatamente acontinuación de una operación OPEN o una condición EOF, recupera el primerregistro del archivo si la clave del registro coincide con el argumento de búsqueda.Una operación READE sin un factor 1 especificado situada inmediatamente acontinuación de una operación OPEN o una condición EOF, da como resultado unerror. Se activa el indicador de error de las posiciones 73 y 74, si se ha especificado,o se activa el ampliador ’E’ seleccionado con %ERROR, si se ha especificado. Nopueden emitirse más operaciones de E/S en el archivo hasta que se haya cerrado yvuelto a abrir satisfactoriamente.

Capítulo 25. Códigos de operación 515

Page 538: RPG Referencia

Consulte el apartado “Soporte de valores nulos de base de datos” en la página 128para obtener información sobre la lectura de registros con campos con capacidadde nulos.

READP (Leer registro anterior)

Código Factor 1 Factor 2Campo deresultado Indicadores

READP (EN)

Nombre de archivo Estructurade datos

_ ER BOF

READP (EN)

Nombre de registro _ ER BOF

La operación READP lee el registro anterior de un archivo controlado en cálculo(identificado por una F en la posición 18 de las especificaciones de descripción dearchivo).

El factor 2 debe contener el nombre de un archivo o formato de registro a leer. Unnombre de formato de registro en el factor 2 sólo se permite con un archivo

*...1....+....2....+....3....+....4....+....5....+....6....+....7...CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* Con el factor 1 especificado...C*C* La operación READE recupera el registro siguiente del archivoC* FILEA y compara su clave con el argumento de búsqueda, KEYFLD.C* La función incorporada %EOF devolverá '1' si KEYFLD noC* es igual a la clave del registro leído o si se encuentra el fin deC* archivo.C*C KEYFLD READE FILEAC*C* La operación READE recupera el registro siguiente de tipo REC1C* de un archivo descrito externamente y compara la clave del registroC* leído con el argumento de búsqueda, KEYFLD. (REC1 es un nombre deC* formato de registro.) Se activa el indicador 56 si KEYFLD no es igualC* a la clave del registro leído o si se encuentra el fin de archivo.C*C KEYFLD READE REC1 56C*C* Sin el factor 1 especificado...C*C* La operación READE recupera el registro siguiente de la vía deC* acceso del archivo FILEA si el valor de la clave es igualC* al valor de la clave del registro en la posición del cursorC* actual. Si los valores de clave no son iguales, %EOF devolverá '1'.C READE FILEAC*C* La operación READE recupera el registro siguiente de la vía deC* acceso del archivo FILEA si el valor de clave es igual al valor deC* clave del registro en la posición actual. REC1 es un nombre de formatoC* de registro. Se activa el indicador 56 si los valores de clave sonC* desiguales. N indica que el registro no está bloqueado.C READE(N) REC1 56

Figura 264. Operación READE

516 VisualAge RPG Consulta del lenguaje

Page 539: RPG Referencia

descrito externamente. Si se especifica un nombre de formato de registro en elfactor 2, el registro recuperado es el primer registro anterior del tipo especificado.Se ignoran los registros intermedios.

El campo de resultado puede contener el nombre de una estructura de datos a laque se traslada el registro leído únicamente si el archivo nombrado en el factor 2 esun archivo descrito por programa (identificado por una F en la posición 22 de lasespecificaciones de descripción de archivo). Consulte el apartado “Operaciones dearchivos” en la página 380 para saber cómo se transfieren los datos entre el archivoy la estructura de datos.

Si la operación READP se realiza satisfactoriamente, el archivo se sitúa en elregistro anterior que satisface la lectura.

Si el archivo que se lee es un archivo de disco de actualización, puede especificarseel ampliador de operación N para indicar que no debe colocarse ningún bloqueoen el registro cuando se lea.

Para manejar las excepciones de READP (códigos de estado de archivo mayoresque 1000), puede especificarse el ampliador de código de operación ’E’ o unindicador de error ER, pero no ambos. Para obtener más información sobre lagestión de errores, consulte el apartado “Excepciones/errores de archivo” en lapágina 37.

Puede especificar un indicador en las posiciones 75-76 que se activará cuando noexistan registros anteriores en el archivo (condición de inicio de archivo). Estainformación puede obtenerse también a partir de la función incorporada %EOF,que devuelve ’1’ si se produce una condición BOF y ’0’ en caso contrario.

Debe volver a posicionar el archivo (por ejemplo, utilizando una operaciónCHAIN, SETLL o SETGT) después de un error o condición BOF para procesarotras operaciones secuenciales satisfactorias (por ejemplo, READ o READP). Puedeutilizar *START y *END para situar el archivo. Para obtener más informaciónacerca del posicionamiento de los archivos, consulte el apartado “Posición dearchivo” en la página 6

Consulte la sección “Soporte de valores nulos de base de datos” en la página 128,si desea obtener información acerca de cómo leer registros con campos conposibilidad de nulos.

Capítulo 25. Códigos de operación 517

Page 540: RPG Referencia

READPE (Leer igual anterior)

Código Factor 1 Factor 2Campo deresultado Indicadores

READPE (EN)

Argumento debúsqueda

Nombre de archivo Estructurade datos

_ ER BOF

READPE (EN)

Argumento debúsqueda

Nombre de registro _ ER BOF

La operación READPE recupera el siguiente registro secuencial anterior de unarchivo controlado en cálculo (identificado por una F en la posición 18 de lasespecificaciones de descripción de archivo) si la clave del registro coincide con elargumento de búsqueda. Si la clave del registro no coincide con el argumento debúsqueda, se da una condición BOF y no se devuelve el registro al programa.También se da una condición BOF cuando se produce el inicio de archivo.

La operación READPE sólo puede utilizarse con archivos AS/400.

El factor 1, el argumento de búsqueda, es opcional e identifica el registro arecuperar. Puede ser un nombre de campo, un literal, una constante con nombre ouna constante figurativa. También puede especificar un nombre KLIST en el factor1 para un archivo descrito externamente. Si el factor se deja en blanco y la clavecompleta del registro anterior es igual a la del registro actual, se recupera elanterior registro del archivo. La clave completa se define mediante el formato deregistro o el archivo utilizado en el factor 2. Las claves de tipo gráfico y UCS-2deben tener el mismo CCSID.

El factor 2 debe contener el nombre del archivo o formato del registro a recuperar.Sólo se permite un nombre de formato de registro en el factor 2 con un archivodescrito externamente (identificado por una E en la posición 22 de lasespecificaciones de descripción de archivo).

*...1....+....2....+....3....+....4....+....5....+....6....+....7...CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* La operación READP lee el registro anterior de FILEA.C* La función incorporada %EOF devolverá '1' si se encuentra el principioC* de archivo. Cuando %EOF devuelve '1', el programa se bifurcaC* a la etiqueta BOF especificada en la operación GOTO.C*C READP FILEAC IF %EOFC GOTO BOFC ENDIFC*C* La operación READP lee el siguiente registro anterior de tipoC* REC1 de un archivo descrito externamente. (REC1 es un nombre deC* formato de registro.) El indicador 72 se activa si se encuentraC* el inicio del archivo durante el proceso de la operación READP.C* Cuando se activa el indicador 72, el programa se bifurca a laC* etiqueta BOF especificada en la operación GOTO.C READP PREC1 72C 72 GOTO BOFC*C BOF TAG

Figura 265. Operación READP

518 VisualAge RPG Consulta del lenguaje

Page 541: RPG Referencia

El campo de resultado puede contener el nombre de una estructura de datos a laque se traslada el registro leído únicamente si el archivo nombrado en el factor 2 esun archivo descrito por programa (identificado por una F en la posición 22 de lasespecificaciones de descripción de archivo). Consulte el apartado “Operaciones dearchivos” en la página 380 para obtener una descripción de la forma en que setransfieren los datos entre el archivo y la estructura de datos.

Si el archivo que se lee es un archivo de disco de actualización, puede especificarel ampliador de operación N para indicar que no debe realizarse ningún bloqueosobre el registro cuando se lea.

Para manejar las excepciones de READPE (códigos de estado de archivo mayoresque 1000), puede especificarse el ampliador de código de operación ’E’ o unindicador de error ER, pero no ambos. Para obtener más información sobre lagestión de errores, consulte el apartado “Excepciones/errores de archivo” en lapágina 37.

Puede especificar un indicador en las posiciones 75-76 que se activará si se da unacondición BOF (principio de archivo): es decir, si no se encuentra un registro conuna clave igual al argumento de búsqueda o si se encuentra un inicio de archivo.Esta información puede obtenerse también a partir de la función incorporada%EOF, que devuelve ’1’ si se produce una condición BOF y ’0’ en caso contrario.

Si una operación READPE no es satisfactoria, debe volver a posicionar el archivo:por ejemplo, utilizando una operación CHAIN, SETGT o SETLL.

Nota: Si el archivo que se lee está definido como actualización, se solicita unbloqueo temporal en el registro anterior y el argumento de búsqueda secompara con la clave de ese registro. Si el registro ya está bloqueado, elprograma debe esperar hasta que el registro esté disponible antes de obtenerel bloqueo temporal y realizar la comparación. Si la comparación esdesigual, se da una condición BOF y se elimina el bloqueo temporal delregistro. Si no se especifica ningún bloqueo (ampliador de operación ’N’), nose solicita un bloqueo temporal.

Si una operación READPE con el factor 1 especificado está situada inmediatamentedespués de una operación OPEN o una condición BOF, se devuelve BOF. Unaoperación READPE sin un factor 1 especificado situada inmediatamente despuésde una operación OPEN o una condición BOF da como resultado una condición deerror. Se activa el indicador de error de las posiciones 73 y 74, si se ha especificado,o se activa el ampliador ’E’ seleccionado con %ERROR, si se ha especificado. Elarchivo debe volverse a posicionar utilizando CHAIN, SETLL, READ, READE oREADP con el factor 1 especificado antes de emitir una operación READPE con elfactor 1 en blanco. No debe utilizarse una operación SETGT para situar el archivoantes de emitir una operación READPE (sin el factor 1 especificado) porque esto dacomo resultado una condición de registro no encontrado (ya que el registroanterior al registro actual no tiene nunca la misma clave que el registro actualdespués de emitir SETGT). Si el factor 1 está especificado con la misma clave paralos dos códigos de operación, no se producirá esta condición de error.

Capítulo 25. Códigos de operación 519

Page 542: RPG Referencia

READS (Leer seleccionados)

Código Factor 1 Factor 2Campo deresultado Indicadores

READS (E) Nombre desubarchivo

_ ER EOF

La operación READS recupera los registros seleccionados de un componente desubarchivo. Se lee el primer registro seleccionado del componente de subarchivo.

Si el estilo de selección de subarchivo es extendido o múltiple, se deselecciona elregistro. Si el estilo de selección del subarchivo es uno solo, el registro permaneceseleccionado. Una operación READS posterior lee de nuevo el mismo registro.

El factor 2 especifica el nombre del componente de subarchivo.

Si el campo de resultado está especificado, debe ser numérico sin posicionesdecimales. El número de índice de subarchivo del registro recuperado se coloca enel campo del resultado.

Para manejar las excepciones de READS (códigos de estado de archivo mayoresque 1000), puede especificarse el ampliador de código de operación ’E’ o unindicador de error ER, pero no ambos. Para obtener más información sobre lagestión de errores, consulte el apartado “Excepciones/errores de archivo” en lapágina 37.

*...1....+....2....+....3....+....4....+....5....+....6....+....7...CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* Con el factor 1 especificado...C*C* Se lee el registro anterior y se compara la clave con FieldA.C* Se activa el indicador 99 si la clave del registro no coincide conC* FieldA.C FieldA READPE FileA 99C*C* Se lee el registro anterior del formato de registro RecA, y seC* compara la clave con FieldC. El indicador 88 se activa si la operaciónC* no finaliza de forma satisfactoria, y el indicador 99 se activaC* si la clave del registro no coincide con FieldC.C FieldC READPE RecA 8899C*C* Sin el factor 1 especificado...C*C* Se recupera el registro anterior de la vía de acceso si su valor deC* clave es igual al valor de clave del registro actual. Se activa elC* indicador 99 si los valores de clave no son iguales.C READPE FileA 99C*C* Se recupera el registro anterior del formato del registro RecA siC* su valor de clave coincide con el valor de clave del registro actualC* en la vía de acceso. Se activa el indicador 88 si la operación no esC* satisfactoria; se activa el 99 si los valores de clave no son iguales.C READPE RecA 8899

Figura 266. Operación READPE

520 VisualAge RPG Consulta del lenguaje

Page 543: RPG Referencia

Puede especificar un indicador en las posiciones 75-76 que se activará cuando sedé una condición EOF: es decir, cuando no haya registros seleccionados en elsubarchivo. Esta información puede obtenerse también a partir de la funciónincorporada %EOF, que devuelve ’1’ si se produce una condición EOF y ’0’ en casocontrario.

REALLOC (Reasignar almacenamiento con longitud nueva)

Código Factor 1 Factor 2 Campo deresultado

Indicadores

REALLOC(E)

Longitud Puntero _ ER _

La operación REALLOC modifica la longitud del almacenamiento dinámico al queseñala el puntero del campo del resultado, por la longitud especificada en el factor2. El campo de resultado de REALLOC contiene una variable de puntero de base.El puntero del campo del resultado debe contener el valor establecidoanteriormente mediante una operación de asignación de almacenamiento dinámico(puede ser una operación ALLOC o REALLOC en RPG, o bien cualquier otrafunción de almacenamiento dinámico). No es suficiente señalar simplemente alalmacenamiento dinámico; se ha de establecer que el puntero señale al principio deuna asignación.

Se asigna un nuevo almacenamiento con el tamaño especificado y el valor delantiguo almacenamiento se copia en el nuevo. Después se desasigna el antiguoalmacenamiento. Si la longitud nueva es menor, el valor se trunca por la derecha.Si la longitud nueva es mayor, el nuevo almacenamiento situado a la derecha delos datos copiados no está inicializado.

Se establece el puntero del campo del resultado para que señale al nuevoalmacenamiento.

Si la operación no es satisfactoria, se produce una condición de error pero no semodificará el puntero del campo de resultado. Si el puntero original era válido y laoperación no fue satisfactoria porque no se disponía de suficiente almacenamiento

*...1....+....2....+....3....+....4....+....5....+....6....+....7...CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* SUBCUST es un componente subarchivo que muestra una lista de registros.C* La operación READS lee los registros seleccionados en el subarchivoC* visualizado uno por uno en el bucle do while. SCUSNO y SCUSNAMC* son campos definidos en el subarchivo.C*C READS SUBCUST 27C DOW *IN27 = *OFFC*C* Los campos SCUSNO, SCUSNAM pueden utilizarse aquí para procesar elC* registro seleccionado que se ha leído.C*C READS SUBCUST 27C ENDDOC*

Figura 267. Operación READS

Capítulo 25. Códigos de operación 521

Page 544: RPG Referencia

nuevo (estado 425), no se desasignará el almacenamiento original, de modo que elpuntero del campo del resultado sigue siendo válido con su valor original.

Si el puntero es válido pero no señala a un almacenamiento que puededesasignarse, se establecerá el estado 00426 (error en la operación de gestión dealmacenamiento).

Para manejar las excepciones con los códigos de estado del programa 425 ó 426,puede especificarse el ampliador de código de operación ’E’ o un indicador deerror ER, pero no ambos. Para obtener más información sobre la gestión de errores,consulte el apartado “Excepciones y errores de programa” en la página 48.

El factor 2 contiene una constante o variable numérica que indica el nuevo tamañodel almacenamiento (en bytes) que ha de asignarse. El factor 2 debe ser numéricocon cero posiciones decimales. El valor ha de estar comprendido entre 1 y16776704.

Si desea obtener más información, consulte la sección “Operaciones de gestión dememoria” en la página 382.

RESET (Restablecer)

Código Factor 1 Factor 2Campo deresultado Indicadores

RESET (E) *ALL Variable _ ER _

RESET (E) *NOKEY *ALL Estructura _ ER _

RESET (E) Ventana oSubarchivo

_ ER _

La operación RESET establece los siguientes elementos en sus valores iniciales:v Elementos de una estructura (formatos de registro, estructuras de datos,

matrices, tablas)v Variables (campos, subcampos, indicadores)v Componentes de texto estático y de campos de entrada de una ventana

Para manejar las excepciones de RESET (código de estado del programa 123),puede especificarse el ampliador de código de operación ’E’ o un indicador deerror ER, pero no ambos. Para obtener más información sobre la gestión de errores,consulte el apartado “Excepciones y errores de programa” en la página 48.

La operación RESET aumenta la cantidad de almacenamiento que necesita elprograma ya que las variables, estructuras o ventanas que se restablecen doblan el

D Ptr1 S *D Fld S 32767A BASED(Ptr1)D*C* La operación ALLOC asigna 7 bytes al puntero Ptr1.C* Después de la operación ALLOC, sólo pueden utilizarse los primerosC* bytes de la variable Fld.C ALLOC 7 Ptr1C EVAL %SUBST(Fld : 1 : 7) = '1234567'C*C REALLOC 10 Ptr1C* Ahora pueden utilizarse 10 bytes de Fld.C EVAL %SUBST(Fld : 1 : 10) = '123456789A'

Figura 268. Operación REALLOC

522 VisualAge RPG Consulta del lenguaje

Page 545: RPG Referencia

almacenamiento. En estructuras de datos de múltiples apariciones, tablas ymatrices, se guarda el valor inicial de cada aparición o elemento.

No utilice la operación RESET durante la rutina de inicialización. Si se utiliza unaoperación (por ejemplo, GOTO) para abandonar la subrutina de inicialización conanterioridad a la posición donde se guardan los valores iniciales, se produce unerror en todas las operaciones RESET que se intentan en el programa.

Cómo restablecer los campos de entrada y el texto estático deuna ventanaSi el campo del resultado contiene un nombre de ventana, el factor 1 y el factor 2deben estar en blanco.

Cuando se restablece una ventana, los componentes de los campos de entrada y loscomponentes del texto estático de la ventana se restablecen en sus valores iniciales.Los componentes se restablecen en los valores iniciales de los camposcorrespondientes del programa; no se restablecen en sus valores inicialesproporcionados al utilizar el diseñador GUI. Los valores iniciales de los camposcorrespondientes son el valor que tenían al final de la inicialización del programa.Este valor se establece utilizando el diseñador GUI, en la especificación dedefinición o utilizando la subrutina de inicialización. Los valores proporcionadosen la subrutina de inicialización (*INZSR) prevalecen sobre los proporcionados enuna especificación de definición y los proporcionados en una especificación dedefinición prevalecen sobre los proporcionados al diseñador GUI.

Por ejemplo, la tabla siguiente muestra cómo afectan a la operación RESET losvalores para varios componentes de campos de entrada que se proporcionan en eldiseñador GUI y los valores para campos de la especificación de definición y en lasubrutina de inicialización (*INZSR):

Diseñador GUIEspecificación dedefinición *INZSR

Valor después deRESET

ENT0000B=22.5 ENT0000B=30.5 ENT0000B=30.5

ENT0000A=abc ENT0000A=xyz ENT0000A=pqr ENT0000A=pqr

ENT0000C=Nombre ENT0000C=Nombre

Si ENT0000D es decaracteres, RESETrestablece en espaciosen blanco. SiENT0000D esnumérico, RESETrestablece en cero.

Nota: Después de la operación RESET, los valores almacenados en los campos delprograma coinciden con los valores visualizados en la pantalla.

Cómo restablecer los elementos de una estructura y de lasvariablesLos valores iniciales de una variable o estructura son los valores que tenían al finalde la inicialización del programa. Dicho valor puede establecerse utilizando lapalabra clave INZ en la especificación de definición o utilizando la subrutina deinicialización para asignar un valor inicial. Este valor inicial se utiliza por laoperación RESET. Los valores proporcionados en la subrutina de inicialización(*INZSR) prevalecen sobre los proporcionados en una especificación de definición.

Capítulo 25. Códigos de operación 523

Page 546: RPG Referencia

El campo del resultado debe contener un nombre de formato de registro, unnombre de estructura de datos, un nombre de matriz, un nombre de tabla, unnombre de campo, un subcampo, un elemento de matriz o un nombre deindicador:v Si se restablece un formato de registro o una estructura de datos de única

aparición, todos los campos se restablecen en el orden en que se han declaradoen la estructura.Si se especifica el factor 1, debe contener *NOKEY que indica que los campos declave no se restablecen en sus valores iniciales.Si se especifica el factor 2, debe contener *ALL que indica que se restablecentodos los campos para el formato de registro. Si no se especifica el factor 2, sóloafecta a los campos de salida del formato de registro. Afecta a todos losindicadores de condicionamiento de campo del formato de registro. RESET noafecta a los campos de sólo entrada.

v Si se restablece una estructura de datos de múltiples apariciones, se restablecentodos los campos de la aparición actual.

v Si se restablece una matriz, se restablece toda la matriz.v Si se restablece una tabla, se restablece el elemento actual de tabla.v Si se restablece un elemento de matriz (incluyendo indicadores), sólo se

restablece el elemento especificado.

Nota: No se permite RESET con variables basadas.

524 VisualAge RPG Consulta del lenguaje

Page 547: RPG Referencia

RETURN (Volver al llamador)

Código Factor 1 Factor ampliado 2

RETURN(H M/R)

Expresión

La operación RETURN provoca una vuelta al llamador:v Si LR está activado, el programa finaliza normalmente y el componente termina.

Se lleva a cabo *TERMSR. Se graban las estructuras de área de datos, matrices ytablas bloqueadas. Se restablecen los indicadores externos. Si se ha invocado másde una subrutina, RETURN provoca una vuelta a la invocación de la subrutinade acción anterior.

*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....FEXTFILE O E DISK REMOTEDName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++DD* El archivo EXTFILE contiene un formato de registro, RECFMT, queD* contiene los campos de caracteres CHAR1 y CHAR2 y los camposD* numéricos NUM1 y NUM2.DD DS1 DSD DAY1 1 8 INZ('MONDAY')D DAY2 9 16 INZ('THURSDAY')D JDATE 17 22DCSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* La operación siguiente establece DAY1, DAY2 y JDATE como blancos.CC CLEAR DS1CC* La operación siguiente establece DAY1, DAY2 y JDATE con sus valoresC* iniciales 'MONDAY', 'THURSDAY' y UDATE respectivamente.C* El valor inicial de UDATE para JDATE se establece en *INZSR.CC RESET DS1CC* La operación siguiente establece CHAR1 y CHAR2 como blancos yC* NUM1 y NUM2 en cero.C CLEAR RECFMTC* La operación siguiente establece CHAR1, CHAR2, NUM1 yC* NUM2 en sus valores iniciales 'NAME', 'ADDRESS', 1 y 2C* respectivamente. Dichos valores se establecen en *INZSR.C*C RESET RECFMTCC *INZSR BEGSRC MOVEL UDATE JDATEC MOVEL 'NAME ' CHAR1C MOVEL 'ADDRESS ' CHAR2C Z-ADD 1 NUM1C Z-ADD 2 NUM2C ENDSRC* La operación siguiente establece todos los campos del formato deC* registro como espacios en blanco, excepto los campos clave.C*C *NOKEY RESET *ALL DBRECFMT

Figura 269. Operación RESET

Capítulo 25. Códigos de operación 525

Page 548: RPG Referencia

v Si LR no está activado, se lleva a cabo el proceso por omisión asociado con elevento actual, a menos que RETURN esté en una subrutina anidada, o se estéefectuando la inicialización o terminación.

Nota: LR no produce ningún efecto hasta que se retorna la última invocación desubrutina de acción.

Cuando un subprocedimiento vuelve, el valor de retorno, si está especificado en elprototipo del programa o procedimiento llamado, se pasa al llamador. No seproduce nada más automáticamente. Se han de cerrar manualmente todos losarchivos y áreas de datos. Se pueden activar los indicadores, pero esto noprovocará que se produzca la finalización del programa. Para obtener informaciónacerca de cómo utilizar los ampliadores de operación H, M y R, consulte la sección“Reglas de precisión para operaciones numéricas” en la página 358.

En un subprocedimiento que devuelve un valor, se ha de codificar una operaciónRETURN dentro del subprocedimiento. El valor devuelto real desempeña la mismafunción que el lado izquierdo de la expresión EVAL, mientras que el factor 2ampliado de la operación RETURN desempeña la misma función que el ladoderecho. Puede devolverse una matriz sólo si el prototipo ha definido el valor deretorno como una matriz.

En un subprocedimiento que devuelve un valor hay que asegurarse de que seefectúa la operación RETURN antes de llegar al final del procedimiento. Si elsubprocedimiento finaliza sin encontrar una operación RETURN, se indica unaexcepción al llamador.

ROLBK (Retrotraer)

Código Factor 1 Factor 2Campo deresultado Indicadores

ROLBK (E) _ ER _

La operación ROLBK elimina todos los cambios realizados en cualquier archivo debase de datos de AS/400 que se haya abierto para control de compromiso desde laúltima operación de comprometer o retrotraer o desde el principio de lasoperaciones bajo el control de compromiso si no ha habido ninguna operaciónCOMMIT ni ROLBK.

La operación ROLBK sólo puede utilizarse con archivos AS/400. No se puedeutilizar con archivos locales.

Se liberan todos los bloqueos de registro para los archivos bajo control decompromiso para un servidor AS/400 determinado sin tener en cuenta quécomponente ha emitido la operación ROLBK.

Nota: El componente que emite ROLBK no necesita tener ningún archivo bajocontrol de compromiso.

Para manejar las excepciones de ROLBK (códigos de estado de programa 802 a805), puede especificarse el ampliador de código de operación ’E’ o un indicadorde error ER, pero no ambos. Para obtener más información sobre la gestión deerrores, consulte el apartado “Excepciones y errores de programa” en la página 48.

526 VisualAge RPG Consulta del lenguaje

Page 549: RPG Referencia

SCAN (Buscar serie)

Código Factor 1 Factor 2Campo deresultado Indicadores

SCAN (E) Serie decomparación:longitud

Serie base:inicio Posiciónmás a laizquierda

_ ER FD

La operación SCAN busca una serie de comparación en una serie base. Laoperación SCAN empieza en el carácter situado más a la izquierda de la serie basedel factor 2 (tal como se especifica en la ubicación de inicio) y continúa, carácterpor carácter, de izquierda a derecha, comparando los caracteres del factor 2 con losdel factor 1. Las series se indexan desde la posición 1.

Notas:

1. La serie de comparación y la serie base deben ser del mismo tipo, ambas detipo carácter, ambas de tipo gráfico o ambas de tipo UCS-2.

2. Los blancos de inicio, de cola o intercalados especificados en la serie decomparación se incluyen en la operación SCAN.

3. La operación SCAN es sensible a mayúsculas y minúsculas. Una serie decomparación especificada en minúsculas no se encontrará en una serie baseespecificada en mayúsculas.

4. No se pueden utilizar constantes figurativas en el factor 1, en el factor 2 ni enlos campos de resultado.

5. No se permite solapado en una estructura de datos para el factor 1 y el campodel resultado o para el factor 2 y el campo del resultado.

El factor 1 debe contener la serie de comparación o ésta, seguida de dos puntos,seguidos a su vez por la longitud. La serie de comparación debe contener unnombre de campo, un elemento de matriz, una constante con nombre, una nombrede estructura de datos, un literal o un nombre de tabla. La longitud debe sernumérica sin posiciones decimales y debe contener una constante con nombre, unelemento de matriz, un nombre de campo, un literal o un nombre de tabla. Si nose especifica la longitud, se utiliza la serie de comparación.

El factor 2 debe contener la serie base, o la serie base seguida de dos puntos y, acontinuación, la ubicación de inicio. La serie base debe contener un nombre decampo, un elemento de matriz, una constante con nombre, un nombre deestructura de datos, un literal o un nombre de tabla. La ubicación de inicio tieneque ser numérica sin posiciones decimales y debe ser una constante con nombre,un elemento de matriz, un nombre de campo, un literal o un nombre de tabla. Sino se especifica la ubicación de inicio, el valor por omisión es 1.

Nota: El inicio no puede ser mayor que la longitud.

Si se utilizan series de tipo gráfico o UCS-2, la posición de inicio y la longitud semiden en bytes dobles.

Si la posición de inicio es mayor que 1, el campo del resultado contiene la posiciónde la serie del comparador relativa al inicio de la serie origen, no relativa a laposición de inicio.

El campo del resultado contiene el valor de la posición situada más a la izquierdade la serie de comparación en la serie base, si se encuentra. Debe ser numérico sinposiciones decimales y ha de contener un nombre de campo, un elemento dematriz, un nombre de matriz o un nombre de tabla. Si no se especifica el campo

Capítulo 25. Códigos de operación 527

Page 550: RPG Referencia

del resultado, debe especificarse un indicador de resultado en las posiciones 75 y76. El campo del resultado toma el valor 0 si no se encuentra la serie.

Si el campo del resultado contiene una matriz, cada aparición de la serie delcomparador se sitúa en la matriz con la aparición situada más a la izquierda en elelemento 1. Los elementos de la matriz que siguen al elemento que contiene laaparición situada más a la derecha, contienen ceros. La matriz del resultado debeser tan grande como la longitud del campo de la serie base especificada en elfactor 2.

Si el campo del resultado es una matriz numérica, se registran tantas aparicionescomo elementos haya en la matriz. Si no se encuentran apariciones, el campo delresultado se establece en cero

Para manejar las excepciones de SCAN (código de estado de programa 100), puedeespecificarse el ampliador de código de operación ’E’ o un indicador de error ER,pero no ambos. Se produce un error si la posición inicial es mayor que la longituddel factor 2 o si el valor del factor 1 es demasiado grande. Para obtener másinformación sobre la gestión de errores, consulte el apartado “Excepciones yerrores de programa” en la página 48.

Puede especificar un indicador en las posiciones 75-76 que se active si se encuentrala serie que se está buscando. También puede obtener esta información a partir dela función incorporada %FOUND que devuelve ’1’ si se encuentra unacoincidencia.

528 VisualAge RPG Consulta del lenguaje

Page 551: RPG Referencia

*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* La operación SCAN busca la subserie 'ABC' empezando en laC* posición 3 del factor 2; en el campo de resultado se sitúa un 3.C* El indicador 90 se activa porque se encuentra la serie. Al noC* especificarse la posición inicial, se utiliza el valor por omisión 1.C 'ABC' SCAN 'XCABCD' RESULT 90C*C* Esta operación SCAN busca en la serie del factor 2 una apariciónC* de la serie del factor 1, empezando en la posición 3.C* La 'Y' en la posición 1 de la serie base se ignora, ya que laC* operación de búsqueda se inicia en la posición 3. La operaciónC* sitúa los valores 5 y 6 en el primer y segundo elemento de laC* matriz. El indicador 90 se activa.CC MOVE 'YARRYY' FIELD1 6C MOVE 'Y' FIELD2 1C FIELD2 SCAN FIELD1:3 ARRAY 90CC* Esta operación SCAN busca en la serie del factor 2 una aparición,C* empezando en la posición 2, de la serie del factor 1C* con una longitud de 4. Al no encontrarse 'TOOL' en FIELD1, INT seC* establece en cero y el indicador 90 se desactiva.CC MOVE 'TESTING' FIELD1 7C Z-ADD 2 X 1 0C MOVEL 'TOOL' FIELD2 5C FIELD2:4 SCAN FIELD1:X INT90 20 90CC*C* Esta operación SCAN está buscando un nombre. Cuando el nombreC* se encuentra, %FOUND devuelve '1' de forma que se llama a HandleLine.C*C SrchName SCAN LineC IF %FOUNDC EXSR HandleLineC ENDIF

Figura 270. Operación SCAN

*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....DName+++++++++++ETDsFrom+++To/L+++IDc.Functions+++++++++++++++++++++++++D*D* Un ejemplo de SCAN GráficoD*D* El valor de Graffld es el gráfico 'AACCBBGG'.D* El valor de Number tras la búsqueda es 3 ya que el tercerD* carácter gráfico coincide con el valor del factor 1.DD Graffld 4G inz(G'AACCBBGG')CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq..C* La operación SCAN busca en la serie gráfica del factor 2 unaC* aparición del literal gráfico del factor 1. Al ser una operaciónC* gráfica, la operación SCAN operará con 2 bytes cada vez.CC G'BB' SCAN Graffld:2 Number 5 0 90C

Figura 271. Operación SCAN utilizando gráficos

Capítulo 25. Códigos de operación 529

Page 552: RPG Referencia

SELECT (Iniciar un grupo de selección)

Código Factor 1 Factor 2Campo deresultado Indicadores

SELECT

El grupo de selección procesa de forma condicional una entre diversas secuencias uoperaciones alternativas. Consiste en:v Una sentencia SELECTv Cero o más grupos WHENxx o WHENv Un grupo OTHER opcionalv Una sentencia ENDSL o END.

Tras la operación SELECT, el control pasa a la sentencia que sigue a la primeracondición WHENxx que se satisfaga. A continuación se ejecutan todas lassentencias hasta la siguiente operación WHENxx. El control pasa a la sentenciaENDSL (sólo se ejecuta un WHENxx). Si no se cumple ninguna condiciónWHENxx y se especifica una operación OTHER, el control pasa a la sentenciasiguiente a la operación OTHER. Si no se cumple ninguna condición WHENxx yno se ha especificado ninguna operación OTHER, el control se transfiere a lasentencia siguiente a la operación ENDSL del grupo de selección.

Los indicadores de condicionamiento pueden utilizarse en la operación SELECT. Sino se satisfacen, el control pasa de forma inmediata a la sentencia siguiente a laoperación ENDSL del grupo de selección. Los indicadores de condicionamiento nopueden utilizarse individualmente en las operaciones WHENxx, WHEN, OTHER yENDSL.

El grupo de selección puede anidarse dentro de grupos de selección IF, DO u otros.Los grupos IF y DO pueden anidarse dentro de grupos de selección.

Si se especifica una operación SELECT dentro de un grupo de selección, lasoperaciones WHENxx y OTHER se aplican al nuevo grupo de selección hasta quese especifique un grupo ENDSL.

530 VisualAge RPG Consulta del lenguaje

Page 553: RPG Referencia

SETATR (Establecer atributo)

Código Factor 1 Factor 2Campo deresultado Indicadores

SETATR (E) nombre decomponente

valor de atributo atributo _ ER _

La operación SETATR establece el atributo de un componente. El atributo de uncomponente sólo puede establecerse si se ha creado dicho componente.

Notas:

1. Las operaciones SETATR pueden utilizarse para subrutinas de acción demúltiples enlaces. Para una descripción de las subrutinas de acción demúltiples enlaces, consulte “BEGACT (Empezar subrutina de acción)” en lapágina 397. Para establecer un atributo para un componente de una ventanaque no sea la ventana padre, utilice la función incorporada %SETATR. Para unadescripción de la función incorporada %SETATR, consulte “%SETATR(Establecer atributo)” en la página 337.

*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* En el ejemplo siguiente, si X es igual a 1, se realizan lasC* operaciones en la secuencia 1 (fíjese en que no se necesita operaciónC* END antes del siguiente WHENxx); si X NO es igual a 1, y siC* Y=2 y X<10, se realizan la operaciones en la secuencia 2. Si noC* se cumple ninguna condición, se realizan las operaciones de laC* secuencia 3.C*C SELECTC WHEN X = 1C Z-ADD A BC MOVE C DC* Secuencia 1C :C WHEN ((Y = 2) AND (X < 10))C* Secuencia 2C :C OTHERC* Secuencia 3C :C ENDSLC*C* El ejemplo siguiente muestra un grupo de selección con indicadoresC* de condición. Tras la operación CHAIN, si el indicador 10 estáC* activado, el control pasa a la operación ADD. Si el indicador 10C* está desactivado, se procesa el grupo de selección.C*C KEY CHAIN FILE 10C N10 SELECTC WHEN X = 1C* Secuencia 1C :C WHEN Y = 2C* Secuencia 2C :C ENDSLC ADD 1 N

Figura 272. Operación SELECT

Capítulo 25. Códigos de operación 531

Page 554: RPG Referencia

2. La operación SETATR no soporta valores enteros con signo y sin signo de 1 y 8bytes, ni valores Unicode.

Si se especifica el factor 1, debe contener el nombre del componente o un campoque contenga el nombre de un componente cuyo atributo se esté estableciendo.

El factor 2 debe contener el nuevo valor para el atributo. Debe ser un literal, unaconstante con nombre, una constante figurativa o un campo que contenga el nuevovalor para el atributo.

El campo del resultado debe contener el nombre del atributo o un campo quecontenga el nombre del atributo.

Para manejar las excepciones de SETATR (códigos de estado de programa 1400,1402-1404), puede especificarse el ampliador de código de operación ’E’ o unindicador de error ER, pero no ambos. Para obtener más información sobre lagestión de errores, consulte el apartado “Excepciones y errores de programa” en lapágina 48.

Si está especificado un indicador resultante, éste se activará cuando la operaciónSETATR no se complete satisfactoriamente.

Nota: La función incorporada %SETATR no afecta a los campos del programacorrespondientes a los componentes. Para asegurar que el valor de atributoy el valor del campo del programa sean iguales, utilice el campo delprograma para definir el valor del atributo. Esto se aplica a los atributos quetienen campos de programa correlacionados, como los campos de entradacon el atributo TEXT.

SETGT (Establecer mayor que)

Código Factor 1 Factor 2Campo deresultado Indicadores

SETGT (E) Argumento debúsqueda

Nombre de archivo,Nombre de formatode registro

NR ER _

La operación SETGT sitúa un archivo en el siguiente registro con una clave onúmero relativo de registro mayor que el argumento de búsqueda. El archivo debeser un archivo controlado en cálculo (identificado con una F en la posición 18 delas especificaciones de descripción de archivo).

La operación SETGT sólo puede utilizarse con archivos AS/400.

*...1....+....2....+....3....+....4....+....5....+....6....+....7...CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq...C Extended-factor2++++++++++++++++++++++++++++C*C* Cambiar la etiqueta en un botón denominado BUTTON1.C*C 'BUTTON1' SETATR Cancel 'LABEL'

Figura 273. Operación SETATR

532 VisualAge RPG Consulta del lenguaje

Page 555: RPG Referencia

Si el archivo se accede por clave, el factor 1 puede ser un nombre de campo, unaconstante con nombre, una constante figurativa o un literal. Si el archivo se accedepor clave y es un archivo descrito externamente, se puede especificar un nombrede KLIST en el factor 1. Si se accede al archivo por número de registro relativo, elfactor 1 debe ser un literal entero, constante con nombre o campo. Las claves detipo gráfico y UCS-2 deben tener el mismo CCSID.

El factor 2 debe ser un nombre de archivo o un nombre de formato de registro. Unnombre de formato de registro en el factor 2 sólo se permite con un archivodescrito externamente. Si se especifica MBR(*ALL), SETGT sólo procesa el primermiembro de archivo abierto.

Puede especificar un indicador en las posiciones 71-72 que se active si no seencuentra ningún registro con una clave o número relativo de registro mayor queel argumento de búsqueda especificado en el factor 1. Esta información puedeobtenerse también a partir de la función incorporada %FOUND, que devuelve ’0’si no se encuentra ningún registro y ’1’ si se encuentra alguno.

Para manejar las excepciones de SETGT (códigos de estado de archivo mayoresque 1000), puede especificarse el ampliador de código de operación ’E’ o unindicador de error ER, pero no ambos. Para obtener más información sobre lagestión de errores, consulte el apartado “Excepciones/errores de archivo” en lapágina 37.

Si la operación SETGT no es satisfactoria (ningún registro cumple la condición), elarchivo se posiciona al final del archivo.

Cuando se lleva a cabo la operación SETGT, el archivo se sitúa en la posicióninmediatamente anterior al primer registro cuya clave o número relativo deregistro sea mayor que el argumento de búsqueda especificado en el factor 1. Esteregistro se puede recuperar leyendo el archivo. Puede utilizarse *START y *ENDpara posicionar el archivo. Si especifica *START o *END en el factor 1, observe losiguiente:v El factor 2 debe contener un nombre de archivo.v No puede utilizar *HIVAL ni *LOVAL en el factor 1.v No puede especificar el indicador NR.

Para obtener más información, consulte la sección “Posición de archivo” en lapágina 6.

Consulte la sección “Soporte de valores nulos de base de datos” en la página 128,si desea obtener información acerca de cómo leer registros con campos conposibilidad de nulos.

Capítulo 25. Códigos de operación 533

Page 556: RPG Referencia

SETLL (Establecer límite inferior)

Código Factor 1 Factor 2Campo deresultado Indicadores

SETLL (E) Argumento debúsqueda

Nombre de archivo NR ER EQ

*...1....+....2....+....3....+....4....+....5....+....6....+....7...CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C* Este ejemplo muestra cómo situar el archivo de modo que READC* lea el registro siguiente. El argumento de búsqueda, KEY, especificadoC* para la operación SETGT tiene el valor 98; por lo tanto, SETGT sitúaC* el archivo antes del primer registro de formato de archivo FILEA queC* tiene un valor de campo de clave mayor que 98. El archivo se posicionaC* antes del primer registro con un valor de clave de 100. La operaciónC* READ lee el registro que tiene un valor de 100 en su campo deC* clave.CC KEY SETGT FILEAC READ FILEA 64C*C* Este ejemplo muestra cómo leer el último registro de un grupo deC* registros con el mismo valor de clave y formato de un archivo descritoC* por programa. El argumento de búsqueda, KEY, especificado por laC* operación SETGT posiciona el archivo antes del primer registro deC* archivo FILEB que tiene un valor de campo de clave mayor que 70.C* El archivo se posiciona antes del primer registro con un valor deC* clave de 80. La operación READP lee el último registro que tiene unC* valor de 70 en su campo de clave.CC KEY SETGT FILEBC READP FILEB 64

Figura 274. Operación SETGT

Valores delcampo de claves

Valores delcampo de claves

97 50

97 70

97 60

97 70

98 80

100 80

100 80

100 90

101 90

101 91

(SETGT)

(SETGT)FILEA FILEB

(READ)

(READ)

Figura 275. Cómo situar archivos mediante la operación SETGT

534 VisualAge RPG Consulta del lenguaje

Page 557: RPG Referencia

La operación SETLL sitúa un archivo en el siguiente registro que tenga una clave oun número relativo de registro mayor o igual al argumento de búsqueda. Elarchivo debe ser un archivo controlado en cálculo (identificado con una F en laposición 18 de las especificaciones de descripción de archivo).

La operación SETLL sólo puede utilizarse con archivos AS/400. No se puedeutilizar con archivos locales.

El factor 1 es obligatorio. Si el archivo se accede por clave, el factor 1 puede ser unnombre de archivo, una constante con nombre, una constante figurativa o un literalque se utiliza como el argumento de búsqueda para el posicionamiento delarchivo. También puede especificar un nombre KLIST en el factor 1 para unarchivo descrito externamente. Si se accede al archivo a través de un número deregistro relativo, el factor 1 debe contener un literal entero, una constante connombre o un campo numérico sin posiciones decimales. Las claves de tipo gráficoy UCS-2 deben tener el mismo CCSID.

El factor 2 debe contener un nombre de archivo o un nombre de formato deregistro. Un nombre de formato de registro en el factor 2 sólo se permite con unarchivo descrito externamente. Si se especifica MBR(*ALL), SETLL sólo procesa elprimer miembro de archivo abierto.

Los indicadores resultantes reflejan el estado de la operación. Puede especificar unindicador en las posiciones 71-72 que se active cuando el argumento de búsquedasea mayor que la clave o número relativo más alto del archivo. Esta informacióntambién puede obtenerse de la función incorporada %FOUND, que devuelve ’0’ sino se ha encontrado ningún registro y ’1’ si se ha encontrado alguno.

Para manejar las excepciones de SETLL (códigos de estado de archivo mayores que1000), puede especificarse el ampliador de código de operación ’E’ o un indicadorde error ER, pero no ambos. Para obtener más información sobre la gestión deerrores, consulte el apartado “Excepciones/errores de archivo” en la página 37.

Puede especificar un indicador en las posiciones 75-76 que se active cuando seencuentre un registro cuya clave o número relativo sea igual al argumento debúsqueda. También puede obtener esta información a partir de la funciónincorporada %EQUAL que devuelve ’1’ si se encuentra una coincidencia.

Si el factor 2 contiene un nombre de archivo para el que se ha de establecer ellímite inferior, el archivo se sitúa en el primer registro con una clave o númerorelativo de registro igual o mayor que el argumento de búsqueda.

Si el factor 2 contiene un nombre de formato de registro para el que se ha deestablecer el límite inferior, el archivo se sitúa en el primer registro del tipoespecificado que tenga una clave igual o mayor que el argumento de búsqueda.

Al alcanzar el final del archivo en un archivo procesado por SETLL, puede emitirseotro SETLL para volver a situar el archivo. Después de que una operación SETLLsitúe satisfactoriamente el archivo en un registro, éste se puede recuperarleyéndolo. Puede utilizarse *START y *END para posicionar el archivo. Siespecifica *START o *END en el factor 1, observe lo siguiente:v El factor 2 debe contener un nombre de archivo.v No puede utilizar *HIVAL ni *LOVAL en el factor 1.v No puede especificar los indicadores NR y EQ.v Debe especificarse un indicador de error (posiciones 73-74) o el ampliador ’E’.

Capítulo 25. Códigos de operación 535

Page 558: RPG Referencia

Para obtener más información sobre la utilización de *START y *END, consulte“Posición de archivo” en la página 6.

Antes de que la aplicación lea este archivo, otra aplicación puede suprimirregistros del archivo. Puede que no recupere el registro que esperaba. Incluso si lafunción incorporada %EQUAL también está activada o el indicador de resultadode las posiciones 75 y 76 está activado indicando que se ha encontrado unacoincidencia de registro, es posible que no obtenga dicho registro.

SETLL no accede a registros de datos. Para verificar si existe una clave, utiliceSETLL con un indicador de igualdad (posiciones 75 y 76) o la función incorporada%EQUAL en lugar de la operación CHAIN. En los casos en que el archivo sea unarchivo lógico de formato múltiple con escasas claves, la operación CHAIN puedeser una solución más rápida que SETLL.

Consulte la sección “Soporte de valores nulos de base de datos” en la página 128,si desea obtener información acerca de cómo leer registros con campos conposibilidad de nulos.

En el ejemplo siguiente, el archivo ORDFIL contiene registros de pedidos. Elcampo de clave es el campo de número de pedido (ORDER). Existen múltiplesregistros para cada pedido. ORDFIL tiene el aspecto siguiente en lasespecificaciones de cálculo:

*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* La totalidad de los 101 registros de ORDFIL se imprimirán.C* El valor 101 ha sido previamente situado en ORDER. La operaciónC* SETLL sitúa el archivo en el primer registro con elC* valor de clave 101.C* %EQUAL devolverá '1'.CC ORDER SETLL ORDFILCC* El bucle DO siguiente procesa todos los registros que tienenC* el mismo valor de clave.C*C IF %EQUALC DOU %EOFC ORDER READE ORDFILC IF NOT %EOFC EXCEPT DETAILC ENDIFC ENDDOC ENDIFCC*C* La operación READE lee los registros 101 segundo, tercero y cuartoC* igual que se leyó el registro 101 primero. Tras haber leídoC* el registro 101 cuarto, se intenta la operación READE.C* Al no pertenecer el registro 102 al mismo grupo, %EOF devolveráC* '1', se ignora la operación EXCEPT y finaliza elC* bucle DOU.

Figura 276. Operación SETLL

536 VisualAge RPG Consulta del lenguaje

Page 559: RPG Referencia

SETOFF (Desactivar indicador)

Código Factor 1 Factor 2Campo deresultado Indicadores

SETOFF OF OF OF

La operación SETOFF desactiva todos los indicadores especificados en lasposiciones 71 a 76. Debe especificar como mínimo un indicador resultante en lasposiciones 71 a 76.

La Figura 278 en la página 538 ilustra la operación SETOFF.

SETON (Activar indicador)

Código Factor 1 Factor 2Campo deresultado Indicadores

SETON ON ON ON

La operación SETON activa todos los indicadores especificados en las posiciones 71a 76. Debe especificar como mínimo un indicador resultante en las posiciones 71 a76.

100

100

100

101

101

101

101

102

ORDEN

(SETLL)

Otros campos

ORDFIL

Registro 1 de 100

Registro 2 de 100

Registro 3 de 100

Registro 1 de 101

Registro 2 de 101

Registro 3 de 101

Registro 4 de 101

Registro 1 de 102

Figura 277. Cómo situar archivos mediante la operación SETLL

Capítulo 25. Códigos de operación 537

Page 560: RPG Referencia

SHOWWIN (Visualizar ventana)

Código Factor 1 Factor 2Campo deresultado Indicadores

SHOWWIN(E)

Nombre de ventana _ ER _

La operación SHOWWIN carga una ventana en la memoria. El atributo Visiblecontrola si se visualiza la ventana.

Nota: No pueden establecerse ni pueden hacerse referencia a los atributos parauna ventana antes de una operación SHOWWIN. Tampoco puede hacersereferencia a los componentes de una ventana antes de una operaciónSHOWWIN.

El factor 2 contiene el nombre de la ventana que se ha de visualizar.

Para manejar las excepciones de SHOWWIN (códigos de estado de programa 1400a 1420), puede especificarse el ampliador de código de operación ’E’ o unindicador de error ER, pero no ambos. Para obtener más información sobre lagestión de errores, consulte el apartado “Excepciones y errores de programa” en lapágina 48.

No utilice SHOWWIN y el atributo Abrir Inmediatamente. Si lo hace, el indicadorde resultado se activa. Esto significa que la ventana ya está cargada. Si esteindicador está activado, se puede establecer el atributo Visible para la ventana.

Utilice la operación SHOWWIN para visualizar ventanas que no se visualicen confrecuencia en lugar de establecer Abrir Inmediatamente para la ventana. Para lasventanas principales (la primera ventana que visualiza una aplicación), utilice elvalor Abrir Inmediatamente para la ventana en lugar de SHOWWIN.

*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* Las operaciones SETON y SETOFF activan y desactivan de uno a tresC* indicadores especificados en las posiciones 71 a 76.C* La operación SETON activa el indicador 17.CC SETON 17CC* La operación SETON activa los indicadores 17 y 18.CC SETON 1718CC* La operación SETOFF desactiva el indicador 21.CC SETOFF 21

Figura 278. Operaciones SETON y SETOFF

538 VisualAge RPG Consulta del lenguaje

Page 561: RPG Referencia

SORTA (Clasificar una matriz)

Código Factor 1 Factor 2Campo deresultado Indicadores

SORTA Nombre de matriz

La operación SORTA clasifica la matriz especificada en el factor 2 en ordenascendente o descendente. Esta secuencia se indica en la especificación dedefinición. Si no se especifica la secuencia, la matriz se clasifica en ordenascendente.

EL factor 2 contiene el nombre de la matriz a clasificar. No se puede especificar *INen el factor 2. Si la matriz está definida como una matriz en tiempo de compilacióno en tiempo de pre-ejecución con los datos en un formato alternativo, la matrizalternativa no se clasifica.

Si la matriz está definida con la palabra clave OVERLAY(nombre{:pos}), la matrizbase se clasificará con la secuencia que define la matriz OVERLAY.

Las matrices gráficas se clasifican por los valores hexadecimales de los elementosde matriz, en el orden especificado en la especificación de definición.

Clasificar una matriz no guarda el orden anterior. Por ejemplo, si se clasifica unamatriz dos veces, utilizando diferentes matrices de recubrimiento, la secuencia finalserá la de la última clasificación. Los elementos que son iguales en la secuencia deordenación pero que tienen distintos valores hexadecimales (por ejemplo, debido ala utilización de una matriz de recubrimiento para determinar la secuencia),pueden no estar en el mismo orden después de la clasificación, comparando con elorden en que estaban antes.

Cuando clasifique matrices de punteros de base, debe asegurarse de que todos losvalores de las matrices sean direcciones dentro del mismo espacio. De lo contrario,pueden producirse resultados incoherentes. Consulte la sección “Operaciones decomparación” en la página 375, para obtener más información.

Si se clasifica una matriz con posibilidad de nulos, la clasificación no tomará enconsideración los valores de los distintivos de nulo.

La clasificación de una matriz asignada dinámicamente sin todos los elementosdefinidos asignados puede producir errores.

*...1....+....2....+....3....+....4....+....5....+....6....+....7...CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq...C Extended-factor2++++++++++++++++++++++++++++C*C* Se muestra una ventana denominada UPDCUST.C SHOWWIN 'UPDCUST'

Figura 279. Operación SHOWWIN

Capítulo 25. Códigos de operación 539

Page 562: RPG Referencia

SQRT (Raíz cuadrada)

Código Factor 1 Factor 2Campo deresultado Indicadores

SQRT (H) Valor Raíz

La operación SQRT halla la raíz cuadrada del campo indicado en el factor 2. Laraíz cuadrada del factor 2 se sitúa en el campo de resultado.

El factor 2 debe ser numérico y puede contener una matriz, un elemento de matriz,un campo, una constante figurativa, un literal, una constante con nombre, unsubcampo o un nombre de tabla. Si el valor del campo del factor 2 es cero, el valordel campo del resultado también es cero. Si el valor del campo del factor 2 esnegativo, la rutina de manejo de excepciones/errores de VRPG Client recibe elcontrol.

El campo del resultado debe ser numérico y puede contener una matriz, unelemento de matriz, un subcampo o un elemento de tabla.

Puede utilizarse una matriz entera en la operación SQRT si el factor 2 y el campodel resultado contienen nombres de matrices. El número de posiciones decimalesdel campo del resultado puede ser menor o mayor que el número de posicionesdecimales del factor 2. Sin embargo, el campo del resultado no debe tener menosde la mitad del número de posiciones decimales del factor 2.

*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++DARRY S 1A DIM(8) ASCENDDCSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* La operación SORTA clasifica ARRY en secuencia ascendente ya queC* se especifica la palabra clave ASCEND.C* Si el contenido de ARRY sin clasificar era GT1BA2L0, elC* el contenido de ARRY clasificada sería 012ABGLT.C* Observe que se utiliza la secuencia de clasificación ASCII.CC SORTA ARRY

Figura 280. Operación SORTA

*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++D* En este ejemplo, la matriz base tiene los valores aa44 bb33 cc22 dd11D* de forma que la matriz de recubrimiento ARRO tiene los valoresD* 44 33 22 11.D DSD ARR 4 DIM(4) ASCENDD ARRO 2 OVERLAY(ARR:3)DCSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....CC* Tras la operación SORTA, la matriz base tiene los valoresC* 11dd 22cc 33bb 44aaCC SORTA ARRO

Figura 281. Operación SORTA con OVERLAY

540 VisualAge RPG Consulta del lenguaje

Page 563: RPG Referencia

En el apartado “Operaciones aritméticas” en la página 367 se describen las normasgenerales para la especificación de operaciones aritméticas.

La figura Figura 162 en la página 368 muestra ejemplos de la operación SQRT.

START (Iniciar un componente lógico o Llamar a programalocal)

Código Factor 1 Factor 2Campo deresultado Indicadores

START (E) Nombre decomponente lógico onombre de campo

Nombre dePLIST

_ ER _

La operación START puede utilizarse para iniciar un nuevo componente en laaplicación o para llamar a un programa local. Para cada operación START queinicie un nuevo componente puede haber una operación STOP.

Para manejar las excepciones de START (código de estado de programa 1410),puede especificarse el ampliador de código de operación ’E’ o un indicador deerror ER, pero no ambos. Para obtener más información sobre la gestión de errores,consulte el apartado “Excepciones y errores de programa” en la página 48.

Inicio de componentes lógicosComo START es una operación asíncrona, tanto el componente llamado (destino)como el que llama (origen), así como cualquier otro componente activo de laaplicación, pueden recibir eventos para partes habilitadas actualmente por todoslos componentes de la aplicación.

Si se especifica el factor 2, debe contener un literal de caracteres que sea el nombredel componente o de una variable que contenga el nombre del componente.

Si se especifica el campo del resultado, debe contener un nombre PLIST. Si no seespecifica el campo del resultado, la operación START puede ir seguida de unaoperación PARM. Los parámetros se pasan por dirección. Esto significa que loscomponentes de origen y de destino pueden acceder a campos de parámetros. Sepuede especificar un máximo de 20 parámetros. Si el componente iniciado estáesperando un campo de longitud variable, debe utilizarse un campo de longitudvariable como el parámetro.

START inicializa un componente, ejecuta su *INZSR y después vuelve alcomponente de origen. En el componente de origen, el factor 2 de la operaciónPARM se copia en el campo del resultado de la operación PARM. Cuando elcontrol vuelve al componente de origen, el campo del resultado se copia en elfactor 1. En el componente de destino, el campo del resultado se copia en el factor1. Cuando el control vuelve al componente de origen, el factor 2 se copia en elcampo del resultado si *INZSR se realiza satisfactoriamente.

Cuando la operación START ha terminado de inicializar el componente de destino,la subrutina de acción del componente de origen continúa la ejecución y elcomponente de destino permanece activo con sus subrutinas de acción habilitadaspara recibir eventos.

Capítulo 25. Códigos de operación 541

Page 564: RPG Referencia

Llamada a programas localesSi se utiliza START para llamar a un programa local, el programa de llamadaefectúa la llamada al programa local y después continúa. El programa llamado seejecuta independientemente del programa de llamada.

Si se especifica el factor 2, debe contener un nombre de especificación de definiciónpara una constante o una definición de campo. LINKAGE(*CLIENT) debe estar enla especificación de definición. Para obtener más información, consulte“LINKAGE(tipo_enlace)” en la página 249.

Si se especifica el campo del resultado, debe contener un nombre PLIST. Si no seespecifica el campo del resultado, la operación START puede ir seguida de unaoperación PARM. Los parámetros se pasan por referencia. Consulte “PARM(Identificar parámetros)” en la página 506 y “PLIST (Identificar una lista deparámetros)” en la página 508. para obtener más información sobre pasarparámetros.

Nota: Los punteros y los punteros de procedimiento no están permitidos comoparámetros.

STOP (Detener un componente lógico)

Código Factor 1 Factor 2Campo deresultado Indicadores

STOP (E) Nombre decomponente lógico

ER

La operación STOP detiene uno o más componentes de una aplicación. Primero setermina cualquier componente hijo que el componente que se termina hayainiciado.

Cuando un componente lógico termina:1. Los componentes que ha iniciado el componente que se termina o los

descendientes del componente se terminan por orden jerárquico inverso.2. Se llama a la subrutina *TERMSR para cada componente que se termina que

tenga *TERMSR definida.3. Los códigos *STATUS se colocan en la PSDS.

Si se especifica el factor 2, debe contener un literal de caracteres que sea el nombredel componente o una variable que contenga el nombre del componente. Si no seespecifica el factor 2 o si contiene el mismo nombre de componente que el que seestá ejecutando actualmente (el componente que contiene la operación STOP), setermina dicho componente.

Cuando se lleva a cabo una operación STOP que afecta a un componente que seestá ejecutando actualmente, no se ejecutan las operaciones que siguen a STOP. Porejemplo, COMPA inicia COMPB. Si COMPB es el componente que se está

*...1....+....2....+....3....+....4....+....5....+....6....+....7...DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++Comments++Dtest2 C 'testprog' LINKAGE (*CLIENT)CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq...C START test2

Figura 282. Operación START

542 VisualAge RPG Consulta del lenguaje

Page 565: RPG Referencia

ejecutando actualmente y si COMPB emite una operación STOP para COMPA,COMPB terminará primero y después terminará COMPA. No se realiza ningunaoperación posterior a STOP.

Para manejar las excepciones de STOP puede especificarse el ampliador de códigode operación ’E’ o un indicador de error ER, pero no ambos. Para obtener másinformación sobre la gestión de errores, consulte el apartado “Excepciones yerrores de programa” en la página 48.

SUB (Restar)

Código Factor 1 Factor 2Campo deresultado Indicadores

SUB (H) Minuendo Sustraendo Diferencia + − Z

Si se especifica el factor 1, el factor 2 se resta del factor 1 y la diferencia se sitúa enel campo del resultado. Si no se especifica el factor 1, el factor 2 se sustrae delcampo del resultado.

El factor 1 y el factor 2 deben ser numéricos y cada uno puede ser una matriz, unelemento de matriz, un campo, una constante figurativa, un literal, una constantecon nombre, un subcampo o un nombre de tabla.

El campo del resultado debe ser numérico y puede contener una matriz, unelemento de matriz, un subcampo o un nombre de tabla.

En el apartado “Operaciones aritméticas” en la página 367 se describen las normasgenerales para la especificación de operaciones aritméticas.

La Figura 162 en la página 368 muestra ejemplos de la operación SUB.

SUBDUR (Restar duración)

Código Factor 1 Factor 2Campo deresultado Indicadores

SUBDUR(E)(duración)

Fecha/Hora/Indicación de lahora

Fecha/Hora/Indicación de la hora

Duración:Código deduración

_ ER _

SUBDUR(E) (fechanueva)

Fecha/Hora/Indicación de lahora

Duración:Código deduración

Fecha/Hora/Indicaciónde la hora

_ ER _

La operación SUBDUR puede utilizarse para lo siguiente:v Restar una duración para establecer una fecha, hora o indicación de la hora

nuevasv Cálculo de una duración

*...1....+....2....+....3....+....4....+....5....+....6....+....7...CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq...C Extended-factor2++++++++++++++++++++++++++++C*C STOP 'COMPX'

Figura 283. Operación STOP

Capítulo 25. Códigos de operación 543

Page 566: RPG Referencia

La Figura 284 en la página 546 ilustra la operación SUBDUR.

Restar una duraciónPuede utilizarse la operación SUBDUR para restar de un campo o de una constanteespecificada en el factor 1, una duración especificada en el factor 2. La fecha, horao indicación de la hora resultantes se colocan en el campo especificado en elcampo del resultado.

El factor 1 es opcional y puede contener un campo de fecha, hora o indicación dela hora, una matriz o un elemento de matriz, un literal o una constante. Si el factor1 contiene un nombre de campo, una matriz o un elemento de matriz, su tipo dedatos debe ser el mismo tipo de datos del campo especificado en el campo delresultado. Si el factor 1 no está especificado, la duración se resta del campoespecificado en el campo del resultado.

El factor 2 es obligatorio y contiene dos subfactores. El primero es una duración,que debe ser un campo numérico, matriz o una constante con cero posicionesdecimales. La duración debe tener 15 dígitos o menos. Si el campo de duración esnegativo, la duración se suma al campo.

El segundo subfactor debe ser un código de duración válido que indique el tipo deduración. El código de duración debe ser coherente con el tipo de datos del campode resultado. Por ejemplo, puede restar una duración de años, meses o días de uncampo de fecha, pero no puede restarle una duración de minutos. Para obteneruna lista de los códigos de duración y sus formas abreviadas, consulte el apartado“Operaciones de fecha” en la página 377.

El campo del resultado debe ser un campo, matriz o elemento de matriz del tipode datos de fecha, hora o indicación de la hora. Si el factor 1 se deja en blanco, laduración se resta del valor del campo del resultado. Si el campo del resultado esuna matriz, el valor del factor 2 se resta de cada elemento de la matriz. Si el campodel resultado es un campo de hora, el resultado siempre será una hora válida. Porejemplo, si se resta 59 minutos de 00:58:59, se obtiene -00:00:01. Como esta hora noes válida, el compilador la ajusta a 23:59:59.

Cuando a una fecha se le resta una duración expresada en meses, la regla generales que la parte de mes disminuye en el número de meses de la duración y la partede día no se altera. La excepción a esta regla es cuando la parte de día resultantesobrepasa el número real de días del mes resultante. En este caso, la parte de díaresultante se ajusta a la fecha real del fin de mes. Los ejemplos siguientes, quepresuponen un formato *YMD, ilustran este punto.

'95/05/30' SUBDUR 1:*MONTH da como resultado '95/04/30'

La parte de mes resultante ha disminuido en 1; la parte de día no se hamodificado.

'95/05/31' SUBDUR 1:*MONTH da como resultado '95/04/30'

La parte de mes resultante ha disminuido en 1; la parte de día resultante se haajustado porque el mes de abril sólo tiene 30 días.

Se producen resultados parecidos cuando se resta la duración de un año. Porejemplo, si restamos un año de ’92/02/29’ obtenemos ’91/02/28’, ajustando elvalor porque el año resultante no es bisiesto.

544 VisualAge RPG Consulta del lenguaje

Page 567: RPG Referencia

Para manejar las excepciones con los códigos de estado de programa 103, 112 ó113, puede especificarse el ampliador de código de operación ’E’ o un indicador deerror ER, pero no ambos. Para obtener más información sobre la gestión de errores,consulte el apartado “Excepciones y errores de programa” en la página 48.

Cálculo de una duraciónLa operación SUBDUR puede utilizarse para calcular una duración entre losiguiente:v Dos fechasv Una fecha y una indicación de la horav Dos horasv Una hora y una indicación de la horav Dos indicaciones de la hora

El factor 1 debe contener un campo, subcampo, matriz, elemento de matriz,constante o literal de fecha, hora o indicación de la hora.

El factor 2 debe contener también un campo, matriz, elemento de matriz, literal oconstante de fecha, hora o indicación de la hora. El código de la duración ha de sercoherente con uno de los elementos siguientes:v Factor 1 y factor 2v *Years(*Y), *Months(*M) y *Days(*D) si el factor 1 y/o el factor 2 es una fechav Indicación de la hora, *Hours(*H), *Minutes(*MN) y *Seconds(*S) cuando el

factor 1 y/o el factor 2 sea una hora o indicación de la hora

El resultado del cálculo se expresa en unidades completas; el redondeo se realizahacia abajo. El cálculo de las duraciones incluye los microsegundos.

Por ejemplo, si la duración real es de 384 días, y se pide el resultado en años, elresultado será 1 año completo porque hay 1,05 años en 384 días. Una duración de59 minutos expresada en horas dará como resultado 0 horas.

El campo del resultado consta de dos subfactores. El primero es el nombre de uncampo numérico de cero decimales, una matriz o un elemento de matriz en el cualse coloca el resultado de la operación. El segundo subfactor contiene el código deduración que denota el tipo de duración. El código de duración debe ser coherentecon el factor 1 y el factor 2. El campo del resultado será negativo si la fecha delfactor 1 es anterior a la fecha del factor 2.

Para obtener más información acerca de cómo trabajar con campos de fecha y hora,consulte la sección “Operaciones de fecha” en la página 377.

El cálculo de una duración en microsegundos (*mseconds) puede exceder el límitedel sistema de 15 dígitos para las Duraciones. Esto produce errores o sutruncamiento. Esta situación se produce cuando hay una diferencia de más de 32años y 9 meses entre las entradas del factor 1 y del factor 2.

Para manejar las excepciones con los códigos de estado de programa 103, 112 ó113, puede especificarse el ampliador de código de operación ’E’ o un indicador deerror ER, pero no ambos. Para obtener más información sobre la gestión de errores,consulte el apartado “Excepciones y errores de programa” en la página 48.

Capítulo 25. Códigos de operación 545

Page 568: RPG Referencia

SUBST (Subserie)

Código Factor 1 Factor 2Campo deresultado Indicadores

SUBST (EP)

Longitud aextraer

Serie base:inicio Serie dedestino

_ ER _

La operación SUBST devuelve una subserie que empieza en la ubicaciónespecificada en el factor 2 con la longitud especificada en el factor 1. Esta subseriese sitúa en el campo del resultado. Si no se especifica el factor 1, se utiliza lalongitud de la serie desde su posición de inicio. En las series de tipo gráfico oUCS-2, la posición inicial se mide en bytes dobles. La serie base y la serie destinodeben ser del mismo tipo, ambas de tipo carácter, ambas de tipo gráfico o ambasde tipo UCS-2.

Si se especifica el factor 1, debe contener la longitud de la serie que se ha deextraer. Debe ser numérico sin posiciones decimales y puede contener un nombrede campo, un elemento de matriz, un nombre de tabla, un literal o una constantecon nombre. Si no se especifica la longitud, se devuelve el resto de la serie base(empezando por la ubicación de inicio).

El factor 2 debe contener la serie base o la serie base seguida de dos puntos y, acontinuación, la posición de inicio. La serie base debe contener un nombre decampo, un elemento de matriz, una constante con nombre, un nombre deestructura de datos, un nombre de tabla o un literal. La posición de inicio debe sernumérica con cero posiciones decimales y puede contener un nombre de campo,un elemento de matriz, un nombre de tabla, un literal o una constante con nombre.Si no se especifica la posición de inicio SUBST empieza en la posición 1 de la seriebase. En las series de tipo gráfico o UCS-2, la posición inicial se mide en bytesdobles.

Nota:v La posición de inicio y la longitud de la subserie a extraer deben ser

enteros positivos

CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....*

C* Determina una LOANDATE (fecha préstamo) que es xx años, yy meses, zz díasC* anterior a DUEDATE (fecha de vencimiento).*

C DUEDATE SUBDUR XX:*YEARS LOANDATEC SUBDUR YY:*MONTHS LOANDATEC SUBDUR ZZ:*DAYS LOANDATE*

C* Suma 30 días a la fecha de vencimiento de préstamoC*C SUBDUR -30:*D LOANDUE*

C* Calcula el número de días entre una LOANDATE y una DUEDATE.*

C LOANDATE SUBDUR DUEDATE NUM_DAYS:*D 5 0*

C* Determina el número de segundos entre LOANDATE y DUEDATE.*

C LOANDATE SUBDUR DUEDATE NUM_SECS:*S 5 0

Figura 284. Operaciones SUBDUR

546 VisualAge RPG Consulta del lenguaje

Page 569: RPG Referencia

v La posición de inicio no debe ser mayor que la longitudv La longitud no debe ser mayor que la longitud de la serie base de la

ubicación de inicio.

El campo del resultado debe ser de tipo carácter, gráfico o UCS-2 y puede contenerun nombre de campo, un elemento de matriz, una estructura de datos o unnombre de tabla. El resultado se ajusta por la izquierda. La longitud del campo delresultado debe ser como mínimo tan grande como la longitud especificada en elfactor 1. Si la subserie es mayor que el campo especificado en el campo delresultado, la subserie se trunca por la derecha. Si se especifica P como el ampliadorde operación, el campo del resultado se rellena por la derecha con blancos despuésde la operación.

Nota:v No puede utilizar constantes figurativas en el factor 1, en el factor 2 ni en

el campo de resultadov El solapamiento está permitido para el factor 1 y el campo del resultadov El solapamiento está permitido para el factor 2 y el campo del resultado.

Para manejar las excepciones de SUBST (código de estado de programa 100),puede especificarse el ampliador de código de operación ’E’ o un indicador deerror ER, pero no ambos. Para obtener más información sobre la gestión de errores,consulte el apartado “Excepciones y errores de programa” en la página 48.

*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* La operación SUBST extrae la subserie del factor 2 empezando en laC* posición 3 con una longitud de 2. El valor 'CD' se sitúa en elC* campo del resultado TARGET. El indicador 90 no se activa porque noC* se produce ningún error.CC Z-ADD 3 T 2 0C MOVEL 'ABCDEF' String 10C 2 SUBST String:T Target 90C*C* Enesta operación SUBST, la longitud es mayor que la longitud de laC* serie menos la posición de inicio más 1. Como resultado, se activaC* el indicador 90 y no se modifica el campo de resultado.CC MOVE 'ABCDEF' String 6C Z-ADD 4 T 1 0C 5 SUBST String:T Result 90CC* En esta operación SUBST, se da una subserie de 3 caracteres empezandoC* en la quinta posición de la serie base. Como no se especificó P,C* sólo se modifican los 3 primeros caracteres de TARGET.C* TARGET contiene '123XXXXX'.CC Z-ADD 3 Length 2 0C Z-ADD 5 T 2 0C MOVE 'TEST123' String 8C MOVE *ALL'X' TargetC Length SUBST String:T Target 8

Figura 285. Operación SUBST

Capítulo 25. Códigos de operación 547

Page 570: RPG Referencia

TAG (Etiqueta)

Código Factor 1 Factor 2Campo deresultado Indicadores

TAG Etiqueta

La operación declarativa TAG da nombre a la etiqueta que identifica el destino deuna operación GOTO o CABXX. Puede especificarse en cualquier lugar de loscálculos.

Puede emitirse GOTO dentro de una subrutina del procedimiento principal para ira una operación TAG dentro de la misma subrutina. Puede emitirse GOTO dentrode una subrutina de un subprocedimiento para ir a una operación TAG dentro dela misma subrutina o dentro del cuerpo del subprocedimiento.

El factor 1 debe contener el nombre del destino de una operación GOTO o CABxx.Este nombre debe ser un nombre simbólico exclusivo, que se especifica en el factor

C*C* Este ejemplo es igual que el anterior excepto en que se especificóC* P, y el resultado se rellena con espacios en blanco.C* TARGET es igual a '123bbbbb'.CC Z-ADD 3 Length 2 0C Z-ADD5 T 2 0C MOVE 'TEST123' String 8C MOVE *ALL'X' TargetC Length SUBST(P) String:T Target 8CCC*C* En el ejemplo siguiente, CITY contiene la serie "Toronto, Ontario".C* Se utiliza la operación SCAN para localizar el espacio en blanco deC* separación, que está en la posición 9 en esta ilustración. SUBSTC* sin el factor 1 sitúa la serie que empieza en la posiciónC* 10 hasta la longitud total de la serie en el campo TCNTRE.C* TCNTRE contiene 'Ontario'.C ' ' SCAN City CC ADD 1 CC SUBST City:C TCntreC*C* Antes de la operaciones STRING='bbbJohnbbbbbb'.C* un campo de 10 caracteres que contiene 'ABCDEFGHIJ'.C* La operación CHECK localiza el primer carácter que no es un espacio enC* blanco y activa el indicador 10, si existe dicho carácter. Si *IN10C* está activado, la operación SUBST da una subserie de STRING que empiezaC* en el primer carácter no blanco hasta el final de STRING. Se rellenaC* para asegurar que no queda nada del contenido anterior del campo delC* resultado. Si STRING contiene el valor ' HELLO ', RESULT va aC* contener el valor 'HELLO ' tras la operación SUBST(P).C* Después de las operaciones RESULT='Johnbbbbbb'.CC ' ' CHECK STRING ST 10C 10 SUBST(P) STRING:ST RESULT

Figura 286. Operación SUBST con el ampliador de operación P

548 VisualAge RPG Consulta del lenguaje

Page 571: RPG Referencia

2 de una operación GOTO o en el campo del resultado de una operación CABxx.El nombre puede utilizarse como un punto común para operaciones GOTO oCABxx múltiples.

No se permiten entradas de indicadores de condicionamiento (posiciones de 9 a11).

Si se bifurca a la operación TAG desde un componente distinto de la aplicaciónVRPG, puede producirse un bucle sin fin.

La Figura 214 en la página 457 muestra algunos ejemplos de la operación TAG.

TEST (Comprobar fecha/hora/indicación de la hora)

Código Factor 1 Factor 2 Campo deresultado

Indicadores

TEST (E) Campo deFecha/Horao Indicaciónde la hora

_ ER _

TEST (D E) Formato de fecha Campo decaracteres onumérico

_ ER _

TEST (E T) Formato de hora Campo decaracteres onumérico

_ ER _

TEST (E Z) Formato deindicación de lahora

Campo decaracteres onumérico

_ ER _

La operación TEST permite comprobar la validez de los campos Fecha, Hora oIndicación de la hora antes de utilizarlos.

El factor 1 ha de estar en blanco si el campo del resultado contiene un campo defecha, hora o indicación de la hora. Si desea obtener información acerca de losformatos que puede utilizar, consulte las secciones “Datos de fecha” en lapágina 112, “Datos de hora” en la página 126 y “Datos de indicación de la hora” enla página 128.

Si el campo del resultado contiene campos declarados como de fecha, hora oindicación de la hora, el factor 1 ha de estar en blanco y no se permiten losampliadores de código de operación ’D’, ’T’ y ’Z’.

Si el campo del resultado contiene campos declarados como de caracteres onuméricos, debe especificarse uno de los códigos de operación siguientes: ’D’, ’T’ o’Z’.

Nota: Si el campo de resultado es un campo de caracteres sin separadores, elfactor 1 debe contener el formato de fecha, hora o indicación de la horaseguido por un cero.

v Si el ampliador de código de operación incluye ’D’ (comprobar fecha):– El factor 1 es opcional y puede contener cualquiera de los formatos de fecha.

Consulte “Datos de fecha” en la página 112.

Capítulo 25. Códigos de operación 549

Page 572: RPG Referencia

– Si el factor 1 está en blanco, se presupone el formato especificado en laespecificación de control con la palabra clave DATFMT. Si esta palabra claveno está especificada, se presupone *ISO.

v Si el ampliador de código de operación incluye ’T’ (comprobar hora):– El factor 1 es opcional y puede contener cualquiera de los formatos de hora

válidos. Consulte la sección “Datos de hora” en la página 126.– Si el factor 1 está en blanco, se toma por omisión el formato especificado en la

especificación de control con la palabra clave TIMFMT. Si esta palabra claveno está especificada, se presupone *ISO.

Nota: No se permite el formato de fecha *USA con el ampliador de código deoperación (T). El formato de fecha *USA tiene una restricción AM/PMpor la que no puede convertirse a numérico cuando se utiliza uncampo de resultado numérico.

v Si el ampliador de código de operación incluye ’Z’ (comprobar indicación de lahora), el factor 1 es opcional y puede contener *ISO o *ISO0. Consulte la sección“Datos de indicación de la hora” en la página 128.

En los campos numéricos se comprueba si la parte de dígitos de un valor de Fecha,Hora o Indicación de la hora es válida. En los campos de tipo carácter secomprueba la validez de los dígitos y los separadores.

Para la operación de comprobación puede especificarse el ampliador ’E’ o unindicador de error ER, pero no ambos. Si el contenido del campo de resultado noes válido, se señala el código de estado 112. Entonces, se activa el indicador deerror o la función incorporada %ERROR devuelve ’1’ dependiendo del método demanejo de errores especificado. Para obtener más información sobre la gestión deerrores, consulte el apartado “Excepciones y errores de programa” en la página 48.

550 VisualAge RPG Consulta del lenguaje

Page 573: RPG Referencia

TESTB (Comprobar bit)

Código Factor 1 Factor 2Campo deresultado Indicadores

TESTB Números de bit Campo decaracteres

OF ON EQ

La operación TESTB compara los bits identificados en el factor 2 con los bitscorrespondientes del campo denominado como campo del resultado. El campo delresultado debe ser un campo de carácter de una posición. Los indicadores

*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++D*D Datefield S D DATFMT(*JIS)D Num_Date S 6P 0 INZ(910921)D Char_Time S 8 INZ('13:05 PM')D Char_Date S 6 INZ('041596')D Char_Tstmp S 20 INZ('19960723140856834000')D Char_Date2 S 9A INZ('402/10/66')D Char_Date3 S 8A INZ('2120/115')D*CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* El indicador 18 no se activará porque el campo de caracteres esC* un campo de indicación de la hora *ISO válido, sin separadores.C*C *ISO0 TEST (Z) Char_Tstmp 18C*C* El indicador 19 no se activará porque el campo de caracteres esC* una fecha *MDY válida, sin separadores.C*C *MDY0 TEST (D) Char_Date 19C*C* %ERROR devolverá '1', puesto que Num_Date no es *DMY.C*C *DMY TEST (DE) Num_DateC*C* No hay factor 1 ya que el resultado es un campo de tipo de datos DC* %ERROR devolverá '0', puesto que el campo contiene unaC* fecha válida.C*C TEST (E) DatefieldC*C* En la comprobación siguiente, %ERROR devolverá '1' puesto queC* Timefield no contiene una hora válida en EE.UU.C*C *USA TEST (ET) Char_TimeC*C* En la comprobación siguiente, el indicador 20 se activa puesto queC* el campo de caracteres es una fecha *CMDY válida, pero hay separadores.C*C *CMDY0 TEST (D) char_date2 20C*C* En la comprobación siguiente, %ERROR devolverá '0' puesto queC* el campo de caracteres es una fecha *LONGJUL válida.C*C *LONGJUL TEST (DE) char_date3

Figura 287. Ejemplo de la operación TEST (D/T/Z)

Capítulo 25. Códigos de operación 551

Page 574: RPG Referencia

resultantes de las posiciones 71 a 76 reflejan el estado de los bits del campo delresultado. El factor 2 siempre es una fuente de bits para el campo del resultado.

El factor 2 puede contener:v Números de bit 0 a 7: Pueden comprobarse de 1 a 8 bits por operación. Los bits

que se han de comprobar se identifican por los números 0 a 7. (0 es el bitsituado más a la izquierda). Los números de bit deben encerrarse entreapóstrofos. Por ejemplo, para comprobar los bits 0, 2 y 5, entre ‘025’ en el factor2.

v Nombre de campo: Puede especificar en el factor 2 el nombre de un campo decaracteres de una posición, un nombre de tabla o un elemento de matriz. Losbits activados en el campo, el nombre de tabla o el elemento de matriz secomparan con los bits correspondientes del campo de resultado; los bitsdesactivados no se tienen en cuenta. El campo especificado en el campo delresultado puede ser un elemento de matriz si cada elemento de la matriz es uncampo de tipo carácter de una posición.

v Literal hexadecimal o constante con nombre: Puede especificar un literalhexadecimal o una constante con nombre hexadecimal de 1 byte. Los bits delfactor 2 se comparan con los bits correspondientes del campo del resultado; losbits que están desactivados no se consideran.

La Figura 288 en la página 553 ilustra la utilización de la operación TESTB.

Los indicadores asignados en las posiciones 71 a 76 reflejan el estado de los bitsdel campo de resultado. Debe asignarse un indicador como mínimo, y puedenasignarse hasta tres para cada operación. Para las operaciones TESTB, losindicadores resultantes se activan de la forma siguiente:v Posiciones 71 y 72: Un indicador en estos campos se activa si los números de bit

especificados en el factor 2 o todos los bits que están activados en el campo delfactor 2 están desactivados en el campo del resultado. Todos los bitsespecificados están desactivados.

v Posiciones 73 y 74: Un indicador en estas posiciones se activa si los números debit especificados en el factor 2 o los bits que están activados en el campo delfactor 2 están en un estado mixto (algunos están activados y otros estándesactivados) en el campo del resultado. Como mínimo uno de los bitsespecificados está activado.

Nota: Si sólo se comprueba un bit, estas posiciones deben estar en blanco. Si seespecifica un nombre de campo en el factor 2 y éste tiene un sólo bitactivado, el indicador en las posiciones 73 y 74 no se activa.

v Posiciones 75 y 76: Un indicador en estas posiciones se activa si los números debit especificados en el factor 2 o todos los bits que están activados en el campodel factor 2 están activados en el campo del resultado. Todos los bitsespecificados están activados.

Nota: Si el campo del factor 2 no tiene bits activados, no se activan indicadores.

552 VisualAge RPG Consulta del lenguaje

Page 575: RPG Referencia

TESTN (Comprobar numérico)

Código Factor 1 Factor 2Campo deresultado Indicadores

TESTN Campo decaracteres

NU BN BL

La operación TESTN comprueba en un campo del resultado de tipo carácter lapresencia de dígitos decimales con zona y de espacios en blanco.

El campo de resultado debe ser un campo de tipo carácter. Para que se considerenumérico, cada carácter del campo, excepto el situado más a la derecha, debecontener una zona de hexadecimal 3 y un dígito (0 a 9). El carácter situado más ala derecha es numérico si contiene un hexadecimal de 0 a 9, o una zona de A a F, yun dígito (de 0 a 9). Como resultado de la comprobación los indicadoresresultantes se activan de la forma siguiente:v Posiciones 71 y 72: El campo del resultado contiene caracteres numéricos.v Posiciones 73 y 74: El campo del resultado contiene caracteres numéricos y como

mínimo, un espacio en blanco inicial. Por ejemplo, los valores b123 o bb123activan este indicador. Sin embargo, el valor b1b23 no es un campo numéricoválido debido a los blancos intercalados, por lo tanto este valor no activa elindicador.

*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* Los valores de bit del campo son FieldF = 00000001 y FieldG = 11110001.C*C* El indicador 16 se activa porque el bit 3 está desactivado (0)C* en FieldF. El indicador 17 está desactivado.C TESTB '3' FieldF 16 17C*C* El indicador 16 se activa porque tanto el bit 3 como el 6C* están desactivados (0) en FieldF. Los indicadores 17 y 18C* están desactivados.C TESTB '36' FieldF 161718C*C* El indicador 17 se activa porque el bit 3 está desactivado (0)C* y el bit 7 está activado (1) en FieldF. Los indicadores 16 y 18C* están desactivados.C TESTB '37' FieldF 161718C*C* El indicador 17 se activa porque el bit 7 está activado (1) en FieldF.C* El indicador 16 está desactivado.C TESTB '7' FieldF 16 17C*C* El indicador 17 se activa porque los bits 0,1,2 y 3 estánC* desactivados (0) y el bit 7 está activado (1).C* Los indicadores 16 y 18 están desactivados.C TESTB FieldG FieldF 161718C*C* El literal hexadecimal X'88' (10001000) se utiliza en el factor 2.C* El indicador 17 se activa porque un bit como mínimo (bit 0) estáC* activado. Los indicadores 16 y 18 están desactivados.C TESTB X'88' FieldG 161718

Figura 288. Operación TESTB

Capítulo 25. Códigos de operación 553

Page 576: RPG Referencia

Nota: No puede especificarse un indicador en las posiciones 73 y 74 alcomprobar un campo de longitud 1 porque el campo de carácter debecontener como mínimo un carácter numérico y un blanco inicial.

v Posiciones 75 y 76: El campo del resultado consta de espacios en blanco.

Puede utilizarse el mismo indicador para más de una condición. Si se da alguna delas condiciones, el indicador se activa.

La operación TESTN puede utilizarse para validar campos antes de que se utilicenen operaciones donde su uso puede producir resultados no deseados o excepciones(por ejemplo, operaciones aritméticas).

TESTZ (Comprobar zona)

Código Factor 1 Factor 2Campo deresultado Indicadores

TESTZ Campo decaracteres

+ −

La operación TESTZ comprueba la zona del carácter situado más a la izquierda enel campo de resultado. El campo de resultado debe ser un campo de tipo carácter.

Los indicadores de resultados se activan en función del resultado de lacomprobación. Debe especificar como mínimo un indicador de resultado en lasposiciones 71 a 74. Cualquier carácter con una zona positiva (0, 1, 2, 3, 8, 9, A, Bhexadecimal) activa el indicador de las posiciones 71 y 72. Cualquier carácter conuna zona negativa (4, 5, 6, 7, C, D, E, F hexadecimal) activa el indicador de lasposiciones 73 y 74.

Nota: la zona positiva/negativa depende del valor del segundo bit. Los valores 3 y7 son los valores preferidos para el signo, sin embargo, se pueden utilizarlos demás valores que se listan. .cp 25

TIME (Hora del día)

Código Factor 1 Factor 2 Campo deresultado

Indicadores

TIME Nombre alias Campo dedestino

La operación TIME accede a la hora del sistema y, si se especifica, la fecha delsistema, en cualquier momento durante el proceso del programa. La hora y lafecha del sistema se pueden recuperar de un servidor AS/400 o de la estación detrabajo. La hora del sistema se basa en un reloj de 24 horas.

Si se especifica el factor 1, éste debe contener un literal que sea el nombre alias deun servidor AS/400. Si no se especifica el factor 1, se recupera la hora de laestación de trabajo.

El campo del resultado debe especificar el nombre de un campo numérico de 6, 12ó 14 dígitos (sin posiciones decimales). La hora del día o bien ésta y la fecha delsistema, se graban en el campo del resultado

554 VisualAge RPG Consulta del lenguaje

Page 577: RPG Referencia

Campo de resultado Valor devuelto Formato

Numérico de 6 dígitos Hora hhmmss

Numérico de 12 dígitos Hora y fecha hhmmssDDDDDD

Numérico de 14 dígitos Hora y fecha hhmmssDDDDDDDD

Hora Hora Formato del resultado

Fecha Fecha Formato del resultado

Indicación de la hora Indicación de la hora *ISO

Nota: Si el campo del resultado es un campo numérico y se incluye la fecha del sistema,ésta se sitúa en las posiciones 7 a 12 del campo del resultado. El formato de fecha es*YMD.

Para acceder sólo a la hora del día, especifique el campo del resultado como uncampo numérico de 6 dígitos. Para acceder tanto a la hora del día como a la fechadel sistema, especifique el campo del resultado como un campo numérico de 12dígitos (parte de año de 2 dígitos) o de 14 dígitos (parte de año de 4 dígitos). Lahora del día siempre se sitúa en las primeras seis posiciones del campo delresultado, en el formato siguiente:

hhmmss (hh=horas, mm=minutos y ss=segundos)

El formato de fecha depende del atributo de formato de fecha del trabajo DATFMTy puede ser mmddyy, ddmmyy, yymmdd o de fecha juliana. El formato de fechajuliana para la parte de año de 2 dígitos contiene el año en las posiciones 7 y 8, eldía (del 1 al 366, ajustados por la derecha, con ceros en las posiciones de ordensuperior no utilizadas) en las posiciones de 9 a 11, y 0 en la posición 12. Para laparte de año de 4 dígitos, contiene el año en las posiciones de 7 a 10, el día (del 1al 366, ajustados por la derecha, con ceros en las posiciones de orden superior noutilizadas) en las posiciones de 11 a 13, y 0 en la posición 14.

Si el campo del resultado es un campo de indicación de la hora, los 3 últimosdígitos de la parte de microsegundos son siempre 000.

Los campos especiales UDATE y *DATE contienen la fecha del trabajo. Estosvalores no se actualizan al pasar la medianoche o cuando la fecha del trabajo semodifica durante la ejecución del programa.

Capítulo 25. Códigos de operación 555

Page 578: RPG Referencia

UNLOCK (Desbloquear un área de datos o Liberar un registro)

Código Factor 1 Factor 2Campo deresultado Indicadores

UNLOCK(E)

Área de datos onombre de archivo

_ ER _

La operación UNLOCK desbloquea áreas de datos y libera bloqueos de registros.

Para manejar las excepciones de UNLOCK (código de estado del programa401-421, 431 y 432), puede especificarse el ampliador de código de operación ’E’ oun indicador de error ER, pero no ambos. Para obtener más información sobre lagestión de errores, consulte el apartado “Excepciones y errores de programa” en lapágina 48.

Las posiciones 71, 72, 75 y 76 deben estar en blanco.

Cómo desbloquear las áreas de datosEl factor 2 debe contener el nombre del área de datos que se ha de desbloquear ola palabra reservada *DTAARA.

Cuando se especifica *DTAARA, se desbloquean todas las áreas de datos que estánbloqueadas en el programa.

El área de datos debe estar ya especificada en el campo del resultado de unasentencia *DTAARA DEFINE o con la palabra clave DTAARA en la especificaciónde definición. Si se especifica la operación UNLOCK en un área de datos yadesbloqueada, no se produce error.

*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* Cuando se procesa la operación TIME (con un campo numérico de 6C* dígitos), la hora actual (con el formato hhmmss) se coloca en elC* campo de resultado CLOCK. La operación TIME se basa en un reloj deC* 24 horas; por ejemplo, 132710. (En el sistema de 12 horas, 132710C* es 1:27:10 p.m.) puede especificarse CLOCKC* en las especificaciones de salida.C TIME Clock 6 0C* Cuando se procesa la operación TIME (con un campo numérico de 12C* dígitos), el día y la hora actual se colocan en el campo de resultadoC* TIMSTP. Los seis primeros dígitos son la hora y los seis últimos sonC* la fecha; por ejemplo, 093315121579 es 9:33:15 de laC* mañana del 15 de diciembre de 1979. Después se puede especificar TIMSTPC* en las especificaciones de salida.C TIME TimStp 12 0C MOVEL TimStp Time 6 0C MOVE TimStp SysDat 6 0C* En este caso se duplica el ejemplo anterior de 12 dígitos, pero seC* usa un campo de 14 dígitos. Los seis primeros son la hora y losC* 8 últimos son la fecha; por ejemplo, 13120001101992 indica laC* 1:12:00 de la tarde del 10 de enero de 1992.C* Después se puede especificar TIMSTP en las especificaciones deC* salida.C TIME TimStp 14 0C MOVEL TimStp Time 6 0C MOVE TimStp SysDat 8 0

Figura 289. Operación TIME

556 VisualAge RPG Consulta del lenguaje

Page 579: RPG Referencia

Cómo liberar los bloqueos de los registrosLa operación UNLOCK desbloquea el último registro bloqueado en un archivo dedisco de actualización.

El factor 2 debe contener el nombre del archivo de disco UPDATE.

UPDATE (Modificar registro existente)

Código Factor 1 Factor 2Campo deresultado Indicadores

UPDATE(E)

Nombre de archivo Estructurade datos

_ ER _

*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* TOTAMT, TOTGRS y TOTNET se definen como áreas de datos en elC* sistema. La operación IN recupera todas las áreas de datosC* definidas en el programa. El programa procesa cálculos y aC* continuación desbloquea las áreas de datos. Las áreas de datosC* pueden ser utilizadas posteriormente por otros programas.C*C *LOCK IN *DTAARAC :C :C UNLOCK *DTAARAC *DTAARA DEFINE TOTAMT 8 2C *DTAARA DEFINE TOTGRS 10 2C *DTAARA DEFINE TOTNET 10 2

Figura 290. Operación para desbloquear áreas de datos

*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....FFilename++IT.A.FRlen+......A.Device+.Keywords+++++++++++++++++++++++++++++F*FUPDATA UF E DISK REMOTEF*CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* Suponga que el archivo UPDATA contiene el formato de registroC* VENDOR. Se lee un registro de UPDATA. Debido a que el archivoC* es de actualización, el registro se bloquea. *IN50 se coloca enC* cualquier otro lugar del programa para controlar si tendrá lugarC* un UPDATE. En caso contrario se desbloquea el registro utilizandoC* la operación UNLOCK. Observe que el factor 2 de la operaciónC* UNLOCK es el nombre de archivo, UPDATA, no el formato de registro,C* VENDOR.C*C READ VENDOR 12C :C *IN50 IFEQ *ONC UPDATE VENDORC ELSEC UNLOCK UPDATA 99C ENDIF

Figura 291. Operación de desbloqueo de registros

Capítulo 25. Códigos de operación 557

Page 580: RPG Referencia

Código Factor 1 Factor 2Campo deresultado Indicadores

UPDATE(E)

Nombre de formatode registro, nombrede subarchivo

_ ER _

La operación UPDATE modifica el último registro bloqueado que se ha recuperadopara procesarse desde un archivo o subarchivo de disco de actualización. No deberealizarse ninguna otra operación en el archivo entre la operación de entrada queha recuperado y bloqueado el registro y la operación UPDATE.

Las operaciones como, por ejemplo, READ, READC, READE, READP, READPE yCHAIN recuperan y bloquean un registro. Si dichas operaciones de entrada no serealizan satisfactoriamente, no se bloquea el registro y no se puede emitirUPDATE. El registro debe volverse a leer con el valor por omisión de blanco en elampliador de operación para especificar una solicitud de bloqueo.

Después de una operación UPDATE satisfactoria, la siguiente operación de entradasecuencial recupera el registro siguiente al registro actualizado.

Las operaciones UPDATE consecutivas para el mismo archivo o registro no sonválidas. Deben emitirse intercaladamente operaciones de lectura satisfactorias paraposicionar y bloquear el registro a actualizar.

El factor 2 debe contener el nombre de un archivo, subarchivo o formato deregistro que se ha de actualizar. Si se especifica un nombre de archivo, dichoarchivo debe estar descrito por programa. Si se especifica un nombre de formatode registro, el archivo debe estar descrito externamente. El nombre de formato deregistro debe ser el nombre del último registro que se ha leído del archivo; de locontrario se produce un error.

El campo del resultado debe contener un nombre de estructura de datos si el factor2 es un nombre de archivo. El registro actualizado se graba directamente desde laestructura de datos al archivo. El campo del resultado debe estar en blanco si elfactor 2 contiene el nombre de formato de registro.

Para manejar las excepciones de UPDATE (códigos de estado de archivo mayoresque 1000), puede especificarse el ampliador de código de operación ’E’ o unindicador de error ER, pero no ambos. Para obtener más información sobre lagestión de errores, consulte el apartado “Excepciones/errores de archivo” en lapágina 37.

Nota: Si se han de actualizar sólo algunos de los campos de un registro, en vez detodos, utilice las especificaciones de salida y no la operación UPDATE.

Consulte la sección “Soporte de valores nulos de base de datos” en la página 128,si desea obtener información acerca de cómo leer registros con campos conposibilidad de nulos.

WHEN (Seleccionar cuando sea verdadero)

Código Factor 1 Factor ampliado 2

WHEN(M/R)

Expresión deindicador

558 VisualAge RPG Consulta del lenguaje

Page 581: RPG Referencia

El código de operación WHEN es similar al código de operación WHENxx en quecontrola el proceso de las líneas en una operación SELECT. Difiere en que lacondición se especifica mediante una expresión lógica en la entrada del factor 2ampliado. Las operaciones controladas por la operación WHEN se procesancuando es cierta la expresión del campo del factor 2 ampliado. Consulte elapartado “Capítulo 24. Expresiones” en la página 351 para obtener detalles acercade las expresiones. Si desea obtener información acerca de cómo utilizar losampliadores de operación M y R, consulte el apartado “Reglas de precisión paraoperaciones numéricas” en la página 358.

En el apartado “Operaciones de comparación” en la página 375 se describen lasnormas generales para la especificación de operaciones de comparación.

WHENxx (Seleccionar cuando sea verdadero)

Código Factor 1 Factor 2Campo deresultado Indicadores

WHENxx Comparando Comparando

Las operaciones WHENxx de un grupo de selección determinan a dónde pasa elcontrol después de procesar la operación SELECT.

La operación WHENxx condicional es cierta si el factor 1 y el factor 2 tienen larelación especificada por xx. Si la condición es cierta, las operaciones que siguen aWHENxx se procesan hasta la siguiente operación WHENxx, OTHER, ENDSL oEND.

Al llevar a cabo la operación WHENxx tenga en cuenta lo siguiente:v Tras procesarse el grupo de operación, el control pasa a la sentencia siguiente a

la operación ENDSL.v Pueden codificarse condiciones WHENxx complejas utilizando ANDxx y ORxx.

Los cálculos se procesan cuando se cumple la condición especificada por lasoperaciones WHENxx, ANDxx y ORxx.

v El grupo WHENxx puede estar vacío.

CSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++++..C*C SELECTC WHEN *INKAC :C :C :C WHEN NOT(*IN01) AND (DAY = 'FRIDAY')C :C :C :C WHEN %SUBST(A:(X+4):3) = 'ABC'C :C :C :C OTHERC :C :C :C ENDSL

Figura 292. Operación WHEN

Capítulo 25. Códigos de operación 559

Page 582: RPG Referencia

Consulte en “Operaciones de comparación” en la página 375 los valores de xx.

*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* El ejemplo siguiente muestra grupos SELECT anidados. El tipoC* de empleado puede ser 'C' para ocasional, 'T' para retirado,C* 'R' para normal y 'S' para estudiante. En función del tipo deC* empleado (EmpTyp), varía el número de días libres al año (Days).C*C SELECTC EmpTyp WHENEQ 'C'C EmpTyp OREQ 'T'C Z-ADD 0 DaysC EmpTyp WHENEQ 'R'C*C* Cuando el tipo de empleado es 'R', los días libres tambiénC* dependen de los años trabajados. El número de días base es 14.C* Para menos de 2 años, no se añaden días. Entre 2 y 5 añosC* se añaden 5 días. Entre 6 y 10 años se añaden 10 díasC* y para más de 10 años se añaden 20 días.C*C Z-ADD 14 DaysC*C* Grupo de selección anidado.C SELECTC Years WHENLT 2C Years WHENLE 5C ADD 5 DaysC Years WHENLE 10C ADD 10 DaysC OTHERC ADD 20 DaysC ENDSLC* Fin del grupo de selección anidado.C*C EmpTyp WHENEQ 'S'C Z-ADD 5 DaysC ENDSL

Figura 293. Operación WHENxx

560 VisualAge RPG Consulta del lenguaje

Page 583: RPG Referencia

WRITE (Crear nuevos registros)

Código Factor 1 Factor 2Campo deresultado Indicadores

WRITE (E) Nombre de archivo Estructurade datos

_ ER EOF

WRITE (E) Nombre de formatode registro,Subarchivo o Ventana

_ ER EOF

La operación WRITE graba datos en un archivo o ventana.

Cómo grabar en un archivoEl factor 2 debe contener el nombre de un archivo o de un formato de registro.Dicho archivo se identifica por una letra F en la posición 18 de las especificacionesde descripción de archivo. Debe ser un archivo controlado en cálculo.

*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C* Ejemplo de grupo SELECT con expresiones WHENxx complejas. Se suponeC* que el usuario ha entrado un registro y un código de acción.C* Seleccione una de las opciones siguientes:C* * Al pulsar F3, se ejecuta la subrutina QUIT.C* * Si se entra el código de acción (Acode) A (añadir) y elC* registro no existe (*IN50=1), graba el registro.C* * Si se entra el código de acción A, el registro existeC* y su código de registro activo es D (suprimido); seC* actualiza el registro con código de registro activo = A.C* Si se entra el código de acción D, el registro existe y elC* código de acción en el código de registro (AcRec) es A,C* se marca el registro como suprimido.C* * Cuando el código de acción es C (modificación), el registroC* existe y el código de acción en el código de registroC* (AcRec) es A, se actualiza el registro.C* * En cualquier otro caso, se ejecuta un proceso de error.C*C RSCDE CHAIN FILE 50C SELECTC *INKC WHENEQ *ONC EXSR QUITC Acode WHENEQ 'A'C *IN50 ANDEQ *ONC WRITE RECC Acode WHENEQ 'A'C *IN50 ANDEQ *OFFC AcRec ANDEQ 'D'C Acode OREQ 'D'C *IN50 ANDEQ *OFFC AcRec ANDEQ 'A'C MOVE Acode AcRecC UPDATE RECC Acode WHENEQ 'C'C *IN50 ANDEQ *OFFC AcRec ANDEQ 'A'C UPDATE RECC OTHERC EXSR ERRORC ENDSL

Figura 294. Operación WHENxx

Capítulo 25. Códigos de operación 561

Page 584: RPG Referencia

Si el archivo especificado en el factor 2 está descrito por programa, el campo delresultado debe contener el nombre de una estructura de datos. El registro se grabaen el archivo desde la estructura de datos Un archivo descrito externamente seidentifica mediante una E en la posición 22 de las especificaciones de descripciónde archivo.

Si el factor 2 contiene un nombre de formato de registro, se utilizan los valoresactuales del programa para todos los campos de la definición de registro seutilizan para construir el registro.

Cuando se graban en un archivo registros que utilizan números de registrorelativo, el nombre de campo especificado en la palabra clave de especificación deArchivo RECNO (número relativo de registro) debe actualizarse para que contengael número relativo de registro del registro que se ha de grabar.

En los archivos locales, los registros se graban al final de archivo. Se ignora lapalabra clave RECNO.

Para añadir registros a un archivo DISK remoto utilizando la operación WRITE,debe especificarse una A en la posición 20 de las especificaciones de descripción dearchivo. En los archivos locales, los registros se añaden al final de archivo.Consulte “Posición 20 (Adición de archivo)” en la página 216para obtener másinformación.

Para manejar las excepciones de WRITE (códigos de estado de archivo mayoresque 1000), puede especificarse el ampliador de código de operación ’E’ o unindicador de error ER, pero no ambos. Se produce un error si se alcanza eldesbordamiento para un archivo de impresión descrito externamente y no se haespecificado un indicador de desbordamiento en la especificación de descripciónde archivo. Para obtener más información sobre la gestión de errores, consulte elapartado “Excepciones/errores de archivo” en la página 37.

Puede especificar un indicador en las posiciones 75-76 para señalar si se haproducido un fin de archivo (el subarchivo está lleno) en la operación WRITE. Elindicador se activa (condición EOF) o desactiva cada vez que se lleva a cabo laoperación WRITE. Esta información puede obtenerse también a partir de la funciónincorporada %EOF, que devuelve ’1’ si se produce una condición EOF y ’0’ en casocontrario.

Cómo grabar en una ventanaSi se especifica el nombre de una ventana en el factor 2, la operación WRITEestablece los atributos del texto estático y de los componentes de campo de laventana. El atributo para los componentes de entrada es TEXT. El atributo para loscomponentes de texto estático es LABEL.

Tanto el campo del resultado como el ampliador de operación deben estar enblanco.

*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* La operación WRITE graba los campos de la estructura de datosC* DS1 en el archivo FILE1.C*C WRITE FILE1 DS1

Figura 295. Operación WRITE para archivos

562 VisualAge RPG Consulta del lenguaje

Page 585: RPG Referencia

Cuando se graba en una ventana, los valores almacenados en los camposcorrespondientes se utilizan para establecer los atributos de los componentes decampos de entrada y de los componentes de texto estático. Después de laoperación WRITE, los valores almacenados en los campos coinciden con los valoresde la pantalla. Si hay muchos campos de texto estático y de entrada, utilice laoperación WRITE en lugar de múltiples operaciones SETATR. Por ejemplo, si laventana INVENTORY contiene los componentes de campo de entrada ENT0000B yENT0000C, una operación WRITE de la ventana realiza lo equivalente a losiguiente:

Cómo grabar en un subarchivoSi se especifica un subarchivo en el factor 2, la operación WRITE añade un nuevoregistro al subarchivo. Los registros que se graban en un componente desubarchivo se añaden al final del subarchivo.

Consulte la sección “Soporte de valores nulos de base de datos” en la página 128,si desea obtener información acerca de cómo leer registros con campos conposibilidad de nulos.

XFOOT (Sumar los elementos de una matriz)

Código Factor 1 Factor 2Campo deresultado Indicadores

XFOOT (H) Nombre de matriz Suma + − Z

XFOOT suma los elementos de una matriz y sitúa el resultado de la suma en elcampo especificado como campo de resultado. El factor 2 contiene el nombre de lamatriz.

Si se especifica redondeo, éste se produce después de que todos los elementos sehayan sumado y antes de que el resultado se haya transferido al campo deresultado. Si el campo del resultado es un elemento de la matriz especificada en elfactor 2, se utiliza el valor del elemento antes de efectuarse la operación XFOOTpara calcular el valor total de la matriz.

Si la matriz es de coma flotante, la operación XFOOT se efectuará del modosiguiente: cuando la matriz está en orden descendente, los elementos se iránsumando en el orden inverso. De lo contrario, los elementos se irán sumando apartir de los primeros elementos de la matriz.

En el apartado “Operaciones aritméticas” en la página 367 se describen las normasgenerales para la especificación de operaciones aritméticas.

La Figura 162 en la página 368 contiene un ejemplo de la operación XFOOT.

CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....CSRN01Factor1+++++++Opcode(E)+Extended-factor2+++++++++++++++++++++++++++++C EVAL %setatr('inventory':'ent0000B':'text') = ENT0000BC EVAL %setatr('inventory':'ent0000C':'text') = ENTd000C

Figura 296. Operación WRITE para Windows

Capítulo 25. Códigos de operación 563

Page 586: RPG Referencia

XLATE (Convertir)

Código Factor 1 Factor 2Campo deresultado Indicadores

XLATE (EP)

De:A Serie origen:inicio Serie dedestino

_ ER _

La operación XLATE convierte los caracteres de la serie de origen (factor 2) quecoinciden con la serie De en los caracteres correspondientes de la serie A. XLATEempieza convirtiendo la serie origen en la posición especificada en el factor 2 ycontinúa, carácter a carácter, de izquierda a derecha. Si un carácter en la serie deorigen existe en la serie De, el carácter correspondiente de la serie A se coloca en elcampo del resultado. Todos los caracteres del campo origen anteriores a la posiciónde inicio se sitúan, sin modificar, en el campo del resultado.

Nota:v Las series Desde, A, Origen y Destino deben ser del mismo tipo, todas

ellas de tipo carácter, gráfico o UCS-2. Además, sus CCSID deben seriguales, a no ser que, en el caso de los campos de tipo gráfico, se hayaespecificado CCSID(*GRAPH: *IGNORE) en la especificación de control.

v No pueden utilizarse constantes figurativas en los campos del factor 1,factor 2 ó resultado. No se permite solapado en una estructura de datospara el factor 1 y el campo del resultado o para el factor 2 y el campo delresultado.

El factor 1 debe contener la serie De, seguida de dos puntos, seguidos, a su vez,por la serie A. Las series De y A pueden contener un nombre de campo, unelemento de matriz, un nombre de estructura de datos, un literal o un nombre detabla. Si un carácter de la serie De está duplicado, se utiliza la primera aparición(situada más a la izquierda).

El factor 2 debe contener la serie de origen o la serie de origen seguida de dospuntos y la posición de inicio. La porción del factor 2 de la serie origen puedecontener un nombre de campo, un elemento de matriz, una constante con nombre,un nombre de estructura de datos, un literal o un nombre de tabla. Si la operaciónutiliza datos de tipo gráfico o UCS-2, la posición de inicio hace referencia acaracteres de doble byte. La posición de inicio del factor 2 debe se numérica sinposiciones decimales y puede ser una constante con nombre, un elemento dematriz, un nombre de campo, un literal o un nombre de tabla. Si no se especificaninguna posición de inicio, el valor por omisión es 1.

El campo del resultado puede ser un campo, un elemento de matriz, unaestructura de datos o una tabla. La longitud del campo del resultado debe ser tangrande como la serie de origen especificada en el factor 2. Si el campo delresultado es mayor que la serie de origen, el resultado se ajusta por la izquierda. Siel campo del resultado es mayor que la serie de origen y se especifica el ampliadorde operación P, el resultado se rellena por la derecha con blancos después de laconversión. Si el campo del resultado es menor que la serie de origen, el campo delresultado contiene la parte situada más a la izquierda del origen convertido.

Nota: Si el campo del resultado es gráfico y se especifica el ampliador deoperación P, se utilizan espacios en blanco gráficos. Si el campo delresultado es de tipo UCS-2 y se especifica P, se utilizarán los blancos deUCS-2.

564 VisualAge RPG Consulta del lenguaje

Page 587: RPG Referencia

Para manejar las excepciones de XLATE (código de estado de programa 100),puede especificarse el ampliador de código de operación ’E’ o un indicador deerror ER, pero no ambos. Para obtener más información sobre la gestión de errores,consulte el apartado “Excepciones y errores de programa” en la página 48.

Z-ADD (Poner a cero y sumar)

Código Factor 1 Factor 2Campo deresultado Indicadores

Z-ADD (H) Sumando Suma + − Z

El factor 2 se añade a un campo de ceros. La suma se sitúa en el campo deresultado. El factor 2 debe ser numérico y puede contener una matriz, un elementode matriz, un campo, una constante figurativa, un literal, una constante connombre, un subcampo o un nombre de tabla.

El campo del resultado debe ser numérico y puede contener una matriz, unelemento de matriz, un subcampo o un nombre de tabla.

Puede especificarse redondeo.

En el apartado “Operaciones aritméticas” en la página 367 se describen las normasgenerales para la especificación de operaciones aritméticas.

La Figura 162 en la página 368 muestra ejemplos de la operación Z-ADD.

*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....C*C* El ejemplo siguiente convierte el blanco de NUMBER a '-'. ElC* resultado en RESULT será '999-9999'.C*C MOVE '999 9999' Number 8C ' ':'-' XLATE Number Result 8

Figura 297. Operación XLATE

*...1....+....2....+....3....+....4....+....5....+....6....+....7...+....DName+++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++++++D*D* En el ejemplo siguiente, todos los valores de STRING se conviertenD* a mayúsculas. Como resultado, RESULT='RPG DEP'.D*D Up C 'ABCDEFGHIJKLMNOPQRS-D 'TUVWXYZ'D Lo C 'abcdefghijklmnopqrs-D 'tuvwxyz'C*CSRN01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq..CC MOVE 'rpg dep' String 7C Lo:Up XLATE String Result 90C*C* En el ejemplo siguiente, todos los valores de la serie se conviertenC* a minúsculas. Como resultado, RESULT='rpg dep'.C*C MOVE 'RPG DEP' String 7C Up:Lo XLATE String Result 90

Figura 298. Operación XLATE con constantes con nombre

Capítulo 25. Códigos de operación 565

Page 588: RPG Referencia

Z-SUB (Poner a cero y restar)

Código Factor 1 Factor 2Campo deresultado Indicadores

Z-SUB (H) Sustraendo Diferencia + − Z

El factor 2 se resta de un campo de ceros. La diferencia, que es el negativo delfactor 2, se sitúa en el campo del resultado.

El factor 2 debe ser numérico y puede contener una matriz, un elemento de matriz,un campo, una constante figurativa, un literal, una constante con nombre, unsubcampo o un nombre de tabla.

El campo del resultado debe ser numérico y puede contener una matriz, unelemento de matriz, un subcampo o un nombre de tabla.

Puede especificarse redondeo.

En el apartado “Operaciones aritméticas” en la página 367 se describen las normasgenerales para la especificación de operaciones aritméticas.

La Figura 162 en la página 368 muestra ejemplos de la operación Z-SUB.

566 VisualAge RPG Consulta del lenguaje

Page 589: RPG Referencia

Parte 5. Apéndices

© Copyright IBM Corp. 1994, 2000 567

Page 590: RPG Referencia

568 VisualAge RPG Consulta del lenguaje

Page 591: RPG Referencia

Apéndice A. RestriccionesFunción Restricción

Longitud de registro de entrada dematriz/tabla para compilación

La longitud máxima es 100

Longitud de campo de tipo carácter La longitud máxima es de 65535 bytes

Longitud de campo gráfico o UCS-2 La longitud máxima es de 32766

Longitud de la estructura de datos(nombrada)

Máximo de 65535

Longitud de la estructura de datos (nonombrada)

Máximo de 9999999

Apariciones (número de) estructura de datos Máximo de 32767 por estructura de datos

Palabra de edición Longitud máxima de 24 para los literales o115 para las constantes con nombre

Elementos de una matriz/tabla (palabraclave DIM en las especificaciones dedefinición)

Máximo de 32767 por matriz/tabla

Niveles de anidamiento en gruposestructurados

Máximo de 100

Literal o constante con nombre Longitud máxima de 1024 bytes para unliteral UCS-2, gráfico, hexadecimal o decaracteres, y de 30 dígitos con 30 posicionesdecimales para un literal numérico

Parámetros pasados a los programasremotos de AS/400 (CALL)

Máximo de 25

Tamaño total de todos los parámetrospasados a los programas remotos de AS/400(CALL)

Máximo de 32767 bytes

Parámetros pasados a las funciones llamadas(CALLB)

Máximo de 399

Parámetros pasados a los EXE, CMD, COMy BAT locales (CALLP)

Máximo de 20 o un total de 1024 bytes.

Archivos de impresora Máximo de 8 por programa

Líneas de impresión por página Mínimo de 2; máximo de 255

Estructura de datos del estado de programa Sólo 1 permitido por programa

Longitud de registro La longitud máxima es 99999.1

Nota: 1Toda restricción del tamaño de registro de dispositivo prevalece sobre este valor.

© Copyright IBM Corp. 1994, 2000 569

Page 592: RPG Referencia

570 VisualAge RPG Consulta del lenguaje

Page 593: RPG Referencia

Apéndice B. Resumen de códigos de operación

En la siguiente tabla se muestra un resumen de los códigos de operación.v Una columna vacía indica que el campo debe estar en blancov Todos los campos subrayados son obligatoriosv Un espacio subrayado indica que no hay ningún indicador resultante en dicha

posiciónv Símbolos:

+ Más

− Menosv Ampliadores:

(D) Campo de fecha

(E) Manejo de errores

(H) Redondeo (redondear el resultado numérico)

(M) Reglas de precisión por omisión

(N) No bloquear registro

(P) Rellenar el resultado con espacios en blanco o ceros

(R) Reglas de precisión de ″Posición decimal de resultado″

(T) Campo de hora

(Z) Campo de indicación de la horav Símbolos de indicadores resultantes:

BL Blanco(s)

BN Blanco(s) que se transforma(n) en números

BOF Principio del archivo

EOF Fin del archivo

EQ Igual

ER Error

FD Encontrado

HI Mayor que

IN Indicador

LO Menos que

LR Último registro

NR No se ha encontrado ningún registro

NU Numérico

OF Desactivado

ON Activado

Z Cero

ZB Cero o espacio en blanco

© Copyright IBM Corp. 1994, 2000 571

Page 594: RPG Referencia

Tabla 49. Resumen de especificaciones de código de operación

Códigos Factor 1 Factor 2Campo deresultado

Indicadoresresultantes

71-72 73-74 75-76

ADD (H) Sumando Sumando Suma + − Z

ADDDUR (E) Fecha/Hora Duración:Código deduración

Fecha/Hora ER

ALLOC (E) Longitud Puntero ER

ANDxx Comparando Comparando

BEGACT Nombre decomponente

Nombre de evento Nombre deventana

BEGSR Nombre desubrutina

BITOFF Números de bit Campo decaracteres

BITON Números de bit Campo decaracteres

CABxx Comparando Comparando Etiqueta HI LO EQ

CALL (E) Nombre delprograma

NombrePlist

ER

CALLB (E) Nombre deprocedimiento oPuntero deprocedimiento

NombrePlist

ER

CALLP (M/R) NAME{ (Parm1 {:Parm2...}) }

CASxx Comparando Comparando Nombre desubrutina

HI LO EQ

CAT (P) Serie de origen 1 Serie de origen 2:número de blancos

Serie dedestino

CHAIN (E N) Argumento debúsqueda

Nombre de archivo Estructurade datos

NR2 ER

CHECK (E) Serie delcomparador

Serie base:inicio Posicionesmás a laizquierda

ER FD2

CHECKR (E) Serie delcomparador

Serie base:inicio Posicionesmás a laderecha

ER FD2

CLEAR *NOKEY *ALL Nombrede:estructura,variable oventana

CLOSE (E) Nombre de archivoo bien *ALL

ER

CLSWIN (E) Nombre de ventana ER

COMMIT (E) ER

COMP1 Comparando Comparando HI LO EQ

DEALLOC(E/N)

Puntero ER

572 VisualAge RPG Consulta del lenguaje

Page 595: RPG Referencia

Tabla 49. Resumen de especificaciones de código de operación (continuación)

Códigos Factor 1 Factor 2Campo deresultado

Indicadoresresultantes

71-72 73-74 75-76

DEFINE *LIKE Campo al que sehace referencia

Campodefinido

DEFINE *DTAARA Área de datosexternos

Campointerno

DELETE (E) Argumento debúsqueda, índicede subarchivo

Nombre de formatode registro, nombrede subarchivo onombre de archivo

NR2 ER

DIV (H) Dividendo Divisor Cociente + − Z

DO Valor inicial Valor límite Valor deíndice

DOU (M/R) Expresión de indicador

DOUxx Comparando Comparando

DOW (M/R) Expresión de indicador

DOWxx Comparando Comparando

DSPLY (E) Identificador demensaje

Nombreespecificación dedefinición

Camponumérico

ER

ELSE

END Valor de incremento

ENDACT Punto de retorno

ENDCS

ENDDO Valor de incremento

ENDOR

ENDIF

ENDSL

ENDSR Etiqueta Punto de retorno

EVAL (HM/R)

Resultado = Expresión

EVALR (M/R) Resultado = Expresión

EXCEPT Nombre EXCEPT

EXSR Nombre desubrutina de usuario

EXTRCT (E) Fecha/Hora:Códigode duración

Campo dedestino

ER

FEOD (E) Nombre de archivo ER

FOR nombre-índice = valor-inicial BY incremento TO |DOWNTO límite

GETATR (E) Nombre decomponente

Nombre de atributo Nombre decampo

ER

GOTO Etiqueta

IF (M/R) Expresión de indicador

Apéndice B. Resumen de códigos de operación 573

Page 596: RPG Referencia

Tabla 49. Resumen de especificaciones de código de operación (continuación)

Códigos Factor 1 Factor 2Campo deresultado

Indicadoresresultantes

71-72 73-74 75-76

IFxx Comparando Comparando

IN (E) *LOCK Nombre de área dedatos

ER

ITER

KFLD Campo declave

KLIST Nombre KLIST

LEAVE

LEAVESR

LOOKUP1

(matriz)Argumento debúsqueda

Nombre de matriz HI LO EQ6

LOOKUP1

(tabla)Argumento debúsqueda

Nombre de tabla Nombre detabla

HI LO EQ6

MOVE (P) Atributos dedatos

Campo de origen Campo dedestino

+ − ZB

MOVEA (P) Origen Destino + − ZB

MOVEL (P) Atributos dedatos

Campo de origen Campo dedestino

+ − ZB

MULT (H) Multiplicando Multiplicador Producto + − Z

MVR Resto + − Z

OCCUR (E) Valor deaparición

Estructura de datos Valor deaparición

ER

OPEN (E) Nombre de archivo ER

ORxx Comparando Comparando

OTHER

OUT (E) *LOCK Nombre de área dedatos

ER

PARM Campo dedestino

Campo de origen Parámetro

PLIST Nombre dePLIST

POST (E)3 Dispositivo deprograma

Nombre de archivo NombreINFDS

ER

READ (E N) Nombre archivo,nombre registro,nombre ventana

Estructurade datos4

ER EOF5

READC (E) Nombre de registro ER EOF5

READE (E N) Argumento debúsqueda

Nombre archivo,nombre registro

Estructurade datos4

ER EOF5

READP (E N) Nombre archivo,nombre registro

Estructurade datos4

ER BOF5

READPE (EN)

Argumento debúsqueda

Nombre archivo,nombre registro

Estructurade datos4

ER BOF5

574 VisualAge RPG Consulta del lenguaje

Page 597: RPG Referencia

Tabla 49. Resumen de especificaciones de código de operación (continuación)

Códigos Factor 1 Factor 2Campo deresultado

Indicadoresresultantes

71-72 73-74 75-76

READS (E) Nombre desubarchivo

ER EOF5

REALLOC (E) Longitud Puntero ER

RESET (E) *NOKEY *ALL Nombre deestructura,variable,formatoregistro oventana

ER

RETURN (HM/R)

Expresión

ROLBK (E) ER

SCAN (E) Serie delcomparador:longitud

Serie base:inicio Posicionesmás a laizquierda

ER FD2

SELECT

SETATR (E) Nombre decomponente

Valor de atributo atributo ER

SETGT (E) Argumento debúsqueda

Nombre de archivo NR2 ER

SETLL (E)6 Argumento debúsqueda

Nombre de archivo NR2 ER EQ

SETOFF1 OF OF OF

SETON1 ON ON ON

SHOWWIN(E)

Nombre de ventana ER

SORTA Nombre de matriz

SQRT (H) Valor Raíz

START (E) Nombrecomponente onombre archivo

Nombre dePLIST

ER

STOP (E) Nombre decomponente lógico

ER

SUB (H) Minuendo Sustraendo Diferencia + − Z

SUBDUR (E)(duración)

Fecha/Hora/Indicación de lahora

Fecha/Hora/Indicación de lahora

Duración:Código deduración

ER

SUBDUR (E)(fecha nueva)

Fecha/Hora/Indicación de lahora

Duración:Código deduración

Fecha/Hora/Indicaciónde la hora

ER

SUBST (E P) Longitud aextraer

Serie base:inicio Serie dedestino

ER

TAG Etiqueta

Apéndice B. Resumen de códigos de operación 575

Page 598: RPG Referencia

Tabla 49. Resumen de especificaciones de código de operación (continuación)

Códigos Factor 1 Factor 2Campo deresultado

Indicadoresresultantes

71-72 73-74 75-76

TEST (E)8 Campo deFecha/HoraoIndicaciónde la hora

ER

TEST (D E)8 Formato de fecha Campo decaracteres onumérico

ER

TEST (E T)8 Formato de hora Campo decaracteres onumérico

ER

TEST (E Z)8 Formato deindicación de lahora

Campo decaracteres onumérico

ER

TESTB1 Números de bit Campo decaracteres

OF ON EQ

TESTN1 Campo decaracteres

NU BN BL

TESTZ1 Campo decaracteres

+ −

TIME Nombre alias Campo dedestino

UNLOCK (E) Área de datos,registro o nombre dearchivo

ER

UPDATE (E) Nombre de archivo,de formato deregistro o deventana

Estructurade datos4

ER

WHEN (M/R) Expresión de indicador

WHENxx Comparando Comparando

WRITE (E) Nombre de: archivo,formato de registro,subarchivo oventana

Estructurade datos4

ER EOF5

XFOOT (H) Nombre de matriz Suma + − Z

XLATE (E P) De:A Serie:inicio Serie dedestino

ER

Z-ADD (H) Sumando Suma + − Z

Z-SUB (H) Sustraendo Diferencia + − Z

576 VisualAge RPG Consulta del lenguaje

Page 599: RPG Referencia

Tabla 49. Resumen de especificaciones de código de operación (continuación)

Códigos Factor 1 Factor 2Campo deresultado

Indicadoresresultantes

71-72 73-74 75-76

Notas:

1. Como mínimo es necesario un indicador resultante.

2. La función %FOUND puede utilizarse como una alternativa a especificar un indicadorresultante NR o FD.

3. Deberá especificar el factor 2 o el campo del resultado. Pueden especificarse los dos.

4. Sólo se permite una estructura de datos en el campo del resultante cuando el factor 2contiene un nombre de archivo descrito por el programa.

5. La función %EOF puede utilizarse como una alternativa a especificar un indicadorresultante EOF o BOF.

6. La función incorporada %EQUAL puede utilizarse para comprobar las operacionesSETLL y LOOKUP.

7. En todos los códigos de operación con el ampliador ’E’, podrá especificar el ampliador’E’ o un indicador de errores ER, pero no podrá especificar los dos.

8. Deberá especificar el ampliador ’E’ o un indicador de errores para la operación TEST.

Apéndice B. Resumen de códigos de operación 577

Page 600: RPG Referencia

578 VisualAge RPG Consulta del lenguaje

Page 601: RPG Referencia

Apéndice C. Órdenes de clasificación

En las siguientes tablas figuran los órdenes de clasificación EBCDIC y ASCII.

Orden de clasificación EBCDICTabla 50. Orden de clasificación EBCDIC

Númeroordinal

Símbolo Significado Represen-tacióndecimal

Represen-tación Hex

65 � Espacio 64 40

. . .

75 ¢ Signo de centavos 74 4A

76 . Coma, coma decimal 75 4B

77 < Signo menos que 76 4C

78 ( Paréntesis de apertura 77 4D

79 + Signo más 78 4E

80 ∨ Barra vertical, OR lógica 79 4F

81 & Símbolo & 80 50

. . .

91 ! Signo de exclamación 90 5A

92 $ Signo del dólar 91 5B

93 * Asterisco 92 5C

94 ) Paréntesis de cierre 93 5D

95 ; Punto y coma 94 5E

96 ¬ NO lógico 95 5F

97 − Menos, guión 96 60

98 / Barra inclinada 97 61

. . .

107 ¦ Barra vertical partida 106 6A

108 , Coma 107 6B

109 % Signo de porcentaje 108 6C

110 _ Signo de subrayado 109 6D

111 > Signo mayor que 110 6E

112 ? Signo de interrogacióninicial

111 6F

. . .

122 v Acento grave 121 79

123 : Dos puntos 122 7A

124 # Símbolo numérico 123 7B

125 @ Arroba 124 7C

© Copyright IBM Corp. 1994, 2000 579

Page 602: RPG Referencia

Tabla 50. Orden de clasificación EBCDIC (continuación)

Númeroordinal

Símbolo Significado Represen-tacióndecimal

Represen-tación Hex

126 ’ Apóstrofo, signo númeroprimo

125 7D

127 = Signo igual 126 7E

128 " Comillas 127 7F

. . .

130 a 129 81

131 b 130 82

132 c 131 83

133 d 132 84

134 e 133 85

135 f 134 86

136 g 135 87

137 h 136 88

138 i 137 89

. . .

146 j 145 91

147 k 146 92

148 l 147 93

149 m 148 94

150 n 149 95

151 o 150 96

152 p 151 97

153 q 152 98

154 r 153 99

. . .

162 ˜ Vírgula 161 A1

163 s 162 A2

164 t 163 A3

165 u 164 A4

166 v 165 A5

167 w 166 A6

168 x 167 A7

169 y 168 A8

170 z 169 A9

. . .

193 { Llave de apertura 192 C0

194 A 193 C1

195 B 194 C2

196 C 195 C3

580 VisualAge RPG Consulta del lenguaje

Page 603: RPG Referencia

Tabla 50. Orden de clasificación EBCDIC (continuación)

Númeroordinal

Símbolo Significado Represen-tacióndecimal

Represen-tación Hex

197 D 196 C4

198 E 197 C5

199 F 198 C6

200 G 199 C7

201 H 200 C8

202 I 201 C9

. . .

209 } Llave de cierre 208 D0

210 J 209 D1

211 K 210 D2

212 L 211 D3

213 M 212 D4

214 N 213 D5

215 O 214 D6

216 P 215 D7

217 Q 216 D8

218 R 217 D9

. . .

225 \ Barra inclinada invertida 224 E0

. . .

227 S 226 E2

228 T 227 E3

229 U 228 E4

230 V 229 E5

231 W 230 E6

232 X 231 E7

233 Y 232 E8

234 Z 233 E9

. . .

241 0 240 F0

242 1 241 F1

243 2 242 F2

244 3 243 F3

245 4 244 F4

246 5 245 F5

247 6 246 F6

248 7 247 F7

249 8 248 F8

Apéndice C. Órdenes de clasificación 581

Page 604: RPG Referencia

Tabla 50. Orden de clasificación EBCDIC (continuación)

Númeroordinal

Símbolo Significado Represen-tacióndecimal

Represen-tación Hex

250 9 249 F9

Orden de clasificación ASCIITabla 51. Orden de clasificación ASCII

Númeroordinal

Símbolo Significado Representacióndecimal

RepresentaciónHex

1 Nulo 0 0

. . .

33 � Espacio 32 20

34 ! Signo deexclamación

33 21

35 " Comillas 34 22

36 # Signo numérico 35 23

37 $ Signo del dólar 36 24

38 % Signo deporcentaje

37 25

39 & Símbolo & 38 26

40 ’ Apóstrofo, signonúmero primo

39 27

41 ( Paréntesis deapertura

40 28

42 ) Paréntesis decierre

41 29

43 * Asterisco 42 2A

44 + Signo más 43 2B

45 , Coma 44 2C

46 − Guión, menos 45 2D

47 . Coma, comadecimal

46 2E

48 / Sesgo 47 2F

49 0 48 30

50 1 49 31

51 2 50 32

52 3 51 33

53 4 52 34

54 5 53 35

55 6 54 36

56 7 55 37

57 8 56 38

58 9 57 39

582 VisualAge RPG Consulta del lenguaje

Page 605: RPG Referencia

Tabla 51. Orden de clasificación ASCII (continuación)

Númeroordinal

Símbolo Significado Representacióndecimal

RepresentaciónHex

59 : Dos puntos 58 3A

60 ; Punto y coma 59 3B

61 < Signo menos que 60 3C

62 = Signo igual 61 3D

63 > Signo mayor que 62 3E

64 ? Signo deinterrogacióninicial

63 3F

65 @ Signo arrobacomercial

64 40

66 A 65 41

67 B 66 42

68 C 67 43

69 D 68 44

70 E 69 45

71 F 70 46

72 G 71 47

73 H 72 48

74 I 73 49

75 J 74 4A

76 K 75 4B

77 L 76 4C

78 M 77 4D

79 N 78 4E

80 O 79 4F

81 P 80 50

82 Q 81 51

83 R 82 52

84 S 83 53

85 T 84 54

86 U 85 55

87 V 86 56

88 W 87 57

89 X 88 58

90 Y 89 59

91 Z 90 5A

92 [ Corchete deapertura

91 5B

93 \ Sesgo inverso 92 5C

94 ] Corchete decierre

93 5D

Apéndice C. Órdenes de clasificación 583

Page 606: RPG Referencia

Tabla 51. Orden de clasificación ASCII (continuación)

Númeroordinal

Símbolo Significado Representacióndecimal

RepresentaciónHex

95 | Signo deintercalación

94 5E

96 _ Signo desubrayado

95 5F

97 v Acento grave 96 60

98 a 97 61

99 b 98 62

100 c 99 63

101 d 100 64

102 e 101 65

103 f 102 66

104 g 103 67

105 h 104 68

106 i 105 69

107 j 106 6A

108 k 107 6B

109 l 108 6C

110 m 109 6D

111 n 110 6E

112 o 111 6F

113 p 112 70

114 q 113 71

115 r 114 72

116 s 115 73

117 t 116 74

118 u 117 75

119 v 118 76

120 w 119 77

121 x 120 78

122 y 121 79

123 z 122 7A

124 { Llave deapertura

123 7B

125 ¦ Barra verticalpartida

124 7C

126 } Llave de cierre 125 7D

127 ˜ Vírgula 126 7E

584 VisualAge RPG Consulta del lenguaje

Page 607: RPG Referencia

Apéndice D. Valores CCSID soportados

La siguiente lista contiene los valores CCSID soportados en las conversiones desdey a valores UCS-2. No se soporta la conversión entre códigos CCSID Unicode.

Nota: Los códigos CCSID 932, 936 y 949 se convierten del modo siguiente:

CCSID Se correlaciona con932 943936 1386949 1363

037256259273274277278280282284285287290293297300301361363367382383385386387388389391392393394

395420423424437500813819829833834835836837838850851852855856857858860861862863864865866868869

870871874875880891895896897903904905907909910912913914915916918919920921922923924927930935937

939941942943946947948950951971952955960961963964933949970100410061008100910101011101210131014101510161017

1018101910251026102710281038104010411042104310461047105010511088108910921097109811121114111511161117111811191122112311241140

1141114211431144114511461147114811491250125112521253125412551256125712751276127713501351136313641380138113821383138613884948

4951495249605037503950485049506751425346534753485349535053515352535353545478861290309056906691452870933722

© Copyright IBM Corp. 1994, 2000 585

Page 608: RPG Referencia

586 VisualAge RPG Consulta del lenguaje

Page 609: RPG Referencia

Apéndice E. Comparación de los compiladores RPG

El lenguaje VisualAge RPG se basa en el lenguaje RPG IV. Ha sido mejorado demodo que se pueden desarrollar y ejecutar aplicaciones con una interfaz gráfica deusuario en un entorno cliente/servidor.

En algunos casos algunas funciones no está soportadas para VisualAge RPG. Porejemplo, no existe ningún ciclo RPG para VisualAge RPG. Puesto que el ciclo RPGno está soportado, todas las funciones asociadas a él como, por ejemplo, lasrupturas de control y los campos coincidentes tampoco están soportadas.

A fin de aprovechar el entorno de desarrollo de aplicaciones de la estación detrabajo, se han añadido funciones a VisualAge RPG (por ejemplo, se utilizancódigos de operación como SHOWWIN para visualizar las ventanas de unaaplicación) o bien se han modificado las funciones ILE RPG para AS/400 (porejemplo, con la directiva de compilador /COPY, puede copiar archivos de AS/400o archivos de la estación de trabajo).

En este apéndice se ofrece un resumen de las diferencias entre ILE RPG paraAS/400 y VisualAge RPG.

Ciclo RPGPuesto que el ciclo RPG no está soportado en VisualAge RPG, los indicadoresasociados al ciclo no están soportados. Tampoco están soportadas las entradas enlas especificaciones asociadas al ciclo RPG.

Indicadores de VisualAge RPGLos indicadores siguientes están soportados en VisualAge RPG. Para obtener unalista de los indicadores no soportados por VisualAge RPG, consulte el apartado“Indicadores no soportados”.

Indicadores identificadores de registro01 - 99, LR

Indicadores de campo01 - 99

Indicadores resultantes01 - 99, LR

Indicadores no soportadosLa siguiente utilización de indicadores no está soportada:

Indicadores de desbordamiento*INOA - *INOG, *INOV, *IN01 - *IN99, 1P

Indicadores identificadores de registroH1 - H9, L1 - L9, U1 - U8, RT

Indicadores de nivel de controlL1 - L9

Indicadores de campoH1 - H9, U1 - U8, RT

© Copyright IBM Corp. 1994, 2000 587

Page 610: RPG Referencia

Indicadores resultantesH1 - H9, OA - OG, OV, L1 - L9, U1 - U8,KA - KN, KP - KY, RT

Condicionamiento de archivoLa palabra clave EXTIND no está soportada en las especificaciones dedescripción de archivo de VisualAge RPG. Esto significa que no puedeutilizar indicadores en el condicionamiento de archivos.

Palabras no soportadasA continuación se describen las palabras con funciones especiales y palabrasreservadas que no están soportadas en VisualAge RPG.v *ALTSEQ, *EQUATE, *FILE,v Fecha de usuario: Los programas de VisualAge RPG no pueden ejecutarse por

lotes. Por consiguiente, no se aplica ninguna de las reglas para fecha de usuarioy programas por lotes a los programas de VisualAge RPG.

Para obtener una descripción de las palabras de VisualAge RPG, consulte elcapítulo 1, “Capítulo 1. Nombres simbólicos y palabras reservadas” en la página 3.

Directivas del compiladorLa directiva del compilador /COPY incluye registros de otro archivo. Este archivopuede existir en la estación de trabajo o en un servidor AS/400. Los registros estáninsertados en el lugar donde se produce la sentencia /COPY y se compilan con elprograma. Para obtener más información al respecto, consulte “/COPY (Posiciones7-11)” en la página 9.

Manejo de excepciones y erroresEl manejo de errores y excepciones en las aplicaciones de VisualAge RPG incluyeel soporte para los componentes lógicos de manejo y la interfaz gráfica de usuariode la aplicación. Para obtener más información consulte el “Capítulo 4. Trabajarcon componentes lógicos” en la página 29 y el apartado “Manejo de errores deevento” en la página 56.

Datos

Tipos de datos y formatos de datosA continuación se ofrece un resumen de las diferencias entre los tipos y formatosde datos de ILE RPG para AS/400 y VisualAge RPG. Para obtener una descripciónde los tipos y formatos de datos soportados en VisualAge RPG, consulte el capítulo9, “Capítulo 9. Tipos de datos y formatos de datos” en la página 95.

Formato binarioLos datos binarios se reordenan cuando se utilizan datos entre el servidory el cliente.

Tipo de datos puntero de baseLa longitud de un campo puntero de base ILE RPG para AS/400 es de 16bytes y debe estar alineado en límite de 16 bytes. La longitud de un campopuntero de base de VisualAge RPG es de 4 bytes y debe estar alineado enun límite de 4 bytes.

Formato decimal empaquetadoILE RPG para AS/400 utiliza hexadecimal F para números positivos yhexadecimal D para números negativos. VisualAge RPG utiliza

588 VisualAge RPG Consulta del lenguaje

Page 611: RPG Referencia

hexadecimal C para números positivos y hexadecimal D para númerosnegativos. VisualAge RPG también da soporte a hexadecimal A, E, y Fpara números positivos y hexadecimal B para números negativos.

Tipo de datos puntero de procedimientoLa longitud de un campo puntero de procedimiento ILE RPG para AS/400es de 16 bytes y debe estar alineado en un límite de 16 bytes. La longitudde un campo puntero de procedimiento VisualAge RPG es de 4 bytes ydebe estar alineado en un límite de 4 bytes.

Formato decimal con zonaILE RPG para AS/400 utiliza hexadecimal F para números positivos yhexadecimal D para números negativos. VisualAge RPG utilizahexadecimal 3 para números positivos y hexadecimal 7 para númerosnegativos. VisualAge RPG también da soporte al hexadecimal 0, 1, 2, 8, 9,A y B para números positivos y hexadecimal 4, 5, 6, C, D, E y F paranúmeros negativos.

Literales y constantes con nombreA continuación se ofrece una descripción de las diferencias entre los literales y lasconstantes con nombre de ILE RPG para AS/400 y VisualAge RPG. Para obteneruna descripción de los tipos y formatos de datos soportados en VisualAge RPG,consulte el “Capítulo 10. Literales y constantes con nombre” en la página 139.

Literales de gráficosUn carácter gráfico ILE RPG para AS/400 tiene la forma G’oK1K2i’ dondeo e i son los caracteres shift-out y shift-in, respectivamente. Los caracteresshift-out y shift-in no se utilizan con los caracteres de gráficos deVisualAge RPG. La forma es G’K1K2’.

Constantes figurativasLas constantes figurativas de ILE RPG para AS/400 pueden utilizar loscaracteres shift-out y shift-in, por ejemplo, ALLG’oK1K2i’. Los caracteresshift-out y shift-in no se utilizan en las constantes figurativas de VisualAgeRPG.

Estas son las constantes figurativas específicas de VisualAge RPG. Para obtenermás información, consulte el apartado “Constantes figurativas” en la página 142.

*ABORT *BLACK *BLUE *BROWN

*CANCEL *CYAN *DARKBLUE *DARKCYAN

*DARKGREEN *DARKGRAY *DARKPINK *DARKRED

*END *GREEN *HALT *IGNORE

*INFO *NOBUTTON *PALEGRAY *PINK

*RED *RETRY *START *YELLOW

*YESBUTTON *WARN *WHITE

Áreas de datosEl área de datos locales y el área de datos Parámetros de inicialización deprograma no están soportados. No puede utilizar:v La operación *DTAARA DEFINE, con *LDA o *PDA en el factor 2 y un nombre

del campo del resultadov DTAARA(*LDA) o DTAARA(*PDA) en una especificación de definición.

Apéndice E. Comparación de los compiladores RPG 589

Page 612: RPG Referencia

Para obtener más información sobre el soporte del área de datos en VisualAgeRPG, consulte el “Capítulo 11. Estructuras de datos” en la página 147.

Matrices y tablasVisualAge RPG no da soporte a los siguientes códigos de operación en matrices ytablas: MLLZO, MHHZO, MLHZO, MHLZO

El sistema AS/400 es un sistema EBCDIC mientras que el sistema OS/2 es unsistema ASCII. VisualAge RPG utiliza el orden de clasificación ASCII. Para obtenermás información, consulte el “Capítulo 12. Utilización de matrices y tablas” en lapágina 157.

Nota: Los datos gráficos y la palabra clave ALTSEQ no están soportados en lasmatrices.

Para obtener información adicional sobre las matrices y tablas de VisualAge RPG,consulte el “Capítulo 12. Utilización de matrices y tablas” en la página 157.

Códigos de ediciónLos códigos de edición definidos por el usuario no están soportados. Para obteneruna descripción de los códigos de edición y palabras soportados en VisualAgeRPG, consulte el “Capítulo 13. Edición de campos numéricos” en la página 173.Para obtener información sobre los componentes GUI de edición, consulte lapublicación Programación con VisualAge para RPG, SC10-3067-02 (SC09-2449-02).

ArchivosEn VisualAge RPG, el contenido del área de retorno de entrada/salida dependientede dispositivo del archivo se copia en la sección de retorno dependiente dedispositivo de la INFDS únicamente después de realizar un POST en el archivo.Para obtener más información, consulte el apartado “POST (Anotar)” en lapágina 509.

EspecificacionesVisualAge RPG no da soporte a los siguientes registros:v Registros de traducción de archivov Registros de orden de clasificación alterno

Especificaciones de controlPara obtener información más detallada sobre las especificaciones de control deVisualAge RPG, consulte el “Capítulo 16. Especificaciones de control” en lapágina 201.

Áreas de datosSi no proporciona información sobre cómo generar y ejecutar la aplicación en lasespecificaciones de control, ILE RPG busca un área de datos llamadaRPGLEHSPEC en la lista de bibliotecas (*LIBL). Si no la encuentra, entonces ILERPG busca un área de datos llamada DFTLEHSPEC en QRPGLE. VisualAge RPGno busca ninguna área de datos en *LIBL o QRPGLE.

Palabras claveLas palabras clave siguientes no están soportadas en la especificación de control deVisualAge RPG:v ACTGRP

590 VisualAge RPG Consulta del lenguaje

|

|||||

Page 613: RPG Referencia

v ALTSEQv BNDDIRv DFTACTGRPv DFTNAMEv ENBPFRCOLv FIXNBRv FORMSALIGNv FTRANSv LANGIDv OPENOPTv OPTIMIZEv PRFDTAv SRTSEQv TEXTv THREADv USRPRF

Los valores *{NO}SRCSTMT y *{NO}DEBUGIO de la palabra clave OPTION noestán soportados.

El parámetro de la palabra clave CCSID debe ser un CCSID de estación de trabajo.

Las palabras clave siguientes son específicas de VisualAge RPG para lasespecificaciones de control:v CACHEv CACHEREFRESHv CVTOEMv LIBLISTv SQLBINDFILEv SQLDBBLOCKINGv SQLDBNAMEv SQLDTFMTv SQLISOLATIONLVLv SQLPACKAGENAMEv SQLPASSWORDv SQLUSERID

Para obtener una descripción del soporte de palabras clave para lasespecificaciones de control de VisualAge RPG, consulte el apartado “Posiciones7-80 (Palabras clave)” en la página 201.

Especificaciones de descripción de archivoPara obtener información más detallada sobre las especificaciones de descripciónde archivo de VisualAge RPG, consulte el “Capítulo 17. Especificaciones dedescripción de archivo” en la página 213.

Soporte de archivosVisualAge RPG no da soporte a un número de archivos soportados por ILE RPG.La siguiente lista detalla cuáles son los archivos no soportados por VisualAge RPG,así como qué posiciones se ven afectadas en la especificación de descripción dearchivo.

archivos primarios, archivos secundarios, archivos de direcciones de registrosILE RPG da soporte a una clase de archivo (posición 18) en los archivosprimarios, los archivos secundarios y los archivos de direcciones deregistros. VisualAge RPG no da soporte a estos archivos.

Apéndice E. Comparación de los compiladores RPG 591

Page 614: RPG Referencia

archivos de direcciones de registros y archivos de índicesv VisualAge RPG sólo da soporte a una entrada de espacio en blanco en la

longitud de clave o dirección de registros (posiciones 29-33).v El tipo de dirección de registro (posición 34) de un programa VisualAge

RPG no puede contener la A (teclas de carácter), P (teclasempaquetadas), G (teclas de gráficos), D (teclas de fecha), T (teclas dehora) o Z (teclas de indicación de la hora).

v La entrada de organización de archivos (posición 35) de un programaVisualAge RPG no puede contener una entrada I (archivos de índices) oT (archivos de direcciones de registros).

archivos WORKSTNv ILE RPG da soporte a un tipo de archivo (posición 17) de Combinado,

válido para los archivos SPECIAL y WORKSTN. Puesto que VisualAgeRPG no da soporte a los archivos WORKSTN, la especificación de untipo de archivo de combinado sólo se puede aplicar a los archivosSPECIAL.

Métodos de proceso de archivos en discoVisualAge RPG no da soporte al acceso secuencial dentro de los límites.

Entradas relacionadas con el ciclo RPGPuesto que VisualAge RPG no soporta al ciclo RPG, las entradas siguientes noestán soportadas:v Fin de archivo (E)v Secuencia (A y D)v Proceso de límites (L)v Proceso de desbordamiento (OA-OG, OV o 01-99)

Palabras claveLas palabras clave siguientes no están soportadas en las especificaciones dedescripción de archivo de un programa VisualAge RPG:

DEVID EXTIND FORMOFL INDDS

KEYLOC MAXDEV OFLIND PASS

PGMNAME RAFDATA SAVEDS SAVEIND

SFILE SLN

Estas son las palabras clave de especificación de descripción de archivo específicasde VisualAge RPG:

EXTFILE(nombarch)La palabra clave EXTFILE le permite especificar un nombre de archivolocal real durante la ejecución, en lugar de dar el nombre durante lacompilación.

PROCNAME (nombreproced)Si entra SPECIAL en la entrada de dispositivo (posición 42), el módulo queespecifique como nombreproced maneja el soporte del dispositivo.

RCDLEN(nombrecampo)La palabra clave RCDLEN se puede utilizar para los archivos DISK locales.

REMOTESi entra DISK (posición 36-42), la palabra clave REMOTE especifica que eldispositivo de disco se encuentra en un servidor AS/400.

592 VisualAge RPG Consulta del lenguaje

Page 615: RPG Referencia

Para obtener una descripción del soporte de palabras clave para lasespecificaciones de descripción de archivo de VisualAge RPG, consulte el apartado“Posiciones 44-80 (Palabras clave)” en la página 219.

Especificaciones de definiciónVisualAge RPG da soporte a las ventanas de mensaje. Las ventanas de mensajesestán especificadas en la especificación de definición entrando una M en laposición 24 y un espacio en blanco en la posición 25. Para obtener más informaciónsobre las ventanas de mensaje, consulte el “Capítulo 18. Especificaciones dedefinición” en la página 227.

Palabras claveA continuación se describen las diferencias de las palabras clave de especificaciónde definición entre ILE RPG y VARPG.

ASCEND y DESCENDILE RPG utiliza el orden de clasificación EBCDIC. VisualAge RPG utiliza elorden de clasificación ASCII.

Puesto que VisualAge RPG no da soporte a ALTSEQ, la aplicación deVisualAge RPG no puede utilizar una secuencia alternativa paracomprobar la secuencia de las matrices y tablas durante la compilación.

DTAARAVisualAge RPG no da soporte a las áreas de datos locales (*LDA) con lapalabra clave DTAARA.

Las siguientes palabras clave no están soportadas para las especificaciones dedefinición en un programa VisualAge RPG:v EXPORTv EXTPGMv IMPORTv OPDESCv OPTIONS(*NOPASS)

Las palabras clave siguientes son específicas de VisualAge RPG para lasespecificaciones de definición:

BUTTON(botón1:botón2...)Utilice la palabra clave BUTTON para definir los botones en una ventanade mensaje. Puede especificar los parámetros siguientes (se permiten unmáximo de tres): *OK, *CANCEL, *RETRY, *ABORT, *IGNORE, *ENTER,*NOBUTTON, *YESBUTTON.

CLTPGM(nombre programa)La palabra clave CLTPGM especifica el nombre del programa local llamadopor el programa de VARPG, mediante la operación CALLP.

DLL(nombre)La palabra clave DLL, junto con la palabra clave LINKAGE, se utiliza paracrear el prototipo de un procedimiento que llama a funciones contenidasen bibliotecas DLL de Windows, incluyendo las API de Windows.

LINKAGE(tipo_enlace)Utilice la palabra clave LINKAGE con el parámetro *SERVER paraespecificar que el nombre de programa utilizado con el código deoperación CALL se encuentra en un servidor AS/400. Las palabras claveLINKAGE y DLL pueden utilizarse juntas para crear el prototipo de un

Apéndice E. Comparación de los compiladores RPG 593

Page 616: RPG Referencia

procedimiento que llama a funciones contenidas en bibliotecas DLL deWindows, incluyendo las API de Windows.

MSGDATA(msgdata1:msgdata2...)Utilice la palabra clave MSGDATA para definir el texto de substitución.Los parámetros (msgdata1:msgdata2...) son nombres de campo. VisualAgeRPG convierte todos los datos a formato de carácter antes de visualizar elmensaje.

MSGNBR(*MSGnnnn o nombrecampo)La palabra clave MSGNBR define el número de mensaje. El número demensaje puede tener una longitud máxima de 4 dígitos.

MSGTEXT(’texto del mensaje’)La palabra clave MSGTEXT define el texto del mensaje. El texto delmensaje va entre comillas simples (’).

MSGTITLE(’texto del título’)La palabra clave MSGTITLE especifica el texto del título de la ventana demensaje. Puede entrar una serie o número de mensaje que vaya entrecomillas simples (’).

NOWAITLa palabra clave NOWAIT se utiliza para llamar a los programas deAS/400 remotos que utilizan archivos de pantalla.

STYLE(tipo_estilo)La palabra clave STYLE se utiliza para la ventana de mensaje para definirel icono que aparece en la ventana de mensaje. Puede especificar uno delos parámetros siguientes con la palabra clave STYLE: *INFO *WARN o*HALT.

Para obtener una descripción del soporte de palabras clave para lasespecificaciones de definición de VisualAge RPG, consulte el apartado “Palabrasclave de especificación de definición” en la página 237.

Especificaciones de entradaPara obtener información más detallada sobre las especificaciones de descripciónde archivo de VisualAge RPG, consulte el “Capítulo 17. Especificaciones dedescripción de archivo” en la página 213.

Las siguientes entradas no están soportadas:v Para la secuencia (posiciones 17-18), no puede entrar un número de dos dígitos.

ILE RPG da soporte a esta opción que se puede utilizar para comprobar lasecuencia de los registros de entrada. VisualAge RPG no ofrece este soporte.

v En cuanto al número (posición 19), no puede entrar el 1 (que indica que sólopuede haber un registro de este tipo dentro del grupo ordenado) o N (que indicaque puede haber uno o más registros de este tipo dentro del grupo ordenado).

v Por lo que respecta a la opción (posición 20), no puede entrar el O (que indicaque el tipo de registro es opcional si se especifica la comprobación de secuencia).

v En cuanto al componente código (posiciones 29, 37, 45), no puede entrar la Z(que indicar la parte de zona de un carácter).

Funciones incorporadas%GETATR y %SETATR son funciones incorporadas específicas de VARPG. Paraobtener más información, consulte los apartados “%GETATR (Recuperar atributo)”en la página 327 y “%SETATR (Establecer atributo)” en la página 337.

594 VisualAge RPG Consulta del lenguaje

Page 617: RPG Referencia

Nota: Las funciones incorporadas específicas de VARPG no dan soporte a valoresde 1 byte, de 8 bytes ni UNICODE.

Códigos de operaciónEn este apartado se comparan los códigos de operación de ILE RPG con loscódigos de operación de VisualAge RPG. Para obtener una descripción completade los códigos de operación de VisualAge RPG, consulte el apartado “Los detallesde los códigos de operación” en la página 392.

Códigos de operación similaresLos siguientes códigos de operación existen tanto para ILE RPG como paraVisualAge RPG. Sin embargo, existen diferencias en la manera de codificar estoscódigos de operación o bien hay resultados diferentes al ejecutar las aplicacionesque contienen dichos códigos de operación. Si desea obtener una descripción sobrecómo funciona el código de operación en VisualAge RPG, consulte las cabecerasque aparecen listadas con el código de operación.v BEGSR ( “BEGSR (Empezar subrutina de usuario)” en la página 400)v CALL ( “CALL (Llamar a un programa AS/400)” en la página 404)v CALLB ( “CALLB (Llamar a una función)” en la página 407)v CALLP ( “CALLP (Llamar a un procedimiento o programa con prototipo)” en la

página 408)v CHAIN ( “CHAIN (Recuperación aleatoria desde un archivo)” en la página 414)v CLEAR ( “CLEAR (Borrar)” en la página 422)v CLOSE ( “CLOSE (Cerrar archivos)” en la página 424)v COMMIT ( “COMMIT (Comprometer)” en la página 425)v DEFINE ( “DEFINE (Definición de campo)” en la página 428)v DELETE ( “DELETE (Suprimir registro)” en la página 431)v DSPLY ( “DSPLY (Visualizar ventana de mensaje)” en la página 441)v FEOD ( “FEOD (Forzar fin de datos)” en la página 453)v READ ( “READ (Leer un registro)” en la página 510)v WRITE ( “WRITE (Crear nuevos registros)” en la página 561)

Códigos de operación no soportadosLos siguientes códigos de operación no están soportados en VisualAge RPG:v ACQv DUMPv EXFMTv FORCEv MHHZOv MHLZOv MLHZOv MLLZOv NEXTv RELv SHTDN

Códigos de operación específicos de VisualAge RPGLos siguiente códigos de operación son exclusivos para el lenguaje de VisualAgeRPG:v BEGACT/ENDACT (Empezar subrutina de acción, Finalizar subrutina de

acción)v CLSWIN (Cerrar ventana)v DSPLY (Visualizar ventana de mensaje)

Apéndice E. Comparación de los compiladores RPG 595

Page 618: RPG Referencia

v GETATR/SETATR (Recuperar atributo, Establecer atributo)v READS (Leer seleccionados)v SHOWWIN (Cargar una ventana)v START/STOP (Iniciar un componente, Parar un componente)

Para obtener una descripción detallada de estos códigos de operación, consulte elapartado “Los detalles de los códigos de operación” en la página 392.

Nota: Excepto DSPLY, los códigos de operación específicos de VARPG no dansoporte a valores enteros de 1 y 8 bytes con y sin signo ni a valoresUNICODE.

Conversiones entre CCSIDEl compilador VARPG no da soporte a las conversiones entre datos de tipo carácterde un solo byte y datos gráficos. Las únicas conversiones soportadas son lassiguientes:v De gráfico a UCS-2 o bien de UCS-2 a gráficov De carácter a UCS-2 o bien de UCS-2 a carácterv De gráfico a gráfico (cuando los CCSID son diferentes)

596 VisualAge RPG Consulta del lenguaje

Page 619: RPG Referencia

Glosario

Este glosario incluye términos y definiciones de:v El American National Dictionary for Information Systems ANSI X3.172-1990,

copyright 1990 del American National Standards Institute (ANSI). Si deseaadquirir una copia de esta publicación, debe dirigirse a American NationalStandards Institute, 1430 Broadway, New York, New York, 10018. Lasdefiniciones se especifican mediante el símbolo (A) después de las mismas.

v El Information Technology Vocabulary desarrollado por el Subcomité 1, ComitéTécnico Conjunto 1, de International Organization for Standardization y elInternational Electrotechnical Committee (ISO/IEC JTC1/SC1). Las definicionesde las partes publicadas de este vocabulario se identifican mediante el símbolo(|) después de las mismas; las definiciones tomadas de borradores de estándaresinternacionales, borradores del comité y trabajos no concluyentes desarrolladospor ISO/IEC JTC1/SC1 se identifican mediante el símbolo (T) después de lasmismas, lo cual indica que aún no se ha alcanzado un acuerdo definitivo entrelos 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.

Aacción. (1) Sinónimo de subrutina de acción. (2) Programa ejecutable o archivo de mandatos utilizado para manipularlos componentes de un proyecto o participar en una construcción.

acción por omisión. Acción que se efectúa cuando se realiza otra como, por ejemplo, pulsar la tecla Intro.

alias de servidor. Nombre al que da una definición y que puede utilizarse en lugar del nombre del servidor.

ancla. Cualquier componente que utiliza como punto de referencia para alinear, dimensionar y espaciar otroscomponentes.

anotaciones de error. Realiza un seguimiento de los errores en las anotaciones de error. El editor le lleva al lugardel código fuente en el que se ha producido el error.

API. Interfaz de programación de aplicaciones.

aplicación. Un grupo de componentes de software utilizados para efectuar tareas de usuario específicas en unsistema.

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 archivopuede incluir información que inicia un programa (objeto de archivo de programa), contiene texto o gráficos (objetode archivo de datos) o procesa una serie de mandatos (archivo por lotes).

archivo de mensajes. Archivo que contiene mensajes de aplicación. Este archivo se crea a partir del archivo fuentede mensajes durante el proceso de construcción. Véase también construir.

archivo de ondas. Archivo utilizado para sonidos audio en un dispositivo de forma de onda.

archivo de Recurso de Presentación de Información (IPF). Archivo en el que se almacena el fuente de la ayuda dela aplicación.

archivo MIDI. Archivo de la Interfaz Digital de Instrumentos Musicales.

© Copyright IBM Corp. 1994, 2000 597

Page 620: RPG Referencia

archivos JAR (.jar). En Java, abreviatura de Java ARchive. Es un formato de archivo que se utiliza para agregarvarios archivos en uno.

área común. Área de almacenamiento proporcionada por el sistema para retener datos temporalmente. Los datos delárea común están disponibles para otras aplicaciones.

área de cliente. La parte de la ventana que es el espacio de trabajo del usuario donde éste teclea información yselecciona opciones de campos de selección. En ventanas primarias, el área en la que un programador de aplicacionespresenta los objetos con los que trabaja el usuario.

área de información. Componente de una ventana en el que se visualiza información sobre el objeto o la opción enlos que se encuentra el cursor. El área de información también puede incluir un mensaje sobre la conclusión normalde un proceso. Véase también barra de estado.

área de trabajo. Área utilizada para organizar objetos de acuerdo a las tareas del usuario. Cuando un usuario cierraun área de trabajo, todas las ventanas abiertas a partir de objetos contenidos en el área de trabajo se eliminan dellugar de trabajo.

Arquitectura Common User Access (arquitectura CUA). Directrices para el diálogo entre una persona y unaestación de trabajo o un terminal.

arquitectura CUA. Arquitectura de Acceso Común de Usuario.

arrastrar. Mover o copiar un objeto utilizando el ratón. Por ejemplo, un usuario puede arrastrar el borde de unaventana para hacerla más grande pulsando un botón del ratón y manteniéndolo pulsado mientras mueve el ratón.Véase también arrastrar y soltar.

arrastrar y soltar. Manipular directamente un objeto moviéndolo y colocándolo en cualquier lugar utilizando elratón.

ASCII (American National Standard Code for Information Interchange). Código estándar, que se compone de unjuego de caracteres codificados de 7 bits (8 bits incluyendo comprobación de paridad), que se utiliza para elintercambio de información entre sistemas de proceso de datos, sistemas de comunicación de datos y equipoasociado. El juego de caracteres ASCII se compone de caracteres de control y caracteres gráficos. (A)

atenuado. Atenuación del contraste visual de un componente que indica que el usuario no puede seleccionar nimanipular directamente ese componente.

Bbarra de desplazamiento. Componente que muestra a un usuario que hay más información disponible en unadirección determinada y que puede moverse para visualizar dicha información utilizando el ratón o las teclas depágina.

barra de estado. Componente de una ventana que visualiza información que indica el estado de la vista o del objetoactuales. Véase también área de información.

barra de herramientas. Menú que contiene una o más opciones gráficas que representa las acciones que un usuariopuede efectuar utilizando el ratón.

barra de títulos. Área en la parte superior de cada ventana que contiene el símbolo del menú del sistema.

base de datos. (1) Grupo de datos con una estructura determinada para aceptar, almacenar y proporcionar, previapetición, datos para varios usuarios. (T) (2) Todos los archivos de datos almacenados en el sistema.

Biblioteca de enlace dinámico (DLL). Archivo que contiene código ejecutable y datos enlazados de manera lógica aun programa durante el tiempo de carga o el de ejecución, en lugar de durante el enlace. Varias aplicaciones puedencompartir a la vez el código y los datos de una biblioteca de enlace dinámico.

BMP. Extensión de archivo de un archivo bitmap.

borde de dimensionamiento. Borde de un marco alrededor de un componente (o conjunto de componentes) queselecciona para cambiar el tamaño del componente (o del conjunto de componentes) utilizando el ratón o el teclado.

598 VisualAge RPG Consulta del lenguaje

Page 621: RPG Referencia

borde de selección. Borde visual que aparece alrededor de un componente de VARPG o de un componente creadopor el usuario, que permite moverlo mediante el ratón o el teclado.

botón. (1) Mecanismo en un dispositivo de puntero, como un ratón, utilizado para solicitar o iniciar una acción. (2)Mecanismo gráfico en una ventana que, cuando se selecciona, produce una acción. Por ejemplo, el pulsador Aceptarque, al seleccionarse, inicia una acción.

botón 2 del ratón. Por omisión, el botón derecho del ratón se utiliza para manipular.

botón 1 del ratón. Por omisión, el botón izquierdo del ratón se utiliza para seleccionar.

botón de manipulación. Véase botón de ratón.

botón de maximizar. Botón en la parte más a la derecha de una barra de título sobre el que un usuario pulsa elbotón del ratón para aumentar el tamaño de la ventana lo máximo posible. Compárese con botón de minimizar y botónde ocultar.

botón de minimizar. Botón ubicado junto al botón más a la derecha en una barra de título que reduce el tamaño dela ventana lo máximo posible. Compárese con botón de maximizar y botón de ocultar.

botón de ocultar. Botón en una barra de título sobre el que un usuario pulsa el botón del ratón para suprimir unaventana del lugar de trabajo sin cerrarla. Cuando la ventana está oculta, el estado de la misma, indicado en la lista deventanas, cambia. Compárese con botón de maximizar y botón de minimizar.

botón de ratón. Mecanismo en un ratón para seleccionar opciones, iniciar acciones o manipular objetos con elpuntero. Véase también botón 1 del ratón y botón 2 del ratón.

botón de restaurar. Botón que aparece en la esquina más a la derecha de la barra de título después de habermaximizado una ventana. Cuando se selecciona el botón de restaurar, la ventana vuelve a tener el tamaño y laposición que tenía antes de que se maximizara. Véase también botón de maximizar.

botón de selección. Véase botón 1 del ratón.

Ccampo. (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 características un componente campo de entradapuede heredar.

campo de subarchivo. Campo utilizado para definir campos en un componente subarchivo. Véase también camposubarchivo.

Capa de Sockets Segura (SSL). Esquema de seguridad de gran aceptación desarrollado por NetscapeCommunications Corp. y RSA Data Security, Inc. SSL permite al cliente autenticarse en el servidor y cifrar todos losdatos 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 aplicación VARPG.

catálogo de componentes. Espacio de almacenamiento para todos los componentes utilizados para crear interfacesgráficas de usuario para aplicaciones VARPG.

cliente. (1) Sistema que depende de un servidor para obtener datos. (2) La PWS donde se ejecutan las aplicacionesVARPG. Véase también cliente DDE.

cliente DDE. Aplicación que inicia una conversación DDE. Compárese con servidor DDE. Véase también componentecliente DDE y conversación DDE.

cliente/servidor. Modelo de interacción en el proceso de datos distribuidos en el que un programa en una ubicaciónenvía una petición a un programa en otra ubicación y espera una respuesta. El programa que efectúa la peticiónrecibe el nombre de cliente; y el programa que responde, servidor. Véase también cliente, servidor, cliente DDE, servidorDDE.

Glosario 599

Page 622: RPG Referencia

compilar. Convertir un programa fuente en un programa ejecutable (programa objeto).

complemento. Función creada por el usuario o un proveedor externo que se puede utilizar en los programasVARPG.

componente barra de desplazamiento horizontal. Componente que añade una barra de desplazamiento horizontala una ventana. Este componente permite desplazarse por un panel de información de izquierda a derecha oviceversa.

componente barra de desplazamiento vertical. Componente que añade una barra de desplazamiento vertical a unaventana. Este componente permite desplazarse por un panel de información verticalmente.

componente barra de estado. Componente de una ventana que puede visualizar información adicional sobre unproceso o acción de la ventana.

componente barra de menús. Área que está junto a la parte superior de la ventana, debajo de la barra de título yencima del resto de la ventana, que contiene opciones que proporcionan acceso a otros menús. En VisualAge RPG, seseñala y pulsa un componente barra de menús de la paleta de componentes o del catálogo de componentes y sesuelta en una ventana de diseño.

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 gráfica.

componente bean Java. Componente que permite a las aplicaciones VARPG acceder a los JavaBean de SunMicrosystems.

componente botón de selección. Círculo con texto al lado. Los botones de selección se combinan para mostrar a unusuario un conjunto fijo de opciones de entre las que sólo puede seleccionarse una. Cuando se selecciona una opción,el círculo se rellena parcialmente. Puede señalar y pulsar un componente botón de selección de la paleta decomponentes o del catálogo de componentes y soltarlo en una ventana de diseño.

componente calendario. Componente que añade un calendario que puede ser modificado por el usuario para incluirtexto, color u otros atributos.

componente campo de entrada. Área de una pantalla donde un usuario pueden entrar información, a menos de queel campo sea de sólo lectura. Normalmente, los límites de un campo de entrada están indicados. En VisualAge RPG,se señala y pulsa un componente campo de entrada de la paleta de componentes o del catálogo de componentes y sesuelta en una ventana de diseño.

componente cliente DDE. Componente utilizado para intercambiar datos con otras aplicaciones como, por ejemplo,aplicaciones de hoja de cálculo, que soportan el protocolo de intercambio de datos dinámico (DDE).

componente *componente lógico. Componente que es la “representación de componente” del componente lógico.Para cada componente lógico se crea un componente *componente lógico, 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 animación. Componente que permite reproducir archivos de vídeo, con la extensión AVI, enWindows, o reproducir secuencias GIF de animación en aplicaciones Java.

componente cuaderno. Representación gráfica de un cuaderno. Puede añadir páginas de cuaderno al componentecuaderno y agrupar las páginas en secciones separadas por separadores. En Windows, a veces se ha referencia alcuaderno como el control de separadores de Windows. Véase también componente página de cuaderno y componentepágina de cuaderno con lienzo.

componente de activeX. Componente que añade objetos de control ActiveX al proyecto. Las aplicaciones VARPGpueden acceder así a los atributos y supervisar si hay eventos.

componente definido por el usuario. Componente, que se compone de uno o más componentes que hapersonalizado, que guarda en la paleta de componentes o del catálogo de componentes para volver a utilizarlo.Cuando está en la paleta o en el catálogo, este componente se puede señalar y pulsar en la ventana de diseño talcomo se haría con otro componente de VARPG.

600 VisualAge RPG Consulta del lenguaje

Page 623: RPG Referencia

componente destino. Componente que, siempre que cambia el estado del componente fuente, recibe un evento link(de enlace) del componente fuente.

componente de subarchivo. Componente utilizado para visualizar una lista de registros que constan de varioscampos. Este componente es similar a un subarchivo de AS/400. Véase también campo de subarchivo.

componente edición de múltiples líneas (MLE). Componente que representa un campo de entrada que permite alusuario entrar varias líneas de texto.

componente elemento de menú. Componente que es un elemento gráfico o de texto en un menú. Cuando elusuario desea trabajar con un objeto, selecciona un elemento de menú.

componente fuente. Componente que, siempre que cambia su estado, puede notificarlo a los componentes dedestino. Un componente fuente puede tener varios destinos.

componente graduador. Componente visual de una interfaz de usuario que representa una cantidad y su relacióncon el rango de posibles valores para esa cantidad. El usuario también puede modificar el valor de la cantidad.Puede señalar y pulsar un componente graduador de la paleta de componentes o del catálogo de componentes ysoltarlo en una ventana de diseño.

componente gráfica. Componente que permite al usuario añadir un gráfico a la GUI. Los estilos de gráficodisponibles son el diagrama de líneas, de barras, de líneas 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 señalar y pulsar otros componentes, colocarlos y organizarlospara producir una interfaz gráfica de usuario. El componente lienzo ocupa el área de cliente de un componenteventana o de un componente página de cuaderno. Véase también componente página de cuaderno con lienzo ycomponente ventana con lienzo.

componente lógico. Agrupación funcional de archivos relacionados dentro de un objeto. Un componente lógico secrea cuando las especificaciones de control no contienen palabras clave NOMAIN y EXE.

componente lógico compartido. Componente lógico al que puede accederse a través de más de un objeto.

componente medios. Componente que proporciona a un programa la posibilidad de procesar archivos de sonido(.WAV) y archivos de vídeo (.MID).

componente menú emergente. Componente que, cuando se añade a un objeto en la interfaz, aparece junto al objetocon el que está asociado cuando se solicita. Puede señalar y pulsar un componente menú emergente de la paleta decomponentes o del catálogo de componentes y soltarlo en una ventana de diseño.

componente odbc/jdbc. Componente que permite a las aplicaciones VAPRG acceder y procesar archivos de base dedatos que den soporte a la API ODBC de Windows o la API JDBC de Sun Microsystem.

componente página de cuaderno. Componente utilizado para añadir páginas al componente cuaderno. Véasetambién cuaderno.

componente página de cuaderno con lienzo. Combinación del componente cuaderno y del componente página conlienzo. Véase también 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. Botón etiquetado con texto que representa una acción que se inicia cuando un usuarioselecciona el pulsador. Puede señalar y pulsar un componente pulsador de la paleta de componentes o del catálogode componentes y soltarlo en una ventana de diseño. Véase también componente pulsador gráfico.

componente pulsador gráfico. Pulsador, etiquetado con un gráfico, que representa una acción que se inicia cuandoun usuario la selecciona. Compárese con componente pulsador.

componente recuadro de contorno. Componente que es un recuadro rectangular colocado alrededor de un grupo decomponentes para indicar que todos los componentes están relacionados.

Glosario 601

Page 624: RPG Referencia

componente recuadro de grupo. Marco rectangular alrededor de un grupo de controles que indica que estánrelacionados y que proporciona una etiqueta optativa para el grupo. En VisualAge RPG, se señala y pulsa uncomponente recuadro de grupo de la paleta de componentes o del catálogo de componentes y se suelta en unaventana de diseño.

componente recuadro de lista. Control que contiene opciones desplazables que un usuario puede seleccionar. EnVisualAge RPG, se señala y pulsa un componente recuadro de lista de la paleta de componentes o del catálogo decomponentes y se suelta en una ventana de diseño.

componente recuadro de selección. Recuadro de selección con texto asociado que representa una opción. Cuandoun usuario selecciona una opción, aparece un indicador en el recuadro de selección que indica que la opción estáseleccionada. El usuario puede eliminar la marca del recuadro de selección volviendo a seleccionar la opción. EnVisualAge RPG, se señala y pulsa un componente recuadro de selección de la paleta de componentes o del catálogode componentes y se suelta en una ventana de diseño.

componente referencia a componente lógico. Componente que permite que un componente lógico se comuniquecon otro en una aplicación VARPG.

componentes. Objetos que componen la GUI de una aplicación VARPG.

componente selector cíclico. Tipo de campo de entrada que muestra un anillo de opciones relacionadas, pero que seexcluyen mutuamente, por el que un usuario puede desplazarse y seleccionar una opción. El usuario también puedeteclear una opción válida en el campo de entrada. Puede señalar y pulsar un componente selector cíclico de la paletade componentes o del catálogo de componentes y soltarlo en una ventana de diseño.

componente subarchivo de mensajes. Componente que puede visualizar mensajes predefinidos o textosuministrado en la lógica del programa.

componente submenú. Componente utilizado para iniciar un submenú a partir de un elemento de menú o de unmenú existente, o para iniciar un menú desplegable a partir de un elemento de menú en una barra de menú. Véasetambién submenú y componente elemento de menú.

componente temporizador. Componente utilizado para hacer un seguimiento del intervalo de tiempo entre doseventos y activar el segundo evento cuando ha transcurrido el intervalo.

componente texto estático. Componente utilizado como etiqueta para otros componentes, como solicitud para uncomponente campo de entrada.

componente ventana. Área con límites visibles que representa una vista de un objeto o con la que un usuariomantiene un diálogo con un sistema. Puede señalar y pulsar un componente ventana de la paleta de componentes odel catálogo de componentes y soltarlo en la ventana de proyectos.

componente ventana con lienzo. Combinación del componente ventana y del componente lienzo. Véase tambiéncomponente ventana y componente lienzo.

comprobación de sintaxis. Verifica que la sintaxis de cada línea sea correcta mientras se edita el código fuente. Conello pueden evitarse errores de compilación. Esta opción puede activarse o desactivarse. Puede visualizarse sólodeterminados tipos de especificación, como especificaciones C, o una línea con una serie específica.

Conectividad de Base de Datos Java (JDBC). Estándar del sector para la conectividad independiente de la base dedatos entre Java y una amplia gama de bases de datos. JDBC proporciona una interfaz de programación deaplicaciones (API) a nivel de llamada para el acceso a bases de datos basado en SQL.

CONFIG.SYS. Archivo de configuración, ubicado en el directorio raíz de la unidad de arranque, para los sistemasoperativos DOS, OS/2 o Windows. Contiene información necesaria para instalar y ejecutar hardware y software.

configuración. Manera en que el hardware y el software de un sistema de proceso de información estánorganizados y se conectan entre sí (T).

construir. Proceso por el que las diversas partes de un código fuente que forman los componentes lógicos de unaaplicación VARPG se compilan y enlazan para producir una versión ejecutable de la aplicación.

conversación DDE. El intercambio de datos entre un cliente DDE y un servidor DDE. Véase también conversación deenlace estático y conversación de enlace dinámico.

602 VisualAge RPG Consulta del lenguaje

Page 625: RPG Referencia

conversación de enlace dinámico. En DDE, actualización automática de un programa cliente por un programaservidor cuando los datos cambian en el servidor. Compárese con conversación de enlace estático

conversación de enlace estático. En DDE, petición explícita efectuada por un programa cliente a un programaservidor. El programa servidor responde a la petición. Compárese con conversación de enlace dinámico.

cuaderno de propiedades. Representación gráfica que se asemeja a un cuaderno enlazado que contiene páginasseparadas en secciones por páginas separadoras. Seleccione los separadores de un cuaderno para ir de una sección aotra.

cursor. Indicación visible de la posición en la que aparecerá la interacción de usuario con el teclado.

DDBCS. Juego de caracteres de doble byte.

DDE. Intercambio de datos dinámico.

definición de interfaz de procedimiento. Repetición de la información prototipo dentro de la definición de unprocedimiento. Se utiliza para declarar los parámetros de entrada para el procedimiento y para garantizar que ladefinición interna del procedimiento es coherente con la definición externa (el prototipo)

directorio destino. Directorio en el que la aplicación VARPG compilada se almacena después de una creación.Compárese con carpeta destino.

directorio fuente. Directorio en el que se almacenan todos los archivos fuente para una aplicación VARPG.

Diseñador GUI. Conjunto de herramientas utilizadas para crear interfaces arrastrando y soltando componentes dela paleta de componentes a la ventana de diseño.

DLL. Biblioteca de enlace dinámico.

DLL de programa de utilidad. Véase módulo NOMAIN

doble pulsación. Pulsar un botón dos veces rápidamente.

EEBCDIC. Código de intercambio decimal binario ampliado. Juego de caracteres de 256 caracteres de 8 bits.

edición directa. Utilización de procedimientos que permiten a un usuario trabajar con un objeto arrastrándolo conun ratón o interactuando con su menú emergente.

elemento. En intercambio de datos dinámico, una unidad de datos. Por ejemplo, la posición de la casilla superiorizquierda en una hoja de cálculo es fila 1, columna 1. Se puede hacer referencia a la posición de la casilla como elelemento R1C1.

eliminar referencia. Acción de suprimir la asociación entre un componente y un campo de base de datos deAS/400.

énfasis. Resaltado del cambio de color u otra indicación visible de condiciones relativas a un objeto o una opciónque afecta a la capacidad del usuario de interactuar con ese objeto u opción. El énfasis también puede proporcionar aun usuario información adicional sobre el estado de una opción o un objeto.

entrada/salida (E/S). Datos proporcionados al sistema o datos que resultan del proceso del sistema.

estación de trabajo. Dispositivo que permite a un usuario efectuar trabajos. Véase también estación de trabajoprogramable.

estación de trabajo programable (PWS). Estación de trabajo que tiene posibilidades de proceso y que permite a unusuario modificar sus funciones.

Glosario 603

Page 626: RPG Referencia

evento. Señal generada como resultado de una modificación en el estado de un componente. Por ejemplo, alaccionar un pulsador se genera el evento Press.

evento de enlace. Evento que un componente destino recibe siempre que cambia el estado de un componentefuente.

excepción. (1) En lenguajes de programación, una situación anormal que se da durante la ejecución, que puedeocasionar una desviación de la secuencia normal de ejecución, para la que existen recursos en los lenguajes deprogramación a fin de definirla, activarla, reconocerla, ignorarla y manejarla. (I) (2) En VisualAge RPG, un evento osituación que impide, o puede impedir, que una acción solicitada por un usuario concluya tal como éste espera. Lasexcepciones tienen lugar cuando un producto no puede interpretar la entrada de un usuario.

EXE. Extensión de un archivo ejecutable.

exportar. Función que convierte un archivo interno en un formato de archivo estándar para utilizarlo fuera de laaplicación. Compárese con importar.

Ffoco. Sinónimo de foco de entrada.

foco de entrada. Área de una ventana en la que la interacción del usuario puede tener lugar desde el teclado odesde el ratón.

IICO. Extensión de archivo de un archivo de icono.

icono. Representación gráfica de un objeto, que se compone de una imagen, un fondo de imagen y una etiqueta.

importar. Función que convierte objetos de archivo de pantalla de AS/400 al componente VARPG adecuado.Compárese con exportar.

indicador de progreso. Uno o más controles utilizados para informar a un usuario sobre el curso de un proceso.

índice. Identificador de una entrada en componentes de VARPG como recuadros de lista o recuadros decombinación.

INI. Extensión de archivo para un archivo del sistema operativo OS/2 o Windows que contiene informaciónespecífica de la aplicación que necesita conservarse de una llamada de una aplicación a otra.

intercambio de datos dinámicos (DDE). Intercambio de datos entre programas o entre un programa y un objeto dearchivo de datos. Cualquier cambio efectuado en la información de un programa o una sesión se aplica a los datosidénticos creados por el otro programa. Véase también conversación DDE, cliente DDE y servidor DDE.

interfaz de programación de aplicaciones (API). Interfaz funcional suministrada por el sistema operativo o unprograma bajo licencia que se solicita por separado, que permite que un programa de aplicación escrito en unlenguaje de alto nivel pueda utilizar datos o funciones específicas del sistema operativo o del programa bajo licencia.

interfaz de usuario gráfica (GUI). Tipo de interfaz de usuario que proporciona las ventajas de los gráficos de altaresolución. Una interfaz gráfica de usuario incluye una combinación de gráficos, el paradigma de acción de objeto, eluso de dispositivos de puntero, barras de menú y otros menús, solapamiento de ventanas e iconos.

Interfaz Nativa de Java (JNI). Interfaz de programación que permite al código Java que se ejecuta dentro de unaMáquina Virtual Java (JVM) interoperar con las funciones escritas en otros lenguajes de programación.

IPF. Recurso de Presentación de Información.

JJava. Lenguaje de programación orientado a objeto para código interpretado portátil que soporta la interacción entreobjetos remotos. Java y sus especificaciones han sido desarrolladas por Sun Microsystems, Incorporated.

604 VisualAge RPG Consulta del lenguaje

Page 627: RPG Referencia

JavaBeans. En Java, un modelo de componente reutilizable, portátil e independiente de la plataforma.

Java Runtime Environment (JRE). Subconjunto del Kit de desarrollo Java para los usuarios finales y desarrolladoresque deseen redistribuir el JRE. El JRE consiste en la Máquina Virtual Java, las Clases de Núcleo de Java y los archivosde soporte.

Java 2 Software Development Kit (J2SDK). Software que distribuye Sun Microsystems a los desarrolladores deJava. Este software incluye el intérprete Java, clases Java y herramientas de desarrollo Java. Las herramientas dedesarrollo incluyen un compilador, un depurador, un desensamblador, un AppletViewer, un generador de archivos deapéndice y un generador de documentación.

juego de caracteres de doble byte (DBCS). Juego de caracteres en el que cada carácter se representa mediante 2bytes. Algunos idiomas como el japonés, el chino o el coreano, que contienen más símbolos de los que puedenrepresentarse mediante los 256 puntos de código, necesitan el juego de caracteres de doble byte. Puesto que cadacarácter necesita 2 bytes, la escritura, la visualización y la impresión de caracteres DBCS necesita hardware yprogramas que soporten DBCS. El sistema soporta cuatro juegos de caracteres de doble byte: japonés, coreano, chinosimplificado y chino tradicional. Compárese con juego de caracteres de un solo byte (SBCS).

juego de caracteres de un solo byte (SBCS). Juego de caracteres en el que cada carácter se representa mediante unbyte. Compárese con juego de caracteres de doble byte (DBCS).

Llínea de ejecución. La unidad más pequeña de operación que puede efectuarse dentro de un proceso.

lista desplegable. Campo de una sola selección en el que sólo puede verse la opción actual. Las demás opcionespermanecen ocultas hasta que el usuario realiza una acción específica para visualiza el recuadro de lista que lascontiene.

lugar de trabajo. Área que ocupa toda la pantalla y contiene todos los objetos que componen la interfaz del usuario.

MMáquina Virtual Java (JVM). La parte del Java Runtime Environment (JRE) responsable de interpretar bytecodes deJava.

marcador de grupo. Marcador que identifica un componente como el primero de un grupo. Cuando el usuariodesplaza el cursor por un grupo de componentes y llega al último, el cursor vuelve a la primera parte del grupo.

mensaje. (1) Información no solicitada por un usuario pero visualizada por un producto como respuesta a unevento no esperado o cuando se produce algo no deseado. (2) Comunicación enviada por una persona o unprograma a otra persona u otro programa.

menú. Lista de opciones que pueden aplicarse a un objeto. Un menú puede contener opciones que no esténdisponibles para ser seleccionadas en determinados contextos. Estas opciones están atenuadas.

menú desplegable. Menú que aparece al seleccionar una opción en una barra de menú o a partir del símbolo delmenú del sistema. Las opciones de un menú desplegable están relacionadas entre sí.

menú emergente. Menú que, cuando se solicita, aparece junto al objeto con el que está asociado. Contiene opcionesadecuadas para el objeto en su contexto actual.

MID. Extensión de archivo de un archivo MIDI.

migrar. (1) Mover a un sistema operativo modificado, generalmente a un nuevo release o versión de un sistema. (2)Mover datos desde una jerarquía de almacenamiento a otra.

módulo EXE. Un módulo EXE consta de un procedimiento principal y subprocedimientos. Se crea cuando la palabraclave EXE está presente en la especificación de control. Todas las subrutinas (BEGSR) deben ser locales a unprocedimiento. El EXE debe contener un procedimiento cuyo nombre coincida con el nombre del archivo fuente. Esteserá el punto de entrada principal para el EXE; es decir, el procedimiento principal.

Glosario 605

Page 628: RPG Referencia

módulo NOMAIN. Módulo que contiene solamente subprocedimientos. No contiene ninguna acción o subrutina deusuario autónoma. Un módulo NOMAIN se crea cuando la palabra clave NOMAIN se encuentra en la especificaciónde control.

Nnemotécnico. Un solo carácter, dentro del texto de una opción, identificado por un subrayado debajo de él. Véasetambién selección nemotécnica.

nivel del graduador. Indicador visual en el graduador que un usuario puede mover para modificar el valornumérico.

Oobjeto. (1) Espacio de almacenamiento con nombre que consiste en un conjunto de características que describen elespacio de almacenamiento en sí y, en algunos casos, datos. Un objeto es algo que existe en el almacenamiento yocupa 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 puedeefectuar una tarea. Un objeto puede aparecer como texto o como un icono.

objeto de datos. Objeto que transporta información, como texto, gráficos, audio o vídeo.

Ppaleta de colores. Conjunto de colores que puede utilizarse para cambiar el color de cualquier componente en laGUI de la aplicación.

paleta de componentes. El grupo de componentes más adecuado para construir la interfaz gráfica de usuario actualpara una aplicación. Cuando finaliza la GUI, puede vaciar la paleta y añadir los componentes del catálogo decomponentes que necesite para la siguiente aplicación.

paleta de fonts. Conjunto de fonts que puede utilizarse para cambiar el font de un componente en la GUI de laaplicación.

panel de navegación. Grupo de botones que se pueden utilizar para controlar la selección visible de registros en unsubarchivo.

paquete. Función utilizada para reunir todos los componentes de una aplicación VARPG para su distribución.

paradigma acción-objeto. Patrón de interacción en el que un usuario selecciona un objeto y a continuaciónselecciona una acción para aplicarla a ese objeto.

procedimiento. Un procedimiento es cualquier parte del código a la que pueda llamarse mediante la operaciónCALLP.

procedimiento principal. Un procedimiento principal es un subprocedimiento que puede especificarse comoprocedimiento de entrada del programa y que recibe el control cuando se le llama por primera vez. El procedimientoprincipal sólo se genera cuando se crea un EXE. Consulte módulo EXE

programación orientada a objetos. Método para estructurar programas como clases organizadas jerárquicamenteque 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 dinámico (DLL).

programa objeto. Programa destino adecuado para ser ejecutado. Un programa objeto puede o no necesitar enlace.(T)

prototipo. Definición de la interfaz de llamada. Incluye información como, por ejemplo, si la llamada está enlazada(procedimiento) o es dinámica (programa), el nombre externo, el número y la naturaleza de los parámetros, quéparámetros deben ser pasados y el tipo de datos de cualquier valor de retorno (para un procedimiento)

606 VisualAge RPG Consulta del lenguaje

Page 629: RPG Referencia

proyecto. Conjunto de datos y acciones completo necesarios para construir un destino único, como una biblioteca deenlace dinámico (DLL) o un archivo ejecutable (EXE).

pulsar. Pulsar y liberar un botón del ratón sin mover el puntero fuera de la opción o del objeto. Véase también doblepulsación.

puntero del ratón. Sinónimo de cursor.

PWS. Estación de trabajo programable.

Rratón. Dispositivo con uno o más pulsadores que se utilizan para colocar un puntero en la pantalla sin usar elteclado. Se utiliza para seleccionar una opción o una función que se ha de efectuar o para llevar a cabo operacionesen la pantalla, como dibujar líneas y arrastrarlas de una posición a otra.

recuadro de combinación. Control que combina las funciones de un campo de entrada y de un recuadro de lista.Un recuadro de combinación contiene una lista de objetos por los que el usuario puede desplazarse y seleccionarpara completar el campo de entrada. Si lo desea, el usuario también puede escribir texto directamente en el campo deentrada. En VisualAge RPG, se señala y pulsa un componente recuadro de combinación de la paleta de componenteso del catálogo de componentes y se suelta en una ventana de diseño.

recuadro de combinación desplegable. Tipo de recuadro de combinación en la que un recuadro de lista está ocultohasta que un usuario realiza una acción específica para visualizarlo.

Recurso de Presentación de Información (IPF). Herramienta utilizada para crear ayuda en línea en una estación detrabajo programable.

resaltado de símbolos. Mejora la legibilidad del código. Puede configurar el resaltado de diferentes elementos dellenguaje con diferentes colores o fonts para identificar las estructuras del programa. Puede activar o desactivar elresaltado de símbolos.

SSBCS. Juego de caracteres de un solo byte.

sección fuente principal. En un programa VARPG, la sección que contiene todas las definiciones globales para unmódulo. Para un componente lógico, esta sección también incluye la acción y las subrutinas de usuario.

selección nemotécnica. Método de selección en el que un usuario selecciona una opción tecleando el nemotécnicode esa opción.

señalar y pulsar. (1) Método de selección que se utiliza para copiar un componente de la paleta o el catálogo decomponentes en la ventana de diseño, la vista de iconos o la vista de árbol de la GUI. (2) Para colocar uncomponente en cualquiera de las vistas, señale y pulse el componente; después, mueva el cursor a la ventana elegiday señale y suelte el componente donde desea que aparezca. En las vistas de iconos y de árbol, el componente secolocará en el componente padre, y tendrá que moverlo al lugar donde le interese que aparezca en la ventana dediseño.

servidor. Sistema de una red que maneja las peticiones de otro sistema, llamado cliente.

servidor DDE. Aplicación que proporciona datos a otra aplicación habilitada por DDE. Compárese con cliente DDE.Véase también conversación DDE.

sistema operativo. Grupo de programas del sistema que controlan la operación general de un sistema.

solicitud. (1) Mensaje visual o audible enviado por un programa para solicitar la respuesta de un usuario. (T) (2)Símbolo o mensaje que se visualiza para solicitar una entrada del usuario o proporcionar información operativa. Elusuario debe responder a la solicitud para poder proseguir.

SSL. Capa de Sockets Segura.

Glosario 607

Page 630: RPG Referencia

submenú. Menú que aparece al seleccionar una opción en cascada en otro menú y que contiene opcionesrelacionadas con dicho menú. Los submenús se utilizan para reducir la longitud de un menú desplegable o de unmenú emergente. Véase también componente submenú.

subprocedimiento. Procedimiento especificado después de la sección fuente principal. Debe tener un prototipocorrespondiente en las especificaciones de definición de la sección fuente principal.

subrutina de acción. Lógica que escribe para responder a un evento específico.

Ttema. En intercambio de datos dinámico (DDE), el juego de datos que es el sujeto de una conversación DDE.

tope de tabulador. Atributo utilizado para establecer un tope de tabulador para un componente, de modo que losusuarios puedan colocar el foco en el mismo cuando utilicen la tecla tabuladora para moverse por la interfaz.

Vvalor por omisión. Valor que el sistema o un programa proporciona o presupone automáticamente cuando elusuario no especifica ninguno. El valor por omisión puede asignarse a un pulsador o a un pulsador gráfico.

ventana activa. Ventana con la que un usuario interactúa actualmente. Esta es la ventana que recibe la entrada delteclado.

ventana de diseño. Ventana en el diseñador GUI en la que se colocan componentes para crear una interfaz deusuario.

ventana emergente. Ventana movible, de tamaño fijo, en la que un usuario proporciona información necesaria parauna aplicación de manera que puede continuar procesando una petición de usuario. Sinónimo 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 interacción principal entre el usuario y la aplicación. Sinónimo deventana principal.

ventana principal. Véase ventana primaria.

ventana secundaria. Ventana que contiene información que depende de la información de una ventana primaria yse utiliza para complementar la interacción en dicha ventana. Véase también ventana primaria. Sinónimo de ventanaemergente.

vista de árbol. Visualización del contenido de un objeto de manera jerárquica.

vista de detalles. Vista de contenido estándar en la que un icono pequeño se combina con texto para proporcionarinformación descriptiva sobre un objeto.

vista de iconos. Vista de contenido estándar en la que cada objeto contenido en un contenedor se visualiza como unicono.

WWAV. Extensión de archivo de un archivo de ondas.

608 VisualAge RPG Consulta del lenguaje

Page 631: RPG Referencia

Bibliografía

Para obtener información adicional sobre temas relacionados con VisualAge RPG yCODE (Cooperative Development Environment) para AS/400, consulte lassiguientes publicaciones de IBM:

Manuales de WebSphere Development Tools para AS/400:

*Nota: Se han actualizado todas las versiones en línea de las publicaciones deWebSphere Development Tools para AS/400. Las publicaciones cuyonúmero de pedido está marcado con un asterisco (*) no se han vuelto aimprimir en este release.

v Iniciación a VisualAge RPG y CODE/400, SC10-3287-01 (SC09-2625-01),proporciona información sobre WebSphere Development Tools para AS/400,dando una visión general de las características de CODE/400 y VARPG, decómo funcionan juntas y de las ventajas empresariales que se obtienen alutilizarlas.

Manuales de VisualAge RPG:v Iniciación 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 utilizaVisualAge RPG.

v VisualAge RPG Manual de consulta del lenguaje, SC10-3066-01 (SC09-2451-01)*,proporciona información de consulta sobre el lenguaje y el compilador deVARPG.

v VisualAge RPG Manual de consulta de componentes, SC10-3065-02 (SC09-2450-02)*,proporciona una descripción 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 conVisualAge RPG.

v Programación con VisualAge para RPG, SC10-3067-02 (SC09-2449-02)*, contieneinformación específica sobre cómo crear aplicaciones con VisualAge RPG.Describe los pasos que debe seguir en cada fase del ciclo de desarrollo de laaplicación, desde el diseño hasta el empaquetado y la distribución. Se incluyenejemplos de programación para clarificar los conceptos y el proceso dedesarrollo de aplicaciones VARPG.

v Java for RPG Programmers es una introducción al lenguaje Java (y RPG IV)mediante la comparación con el lenguaje RPG. Se trata de un comienzo muyapropiado en el mundo de Java. También incluye una guía de aprendizajeinteractiva en formato CD sobre Java y VisualAge para Java, mediante MINDQ.

v Experience RPG IV Tutorial es una guía de aprendizaje interactiva en formato CDque enseña RPG IV e ILE, paso a paso y de un modo divertido. Se trata de unmanual con preguntas y ejercicios que ayudan a adquirir experiencia prácticacon esta nueva y apasionante versión de RPG.

v Otra publicación que no es de IBM interesante para los usuarios de VisualAgeRPG es VisualAge for RPG by Example.

Información y publicaciones del AS/400:v Si tiene acceso a Internet, puede obtener otra información 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 609

Page 632: RPG Referencia

Para obtener una versión en copia software de las publicaciones de AS/400,consulte la publicación 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 Introducción y guía de

planificacion, GC10-9401-00 (GC09-1807-00), describe los conceptos básicos y laplanificación necesaria para hacer un uso efectivo de la función Gestor para elDesarrollo de Aplicaciones ADM.

v ADTS/400: Gestor para el Desarrollo de Aplicaciones ADM Guía del Usuario,SC10-9609-01 (SC09-2133-01), describe cómo crear y gestionar proyectosdefinidos para la función Gestor para el Desarrollo de Aplicaciones ADM.

v ADTS/400: Gestor para el Desarrollo de Aplicaciones ADM Guía de autoaprendizaje,SC10-9610-00 (SC09-2138-00), proporciona experiencia práctica en la utilizaciónde la función Gestor para el Desarrollo de Aplicaciones ADM del productoADTS para OS/400. Esta guía muestra cómo utilizar la característica de Gestorpara el Desarrollo de Aplicaciones ADM guiándole a través de una serie deejercicios paso a paso.

v ADTS/400: Application Development Manager API Reference, SC09-2180-00, describecómo los programadores de aplicaciones pueden escribir su propia interfaz parala función Gestor para el Desarrollo de Aplicaciones ADM.

Manual Recurso de presentación de información:v Information Presentation Facility Programming Guide G25H-7110, describe los

elementos que componen el IPF (Recurso de presentación de información). IPFes una herramienta que soporta el diseño y el desarrollo de documentos en líneay de recursos de ayuda en línea.

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 lainformación necesaria para utilizar y administrar el producto DB2.

v DB2 Universal Database Embedded SQL Programming Guide S10J-8158, describecómo diseñar y codificar programas de aplicación para acceder a los servidoresde la familia DB2 Client/Server (como DB2 o DB2/400). Contiene informacióndetallada sobre la utilización del SQL (Lenguaje de Consulta Estructurada) yllamadas API en aplicaciones.

610 VisualAge RPG Consulta del lenguaje

Page 633: RPG Referencia

Avisos

Esta información se ha elaborado para productos y servicios que se ofrecen enEstados Unidos. Es posible que IBM no ofrezca todos los productos, servicios ocaracterísticas que se tratan en este documento en otros países. Consulte con elrepresentante local de IBM para obtener información sobre los productos yservicios que están disponibles en su área en la actualidad. Ninguna referenciahecha en esta publicación a un producto, programa o servicio de IBM pretendeafirmar ni implicar que sólo pueda utilizarse dicho producto, programa o serviciode IBM. Puede utilizarse cualquier producto, programa o servicio funcionalmenteequivalente y que no infrinja ninguno de los derechos de propiedad intelectual deIBM. Sin embargo, es responsabilidad del usuario evaluar y verificar elfuncionamiento de los productos, programas o servicios que no sean de IBM.

IBM puede tener patentes o solicitudes de patente pendientes acerca del tema deeste documento. La entrega de este documento no le otorga ninguna licencia sobreestas patentes. Puede enviar consultas sobre licencias, por escrito, a:

Director of LicensingIntellectual Property & LicensingInternational Business Machines CorporationNorth Castle Drive, MD - NC119Armonk, New York 10504-1785Estados Unidos

El siguiente párrafo no es aplicable en el Reino Unido ni en ningún otro paísdonde tales estipulaciones sean contradictorias con la legislación local:INTERNATIONAL BUSINESS MACHINES CORPORATION PROPORCIONAESTA PUBLICACIÓN “ TAL CUAL”, SIN NINGÚN TIPO DE GARANTÍA,EXPLÍCITA O IMPLÍCITA, INCLUYENDO, PERO SIN LIMITARSE A, LASGARANTÍAS IMPLÍCITAS DE NO VULNERACIÓN, COMERCIALIZACIÓN EIDONEIDAD PARA UNA FINALIDAD DETERMINADA. En determinados paísesno se permite la declaración de limitación de responsabilidad de las garantíasexpresas ni implícitas en determinadas transacciones, por lo tanto, esta declaraciónpuede no ser procedente en su caso.

Esta información puede contener inexactitudes técnicas o errores tipográficos. Seefectúan cambios periódicos en la información contenida en este documento; talescambios se incorporarán en nuevas ediciones de la publicación. IBM puede hacermejoras y/o modificaciones en los productos y/o programas descritos en estapublicación en cualquier momento sin previo aviso.

Las referencias hechas en esta información a páginas Web de terceros seproporcionan sólo como gentileza para los usuarios y de ninguna manera puedeinterpretarse que IBM avala esas páginas Web. El material de estas páginas Web noforma parte del material para este producto de IBM y el usuario será el únicoresponsable del uso de estas ubicaciones Web.

Los poseedores de una licencia de este programa que deseen obtener informaciónal respecto con el fin de permitir: (i) el intercambio de información entreprogramas creados de manera independiente y otros programas (incluido éste) y(ii) la utilización mutua de la información que se ha intercambiado, deben ponerseen contacto con IBM en la siguiente dirección:

© Copyright IBM Corp. 1994, 2000 611

Page 634: RPG Referencia

IBM Canada Ltd.Department 0711150 Eglinton Avenue EastToronto, Ontario M3C 1H7Canadá

Dicha información puede estar disponible, sujeta a los términos y condicionescorrespondientes e incluye, en algunos casos, el pago de una cuota.

IBM proporciona el programa bajo licencia descrito en esta información y todo elmaterial bajo licencia disponible para él según los términos del Contrato de ClienteIBM, Contrato de Licencia de Programa Internacional IBM o cualquier contratoequivalente entre IBM y el cliente.

Información de interfaz de programaciónEsta publicación documenta la interfaz de programación de uso general y lainformación de guía asociada que proporciona VisualAge RPG y CODE/400.

Esta publicación pretende ayudarle a crear aplicaciones VisualAge RPG utilizandocódigo fuente RPG IV. Esta publicación documenta la interfaz de programación deuso general y la información de guía asociada que proporciona el compiladorVisualAge RPG.

Las interfaces de programación de uso general permiten a los usuarios escribirprogramas que obtengan los servicios del compilador VisualAge RPG.

Marcas registradas y marcas de servicioLos siguientes términos son marcas registradas de International Business MachinesCorporation en Estados Unidos, otros países o ambos:

Application System/400 AS/400 Common User AccessCUA DATABASE 2 DB2DB2/400 DB2/6000 IBMIBMLink ILE Entorno de Lenguajes

IntegradoOS/400 PROFS SQL/DSSQL/400 VisualAge 400

Java y todas las marcas registradas derivadas de Java son marcas registradas deSun Microsystems, Inc. en Estados Unidos y/u otros países.

ActiveX, Microsoft, Windows y Windows NT son marcas registradas de MicrosoftCorporation en Estados Unidos, otros países o ambos.

Otros nombres de compañías, productos y servicios pueden ser marcas registradaso marcas de servicio de terceros.

612 VisualAge RPG Consulta del lenguaje

Page 635: RPG Referencia

Índice

CaracteresEspeciales%ABS 313%ADDR 314%CHAR 316%DEC 317%DECPOS 318%DECH 318%DIV 319%EDITC 319%EDITFLT 321%EDITW 322%ELEM 322%EOF 323%EQUAL 324%ERROR 325/ EXEC SQL BEGIN DECLARE 77/ EXEC SQL INCLUDE SQLCA 75/ EXEC SQL WHENEVER 76%FLOAT 325%FOUND 326%GETATR 327%GRAPH 328%INT 329%INTH 330%LEN 330%OPEN 333%PADDR 333%REPLACE 334, 335%SCAN 337%SETATR 337%SIZE 338%STATUS 339%STR 341%SUBST 343%TRIM 345%TRIML 345%TRIMR 346%UCS2 346%UNS 347%UNSH 348%XFOOT 348*ABORT 142, 589*ALL 301*ALL’x..’ 142*ALLG’K1K2’ 142*ALLU’XxxxYyyy’ 142*ALLX’x1..’ 142*BLACK 142, 589*BLANK/*BLANKS 142*BLUE 142, 589*BROWN 142, 589*CANCEL 142, 589*CANCL 44, 56/COPY, sentencia 9*CYAN 142, 589*CYMD, formato 114*DARKBLUE 142, 589*DARKCYAN 142, 589*DARKGRAY 142, 589

*DARKGREEN 142, 589*DARKPINK 142, 589*DARKRED 142, 589*DATE 294, 295*DAY 294, 295*DEFAULT 44, 56/DEFINE 11*DTAARA DEFINE 589/EJECT 14/ELSE 13/ELSEIF, expresión de la condición 12*END 589*ENDAPPL 44, 56*ENDCOMP 44, 56/ENDIF 13*ENTER 142, 589/EOF 14/EOF, consejos

directiva /EOF 14*GREEN 142, 589*HALT 142, 589*HIVAL 142/IF, expresión de la condición 12*IGNORE 142, 589*IN 25, 294, 296*IN(xx) 294, 296*INFO 142, 589*INIT 49*INxx 25, 294, 296*INZSR 29, 187*LONGJUL, formato 114*LOVAL 142*MONTH 294, 295*NOBUTTON 142, 589*NODEFAULT 44, 56*NULL 142*OK 142*ON/*OFF 142*PALEGRAY 142, 589*PARMS 48*PINK 142, 589*PLACE 294, 295, 302*PROC 48*PSSR 32, 54, 56*RED 142, 589*RETRY 142, 589*ROUTINE 48, 49/SPACE 14*START 589*STATUS 48*TERM 49*TERMSR 32/TITLE 15/UNDEFINE 11*WARN 142, 589*WHITE 142, 589*YEAR 294, 295*YELLOW 142, 589*YESBUTTON 142, 589*ZERO/*ZEROS 142

AACQ, no soportado en VARPG 595activar los bits (BITON) 401actualización

archivo 215actualización del área de datos 505ADD, código de operación 367, 392ADDDUR, código de operación 377, 393adición de registros 216, 291, 301ALIGN 237ALIGN, palabra clave

alineación de subcampos 148alineación

campos sin signo 121alineación, campos enteros 119alineación, campos flotantes 118almacenamiento automático 230almacenamiento estático 230ALT 238ALTSEQ 593ALWNULL 202ALLOC (asignar almacenamiento), código

de operación 382ALLOC, código de operación 395ámbito

de definiciones 62, 228subrutina *PSSR 65

ampliador de operación 283AN 282AND 291AND, relación

especificaciones de entrada 271AND/OR

especificaciones de entrada 271ANDxx, código de operación 375, 390,

396añadir duraciones de fecha-hora 378añadir factores

ADD (ADD) 392ADDDUR (Añadir duración) 393

archivoactualización 215archivo controlado en cálculo 216archivo DISK 218archivo PRINTER 218archivo SPECIAL 218bloqueo de archivos AS/400 85clase 215combinado 215entrada 215estados de bloqueo 86formato 217matriz 215salida 215tabla 215

archivo combinado 215archivo controlado en cálculo

clase de archivo 215descripción de 216

archivo de impresoradescrito por programa 290

© Copyright IBM Corp. 1994, 2000 613

Page 636: RPG Referencia

archivo de impresora (continuación)espacio y saltar 293especificaciones de descripción de

archivo 218especificar nombre de archivo de

salida 290especificar relación lógica 291indicadores de salida 294registros de excepción 291reglas 87restricciones 87

archivo descrito externamenteadición de registros 301definición 96edición 185especificaciones de salida para 300formato de archivo 217indicador de identificación de

registro 277indicadores de campo 278indicadores de salida 301longitud de registro 217nombre de campo 301nombre de campo externo 277nombre de registro 277nombre EXCEPT 301posiciones 17-20 277posiciones 23-80 277posiciones 31-48 278posiciones 63-64 278posiciones 65-66 278posiciones 67-68 278posiciones 7-20 277posiciones 75-80 279restauración de campos 302tipo 300tipo de formulario 276valores de clave 218

archivo descrito por programa*IN, *INxx, *IN(xx) 296*PLACE 295adición/supresión de registros 291blanco después 296carácter 271códigos de edición 296códigos de identificación de

registro 269componente de código 270constante 298, 299dígito 271espacio y saltar 293especificaciones de salida 290especificar en especificaciones de

salida 290fecha/hora 298, 299formato de archivo 217formato de datos 273formato de datos de fecha/hora 97formato de datos numéricos 96formato de fecha/hora externo 272identificación de registro 290indicador de identificación de

registro 269indicadores 269indicadores de campo 276indicadores de salida 294longitud de registro 217

archivo descrito por programa(continuación)

longitud de registro lógico 217no 270nombre de archivo 268nombre de campo 274nombre EXCEPT 292numeración de páginas 295número 269opción 269palabra de edición 298, 299palabras reservadas de fecha de

usuario 295posición 270posición final 296posiciones 63-64 275posiciones 65-66 275posiciones decimales 274registros de excepción 291relación de registro de campo 275relación lógica 268restauración de campos 302secuencia 269separador fecha/hora 272tipo de formulario 268ubicación de campo 273

archivo diskbloqueo de archivos 85bloqueo de registros 86coma flotante 85COMMIT, palabra clave 84compartir la vía de acceso de datos

abierta 82comprobación de nivel 85control de compromiso 84conversiones de datos 82descripción general 81descrito por programa 290especificaciones de descripción de

archivo 218especificar nombre de archivo de

salida 290especificar relación lógica 291estados de bloqueo 86registros de excepción 291

archivo especialdescripción general 87descrito por programa 290ejemplos 87especificaciones de descripción de

archivo 218especificar nombre de archivo de

salida 290especificar relación lógica 291registros de excepción 291utilizar el cuaderno Construir 87

archivos de direcciones de registros 591archivos de índices 591archivos DISK 213archivos PRINTER 213archivos SPECIAL 213archivos WORKSTN 592área de datos, códigos de operaciones

de 376DEFINE (Definición de campo) 428UNLOCK (Desbloquear un área de

datos) 556

áreas de datos 589DEFINE (Definición de campo) 428descripción general 147

ASCEND 238, 593ASCII 582

utilización de matrices 590utilización de tablas 590

asignar almacenamiento 395atributos

%GETATR 327%SETATR 337establecer atributos 337recuperar atributos 327

BBASED 238BEGACT 595BEGACT, código de operación 391, 392,

397BEGSR, código de operación 391, 400bibliografía 609bit, códigos de operaciones 371BITOFF, código de operación 371, 400BITON, código de operación 371, 401bits, comprobar 371, 551BLOCK, palabra clave 220buscar en una matriz 466buscar en una tabla 466búsqueda de series 527

Ccabeceras del listado del compilador 15CABxx, código de operación 372, 375,

402CACHE 203CACHEREFRESH 203calcular duraciones de fechas 378cálculo de una duración 543CALL, código de operación 372, 404CALLB, código de operación 372, 407CALLP, código de operación 372, 408campo de datos de hora 126

información general 126campo de datos de indicación de la

hora 128campo de entrada

ubicación 273campos, con posibilidad de nulos 128campos de longitud variable 84, 134campos de longitud variable,

utilización 109campos numéricos

edición 173formato 95

carácter de finalización de supresión deceros

en el cuerpo de la palabra deedición 182

CASxx, código de operación 375, 391,409

CAT, código de operación 389, 411CCSID 82, 203, 239CCSID, valores soportados 585Ciclo RPG, no soportado en VisualAge

RPG 587

614 VisualAge RPG Consulta del lenguaje

Page 637: RPG Referencia

clasificación de matrices 539CLASS 239clave 218

para tipo de direcciones deregistros 218

clave, campos con posibilidad de nulospor 131

claves compuestas 463CLEAR, código de operación 187, 382,

422CLOSE, código de operación 380, 424CLSWIN 595CLSWIN, código de operación 392, 424CLTPGM 240codificación de subrutinas de

usuario 450código de operación COMP

(comparar) 426código de operación IFxx

(si/entonces) 458código de operación MHHZO, no

soportado en VARPG 590código de operación MHLZO, no

soportado en VARPG 590código de operación MLLZO, no

soportado en VARPG 590código de operación si/entonces

(IF) 458códigos de edición 590códigos de edición simples 174códigos de estado, archivo 46códigos de estado, componente

lógico 55códigos de estado, programa 51códigos de estado de archivo 46códigos de estado de programa 51códigos de operación de VARPG 392COMMIT, código de operación 380, 425COMMIT, palabra clave 221COMP, código de operación 375comparación, códigos de operaciones

de 375COMP (Comparar) 426

comparar bitsTESTB (Comprobar bit) 551

comparar y bifurcar (CABxx) 402componentes lógicos

*INZSR 29*TERMSR 30inicializar 29iniciar y detener 29terminación anormal 32terminación normal 30terminar 30

componentes lógicos primarios 29componentes lógicos secundarios 29comprobación, operaciones de 392

información general 392TEST (Comprobar

fecha/hora/indicación de lahora) 392

TEST (Comprobarfecha/hora/indicación de la hora),código de operación 549

TESTB (Comprobar bit) 392, 551TESTN (Comprobar numérico) 392,

553

comprobación, operaciones de 392(continuación)

TESTZ (Comprobar zona) 392, 554comprobar bits 371, 551concatenar dos series (CAT) 411condicionales, expresiones 12condicionamiento de la salida 291

utilizar indicadores 24consideraciones para formatos

numéricos 122CONST 240constantes

con nombre 141descripción general 139normas para constantes con

nombres 142reglas para utilizar en especificaciones

de salida 299constantes con nombre 141

reglas 142constantes figurativas 589

*ABORT 589*ALL’x..’ ., *ALLX’x1..’ 142*BLACK 589*BLANK/*BLANKS 142*BLUE 589*BROWN 589*CANCEL 589*CYAN 589*DARKBLUE 589*DARKCYAN 589*DARKGRAY 589*DARKGREEN 589*DARKPINK 589*DARKRED 589*END 589*ENTER 589*GREEN 589*HALT 589*HIVAL/*LOVAL 142*IGNORE 589*INFO 589*NOBUTTON 589*ON/*OFF 142*PALEGRAY 589*PINK 589*RED 589*RETRY 589*START 589*WARN 589*WHITE 589*YELLOW 589*YESBUTTON 589*ZERO/*ZEROS 142reglas 144

control de entrada y salida 192conversión de caracteres en un campo de

fecha 387conversiones de ASCII a EBCDIC 82conversiones de datos 82convertir, formato decimal

empaquetado 317convertir, formato decimal empaquetado

(redondeo) 318convertir a datos de tipo carácter, función

incorporada 316COPYNEST 204

COPYRIGHT 204CTDATA 241CURSYM 174, 204CVTOEM 204CVTOPT 204

CHCHAIN, código de operación 380, 414CHECK, código de operación 389, 417CHECKR, código de operación 389, 419

Ddar formato a campos 295dar formato a campos para salida 294,

295DATEDIT 205DATFMT 205, 241DATFMT, palabra clave 221datos de fecha 112datos de tipo carácter 82DEALLOC, código de operación 426DEALLOC (liberar almacenamiento),

código de operación 382DEBUG 205DECEDIT 174, 206DECPOS

ejemplo 331DEFINE, código de operación 379, 428definición de datos 192definición de entrada 192definición de interfaz de procedimiento

definición 61, 70, 303definición de salida 192definición de un archivo 192definición de un campo basada en

atributos 428definición de un campo como un área de

datos 428definir con palabra clave LIKE

subcampos 148definir indicadores 17definir partes de una clave 462DELETE, código de operación 380, 431desactivar los bits (BITOFF) 400desbloquear un área de datos o un

registro 556DESCEND 241, 593descripción de matrices 192descripción de tablas 192detener componentes lógicos 29devolver resultado

como indicador resultante 19devolver una serie 343DIM 242directiva condicional de compilación

/ELSE 13/ELSEIF, expresión de la

condición 12/ENDIF 13/EOF 14/IF, expresión de la condición 12/UNDEFINE 11

directivas del compilador/COPY 9, 588/EJECT 14

Índice 615

Page 638: RPG Referencia

directivas del compilador (continuación)/SPACE 14/TITLE 15comparación de las directivas del

compilador ILE RPG conVARPG 588

DIV, código de operación 367, 432división de factores 432DLL 242Do, código de operación 390, 433DOU, código de operación 375, 380, 390,

435DOUxx, código de operación 375, 390,

436DOW, código de operación 375, 380,

390, 438DOWxx, código de operación 375, 390,

439DSPLY 595DSPLY, código de operación 384, 392,

441DTAARA 242, 593DUMP, no soportado en VARPG 595

EEBCDIC 579edición de archivos descritos

externamente 185edición de campos numéricos 173edición de números decimales 206edición de salida 296EDITW

ejemplo 322ejecutar programas 201ejemplo de editc 320ELSE, código de operación 390, 443empezar subrutina de acción

(BEGACT) 397empezar subrutina de usuario

(BEGSR) 400ENDACT 51, 595ENDACT, código de operación 391, 392,

444ENDSR, código de operación 391, 445ENDyy 443ENDyy, código de operación 390ENDyy (finalizar un grupo), código de

operación 443entero, formato 118

alineación de campos 148enteros, aritmética 369entrada

archivo 215entrada, campos con posibilidad de

nulos 130entrada de inicio/fin en especificación de

procedimiento 305entrada de ubicación de campo

(especificaciones de entrada) 273para archivo descrito por

programa 273entradas comunes a todas las

especificaciones 194espacio para un archivo de

impresora 293especificación de procedimiento

entrada de inicio/fin 305

especificación de procedimiento(continuación)

general 303nombre 305palabras clave 305tipo de formulario 304

especificacionescontrol 590definición 593descripción de archivo 591entrada 594especificación de control 192especificación de descripción de

archivo 192especificaciones de cálculo 192especificaciones de definición 192especificaciones de entrada 192especificaciones de salida 192información general 192orden 192reglas de continuación 195tipos 192

especificaciones de cálculoampliador de operación 283AND/OR 282campo de resultado 284descripción general 281factor 1 283factor 2 284factor 2 ampliado 281indicadores 282indicadores resultantes 285información general 192línea de continuación 281longitud de campo 285nivel de control 282operación y ampliador 283posiciones decimales 285reglas de continuación 198SR 282tipo de formulario 282

especificaciones de controlALWNULL 202CACHE 203CACHEREFRESH 203CCSID 203COPYNEST 204COPYRIGHT 204CURSYM 204CVTOEM 204CVTOPT 204DATEDIT 205DATFMT 205DEBUG 205DECEDIT 206ejecutar programas 201EXE 206EXPROPTS 206EXTBININT 206FLTDIV 207generar programas 201GENLVL 207INDENT 207información general 192INTPREC 208LIBLIST 208NOMAIN 208

especificaciones de control (continuación)OPTION 208reglas de continuación 197SQLBINDFILE 209SQLDBBLOCKING 210SQLDBNAME 210SQLDTFMT 210SQLISOLATIONLVL 211SQLPACKAGENAME 211SQLPASSWORD 211SQLUSERID 212TIMFMT 212tipo de formulario 201TRUNCNBR 212

especificaciones de definición 227

ALIGN 237ALT 238ASCEND 238BASED 238CCSID 239CLASS 239CLTPGM 240CONST 240CTDATA 241DATFMT 241DESCEND 241descripción externa 232descripción general 227desde posición 234DIM 242DLL 242DTAARA 242EXTFLD 243EXTFMT 243EXTNAME 244EXTPROC 244FROMFILE 247hasta posición/longitud 234información general 192INZ 247LIKE 248LINKAGE 249MSGDATA 250MSGNBR 250MSGTEXT 250MSGTITLE 250nombre 231NOOPT 251NOWAIT 251OCCURS 251OPTIONS 252OVERLAY 257PACKEVEN 259palabras clave 237PERRCD 260posición 43 (reservada) 236posiciones decimales 236PREFIX 260PROCPTR 260reglas de continuación 198STATIC 260STYLE 261TIMFMT 261tipo de datos internos 235tipo de definición 233tipo de estructura de datos 233tipo de formulario 231

616 VisualAge RPG Consulta del lenguaje

Page 639: RPG Referencia

especificaciones de definición 227(continuación)

TOFILE 261VALUE 262VARYING 262

especificaciones de descripción de archivo

adición en archivo 216archivo DISK 218archivo PRINTER 218archivo SPECIAL 218clase de archivo 215descripción de archivo 214descripción general 213dispositivo 218formato de archivo 217información general 192longitud de registro 217nombre de archivo 214posición 19 (reservada) 216posición 21 (Reservada) 217posición 28 (Reservada) 217posición 35 (reservada) 218posición 43 (reservada) 219posiciones 29-33 (Reservadas) 217reglas de continuación 197tipo de archivo 215tipo de direcciones de registros 218tipo de formulario 214

especificaciones de entrada

carácter 271códigos de identificación de

registro 269componente de código 270descripción general 267dígito 271formato de datos 273formato de fecha/hora externo 272indicador de campo 18indicador de identificación de

registro 17, 277indicador de relación de registros de

campos 21indicadores 269indicadores de campo 276información general 192no 270nombre de archivo 268nombre de campo 274nombre de registro 277número 269opción 269posición 270posiciones 17-20 277posiciones 23-80 277posiciones 31-48 278posiciones 63-64 275posiciones 65-66 275posiciones 67-68 278posiciones 7-20 277posiciones 75-80 279posiciones decimales 274relación de registro de campo 275relación lógica 268secuencia 269separador fecha/hora 272ubicación de campo 273

especificaciones de entrada para archivodescrito externamente

indicador de identificación deregistro 277

indicadores de campo 278nombre de campo externo 277nombre de registro 277posiciones 17-20 277posiciones 23-80 277posiciones 31-48 278posiciones 63-64 278posiciones 65-66 278posiciones 67-68 278posiciones 7-20 277posiciones 75-80 279

especificaciones de entrada para archivodescrito por programa

carácter 271códigos de identificación de

registro 269componente de código 270dígito 271formato de datos 273formato de fecha/hora externo 272indicador de identificación de

registro 269indicadores 269indicadores de campo 276no 270nombre de archivo 268nombre de campo 274número 269opción 269posición 270posiciones 63-64 275posiciones 65-66 275posiciones decimales 274relación de registro de campo 275relación lógica 268secuencia 269separador fecha/hora 272ubicación de campo 273

especificaciones de salida*IN, *INxx, *IN(xx) 296*PLACE 295adición de registros 301adición/supresión de registros 291archivos descritos externamente 300blanco después 296códigos de edición 296constante 298, 299dar formato a campos 295dar formato a matrices 295dar formato a tablas 295entradas de control 290espacio antes 293espacio después 293espacio y saltar 293fecha/hora 298, 299formato de datos 297identificación de registro 290indicador de identificación de

registro 291indicadores de salida 294información general 192nombre de archivo 290nombre de campo 294

especificaciones de salida (continuación)nombre de registro 300nombre EXCEPT 292numeración de páginas 295palabra de edición 298palabras reservadas de fecha de

usuario 295posición final 296registros de excepción 291saltar antes 294tipo 291tipo de formulario 290

especificar entrada 267establecer aparición de estructura de

datos 499establecer atributos 337, 531establecer longitud del campo 109establecer valores iniciales 187establecer valores por omisión 187establecimiento de indicadores 382estructura de datos de área de datos

DTAAREA, palabra clave 149DTAAREA DEFINE 149IN, utilización 150OUT, utilización 150UNLOCK, utilización 150

estructura de datos de estado deprograma 48

descripción general 150estructura de datos de información de

archivodescripción general 37INFDS 150información de retorno de

apertura 37, 41información de retorno de

archivo 37, 38información de retorno de

entrada/salida 37, 41información de retorno dependiente

de dispositivo 37, 42estructuras de datos

alineación de 148área de datos 147, 149definición 148descripción general 147DTAARA, palabra clave 149DTAAREA DEFINE 149estado de programa 147, 150IN, utilización 150INFDS 150información de archivo 147, 150OUT, utilización 150recubrimiento del

almacenamiento 148UNLOCK, utilización 150

estructuras de datos como variables dellenguaje principal para SQL 74

estructuras del lenguaje principal paraSQL 75

estructuras para SQL 74EVAL, código de operación 380, 390EVAL (Evaluar) 446EVALR (Evaluar, ajuste por la

derecha) 447evaluación, orden de 364excepciones/errores de programa 48

Índice 617

Page 640: RPG Referencia

EXCEPT, código de operación 380, 448EXE 206EXE, módulo 66EXFMT, no soportado en VARPG 595EXPORT, no soportada en VARPG 593EXPORT, palabra clave

especificación de procedimiento 305exportar un procedimiento 305exportar un programa 305expresiones 380

operadores 351operandos 353resultados intermedios 357

expresiones, orden de evaluación 365expresiones que utilizan códigos de

operaciónDOU (Hacer hasta) 380DOW (Hacer mientras) 380EVAL (Evaluar) 380, 446EVALR (Evaluar, ajuste por la

derecha) 447IF (Si/Entonces) 380información general 380WHEN (Seleccionar cuando sea

verdadero) 380EXPROPTS 206EXSR, código de operación 391, 449EXTBININT 206EXTFILE, palabra clave 221EXTFLD 243EXTFMT 243EXTNAME 244EXTPGM, no soportada en VARPG 593EXTRCT, código de operación 377EXTRCT (Extraer fecha/hora/indicación

de la hora) 452

Ffactor 1

códigos de operacionesaritméticas 367

factor 2códigos de operaciones

aritméticas 367factores de comparación 426factores de sustracción 543fecha, operaciones de resultados

inesperados 379fecha, palabras especiales 7FEOD, código de operación 380, 453flotantes, campos 117FLTDIV 207FOR, código de operación 390, 453FORCE, no soportado en VARPG 595formato binario 115, 274

campo de entrada 274formato de datos interno

definición 95formatos por omisión 96

formato de las palabras de edición 184formato decimal con zona 121, 589formato decimal empaquetado 588formato UCS-2 105formatos de datos 95

especificación de un formato de datosnuméricos 96

formatos de datos 95 (continuación)especificación de un formato externo

de caracteres 97especificación de un formato externo

de fecha u hora 97interno 95

FORMLEN, palabra clave 222forzar fin de los datos (FEOD) 453FROMFILE 247funciones especiales

archivos descritos externamente 6constantes figurativas 5fecha de trabajos 5fecha y hora 4funciones incorporadas 4transferencia de parámetros 6

funciones incorporadas%ABS 313%ADDR 314%CHAR 316%DEC 317%DECPOS 318%DECH 318%DIV 319%EDITC 319%EDITW 322%ELEM 322%EOF 323%EQUAL 324%ERROR 325%FLOAT 325%FOUND 326%GETATR 327%GRAPH 328%INT 329%INTH 330%LEN 330%OPEN 333%PADDR 333%REPLACE 334, 335%SCAN 337%SETATR 337%SIZE 338%STATUS 339%STR 341%SUBST 343%TRIM 345%TRIML 345%TRIMR 346%UCS2 346%UNS 347%UNSH 348%XFOOT 348EDITFLT 321

Ggeneración de un programa 192generar programas 201GENLVL 207GETATR 595GETATR, código de operación 392, 456globales, variables 62, 228glosario 597GOTO, código de operación 372, 457grabación de registros durante el tiempo

de cálculo 448

Hhora del día 554

IIF, código de operación 375, 380, 390,

457IFxx, código de operación 375, 390IGNORE, palabra clave 222IMPORT, no soportada en VARPG 593IN, código de operación 460IN, código de operación (recuperar un

área de datos) 376INCLUDE, palabra clave 222inclusión de campos 301INDENT 207indicador, operaciones de establecimiento

deinformación general 382SETOFF (Desactivar) 382, 537SETON (Activar) 382, 537

indicador de último registro (LR)como indicador de identificación de

registro 269como indicador resultante 19descripción general 21durante errores de evento 56

indicadores 17*IN, *INxx, *IN(xx) 296campo 587Ciclo RPG 587condicionamiento de archivo 587desbordamiento 587en las especificaciones de salida 291identificación de campo 587identificación de registro 587identificadores de registro 587indicadores de salida 301nivel de control 587para archivos de impresora 294relación en las especificaciones de

salida 291resultado 587

indicadores, salida 291indicadores de campo 587

asignar en especificaciones deentrada 18

especificaciones de entrada 276reglas para asignar 19

indicadores de condicionamientocondicionar cálculos 22

indicadores de condicionamiento dearchivo 587

indicadores de desbordamiento 587indicadores de identificación de

registro 291, 587con operaciones de archivo 18descripción general 17en las especificaciones de salida 291indicador de identificación de

registro 291para archivos descritos por

programa 269indicadores de relación de registros de

campodescripción general 21reglas para 21

618 VisualAge RPG Consulta del lenguaje

Page 641: RPG Referencia

indicadores de salida 291, 301indicadores generales 291indicadores identificadores de

campo 587indicadores identificadores de

registro 587indicadores resultantes 587

descripción general 19reglas para asignar 20

INFDS, palabra clave 222información de retorno de apertura

descripción general 41ejemplo 41

información de retorno de archivo*FILE 38*OPCODE 38*RECORD 38*ROUTINE 38*STATUS 38DELETE, utilización 39descripción general 38ejemplo 40EXCEPT, utilización 39palabras clave 38READPE, utilización 39UNLOCK, utilización 39UPDATE, utilización 39

información de retorno de entrada/salidabloqueo 43descripción general 41ejemplo 41

información de retorno específica dedispositivo

bloqueo 43descripción general 42ejemplo 43

INFSR 44, 56INFSR, palabra clave 222inicialización, operaciones de 382

CLEAR (borrar) 422CLEAR, código de operación 382información general 382RESET, código de operación 382RESET (restablecer) 522

inicialización de datos 187inicializar componente lógicos 29inicializar datos 187iniciar componentes lógicos 29insertar registros durante una

compilación 9interlineado del listado del

compilador 14INTPREC 208invocar subrutina condicionalmente

(CASxx) 409invocar subrutina de usuario

(EXSR) 449INZ 247ITER, código de operación 372, 390, 461

Jjerarquización de directivas /COPY 10juego de caracteres

literales 139válidos, caracteres 3

KKFLD, código de operación 379, 462KLIST, código de operación 379, 463

LLEAVE, código de operación 372, 390,

464LEAVESR (abandonar subrutina), código

de operación 465LEN

ejemplo 331liberar almacenamiento 426LIBLIST 208LIKE 248LIKE, palabra clave 148línea de continuación

descripción de archivo 213especificación de cálculo 281especificación de definición 230factor 2 ampliado 287palabras clave de especificación de

control 197palabras clave de especificación de

definición 198palabras clave de especificación de

descripción de archivo 197palabras clave de especificación de

salida 198palabras clave de la especificación de

cálculo 198reglas 195

LINKAGE 249listado del compilador 9literal hexadecimal

descripción general 139literales

carácter 139descripción general 139fecha 141gráficos 141hexadecimal 139hora 141indicación de la hora 141numéricos 140UCS-2 141

literales de fecha 141, 205literales de gráficos 141, 589literales de hora 141, 212literales implícitos 142literales numéricos

consideraciones para suutilización 140

longitud de campocódigos de operaciones

aritméticas 367notación absoluta (posicional) 148notación de longitud 148

LOOKUP, código de operación 371, 466lote, no soportado en VARPG 588LR 291

LLllamada en prototipo

definición 67

Mmanejo de errores

durante un evento 56errores de programa 48excepciones de archivo 37información de retorno de

apertura 41información de retorno de archivo 38información de retorno de

entrada/salida 41información de retorno dependiente

de dispositivo 42subrutina de excepción/error de

archivo 44, 56manejo de errores, SQL 78manejo de excepciones

durante un evento 56excepciones de programa 48información de retorno de

apertura 41información de retorno de archivo 38información de retorno de

entrada/salida 41información de retorno dependiente

de dispositivo 42subrutina de excepción/error de

archivo 44, 56Windows 58

matrices 295matriz

búsqueda con un índice 167búsqueda sin un índice 166carga de matrices de

preejecución 163carga de matrices de tiempo de

compilación 161carga de matrices de tiempo de

ejecución 159clase de archivo 215clasificación 169codificación de matrices de tiempo de

compilación 160codificación de matrices de tiempo de

ejecución 158codificación de matrices de tiempo de

preejecución 162comparación con tablas 157comparación de matrices ILE RPG con

VARPG 590comprobación de secuencia 163dar formato para salida 295definición de matrices

relacionadas 164descripción general 157edición 170elementos distribuidos 160especificación de definición 158especificaciones de cálculo 168índice 158inicialización de matrices de tiempo

de compilación 164inicialización de matrices de tiempo

de ejecución 164inicialización de matrices de tiempo

de preejecución 164matriz de tiempo de ejecución 159nombres 158

Índice 619

Page 642: RPG Referencia

matriz (continuación)obtener el número de elementos 322orden de clasificación ASCII 163ordenación de matrices de tiempo de

ejecución 160posición final 296registros consecutivos 159registros fuente 161salida 170SORTA (Clasificar una matriz) 539SQRT (Raíz cuadrada) 540sumar elementos de matriz utilizando

XFOOT 563XFOOT (Sumar los elementos de una

matriz) 563MHHZO, no soportado en VARPG 595MHLZO, no soportado en VARPG 595MLHZO, no soportado en VARPG 595MLLZO, no soportado en VARPG 595modificar un registro existente 558módulo

EXE 66NOMAIN 65

MOVE, código de operación 384, 468MOVEA, código de operación 371, 384,

483MOVEL, código de operación 384, 489mover, operaciones 384

información general 384MOVE 384, 468MOVEA (Mover matriz) 384MOVEL (mover por la

izquierda) 489MOVEL (Mover por la

izquierda) 384mover datos de tipo carácter, gráfico y

numérico 384mover resto 498

MVR (Mover Resto) 498MSGDATA 250MSGNBR 250MSGTEXT 250MSGTITLE 250MULT, código de operación 367, 497multiplicación de factores 497

MULT (Multiplicar) 497MVR, código de operación 367, 498

NNEXT, no soportado en VARPG 595nivel de control

especificación de cálculo 282nivel de control, indicadores de 587NOMAIN 208nombre de procedimiento externo 244nombre EXCEPT 292, 301nombre(S)

reglas para 3simbólicos 3

NOOPT 251notación de longitud 148NOWAIT 251NULLIND

ejemplo 333numeración de páginas 295

Oobtención de atributos 456obtener aparición de estructura de

datos 499obtener dirección de procedimiento 333obtener el número de elementos de una

matriz 322obtener el número de elementos de una

tabla 322obtener el tamaño de una constante o de

un campo 338obtener la dirección de una variable 313,

314OCCUR, código de operación 499OCCURS 251OPDESC, no soportada en VARPG 593OPEN, código de operación 380, 502operaciones aritméticas

ADD (ADD) 392ADD (Añadir) 367alineación 367DIV (Dividir) 367, 432información general 367MULT (Multiplicar) 367, 497MVR (Mover Resto) 367, 498redondeo 367SQRT (Raíz cuadrada) 367, 540SUB (Restar) 367, 543truncamiento 367XFOOT (Sumar los elementos de una

matriz) 367, 563Z-ADD (Poner a cero y sumar) 367,

565Z-SUB (Poner a cero y restar) 367,

566operaciones aritméticas, consideraciones

sobre el rendimiento 369operaciones de archivo

CLOSE (Cerrar archivos) 380código de operación CLOSE (cerrar

archivos) 424código de operación DELETE

(suprimir registro) 431código de operación ROLBK

(retrotraer) 526COMMIT (Comprometer) 380, 425CHAIN (Recuperación aleatoria desde

un archivo) 380, 414DELETE (Suprimir registro) 380, 431descripción general 380EXCEPT (Salida en tiempo de

cálculo) 380, 448FEOD (Forzar fin de los datos) 380,

453OPEN (Abrir archivo para

proceso) 380OPEN (Abrir Archivo para

Proceso) 502POST (Anotar) 380, 509READ (Leer un registro) 380, 510READC (Leer siguiente registro

modificado) 380, 513READE (Leer clave igual) 380, 514READP (Leer registro anterior) 380,

516READPE (Leer igual anterior) 380,

518

operaciones de archivo (continuación)READS (Leer seleccionados) 380, 520ROLBK (Retrotraer) 380, 526SETGT (Establecer mayor que) 380,

532SETLL (establecer límite inferior),

código de operación 534SETLL (Establecer límites

inferiores) 380UNLOCK (Desbloquear un área de

datos) 380, 556UPDATE (Modificar registro

existente) 380, 558WRITE (Crear nuevos registros) 380,

561operaciones de área de datos

IN (Recuperar un área de datos) 376,460

información general 376OUT (Grabar un área de datos) 376,

505UNLOCK (Desbloquear un área de

datos) 376operaciones de bifurcación

CABxx (comparar y bifurcar) 402CABxx (Comparar y bifurcar) 372ENDSR (Fin de subrutina de

usuario) 445GOTO (ir a) 457GOTO (Ir a) 372ITER (Iterar) 372, 461LEAVE (Abandonar un grupo

estructurado) 372, 464TAG (Etiqueta) 372, 548

operaciones de bitsBITOFF (Desactivar los bits) 371, 400BITON (Activar los bits) 371, 401información general 371TESTB (Comprobar bit) 371, 551

operaciones de comparaciónANDxx (Y) 375, 396CABxx (comparar y bifurcar) 402CABxx (Comparar y bifurcar) 375CASxx (Invocar subrutina

condicionalmente) 409CASxx (Invocar subrutina de usuario

condicionalmente) 375COMP (Comparar) 375DOU (hacer hasta) 435DOU (Hacer hasta) 375DOUxx (Hacer hasta) 375, 436DOW (hacer mientras) 438DOW (Hacer mientras) 375DOWxx (Hacer mientras) 375, 439IF (Si) 375, 457IFxx (si/entonces) 458IFxx (Si/Entonces) 375información general 375ORxx (O) 375, 503WHEN (Cuando) 559WHEN (Seleccionar cuando sea

verdadero) 375WHENxx (Seleccionar cuando sea

verdadero) 375, 559operaciones de fecha

ADDDUR (Añadir duración) 377,393

620 VisualAge RPG Consulta del lenguaje

Page 643: RPG Referencia

operaciones de fecha (continuación)EXTRCT (Extraer fecha/hora) 377EXTRCT (Extraer

fecha/hora/indicación de lahora) 452

información general 377SUBDUR (Restar duración) 377, 543TEST (Comprobar

fecha/hora/indicación de lahora) 377

operaciones de GUIBEGACT (Empezar subrutina de

acción) 397CLSWIN (Cerrar ventana) 424ENDACT (Fin de subrutina de

acción) 444GETATR (Recuperar Atributo) 456información general 392SETATR (Establecer atributo) 531SHOWWIN (visualizar ventana) 538STOP (detener un componente

lógico) 542operaciones de información

información general 382TIME (hora del día) 554TIME (Hora del día) 382

operaciones de llamadaCALL (Llamar a un programa) 372,

404CALLB (Llamar a una DLL de

enlace) 407CALLB (Llamar a una función) 372CALLP (Llamar a un procedimiento o

programa con prototipo) 408descripción general 372PARM (Identificar parámetros) 372,

506PLIST (identificar una lista de

parámetros) 508PLIST (Identificar una lista de

parámetros) 372RETURN (Volver al llamador) 372,

525START (iniciar un componente) 541START (Iniciar un componente

lógico) 372operaciones de matrices

información general 371LOOKUP (Buscar un elemento de

matriz o tabla) 371LOOKUP (Buscar un Elemento en

Tabla o Matriz) 466MOVEA (Mover matriz) 371, 483SORTA (Clasificar una matriz) 371XFOOT (Sumar los elementos de una

matriz) 371, 563operaciones de mensajes

DSPLY (Visualizar ventana demensaje) 384, 441

información general 384operaciones de programación

estructuradaANDxx (Y) 390, 396CASxx (Invocar subrutina

condicionalmente) 409DO (Hacer) 390, 433DOU (hacer hasta) 435

operaciones de programaciónestructurada (continuación)

DOU (Hacer hasta) 390DOUxx (Hacer hasta) 390, 436DOW (Hacer mientras) 390, 438DOWxx (Hacer mientras) 390, 439ELSE (en caso contrario) 443ELSE (En caso contrario hacer) 390ENDyy (finalizar un grupo) 443ENDyy (Finalizar un grupo) 390EVAL (Evaluar) 390FOR (para) 453FOR (Para) 390IF (Si) 457IF (Si/entonces) 390IFxx (si/entonces) 458IFxx (Si/entonces) 390información general 390ITER (Iterar) 390, 461LEAVE (Abandonar un grupo

estructurado) 390, 464ORxx (O) 390, 503OTHER (De lo contrario

seleccionar) 390, 504SELECT (Iniciar un grupo de

selección) 390, 530WHEN (Cuando) 559WHEN (Seleccionar cuando sea

verdadero) 390WHENnxx (Seleccionar cuando sea

verdadero) 559WHENxx (Seleccionar cuando sea

verdadero) 390operaciones de subrutina

BEGACT (Empezar subrutina deacción) 397

BEGSR (Empezar subrutina deusuario) 400

CASxx (Invocar subrutinacondicionalmente) 409

ENDACT (Fin de subrutina deacción) 444

ENDSR (Fin de subrutina deusuario) 445

EXSR (Invocar subrutina deusuario) 449

LEAVESR (abandonar subrutina) 465START (iniciar un componente) 541

operaciones declarativasDEFINE (definición de campo) 428DEFINE (Definición de campo) 379información general 379KFLD (definir partes de una

clave) 462KFLD (Definir partes de una

clave) 379, 462KLIST (Definir una clave

compuesta) 379, 463PARM (Identificar parámetros) 379,

506PLIST (Identificar una lista de

parámetros) 379, 508TAG (Etiqueta) 379, 548

operadores 351operandos 353operandos de expresiones 353OPNQRYF 82

OPTION 208OPTIONS, palabra clave 252OR 282, 291OR, identificador de líneas

en especificaciones de entrada 271orden de clasificación 579, 582orden de clasificación alterno 590orden de evaluación de operandos 364ORxx, código de operación 375, 390, 503OTHER, código de operación 390, 504OUT, código de operación 505OUT, código de operación (grabar un

área de datos) 376OVERLAY 257OVERLAY, palabra clave 148

PPACKEVEN 259PAGE 6, 294, 295PAGE1 - PAGE7 294PAGE1-PAGE7 6, 295página, palabras especiales 6palabra ALTSEQ, no soportada en

VisualAge RPG 588palabra clave ACTGRP, no soportada en

VARPG 590palabra clave ALTSEQ, no soportada en

VARPG 590palabra clave BNDDIR, no soportada en

VARPG 590palabra clave DEBUG, no soportada en

VARPG 590palabra clave DEVID, no soportada en

VARPG 592palabra clave DFTACTGRP, no soportada

en VARPG 590palabra clave DFTNAME, no soportada

en VARPG 590palabra clave ENBPFRCOL, no soportada

en VARPG 590palabra clave EXTIND, no soportada en

VARPG 592palabra clave EXTPROC 244palabra clave FIXNBR, no soportada en

VARPG 590palabra clave FORMOFL, no soportada

en VARPG 592palabra clave FORMSALIGN, no

soportada en VARPG 590palabra clave FTRANS, no soportada en

VARPG 590palabra clave INDDS, no soportada en

VARPG 592palabra clave KEYLOC, no soportada en

VARPG 592palabra clave LANGID, no soportada en

VARPG 590palabra clave MAXDEV, no soportada en

VARPG 592palabra clave OFLIND, no soportada en

VARPG 592palabra clave OPENOPT, no soportada en

VARPG 590palabra clave OPTIMIZE, no soportada

en VARPG 590palabra clave PASS, no soportada en

VARPG 592

Índice 621

Page 644: RPG Referencia

palabra clave PGMNAME, no soportadaen VARPG 592

palabra clave PRFDTA, no soportada enVARPG 590

palabra clave RAFDATA, no soportada enVARPG 592

palabra clave REMOTE, nueva enVisualAge RPG 592

palabra clave SAVEDS, no soportada enVARPG 592

palabra clave SAVEIND, no soportada enVARPG 592

palabra clave SFILE, no soportada enVARPG 592

palabra clave SLN, no soportada enVARPG 592

palabra clave SRTSEQ, no soportada enVARPG 590

palabra clave STATIC 230palabra clave TEXT, no soportada en

VARPG 590palabra clave THREAD, no soportada en

VARPG 590palabra clave USRPRF, no soportada en

VARPG 590palabra EQUATE, no soportada en

VARPG 588palabra FILE, no soportada en

VARPG 588palabras clave, especificación de

descripción de archivo 219palabras clave de VARPG no soportadas

especificaciones de control 590especificaciones de definición 593especificaciones de descripción de

archivo 592palabras de edición 179palabras especiales 7palabras especiales de fecha de

usuario 7palabras reservadas 142

*ABORT 142*ALL’x..’ .*BLACK 142*BLANK/*BLANKS 142*BLUE 142*BROWN 142*CANCEL 142*CYAN 142*DARKBLUE 142*DARKCYAN 142*DARKGRAY 142*DARKGREEN 142*DARKPINK 142*DARKRED 142*ENTER 142*GREEN 142*HALT 142*HIVAL/*LOVAL 142*IGNORE 142*IN 25*INFO 142*INxx 25*NOBUTTON 142*NULL 142*OK 142*ON/*OFF 142*PALEGRAY 142

palabras reservadas 142 (continuación)*PINK 142*RED 142*RETRY 142*WARN 142*WHITE 142*YELLOW 142*YESBUTTON 142*ZERO/*ZEROS 142archivos descritos externamente 6constantes figurativas 5fecha de trabajos 5fecha y hora 4funciones incorporadas 4transferencia de parámetros 6

parámetros en prototipodefinición 68

PARM, código de operación 372, 379,506

PERRCD 260PLIST, código de operación 372, 379, 508PLIST, palabra clave 222posibilidad de nulos, entrada de campos

con 130posibilidad de nulos, salida de campos

con 130posibilidad de nulos, soporte de

opción de campos sin nulos 134sólo entrada 133

posición de archivo 6posición final 296

en registro de salida 296posiciones decimales

códigos de operacionesaritméticas 367

POST, código de operación 380, 509PREFIX 260PREFIX, palabra clave 223prioridad de los operadores en las

expresiones 351, 353procedimiento

especificación de procedimiento 303procedimiento, palabras clave de

especificaciónEXPORT 305

proceso aleatorio por clave 226proceso consecutivo 226proceso de archivo de direcciones de

registros 591proceso de archivo primario 591proceso de archivo secundario 591proceso de número relativo de

registro 226proceso no por clave 218proceso secuencial por clave 226PROCNAME 592PROCNAME, palabra clave 223PROCPTR 260programa o procedimiento en prototipo

especificación de procedimiento 303prototipo

definición 67y subprocedimientos 59

PRTCTL 293PRTCTL, palabra clave 223publicaciones, lista de 609puntero de procedimiento 125

punteros de base 98alineación de subcampos 148

RRCDLEN, palabra clave 224READ, código de operación 380, 510READC, código de operación 380, 513READE, código de operación 380, 514READP, código de operación 380, 516READPE, código de operación 380, 518READS 595READS, código de operación 380, 392,

520REALLOC, código de operación 521REALLOC (reasignar almacenamiento

con longitud nueva), código deoperación 382

reasignar almacenamiento 521RECNO, palabra clave 225recubrimiento del almacenamiento en

estructuras de datos 148recuperación de áreas de datos 460recuperación de atributos 456recuperar atributos 327registro

añadir 216longitud 217

registros de excepción 291regla de precisión por omisión 359reglas de las expresiones 356reglas de posición decimal de

resultado 362reglas de precisión 358REL, no soportado en VARPG 595REMOTE, palabra clave 225RENAME, palabra clave 225representación, formato numérico 123representación de punto flotante 358representación externa, campo

flotante 117RESET, código de operación 187, 382,

522restar duraciones de fecha-hora 378restar una duración 543restaurar campos de salida 296restricciones 569resultados intermedios en las

expresiones 357resultados intermedios y precisión 359RETURN 51RETURN, código de operación 372, 525ROLBK, código de operación 380, 526

Ssalida

archivo 215indicadores de condicionamiento 24

salida, campos con posibilidad denulos 130

salida en tiempo de cálculo(EXCEPT) 448

saltar para un archivo de impresora 293salto de página 14SCAN, código de operación 389, 527secuencia ascendente 238

622 VisualAge RPG Consulta del lenguaje

Page 645: RPG Referencia

SELECT, código de operación 390, 530serie, devolver 343serie, devolver sin blancos finales 346serie, devolver sin blancos iniciales 345serie, devolver sin blancos iniciales y de

cola 345serie, operaciones de 389

CAT (Concatenar dos series) 411CAT (Concatenar dos series de

caracteres) 389CHECK (Comprobar) 389, 417CHECKR (comprobación

inversa) 419CHECKR (Comprobación

inversa) 389información general 389SCAN (Buscar serie) 389, 527SUBST (Subserie) 389, 546XLATE (Convertir) 389, 564

SETATR 595SETATR, código de operación 392, 531SETGT, código de operación 380, 532SETLL, código de operación 380, 535SETOFF, código de operación 382, 537SETON, código de operación 382, 537SHOWWIN 595SHOWWIN, código de operación 392,

538SHTDN, no soportado en VARPG 595siglo, formato de 114simbólicos, nombres 3símbolo &

en el cuerpo de la palabra deedición 184

símbolo de moneda 204, 205en el cuerpo de la palabra de

edición 182utilización en la palabra de

edición 182sin signo, aritmética 369sin signo, formato 120sintaxis de palabras clave 194soporte de valores nulos 128

controlado por el usuario 129operaciones por clave 131

SORTA, código de operación 371, 539SQL

/ EXEC BEGIN DECLARE 77/ EXEC SQL INCLUDE SQLCA 75/ EXEC SQL WHENEVER 76declaraciones de variables del

lenguaje principal 72, 73estructuras 74estructuras de datos como variables

del lenguaje principal 74estructuras del lenguaje principal 75manejo de errores 78reglas sintácticas 71variables de indicador 74

SQLBINDFILE 209SQLDBBLOCKING 210SQLDBNAME 210SQLDTFMT 210SQLISOLATIONLVL 211SQLPACKAGENAME 211SQLPASSWORD 211SQLUSERID 212

SQRT, código de operación 367, 540SR 282START 595START, código de operación 29, 372,

392, 541STATIC 260STOP 51, 595STOP, código de operación 29, 392, 542STYLE 261SUB, código de operación 367, 543subarchivo de datos

alineación de 148definición 148recubrimiento del

almacenamiento 148SUBDUR, código de operación 377, 543subprocedimientos

ámbito de parámetros 62, 228codificación de cálculos 63comparación con subrutinas 66definición 59especificación de procedimiento 303especificaciones para 193gestión de excepciones/errores 65interfaz de procedimiento 61, 70NOMAIN, módulo 65secuencia de proceso normal 63valores de retorno 61

subprocedimientos y subrutina deerror/excepción de programa

y subprocedimientos 63subrutina de excepción/error de

archivo 44, 56subrutina de excepción/error de

programa 54subrutina de inicialización (*INZSR)

con código de operación RESET 522para datos 187procesar cálculos 187y subprocedimientos 63

subrutina de manejo de erroresENDACT, código de operación 56ENDSR, código de operación 56RETURN, código de operación 56STOP, código de operación 56

subrutinasBEGACT (Empezar subrutina de

acción) 391BEGSR (Empezar subrutina) 391CASxx (Invocar subrutina

condicionalmente) 391comparación con

subprocedimientos 66ejemplo 450ENDACT (Fin de subrutina de

acción) 391ENDSR (Fin de subrutina) 391EXSR (Invocar subrutina) 391información general 391LEAVESR (Abandonar una

subrutina) 391máximo permitido por programa 450utilización dentro de un

subprocedimiento 59subrutinas de acción

BEGACT (Empezar subrutina deacción) 397

SUBST, código de operación 389, 546sumar elementos de matriz 563supresión de registros 291

Ttabla

archivo 215clase de archivo 215comparación con matrices 157comparación de tablas ILE RPG con

VARPG 590dar formato para salida 295descripción general 157diferencias entre matrices y

tablas 171lookup con dos tablas 171lookup con una tabla 171obtener el número de elementos 322

tablas 295TAG, código de operación 372, 379, 548terminación

*TERMSR 30anormal 32componente lógico 30componentes lógicos 32normal 30

terminación anormal 32terminar componentes lógicos 29, 30TEST, código de operación 377, 392, 549TESTB, código de operación 371, 392,

551TESTN, código de operación 392, 553TESTZ, código de operación 392, 554TIME, código de operación 382, 554TIMFMT 212, 261TIMFMT, palabra clave 225tipo de datos binario 83, 588tipo de datos carácter 84, 102tipo de datos de fecha 83tipo de datos de hora 83tipo de datos de indicación de la

hora 83tipo de datos flotante 83tipo de datos gráfico 83, 104tipo de datos hex 84tipo de datos numérico con zona 83tipo de datos puntero de base 588tipo de datos puntero de

procedimiento 589tipo de formulario

archivo descrito externamente 276archivo descrito por programa 268especificación de control 201especificaciones de cálculo 282especificaciones de entrada 272especificaciones de salida 290especificar en especificaciones de

salida 290tipo decimal empaquetado 83tipos de datos, comparación de ILE RPG

con VARPG 588TOFILE 261TRUNCNBR 212

UUDATE 294, 295UDAY 294, 295

Índice 623

Page 646: RPG Referencia

último registro 291

UMONTH 294, 295

UNLOCK, código de operación 380, 556

UNLOCK, código de operación(desbloquear un área de datos) 376

UPDATE, código de operación 380, 558

USROPN, palabra clave 226

UYEAR 294, 295

Vvalor de retorno

definición 61

valores iniciales 187

dentro de subprocedimientos 63

valores por omisión 187

VALUE 262

variable

ámbito 62

variable local

ámbito 62, 228

variables de indicador para SQL 74

variables del lenguaje principal queutilizan SQL 72, 73

VARYING, palabra clave 262

visualizar ventana de mensaje 441

WWHEN, código de operación 375, 380,

390, 559

WHENxx, código de operación 375, 390,559

WRITE, código de operación 380

WRITE (crear nuevos registros) 561

XXFOOT, código de operación 367, 371,

563

XLATE, código de operación 389, 564

ZZ-ADD, código de operación 367, 565

Z-SUB, código de operación 367, 566

624 VisualAge RPG Consulta del lenguaje

Page 647: RPG Referencia
Page 648: RPG Referencia

IBM

Número de Programa: 5769-CL3

Printed in Denmark by IBM Danmark A/S

SC10-3066-03