Professional Documents
Culture Documents
ILE RPG/400
Guía del programador
Versión 3 Release 7
SC10-9659-01
AS/400 Advanced Series IBM
ILE RPG/400
Guía del programador
Versión 3 Release 7
SC10-9659-01
¡Aviso!
Antes de utilizar esta información y el producto al que da soporte, debe leer la información general que se
encuentra bajo el epígrafe “Avisos” en la página xi.
Este manual es la traducción del original en inglés ILE RPG/400 Programmer's Guide, SC09-2074-01.
Esta edición se aplica a la Versión 3, Release 7, Modificación 0 de ILE RPG de IBM Application System/400 (programa 5716-RG1) y
a todos los releases y modificaciones posteriores hasta que se indique lo contrario en nuevas ediciones. Asegúrese de que la
edición que utiliza sea la apropiada para el nivel del producto. Consulte la última edición de la bibliografía aplicable del sistema IBM
aplicable para obtener información actual sobre el producto.
Los cambios o adiciones al texto e ilustraciones se indican mediante una línea vertical a la izquierda del cambio o adición.
Solicite las publicaciones a través del representante de IBM o de la sucursal de IBM de su localidad. En la dirección que figura más
abajo no hay existencias de publicaciones.
Al final de esta publicación se proporciona un formulario para comentarios del lector. Si no encuentra el formulario, puede dirigir sus
comentarios a:
IBM S.A.
National Language Solutions Center
Avda. Diagonal, 571
08029 Barcelona
España
Cuando envía información a IBM, otorga a IBM un derecho no exclusivo para utilizar o distribuir la información de la forma que crea
apropiada sin contraer ninguna obligación con el remitente.
Copyright International Business Machines Corporation 1994, 1996. Reservados todos los derechos.
Contenido
Avisos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xi
Información de interfaz de programación . . . . . . . . . . . . . . . . . . . . . . . xi
Marcas registradas y marcas de servicio . . . . . . . . . . . . . . . . . . . . . . xii
Contenido v
Retorno desde un procedimiento principal . . . . . . . . . . . . . . . . . . . 157
Retorno desde un subproceso . . . . . . . . . . . . . . . . . . . . . . . . . . 159
Retorno utilizando la API de enalce ILE . . . . . . . . . . . . . . . . . . . . 160
Utilización de API de enlace . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
Ejemplos de utilización de API de enlace . . . . . . . . . . . . . . . . . . . 161
Llamada a una rutina de gráficos . . . . . . . . . . . . . . . . . . . . . . . . . 162
Llamada a rutinas especiales . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
Contenido vii
Especificaciones de formato de registro . . . . . . . . . . . . . . . . . . . . 290
Vía de acceso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
Claves válidas para un registro o archivo . . . . . . . . . . . . . . . . . . . 294
Bloqueo y desbloqueo de registros . . . . . . . . . . . . . . . . . . . . . . . 296
Utilización de archivos de disco descritos por el programa . . . . . . . . . . . 297
Archivo indexado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297
Archivo secuencial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300
Archivo de direcciones de registros . . . . . . . . . . . . . . . . . . . . . . . 300
Métodos para el proceso de archivos de disco . . . . . . . . . . . . . . . . . . 302
Proceso consecutivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
Proceso secuencial por clave . . . . . . . . . . . . . . . . . . . . . . . . . . 303
Proceso al azar por clave . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
Proceso secuencial entre límites . . . . . . . . . . . . . . . . . . . . . . . . 312
Proceso por número relativo de registro . . . . . . . . . . . . . . . . . . . . 315
Operaciones de archivo válidas . . . . . . . . . . . . . . . . . . . . . . . . . . 316
Utilización del control de compromiso . . . . . . . . . . . . . . . . . . . . . . . 319
Comienzo y fin del control de compromiso . . . . . . . . . . . . . . . . . . 319
Especificación de archivos para control de compromiso . . . . . . . . . . . 321
Utilización de la operación COMMIT . . . . . . . . . . . . . . . . . . . . . . 322
Especificación de control de compromiso condicional . . . . . . . . . . . . 324
Control de compromiso en el ciclo del programa . . . . . . . . . . . . . . . 325
Archivos DDM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
Utilización de archivos DDM anteriores a V3R1 . . . . . . . . . . . . . . . 326
Apéndices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393
Contenido ix
Apéndice D. Listados del compilador . . . . . . . . . . . . . . . . . . . . . 451
Lectura de un listado del compilador . . . . . . . . . . . . . . . . . . . . . . . 452
Prólogo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452
Sección de fuente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 454
Mensajes de diagnóstico adicionales . . . . . . . . . . . . . . . . . . . . . . 457
Posiciones del almacenamiento intermedio de salida . . . . . . . . . . . . 458
Tabla de miembros /COPY . . . . . . . . . . . . . . . . . . . . . . . . . . . 458
Datos en tiempo de compilación . . . . . . . . . . . . . . . . . . . . . . . . 458
Información sobre campos de clave . . . . . . . . . . . . . . . . . . . . . . 460
Tabla de referencia cruzadas . . . . . . . . . . . . . . . . . . . . . . . . . . 460
Lista de referencias externas . . . . . . . . . . . . . . . . . . . . . . . . . . 461
Resumen de mensajes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 462
Resumen final . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 462
Errores de generación de código y de enlace . . . . . . . . . . . . . . . . . 463
Bibliografía . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465
Índice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469
Los que posean este programa bajo licencia y deseen información sobre el mismo
con el fin de habilitar: (i) el intercambio de información entre programas creados
independientemente y otros programas (incluido este) y (ii) la utilización mutua de
la información que se ha intercambiado, deben ponerse en contacto con IBM
Canada Ltd., Department 071, 1150 Eglinton Avenue East, North York, Ontario
M3C 1H7, Canada. Es posible que dicha información esté disponible bajo los tér-
minos y condiciones correspondientes que en algunos casos puede incluir el pago
de una cuota.
| 400 IBM
| Application System/400 Integrated Language Environment
| AS/400 Operating System/400
| C/400 OS/2
| COBOL/400 OS/400
| DB2 RPG/400
| DB2/400 Sistema/36
| FORTRAN/400 System/38
| GDDM
Esta guía muestra cómo utilizar RPG IV en una estructura ILE, no proporciona
información detallada acerca de las especificaciones y operaciones RPG IV. Para
obtener una descripción detallada del lenguaje, consulte la publicación ILE
RPG/400 Reference, SC09-2077.
| A continuación aparece una lista de estas ventajas, incluyendo varias de las fun-
| ciones incorporadas y de las ventajas de utilización:
| Soporte a campos nulos de bases de datos
| Esta ventaja permitirá que los usuarios procesen campos de base de datos
| que contengan campos con posibilidad de nulos al permitir la comprobación de
| nulos en estos campos así como el establecimiento de éstos en un valor nulo.
| Precisión en el resultado de expresiones intermedias
| Una nueva palabra clave de especificación de control y nuevos ampliadores de
| código de operación en las especificaciones de expresión de formato libre
| otorgan al usuario un mayor control de la precisión de resultados intermedios.
| Nuevo tipo de datos de coma flotante
| El nuevo tipo de datos de coma flotante tiene un rango de valores muy supe-
| rior al de otros tipos de datos. La adición de este tipo de datos mejorará la
| integración con la base de datos OS/400 y mejorará la comunicación entre len-
| guajes en un entorno ILE, concretamente con los lenguajes C y C++.
| Soporte a series terminadas en un valor nulo
| El nuevo soporte a series terminadas en un valor nulo también mejorará la
| comunicación entre lenguajes. Permite que los usuarios tengan total control
| sobre los datos terminados en nulo al permitir la definición y el proceso de las
| series terminadas en un valor nulo y la transferencia conveniente de datos de
| tipo carácter como parámetros de procedimientos que esperan series termi-
| nadas en nulo.
| Adición y sustracción de puntero
| Se han ampliado las expresiones de formato libre para que permitan la adición
| de un desplazamiento a un puntero, la sustracción de un desplazamiento de un
| puntero y la determinación de la diferencia entre dos punteros.
| Soporte a nombres largos
| Se han añadido nombres con más de 10 caracteres al lenguaje RPG. Todo
| objeto definido en las especificaciones de definiciones o procedimientos puede
| tener un nombre largo y estos nombres pueden utilizarse en cualquier lugar en
| el que quepan dentro de los límites de una entrada. Además, los nombres a
| que se haga referencia en una especificación de formato libre pueden ocupar
| varias líneas.
Para obtener más información acerca del RPG IV, consulte la publicación ILE
RPG/400 Reference.
Especificaciones de RPG IV
El código RPG se escribe en diversos formularios de especificación, cada uno con
un grupo de funciones determinado. Muchas de las entradas que componen un
tipo de especificación dependen de la posición.Cada entrada debe empezar en una
posición determinada dependiendo del tipo de entrada y del tipo de especificación.
Existen siete tipos de especificaciones RPG IV. Todos los tipos de especificación
son optativos. Las especificaciones deben entrarse en el programa fuente en el
orden que se muestra a continuación.
Sección de subprocedimiento:
1. Las especificaciones de procedimiento marcan el principio y el final del sub-
procedimiento, indican el nombre del subprocedimiento y si se ha de exportar.
Programación de ciclos
Cuando un sistema procesa datos, debe realizar el proceso en un orden determi-
nado. Este orden lógico lo proporciona:
El compilador del RPG/400
El código del programa.
El ciclo del programa es un serie de pasos que el programa repite hasta que
alcanza una condición de fin de archivo. En función de las especificaciones que
codifique, el programa puede o no utilizar cada paso del ciclo.
Si no desea que el ciclo controle los archivos, debe finalizar su programa de otro
modo, ya sea creando una condición de fin de archivo activando el indicador de
último registro (LR), creando una condición de retorno activando el indicador de
retorno (RT) o regresando directamente mediante la operación RETURN.
Nota: No se genera ningún código de ciclo para subprocedimientos o cuando se
especifica NOMAIN en la especificación de control.
La Figura 1 en la página 5 muestra los pasos específicos del flujo general del ciclo
del programa RPG.
Realizar No Escribir
cálculos de Mover campos Activar LR salida de
detalle detalles
Sí
Finalizar
programa
El primer ciclo
La primera y última vez del ciclo del programa difieren un poco de otros ciclos.
Antes de leer el primer registro por primera vez mediante el ciclo, el programa
efectúa tres cosas:
maneja parámetros de entrada, abre archivos, inicializa datos del programa
escribe los registros condicionados mediante el indicador 1P (primera página)
procesa todas las operaciones de salida de detalle y de cabecera.
Por ejemplo, las líneas de cabecera impresas antes de leer el primer registro
podrían estar formadas por información de cabecera de página o constante, o
campos especiales como por ejemplo PAGE y *DATE. El programa también
ignora los pasos de cálculos de totales y salida de totales en el primer ciclo.
El último ciclo
La última vez que un programa pasa por el ciclo, cuando no hay más registros
disponibles, el programa activa el indicador LR (último registro) y los indicadores
L1 a L9 (nivel de control). El programa procesa los cálculos de totales y la salida
de totales, a continuación se cierran todos los archivos y luego finaliza el pro-
grama.
Lógica de subprocedimiento
El flujo general de un subprocedimiento es mucho más sencillo; los cálculos de un
subprocedimiento se realizan una vez y a continuación el subprocedimiento
regresa. No se genera un código de ciclo para un subprocedimiento.
Indicadores
Un indicador es un campo de un carácter que está activado ('1') o desactivado
('0'). Cada indicador tiene un nombre de dos caracteres (por ejemplo, LR, 01, H3),
y se le hace referencia en las entradas de algunas especificaciones sólo mediante
el nombre de dos caracteres, y en otras mediante el nombre especial *INxx en el
que xx es el nombre de dos caracteres. Un indicador es o bien el resultado de
una operación, o se utiliza para condicionar (o controlar) el proceso de una ope-
ración. Los indicadores son como interruptores del flujo de la lógica del programa.
Determinan la vía de acceso que tomará el programa durante el proceso, en
función de cómo estén establecidos.
Puede utilizar varios tipos de indicadores; cada tipo indica algo diferente. En un
programa en RPG, los indicadores se definan o bien efectuando entradas en las
especificaciones o utilizando el propio ciclo de programas del RPG. Las posiciones
de la especificación en la que defina un indicador determina la utilización del indi-
cador. Una vez haya definido un indicador en el programa, éste puede limitar o
controlar operaciones de cálculo y de salida.
Códigos de operación
El lenguaje de programación RPG IV le permite realizar muchos tipos de ope-
raciones distintas con los datos. Los códigos de operación, que haya entrado en
las especificaciones de cálculo, indican qué operaciones se efectuarán. Por
ejemplo, si desea leer un registro nuevo, podría utilizar el código de operación
READ. A continuación aparece una lista de los tipos de operaciones disponibles.
Operaciones aritméticas Operaciones de valor del indicador
Operaciones de matriz Operaciones de información
Operaciones de bit Operaciones de inicialización
Operaciones de bifurcación Operaciones de mensajes
Operaciones de llamada Operaciones de mover
Operaciones de comparación Operaciones de serie de caracteres
Operaciones del área de datos Operaciones de programación estructurada
Operaciones de fecha/hora/ind.hora Operaciones de subrutina
Operaciones declarativas Operaciones de prueba
Operaciones de archivo
EMP_REC
┌──────────┬───────────────────────────────┬──────────┬─
│EMP_NUMBER│ EMP_NAME │ EMP_RATE │
│ │ │ │
└──────────┴───────────────────────────────┴──────────┴─
1 6 22 27
TRN_REC
┌───────────────┬───────────┬────────────┬─
│ TRN_NUMBER │ TRN_HOURS │ TRN_BONUS │
│ │ │ │
└───────────────┴───────────┴────────────┴─
1 6 1ð 16
Especificaciones de control
La fecha de hoy se imprimirá en formato de día, mes y año con una "/" como el
separador.
FTRANSACC IP E K DISK
FEMPLEADO IF E K DISK
FQSYSPRT O F 8ð PRINTER
Especificaciones de definición
D Paga S 8P 2
D Cabecera1 C 'NUMERO NOMBRE TARIFA H-
D ORAS BONIFIC. PAGA '
D Cabecera2 C '______ ________________ ______ _-
D ____ _______ __________'
D CalcPay PR 8P 2
D Tarifa 5P 2 VALUE
D Horas 1ðU ð VALUE
D Bonificación 5P 2 VALUE
Especificaciones de cálculo
Especificaciones de salida
OQSYSPRT H 1P 2 3
O 35 'REGISTRO DE NOMINAS'
O \DATE Y 6ð
O H 1P 2
O 6ð Cabecera1
O H 1P 2
O 6ð Cabecera2
O D N1PN99 2
O TRN_NUMBER 5
O EMP_NAME 24
O EMP_RATE L 33
O TRN_HOURS L 4ð
O TRN_BONUS L 49
O Paga 6ð '$ ð. '
O D N1P 99 2
O TRN_NUMBER 5
O 35 '\\ NO EN ARCHIVO DE EMPLEADOS \\'
O T LR
O 33 'FIN DEL LISTADO'
Un subprocedimiento
El subprocedimiento calcula la paga del empleado utilizando los parámetros que se
le han pasado.El valor resultante se devuelve al llamador utilizando la sentencia
RETURN.
P CalcPay B
D CalcPay PI 8P 2
D Tarifa 5P 2 VALUE
D Horas 1ðU ð VALUE
D Bonificación 5P 2 VALUE
P CalcPay E
\------------------------------------------------------------------------\
\ DESCRIPCIÓN: Este programa crea una salida impresa de la paga semanal \
\ de los empleados. \
\------------------------------------------------------------------------\
H DATEDIT(\DMY/)
\------------------------------------------------------------------------\
\ Definiciones de archivo \
\------------------------------------------------------------------------\
FTRANSACC IP E K DISK
FEMPLEADO IF E K DISK
FQSYSPRT O F 8ð PRINTER
\------------------------------------------------------------------------\
\ Declaraciones de variables \
\------------------------------------------------------------------------\
D Pay S 8P 2
\------------------------------------------------------------------------\
\ Declaraciones de constantes \
\------------------------------------------------------------------------\
D Cabecera1 C 'NUMERO NOMBRE TARIFA H-
D ORAS BONIFIC. PAGA '
D Cabecera2 C '______ ________________ ______ _-
D ____ _______ __________'
\------------------------------------------------------------------------\
\ Definición de prototipo para subprocedimiento CalcPay \
\------------------------------------------------------------------------\
D CalcPay PR 8P 2
D Tarifa 5P 2 VALUE
D Horas 1ðU ð VALUE
D Bonificación 5P 2 VALUE
\------------------------------------------------------------------------\
\ Para cada registro del archivo de transacciones (TRANSACC), si se \
\ encuentra empleado, calcular paga de empleado e imprimir detalle. \
\------------------------------------------------------------------------\
C TRN_NUMBER CHAIN EMP_REC 99
C IF NOT \IN99
C EVAL PAY = CalcPay(EMP_RATE : TRN_HOURS :
C TRN_BONUS)
C ENDIF
\------------------------------------------------------------------------\
\ Diseño de informe \
\ -- imprimir las líneas de cabecera si está activado 1P \
\ -- si se encuentra el registro (el indicador 99 está desactivado) \
\ imprimir los detalles de nómina, de lo contrario imprimir un \
\ registro de excepción \
\ -- imprimir 'FIN DEL LISTADO' cuando LR se active \
\------------------------------------------------------------------------\
OQSYSPRT H 1P 2 3
O 35 'REGISTRO DE NOMINAS'
O \DATE Y 6ð
O H 1P 2
O 6ð Cabecera1
O H 1P 2
O 6ð Cabecera2
O D N1PN99 2
O TRN_NUMBER 5
O EMP_NAME 24
O EMP_RATE L 33
O TRN_HOURS L 4ð
O TRN_BONUS L 49
O Paga 6ð '$ ð. '
O D N1P 99 2
O TRN_NUMBER 5
O 35 '\\ NO EN ARCHIVO DE EMPLEADOS \\'
O T LR
O 33 'FIN DEL LISTADO'
\------------------------------------------------------------------------\
\ Subprocedimiento -- calcula la paga de horas extra. \
\------------------------------------------------------------------------\
P CalcPay B
D CalcPay PI 8P 2
D Tarifa 5P 2 VALUE
D Horas 1ðU ð VALUE
D Bonificación 5P 2 VALUE
P CalcPay E
CODE/400
Con el Entorno de Desarrollo Cooperativo CODE/400 (CODE/400) se mejora el
desarrollo de programas y la carga de trabajo del desarrollo de programa se des-
plaza fuera del sistema principal. Para el desarrollo y mantenimiento de apli-
caciones en RPG, CODE/400 proporciona:
Edición sensible al lenguaje— incluyendo resaltado de señales, líneas de
formato, una serie completa de solicitudes y ayuda en línea.
Comprobación de sintaxis incrementada— la cual proporciona información de
retorno automática sobre errores a medida que se entra cada línea del fuente
Verificación de programas— realiza en la estación de trabajo el rango completo
de comprobación sintáctica y semántica que lleva a cabo el compilador sin
generar el código objeto
Una interfaz OS/2 para someter las compilaciones y los enlaces del sistema
principal
Depuración a nivel de fuente
Un programa de utilidad de diseño de DDS— que le permite modificar con faci-
lidad pantallas, informes y archivos de bases de datos
Acceso a Servicios de Diccionario de Aplicaciones para OS/400.
Cada una de las áreas anteriores se explica brevemente en los siguientes párrafos
y se trata con más detalle en los capítulos que siguen.
Creación de programas
En ILE, la creación de programas consiste en:
1. Compilación de códigos fuente en módulos
2. Enlace (combinación) de uno o más módulos en un objeto de programa
Puede crear un objeto de programa de modo muy similar a como lo haría con la
estructura del OPM, con un proceso en un paso mediante el mandato Crear pro-
grama en RPG enlazado (CRTBNDRPG). Este mandato crea un módulo temporal
que se enlaza a continuación en un objeto de programa. También le permite
enlazar otros objetos mediante la utilización de un directorio de enlace.
Puede crear un directorio de enlace que contenga los nombres de los módulos y
programas de servicio que puede necesitar su programa o programa de servicio.
Un directorio de enlace puede reducir el tamaño del programa ya que los módulos
o programas de servicio listados en un directorio de enlace únicamente se utilizan
si son necesarios.
┌───────────────────────────────────────────────────────────┐
│ Especificaciones fuente RPG IV │
│ Archivos descritos externamente │
│ Texto de copia fuente │
└─────┬────────────────────────────────────────────┬────────┘
│ 6
│ ┌────────────────────┐ ┌──────────────┐
│ ┌──┤ Módulos ILE HLL ├───┐ │ Módulo en RPG│
│ │ │ Programas servicio │ │ │ (CRTRPGMOD) │
│ │ └────────────────────┘ │ └───────┬──────┘
6 6 6 6
┌────────────────────┐ ┌────────────────────┐
│ Programa ILE │ │ Programa ILE │
│ (CRTBNDRPG) │ │ (CRTPGM) │
└────────────────────┘ └────────────────────┘
Gestión de programas
ILE proporciona una base común para:
Gestionar el flujo de programas
Compartir recursos
Utilizar interfaces de programación de aplicaciones (API)
Manejar excepciones durante el tiempo de ejecución del programa
Ofrece a los usuarios de RPG un control sobre los recursos mucho mejor del que
era posible anteriormente.
Para obtener más información sobre los grupos de activación, consulte el apartado
“Gestión de grupos de activación” en la página 112.
Utilizando las API enlazables que se proporcionan para todos los lenguajes de pro-
gramación ILE, puede asignar dinámicamente almacenamiento para una matriz de
| tiempo de ejecución. Estas API permiten que aplicaciones de lenguaje único y de
| lenguaje mixto accedan a un conjunto central de funciones de gestión de almace-
| namiento y ofrece un modelo de almacenamiento a los lenguajes que no lo propor-
| cionan. RPG ofrece algunas posibilidades de almacenamiento utilizando códigos
| de operación. Para obtener más información sobre la gestión del almacenamiento,
| consulte el apartado “Gestión de almacenamiento asignado dinámicamente” en la
| página 115.
Llamada a programas
En ILE, puede escribir aplicaciones en las que los programas ILE RPG/400 y los
programas OPM RPG/400 continúen interrelacionándose mediante la utilización tra-
dicional de las llamadas dinámicas a programas. Al utilizar dichas llamadas, el
programa que efectúa la llamada especifica el nombre del programa llamado en
una sentencia de llamada. El nombre del programa llamado se resuelve en una
dirección en tiempo de ejecución, justo antes de que el programa de llamada trans-
fiera el control al programa llamado.
Para obtener más información sobre el depurador, consulte el Capítulo 11, “Depu-
ración de programas” en la página 165.
API enlazables
ILE ofrece una serie de API enlazables que se pueden utilizar como suplemento a
la función que ILE RPG/400 ofrece actualmente. Las API enlazables proporcionan
la posibilidad de llamar y activar programas, la gestión de condicionamiento y
almacenamiento, funciones matemáticas y gestión dinámica de pantallas.
Algunas de las API que puede plantearse utilizar en un aplicación en ILE RPG/400
son:
CEETREC – Señalizar condición de terminación inminente
CEE4ABN – Terminación anormal
| CEECRHP – Crear área de almacenamiento dinámico del usuario
| CEEDSHP – Eliminar área de almacenamiento dinámico del usuario
| CEEFRST – Liberar almacenamiento en área de almacenamiento dinámico del
| usuario
| CEEGTST – Obtener almacenamiento dinámico en área de almacenamiento
| dinámico de usuario
Para obtener más información acerca de estas API enlazables del ILE, consulte el
Capítulo 9, “Ejecución de un programa” en la página 105 y también el manual
System API Reference.
Método
Utilice el siguiente enfoque general para crear un programa de este tipo:
1. Convierta el fuente a RPG IV utilizando el mandato CVTRPGSRC.
Asegúrese de que convierte todos los miembros /COPY que utilice el fuente
que está convirtiendo.
2. Cree un objeto de programa utilizando el mandato CRTBNDRPG, especifi-
cando DFTACTGRP(*YES).
Cuando utiliza este enfoque, no puede utilizar el enlace estático del ILE. Esto sig-
nifica que cuando cree este programa no puede codificar una llamada de proce-
dimiento enlazado en su fuente, ni puede utilizar los parámetros BNDDIR o
ACTGRP en el mandato CRTBNDRPG.
Trabajo
Grupo de Activación por Omisión
*PGM(X)
OPM CL
*PGM(Y)
ILE RPG
*PGM(Z)
OPM RPG
Información relacionada
Conversión a RPG IV “Conversión del código fuente” en la
página 404
Proceso de creación en un paso Capítulo 6, “Creación de un programa
con el mandato CRTBNDRPG” en la
página 59
Enlace estático del ILE Capítulo 10, “Llamada a programas y
procedimientos” en la página 131;
también ILE Conceptos
Diferencias de manejo de excepciones “Diferencias entre el manejo de excep-
ciones en OPM e ILE RPG/400” en la
página 226
Método
Utilice el siguiente enfoque general para crear un programa de este tipo:
1. Si arranca con un fuente en RPG III, convierta el fuente a RPG IV utilizando el
mandato CVTRPGSRC.
Si lo convierte, asegúrese de que convierte todos los miembros /COPY y los
programas a los que llama el fuente que está convirtiendo. Además, si utiliza
CL para llamar al programa, también debe asegurarse de que utilice el CL ILE
en lugar del CL OPM.
2. Determine el grupo de activación en el que se ejecutará el programa.
Es posible que desee darle el mismo nombre que el de la aplicación, como en
este ejemplo.
3. Identifique el nombre del directorio de enlace que se va a utilizar, si existe.
Con este método, se asume que si utiliza un directorio de enlace, es uno que
ya ha creado. Por ejemplo, puede que haya un programa de terceros con el
que desee enlazar su fuente. Por consiguiente, todo lo que necesita saber es
el nombre del directorio de enlace.
4. Cree un programa en ILE mediante CRTBNDRPG, especificando
DFTACTGRP(*NO), el grupo de activación del parámetro ACTGRP y el direc-
torio de enlace, si existe, en el parámetro BNDDIR.
Trabajo
Grupo de Activación XYZ
*PGM(X)
ILE CL
*PGM(Y)
ILE RPG
*SRVPGM(Z)
Programa de Servicio
Proporcionado
Información relacionada
Conversión al RPG IV “Conversión del código fuente” en la
página 404
Proceso de creación en un paso Capítulo 6, “Creación de un programa
con el mandato CRTBNDRPG” en la
página 59
El efecto del ILE es el mismo que se describe en el apartado “Efecto del ILE” en la
página 26.
Puede que desee leer acerca de los conceptos básicos de ILE en el manual ILE
Conceptos antes de utilizar este método.
Método
Como este enfoque es el más flexible, incluye varias formas en las que podría
crear una aplicación ILE. La lista siguiente describe los pasos principales que
puede que necesite realizar:
1. Cree un módulo de cada miembro fuente utilizando el mandato apropiado, por
ejemplo, CRTRPGMOD para el fuente en RPG, CRTCLMOD para el fuente en
CL, etc..
2. Determine las características ILE para la aplicación, por ejemplo:
Determine qué módulo contendrá el procedimiento que será el punto de
arranque de la aplicación. El módulo que elige como el módulo de entrada
es el primero que desea que obtenga el control. En una aplicación OPM,
se trataría del programa de proceso de mandatos, o el programa llamado
al seleccionar un elemento del menú.
Determine el grupo de activación en el que se ejecutará la aplicación.
(Probablemente deseará ejecutar un grupo de activación con nombre, en el
que el nombre se base en el nombre de la aplicación.)
Determine las exportaciones e importaciones que se utilizarán.
Una aplicación que se cree utilizando este enfoque puede ejecutarse con protec-
ción completa, es decir, dentro de su propio grupo de activación. Además, se
puede actualizar fácilmente utilizando los mandatos UPDPGM o UPDSRVPGM.
Con estos mandatos puede añadir o sustituir uno o más módulos sin tener que
volver a crear el objeto de programa.
Trabajo
Grupo de Activación XY
*PGM(X)
RPG
*PGM(Y)
RPG *MODULE(Y1)
RPG *MODULE(Y2)
RPG *MODULE(Y3)
RPG *MODULE(Y4)
Consulte el apartado “Efecto del ILE” en la página 26 para ver detalles sobre los
efectos del ILE en la manera en que la aplicación maneja llamadas, datos, archivos
y errores.
Trabajo
Grupo de Activación Y
*PGM(Y)
CL *MODULE(Y1)
RPG *MODULE(Y2)
RPG *MODULE(Y4)
La llamada del programa Y a la API OPM es una llamada dinámica. Las llamadas
entre los módulos del programa Y son llamadas estáticas.
Consulte el apartado “Efecto del ILE” en la página 26 para ver detalles sobre los
efectos del ILE en la manera en que la aplicación maneja llamadas, datos, archivos
y errores.
Trabajo
Grupo de Activación XYZ
*PGM(X)
CL *MODULE(X1)
*SRVPGM(Y)
RPG *MODULE(X2) RPG
*SRVPGM(Z)
C *MODULE(Z1)
CL *MODULE(Z2)
Consulte el apartado “Efecto del ILE” en la página 26 para ver detalles sobre los
efectos del ILE en la manera en que la aplicación maneja llamadas, datos, archivos
y errores.
Información relacionada
Proceso de creación en dos pasos Capítulo 7, “Creación de un programa con
los mandatos CRTRPGMOD y CRTPGM” en
la página 75
Grupos de activación “Gestión de grupos de activación” en la
página 112
Enlace estático del ILE Capítulo 10, “Llamada a programas y
procedimientos” en la página 131; también
ILE Conceptos
Manejo de excepciones Capítulo 12, “Manejo de excepciones” en la
página 221; también ILE Conceptos
Trabajo
Grupo de Activación por Omisión
*PGM(X)
CL
*PGM(Y)
RPG
*SRVPGM(Z)
RPG
Figura 11. Marco hipotético que debe evitar. Una aplicación se divide entre el grupo de
activación por omisión OPM y un grupo de activación con nombre.
Al realizar una división entre el grupo de activación por omisión y cualquier grupo
de activación con nombre, mezcla el comportamiento OPM con el comportamiento
ILE. Por ejemplo, los programas del grupo de activación por omisión puede que
esperen que los programas en ILE liberen sus recursos cuando el programa fina-
lice. Sin embargo, esto no sucederá hasta que finalice el grupo de activación.
De forma similar, será más difícil gestionar el ámbito de las alteraciones tempo-
rales y de los ODP cuando una aplicación esté dividida entre el grupo de acti-
vación por omisión y uno con nombre. Por omisión, el ámbito del grupo con
nombre será a nivel del grupo de activación, pero para el grupo de activación por
omisión, éste puede ser a nivel de llamada o a nivel de trabajo, no a nivel de grupo
de activación.
Consulte el final de esta sección para ver dónde ha de buscar una información
más detallada sobre la codificación de módulos con varios procedimientos.
Llamadas de prototipos
Para llamar a un subprocedimiento, debe utilizar una llamada de prototipos.
También puede llamar a cualquier programa o procedimiento que se haya grabado
en cualquier lenguaje de este modo. Una llamada de prototipos es una llamada
en la que la interfaz de llamada se comprueba en tiempo de compilación mediante
la utilización de un prototipo. Un prototipo es una definición de una interfaz de
llamada. Esto incluye la información siguiente:
Si la llamada es enlazada (procedimiento) o dinámica (programa)
Para crear los campos de salida con formato, FmtCust llama a un procedimiento
NumToChar. NumToChar tiene un parámetro de entrada numérico que se pasa
por valor y devuelve un campo de caracteres. La Figura 14 muestra el prototipo
para NumToChar.
La Figura 15 muestra una llamada a FmtCust. Tenga en cuenta que los nombres
de los parámetros de salida, que aparecen en la Figura 13, no coinciden con los
de la sentencia de la llamada. Los nombres de parámetros de un prototipo son
meramente ilustrativos. El prototipo sirve para describir los atributos de la interfaz
de llamada. La definición real de los parámetros de llamada se lleva a cabo en el
propio procedimiento.
\--------------------------------------------------------------
\ CUSTNAME y CUSTNUM obtienen el formato siguiente:
\ A&P Electronics (Número de cliente 157)
\--------------------------------------------------------------
C EVAL Nombre = CUSTNAME + ' '
C + '(Número del cliente '
C + %trimr(NumToChr(CUSTNUM)) + ')'
┌─Módulo─ARRSRPT───────────────────────┐
│ ┌─Procedimiento─principal────────┐ │
│ │ │ │
│ │ Abrir archivo, leer registro, │ │
│ │ grabar registros de salida, │ │
│ │ cerrar archivos │ │
│ └────────────────────────────────┘ │
│ ┌─InArrears──────────────────────┐ │
│ │ │ │
│ │ Subprocedimiento para determi- │ │
│ │ nar si el registro del cliente │ │
│ │ está atrasado │ │
│ └────────────────────────────────┘ │
│ ┌─FmtCust────────────────────────┐ │
│ │ │ │
│ │ Subprocedimiento para dar for- │ │
│ │ mato a los datos del cliente │ │
│ │ en forma de informe │ │
│ └────────────────────────────────┘ │
└──────────────────────────────────────┘
SUGERENCIA
\--------------------------------------------------------------\
\ InArrears
\
\ Parámetros: (ninguno)
\ Globales: DUEDATE, AMOUNT, CurDate
\
\ Devuelve: '1' si el cliente está atrasado
\--------------------------------------------------------------\
P InArrears B 1
D InArrears PI 1A 2
\ Declaraciones locales
D DaysLate S 1ðI ð 3
D DateDue S D 3
P InArrears E 1
La Figura 18 muestra los elementos principales que son comunes a todos los sub-
procedimientos.
1. Todos los subprocedimientos comienzan y finalizan con especificaciones de
procedimiento.
2. Después de la especificación de inicio de procedimiento (B en la posición 24
de la especificación de procedimiento), codifica una definición de interfaz de
procedimiento. El valor de retorno, si lo hay, se define en la especificación PI.
Todos los parámetros se listan después de la especificación PI.
3. Las variables o prototipos que utilice el subprocedimiento se definen después
de la definición de interfaz de procedimiento.
4. El valor de retorno, si se especifica, se devuelve al llamador con una operación
RETURN.
\--------------------------------------------------------------\
\ FmtCust da formato a CUSTNAME, CUSTNUM, STREETNAME etc de
\ modo legible
\
\ Parámetros: Nombre (salida)
\ Dirección (salida)
\ Globales: CUSTNAME, CUSTNUM, STREETNUM, STREETNAME, CITY
\ STATE, ZIP
\ Devuelve: (ninguno)
\--------------------------------------------------------------\
P FmtCust B
D FmtCust PI
D Nombre 1ððA
D Dirección 1ððA
D ZipChar S 5A
\--------------------------------------------------------------\
\ CUSTNAME y CUSTNUM obtienen el formato siguiente:
\ A&P Electronics (Número de cliente 157)
\--------------------------------------------------------------\
C EVAL Nombre = CUSTNAME + ' '
C + '(Número del cliente '
C + %trimr(NumToChar(CUSTNUM)) + ')'
\--------------------------------------------------------------
\ STREETNUM, STREETNAME, CITY, STATE y ZIP obtienen el formato
\ siguiente:
\ Calle de Garbancito, 27 Villachica IN 51423
\--------------------------------------------------------------
C MOVEL ZIP ZipChar
C EVAL Dirección = %trimr(NumToChar(STREETNUM))
C + ' ' + %trimr(STREETNAME) + ', '
C + %trim(CITY) + ' ' + %trim(STATE)
C + ' ' + ZipChar
P FmtCust E
\=================================================================\
\ Fuente para el módulo CVTPROCS. Este módulo no tiene un
\ procedimiento principal, como indica la palabra clave NOMAIN.
\=================================================================\
H NOMAIN
\-----------------------------------------------------------------\
\ El prototipo debe estar disponible a CADA módulo que contenga
\ un procedimiento de prototipos. /COPY extrae el prototipo
\ para NumToChar.
\-----------------------------------------------------------------\
/COPY QRPGLESRC,CVTPROCP
\-----------------------------------------------------------------\
\ NumToChar convierte un campo numérico en un campo de caracteres
\
\ Parámetros: NUMPARM (salida)
\ Globales: (ninguno)
\ Devuelve: serie de caracteres
\
\ Procedimientos externos a este módulo llamarán al
\ subprocedimiento, por lo que es necesaria la palabra clave
\ EXPORT para indicarlo.
\-----------------------------------------------------------------\
P NumToChar B EXPORT
D NumToChar PI 31A
D NUMPARM 3ðP ð VALUE
\ Declaraciones locales
D POS S 5P ð
D SIGN S 1A INZ(' ')
D ZONEDS DS
D NUM 3ðS ð
D CHAR 3ðA OVERLAY(NUM)
\
\ Cuerpo del procedimiento:
\ Manejar caso especial de cero
C IF NUMPARM = ð
C RETURN 'ð'
C ENDIF
\ Manejar negativos. Establecer signo en '-' y convertirlo en positivo.
C IF NUMPARM < ð
C EVAL NUMPARM = - NUMPARM
C EVAL SIGN = '-'
C ENDIF
\ Obtener el número de entrada en formato de caracteres
\ utilizando una estructura de datos
C EVAL NUM = NUMPARM
\ Justificar a la izquierda
C
C 'ð' CHECK CHAR POS
C EVAL CHAR = %SUBST(CHAR:POS)
\ Devolver el valor añadiendo el signo
C RETURN %TRIML(SIGN + CHAR)
P NumToChar E
┌──ARRSRPT──\PGM─────────────┐
│ │ ┌─────────────────┐
│ ┌─ARRSRPT─\MODULE───────┐ │ │ miembro /COPY │
│ │ ┌─Proc─Principal────┐ │ │ │ CVTPROCP │
│ │ │ │ │ │ │ │
│ │ └───────────────────┘ │ │ └─────────────────┘
│ │ ┌─InArrears─────────┐ │ │
│ │ │ │ │ │
│ │ └───────────────────┘ │ │ ┌─────────────────┐
│ │ ┌─FmtCust───────────┐ │ │ │ CUSTFILE │
│ │ │ │ │ │ │ DDS │
│ │ └───────────────────┘ │ │ │ │
│ └───────────────────────┘ │ └─────────────────┘
│ │
│ ┌─CVTPROCS─\MODULE──────┐ │
│ │ NOMAIN │ │ ┌─────────────────┐
│ │ ┌─NumToChar─────────┐ │ │ │ CUSTRPT │
│ │ │ │ │ │ │ DDS │
│ │ └───────────────────┘ │ │ │ │
│ └───────────────────────┘ │ └─────────────────┘
│ │
└────────────────────────────┘
\=================================================================\
\ Fuente del módulo ARRSRPT. Contiene un procedimiento principal
\ y dos subprocedimientos: InArrears y FmtCust.
\
\ Módulo relacionado: CVTPROCS (NumToChar llamado por FmtCust)
\=================================================================\
\--------------------------------------------------------------\
\ A R C H I V O S
\
\ CUSTFILE - contiene la información de los clientes
\ CUSTRPT - archivo de impresora (utilizando el formato ARREARS)
\--------------------------------------------------------------\
FCUSTFILE IP E DISK
FCUSTRPT O E DISK
Figura 22 (Parte 1 de 3). Fuente completo ILE RPG/400 para el módulo ARRSRPT
\--------------------------------------------------------------\
\ P R O T O T I P O S
\--------------------------------------------------------------\
/COPY QRPGLE,CVTPROCP
\--------------------------------------------------------------\
\ InArrears devuelve '1' si el cliente se encuentra en ARREARS
\--------------------------------------------------------------\
D InArrears PR 1A
\--------------------------------------------------------------\
\ FmtCust formatea CUSTNAME, CUSTNUM, STREETNAME etc en
\ formatos legibles
\--------------------------------------------------------------\
D FmtCust PR
D Name 1ððA
D Address 1ððA
\--------------------------------------------------------------\
\ D E F I N I C I O N E S G L O B A L E S
\--------------------------------------------------------------\
D CurDate S D
ICUSTREC ð1
\--------------------------------------------------------------\
\ P R O C E D I M I E N T O P R I N C I P A L
\--------------------------------------------------------------\
C IF InArrears = '1'
C CALLP FmtCust(RPTNAME : RPTADDR)
C EVAL RPTNUM = CUSTNUM
C WRITE ARREARS
C ENDIF
C \INZSR BEGSR
C \MDY MOVEL UDATE CurDate
C ENDSR
\--------------------------------------------------------------\
\ S U B P R O C E D I M I E N T O S
\--------------------------------------------------------------\
\--------------------------------------------------------------\
\ InArrears
\
\ Parámetros: (ninguno)
\ Globales: DUEDATE, AMOUNT, CurDate
\
\ Devuelve: '1' si el cliente se halla en ARREARS
\--------------------------------------------------------------\
P InArrears B
D InArrears PI 1A
\ Declaraciones locales
D DaysLate S 1ðI ð
D DateDue S D
Figura 22 (Parte 2 de 3). Fuente completo ILE RPG/400 para el módulo ARRSRPT
P InArrears E
\--------------------------------------------------------------
\ FmtCust formatea CUSTNAME, CUSTNUM, STREETNAME etc en
\ formatos legibles
\
\ Parámetros: Nombre (salida)
\ Dirección (salida)
\ Globales: CUSTNAME, CUSTNUM, STREETNUM, STREETNAME, CITY
STATE, ZIP
\ Devuelve: (ninguno)
\--------------------------------------------------------------
P FmtCust B
D FmtCust PI
D Name 1ððA
D Address 1ððA
D ZipChar S 5A
\--------------------------------------------------------------
\ CUSTNAME y CUSTNUM se formatean de la siguiente forma:
\ A&P Electronics (Número de cliente 157)
\--------------------------------------------------------------
C EVAL Name = CUSTNAME + ' '
C + '(Customer number '
C + %trimr(NumToChar(CUSTNUM)) + ')'
\--------------------------------------------------------------
\ StreetNum, STREETNAME, CITY, STATE y ZIP se formatean de la
\ siguiente forma:
\ 27 Calle del Garbanzo, Villachica 51423
\--------------------------------------------------------------
C MOVEL ZIP ZipChar
C EVAL Address = %trimr(NumToChar(STREETNUM))
C + ' ' + %trimr(STREETNAME) + ', '
C + %trim(CITY) + ' ' + %trim(STATE)
C + ' ' + ZipChar
P FmtCust E
Figura 22 (Parte 3 de 3). Fuente completo ILE RPG/400 para el módulo ARRSRPT
El campo de fecha CurDate es un campo global, lo cual significa que todos los
procedimientos del módulo pueden acceder a él.
El procedimiento principal es fácil de seguir. Contiene especificaciones de
cálculo para las dos tareas principales; la E/S y una rutina de inicialización.
Cada subprocedimiento que va a continuación del procedimiento principal con-
tiene los detalles de una de las tareas.
A\================================================================\
A\ NOMBRE ARCHIVO : CUSTFILE
A\ PROG. RELACIONADO: ARRSRPT
A\ DESCRIPCIONES : ESTE ES UN ARCHIVO FÍSICO CUSTFILE. TIENE
A\ FORMATO DE REGISTRO LLAMADO CUSTREC.
A\================================================================\
A\ ARCHIVO MAESTRO CLIENTE -- CUSTFILE
A R CUSTREC
A CUSTNUM 5 ð TEXT('NÚMERO CLIENTE')
A CUSTNAME 2ð TEXT('NOMBRE CLIENTE')
A STREETNUM 5 ð TEXT('DIRECCIÓN CLIENTE')
A STREETNAME 2ð TEXT('DIRECCIÓN CLIENTE')
A CITY 2ð TEXT('CIUDAD CLIENTE')
A STATE 2 TEXT('PROVINCIA CLIENTE')
A ZIP 5 ð TEXT('CÓDIGO POSTAL CLIENTE')
A AMOUNT 1ð 2 TEXT('CANTIDAD PENDIENTE')
A DUEDATE 1ð TEXT('FECHA VENCIMIENTO')
Consideraciones generales
Cuando codifique un módulo con varios procedimientos, deseará utilizar los
archivos /COPY, primordialmente para contener cualquier prototipo que
requiera su aplicación. Si está creando un programa de servicio, necesitará
proporcionar tanto el programa de servicio como los prototipos, si existen.
El mantenimiento de la aplicación requiere asegurarse de que cada compo-
nente esté en el nivel más reciente y que cualquier cambio no afecte a las
diferentes partes. Para mantener sus aplicaciones puede que desee utilizar
una herramienta como Gestor de Desarrollo de Aplicaciones.
Por ejemplo, suponga que otro programador efectúe un cambio en el archivo
/COPY que contiene los prototipos. Cuando solicite que vuelva a crearse una
aplicación, se recompilarán automáticamente todos los módulos o programas
que utilicen el archivo /COPY. Sabrá rápidamente si los cambios realizados en
el archivo /COPY afectarán a las interfaces de llamada o procedimiento de su
aplicación. Si existen errores de compilación, puede decidir a continuación si
acepta el cambio en los prototipos para evitar estos errores o si desea cambiar
la interfaz de llamada.
Procedimientos principales
Tema Consulte
Manejo de excepciones “Manejo de excepciones en un pro-
cedimiento principal” en la
página 224
Finalización del procedimiento principal “Retorno desde un procedimiento
principal” en la página 157
Subprocedimientos
Tema Consulte
Definición Capítulo sobre subprocedimientos en
el manual ILE RPG/400 Reference
Módulo NOMAIN “Creación de un módulo NOMAIN” en
la página 78
Manejo de excepciones “Manejo de excepciones con
subprocedimientos” en la página 225
Especificación de procedimiento Capítulo sobre especificaciones de
procedimiento de la publicación ILE
RPG/400 Reference
Interfaz de procedimiento Capítulo sobre definición de datos y
prototipos de la publicación ILE
RPG/400 Reference
Finalización del subprocedimiento “Retorno desde un subproceso” en la
página 159
Llamada de prototipos
Tema Consulte
Llamada de formato libre “Utilización de una llamada de
prototipos” en la página 137
Información general ILE RPG/400 Reference, Capítulo 24
Pasar parámetros “Pasar parámetros de prototipos” en la
página 139
Prototipos Capítulo sobre definición de datos y
prototipos de la publicación ILE
RPG/400 Reference
Para entrar sentencias fuente RPG en el sistema, utilice uno de los métodos
siguientes:
De forma interactiva utilizando el SEU
De forma interactiva utilizando CODE/400
Al principio, tal vez desee entrar las sentencias fuente en un archivo denominado
QRPGLESRC. Los miembros nuevos del archivo QRPGLESRC reciben automá-
ticamente el tipo RPGLE por omisión. Además, el archivo fuente por omisión para
los mandatos ILE RPG/400 que crean módulos y los enlazan en objetos programa
es QRPGLESRC. IBM proporciona un archivo fuente QRPGLESRC en la biblio-
teca QGPL. Su longitud de registro es de 112 caracteres.
Nota: Puede utilizar mayúsculas y minúsculas al entrar el fuente. No obstante, el
compilador ILE RPG/400 convertirá la mayor parte del fuente a mayúsculas
al compilarlo. No convertirá los literales, los datos de las matrices ni los
datos de las tablas.
Para crear una biblioteca, utilice el mandato CRTLIB. Para crear un archivo físico
fuente, utilice el mandato Crear Archivo Físico Fuente (CRTSRCPF). La longitud
de registro recomendada para este archivo es de 112 caracteres. Esta longitud de
registro toma en cuenta la nueva estructura ILE RPG/400, tal como se indica en la
Figura 26.
12 8ð 2ð
┌───────────┬──────────────────────────────────────────┬─────────────┐
│ Sec#/Fecha│ Código │ Comentarios│
└───────────┴──────────────────────────────────────────┴─────────────┘
Puesto que el valor por omisión del sistema es de 92 caracteres para un archivo
físico fuente, debe especificar explícitamente una longitud mínima de registro de
112. Si especifica una longitud menor de 92 caracteres, el programa pro-
bablemente no se compilará, ya que puede que esté truncando el código fuente.
Si necesita información sobre los valores que debe entrar después de escribir
STRSEU, pulse F4. Aparecerá la pantalla STRSEU, que contiene una lista de
parámetros y proporciona los valores por omisión. Si proporciona valores de pará-
metros antes de efectuar la solicitud, la pantalla aparecerá con estos valores ya
colocados.
4. Teclee el fuente siguiente en la pantalla Edición del SEU utilizando los man-
datos de prefijos SEU siguientes para proporcionar información de solicitud:
IPF — para especificaciones de descripción de archivo
IPD — para especificaciones de definición
IPI — para especificaciones de entrada
IPC — para especificaciones de cálculo
IPCX — para especificaciones de cálculo con el factor 2 ampliado
IPO — para especificaciones de salida
IPP — para continuación de especificaciones de salida
IPPR — para especificaciones de procedimiento
\===============================================================\
\ NOMBRE DEL MÓDULO: EMPRPT
\ ARCHIVOS RELACIONADOS: EMPMST (ARCHIVO FÍSICO)
\ QSYSPRT (ARCHIVO DE IMPRESORA)
\ DESCRIPCIÓN: Este programa imprime la información
\ sobre los empleados del archivo EMPMST.
\===============================================================\
FQSYSPRT O F 8ð PRINTER
FEMPMST IP E K DISK
D TYPE S 8A
D EMPTYPE PR 8A
D CODE 1A
IEMPREC ð1
5. Pulse F3 (Salir) para ir a la pantalla Salir. Teclee Y (Sí) para salvar EMPRPT.
Se ha salvado el miembro EMPRPT.
En la Figura 29 se muestran las DDS a las que el fuente de EMPRPT hace refe-
rencia.
A\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
A\ DESCRIPTION: Estas son las DDS del archivo físico MSTEMP. \
A\ Contiene un formato de registro llamado EMPREG. \
A\ Este archivo contiene un registro para cada \
A\ empleado de la empresa. \
A\ \
A R EMPREC
A ENUM 5 ð TEXT('NÚMERO EMPLEADO')
A ENAME 2ð TEXT('NOMBRE EMPLEADO')
A ETYPE 1 TEXT('TIPO EMPLEADO')
A EDEPT 3 ð TEXT('DEPARTAMENTO EMPLEADO')
A ENHRS 3 1 TEXT('JORNADA SEMANAL NORMAL EMPL.')
A K ENUM
...+....1....+....2....+....3....+....4....+....5....+....6....+....7..
C
C (operaciones de cálculo ILE RPG/4ðð)
C
C/EXEC SQL (delimitador inicial)
C+
C+ (líneas de continuación que contienen sentencias SQL)
C+
.
.
.
C/END-EXEC (delimitador final)
C
C (operaciones de cálculo ILE RPG/4ðð)
C
Debe entrar un mandato diferente para procesar las sentencias SQL. Consulte las
publicaciones DB2 for OS/400 SQL Programming y DB2/400 Manual de Consulta
SQL para obtener más información.
Tabla 3. Parámetros del mandato CRTBNDRPG y sus valores por omisión agrupados por funciones
Identificación del programa
PGM(*CURLIB/*CTLSPEC) Determina el nombre y la biblioteca del programa creado.
SRCFILE(*LIBL/QRPGLESRC) Identifica la biblioteca y el archivo fuente.
SRCMBR(*PGM) Identifica el miembro de archivo que contiene las
especificaciones fuente.
TEXT(*SRCMBRTXT) Proporciona una breve descripción del programa.
Opciones de conversión
de datos
CVTOPT(*NONE) Especifica cómo se manejarán los diversos tipo de datos de los
archivos descritos externamente.
ALWNULL(*NO) Determina si el programa aceptará los valores de los campos con
posibilidad de nulos.
FIXNBR(*NONE) Determina si se arreglarán los datos decimales con zona no válidos
al convertirlos en datos empaquetados.
Consideraciones de tiempo
de ejecución
DFTACTGRP(*YES) Identifica si este programa siempre se ejecutará en el grupo de
activación por omisión OPM.
ACTGRP(QILE) Identifica el grupo de activación en el que debe ejecutarse
el programa.
SRTSEQ(*HEX) Especifica la tabla de secuencias de ordenación que se
utilizará.
LANGID(*JOBRUN) Se utiliza con SRTSEQ para especificar el identificador de
lenguaje para la secuencia de ordenación.
TRUNCNBR(*YES) Especifica la acción a llevar a cabo cuando se produce un
desbordamiento numérico para campos decimales empaquetados, decimales
con zona y binarios en operaciones de formato fijo.
á ñ
Figura 31. Pantalla Visualizar fuente del módulo EMPRPT
Para obtener más información acerca de los programas de servicio, véase el Capí-
tulo 8, “Creación de un programa de servicio” en la página 93.
2. Escriba uno de los mandatos CL siguientes para ver el listado que se crea:
DSPJOB y después seleccione la opción 4 (Visualizar archivos en spool)
WRKJOB
WRKOUTQ nombre-cola
WRKSPLF
\------------------------------------------------------------------------\
\ DESCRIPCIÓN: Este programa crea una salida impresa del salario \
\ semanal de los empleados. \
\------------------------------------------------------------------------\
H DATEDIT(\DMY/)
\------------------------------------------------------------------------\
\ Definiciones de archivos \
\------------------------------------------------------------------------\
FTRANSACT IP E K DISK
FEMPLOYEE IF E K DISK
FQSYSPRT O F 8ð PRINTER
\------------------------------------------------------------------------\
\ Declaraciones de variables \
\------------------------------------------------------------------------\
D Pay S 8P 2
\------------------------------------------------------------------------\
\ Declaraciones de constantes \
\------------------------------------------------------------------------\
D Heading1 C 'NUMBER NAME RATE H-
D OURS BONUS PAY '
D Heading2 C '______ ________________ ______ _-
D ____ _______ __________'
\------------------------------------------------------------------------\
\ Para cada registro del archivo de transacciones (TRANSACT), si se \
\ encuentra el empleado, calcular el salario de los empleados e imprimir \
\ detalle \
\------------------------------------------------------------------------\
C TRN_NUMBER CHAIN EMP_REC 99
C IF NOT \IN99
C EVAL (H) Pay = EMP_RATE \ TRN_HOURS + TRN_BONUS
C ENDIF
\------------------------------------------------------------------------\
\ Diseño de informe \
\ -- imprimir las líneas de cabecera si 1P está activo \
\ -- si se encuentra el registro (el indicador 99 está desactivado), \
\ imprimir detalles de nóminas, de lo contrario imprimir un registro \
\ de excepciones \
\ -- imprimir 'FIN DE LISTADO' cuando se active LR \
\------------------------------------------------------------------------\
OQSYSPRT H 1P 2 3
O 35 'REGISTRO DE NÓMINAS'
O \DATE Y 6ð
O H 1P 2
O 6ð Heading1
O H 1P 2
O 6ð Heading2
O D N1PN99 2
O TRN_NUMBER 5
O EMP_NAME 24
O EMP_RATE L 33
O TRN_HOURS L 4ð
O TRN_BONUS L 49
O Pay 6ð '$ ð. '
O D N1P 99 2
O TRN_NUMBER 5
O 35 '\\ NO EN ARCHIVO EMPLEADOS \\'
O T LR
O 33 'FIN DE LISTADO'
Estos valores se utilizan en cualquier parte del listado en que aparezca un campo
de fecha o de hora.
Por ejemplo, para indicar que desea sangrar las operaciones estructuradas y mar-
carlas con una barra vertical (|) seguida de un espacio, especifique ('| ').
La Figura 33 muestra parte del listado fuente que se ha generado con sangrado.
La marca de sangrado es '| '.
Para ayudarle a corregir los errores de compilación, tal vez desee incluir texto de
mensajes de segundo nivel en el listado (especialmente si hace poco tiempo que
trabaja con RPG). Para ello, especifique OPTION(*SECLVL) en cualquier mandato
de creación. De este modo añadirá texto de segundo nivel a los mensajes listados
en el resumen de mensajes.
Finalmente, recuerde que un listado del compilador es un registro escrito del pro-
grama. Por lo tanto, si encuentra errores durante la comprobación de su pro-
grama, puede utilizar el listado para comprobar que el fuente se haya codificado
del modo que tenía previsto. Las partes del listado, además de las sentencias
fuente, que tal vez desee comprobar son las siguientes:
Número <---------------------- Especificaciones fuente --------------------------><-- Comentarios ---> Do Pág. Fecha ID Número
línea ....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8....+....9....+...1ð Núm. Lín. modif. fuen secuenc
Número <---------------------- Especificaciones fuente --------------------------><-- Comentarios ---> Do Pág. Fecha ID Número
línea ....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8....+....9....+...1ð Núm. Lín. modif. fuen secuenc
En este ejemplo, se define FLD1 como FLD2 con una longitud de 5 bytes
más.Posteriormente, FLD2 se define como una fecha, con lo cual el ajuste de lon-
gitud de la definición de FLD1 no es válido.El mensaje RNF3479 se emite apun-
tando a la línea del listado 1.Tenga en cuenta que el número de secuencia SEU
(000100) también se proporciona para ayudarle a buscar con mayor rapidez la
línea del fuente errónea.(El número de secuencia SEU también puede encontrarse
en la línea de listado 1).
Mientras examina el listado del compilador, puede buscar errores y corregir las
sentencias fuente que los contienen. Para buscar los errores, escriba F \ERR en la
línea de mandatos del SEU de la sesión de examinar. Se resaltará la línea que
tenga el primer (o el siguiente) error y en la parte inferior de la pantalla se
visualizará el texto de primer nivel del mismo mensaje. Puede ver el texto de
segundo nivel situando el cursor en el mensaje y pulsando F1 (Ayuda).
Si es posible, los mensajes de error del listado indican el número de secuencia del
SEU de la línea que contiene el error. El número de secuencia se encuentra justo
antes del texto del mensaje.
Para obtener información completa acerca del examen de un listado del compi-
lador, véase la publicación ADTS/400: Programa de Utilidad para Entrada del
Fuente (SEU).
Si tiene un miembro /COPY, puede buscar el número de ID del fuente del archivo
real en la tabla de miembros /COPY al final del listado. Para obtener un ejemplo
de una tabla de miembros /COPY, consulte el apartado “Tabla de miembros
/COPY” en la página 458.
Es posible que necesite información acerca de las opciones de los mandatos (por
ejemplo, la vista de depuración seleccionada o el directorio de enlace utilizado)
cuando realice modificaciones en el programa en el futuro.
Un módulo no se puede ejecutar solo. Debe enlazar uno o varios módulos para
crear un objeto de programa (del tipo *PGM) que pueda ejecutarse. También
puede enlazar uno o varios módulos para crear un objeto de programa de servicio
(del tipo *SRVPGM). A continuación podrá acceder a los procedimientos que hay
en los módulos enlazados mediante llamadas de los procedimientos estáticos.
Para obtener más información sobre el concepto de los módulos, consulte ILE
Conceptos.
Tabla 4. Parámetros del mandato CRTRPGMOD y sus valores por omisión agrupados por funciones
Identificación de módulos
MODULE(*CURLIB/*CTLSPEC) Determina el nombre y la biblioteca del módulo creado
SRCFILE(*LIBL/QRPGLESRC) Identifica el archivo fuente y la biblioteca
SRCMBR(*MODULE) Identifica el miembro de archivo que contiene las
especificaciones fuente
TEXT(*SRCMBRTXT) Proporciona una breve descripción del módulo.
Creación de módulos
GENLVL(10) Condiciona la creación de módulos a la gravedad del error (0-20).
OPTION(*GEN) *GEN/*NOGEN determina si se crea el módulo.
DBGVIEW(*STMT) Especifica el tipo de vista de depuración, si la hay, que se
incluirá en el programa.
OPTIMIZE(*NONE) Determina el nivel de optimización, si lo hay.
REPLACE(*YES) Determina si el módulo debe sustituir al módulo existente.
AUT(*LIBCRTAUT) Especifica el tipo de autorización para el módulo creado
TGTRLS(*CURRENT) Especifica el nivel de release en el que se ejecutará el objeto
| ENBPFRCOL(*PEP) Especifica si se habilita la recogida de rendimiento.
| DEFINE(*NONE) Especifica los nombres de condición que se definen antes de
| empezar la compilación.
Opciones de conversión
de datos
CVTOPT(*NONE) Especifica cómo se manejarán los diversos tipo de datos de los
archivos descritos externamente.
ALWNULL(*NO) Determina si el módulo aceptará los valores de los campos con
posibilidad de nulos.
FIXNBR(*NONE) Determina si se arreglarán los datos decimales con zona no válidos
al convertirlos en datos empaquetados.
Consideraciones de tiempo
de ejecución
SRTSEQ(*HEX) Especifica la tabla de secuencias de ordenación que se utilizará.
LANGID(*JOBRUN) Se utiliza con SRTSEQ para especificar el identificador de
lenguaje para la secuencia de ordenación.
TRUNCNBR(*YES) Especifica la acción a llevar a cabo cuando se produce un
desbordamiento numérico para campos decimales
empaquetados, decimales con zona y binarios en operaciones de formato
fijo.
Para obtener información acerca de la utilización del listado del compilador, véase
el apartado “Utilización del listado del compilador” en la página 65. En el
\=================================================================\
\ MODULE NAME: TRANSSVC (Servicios de transacción)
\ RELATED FILES: N/A
\ RELATED SOURCE: TRANSRPT
\ EXPORTED PROCEDURES: Trans_Inc -- calcula los ingresos de la
\ transacción utilizando los datos de los campos de la lista
\ de parámetros. La devuelve al llamador una vez realizados
\ todos los cálculos.
\
\ Prod_Name -- recupera el nombre del producto basándose en el
\ parámetro de entrada con el número de producto.
\=================================================================\
\ Este módulo contiene sólo subprocedimientos; es un módulo NOMAIN.
H NOMAIN
\------------------------------------------------------------------
\ Traer los prototipos del miembro /COPY
\------------------------------------------------------------------
/COPY TRANSP
\------------------------------------------------------------------
\ Subprocedimiento Trans_Inc
\------------------------------------------------------------------
P Trans_Inc B EXPORT
D Trans_Inc PI 11P 2
D ProdNum 1ðP ð VALUE
D Quantity 5P ð VALUE
D Discount 2P 2 VALUE
D Factor S 5P ð
\
C SELECT
C WHEN ProdNum = 1
C EVAL Factor = 15ðð
C WHEN ProdNum = 2
C EVAL Factor = 35ðð
C WHEN ProdNum = 5
C EVAL Factor = 2ðððð
C WHEN ProdNum = 8
C EVAL Factor = 32ððð
C WHEN ProdNum = 12
C EVAL Factor = 64ððð
C OTHER
C EVAL Factor = ð
C ENDSL
P Trans_Inc E
\------------------------------------------------------------------
\ Subprocedimiento Prod_Name
\------------------------------------------------------------------
P Prod_Name B EXPORT
D Prod_Name PI 4ðA
D ProdNum 1ðP ð VALUE
\
C SELECT
C WHEN ProdNum = 1
C RETURN 'Grande'
C WHEN ProdNum = 2
C RETURN 'Muy grande'
C WHEN ProdNum = 5
C RETURN 'Super grande'
C WHEN ProdNum = 8
C RETURN 'Requetegrande'
C WHEN ProdNum = 12
C RETURN 'Superrequetegrande'
C OTHER
C RETURN '\\\Desconocido\\\'
C ENDSL
P Prod_Name E
\=================================================================\
\ MODULE NAME: TRANSRPT
\ RELATED FILES: TRNSDTA (PF)
\ RELATED SOURCE: TRANSSVC (Servicios de transacción)
\ EXPORTED PROCEDURE: TRANSRPT
\ El procedimiento TRANSRPT lee todos los registros de
\ transacciones almacenados en el archivo físico TRNSDTA.
\ Llama al subprocedimiento Trans_Inc que realiza cálculos
\ y devuelve un valor. A continuación llama a Prod_Name
\ para determinar el nombre del producto. A continuación
\ TRANSRPT imprime el registro de transacción.
\=================================================================\
FTRNSDTA IP E DISK
FQSYSPRT O F 8ð PRINTER OFLIND(\INOF)
/COPY QRPGLE,TRANSP
D Income S 1ðP 2
D Total S +5 LIKE(ingresos)
\
ITRNSREC ð1
OQSYSPRT H 1P 1
O OR OF
O 12 'Nombre producto'
O 4ð 'Cantidad'
O 54 'Ingresos'
OQSYSPRT H 1P 1
O OR OF
O 3ð '----------+
O ----------+
O ----------'
O 4ð '--------'
O 6ð '------------'
OQSYSPRT D ð1 1
O ProdName 3ð
O QTY 1 4ð
O Income 1 6ð
OQSYSPRT T LR 1
O 'Total: '
O Total 1
A\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
A\ RELATED FILES: TRNSRPT \
A\ DESCRIPTION: Este es el archivo físico TRNSDTA. Tiene un \
A\ solo formato de registro llamado TRNSREC. \
A\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
A\ ARCHIVO TRANSACCIÓN COMPONENTES -- TRNSDTA
A R TRNSREC
A PROD 1ðS ð TEXT('Producto')
A QTY 5S ð TEXT('Cantidad')
A DISCOUNT 2S 2 TEXT('Descuento')
Ejemplos adicionales
Para ver más ejemplos de la creación de módulos, consulte los apartados
siguientes:
“Ejemplo de programa de servicio” en la página 96 para ver un ejemplo de la
creación de un módulo para un programa de servicio.
“Enlace a un programa” en la página 100. para ver un ejemplo de la creación
de un módulo que se utilizará con un programa de servicio.
“Gestión del área de almacenamiento dinámico del usuario utilizando API enla-
zable de ILE” en la página 122 para ver un ejemplo de la creación de un
módulo para asignar almacenamiento de forma dinámica para una matriz en
tiempo de ejecución.
“Ejemplo de fuente de depuración” en la página 214 para ver un ejemplo de
creación de un módulo RPG y C para utilizarlo en un programa de depuración
de ejemplo.
En un programa ILE, puede haber varios ciclos RPG activos; para cada módulo
RPG que tenga un procedimiento principal sólo hay un ciclo RPG. Los ciclos son
independientes; activar LR en un procedimiento principal no afecta el ciclo de otro.
Mandatos CL relacionados
Los mandatos CL siguientes se pueden utilizar con módulos:
Visualizar Módulo (DSPMOD)
Cambiar Módulo (CHGMOD)
Suprimir Módulo (DLTMOD)
Trabajar con Módulos (WRKMOD)
Para obtener más información acerca de estos mandatos, consulte la publicación
CL Reference.
┌─\PGM(TRPT)───────────────────────┐
│ ┌──Módulo TRANSRPT────────┐ │
│ │ ┌───────────────────┐ │ │
│ │ │ Procedimiento de │ │ │
│ │ │ entrada programa │ │ │
│ │ └───────────────────┘ │ │
│ │ ┌───────────────────┐ │ │
│ │ │ Proced. principal │ │ │
│ │ └───────────────────┘ │ │
│ └─────────────────────────┘ │
│ ┌──Módulo─TRANSSVC────────┐ │
│ │ ┌────────────────────┐ │ │
│ │ │Secc. princ. fuente │ │ │
│ │ └────────────────────┘ │ │
│ │ ┌────────────────────┐ │ │
│ │ │ Trans_Inc │ │ │
│ │ └────────────────────┘ │ │
│ │ ┌────────────────────┐ │ │
│ │ │ Prod_Name │ │ │
│ │ └────────────────────┘ │ │
│ └─────────────────────────┘ │
└──────────────────────────────────┘
Además de enlazar módulos, puede enlazar éstos a programas de servicio (del tipo
*SRVPGM). Los programas de servicio le permiten codificar y mantener módulos
aparte de los módulos de programa. Se pueden crear rutinas comunes como pro-
gramas de servicio y, si la rutina se modifica, el cambio se puede incorporar enla-
zando de nuevo el programa de servicio. No es preciso crear de nuevo los
programas que utilizan estas rutinas comunes. Para obtener información acerca
de la creación de programas de servicio, véase el Capítulo 8, “Creación de un pro-
grama de servicio” en la página 93.
Para obtener información acerca del proceso de enlace y del enlazador, consulte la
publicación ILE Conceptos.
Una vez que haya entrado el mandato CRTPGM, el sistema realiza las acciones
siguientes:
1. Copia los módulos listados en lo que se convertirá el objeto programa y enlaza
los programas de servicio al objeto de programa.
2. Identifica el módulo que contiene el procedimiento de entrada del programa y
localiza la primera importación de este módulo.
3. Comprueba los módulos por el orden en el que aparecen listados y hace coin-
cidir la primera importación con un módulo de exportación.
4. Vuelve al primer módulo y localiza la importación siguiente.
5. Resuelve todas las importaciones del primer módulo.
6. Continúa en el módulo siguiente y resuelve todas las importaciones.
7. Resuelve todas las importaciones de los módulos siguientes hasta que se
hayan resuelto todas.
8. Si alguna importación no se puede resolver con una exportación, el proceso de
enlace termina sin crear un objeto de programa.
9. Una vez que se han resuelto todas las importaciones, el proceso de enlace
finaliza y se crea el objeto de programa.
Nota: Si ha especificado que una variable o procedimiento se va a exportar
(mediante la palabra clave EXPORT), es posible que el nombre de la
variable o el nombre del procedimiento sea idéntico al de otra variable o
procedimiento de otro procedimiento del objeto de programa enlazado. En
este caso, el resultado puede no ser el esperado. Consulte la publicación
ILE Conceptos para obtener información sobre cómo manejar esta
situación.
Ejemplos adicionales
Para ver más ejemplos de creación de programas, consulte los apartados
siguientes:
“Enlace a un programa” en la página 100 para ver un ejemplo de enlace de un
módulo y un programa de servicio.
“Ejemplo de fuente de depuración” en la página 214 para ver un ejemplo de
creación de un programa que consta de un módulo RPG y un módulo C.
Mandatos CL relacionados
Los mandatos CL siguientes se pueden utilizar con programas:
Cambiar Programa (CHGPGM)
Suprimir Programa (DLTPGM)
Visualizar Programa (DSPPGM)
Visualizar Referencias de Programa (DSPPGMREF)
Actualizar Programa (UPDPGM)
Trabajar con Programas (WRKPGM)
Para obtener más información acerca de estos mandatos, consulte la publicación
CL Reference.
El listado del enlazador contiene las secciones siguientes, en función del valor
especificado para DETAIL:
Tabla 6. Secciones del listado del enlazador en función del parámetro DETAIL
Nombre de la sección *BASIC *EXTENDED *FULL
Resumen de opciones del X X X
mandato
Tabla de resumen abreviada X X X
Tabla de resumen ampliada X X
Listado de información del enla- X X
zador
Listado de referencias cruzadas X
Estadísticas de enlace X
Para obtener más información acerca de los listados del enlazador, consulte la
publicación ILE Conceptos.
Para finalizar, es posible que desee reducir el tamaño de su programa una vez
haya finalizado una aplicación. Los programas ILE tienen datos adicionales
añadidos, los cuales los convierten en mayores que un programa OPM similar.
Cada una de estas acciones necesitan datos distintos para efectuar las modifi-
caciones. Los recursos que necesita pueden no estar disponibles en un programa
ILE.
Sin embargo, en los niveles más altos de optimización, los valores de los campos
pueden no ser exactos cuando se visualizan en una sesión de depuración o
después de una recuperación de excepción. Además, es posible que el depurador
de fuentes haya alterado las posiciones de los pasos y los puntos de interrupción
en el código optimizado, ya que las modificaciones de optimización pueden eli-
minar o cambiar el orden de algunas sentencias.
Para garantizar que el contenido de un campo refleja su valor más reciente, espe-
cialmente tras una recuperación de excepción, puede utilizar la palabra clave
NOOPT en la especificación de definición correspondiente. Para obtener más
información, véase el apartado “Consideraciones acerca de la optimización” en la
página 230.
Utilice el mandato CHGPGM o CHGMOD para eliminar uno u otro tipo de datos de
un programa o módulo. para eliminar ambos tipos o para no eliminar ninguno. La
eliminación de la información observable reduce un objeto a su tamaño mínimo (sin
compresión). No es posible modificar el objeto de ninguna manera excepto
creándolo de nuevo. Por lo tanto, asegúrese que dispone de todo el fuente nece-
sario para crear el programa o de que tiene un objeto de programa parecido con
CRTDATA. Para volverlo a crear, debe tener autorización para acceder al código
fuente.
Si elimina estos datos, asegúrese de que dispone de todo el fuente necesario para
crear el programa o de que tiene un objeto de programa parecido con CRTDATA.
De lo contrario, no podrá modificar el objeto.
Para obtener más información acerca de estos mandatos CL, consulte la publi-
cación CL Reference.
Los programas de servicio suelen utilizarse para las funciones habituales que se
realizan con frecuencia en las aplicaciones. Por ejemplo, los compiladores ILE uti-
lizan programas de servicio para proporcionar servicios en tiempo de ejecución,
tales como funciones matemáticas y rutinas de entrada/salida. Los programas de
servicio permiten volver a utilizar, simplificar el mantenimiento y reducir los requi-
sitos de almacenamiento.
Si cambia la interfaz con un programa de servicio, tal vez tenga que enlazar de
nuevo todos los programas enlazados al programa de servicio original. Sin
embargo, si las modificaciones necesarias son compatibles ascendentemente, tal
vez pueda reducir la cantidad de operaciones de enlace nuevas si ha creado el
programa de servicio utilizando el lenguaje enlazador. En este caso, después de
actualizar el fuente en lenguaje enlazador para identificar las nuevas expor-
taciones, tendrá que enlazar de nuevo solamente los programas que las utilizan.
SUGERENCIA
Para obtener más información acerca de estos puntos, véase el apartado “Modifi-
cación de un módulo o programa” en la página 89.
Mandatos CL relacionados
Los mandatos CL siguientes también se utilizan con los programas de servicio:
Cambiar Programa de Servicio (CHGSRVPGM)
Visualizar Programa de Servicio (DSPSRVPGM)
Suprimir Programa de Servicio (DLTSRVPGM)
Actualizar Programa de Servicio (UPDSRVPGM)
Trabajar con Programa de Servicio (WRKSRVPGM)
\=================================================================\
\ CvtToHex - Convertir serie de entrada a serie de salida hex.
\=================================================================\
D/COPY RPGGUIDE/QRPGLE,CVTHEXPR
\-----------------------------------------------------------------\
\ Parámetros principales de entrada
\ 1. Entrada: serie carácter(n)
\ 2. Salida: serie haxadecimal carácter(2 \ n)
\-----------------------------------------------------------------\
D CvtToHex PI OPDESC
D InString 16383 CONST OPTIONS(\VARSIZE)
D HexString 32766 OPTIONS(\VARSIZE)
\-----------------------------------------------------------------\
\ Prototipo para CEEDOD (Recuperar descriptor operativo)
\-----------------------------------------------------------------\
D CEEDOD PR
D ParmNum 1ðI ð CONST
D 1ðI ð
D 1ðI ð
D 1ðI ð
D 1ðI ð
D 1ðI ð
D 12A OPTIONS(\OMIT)
\-----------------------------------------------------------------\
\ Otros campos que el programa utiliza \
\-----------------------------------------------------------------\
D HexDigits C CONST('ð123456789ABCDEF')
D IntDs DS
D IntNum 5I ð INZ(ð)
D IntChar 1 OVERLAY(IntNum:2)
D HexDs DS
D HexC1 1
D HexC2 1
D InChar S 1
D Pos S 5P ð
D HexPos S 5P ð
\-----------------------------------------------------------------\
\ Utilizar descriptores operativos para determinar la longitud \
\ de los parámetros que se han transmitido. \
\-----------------------------------------------------------------\
\-----------------------------------------------------------------\
\ Determinar la longitud que debe manejarse (como mínimo, igual a \
\ la longitud de entrada y a la mitad de la longitud hexadecimal) \
\-----------------------------------------------------------------\
C IF InLen > HexLen / 2
C EVAL InLen = HexLen / 2
C ENDIF
\-----------------------------------------------------------------\
\ Para cada carácter de la serie de entrada, realizar conversión \
\ a una representación hexadecimal (por ejemplo, '5' --> 'F5') \
\-----------------------------------------------------------------\
C EVAL HexPos = 1
C DO InLen Pos
C EVAL InChar = %SUBST(InString : Pos :1)
C EXSR GetHex
C EVAL %SUBST(HexString : HexPos : 2) = HexDs
C EVAL HexPos = HexPos + 2
C ENDDO
\-----------------------------------------------------------------\
\ Terminado; volver al llamador. \
\-----------------------------------------------------------------\
C RETURN
\=================================================================\
\ GetHex - subrutina para convertir 'InChar' en 'HexDs' \
\ \
\ Utilizar la división por 16 para separar los dos dígitos hex. \
\ El cociente es el primer dígito, el resto es el segundo. \
\=================================================================\
C GetHex BEGSR
C EVAL IntChar = InChar
C IntNum DIV 16 X1 5 ð
C MVR X2 5 ð
\-----------------------------------------------------------------\
\ Utilizar el dígito hexadecimal (más 1) para realizar una \
\ subserie de la lista de caracteres hexadecimales 'ð12...CDEF'. \
\-----------------------------------------------------------------\
C EVAL HexC1 = %SUBST(HexDigits:X1+1:1)
C EVAL HexC2 = %SUBST(HexDigits:X2+1:1)
C ENDSR
\=================================================================\
\ CvtToHex - convierte serie de entrada en serie de salida hex.
\
\ Parámetros
\ 1. Entrada: serie carácter(n)
\ 2. Salida: serie hexadecimal carácter(2 \ n)
\=================================================================\
D CvtToHex PR OPDESC
D InString 16383 CONST OPTIONS(\VARSIZE)
D HexString 32766 OPTIONS(\VARSIZE)
Figura 43. Fuente del miembro /COPY con el prototipo para CvtToHex
STRPGMEXP SIGNATURE('CVTHEX')
EXPORT SYMBOL('CVTTOHEX')
ENDPGMEXP
Las sentencias EXPORT del lenguaje enlazador identifican las exportaciones del
programa de servicio. Se necesita una para cada procedimiento cuyas expor-
taciones desee hacer disponibles al llamador. En este caso, el programa de ser-
vicio contiene un módulo que contiene un procedimiento. Por lo tanto, sólo se
necesita una sentencia EXPORT.
Para obtener más información acerca del lenguaje enlazador y las signaturas, con-
sulte la publicación ILE Conceptos.
Enlace a un programa
Para completar el ejemplo, crearemos una "aplicación" que constará del programa
CVTHEXPGM que está enlazado al programa de servicio. Utiliza una serie de
siete caracteres que se pasa dos veces a CVTTOHEX; una vez cuando el valor de
la serie hexadecimal es 10 (es decir, convertir 5 caracteres) y la otra cuando su
valor es 14, es decir, la longitud real.
Observe que el programa CVTHEXPGM sirve para mostrar la utilización del pro-
grama de servicio CVTTOHEX. En una aplicación real, el llamador de CVTTOHEX
tendría otro objetivo primario en lugar de la prueba de CVTTOHEX. Además, un
programa de servicio lo utilizarían normalmente otros programas o bien unos pocos
programas lo utilizarían muchas veces; de lo contrario, la actividad que supone la
llamada inicial no justificaría su conversión en un programa de servicio.
Result14++++++
Result1ð++
C1C2C3F1F2 1ð caracteres de salida
C1C2C3F1F2F35C 14 caracteres de salida
\----------------------------------------------------------------\
\ Programa para comprobar CVTTOHEX de programa de servicio \
\ \
\ 1. Utilice una serie de entrada de 7 caracteres \
\ 2. Conviértala en una serie hexadecimal de 1ð caracteres (sólo \
\ se utilizarán los 5 primeros caracteres de entrada porque \
\ el resultado es demasiado pequeño para la entrada) \
\ 3. Conviértala en una serie hexadecimal de 14 caracteres (se \
\ utilizarán los 7 caracteres de entrada ya que el resultado \
\ tiene la longitud suficiente) \
\----------------------------------------------------------------\
FQSYSPRT O F 8ð PRINTER
D ResultDS DS
D Result14 1 14
D Result1ð 1 1ð
D InString S 7
D Comment S 25
\----------------------------------------------------------------\
\ Transfiera la serie de caracteres y el campo de resultado de \
\ 1ð caracteres utilizando una llamada de prototipos. Los \
\ descriptores operativos los pasa, cuando es necesario, \
\ el procedimiento de llamada CvtToHex. \
\----------------------------------------------------------------\
C EVAL Comment = 'salida de 1ð caracteres'
C CLEAR ResultDS
C CALLP CvtToHex(Instring : Result1ð)
C EXCEPT
\----------------------------------------------------------------\
\ Transfiera la serie de caracteres y el campo de resultado de \
\ 14 caracteres utilizando CALLB(D). El ampliador de operación \
\ (D) creará descriptores operativos para los parámetros pasados.\
\ Se utiliza para comparar con CALLP anterior. \
\----------------------------------------------------------------\
C EVAL Comment = 'salida de 14 caracteres'
C CLEAR ResultDS
C CALLB(D) 'CVTTOHEX'
C PARM InString
C PARM Result14
C EXCEPT
OQSYSPRT H 1P
O 'Result14++++++'
OQSYSPRT H 1P
O 'Result1ð++'
OQSYSPRT E
O ResultDS
O Comment +5
\ \ \ \ \ F I N D E T A B L A D E R E S U M E N B R E V E \ \ \ \ \
Crear programa Página 3
| 5763SS1 V3R7Mð 961121 MYLIB/CVTHEXPGM AS4ððSð1 12/3ð/96 23:24:ðð
Estadísticas de enlace
Tiempo CPU recogida símbolos . . . . . . . . . . . . . . . . : .ð16
Tiempo CPU resolución símb. . . . . . . . . . . . . . . . . : .ðð4
Tiempo CPU resolución director. enlace . . . . . . . . . . . : .175
Tiempo CPU compilación lenguaje enlaz. . . . . . . . . . . . : .ððð
Tiempo CPU creación listado . . . . . . . . . . . . . . . . : .ð68
Tiempo CPU creación programa/servicio . . . . . . . . . . . : .234
Tiempo CPU total . . . . . . . . . . . . . . . . . . . . . . : .995
Tiempo total transc. . . . . . . . . . . . . . . . . . . . . : 3.531
\ \ \ \ \ F I N D E E S T A D Í S T I C A S E N L A C E \ \ \ \ \
\CPC5Dð7 - Programa CVTHEXPGM creado en biblioteca MIBIB.
\ \ \ \ \ F I N D E L I S T A D O D E C R E A R P R O G R A M A \ \ \
\===============================================================\
\ NOMBRE PROG: EMPRPT2 \
\ ARCHIV RELAC: EMPMST (ARCHIVO FÍSICO) \
\ PRINT (ARCHIVO DE IMPRESORA) \
\ DESCRIPCIÓN: Este programa imprime información de \
\ empleados almacenada en el archivo EMPMST si \
\ se ha entrado la contraseña correcta. \
\ Ejecut el programa tecleando "CALL nombre de \
\ biblioteca/EMPRPT2 (PSWORD)" en la línea de \
\ mandatos donde PSWORD es la contraseña del \
\ programa. La contraseña para este programa \
\ 'HELLO' \
\===============================================================\
FPRINT O F 8ð PRINTER
FEMPMST IP E K DISK
IEMPREC ð1
\-----------------------------------------------------------------\
\ En este programa se especifica la lista de parámetros de \
\ entrada. Existe un parámetro llamado PSWORD y es un campo \
\ con una longitud de 5 caracteres. \
\-----------------------------------------------------------------\
C \ENTRY PLIST
C PARM PSWORD 5
\-----------------------------------------------------------------\
\ La contraseña para este programa es 'HELLO'. Se comprueba el \
\ campo PSWORD para ver si contiene o no 'HELLO'. \
\ Si no es así, se activa el indicador de último registro (LR) e \
\ \IN99. \IN99 controla la impresión de los mensajes. \
\-----------------------------------------------------------------\
C PSWORD IFNE 'HELLO'
C SETON LR99
C ENDIF
OPRINT H 1P 2 6
O 5ð 'INFORMACIÓN EMPLEADOS'
O H 1P
O 12 'NOMBRE'
O 34 'NÚME SERIE'
O 45 'DEPT'
O 56 'TIPO'
O D ð1N99
O ENAME 2ð
O ENUM 32
O EDEPT 45
O ETYPE 55
O D 99
O 16 '\\\'
O 4ð 'Entrada contraseña no válida'
O 43 '\\\'
En la Figura 48 en la página 108 se muestran las DDS a las que hace referencia
el fuente de EMPRPT2.
A\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
A\ DESCRIPTION: Estas son las DDS del archivo físico MSTEMP. \
A\ Contiene un formato de registro llamado EMPREG. \
A\ Este archivo contiene un registro para cada \
A\ empleado de la empresa. \
A\ \
A R EMPREC
A ENUM 5 ð TEXT('NÚMERO EMPLEADO')
A ENAME 2ð TEXT('NOMBRE EMPLEADO')
A ETYPE 1 TEXT('TIPO EMPLEADO')
A EDEPT 3 ð TEXT('DEPARTAMENTO EMPLEADO')
A ENHRS 3 1 TEXT('JORNADA SEMANAL NORMAL EMPL.')
A K ENUM
Selección o mandato
===>
á ñ
Figura 49. Ejemplo del menú de una aplicación
En la Figura 50 en la página 109 se muestran las DDS del archivo de pantalla del
menú anterior. El miembro fuente se llama NÓMINA y su tipo de fuente es
MNUDDS. El archivo se ha creado utilizando SDA.
A HELP
A HOME
A HLPRTN
A 1 34'MENÚ DEPARTAMENTO NÓMINAS'
A DSPATR(HI)
A 3 2'Seleccione uno de los siguientes:'
A COLOR(BLU)
A 5 7'1.'
A 6 7'2.'
A 7 7'3.'
Figura 50. Especificación de descripción de datos (DDS) del menú de una aplicación
PAYROLQQ,1
ððð1 call RPGINQ
ððð2 call RPGCHG
ððð3 call RPGADD
Por ejemplo, puede crear un mandato llamado NOM que llame al programa
NOMINA, siendo NOMINA el nombre del programa RPG que desea ejecutar.
Puede entrar el mandato de forma interactiva o en un trabajo de proceso por lotes.
Consulte el manual CL Programación para obtener más información sobre cómo
utilizar las definiciones de mandatos.
Puede añadir los mensajes de consulta a una lista de respuestas del sistema para
proporcionar respuestas automáticas a los mensajes. Las respuestas a estos men-
sajes se pueden especificar de forma individual o general. Esta forma de res-
ponder a los mensajes de consulta resulta especialmente adecuada para los
programas de proceso por lotes, que, de lo contrario, necesitarían un operador que
emitiera respuestas.
Puede añadir los siguientes mensajes de consulta ILE RPG/400 a la lista de res-
puestas del sistema:
Para añadir mensajes de consulta a una lista de respuestas del sistema mediante
el mandato Añadir Entrada a Lista de Respuestas, entre lo siguiente:
ADDRPYLE número-secuencia id-mensaje
siendo número-secuencia un número comprendido entre 1 y 9999, que indica en
qué posición de la lista se añade la entrada e id-mensaje el número de mensaje
que desea añadir. Repita este mandato para cada mensaje que desee añadir.
La lista de respuesta sólo se utiliza cuando un trabajo que tiene el atributo Res-
puesta a Mensaje de Consulta (INQMSGRPY) especificado como
INQMSGRPY(*SYSRPYL) emite un mensaje de consulta. El parámetro
INQMSGRPY aparece en los mandatos CL siguientes:
Cambiar Trabajo (CHGJOB)
Cambiar Descripción de Trabajo (CHGJOBD)
Crear Descripción de Trabajo (CRTJOBD)
Someter Trabajo (SBMJOB).
mendable que especifique otro valor en este parámetro. Por ejemplo, tal vez
desea nominar al grupo de activación con el nombre de la aplicación.
*NEW
Cuando se especifica *NEW, se crea un grupo de activación nuevo cada vez
que se llama al programa. El sistema crea un nombre para el grupo de acti-
vación. Este nombre es exclusivo en el trabajo.
Un grupo de activación creado con *NEW siempre finaliza cuando termina el
programa con el que está asociado. Por este motivo, si piensa retornar del
programa con LR OFF para que el programa siga activo, no debe especificar
*NEW en el parámetro ACTGRP.
Nota: Este valor no es válido para los programas de servicio. Un programa
de servicio sólo se puede ejecutar en un grupo de activación con
nombre o en el grupo de activación del llamador.
*NEW es el valor por omisión del parámetro ACTGRP en el mandato
CRTPGM.
Si crea un programa ILE RPG/400 con ACTGRP(*NEW), puede llamar al pro-
grama tantas veces como desee sin retornar de las llamadas anteriores. Con
cada llamada, se creará un copia nueva del programa. Cada una de estas
copias tendrá sus propios datos, abrirá sus archivos, etc.. No obstante, debe
asegurarse de que haya algún modo de finalizar las llamadas a "sí mismo"; de
lo contrario, seguirá creando nuevos grupos de activación y los programas
nunca retornarán.
*CALLER
El programa o el programa de servicio se activará en el grupo de activación del
programa de llamada. Si un programa OPM llama a un programa ILE creado
con ACTGRP(*CALLER), éste se activará en el grupo de activación OPM por
omisión (*DFTACTGRP).
Los grupos de activación con nombre (como QILE) son persistentes, ya que no se
suprimen a menos que se indique explícitamente o finalice el trabajo. El almace-
namiento asociado a los programas que se ejecutan en grupos de activación con
nombre no se libera hasta que se suprimen dichos grupos de activación.
para suprimir todos los grupos de activación elegibles o para suprimir un grupo de
activación por nombre.
Para obtener más información acerca del mandato RCLACTGRP, consulte la publi-
cación CL Reference. Para obtener más información acerca del mandato
RCLACTGRP y los grupo de activación, consulte la publicación ILE Conceptos.
Para los programas ILE que se han activado en el grupo de activación OPM por
omisión porque se han creado con *CALLER, se cierran los archivos y se
reinicializa el almacenamiento al emitir el mandato RCLRSC. Sin embargo, el
almacenamiento no se liberará.
Para obtener más información acerca del mandato RCLRSC, consulte la publi-
cación CL Reference. Para obtener más información acerca del mandato RCLRSC
y de los grupos de activación, consulte la publicación ILE Conceptos.
| Todos los programas del mismo grupo de activación utilizan la misma área de
| almacenamiento dinámico por omisión. Si un programa accede al almacenamiento
| que no está asignado, puede causar problemas a otro programa. Por ejemplo,
| supongamos que dos programas, PGM A y PGM B, se están ejecutando en el
| mismo grupo de activación. Se han asignado 10 bytes para PGM A, pero este
| programa modifica 11 bytes. Si el byte de más estuviera asignado al programa
| PGM B, podrían surgir problemas en PGM B.
| \-----------------------------------------------------------------\
| \ Prototipos para los subprocedimientos de este módulo \
| \-----------------------------------------------------------------\
| D AddName PR
| D nombre_parám 4ðA
| D Display PR
| D Free PR
| \-----------------------------------------------------------------\
| \ Cada uno de los elementos de la lista contiene un puntero para \
| \ el nombre y un puntero para el siguiente elemento externo \
| \-----------------------------------------------------------------\
| D elem DS BASED(elem@)
| D name@ \
| D next@ \
| D long_nombre 5U ð
| D nameVal S 4ðA BASED(name@)
| D elemSize C %SIZE(elem)
| \-----------------------------------------------------------------\
| \ El primer elemento de la lista se halla en almacenamiento \
| \ estático. El campo de nombre de este elemento no está definido \
| \ en ningún valor. \
| \-----------------------------------------------------------------\
| D first DS
| D \ INZ(\NULL)
| D \ INZ(\NULL)
| D 5U ð INZ(ð)
| \-----------------------------------------------------------------\
| \ Se trata de un puntero para el elemento actual. \
| \ Cuando se establece elem@ en la dirección de <first>, la lista \
| \ aparece vacía. \
| \-----------------------------------------------------------------\
| D elem@ S \ INZ(%ADDR(first))
| \-----------------------------------------------------------------\
| \ Coloque 5 elementos en la lista \
| \-----------------------------------------------------------------\
| C DO 5
| C '¿Nombre?' DSPLY name 4ð
| C CALLP AddName(name)
| C ENDDO
| \-----------------------------------------------------------------\
| \ Visualice la lista y libérala a continuación. \
| \-----------------------------------------------------------------\
| C CALLP Display
| C CALLP Free
| Figura 52 (Parte 1 de 5). Gestión de memoria - Crear una lista enlazada de nombres
| \-----------------------------------------------------------------\
| \ S U B P R O C E D I M I E N T O S \
| \-----------------------------------------------------------------\
| \-----------------------------------------------------------------\
| \ AddName - añadir un nombre al final de la lista \
| \-----------------------------------------------------------------\
| P AddName B
| D AddName pi
| D name 4ðA
| \-----------------------------------------------------------------\
| \ Asigne un elemento nuevo para la matriz, apuntado por el \
| \ 'siguiente' puntero del final actual de la lista. \
| \ \
| \ Antes: \
| \ \
| \ .-------------. \
| \ | | \
| \ | nombre \--->abc \
| \ | long_nom 3 | \
| \ | siguiente\-------||| \
| \ | | \
| \ '-------------' \
| \ \
| \-----------------------------------------------------------------\
| C ALLOC elemSize next@
| \-----------------------------------------------------------------\
| \ \
| \ Después: Fíjese en que el elemento anterior sigue siendo el \
| \ actual porque elem@ aún apunta al elemento anterior \
| \ \
| \ .-------------. .--------------. \
| \ | | .------>| | \
| \ | nombre \--->abc | | | \
| \ | long_nom 3 | | | | \
| \ | siguiente\----------' | | \
| \ | | | | \
| \ '-------------' '--------------' \
| \ \
| \ Ahora defina elem@ para que apunte al elemento nuevo \
| \-----------------------------------------------------------------\
| C EVAL elem@ = next@
| Figura 52 (Parte 2 de 5). Gestión de memoria - Crear una lista enlazada de nombres
| \-----------------------------------------------------------------\
| \ \
| \ Después: Ahora los nombres name@, long_nom y next@ hacen \
| \ referencia al almacenamiento en el elemento nuevo \
| \ \
| \ .-------------. .--------------. \
| \ | | .------>| | \
| \ | \--->abc | | nombre \ | \
| \ | 3 | | | long_nom | \
| \ | \----------' | siguiente \ | \
| \ | | | | \
| \ '-------------' '--------------' \
| \ \
| \ Ahora defina los valores del elemento nuevo. \
| \ El puntero siguiente se establece en \NULL para indicar que \
| \ se trata del final de la lista. \
| \-----------------------------------------------------------------\
| C EVAL next@ = \NULL
| \-----------------------------------------------------------------\
| \ Guarde la longitud del nombre (sin incluir blancos de cola)
| \-----------------------------------------------------------------\
| C EVAL long_nom = %len(%trimr(name))
| \-----------------------------------------------------------------\
| \ Se asigna almacenamiento para el nombre y a continuación debe
| \ establecer el valor para el nombre.
| \-----------------------------------------------------------------\
| C ALLOC name_len name@
| C EVAL %SUBST(nameVal:1:long_nom) = name
| \-----------------------------------------------------------------\
| \ \
| \ Después: \
| \ \
| \ .-------------. .--------------. \
| \ | | .------>| | \
| \ | \--->abc | | nombre \--->nombrenuevo \
| \ | 3 | | | long_nom nn | \
| \ | \----------' | siguiente \--->||| \
| \ | | | | \
| \ '-------------' '--------------' \
| \-----------------------------------------------------------------\
| P AddName E
| \-----------------------------------------------------------------\
| \ Visualizar - visualizar la lista \
| \-----------------------------------------------------------------\
| P Display B
| D saveElem@ S \
| D dspName S 4ðA
| Figura 52 (Parte 3 de 5). Gestión de memoria - Crear una lista enlazada de nombres
| \-----------------------------------------------------------------\
| \ Guarde el puntero de elemento actual de forma que se pueda \
| \ restaurar la lista después de visualizarla y establezca el \
| \ puntero para la lista al principio de la misma. \
| \-----------------------------------------------------------------\
| C EVAL saveElem@ = elem@
| C EVAL elem@ = %ADDR(first)
| \-----------------------------------------------------------------\
| \ Repita los elementos de la lista en bucle hasta que el siguiente\
| \ puntero tenga el valor \NULL \
| \-----------------------------------------------------------------\
| C DOW next@ <> \NULL
| C EVAL elem@ = next@
| C EVAL dspName = %SUBST(nameVal:1:long_nom)
| C 'Nombre: ' dsply dspName
| C ENDDO
| \-----------------------------------------------------------------\
| \ Restaure el puntero de la lista en su lugar anterior
| \-----------------------------------------------------------------\
| C EVAL elem@ = saveElem@
| P Display E
| \-----------------------------------------------------------------\
| \ Liberar - liberar el almacenamiento que la lista utiliza
| \-----------------------------------------------------------------\
| P Free B
| D prv@ S \
| \-----------------------------------------------------------------\
| \ Repita los elementos de la lista en bucle hasta que el siguiente\
| \ puntero tenga un valor de \NULL, empezando por el primer \
| \ elemento real de la lista \
| \-----------------------------------------------------------------\
| C EVAL elem@ = %ADDR(first)
| C EVAL elem@ = next@
| \-----------------------------------------------------------------\
| \ Libere el almacenamiento para el nombre \
| \-----------------------------------------------------------------\
| C DEALLOC name@
| \-----------------------------------------------------------------\
| \ Guarde el puntero en el elem@ actual
| \-----------------------------------------------------------------\
| C EVAL prv@ = elem@
| \-----------------------------------------------------------------\
| \ Avance elem@ al siguiente elemento
| \-----------------------------------------------------------------\
| C EVAL elem@ = next@
| Figura 52 (Parte 4 de 5). Gestión de memoria - Crear una lista enlazada de nombres
| \-----------------------------------------------------------------\
| \ Libere el almacenamiento para el elemento actual
| \-----------------------------------------------------------------\
| C DEALLOC prv@
| C ENDDO
| \-----------------------------------------------------------------\
| \ Preparado para una lista nueva:
| \-----------------------------------------------------------------\
| C EVAL elem@ = %ADDR(first)
| P Free E
| Figura 52 (Parte 5 de 5). Gestión de memoria - Crear una lista enlazada de nombres
| \-----------------------------------------------------------------\
| \ Utilización incorrecta del almacenamiento del área de \
| \ almacenamiento dinámico \
| \-----------------------------------------------------------------\
| D Fld1 S 25A BASED(Ptr1)
| D Fld2 S 5A BASED(Ptr2)
| D Ptr1 S \
| D Ptr2 S \
| ....
| C ALLOC 25 Ptr1
| C DEALLOC Ptr1
| \-----------------------------------------------------------------\
| \ A partir de este punto, Fld1 debería dejar de estar accesible
| \ ya que el puntero de base ptr1 ya no apunta al almacenamiento
| \ asignado.
| \-----------------------------------------------------------------\
| C CALL 'SOMEPGM'
| \-----------------------------------------------------------------\
| \ Durante la llamada anterior a 'SOMEPGM', es posible que se hayan
| \ realizado distintas asignaciones de almacenamiento.
| \ En cualquier caso, la realización de la siguiente tarea comporta
| \ un grave peligro ya que 25 bytes de almacenamiento se rellenarán
| \ con 'a'. Es imposible conocer para qué se utiliza actualmente
| \ el almacenamiento.
| \-----------------------------------------------------------------\
| C EVAL Fld1 = \ALL'a'
| Figura 53. Utilización incorrecta del almacenamiento del área de almacenamiento dinámico
| DYNARRAY realiza estas acciones utilizando las tres API de almacenamiento enla-
| zable de ILE, que son CEECRHP (Crear área de almacenamiento dinámico)
| CEEGTST (Obtener almacenamiento) y CEEDSHP (Eliminar área de almace-
| namiento dinámico) así como el código de operación REALLOC. Consulte la publi-
| cación System API Reference para obtener información específica acerca de las
| API enlazables de gestión de almacenamiento.
| \=================================================================
| \ MATRDIN : Asignar una matriz de ejecución empaquetada (15,ð)
| \ no enlazada (prácticamente). Este módulo contiene
| \ procedimientos para asignar la matriz, devolver o
| \ establecer un valor de matriz y desasignar la
| \ matriz.
| \=================================================================
| H NOMAIN
| \-----------------------------------------------------------------
| \ Prototipos para los proecedimientos de este módulo.
| \-----------------------------------------------------------------
| /COPY DYNARRI
| \-----------------------------------------------------------------
| \ Interfaz de la API CEEGTST (Obtener almacenamiento dinámico).
| \ 1) HeapId = Id del área de almacenamiento dinámico
| \ 2) Size = Número de bytes a asignar
| \ 3) RetAddr= Dirección de retorno del almacenamiento asignado
| \ 4) \OMIT = El parámetro de realimentación. Especificar \OMIT
| \ aquí significa que recibiremos una excepción de la
| \ API si ésta no puede satisfacer nuestra petición.
| \
| \ Dado que no lo supervisamos, el procedimiento de
| \ llamada recibirá la excepción.
| \-----------------------------------------------------------------
| D CEEGTST PR
| D HeapId 1ðI ð CONST
| D Size 1ðI ð CONST
| D RetAddr \
| D Feedback 12A OPTIONS(\OMIT)
| \-----------------------------------------------------------------
| \ Interfaz de la API CEECRHP (Crear almacenamiento dinámico).
| \ 1) HeapId = Id del área de almacenamiento dinámico
| \ 2) InitSize = Tamaño inicial del área de almacenamiento
| \ dinámico.
| \ 3) Incr = Número de bytes a incrementar si se aumenta el
| \ almacenamiento dinámico.
| \ 4) AllocStrat = Estrategia de asignación para este almacenamiento
| \ dinámico. Especificaremos un valor de ð, que
| \ permite que el sistema elija la estrategia óptima.
| \ 5) \OMIT = El parámetro de realimentación. Especificar \OMIT
| \ aquí significa que recibiremos una excepción de la
| \ API si ésta no puede satisfacer nuestra petición.
| \
| \ Dado que no lo supervisamos, el procedimiento de
| \ llamada recibirá la excepción.
| \-----------------------------------------------------------------
| D CEECRHP PR
| D HeapId 1ðI ð
| D InitSize 1ðI ð CONST
| D Incr 1ðI ð CONST
| D AllocStrat 1ðI ð CONST
| D Feedback 12A OPTIONS(\OMIT)
| Figura 54 (Parte 1 de 2). Archivo /COPY de DYNARRI que contiene prototipos para el
| módulo DYNARRAY
| \-----------------------------------------------------------------
| \ Interfaz de la API CEEDSHP (Eliminar almacenamiento dinámico).
| \ 1) HeapId = Id del almacenamiento dinámico.
| \ 2) \OMIT = El parámetro de realimentación. Especificar \OMIT
| \ aquí significa que recibiremos una excepción de la
| \ API si ésta no puede satisfacer nuestra petición.
| \ Dado que no lo supervisamos, el procedimiento de
| \ llamada recibirá la excepción.
| \-----------------------------------------------------------------
| D CEEDSHP PR
| D HeapId 1ðI ð
| D Feedback 12A OPTIONS(\OMIT)
| \-----------------------------------------------------------------
| \ Variables globales.
| \-----------------------------------------------------------------
| D HeapVars DS
| D HeapId 1ðI ð
| D DynArr@ \
| \-----------------------------------------------------------------\
| \ Definir la matriz dinámica. Codificaremos el número de
| \ elementos como el máximo permitido, teniendo en cuenta que
| \ para esta definición no se declarará en realidad ningún
| \ almacenamiento (porque es BASED).
| \-----------------------------------------------------------------
| D DynArr S DIM(32767) BASED(DynArr@)
| D LIKE(DYNA_TYPE)
| \-----------------------------------------------------------------
| \ Variable global para mantener el seguimiento del número actual
| \ de elementos en la matriz dinámica.
| \-----------------------------------------------------------------
| D NumElems S 1ðI ð INZ(ð)
| \-----------------------------------------------------------------
| \ Número inicial de elementos que se asignarán a la matriz, el
| \ número mínimo de elementos que se añadirán a la matriz en las
| \ asignaciones subsiguientes.
| \-----------------------------------------------------------------
| D INITALLOC C 1ðð
| D SUBSALLOC C 1ðð
| Figura 54 (Parte 2 de 2). Archivo /COPY de DYNARRI que contiene prototipos para el
| módulo DYNARRAY
| \=================================================================
| \ MATRDIN : Asignar una matriz de ejecución empaquetada (15,ð)
| \ no enlazada (prácticamente). El módulo DYNARRAY
| \ contiene procedimientos para asignar la matriz,
| \ devolver un valor de matriz y desasignar la matriz.
| \=================================================================
| D DYNA_TYPE S 15P ð
| D DYNA_INIT PR
| D DYNA_TERM PR
| D DYNA_SET PR
| D Element VALUE LIKE(DYNA_TYPE)
| D Index 5I ð VALUE
| D DYNA_GET PR LIKE(DYNA_TYPE)
| D Index 5I ð VALUE
| \=================================================================
| \ DYNA_INIT: Initializar la matriz.
| \
| \ Función: Crear el almacenamiento dinámico y asignar una cantidad
| \ inicial de almacenamiento para la matriz de ejecución
| \=================================================================
| P DYNA_INIT B EXPORT
| \-----------------------------------------------------------------
| \ Variables locales
| \-----------------------------------------------------------------
| D Size S 1ðI ð
| \
| \ Arrancar con un número predeterminado de elementos.
| \
| C Z-ADD INITALLOC NumElems
| \
| \ Determinar el número de bytes necesarios para la matriz.
| \
| C EVAL Size = NumElems \ %SIZE(DynArr)
| \
| \ Crear el almacenamiento dinámico
| \
| C CALLP CEECRHP(HeapId : Size : ð : ð : \OMIT)
| \
| \ Asignar el almacenamiento y establecer el puntero de base
| \ de la matriz en el puntero devuelto por la API.
| \
| \ Fíjese en que el código de operación ALLOC utiliza el
| \ almacenamiento dinámico por omisión, por lo que debe utilizar
| \ la API CEEGTST si desea especificar un almacenamiento distinto.
| \
| C CALLP CEEGTST(HeapId : Size : DynArr@ : \OMIT)
| \
| \ Inicializar el almacenamiento para la matriz.
| \
| C 1 DO NumElems I 5 ð
| C CLEAR DynArr(I)
| C ENDDO
| P DYNA_INIT E
| \=================================================================
| \ DYNA_TERM: Interrumpir el manejo de matrices
| \
| \ Función: Suprimir el almacenamiento dinámico
| \=================================================================
| P DYNA_TERM B EXPORT
| C CALLP CEEDSHP(HeapId : \OMIT)
| C RESET HeapVars
| P DYNA_TERM E
| \=================================================================
| \ DYNA_SET: Establecer un elemento de matriz.
| \
| \ Función: Verificar que la matriz tenga un tamaño suficiente
| \ para este elemento y establecer el elemento en el
| \ valor proporcionado.
| \=================================================================
| P DYNA_SET B EXPORT
| \-----------------------------------------------------------------
| \ Parámetros de entrada para este procedimiento.
| \-----------------------------------------------------------------
| D DYNA_SET PI
| D Element VALUE LIKE(DYNA_TYPE)
| D Index 5I ð VALUE
| \-----------------------------------------------------------------
| \ Variables locales.
| \-----------------------------------------------------------------
| D Size S 1ðI ð
| \-----------------------------------------------------------------\
| \ Si el usuario selecciona añadir a la matriz, comprobar en \
| \ primer lugar si la matriz es lo suficientemente grande, de lo \
| \ contrario aumentar el tamaño. Añadir el elemento.
| \-----------------------------------------------------------------
| C Index IFGT NumElems
| C EXSR REALLOC
| C ENDIF
| C EVAL DynArr(Index) = Element
| \=================================================================
| \ REALLOC: Reasignar subrutina de almacenamiento
| \
| \ Función: Aumentar el tamaño de la matriz dinámica
| \ e inicializar los nuevos elementos.
| \=================================================================
| C REALLOC BEGSR
| \
| \ Recordar el número de elementos anterior
| \
| C Z-ADD NumElems OldElems 5 ð
| \
| \ Calcular el número nuevo de elementos. Si el índice es
| \ mayor que el número de elementos actual de la matriz
| \ más la nueva asignación, entonces asignar hasta el
| \ índice, de lo contrario, incrementar la cantidad de
| \ almacenamiento asignado a la matriz.
| \
| C IF Index > NumElems + SUBSALLOC
| C Z-ADD Index NumElems
| C ELSE
| C ADD SUBSALLOC NumElems
| C ENDIF
| \
| \ Calcular el tamaño nuevo de la matriz
| \
| C EVAL Size = NumElems \ %SIZE(DynArr)
| \
| \ Reasignar el almacenamiento. El nuevo almacenamiento debe tener
| \ el mismo valor que el anterior.
| \
| C REALLOC Size DynArr@
| \
| \ Inicializar los elementos nuevos de la matriz.
| \
| C 1 ADD OldElems I
| C I DO NumElems I 5 ð
| C CLEAR DynArr(I)
| C ENDDO
| C ENDSR
| P DYNA_SET E
| \=================================================================
| \ DYNA_GET: Devolver un elemento de matriz.
| \
| \ Función: Devolver el valor actual del elemento de matriz si
| \ éste se halla dentro del tamaño de la matriz; en caso
| \ contrario, devolver el valor por omisión.
| \=================================================================
| P DYNA_GET B EXPORT
| \-----------------------------------------------------------------
| \ Parámetros de entrada para este procedimiento.
| \-----------------------------------------------------------------
| D DYNA_GET PI LIKE(DYNA_TYPE)
| D Index 5I ð VALUE
| \-----------------------------------------------------------------
| \ Variables locales.
| \-----------------------------------------------------------------
| D Element S LIKE(DYNA_TYPE) INZ
| \-----------------------------------------------------------------
| \ Si el elemento solicitado se halla dentro del tamaño actual de
| \ la matriz, devolver el valor actual del elemento. En caso
| \ contrario, utilizar el valor por omisión (inicialización).
| \-----------------------------------------------------------------
| C Index IFLE NumElems
| C EVAL Element = DynArr(Index)
| C ENDIF
| C RETURN Element
| P DYNA_GET E
| La Figura 57 en la página 129 muestra otro módulo que comprueba los proce-
| dimientos en DYNARRAY.
| \=================================================================
| \ DYNTEST: Comprobar el módulo DYNARRAY del programa.
| \=================================================================
| /COPY EXAMPLES,DYNARRI
| D X S LIKE(DYNA_TYPE)
| \ Inicializar la matriz
| C CALLP DYNA_INIT
| \ Realizar un borrado
| C CALLP DYNA_TERM
| C SETON LR
Llamada a programas
Puede llamar a programas OPM o ILE mediante llamadas a programas. Una
llamada a programa es una llamada que se hace a un objeto de programa
(*PGM). El nombre del programa llamado se resuelve en una dirección en tiempo
de ejecución, justo antes de que el programa de llamada pase el control por
primera vez al programa llamado. Por este motivo, las llamadas a programas
suelen denominarse llamadas dinámicas.
Utilice la operación CALLP o las operaciones CALL y PARM para realizar una
llamada a programa. Si utiliza las operaciones CALL y PARM, el compilador no
puede llevar a cabo la comprobación de tipo en los parámetros, con lo cual pueden
producirse errores durante la ejecución.
Llamada a procedimientos
A diferencia de los programas OPM, los programas ILE no están limitados a utilizar
llamadas a programas. También pueden utilizar llamadas estáticas a proce-
dimientos o llamadas a punteros de procedimientos para llamar a otros proce-
dimientos. Las llamadas a procedimientos también reciben el nombre de llamadas
enlazadas.
Se utiliza la operación CALLP o las operaciones CALLB y PARM para realizar una
llamada a procedimiento. También puede llamar a un procedimiento de prototipos
en una expresión si el procedimiento devuelve un valor. Si utiliza las operaciones
CALLB y PARM, entonces el compilador no puede realizar la comprobación de tipo
de los parámetros, con lo cual pueden producirse errores durante la ejecución.
La pila de llamadas
La pila de llamadas es una lista de las entradas de la pila de llamadas en el
orden LIFO (último en entrar primero en salir). Una entrada de pila de llamadas
es una llamada a un programa o procedimiento. Hay una pila de llamadas por
cada trabajo.
PILA DE LLAMADAS
┌─OPM────────┐
│ │
│ Programa A │. . . . . . .┌─OPM──────────┐
│ │ │ │
└────────────┘. . . . . . .└───────┬──────┘
│ Llamada a programa
┌─ILE──────────────┐ 6
│ ┌─Módulo RPG─┐ .│. . . . . ┌─ILE──────────┐
│ │ Procedim. │ │ │ PEP │
│ │ entr. prog.│ .│. . . . . └───────┬──────┘
│ ├────────────┤ │ │ Llamada a procedimiento
│ │ Procedim. │ .│. . . . . ┌─Proc.─6──────┐ (por el sistema)
│ │ Módulo C │ .│. . . . . │ ILE │
│ ├────────────┤ │ └───────┬──────┘ Llamada a procedimiento
│ │ Sub- │ .│. . . . . ┌─Proc.─6──────┐
│ │ Módulo C │ .│. . . . . │ ILE │
│ └────────────┘ │ └───────┬──────┘ Llamada a procedimiento
│ ┌Procedim.───┐ .│. . . . . ┌─Proc.─6──────┐
│ │ principal │ .│. . . . . │ ILE │
│ └────────────┘ │ └──────────────┘
└──────────────────┘
Figura 58. Llamadas a programas y procedimientos en la pila de llamadas
Llamadas recurrentes
Las llamadas recurrentes sólo se permiten para subprocedimientos. Una llamada
recurrente es una llamada en la que el procedimiento A se llama a sí mismo o
llama al procedimiento B, que a su vez vuelve a llamar al procedimiento A. Cada
llamada recurrente hace que se coloque en la pila de llamadas una nueva invoca-
ción del procedimiento. La nueva invocación tiene un almacenamiento nuevo para
todos los ítems de datos del almacenamiento automático y dicho almacenamiento
no está disponible a las demás invocaciones ya que es local. (Un ítem de datos
definido en un subprocedimiento utiliza almacenamiento automático a menos que
se especifique la palabra clave STATIC para la definición.) Tenga en cuenta
también que el almacenamiento automático asociado a invocaciones anteriores no
resulta afectado por las invocaciones posteriores.
┌──────────┐
│ PGM X │
└────┬─────┘
┌────6─────┐
│ PRC_A │
└────┬─────┘
┌────6─────┐
│ PRC_B │
└────┬─────┘
┌────6─────┐
│ PRC_C │
└────┬─────┘
┌────6─────┐
│ PRC_A │ Llamada recurrente
└──────────┘
¡Atención!
La Tabla 8 asocia las consideraciones anteriores con los dos tipos de parámetros:
de prototipos o no de prototipos.
C CALLP Conmutador(\in1ð)
Esta sección trata sobre las diferentes opciones disponibles cuando define paráme-
tros de prototipos y el impacto de dichas opciones en la interfaz de llamada.
Los parámetros que no son de prototipos sólo pueden pasarse por referencia
Una ventaja principal de pasar por valor es que permite una coincidencia menos
rigurosa de los atributos del parámetro que se ha pasado. Por ejemplo, si la defi-
nición es para un campo numérico de tipo decimal empaquetado y longitud 5 con 2
posiciones decimales, debe pasar un valor numérico, pero este puede ser:
Una constante o variable empaquetada, con zona o binaria, con cualquier
número de dígitos y posiciones decimales.
Una función incorporada que devuelve un valor numérico
Un procedimiento que devuelve un valor numérico
Una expresión numérica compleja como por ejemplo
2 \ (Min(Length(First) + Length(Last) + 1): %size(Name))
Para pasar un parámetro por valor, especifique la palabra clave VALUE en la defi-
nición de parámetro del prototipo, como se muestra en las figuras siguientes.
\-------------------------------------------------------------
\ El procedimiento devuelve un valor entero de 1ð dígitos.
\ Los 3 parámetros son todos enteros de 5 dígitos pasados por
\ valor.
\-------------------------------------------------------------
D MyFunc PR 1ðI ð EXTPROC('DO_CALC')
D 5I ð VALUE
D 5I ð VALUE
D 5I ð VALUE
....
Figura 63. Prototipo para el procedimiento DO_CALC con los parámetros VALUE
P DO_CALC B EXPORT
\-------------------------------------------------------------
\ Este procedimiento realiza una función en 3 valores numéricos
\ pasados como parámetros por valor. También devuelve un valor.
\-------------------------------------------------------------
D DO_CALC PI 1ðI ð
D Term1 5I ð VALUE
D Term2 5I ð VALUE
D Term3 5I ð VALUE
D Result S 1ðI ð
C EVAL Result = Term1 \\ 2 \ 17
C + Term2 \ 7
C + Term3
C RETURN Result \ 45 + 23
P E
Pasar un parámetro por referencia de sólo lectura tiene las mismas ventajas que
pasarlo por valor. En especial, este método le permite pasar literales y expre-
\------------------------------------------------------------------
\ CEETSTA (Prueba para argumento omitido) -- ILE CEE API
\ 1. Distintivo de presencia Salida Binario(4)
\ 2. Número de argumento Entrada Binario(4)
\------------------------------------------------------------------
D CEETSTA PR EXTPROC('CEETSTA')
D Present 1ðI ð
D ArgNum 1ðI ð CONST
...
D HaveParm S 1ðI ð
...
C CALLP CEETSTA(HaveParm : 3)
C IF HaveParm = 1
C efectúe alguna acción con el tercer parámetro
C ENDIF
Figura 65. Prototipo para la API ILE CEE CEETSTA con el parámetro CONST
Los descriptores operativos no tienen efecto alguno sobre los parámetros que se
pasan ni sobre el modo en que se pasan. Cuando a un procedimiento se le pasan
descriptores operativos que no espera, dichos descriptores simplemente se
ignoran.
Puede recuperar información de un descriptor operativo mediante las API ILE enla-
zables Recuperar Información de Descriptor Operativo (CEEDOD) y Obtener Infor-
mación de Descripción acerca de un Argumento de Serie (CEESGI).
Tenga en cuenta que los descriptores operativos sólo están permitidos en llamadas
enlazadas. Además, para llamadas no de prototipos, el compilador emitirá un
mensaje de error si se especifica una extensión de código de operación 'D' en una
operación CALL.
\-------------------------------------------------------------
\ LEN devuelve un valor entero de 1ð dígitos. El parámetro
\ es una serie de caracteres pasada por referencia de sólo
\ lectura. Son necesarios descriptores operativos para que
\ LEN conozca la longitud del parámetro.
\ Es necesario que OPTIONS(\VARSIZE) para el parámetro
\ pueda ser menor que 32767 bytes.
\-------------------------------------------------------------
D Len PR 1ðI ð OPDESC
D 32767A OPTIONS(\VARSIZE) CONST
Omisión de parámetros
Cuando se llama a un procedimiento, es posible que a veces se desee omitir un
parámetro. Puede que no tenga importancia alguna para el procedimiento llamado.
Por ejemplo, esta situación puede darse cuando llama a las API ILE enlazables.
Otra razón puede ser que está llamando a un procedimiento anterior que no
maneja este parámetro en particular. Si necesita omitir un parámetro en una
llamada, tiene dos opciones:
Pasar *OMIT
No pasar el parámetro
La diferencia primordial entre los dos métodos tiene que ver con cómo comprueba
si se ha omitido un parámetro. El procedimiento llamado no puede hacer refe-
rencia a un parámetro; de lo contrario, se producirá un error. Por lo tanto, si se ha
diseñado el procedimiento llamado para manejar diferentes números de paráme-
tros, tendrá que comprobar el número de parámetros que se ha pasado. Si se
pasa *OMIT, "contará" como un parámetro.
Pasar *OMIT
Puede pasar *OMIT para un parámetro de prototipos si el procedimiento llamado
sabe que es posible que se pase *OMIT. En otras palabras, puede pasar *OMIT si
se especifica la palabra clave OPTIONS(*OMIT) en la definición de parámetro
correspondiente del prototipo. Cuando se especifica *OMIT, el compilador gene-
rará el código necesario para indicar al procedimiento llamado que se ha omitido el
parámetro.
Nota: Sólo puede especificarse *OMIT para parámetros que se han pasado por
referencia.
Omisión de parámetros
Otro método de omitir un parámetro es simplemente omitirlo por completo en la
llamada. El procedimiento llamado debe esperar esto, lo cual significa que se le
debe haber indicado en el prototipo. Para indicar que no tiene que pasarse en una
llamada un parámetro de prototipos, especifique la palabra clave
OPTIONS(*NOPASS) en la definición de parámetros correspondiente. Tenga en
cuenta que todos los parámetros a continuación del primer *NOPASS deben espe-
cificarse también con OPTIONS(*NOPASS).
\-------------------------------------------------------------
\ Este prototipo para QCMDEXC define tres parámetros:
\ 1- un campo de caracteres cuya longitud puede ser menor
\ de lo esperado
\ 2- cualquier campo numérico
\ 3- un campo de caracteres opcional
\-------------------------------------------------------------
D qcmdexc PR EXTPGM('QCMDEXC')
D cmd 3ðððA OPTIONS(\VARSIZE) CONST
D cmdlen 15P 5 CONST
D 3A CONST OPTIONS(\NOPASS)
Figura 67. Prototipo para la API del sistema QCMDEXC con el parámetro opcional
Utilización de %PARMS
En este ejemplo, se ha cambiado varias veces un procedimiento FMTADDR para
permitir realizar un cambio en la información de dirección de los empleados de una
empresa. Tres procedimientos diferentes llaman a FMTADDR. Los proce-
dimientos difieren únicamente en el número de parámetros que utilizan para pro-
cesar la información de empleados. Es decir, han surgido nuevos requisitos para
el programa FMTADDR y, para darles soporte, se han añadido parámetros nuevos.
Sin embargo, siguen soportados los procedimientos antiguos que llaman a
FMTADDR y no es necesario cambiarlos o recompilarlos.
\=================================================================\
\ FMTADDR - Dar formato a una dirección
\
\ Parámetros de interfaz
\ 1. Dirección carácter(7ð)
\ 2. Número de calle empaquetado(5,ð)
\ 3. Nombre de calle carácter(2ð)
\ 4. Ciudad carácter(15) (no pasan algunos llamadores)
\ 5. Provincia carácter(15) (no pasan algunos llamadores)
\=================================================================\
DFmtAddr PI
D Address 7ð
D Street# 5 ð CONST
D Street 2ð CONST
D P_City 15 OPTIONS(\NOPASS) CONST
D P_Province 15 OPTIONS(\NOPASS) CONST
\-----------------------------------------------------------------\
\ Valores por omisión para parámetros que es posible que no pasen.
\-----------------------------------------------------------------\
D City S 15 INZ('Toronto')
D Province S 15 INZ('Ontario')
\-----------------------------------------------------------------\
\ Compruebe si se ha pasado el parámetro de provincia. De ser así,
\ sustituya el valor por omisión por el valor del parámetro.
\-----------------------------------------------------------------\
C IF %PARMS > 4
C EVAL Province = P_Province
C ENDIF
\-----------------------------------------------------------------\
\ Compruebe si se ha pasado el parámetro de ciudad. Si es así,
\ sustituya el valor por omisión por el valor del parámetro.
\-----------------------------------------------------------------\
C IF %PARMS > 3
C EVAL City = P_City
C ENDIF
\-----------------------------------------------------------------\
\ Establezca 'CStreet#' para que tenga el formato de tipo \
\ carácter de 'Street#' \
\-----------------------------------------------------------------\
C EXSR GetStreet#
\-----------------------------------------------------------------\
\ Formatee la dirección como Nombre de calle, Ciudad, Provincia \
\-----------------------------------------------------------------\
C EVAL ADDRESS = %TRIMR(CSTREET#) + ' ' +
C %TRIMR(CITY) + ' ,' +
C %TRIMR(PROVINCE)
C RETURN
\=================================================================\
\ SUBRUTINA: GetStreet# \
\ Obtener el formato de tipo carácter del número de calle, \
\ ajustado a la izquierda y rellenado con blancos a la derecha. \
\=================================================================\
C GetStreet# BEGSR
C ENDSR
\=================================================================\
\ Prototipo para FMTADDR - dar formato a una dirección
\=================================================================\
DFmtAddr PR
D addr 7ð
D strno 5 ð CONST
D st 2ð CONST
D cty 15 OPTIONS(\NOPASS) CONST
D prov 15 OPTIONS(\NOPASS) CONST
Figura 69. Fuente para el miembro /COPY con prototipo para el procedimiento FMTADDR
Dado que PRTADDR son 'tres procedimientos en uno', debe definir las estruc-
turas de datos de dirección diferentes. Del mismo modo, existen tres partes de las
especificaciones de cálculo, cada una de las cuales corresponde a los programas
\=================================================================\
\ PRTADDR - Imprimir una dirección
\ Llama a FmtAddr para que de formato a la dirección
\=================================================================\
FQSYSPRT O F 8ð PRINTER
\-----------------------------------------------------------------\
\ Prototipo para FmtAddr
\-----------------------------------------------------------------\
DFmtAddr PR
D addr 7ð
D strno 5 ð
D st 2ð
D cty 15 OPTIONS(\NOPASS)
D prov 15 OPTIONS(\NOPASS)
DAddress S 7ð
\-----------------------------------------------------------------\
\ Stage1: Estructura de datos de dirección original.
\ Sólo la calle y el número son información variable.
\-----------------------------------------------------------------\
D Stage1 DS
D Street#1 5P ð DIM(2) CTDATA
D StreetNam1 2ð DIM(2) ALT(Street#1)
\-----------------------------------------------------------------\
\ Stage2: La estructura de datos de la dirección revisada es ahora
\ información de ciudad variable.
\-----------------------------------------------------------------\
D Stage2 DS
D Street#2 5P ð DIM(2) CTDATA
D Addr2 35 DIM(2) ALT(Street#2)
D StreetNam2 2ð OVERLAY(Addr2:1)
D City2 15 OVERLAY(Addr2:21)
\-----------------------------------------------------------------\
\ Stage3: La estructura de datos de la dirección revisada es ahora
\ información provincial variable.
\-----------------------------------------------------------------\
D Stage3 DS
D Street#3 5P ð DIM(2) CTDATA
D Addr3 5ð DIM(2) ALT(Street#3)
D StreetNam3 2ð OVERLAY(Addr3:1)
D City3 15 OVERLAY(Addr3:21)
D Province3 15 OVERLAY(Addr3:36)
\-----------------------------------------------------------------\
\ 'Programa 1'- Utilización de FMTADDR antes de añadir el \
\ parámetro de ciudad. \
\-----------------------------------------------------------------\
C DO 2 X 5 ð
C CALLP FMTADDR (Address:Street#1(X):StreetNam1(X))
C EXCEPT
C ENDDO
\-----------------------------------------------------------------\
\ 'Programa 2'- Utilización de FMTADDR antes de añadir el \
\ parámetro de provincia. \
\-----------------------------------------------------------------\
C DO 2 X 5 ð
C CALLP FMTADDR (Address:Street#2(X):
C StreetNam2(X):City2(X))
C EXCEPT
C ENDDO
\-----------------------------------------------------------------\
\ 'Programa 3' - Utilización de FMTADDR después de añadir el \
\ parámetro de provincia. \
\-----------------------------------------------------------------\
C DO 2 X 5 ð
C CALLP FMTADDR (Address:Street#3(X):
C StreetNam3(X):City3(X):Province3(X))
C EXCEPT
C ENDDO
C SETON LR
\-----------------------------------------------------------------\
\ Imprimir la dirección. \
\-----------------------------------------------------------------\
OQSYSPRT E
O Address
\\
ðð123Bumble Bee Drive
ð1243Hummingbird Lane
\\
ðððð3Cowslip Street Toronto
ð115ðEglinton Avenue North York
\\
ððð12Jasper Avenue Edmonton Alberta
ððð27Avenue Road Sudbury Ontario
\-------------------------------------------------------------
\ Este prototipo para QCMDEXC define tres parámetros. El
\ primer parámetro puede pasarse con campos de caracteres
\ de longitudes diferentes, ya que se define con \VARSIZE.
\-------------------------------------------------------------
D qcmdexc PR EXTPGM('QCMDEXC')
D cmd 3ðððA OPTIONS(\VARSIZE) CONST
D cmdlen 15P 5 CONST
D 3A CONST OPTIONS(\NOPASS)
Figura 71. Prototipo para la API del sistema QCMDEXC con el parámetro *VARSIZE
Orden de evaluación
En una llamada de prototipos no se garantiza el orden de evaluación de los pará-
metros. Este hecho puede ser importante cuando se utilizan parámetros que
pueden ocasionar efectos colaterales, ya que los resultados pueden no ser los que
esperaba.
Suponga que procA tiene todos los parámetros valor y que procB tiene un pará-
metro referencia. Suponga también que fld comienza con el valor 3 y que procB
modifica fld para que sea 5, y devuelve 10. Según el orden en que se hayan
evaluado los parámetros, procA recibirá 3, 10 y 5 o posiblemente 3, 10 y 3.
ILE CL N/A
ILE CL N/A
Nota: ñNo confunda pasar referencia de sólo lectura con pasando BY CONTENT de
COBOL. En términos de RPG, para pasar Fld1 por contenido, debe codificar:
C PARM Fld1 TEMP
Fld1 está protegido contra cambios, pero TEMP no. No se espera que el parámetro no se
cambie.
Para obtener información sobre los tipos de datos soportados por los diferentes
lenguajes de alto nivel, consulte el manual del lenguaje correspondiente.
Las dos operaciones transfieren el control del objeto de llamada al objeto que se
llama. Después de ejecutar el objeto al que se ha llamado, el control vuelve a la
primera operación que se puede procesar después de la operación de llamada del
programa o procedimiento de llamada.
Nota: Los movimientos a la entrada del factor 1 o del campo de resultado sólo se
producen cuando el procedimiento al que se llama vuelve normalmente al
llamador. Si se produce un error al intentar mover datos a una de estas
entradas, la operación de mover no se completa.
Para obtener una descripción detallada de en qué parte del ciclo del programa
RPG se comprueban los indicadores LR, H1 a H9 y RT, véase el apartado acerca
del ciclo de programa RPG en la publicación ILE RPG/400 Reference.
Terminación normal
Un procedimiento principal finaliza normalmente y el control regresa al proce-
dimiento que efectúa la llamada cuando está activado el indicador LR y los indi-
cadores H1 a H9 no están activados. El indicador LR se puede activar:
implícitamente, como cuando se procesa el último registro desde un archivo
primario o secundario durante el ciclo de programa RPG
explícitamente, como cuando se activa el indicador LR.
Se graban todas las matrices y las tablas que tengan un "A nombre de archivo"
especificado en las especificaciones de definición y todas las estructuras de
datos bloqueadas del área de datos.
Se desbloquean todas las áreas de datos bloqueadas por el procedimiento.
Se cierran todos los archivos que estén abiertos.
Se establece un código de retorno para indicar al llamador que el proce-
dimiento ha finalizado normalmente y se devuelve el control al llamador.
En la llamada siguiente al procedimiento principal, con la excepción de las
variables exportadas, hay disponible una copia renovada para su proceso. (Las
variables exportadas se inicializan sólo una vez, cuando se activa el programa por
primera vez en un grupo de activación. Retienen su último valor asignado en una
nueva llamada, incluso si se ha activado LR en la llamada anterior. Si desea
reinicializarlas, debe restaurarlas manualmente.)
SUGERENCIA
Terminación anormal
Un procedimiento principal finaliza anormalmente y el control vuelve al proce-
dimiento que efectúa la llamada cuando se produce una de las acciones
siguientes:
Se toma la opción de cancelar cuando se emite un mensaje de consulta ILE
RPG/400.
Se procesa una operación ENDSR *CANCL en una subrutina de error *PSSR
o INFSR. (Para obtener más información acerca del punto de retorno de
*CANCL para las subrutinas de error *PSSR y INFSR, véase el apartado
“Especificación de un punto de retorno en la operación ENDSR” en la
página 242).
Un indicador H1 a H9 está activado cuando se procesa una operación
RETURN (con el factor 2 en blanco).
Un indicador H1 a H9 está activado cuando se efectúa el proceso de último
registro (LR) en el ciclo de RPG.
Las API enlazables proporcionan una amplia gama de funciones, que incluyen las
siguientes:
Gestión de grupos de activación y flujo de control
Gestión del almacenamiento
Gestión de condiciones
Servicios de mensajes
Depurador de fuentes
Funciones matemáticas
Gestión de llamadas
Acceso a los descriptores operativos
Se accede a las API enlazables ILE utilizando los mismos mecanismos de llamada
que utiliza ILE RPG/400 para llamar a procedimientos, es decir, la operación
CALLP o la operación CALLB. Si la API devuelve un valor y desea utilizarlo, llame
a la API en una expresión. Para obtener la información necesaria para definir un
prototipo para una API, consulte la descripción de la API en la publicación System
API Reference. La Figura 72 muestra un ejemplo de una "llamada" a una API
enlazable.
D CEExxxx PR EXTPROC('CEExxxx')
D parm1 ...
D ...
Figura 72. Ejemplo de sintaxis de llamada para las API ILE de enlace
donde
CEExxxx es el nombre de la API enlazable
parám1, parám2, ... parámn se pueden omitir o son parámetros necesarios
pasados a o devueltos de la API a la que se llama.
retorno es un código de retorno que se puede omitir y que indica el resultado
de la API enlazable.
Nota: No pueden utilizarse las API enlazables si se especifica
DFTACTGRP(*YES) en el mandato CRTBNDRPG.
Para obtener más información sobre las API enlazables, consulte la publicación
System API Reference.
| Estos parámetros deben ser del tipo de datos que requiera la rutina de gráficos
| y no pueden tener un formato flotante.
Para obtener más información sobre OS/400 Graphics, las rutinas de gráficos y los
parámetros, consulte la publicación GDDM Programming y GDDM Reference.
Nota: Puede llamar a OS/400 Graphics utilizando la operación CALL. También
puede utilizar CALLP si define un prototipo para la rutina y especifica la
palabra clave EXTPGM en el prototipo. No puede utilizar la operación
CALLB. No puede pasar los campos de fecha, hora, indicación de hora y
fecha no gráficos a GDDM, ni puede pasarle punteros.
Del mismo modo, las rutinas SUBR40R3 y SUBR41R3 continúan solamente por
motivos de compatibilidad. No se actualizarán para reflejar el nivel de soporte de
gráficos proporcionado por RPG IV mediante el nuevo tipo de datos gráficos.
Para poder utilizar el depurador de fuentes, debe seleccionar una vista de depu-
ración al crear un objeto de módulo o de programa con los mandatos
CRTRPGMOD o CRTBNDRPG. Después de arrancar el depurador, puede esta-
blecer puntos de interrupción y llamar al programa.
Mandatos de depuración
Hay numerosos mandatos de depuración disponibles para utilizarlos con el depu-
rador de fuentes ILE. Los mandatos de depuración y sus parámetros se teclean
en la línea de mandatos de depuración que se visualiza en la parte inferior de las
pantallas Visualizar Fuente de Módulo y Evaluar Expresión. Estos mandatos se
pueden teclear en mayúsculas, en minúsculas o en una combinación de éstas.
Nota: Los mandatos de depuración entrados en la línea de mandatos de depu-
ración no son mandatos CL.
Siga estos pasos para acceder a la información de ayuda en línea para ILE
RPG/400:
1. Entre STRDBG nombre biblioteca/nombre programa donde nombre programa es
todo programa ILE que tenga datos de depuración en la biblioteca nombre
biblioteca.
2. Entre DSPMODSRC para mostrar la vista fuente si esta pantalla no aparece en el
paso 1.
3. Entre PF1 (Ayuda)
4. Ponga el cursor en EVAL y pulse intro para visualizar la ayuda de mandatos
EVAL.
Una vez que haya creado un módulo con datos de depuración y lo haya enlazado
a un objeto de programa (*PGM), puede empezar a depurar el programa.
Puede crear una vista del fuente raíz para depurar un módulo utilizando las
opciones *SOURCE, *COPY o *ALL en el parámetro DBGVIEW de los mandatos
CRTRPGMOD o CRTBNDRPG cuando se crea el módulo.
El compilador crea la vista del fuente raíz mientras se compila el objeto de módulo
(*MODULE). La vista del fuente raíz se crea utilizando las referencias a ubi-
caciones de texto en el miembro fuente raíz en lugar de copiar el texto del
miembro en el objeto de módulo. Por esta razón, no debe modificar, cambiar el
nombre ni mover los miembros fuente raíz entre la creación del módulo de estos
miembros y la depuración del módulo creado a partir de estos miembros. Si lo
hace, las vistas de estos miembros fuente pueden no ser utilizables.
Por ejemplo, para crear una vista del fuente raíz para un programa llamado
DEBUGEX cuando se utiliza CRTBNDRPG, escriba:
CRTBNDRPG PGM(MIBIB/DEBUGEX) SRCFILE(MIBIB/QRPGLESRC)
TEXT('Programa ILE RPG/4ðð DEBUGEX')
DBGVIEW(\SOURCE)
Para crear una vista del fuente raíz para un módulo llamado DBGEX cuando se
utiliza CRTRPGMOD, escriba:
CRTRPGMOD MODULE(MIBIB/DBGEX) SRCFILE(MIBIB/QRPGLESRC)
TEXT('Módulo de entrada del programa DEBUGEX')
DBGVIEW(\SOURCE)
La vista del miembro fuente raíz generada por DBGVIEW(*COPY) es la misma que
la generada por DBGVIEW(*SOURCE). Al igual que con la vista del fuente raíz,
una vista del fuente COPY no está disponible si el archivo fuente es un archivo
DDM.
Puede crear una vista del fuente COPY para depurar un módulo utilizando la
opción *COPY o *ALL en el parámetro DBGVIEW.
modificar, cambiar el nombre ni mover los miembros fuente entre la creación del
objeto de módulo y la depuración del módulo creado a partir de estos miembros.
Si lo hace, las vistas de estos miembros fuente pueden no ser utilizables.
Por ejemplo, para crear una vista del fuente de un programa llamado PRUEBA1
que contiene miembros /COPY, escriba:
CRTBNDRPG PGM(MIBIB/PRUEBA1) SRCFILE(MIBIB/QRPGLESRC)
TEXT('Programa ILE RPG/4ðð PRUEBA1')
DBGVIEW(\COPY)
Puede crear una vista del listado para depurar un módulo utilizando las opciones
*LIST o *ALL en el parámetro DBGVIEW para los mandatos CRTRPGMOD o
CRTBNDRPG cuando se crea un módulo.
Por ejemplo, para crear una vista del listado para un programa llamado PRUEBA1
que contiene DDS ampliadas, escriba:
CRTBNDRPG PGM(MIBIB/PRUEBA1) SRCFILE(MIBIB/QRPGLESRC)
SRCMBR(PRUEBA1) OUTPUT(\PRINT)
TEXT('Programa ILE RPG/4ðð PRUEBA1')
OPTION(\EXPDDS) DBGVIEW(\LIST)
Puede crear una vista de sentencias para depurar un módulo utilizando la opción
*STMT en el parámetro DBGVIEW de los mandatos CRTRPGMOD o
CRTBNDRPG cuando se crea un módulo.
Por ejemplo, para crear una vista de sentencias para el programa DEBUGEX utili-
zando CRTBNDRPG, escriba:
CRTBNDRPG PGM(MIBIB/DEBUGEX) SRCFILE(MIBIB/QRPGLESRC)
TEXT('Programa ILE RPG/4ðð DEBUGEX')
Si los valores por omisión de cualquier mandato de creación han cambiado, debe
especificar explícitamente DBGVIEW(*STMT) y OUTPUT(*PRINT).
Por ejemplo, para iniciar una sesión de depuración para el programa de depuración
| de ejemplo DEBUGEX y para un RPGPGM de programa OPM al que se ha
| llamado, escriba:
| STRDBG PGM(MYLIB/DEBUGEX MYLIB/RPGPGM) OPMSRC(\YES)
Aparece la pantalla Visualizar fuente de módulo tal como se muestra en la
Figura 73 en la página 173. DEBUGEX consta de dos módulos, un módulo RPG
llamado DBGEX y un módulo C llamado cproc. Consulte el apartado “Ejemplo de
fuente de depuración” en la página 214 para ver el fuente de DBGEX, cproc y
RPGPGM.
á ñ
Figura 73. Pantalla Visualizar fuente de módulo para el programa DEBUGEX
| DSPMODSRC
| Aparece la pantalla Visualizar Fuente de Módulo.
| 2. Tipo
| SET
| 3. Aparece la pantalla Establecer opciones de depuración. En esta pantalla
| escriba Y (Sí) en el campo Soporte de depuración de fuente OPM y pulse Intro
| para volver a la pantalla Visualizar fuente de módulo.
| Ahora puede añadir el programa OPM, utilizando la pantalla Trabajar con módulo o
| procesando una sentencia de llamada del programa.
Para los programas ILE, utilice la opción 1 (Añadir programa) de la pantalla Tra-
bajar con Lista de Módulos del mandato DSPMODSRC. Para eliminar un pro-
grama o programa de servicio ILE, utilice la opción 4 (Eliminar programa) de la
misma pantalla. Cuando se elimina un programa o un programa de servicio ILE,
también se eliminan todos los puntos de interrupción del mismo. No hay límite
alguno en cuanto al número de programas o programas de servicio ILE que se
pueden eliminar o que puede haber en una sesión de depuración al mismo tiempo.
| Para programas OPM, tiene dos opciones en función del valor especificado para
| OPMSRC. Si ha especificado OPMSRC(*YES), utilizando STRDBG, el mandato
| de depuración SET o CHGDBG, puede añadir o eliminar un programa OPM utili-
| zando la pantalla Trabajar con módulo. (Fíjese en que no se lista ningún nombre
| de módulo para los programas OPM). No hay límite alguno en cuanto al número
| de programas OPM que se puede incluir en una sesión de depuración cuando se
| especifica OPMSRC(*YES).
Final
Mandato
===>
F3=Salir F4=Solicitud F5=Renovar F9=Recuperar F12=Cancelar
á ñ
Figura 74. Adición de un programa de servicio ILE a una sesión de depuración
Final
Mandato
===>
F3=Salir F4=Solicitud F5=Renovar F9=Recuperar F12=Cancelar
á ñ
Figura 75. Eliminación de programas ILE desde una sesión de depuración
Cuando se cambia una vista, el depurador ILE del fuente efectúa una correlación
con las posiciones equivalentes de la vista que desea. Cuando se cambia el
módulo, la sentencia ejecutable de la vista visualizada se almacena en la memoria
y se muestra cuando el módulo se visualiza de nuevo. Los números de línea que
tienen puntos de interrupción se resaltan. Cuando un punto de interrupción, un
Por ejemplo, para pasar del módulo DBGEX de la Figura 73 en la página 173 al
módulo cproc mediante la opción Visualizar fuente de módulo, siga estos pasos:
1. Para trabajar con módulos, escriba DSPMODSRC y pulse Intro. Se visualiza la
pantalla Visualizar Fuente de Módulo.
2. Pulse F14 (Trabajar con lista de módulos) para mostrar la pantalla Trabajar con
lista de módulos. La Figura 76 en la página 178 muestra una pantalla de
ejemplo.
3. Para seleccionar cproc, escriba 5 (Visualizar fuente de módulo) junto a él y
pulse Intro. Puesto que hay una vista de fuente raíz disponible, se mostrará
como en la Figura 77 en la página 178. Si no hay disponible ningún fuente
raíz, se muestra el primer objeto módulo enlazado al objeto de programa con
datos de depuración.
Final
Mandato
===>
F3=Salir F4=Solicitud F5=Renovar F9=Recuperar F12=Cancelar
á ñ
Figura 76. Desplazamiento a un módulo distinto
Final
Depurar . . .
á ñ
Figura 77. Vista fuente del procedimiento ILE C cproc
Por ejemplo, para cambiar la vista del módulo de fuente raíz a listado, siga estos
pasos:
1. Escriba DSPMODSRC y pulse Intro. Se visualiza la pantalla Visualizar Fuente de
Módulo.
2. Pulse F15 (Seleccionar vista). Puede ver la ventana Seleccionar Vista en la
Figura 78.
á ñ
Figura 78. Cambio de la vista de un módulo
La vista actual se lista al principio de la ventana y las demás vistas que están
disponibles se muestran a continuación. Cada módulo de un programa puede
tener un conjunto distinto de vistas disponibles, según las opciones de depu-
ración utilizadas para crearlo.
Nota: Si se crea un módulo con DBGVIEW(*ALL), la ventana Seleccionar
Vista mostrará las tres vistas disponibles: fuente raíz, COPY y listado.
Si el módulo no tiene miembros /COPY, la vista COPY es idéntica a la
vista del fuente raíz.
3. Escriba un 1 junto a la vista del listado y pulse Intro. Aparece la pantalla
Visualizar Fuente de Módulo mostrando el módulo con una vista de listado.
Nota: Los operadores relacionales a los que se da soporte para los puntos de
interrupción condicionales son <, >, =, <=, >= y <> (no igual).
Una vez que haya terminado de especificar todos los puntos de interrupción, llame
al programa. Puede utilizar F21 (Línea de mandatos) en la pantalla Visualizar
Fuente de Módulo para llamar al objeto de programa desde una línea de mandatos
o puede llamar al programa después de salir de la pantalla.
Final
Mandato
===>
F3=Salir F4=Solicitud F5=Renovar F9=Recuperar F12=Cancelar
Se añade el punto de interrupción a la línea 127.
á ñ
Figura 80. Establecimiento de un punto de interrupción condicional
á ñ
Figura 81. Establecimiento de un punto de interrupción condicional utilizando el mandato
BREAK
Notas:
1. La secuencia alternativa especificada por ALTSEQ (*SRC) en la especificación
de control no está disponible para el depurador ILE del fuente. En su lugar, el
depurador de fuentes utiliza la tabla de secuencia de ordenación *HEX.
2. El nombre de la tabla de secuencia de ordenación se salva durante la compi-
lación. En la depuración, el depurador de fuentes utiliza el nombre salvado en
la compilación para acceder a la tabla de secuencia de ordenación. Si la tabla
de secuencia de ordenación especificada en la compilación se resuelve como
una tabla distinta de *HEX o *JOBRUN, es importante que la tabla de
secuencia de ordenación no se altere después de iniciar la depuración. Si no
se puede acceder a la tabla porque está dañada o se ha suprimido, el depu-
rador de fuentes utiliza la tabla de secuencia de ordenación *HEX.
| à Line ð
| <---------------------- Especificaciones fuente -----------------------
| línea ....1....+....2....+....3....+....4....+....5....+....6....+....7....+.
| L i s t a d o f u e n t e
| 1 C MOVEL 'ABCD' X 5
| 2 C SETON LR----
| \ \ \ \ \ F I N D E L F U E N T E \ \ \ \ \
| á ñ
| Sección del listado del compilador.
| à ð
| Programa: TEST Biblioteca: MYLIB Módulo: TEST
| (Fuente no disponible).
| Final
| Depuración. . . break TEST/2
| à ð
| Trabajar con observación
| Sistema: DEBUGGER
| Teclee opciones, pulse Intro.
| 4=Borrar 5=Visualizar
| Final
| Mandato
| ===>____________________________________________________________________
| F3=Salir F4=Solicitud F5=Renovar F9=Recuperar F12=Cancelar
| á ñ
| Figura 83. Ejemplo de una pantalla Trabajar con observación
| à ð
| Trabajar con observación
| ..........................................................
| : Visualizar observación : DEBUGGER
| : :
| : Núm. observación.: 1 :
| : Dirección........: ð8ðð9ð5ð6Fð27ðð4 :
| : Longitud.........: 4 :
| : Núm. aciertos....: ð :
| : :
| : Ámbito cuando se estableció la observación :
| : Programa/biblioteca/tipo: PAYROLL ABC \PGM :
| : :
| : Módulo.......: PAYROLL :
| : Procedimiento: PAYROLL :
| : Variable.....: SALARY :
| : :
| : F12=Cancelar :
| : :
| ..........................................................
| Final
| Mandato
| ===>____________________________________________________________________
| F3=Salir F4=Solicitud F5=Renovar F9=Recuperar F12=Cancelar
| á ñ
| Figura 84. Ejemplo de una ventana Visualizar observación
| à ð
| Visualizar observaciones de depuración
| Sistema: DEBUGGER
| ----------Trabajo------------- NÚM LONGITUD DIRECCIÓN
| MYJOBNAME1 MYUSERPRF1 123456 1 5 ð8ðð9ð5ð6Fð27ðð4
| JOB456789ð PRF456789ð 222222 1 8 ð98494ð3845A2C32
| JOB456789ð PRF456789ð 222222 2 2 ð98494ð38456AAðð
| JOB PROFILE 333333 14 4 ð4ð6895783ð9AFð9
| SOMEJOB SOMEPROFIL 444444 3 4 ðð5498348ð48242A
| Final
| Pulse Intro para continuar
| à ð
| Visualizar fuente de módulo
| à ð
| Visualizar fuente de módulo
| (Fuente no disponible)
Una sentencia de llamada para ILE RPG/400 incluye cualquiera de las ope-
raciones siguientes:
CALL
CALLB
CALLP
Cualquier operación en la que haya una expresión en el campo factor 2
ampliado y dicha expresión contenga una llamada a un procedimiento.
Puede utilizar F22 (Entrar en) de la pantalla Visualizar fuente de módulo para
entrar en un programa o procedimiento llamado de una sesión de depuración.
Si la sentencia siguiente que se ha de ejecutar es una sentencia de llamada a
otro programa o procedimiento, pulsar F22 (Entrar en) hará que se ejecute la
primera sentencia ejecutable del programa o procedimiento llamado. El pro-
grama o procedimiento llamado aparecerá en la pantalla Visualizar fuente de
módulo.
Nota: El programa o procedimiento llamado debe tener datos de depuración
asociados para poder aparecer en la pantalla Visualizar fuente de
módulo.
De este modo el número total de pasos será 1. Utilice la tecla F12 para volver
a la línea de mandatos y llamar al programa. El programa se detendrá en la
primera sentencia que tenga datos de depuración.
SUGERENCIA
Final
Depurar . . .
Depurar . . .
Campos de base
> EVAL String 6A INZ('ABCDEF')
STRING = 'ABCDEF'
> EVAL BasePtr \ INZ(%ADDR(String))
BASEPTR = SPP:Cð1947ðð1218
> EVAL BaseString 6A BASED(BasePtr)
BASESTRING = 'ABCDEF'
3 DIM(3) CTDATA
Datos en la compilación: \\
> EVAL TablaA \\ Mostrar valor del aaa
TABLAA = 'aaa' índice actual bbb
ccc
> EVAL TablaA(1) \\ Especificar índice 1 \\
TABLAA(1) = 'aaa'
> EVAL TablaA(2) \\ Especificar índice 2 \\
TABLAA(2) = 'bbb'
Para visualizar una estructura de datos para la cual no se han definido sub-
campos, debe utilizar la función de visualización de caracteres de EVAL, que
se trata más adelante.
Visualización de indicadores
Los indicadores se definen como campos de caracteres de 1 byte. A excep-
ción de los indicadores como *INLR, puede visualizar indicadores como "*INxx"
o "*IN(xx)". Puesto que el sistema almacena los indicadores como una matriz,
puede visualizarlos todos o sólo una parte de ellos utilizando la notación de
rangos. Por ejemplo, si entra EVAL *IN, obtendrá una lista de los indicadores
del 01 a 99. Para visualizar los indicadores *IN01 a *IN06, entraría EVAL
*IN(1..6).
Por ejemplo, el campo Serie está definido como una serie de seis caracteres.
Para averiguar cuál es el equivalente en hexadecimal de los tres primeros
caracteres, entraría lo siguiente:
EVAL Serie: x 3
Resultado:
ððððð C1C2C3ðð ðððððððð ðððððððð ðððððððð - ABC.............
| Esto sería especialmente útil cuando los datos que el puntero dirige no están
| almacenados con formato imprimible como por ejemplo datos binarios o datos
| empaquetados.
\\ Utilización de %SUBSTR \\
Figura 98 (Parte 1 de 2). Ejemplos del cambio de los valores de los campos según
DBGEX
Figura 98 (Parte 2 de 2). Ejemplos del cambio de los valores de los campos según
DBGEX
Para ver los nombres que se han definido con el mandato de depuración
EQUATE para una sesión de depuración, teclee:
DISPLAY EQUATE
en la línea de mandatos de depuración. En la pantalla Evaluar Expresión se
visualizará una lista de los nombres activos.
El programa DEBUGEX está diseñado para mostrar los distintos aspectos del
depurador ILE del fuente y de los vuelcos con formato ILE RPG/400. Puede
encontrar los vuelcos ejemplo en el capítulo siguiente.
\=================================================================\
\ DEBUGEX - Programa diseñado para ilustrar el uso del depurador
\ del fuente ILE con el fuente ILE RPG/4ðð. Proporciona
\ ejemplo de tipos y estructuras de datos diferentes.
\
\ También puede utilizarse para vuelcos con formato.
\=================================================================\
\-----------------------------------------------------------------\
\ La palabra clave DEBUG habilita el recurso de vuelcos con
\ formato.
\-----------------------------------------------------------------\
H DEBUG
\-----------------------------------------------------------------\
\ Definir campos autónomos para tipos de datos ILE RPG/4ðð
\ diferentes.
\-----------------------------------------------------------------\
D String S 6A INZ('ABCDEF')
D Packed1Dð S 5P 2 INZ(-93.4)
D ZonedD3D2 S 3S 2 INZ(-3.21)
D Bin4D3 S 4B 3 INZ(-4.321)
D Bin9D7 S 9B 7 INZ(98.7654321)
D Int5 S 5I ð INZ(-2ð46)
D Int1ð S 1ðI ð INZ(-319ð4)
D Unsigned5 S 5U ð INZ(2ð46)
D Unsigned1ð S 1ðU ð INZ(319ð4)
D DBCSString S 3G INZ(G' BBCCDD ')
\ Matriz
D Arry S 3S 2 DIM(2) INZ(1.23)
\ Tabla
D TableA S 3 DIM(3) CTDATA
\-----------------------------------------------------------------\
\ Definir diferentes tipos de estructuras de datos
\-----------------------------------------------------------------\
D DS1 DS OCCURS(3)
D Fld1 5A INZ('ABCDE')
D Fld1a 1A DIM(5) OVERLAY(Fld1)
D Fld2 5B 2 INZ(123.45)
\
D DS2 DS 1ð OCCURS(2)
\
D DS3 DS
D Title 5A INZ('Mr. ')
D LastName 1ðA INZ('Jones ')
D FirstName 1ðA INZ('Fred ')
\-----------------------------------------------------------------\
\ Definir prototipos para procedimientos llamados c_proc y switch
\-----------------------------------------------------------------\
D c_proc PR \ EXTPROC('c_proc')
D size 1ðU ð VALUE
D inzval 1A CONST
D Switch PR
D Parm 1A
\-----------------------------------------------------------------\
\ Definir parámetros para llamadas de no prototipos.
\ Se utiliza PARM1 cuando se llama al programa RPGPROG.
\-----------------------------------------------------------------\
D PARM1 S 4P 3 INZ(6.666)
D EXPORTFLD S 6A INZ('export') EXPORT
\-----------------------------------------------------------------\
\ Cambiar la aparición de DS2 a 2 y mover 'b' a DS2, haciendo
\ que los 1ð primeros bytes sean 'a' y los 1ð segundos bytes 'b'.
\-----------------------------------------------------------------\
C 2 OCCUR DS2
C MOVE \ALL'b' DS2
\-----------------------------------------------------------------\
\ Fld1a es un campo con preformato Fld1. Ya que FLd1 se inicializa
\ en 'ABCDE', el valor de Fld1a(1) es 'A'. Después de la operación
\ MOVE siguiente, el valor de Fld1a(1) es '1'.
\-----------------------------------------------------------------\
C MOVE '1' Fld1a(1)
\-----------------------------------------------------------------\
\ Llamar al programa RPGPGM, un objeto de programa diferente.
\-----------------------------------------------------------------\
C Plist1 PLIST
C PARM Parm1
C CALL 'RPGPGM' Plist1
\-----------------------------------------------------------------\
\ LLamar a c_proc, que importa ExportFld desde el procedimiento
\ principal.
\-----------------------------------------------------------------\
C EVAL SpcPtr = c_proc(SpcSiz : 'P')
\-----------------------------------------------------------------\
\ Llamar a un Conmutador local de subprocedimiento local, que
\ invierte el valor de un indicador.
\-----------------------------------------------------------------\
C EVAL \IN1ð = 'ð'
C CALLP Switch(\in1ð)
\-----------------------------------------------------------------\
\ Poner un valor nuevo en el segundo elemento de la matriz.
\-----------------------------------------------------------------\
C MOVE 4 Arry
\-----------------------------------------------------------------\
\ Arrancar ahora un vuelco con formato y regresar, activando LR.
\-----------------------------------------------------------------\
C DUMP
C SETON LR
\=================================================================\
\ Definir el Conmutador de subprocedimiento.
\=================================================================\
P Switch B
D Switch PI
D Parm 1A
\-----------------------------------------------------------------\
\ Definir una variable local para propósitos de depuración.
\-----------------------------------------------------------------\
D Local S 5A INZ('aaaaa')
C IF Parm = '1'
C EVAL Parm = 'ð'
C ELSE
C EVAL Parm = '1'
C ENDIF
P Switch E
\=================================================================\
\ Sección de datos de tiempo de compilación para tabla.
\=================================================================\
\\
aaa
bbb
ccc
Figura 100 (Parte 4 de 4). Fuente para el módulo DBGEX. DBGEX es el módulo principal
del programa DEBUGEX.
D InputParm S 4P 3
C \ENTRY PLIST
C PARM InputParm
C InputParm DSPLY
C SETON LR
| Figura 101. Fuente para RPGPGM del programa OPM. DBGEX llama a RPGPGM.
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
extern char EXPORTFLD[6];
┌─OPM───────┐
│ │
│ Prog. A │
└─────┬─────┘
┌─ ─Activación─ ─ ─ ─┼ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─┐
6 &
| ┌─ILE───────┐ │ │
│ │
│ │ Proc. P1 │ │ │
└─────┬─────┘ │
│ 6 │ │
┌─ILE───────┐ ┌───────┐ Filtrar
│ │ │ ├───────┤ excepción │
│ Proc. P2 ├───────┼───────┤ no manejada
│ └─────┬─────┘ └───────┘ │ │
│ Manejadores │
│ 6 de excepciones │ │
┌─ILE───────┐ para P2 │
│ │ Proc. P3 │ ┌───────┐ │ │
│ Se produce├───────┤ │ │
│ │ excepción │ └───────┘ │ │
└───────────┘ para P3 │
│ │
└ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘
Pasada 2
Pila de llamadas
┌─OPM───────┐
│ │ %──Envío de───────────┐
│Programa A │ excepción de │
└─────┬─────┘ terminación CEE99ð1
┌ ─ Activación─ ─ ─ ─┼ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─── ─ ─ ─ ─┐
6 &
│ ┌─ILE───────┐ │ │
│ │
│ │ Proc. P1 │ │ │
└─────┬─────┘ │
│ 6 │ │
┌─ILE───────┐ ┌───────┐ Filtrar
│ │ │ ├───────┤ error de │
│ Proc. P2 ├───────┼───────┤ función
│ └─────┬─────┘ └───────┘ (CPF9999) │
│ Manejadores │
│ 6 de excepciones │ │
┌─ILE───────┐ para P2 │
│ │ Proc. P3 │ ┌───────┐ │ │
│ Se produce├───────┤ │ │
│ │ excepción │ └───────┘ │ │
└───────────┘ para P3 │
│ │
└ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘
Figura 103 (Parte 2 de 2). Pila de llamadas y filtro de mensajes de excepción
Puede indicar que RPG debe manejar una excepción de tres maneras. Puede:
1. Especificar un indicador de error en las posiciones 73 y 74 de las especifi-
caciones de cálculo del código de operación adecuado.
2. Codificar una subrutina de error de archivo, definida por la palabra clave
INFSR en una especificación de descripción de archivo, para las excep-
ciones de archivo. La subrutina de error sólo puede codificarse en la
sección del fuente principal. No puede codificar una INFSR para un
archivo que se utiliza en un subprocedimiento.
3. Codificar una subrutina de error de programa, denominada *PSSR, para
las excepciones de programa. Tenga en cuenta que *PSSR es local al
procedimiento en el que se codifica. Esto significa que *PSSR en un pro-
cedimiento principal manejará únicamente los errores del programa aso-
ciados con el procedimiento principal.Del mismo modo, *PSSR en un
subprocedimiento sólo manejará los errores en dicho subprocedimiento.
Tenga en cuenta que PSDS e INFDS tienen ámbito de módulo. Tanto los pro-
cedimientos principales como los subprocedimientos pueden acceder a ellas.
SUGERENCIA
Excepciones anidadas
Las excepciones se pueden anidar. Una excepción anidada es aquélla que se
produce mientras se maneja otra excepción. Cuando esto sucede, el proceso
de la primera excepción se suspende temporalmente. El manejo de excep-
ciones comienza de nuevo con la excepción generada más recientemente.
Excepciones no manejadas
Una excepción no manejada es la que no ha sido manejada por un manejador
de excepciones asociado con la entrada de la pila de llamadas que ha recibido
la excepción por primera vez. Cuando una excepción no está manejada, se
produce una de las acciones siguientes:
┌─────────────────────┐ ┌──────────────────┐
│ Procedimiento PRC1 │ │Manej. ind. error │
Filtrar │ CALL PRC2 ├───────┼──────────────────┤
excepción │ │ │Manej. RPG omisión│
no manejada └─────────┬───────────┘ └──────────────────┘
& │
│ 6
│ ┌─────────────────────┐
│ │ Procedimiento PRC2 │ ┌──────────────────┐
└──────┤ -1 SUBST ├───────┤Manej. RPG omisión│
│ RNXð1ðð emitido │ └──────────────────┘
└─────────────────────┘
┌─────────────────────┐
│ Procedimiento PRC1 │ ┌──────────────────┐
│ CALL PRC2 ├───────┤Manej. RPG omisión│
Filtrar │ │ └──────────────────┘
MCH36ð1 └─────────┬───────────┘
& │
│ 6
│ ┌─────────────────────────┐
│ │ Procedimiento PRC2 │ ┌──────────────────┐
└──────┤ ├───┤Manej. RPG omisión│
│ D FLD S 5A BASED(PTR) │ └──────────────────┘
│ C EVAL PTR=NULL │
│ C EVAL FLD='ABCDE' │
│ MCH36ð1 emitido │
└─────────────────────────┘
PASADA 2
Pila de llamadas Lista de manejadores de excepciones activos
┌─────────────────────┐
│ Procedimiento PRC1 │ ┌──────────────────┐
│ CALL PRC2 ├───────┤Manej. RPG omisión│
Filtrar │ │ └──────────────────┘
CPF9999 └─────────┬───────────┘
& │
│ 6
│ ┌─────────────────────────┐
│ │ Procedimiento PRC2 │ ┌──────────────────┐
└──────┤ ├───┤Manej. RPG omisión│
│ D FLD S 5A BASED(PTR) │ └──────────────────┘
│ C EVAL PTR=NULL │
│ C EVAL FLD='ABCDE' │
│ CPF9999 emitido │
└─────────────────────────┘
Puede obtener más información acerca del error que se haya producido codifi-
cando las estructuras de datos adecuadas y consultando los campos de
estructuras de datos relacionados.
Tabla 12. Códigos de operación que permiten un indicador de error en las posiciones 73-74
ACQ DSPLY POST SETGT
ADDDUR EXFMT READ (n) SETLL
CALL EXTRCT READC SUBDUR
CALLB NEXT READE (n) SUBST (p)
CHAIN (n) FEOD READP (n) TEST (x)
CHECK IN READPE (n) UNLOCK
CHECKR OCCUR REL UPDATE
CLOSE OPEN ROLBK WRITE
COMMIT ORxx SCAN XLATE (p)
DELETE OUT
Para añadir una subrutina de error de archivo al programa, siga los pasos
siguientes:
1. Escriba el nombre de la subrutina después de la palabra clave INFSR en
una especificación de descripción de archivo. El nombre de la subrutina
puede ser *PSSR, que indica que la subrutina de error de programa recibe
el control de la excepción en este archivo.
2. Si lo desea, identifique la estructura de datos de información de archivo en
una especificación de descripción de archivo mediante la palabra clave
INFDS.
\=================================================================\
\ ACTTRANS: Este programa es un sencillo programa de \
\ actualización de inventario. \
\ El archivo de transacción (TRANSACT) se procesa de modo \
\ consecutivo. El número de producto de la transacción se usa \
\ para acceder al archivo maestro (PRDMAS) al azar. \
\ 1. Si se encuentra el registro, se actualizará la cantidad del \
\ inventario. \
\ 2. Si no se encuentra el registro, se imprimirá un error en un \
\ informe. \
\ 3. Si el registro está bloqueado actualmente, la transacción se \
\ grabará en un archivo de anotaciones cronológicas de pedidos \
\ de transacciones que se procesará posteriormente. \
\ 4. El resto de errores inesperados provocarán un mensaje de \
\ en tiempo de ejecución. \
\=================================================================\
\-----------------------------------------------------------------\
\ Definir los archivos: \
\ 1) PRDMAS - Archivo maestro del producto \
\ 2) TRANSACT - Archivo de transacciones \
\ 3) TRNBACKLG - Archivo de cartera de pedidos de trans. \
\ 2) PRINT - Informe de error. \
\-----------------------------------------------------------------\
FPRDMAS UF E K DISK
F INFSR(PrdInfsr)
F INFDS(PrdInfds)
FTRANSACT IP E DISK
FTRNBACKLG O E DISK
FPRINT O F 8ð PRINTER
\-----------------------------------------------------------------\
\ Definir la estructura de datos de información de archivo para \
\ el archivo PRDMAS. \
\ Se utiliza el campo \STATUS para determinar que acción realizar \
\-----------------------------------------------------------------\
D PrdInfds DS
D PrdStatus \STATUS
\-----------------------------------------------------------------\
\ Lista de excepciones esperadas. \
\-----------------------------------------------------------------\
D ErrRecLock C CONST(1218)
\-----------------------------------------------------------------\
\ Acceder al archivo maestro del producto utilizando el número de \
\ producto de la transacción. \
\-----------------------------------------------------------------\
C TRNPRDNO CHAIN PRDREC 1ð
\-----------------------------------------------------------------\
\ Si se encuentra el registro, actualice la cantidad del archivo \
\ maestro \
\-----------------------------------------------------------------\
C IF NOT \IN1ð
C SUB TRNQTY PRDQTY
C UPDATE PRDREC
\-----------------------------------------------------------------\
\ Si el registro no se encuentra, grabar en el informe de errores \
\-----------------------------------------------------------------\
C ELSE
C EXCEPT NOTFOUND
C ENDIF
C SETON LR
\-----------------------------------------------------------------\
\ Rutina de manejo de errores. \
\-----------------------------------------------------------------\
C PrdInfsr BEGSR
\-----------------------------------------------------------------\
\ Si el registro maestro está bloqueado actualmente, grabar el \
\ registro de transacciones en el archivo de caractera de pedidos \
\ y saltar a la transacción siguiente. \
\-----------------------------------------------------------------\
C PrdStatus DSPLY
C IF (PrdStatus = ErrRecLock)
C WRITE TRNBREC
C MOVE '\GETIN' ReturnPt 6
\-----------------------------------------------------------------\
\ Si se produce un error inesperado, emitir mensaje de consulta. \
\-----------------------------------------------------------------\
C ELSE
C MOVE \BLANK ReturnPt
C ENDIF
C ENDSR ReturnPt
\-----------------------------------------------------------------\
\ Formato de informe de error. \
\-----------------------------------------------------------------\
OPRINT E NOTFOUND
O TRNPRDNO
O 29 'NO EN ARCHIVO PRDMAS'
Para añadir una subrutina de error *PSSR al programa, realice los pasos
siguiente:
1. Identifique opcionalmente la estructura de datos de estado de programa
(PSDS) especificando una S en la posición 23 de la especificación de defi-
nición.
2. Entre una operación BEGSR con la entrada *PSSR en el factor 1.
3. Identifique un punto de retorno, si lo hay, y codifíquelo en la operación
ENDSR de la subrutina. Para subprocedimientos, el factor 2 debe estar en
blanco. Para obtener más información sobre entradas válidas para el
factor 2, consulte “Especificación de un punto de retorno en la operación
ENDSR” en la página 242.
4. Codifique el resto de la subrutina de error de programa. En dicha subru-
tina se puede utilizar cualquier operación del compilador ILE RPG/400. La
operación ENDSR debe ser la última especificación de la subrutina de
error de programa.
\-----------------------------------------------------------------\
\ Definir componentes relevantes de la estrucuta de datos de \
\ estado del programa. \
\-----------------------------------------------------------------\
D Psds SDS
D Loc \ROUTINE
D Err \STATUS
D Parms \PARMS
D Name \PROC
\-----------------------------------------------------------------\
\ AQUÍ VA EL CUERPO DEL CÓDIGO
\ Se produce un error durante la división por cero.
\ Se pasa el control a la subrutina \PSSR.
\-----------------------------------------------------------------\
\=================================================================\
\ \PSSR: Subrutina de error para procedimiento principal. Se busca
\ un error de división por cero, comprobando si el estado es 1ð2.
\ Si lo es, se añade 1 al divisor y se continúa moviendo \GETIN
\ a ReturnPt.
\=================================================================\
C \PSSR BEGSR
C IF Err = 1ð2
C ADD 1 Divisor
C MOVE '\GETIN' ReturnPt 6
\-----------------------------------------------------------------\
\ Se ha producido un error inesperado y por lo tanto se
\ mueve \CANCL a ReturnPt para finalizar el procedimiento.
\-----------------------------------------------------------------\
C ELSE
C MOVE '\CANCL' ReturnPt
C ENDIF
C ENDSR ReturnPt
\-----------------------------------------------------------------\
\ Inicio de una definición de subprocedimiento
\-----------------------------------------------------------------\
P SubProc B
D SubProc PI 5P ð
...
\-----------------------------------------------------------------\
\ El cuerpo del código va aquí, incluido el código de recuperación.
\-----------------------------------------------------------------\
C TryAgain TAG
C X DIV Divisor Result
C Return Result
\-----------------------------------------------------------------\
\ Se produce un error al dividir por cero.
\ Se pasa el control a la subrutina \PSSR.
\-----------------------------------------------------------------\
C \PSSR BEGSR
\-----------------------------------------------------------------\
\ Si se trata de un error de división por cero, sume 1 al divisor
\ y vuelva a intentarlo
\-----------------------------------------------------------------\
C IF Err = 1ð2
C ADD 1 Divisor
C GOTO TryAgain
C ENDIF
\-----------------------------------------------------------------\
\ Si el control alcanza ENDSR, se producirá una anomalía en el
\ procedimiento.
\-----------------------------------------------------------------\
C ENDSR
P E
\-----------------------------------------------------------------\
\ Inicio de una definición de subprocedimiento
\-----------------------------------------------------------------\
P SubProc B
D SubProc PI 5P ð
...
\-----------------------------------------------------------------\
\ El cuerpo del código va aquí, incluido el código de recuperación.
\-----------------------------------------------------------------\
C X DIV Divisor Result
C Return Result
\-----------------------------------------------------------------\
\ Se produce un error al dividor por cero.
\ Se pasa el control a la subrutina \PSSR.
\-----------------------------------------------------------------\
C \PSSR BEGSR
\-----------------------------------------------------------------\
\ Si se trata de un error de división por cero, devuelva ð del
\ subprocedimiento
\-----------------------------------------------------------------\
C IF Err = 1ð2
C RETURN ð
C ENDIF
\-----------------------------------------------------------------\
\ Si el control alcanza ENDSR, se producirá una anomália en el
\ procedimiento.
\-----------------------------------------------------------------\
C ENDSR
P E
\=================================================================\
\ NOLOOP: Mostrar cómo evitar la recurrencia en una subrutina \
\ \PSSR. \
\=================================================================\
FQSYSPRT O F 132 PRINTER
\-----------------------------------------------------------------\
\ Matriz que se utilizará para provocar un error \
\-----------------------------------------------------------------\
D Arr1 S 1ðA DIM(5)
\-----------------------------------------------------------------\
\ Generar un error de matriz fuera de límite para pasar el control\
\ a \PSSR. \
\-----------------------------------------------------------------\
C Z-ADD -1 Neg1 5 ð
C MOVE Arr1(Neg1) Arr1(Neg1)
C MOVE \ON \INLR
\=================================================================\
\ \PSSR: Subrutina de error para el procedimiento. Se utiliza la \
\ variable InPssr para detectar la recurrencia en PSSR. \
\ Si se detecta la recurrencia, se cancela el \
\ procedimiento \CANCL. \
\=================================================================\
C \PSSR BEGSR
C EXCEPT In_Pssr
C IF InPssr = 1
C MOVE '\CANCL' ReturnPt 6
C EXCEPT Cancelling
C Z-ADD ð InPssr 1 ð
C ELSE
C Z-ADD 1 InPssr
\ \
\ Ahora se genera otro error en PSSR para ver cómo \
\ cancela la subrutina el procedimiento. \
\ \
C MOVE Arr1(Neg1) Arr1(Neg1)
\ \
\ Tenga en cuenta que no se procesarán las dos \
\ operaciones siguientes si Neg1 sigue siendo negativo. \
\ \
C MOVE '\GETIN' ReturnPt
C Z-ADD ð InPssr
C ENDIF
C ENDSR ReturnPt
\=================================================================\
\ Salida de procedimiento - a modo de ejemplo \
\=================================================================\
OQSYSPRT E In_Pssr
O 'En PSSR'
OQSYSPRT E Cancelling
O 'Cancelando...'
El método utilizado aquí para evitar los bucles también se puede emplear en
una subrutina de error INFSR.
Existen varios motivos por los que puede querer utilizar un manejador de con-
diciones de ILE:
Puede eludir el manejo específico del lenguaje manejando la excepción en
su propio manejador.
Ello le permite proporcionar el mismo mecanismo de manejo de excep-
ciones en una aplicación con módulos en diferentes lenguajes de alto nivel
ILE.
Puede utilizar esta API para delimitar el ámbito del manejo de excepciones
a una entrada de la pila de llamadas.
El ámbito de la API enlazable CEEHDLR ILE es la invocación que la con-
tiene. Permanecerá en vigor hasta que la elimine del registro o hasta que
el procedimiento vuelva.
Nota: Cualquier llamada a la API CEEHDLR desde un cálculo de detalle,
de totales o de subrutina activará el manejador de condiciones para
todo el procedimiento, incluidas las operaciones de entrada, cálculo
y salida. Sin embargo, no afectará a los suprocedimiento, ni un
subprocedimiento que llame a CEEHDLR afectará al procedimiento
principal.
Si se llama de modo recurrente a un subprocedimiento, sólo resulta
afectada la invocación que llama a CEEHDLR.Si desea que el
manejador de condiciones esté activo para cada invocación, cada
invocación debe llamar a CEEHDLR.
Para obtener más información sobre cómo utilizar los manejadores de con-
diciones de ILE, consulte la publicación ILE Conceptos.
\=================================================================\
\ RPGHDLR: Procedimiento de manejo de excepciones RPG. \
\ Este procedimiento efectúa lo siguiente: \
\ Maneja la excepción si es el error RPG \
\ es de fuera de límites (RNXð1ðð) \
\ de lo contrario, filtra la excepción. \
\ También imprime lo que ha realizado. \
\ \
\ Nota: Este es el procedimiento de manejo de excepciones \
\ para el procedimiento SHOWERR. \
\=================================================================\
FQSYSPRT O F 132 PRINTER
Figura 111 (Parte 1 de 3). Fuente del manejador de condiciones para error de subserie
fuera de límites
\-----------------------------------------------------------------\
\ Parámetros del procedimiento \
\ 1. Entrada: Estructura del símbolo de condición \
\ 2. Entrada: Nombre del procedimiento en que se ha producido el \
\ error \
\ 3. Salida: Código que identifica las acciones que deben \
\ realizarse en la excepción \
\ 4. Salida: Condición nueva si decidimos promover la condición. \
\ Ya que este manejador sólo reanuda y filtra, \
\ se ignorará este parámetro. \
\-----------------------------------------------------------------\
D CondTok DS
D MsgSev 4B ð
D MsgNo 2A
D 1A
D MsgPrefix 3A
D 4A
D pPSDS S \
D PassedPSDS DS BASED(pPSDS)
D ProcName 1 1ð
D Action S 9B ð
\
\ Los códigos de acción son los siguientes:
\
D Resume C 1ð
D Percolate C 2ð
\-----------------------------------------------------------------\
\ Parámetros \
\-----------------------------------------------------------------\
C \ENTRY PLIST
C PARM CondTok
C PARM pPSDS
C PARM Action
\-----------------------------------------------------------------\
\ Si se trata de un error de subserie, manejar filtro, en \
\ caso contrario filtrar. Observe que el valor del número \
\ de mensaje (MsgNo) está en hexadecimal. \
\-----------------------------------------------------------------\
C EXCEPT
C IF MsgPrefix = 'RNX' AND
C MsgNo = X'ð1ðð'
C EXCEPT Handling
C EVAL Action = Resume
C ELSE
C EXCEPT Perclating
C EVAL Action = Percolate
C ENDIF
C RETURN
Figura 111 (Parte 2 de 3). Fuente del manejador de condiciones para error de subserie
fuera de límites
\=================================================================\
\ Salida del procedimiento \
\=================================================================\
OQSYSPRT E
O 'En manejador para...'
O ProcName
OQSYSPRT E Handling
O ' Manejador...'
OQSYSPRT E Perclating
O ' Filtrando ... .'
Figura 111 (Parte 3 de 3). Fuente del manejador de condiciones para error de subserie
fuera de límites
\=================================================================\
\ SHOWERR: Mostrar manejo de excepciones utilizando un \
\ manejador de excepciones definido por el usuario \
\=================================================================\
FQSYSPRT O F 132 PRINTER
\-----------------------------------------------------------------\
\ Las siguientes son definiciones de parámetro para la API \
\ CEEDHLR. El primero es el puntero de procedimiento al \
\ procedimiento que manejará la excepción. El segundo es un \
\ puntero a un área de comunicaciones que se pasará al \
\ procedimiento de manejo de excepciones. En este ejemplo, \
\ pasaremos un puntero al nombre de este procedimiento. \
\-----------------------------------------------------------------\
D pConHdlr S \ PROCPTR
D INZ(%paddr('RPGHDLR'))
\-----------------------------------------------------------------\
\ PSDS \
\-----------------------------------------------------------------\
D DSPsds SDS NOOPT
D ProcName \PROC
\-----------------------------------------------------------------\
\ Matriz que se utilizará para provocar un error \
\-----------------------------------------------------------------\
D Arr1 S 1ðA DIM(5)
\-----------------------------------------------------------------\
\ Interfaz CEEHDLR \
\-----------------------------------------------------------------\
D CEEHDLR PR
D pConHdlr \ PROCPTR
| D CommArea \ CONST
D Feedback 12A OPTIONS(\OMIT)
\-----------------------------------------------------------------\
\ Interfaz CEEHDLU \
\-----------------------------------------------------------------\
D CEEHDLU PR
D pConHdlr \ PROCPTR
D Feedback 12A OPTIONS(\OMIT)
\-----------------------------------------------------------------\
\ Registrar el manejador y generar errores \
\-----------------------------------------------------------------\
C EXSR RegHndlr
\-----------------------------------------------------------------\
\ Generar un error de subserie \
\-----------------------------------------------------------------\
C Z-ADD -1 Neg1 5 ð
C Neg1 SUBST 'Hola' Examp 1ð
\-----------------------------------------------------------------\
\ El manejador ha manejado la excepción y aquí se reanuda \
\ el control. \
\-----------------------------------------------------------------\
C EXCEPT ImBack
\-----------------------------------------------------------------\
\ Generar una matriz fuera de los límites de error \
\-----------------------------------------------------------------\
C MOVE Arr1(Neg1) Arr1(Neg1)
\-----------------------------------------------------------------\
\ El manejador no ha manejado la excepción, por lo que el \
\ control no se devuelve aquí. Se filtra la excepción \
\ y se reanuda el control en \PSSR. \
\-----------------------------------------------------------------\
\-----------------------------------------------------------------\
\ Desregistrar el manejador \
\ Nota: Si se produce una excepción antes de desregistrar \
\ el manejador, se desregistrará automáticamente cuando se \
\ cancele el procedimiento. \
\-----------------------------------------------------------------\
C EXSR DeRegHndlr
C
C SETON LR
\=================================================================\
\ RegHdlr - Llamar a la API para registrar el manejador \
\=================================================================\
C RegHndlr BEGSR
| C CALLP CEEHDLR(pConHdlr : %ADDR(DSPsds) : \OMIT)
C ENDSR
\=================================================================\
\ DeRegHndlr - Llamar a la API para desregistrar el manejador \
\=================================================================\
C DeRegHndlr BEGSR
C ENDSR
\=================================================================\
\ \PSSR: Subroutina de error para el procedimiento \
\=================================================================\
C \PSSR BEGSR
C EXCEPT InPssr
C EXCEPT Cancelling
C ENDSR '\CANCL'
\=================================================================\
\ Salida del procedimiento \
\=================================================================\
OQSYSPRT E ImBack
O 'He vuelto'
OQSYSPRT E InPssr
O 'En PSSR'
OQSYSPRT E Cancelling
O 'Cancelando...'
\-----------------------------------------------------------------
\ Definir el prototipo para el manejador de cancelaciones. Este
\ es un procedimiento local.
\-----------------------------------------------------------------
D CanHdlr PR
D pMsg \
\-----------------------------------------------------------------
\ Definir el prototipo para un subprocedimiento para habilitar
\ el manejador de cancelaciones.
\-----------------------------------------------------------------
D Enabler PR
\-----------------------------------------------------------------
\ Definir el prototipo para un subprocedimiento para llamar a
\ Enabler.
\-----------------------------------------------------------------
D SubProc PR
\-----------------------------------------------------------------
\ Procedimiento principal. Llamar a SubProc tres veces.
\-----------------------------------------------------------------
C CALLP SubProc
C CALLP SubProc
C CALLP SubProc
C SETON LR
\-----------------------------------------------------------------
\ Procedimiento SubProc. Llamar a Enabler. Ya que fallará esta
\ llamada definir una subrutina \PSSR local para manejar el error.
\-----------------------------------------------------------------
P SubProc B
C CALLP Enabler
\-----------------------------------------------------------------
\ PSSR tiene una operación RETURN, por lo que no fallará la
\ llamada del procedimiento principal a SubProc.
\-----------------------------------------------------------------
C \PSSR BEGSR
C 'Subproc PSSR'DSPLY
C RETURN
C ENDSR
P SubProc E
\-----------------------------------------------------------------
\ Procedimiento Enabler. Este procedimiento habilita el manejador
\ de cancelaciones y obtiene un error que cancela Enabler.
\-----------------------------------------------------------------
P Enabler B
\ Variables locales
D Handler S \ PROCPTR INZ(%PADDR('CANHDLR'))
D Msg S 2ðA
D pMsg S \ INZ(%ADDR(Msg))
D Zero S 5P ð INZ(ð)
D Count S 5I ð INZ(ð) STATIC
D Array S 1A DIM(2)
\-----------------------------------------------------------------
\ Habilitar el manejador de cancelaciones. Cuando se cancela este
\ procedimiento se llamará a 'CANHDLR'.
\-----------------------------------------------------------------
C CALLB 'CEERTX'
C PARM Handler
C PARM pMsg
C PARM \OMIT
\-----------------------------------------------------------------
| \ Se llamará a este procedimiento tres veces. Las dos primeras
\ veces obtendrá un error mientras está habilitado el manejador
\ de cancelaciones.
\-----------------------------------------------------------------
C EVAL Count = Count + 1
C SELECT
C WHEN Count = 1
C EVAL Msg = 'Divide by zero'
C EVAL Zero = Zero / Zero
C WHEN Count = 2
C EVAL Msg = 'String error'
C 'A' SCAN 'ABC':Zero Zero
\-----------------------------------------------------------------
\ En la tercera llamada, inhabilite el manejador de cancelaciones.
\ El error de índice de matriz hará que falle este procedimiento,
\ pero no se invocará al manejador.
\-----------------------------------------------------------------
C WHEN Count = 3
C CALLB 'CEEUTX'
C PARM Handler
C PARM \OMIT
C EVAL Msg = 'Error de índice de matriz'
C EVAL Array(Zero) = 'x'
C ENDSL
P Enabler E
\-----------------------------------------------------------------
\ Definir el manejador de cancelaciones. El parámetro es un
\ puntero al 'área de comunicaciones', un mensaje a visualizar.
\-----------------------------------------------------------------
P CanHdlr B
D CanHdlr PI
D pMsg \
\-----------------------------------------------------------------
\ Definir un campo basado en el pMsg del puntero de entrada.
\-----------------------------------------------------------------
D Msg S 2ðA BASED(pMsg)
\-----------------------------------------------------------------
\ Visualizar el mensaje establecido por el procedimiento que ha
\ habilitado al manejador.
\-----------------------------------------------------------------
C 'Cancel Hdlr 'DSPLY Msg
P CanHdlr E
| \----------------------------------------------------------------
| \ Acciones
| \----------------------------------------------------------------
| D Handle C 1ð
| D Percolate C 2ð
| \----------------------------------------------------------------
| \ Gravedad
| \----------------------------------------------------------------
| D Info C ð
| D Warning C 1
| D Error C 2
| D Severe C 3
| D Critical C 4
| C \ENTRY PLIST
| C PARM Token
| C PARM dummy 1
| C PARM Action
| \----------------------------------------------------------------
| \ Si se trata de CPF49ð6, manejar mensaje de notificación,
| \ en caso contrario, filtrar
| \----------------------------------------------------------------
| C IF Prefix = 'CPF' AND
| C MsgNo = X'49ð6'
| C EVAL Action = Handle
| C ELSE
| C EVAL Action = Percolate
| C ENDIF
| C RETURN
| En la Figura 116 en la página 255 se muestra cómo debe codificar los cál-
| culos si desea ignorar los mensajes informativos y de aviso.
| C ELSE
| C EVAL Action = Percolate
| C ENDIF
| C RETURN
| Figura 116.
Figura 117. Sección de Información de estado del programa del vuelco con formato
Áreas de realimentación:
REALIMENTACIÓN APERTURA J
Tipo de ODP . . . . . . . . . . . . . . : SP
Nombre Archivo . . . . . . . . . . . . . : QSYSPRT
Biblioteca . . . . . . . . . . . . . : QSYS
Miembro . . . . . . . . . . . . . . . : Q5ð1383525
Archivo Spool . . . . . . . . . . . . . : Qð4ð79Nðð2
Biblioteca . . . . . . . . . . . . . : QSPL
Número Archivo de Spool. . . . . . . . . : 7
Longitud Registro Primario . . . . . . . : 8ð
Longitud Bloque Entrada. . . . . . . . . : ð
Longitud Bloque de Salida. . . . . . . . : 8ð
Clase Dispositivo. . . . . . . . . . . . : PRINTER
Líneas por Página . . . . . . . . . . . : 66
Columnas por Línea . . . . . . . . . . . : 132
Permitir Claves Duplicad.. . . . . . . . : \N/A\
Registros a transferir . . . . . . . . : 1
Lín. Desbordamiento. . . . . . . . . . . : 6ð
Incremento Registro Bloque . . . . . . . : ð
Compart. Arch. Permitido. . . . . . . . : NO
Archivo disposit. creado con DDS . . . . : NO
Archivo IGC con posib.gráficos . . . . . : NO
Cta. Arch. Abiertos. . . . . . . . . . . : 1
Separar Area de Indicador . . . . . . . : NO
Almac.Int.Usuario. . . . . . . . . . . . : NO
Identific. Apertura. . . . . . . . . . . : Qð4ð79Nðð2
Longitud Máxima Registro . . . . . . . . : ð
Ambito de ODP Trabajo. . . . . . . . . . : NO
Dispositivos Máx. Programa . . . . . . . : 1
Disposit. Programa Actual Definido . . . : 1
Nombre Dispositiv. . . . . . . . . . . . : \N
Nombre Descrip. Dispositivo. . . . . . . : \N
Clase Dispositivo. . . . . . . . . . . . : 'ð2'X
Tipo Dispositiv. . . . . . . . . . . . . : 'ð8'X
REALIMENTACIÓN DE IMPRESORA:
Número de Línea Actual . . . . . . . . . . : 1
Página Actual . . . . . . . . . . . . . . : 1
Código Retorno Princip.. . . . . . . . . . : ðð
Código Retorno Secund. . . . . . . . . . . : ðð
Información de datos:
M
Indicadores de detención:
H1 'ð' H2 'ð' H3 'ð' H4 'ð' H5 'ð' H6 'ð' H7 'ð' H8 'ð' H9 'ð'
Indicadores de tecla de mandato/función:
KA 'ð' KB 'ð' KC 'ð' KD 'ð' KE 'ð' KF 'ð' KG 'ð' KH 'ð' KI 'ð' KJ 'ð'
KK 'ð' KL 'ð' KM 'ð' KN 'ð' KP 'ð' KQ 'ð' KR 'ð' KS 'ð' KT 'ð' KU 'ð'
KV 'ð' KW 'ð' KX 'ð' KY 'ð'
Indicadores de nivel de control
L1 'ð' L2 'ð' L3 'ð' L4 'ð' L5 'ð' L6 'ð' L7 'ð' L8 'ð' L9 'ð'
Indicadores de desbordamiento
OA 'ð' OB 'ð' OC 'ð' OD 'ð' OE 'ð' OF 'ð' OG 'ð' OV 'ð'
Indicadores externos:
U1 'ð' U2 'ð' U3 'ð' U4 'ð' U5 'ð' U6 'ð' U7 'ð' U8 'ð'
Indicadores generales:
ð1 'ð' ð2 '1' ð3 'ð' ð4 '1' ð5 'ð' ð6 '1' ð7 'ð' ð8 'ð' ð9 'ð' 1ð 'ð'
11 'ð' 12 'ð' 13 'ð' 14 'ð' 15 'ð' 16 'ð' 17 'ð' 18 'ð' 19 'ð' 2ð 'ð'
21 'ð' 22 'ð' 23 'ð' 24 'ð' 25 'ð' 26 'ð' 27 'ð' 28 'ð' 29 'ð' 3ð 'ð'
31 'ð' 32 'ð' 33 'ð' 34 'ð' 35 'ð' 36 'ð' 37 'ð' 38 'ð' 39 'ð' 4ð 'ð'
41 'ð' 42 'ð' 43 'ð' 44 'ð' 45 'ð' 46 'ð' 47 'ð' 48 'ð' 49 'ð' 5ð 'ð'
51 'ð' 52 'ð' 53 'ð' 54 'ð' 55 'ð' 56 'ð' 57 'ð' 58 'ð' 59 'ð' 6ð 'ð'
61 'ð' 62 'ð' 63 'ð' 64 'ð' 65 'ð' 66 'ð' 67 'ð' 68 'ð' 69 'ð' 7ð 'ð'
71 'ð' 72 'ð' 73 'ð' 74 'ð' 75 'ð' 76 'ð' 77 'ð' 78 'ð' 79 'ð' 8ð 'ð'
81 'ð' 82 'ð' 83 'ð' 84 'ð' 85 'ð' 86 'ð' 87 'ð' 88 'ð' 89 'ð' 9ð 'ð'
91 'ð' 92 'ð' 93 'ð' 94 'ð' 95 'ð' 96 'ð' 97 'ð' 98 'ð' 99 'ð'
Indicadores Internos:
LR 'ð' MR 'ð' RT 'ð' 1P 'ð'
N
NAME ATTRIBUTES VALUE
_QRNU_DSI_DS1 INT(1ð) 1 'ððððððð1'X O
_QRNU_DSI_DS2 INT(1ð) 2 'ððððððð2'X
| _QRNU_NULL_ARR CHAR(1) DIM(8) P
| (1-2) '1' 'F1'X
| (3) 'ð' 'Fð'X
| (4) '1' 'F1'X
| (5-6) 'ð' 'Fð'X
| (7) '1' 'F1'X
| (8) 'ð' 'Fð'X
| _QRNU_NULL_FLDNULL CHAR(1) '1' 'F1'X
| _QRNU_TABI_TABLEA INT(1ð) 1 'ððððððð1'X Q
| ARR CHAR(2) DIM(8)
| (1-3) 'AB' 'C1C2'X
| (4-7) ' ' '4ð4ð'X
| (8) '1' 'F1'X
ARRY ZONED(3,2) DIM(2)
(1-2) 1.24 'F1F2F4'X
BASEONNULL CHAR(1ð) NOT ADDRESSABLE
BASEPTR POINTER SPP:E3ðð95A62Fðð12ð8
BASESTRING CHAR(6) 'ABCDEF' 'C1C2C3C4C5C6'X
BIGDATE DATE(1ð) '1994-ð9-3ð' 'F1F9F9F46ðFðF96ðF3Fð'X
BIGTIME TIME(8) '12.ðð.ðð' 'F1F24BFðFð4BFðFð'X
BIGTSTAMP TIMESTAMP(26) '9999-12-31-12.ðð.ðð.ðððððð'
VALUE IN HEX 'F9F9F9F96ðF1F26ðF3F16ðF1F24BFðFð4BFðFð4BFðFðFðFðFðFð'X
BIN4D3 BIN(4,3) -4.321 'EF1F'X
BIN9D7 BIN(9,7) 98.7654321 '3ADE68B1'X
DBCSSTRING GRAPHIC(3) ' BBCCDD ' 'C2C2C3C3C4C4'X
Figura 120 (Parte 1 de 2). Sección de Datos del vuelco con formato
DS1 DS OCCURS(3) R
OCCURRENCE(1)
FLD1 CHAR(5) '1BCDE' 'F1C2C3C4C5'X
FLD1A CHAR(1) DIM(5)
(1) '1' 'F1'X
(2) 'B' 'C2'X
(3) 'C' 'C3'X
(4) 'D' 'C4'X
(5) 'E' 'C5'X
FLD2 BIN(5,2) 123.45 'ðððð3ð39'X
OCCURRENCE(2)
FLD1 CHAR(5) 'ABCDE' 'C1C2C3C4C5'X
FLD1A CHAR(1) DIM(5)
(1) 'A' 'C1'X
(2) 'B' 'C2'X
(3) 'C' 'C3'X
(4) 'D' 'C4'X
(5) 'E' 'C5'X
FLD2 BIN(5,2) 123.45 'ðððð3ð39'X
OCCURRENCE(3)
FLD1 CHAR(5) 'ABCDE' 'C1C2C3C4C5'X
FLD1A CHAR(1) DIM(5)
(1) 'A' 'C1'X
(2) 'B' 'C2'X
(3) 'C' 'C3'X
(4) 'D' 'C4'X
(5) 'E' 'C5'X
FLD2 BIN(5,2) 123.45 'ðððð3ð39'X
DS2 CHAR(1O) DIM(2) S
(1) 'aaaaaaaaaa' '81818181818181818181'X
(2) 'bbbbbbbbbb' '82828282828282828282'X
DS3 DS T
FIRSTNAME CHAR(1ð) 'Fred ' 'C69985844ð4ð4ð4ð4ð4ð'X
LASTNAME CHAR(1ð) 'Jones ' 'D1969585A24ð4ð4ð4ð4ð'X
TITLE CHAR(5) 'Mr. ' 'D4994B4ð4ð'X
EXPORTFLD CHAR(6) 'export' '85A7979699A3'X
| FLDNULL ZONED(3,1) 24.3 'F2F4F3'X
| FLOAT1 FLT(4) 1.2345ððððððððE+ðð7 U
| VALUE IN HEX '4B3C5EA8'X
| FLOAT2 FLT(8) 3.962745ððððððE+ð47
| VALUE IN HEX '49D15A64ðA93FCFF'X
INT1ð INT(1ð) -319ð4 'FFFF836ð'X
INT5 INT(5) -2ð46 'F8ð2'X
| NEG_INF FLT(8) -HUGE_VAL V
| VALUE IN HEX 'FFFððððððððððððð'X
| NOT_NUM FLT(4) \NaN W
| VALUE IN HEX '7FFFFFFF'X
NULLPTR POINTER SYP:\NULL
PACKED1Dð PACKED(5,2) -ð93.4ð 'ð934ðD'X
PARM1 PACKED(4,3) 6.666 'ð6666F'X
| POS_INF FLT(8) HUGE_VAL X
| VALUE IN HEX '7FFððððððððððððð'X
PROCPTR POINTER PRP:AððCAð2EC2ðð Y
SPCPTR POINTER SPP:Að26FAð1ððCð
SPCSIZ BIN(9,ð) ðððððððð8. 'ððððððð8'X
STRING CHAR(6) 'ABCDEF' 'C1C2C3C4C5C6'X
TABLEA CHAR(3) DIM(3)
(1) 'aaa' '818181'X
(2) 'bbb' '828282'X
(3) 'ccc' '838383'X
UNSIGNED1ð UNS(1ð) 319ð4 'ðððð7CAð'X
UNSIGNED5 UNS(5) 2ð46 'ð7FE'X
ZONEDD3D2 ZONED(3,2) -3.21 'F3F2D1'X
Local variables for subprocedure SWITCH: Z
NAME ATTRIBUTES VALUE
_QRNL_PSTR_PARM POINTER SYP:\NULL
LOCAL CHAR(5) ' ' 'ðððððððððð'X
PARM CHAR(1) NOT ADDRESSABLE
\ \ \ \ \ F I N D E V U E L C O R P G \ \ \ \ \
Figura 120 (Parte 2 de 2). Sección de Datos del vuelco con formato
L Nivel de optimización
M Indicadores generales 1-99 y sus estados actuales ("1" es activado, "0"
es desactivado). Observe que los indicadores *IN02, *IN04 y *IN06
todavía no estaban establecidos.
Tabla 13. Correlación de tipos de dispositivo RPG con tipos de archivo AS/400
Tipo de dispositivo RPG Tipo de archivo AS/400
DISK archivos de base de datos, de salvar y DDM
PRINTER archivos de impresora
WORKSTN archivos de pantalla e ICF
SEQ archivos de cinta, de disquete, de salvar, de
impresora y de base de datos
SPECIAL N/A
Denominación de archivos
En el sistema AS/400, los archivos están formados por miembros. Estos
archivos se organizan dentro de bibliotecas. La convención de denominación
de archivos es nombre de biblioteca/nombre de archivo.
OS/4ðð OS/4ðð
┌──────────────┐ ┌──────────────┐
│Descripción │ │Descripción de│ OS/4ðð
│de Archivo a │ │un Archivo a │ ┌──────────────┐
│Nivel de Campo│ │Nivel Registro│ │Descripción de│
└──────────────┘ └──────────────┘ │un Archivo a │
│Nivel de Campo│
┌─────┘ │ │ └─────┐ └──────────────┘
│ │ │ │
6 6 6 6 6
1 RPG 2 RPG 3 RPG 4 RPG
┌────────────────────┐ ┌────────────────────┐ ┌────────────────────┐ ┌────────────────────┐
│Archivo Descrito │ │ Archivo Descrito en│ │Archivo Descrito en │ │Archivo Descrito │
│Externamente │ │ el Programa (F en │ │el Programa (F en │ │Externamente │
│(E en posición 22) │ │ 22) ─ El compilador│ │22) │ │(E en posición 22) │
│ │ │ no copia la │ │ │ │ │
│ │ │ descripción a nivel│ │ │ │ │
│ │ │ de campo │ │ │ │ │
└────────────────────┘ └────────────────────┘ └────────────────────┘ └────────────────────┘
Figura 124. Relaciones típicas entre un programa en RPG y archivos en el sistema AS/400
Figura 125. Palabra clave RENAME para nombres de formato de registro en un archivo
descrito externamente
Figura 126. Palabra clave PREFIX para nombres de formato de registro en un archivo des-
crito externamente
La palabra clave INCLUDE también puede utilizarse para incluir sólo los
nombres de formato de registro que van a utilizarse en un programa. El resto
de formatos de registro contenidos en el archivo se excluirán.
Figura 127. Palabra clave IGNORE para formatos de registro de un archivo descrito exter-
namente
Figura 128. Alteración temporal y adición de funciones de RPG a una descripción externa
Cuando cree un registro nuevo, los dos primeros bytes del campo se estable-
cerán a 0 y el resto del campo se establecerán a blanco.
Comprobación de nivel
Los programas en lenguajes de alto nivel (HLL) dependen de la recepción,
durante la ejecución, de un archivo descrito externamente cuyo formato corres-
ponda con lo que se ha copiado en el programa en tiempo de compilación. Por
este motivo, el sistema proporciona una función de nivel de comprobación que
asegura que el formato sea el mismo.
READ
Por número relativo READ, CHAIN
de registro
Por clave READ, READE, CHAIN, archivo primario y
secundario
Secuencial READ
Anterior READP, READPE
Siguiente READ, READE
Dispositivo solicitado READ
WRITE-READ EXFMT
WRITE
Por número relativo WRITE
de registro
Por clave WRITE, EXCEPT, archivo primario y secun-
dario
Secuencial WRITE, EXCEPT
FEOD FEOD
UPDATE
Por número de registro UPDATE, archivo primario y secundario
relativo
Por clave UPDATE, archivo primario y secundario
DELETE
Por número de registro DELETE, archivo primario y secundario
relativo
Por clave DELETE, archivo primario y secundario
ACQUIRE ACQ
RELEASE REL
COMMIT COMMIT
ROLLBACK ROLBK
Tiempo de Compilación:
Alterar Temporalmente FMT1
archivo QTAPE a
archivo FMT1
tipo de dispositivo =
TAPE
Bloqueo de archivos
El sistema OS/400 permite situar un estado de bloqueo (exclusivo, de permiso
de lectura exclusivamente, compartido para actualización, compartido sin
actualización o compartido para lectura) en un archivo utilizado durante un
trabajo. Los programas que están dentro de un trabajo no están afectados por
los estados de bloqueo de los archivos. Un estado de bloqueo de archivo sólo
se produce cuando un programa de otro trabajo intenta utilizar el archivo al
mismo tiempo. Puede asignarse el estado de bloqueo de archivo mediante el
mandato de CL ALCOBJ (Asignar objeto). Para obtener más información
sobre la asignación de recursos y estados de bloqueo consulte la publicación
Gestión de datos.
El estado de bloqueo compartido para lectura permite que otro usuario abra el
archivo con un estado de bloqueo compartido para lectura, compartido para
actualización, compartido sin actualización o de permiso de lectura exclusi-
Bloqueo de registros
Cuando un programa lee un registro, lo lee utilizando una de estas dos modali-
dades: entrada o actualización. Si un programa lee un registro para actuali-
zación, se coloca un bloqueo en ese registro. Otro programa no puede leer el
mismo registro para actualizarlo hasta que el primer programa libere ese
bloqueo. Si un programa lee un registro para entrada, no se coloca el bloqueo
en el registro. Un registro que está bloqueado por un programa puede ser
leído para entrada por otro programa.
La posición del registro actual se guarda en la vía de datos abierta para todos
los programas que utilicen el archivo. Si un programa lee un registro ya a
continuación otro programa llamado lee un registro , el registro recuperado en
la segunda lectura depende de si la vía de datos abierta es compartida. Si la
vía de datos abierta es compartida, la posición del registro actual en el pro-
grama llamado viene determinada por la posición actual del programa que
realiza la llamada. Si la vía de datos abierta no es compartida, cada programa
tiene una posición independiente para el registro actual.
En ILE, los archivos compartidos están dentro del ámbito del nivel de trabajo o
del nivel del grupo de activación. Un programa que se ejecute en cualquier
grupo de activación dentro de un trabajo puede compartir los archivos compar-
tidos que están dentro del ámbito del nivel de trabajo. Los programas que se
ejecutan en el mismo grupo de activación pueden compartir sólo los archivos
compartidos que están dentro del ámbito del nivel del grupo de activación.
Debe asegurarse de que cuando se abre por primera vez el archivo compar-
tido, se especifican todas las opciones de apertura requeridas para las aper-
turas posteriores del archivo. Si las opciones de apertura especificadas para
las aperturas posteriores de un archivo compartido no están incluidas en las
Tabla 15. Opciones de apertura del sistema permitidas con las opciones de apertura
del usuario
Opciones de apertura Opciones de apertura
de usuario de RPG de usuario de RPG
INPUT INPUT
OUTPUT OUTPUT (archivo creado por programa)
UPDATE INPUT, UPDATE, DELETE
ADD OUTPUT (archivo existente)
Para obtener información sobre cómo compartir una vía de acceso a datos
abierta, consulte la publicación DB2/400 Programación de la base de datos.
La publicación ILE Conceptos también contiene información sobre compartición
de vías de acceso a datos abiertas y la comparación entre el ámbito a nivel de
trabajo y de grupo de activación.
Spooling
El spooling es una función del sistema que coloca los datos en un área de
almacenamiento mientras esperan el proceso. El sistema AS/400 proporciona
la utilización de funciones de spooling de entrada y de salida. Cada descrip-
ción de archivo de AS/400 contiene un atributo de spool que determina si el
spooling se utiliza para el archivo en tiempo de ejecución. El programa en
RPG no detecta la utilización del spooling. El dispositivo físico real desde el
que se lee un archivo o en el que se graba un archivo está determinado por el
lector de spool o por el transcriptor de spool. Para obtener información más
detallada sobre spooling, consulte la publicación Gestión de datos.
Spooling de salida
El spooling de salida es válido para trabajos de proceso por lotes e interac-
tivos. La descripción de archivos que el nombre de archivo especifica en el
programa en RPG contiene la especificación para el spooling tal como se
indica en el diagrama siguiente:
Debe decidir si desea utilizar SRTSEQ para el programa RPG según cómo
quiera que las operaciones IFxx, COMP y SORTA actúen sobre los datos de
caracteres, y no según lo que se especificó cuando creó los archivos.
Un archivo físico puede tener una vía de acceso de secuencia por clave.Esto
significa que los datos se presentan a un programa en una secuencia basada
en uno o más campos de clave en el archivo.
Para obtener una lista completa de las palabras clave de DDS válidas para un
archivo de base de datos, consulte la publicación DB2/400 Programación de la
base de datos.
Vía de acceso
La descripción de un archivo descrito externamente contiene la vía de acceso
que describe cómo han de recuperarse los registros desde el archivo. Los
registros pueden recuperarse basándose en una vía de acceso en secuencia
de llegada (sin claves) o en una vía de acceso en secuencia de clave.
Las DDS de ejemplo son para el archivo lógico maestro de clientes CUSMSTP.
El archivo contiene un formato de registro REGCLI (registro maestro de
clientes). Los datos de este archivo están contenidos en el archivo físico
CUSMSTP, que se identifica mediante la palabra clave PFILE. La palabra
clave UNIQUE se utiliza para indicar que no están permitidos valores de clave
duplicados para este archivo. El campo CLIE se identifica mediante una K en
A ULTIMF R REFFLD(SALDO)
A COLHDG('Ultima' 'Fecha' 'Pago')
A TEXT('Último importe pago en C/Cob')
A LIMCRE R REFFLD(Saldo)
A COLHDG('Limite' 'Credito'
A TEXT('Última fecha pago en C/Cob')
A VENTAN R REFFLD(Saldo)
A COLHDG('Crédito' 'Límite')
A TEXT('Ventas Clientes este Año')
A VTAN R+ 2 REFFLD(SALDO)
A COLHDG('Ventas 'Este' 'Año')
A TEXT('Ventas Clientes Este Año')
A SLSLYR R+ 2 REFFLD(SALDO)
A COLHDG('Ventas''Último' 'Año')
A TEXT('Ventas cliente último año') 7
La clave para un archivo viene determinada por las claves válidas para los
tipos de registro de ese archivo. La clave del archivo se determina de la forma
siguiente:
Si todos los tipos de registro en un archivo tienen el mismo número de
campos de clave definidos en las DDS que sean idénticas en atributos, la
clave para el archivo está formada por todos los campos en la clave para
los tipos de registro. (Los campos correspondientes no necesitan tener el
mismo nombre). Por ejemplo, si el archivo tiene tres tipos de registro y la
clave para cada tipo de registro está formado por los campos A, B y C, la
clave del archivo estará compuesta por los campos A, B y C. Es decir, la
clave del archivo es la misma que la clave de los registros.
Si todos los tipos de registro en el archivo no tienen los mismos campos
de clave, la clave para el archivo se compone de los campos de clave
comunes a todos los tipos de registro. Por ejemplo, un archivo tiene tres
tipos de registro y los campos de clave se han definido tal como sigue:
– REG1 contiene el campo de clave A.
– REG2 contiene los campos de clave A y B.
– REG3 contiene los campos de clave A, B y C.
La clave del archivo es el campo de clave A común para todos los tipos de
registro.
Si no hay ningún campo de clave común a todos los tipos de registro, no
hay ninguna clave para el archivo.
de búsqueda que se componga sólo del número de campos común a todos los
tipos de registro del archivo.
El compilador RPG genera el código del programa objeto para bloquear y des-
bloquear todos los archivos SEQ o DISK que satisfacen las condiciones ante-
riores. Algunas restricciones del sistema OS/400 pueden impedir el bloqueo y
desbloqueo. En dichos casos, no se mejora el rendimiento.
Archivo indexado
Un archivo indexado es un archivo DISK descrito por programa cuya vía de
acceso se crea con valores de clave. Debe crear la vía de acceso para un
archivo indexado utilizando las especificaciones de descripción de datos.
Las DDS especifican los campos que han de utilizarse como campos de clave.
La palabra clave KEYLOC de las especificaciones de descripción de archivos
especifican la posición de comienzo del primer campo de clave. La entrada en
las posiciones 29 a 33 de las especificaciones de descripción de archivos
deben especificar la longitud total de la clave tal como se ha definido en las
DDS.
La Figura 133 y la Figura 134 muestran ejemplos de como usar las DDS para
describir la vía de acceso para archivos indexados.
En las DDS del formato de registro FORMATA del archivo lógico DETPEDL, el
campo PEDIDO, que tiene una longitud de cinco dígitos, se define como el
campo de clave y está en formato empaquetado. La definición de PEDIDO
como el campo de clave establece el acceso por clave a este archivo. Los
otros dos campos, CPOA y CPOB, describen el resto de posiciones de este
registro como campos de caracteres.
Cuando las DDS especifican una clave compuesta, se debe crear un argu-
mento de búsqueda en el programa para CHAIN en el archivo. (No puede
usarse una KLIST para un archivo descrito por programa). Una forma de
hacer esto es crear una estructura de datos (utilizando especificaciones de
definición) con subcampos iguales a los campos de claves definidos en las
DDS. Luego, en los cálculos, haga que los subcampos sean iguales al valor
de los campos de claves y utilice el nombre de la estructura de datos como
argumento de búsqueda en la operación CHAIN.
Archivo secuencial
Los archivos secuenciales son archivos en los que el orden de los registros del
archivo se basa en el orden en que los registros están colocados en el archivo
(es decir, en secuencia de llegada). Por ejemplo, el décimo registro colocado
en el archivo ocupa la décima posición de registro.
Registros de límites
Para el proceso secuencial entre límites, el archivo de direcciones de registros
contiene registros de límites. Un registro de límites contiene la clave de regis-
tros más baja y la clave de registros más alta de los registros que han de
leerse en el archivo.
La Figura 136 muestra las entradas válidas para las posiciones 28, 34, y 35 de
la especificación de descripción de archivos para los diversos tipos de archivo
y métodos de proceso. A continuación se describe cada uno de los métodos
de proceso.
Con claves
Sin claves
Secuencialmente Blanco A, D, G, P, I
| T, Z o F
| Al azar Blanco A, D, G, P, I
| T, Z o F
| Secuencialmente entre límites L A, D, G, P, I
| (por arch. dirección registro) T, Z o F
Sin claves
Proceso consecutivo
Durante el proceso consecutivo, los registros se leen en el orden en que apa-
recen en el archivo.
Para obtener más información del proceso sólo secuencial, consulte la publi-
cación DB2/400 Programación de la base de datos.
El método de proceso secuencial por clave es válido para archivos por clave
que se utilicen como archivo primario, secundario o controlado en cálculo.
Para obtener más información acerca del proceso sólo secuencial, consulte la
publicación DB2/400 Programación de la base de datos.
A\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
A\ DESCRIPTION: Estas son las DDS del archivo físico MSTEMP. \
A\ Contiene un formato de registro llamado EMPREG. \
A\ Este archivo contiene un registro para cada \
A\ empleado de la empresa. \
A\ \
A R EMPREC
A ENUM 5 ð TEXT('NÚMERO EMPLEADO')
A ENAME 2ð TEXT('NOMBRE EMPLEADO')
A ETYPE 1 TEXT('TIPO EMPLEADO')
A EDEPT 3 ð TEXT('DEPARTAMENTO EMPLEADO')
A ENHRS 3 1 TEXT('JORNADA SEMANAL NORMAL EMPL.')
A K ENUM
Figura 137. DDS para el archivo de base de datos MSTEMP (archivo físico)
A\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
A\ DESCRIPCION: Esta es la DDS para el archivo físico TRSEMA. \
A\ Contiene un formato de registro llamado RCWEEK. \
A\ Este archivo contiene todas las entradas \
A\ realizadas semanalmente en el sistema \
A\ de informes de horas. \
A\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
A\
A R RCWEEK
A ENUM 5 ð TEXT('NUMERO DE EMPLEADO')
A WEEKNO 2 ð TEXT('NUMERO SEMANA DEL AÑO ACTUAL')
A HTRAE 4 1 TEXT('HORAS TRABAJADAS POR EMPLEADO')
A K ENUM
A K WEEKNO
Figura 138. DDS para el archivo de base de datos TRSEMA (archivo físico)
A\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
A\ ARCHIV RELAC: MSTEMP (Archivo físico) \
A\ TRSEMA (Archivo físico) \
A\ DESCRIPCION: Esta es la DDS para el archivo lógico EMPL1. \
A\ Contiene dos formatos de registros llamados \
A\ EMPREG y RCWEEK. \
A\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
A R EMPREG PFILE(MSTEMP)
A K ENUM
A\
A R RCWEEK PFILE(TRSEMA)
A K ENUM
A K WEEKNO
Figura 139. DDS para el archivo de base de datos EMPL1 (archivo lógico)
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\ NOMBRE PROG: YTDRPT1 \
\ ARCHIV RELAC: EMPL1 (Archivo Lógico) \
\ IMPRE (Archivo de Impresora) \
\ DESCRIPCIÓN: Este programa muestra un ejemplo de los \
\ registros del proceso que utilizan el método \
\ secuencial por clave. \
\ Este programa imprime la información y las \
\ horas semanales trabajadas por cada empleado. \
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
FIMPRE O F 8ð PRINTER
FEMPL1 IP E K DISK
IEMPREG ð1
I\
IRCWEEK ð2
I\
C SETOFF 12
C ð1 MOVE ENUM EMPNO 5 ð
C\
C IF (\INð2='1') AND (ENUM=EMPNO)
C SETON 12
C ENDIF
OPRINT H 1P 2 6
O 4ð 'INFORME DE HORAS SEMANALES '
O 52 'TRABAJADAS POR EMPLEADO'
O H ð1 1
O 12 'EMPLEADO: '
O ENAME 32
O H ð1 1
O 12 'NÚM. SERIE: '
O ENUM 17
O 27 'DEPT: '
O EDEPT 3ð
O 4ð 'TIPO: '
O ETIPO 41
O H ð1 1
O 2ð 'NÚM.HORAS'
O 5ð 'SEMANALES TRABAJADAS'
O D 12 1
O NUMSEM 18
O HTRAE 3 45
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\ NOMBRE PROG: YTDRPT2 \
\ ARCHIV RELAC: EMPL1 (Archivo Lógico) \
\ IMPRE (Archivo de Impresora) \
\ DESCRIPCIÓN: Este programa muestra un ejemplo de los \
\ registros del proceso que utilizan el código \
\ de operación de lectura. Este programa genera \
\ una copia impresa de información y de las \
\ horas semanales trabajadas por cada empleado. \
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
FIMPRE O F 8ð PRINTER
FEMPL1 IF E K DISK
C SETOFF 12
C READ EMPL1 99
C 99 GOTO EOFEND
C\
C ð1 MOVE ENUM EMPNO 5 ð
C\
C IF (\INð2='1') AND (ENUM=EMPNO)
C SETON 12
C ENDIF
C EOFEND TAG
C 99 SETON LR
OPRINT H 1P 2 6
O 4ð 'INFORME DE HORAS SEMANALES '
O 52 'TRABAJADAS POR EMPLEADO'
O H ð1 1
O 12 'EMPLEADO: '
O ENAME 32
O H ð1 1
O 12 'NÚM. SERIE: '
O ENUM 17
O 27 'DEPT: '
O EDEPT 3ð
O 4ð 'TIPO: '
O ETIPO 41
O H ð1 1
O 2ð 'NÚM HORAS'
O 5ð 'SEMANALES TRABAJADAS'
O D 12 1
O NUMSEM 18
O HTRAE 3 45
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\ NOMBRE PROG: YTDRPT5 \
\ ARCHIV RELAC: MSTEMP (Archivo Físico) \
\ TRSEMA (Archivo Físico) \
\ IMPRE (Archivo de Impresora) \
\ DESCRIPCIÓN: Este programa muestra un ejemplo de los \
\ registros del proceso que utilizan el método \
\ de registro coincidente. Este programa genera \
\ una copia impresa de información y de las \
\ horas semanales trabajadas por cada empleado. \
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
FIMPRE O F 8ð PRINTER
FMSTEMP IP E K DISK
FTRSEMA IS E K DISK
IEMPREC ð1
I ENUM M1
IRCWEEK ð2
I ENUM M1
C ð1 Z-ADD ð TOTHRS 5 1
C ð1 Z-ADD ð TOTOVT 5 1
C ð1 SETOFF 12
C\
C MR IF (\INð2='1')
C ADD EHWRK TOTHRS
C EHWRK SUB ENHRS OVTHRS 4 111
C 11 ADD OVTHRS TOTOVT
C SETON 12
C ENDIF
OPRINT H 1P 2 6
O 5ð 'RESUMEN NÓMINA AÑO FECHA'
O D ð1 1
O 12 'EMPLEADO: '
O ENAME 32
O D ð1 1
O 12 'NÚM. SERIE: '
O ENUM 17
O 27 'DEPT: '
O EDEPT 3ð
O 4ð 'TIPO: '
O ETYPE 41
O D ð2 MR 1
O 8 'NÚM.SEN'
O WEEKNO 1ð
O 32 'HORAS TRABAJADAS = '
O HTRAE 3 38
O D ð1NMR 1
O 7ð 'HORAS AÑO TRABAJADAS = '
O HRSTOT 3 78
O D ð1NMR 1
O 7ð 'HORAS EXTRAS AÑO = '
O HRSTOT 3 78
O T ð1 12 1
O OR LR 12
O 7ð 'HORAS AÑO TRABAJADAS = '
O HRSTOT 3 78
O T ð1 12 1
O OR LR 12
O 7ð 'HORAS EXTRAS AÑO = '
O HEXTOT 3 78
A\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
A\ PROGRAMAS RELAC.: EMSTUPD \
A\ DESCRIPCIÓN: Esta es la DDS para el archivo físico CHANGE. \
A\ contiene un formato de registro llamado \
A\ CHGREC. Este archivo contiene nuevos datos que\
A\ se utilizan para actualizar el archivo MSTEMP.\
A\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
A\
A R CHGREC
A ENUM 5 ð TEXT('NUMERO EMPLEADO')
A NOMBN 2ð TEXT('NUEVO NOMBRE')
A TIPON 1 TEXT('NUEVO TIPO')
A DEPTN 3 ð TEXT('NUEVO DEPARTAMENTO')
A HORSN 3 1 TEXT('NUEVAS HORAS SEMANALES NORMAL')
A K ENUM
Figura 143. DDS para el archivo de base de datos CAMBIO (archivo físico)
EJEMPLO DE PROGRAMA
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\ NOMBRE DEL PROGRAMA: EMSTUPD \
\ ARCHIVOS RELACIONADOS: EMSTEMP (Archivo físico) \
\ CAMBIO (Archivo físico) \
\ DESCRIPCION: Este programa muestra el proceso de registros \
\ utilizando el método al azar por clave. Se \
\ utiliza el código de operación CHAIN. \
\ El archivo físico CAMBIO contiene todos los \
\ cambios realizados al archivo EMPMST. Su \
\ nombre de formato es CHGREC. Puede que \
\ algunos campos en CHGREC se hayan dejado en \
\ blanco, en tal caso, no se producen cambios \
\ en esos campos. \
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
FCAMBIO IP E K DISK
FMSTEMP UF E K DISK
Figura 144 (Parte 1 de 2). Proceso al azar por clave de un archivo descrito externamente
Figura 144 (Parte 2 de 2). Proceso al azar por clave de un archivo descrito externamente
El programa repite este procedimiento hasta que llega al final del archivo de
direcciones de registros.
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\ NOMBRE DEL PROGRAMA: ESWLIM1 \
\ ARCHIVOS RELACIONADOS: MAEEMP (Archivo Físico) \
\ LIMITE (Archivo Físico) \
\ IMPRE (Archivo de Impresora) \
\ DESCRIPCION: Este programa muestra el proceso de un archivo\
\ indexado secuencialmente entre límites. \
\ Este programa imprime información para los \
\ empleados cuyos números de empleado están \
\ entre los límites proporcionados en el \
\ archivo LIMITE. \
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
IMAEEMP NS ð1
I P 1 3 ðENUM
I 4 23 ENOMB
I 24 24 ETIPO
I P 25 26 ðEDPTO
Figura 145 (Parte 1 de 2). Proceso secuencial entre límites de un archivo descrito exter-
namente
OPRINT H 1P 1
O 12 'NÚM SERIE'
O 22 'NOMB'
O 45 'DEPT'
O 56 'TIPO'
O D ð1 1
O ENUM 1ð
O ENOMB 35
O EDPTO 45
O ETIPO 55
Figura 145 (Parte 2 de 2). Proceso secuencial entre límites de un archivo descrito exter-
namente
A\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
A\ RELATED PROGRAMS: ESWLIM \
A\ DESCRIPTION: Esta es la DDS para el archivo físico \
A\ LIMITE. \
A\ Contiene el formato de registro LIMIT. \
A\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
A
A R LIMIT
A LOW 5 ð
A HIGH 5 ð
Figura 146. DDS para el archivo de direcciones de registros LIMITS (archivo físico)
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\ NOMBRE DEL PROGRAMA: ESWLIM2 \
\ ARCHIVOS RELACIONADOS: MSTEMP (Archivo Físico) \
\ LIMITE (Archivo Físico) \
\ IMPRE (Archivo de Impresora) \
\ DESCRIPCION: Este programa muestra el proceso de un archivo\
\ descrito externamente secuencialmente entre \
\ límites. \
\ Este programa imprime información para los \
\ empleados cuyos números de empleado están \
\ entre los límites proporcionados en el \
\ archivo LIMITE. \
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
IEMPREC ð1
OPRINT H 1P 1
O 12 'N SERIE'
O 22 'NOMB'
O 45 'DEPT'
O 56 'TIPO'
O D ð1 1
O ENUM 1ð
O ENOMB 35
O EDPTO 45
O ETIPO 55
O\
Figura 147. Proceso secuencial entre límites de un archivo descrito por programa
Los números relativos de registro identifican las posiciones de los registros con
relación al principio del archivo. Por ejemplo, los números relativos de registro
del primer, quinto y séptimo registro son 1, 5 y 7, respectivamente.
Figura 148. Operaciones de archivo válidas para métodos de proceso por clave (al azar por
clave, secuencial por clave, secuencia entre límites)
Figura 149. Operaciones de archivo válidas para métodos de proceso sin clave (secuencial,
aleatorio por número de registro relativo y consecutivo)
Un programa no tiene que operar todos sus archivos bajo control de compro-
miso; si lo hace, su rendimiento podría verse afectado de forma adversa. Las
operaciones COMMIT y ROLBK no surten ningún efecto sobre los archivos que
no se encuentren bajo control de compromiso.
Nota: Cuando hay múltiples dispositivos conectados a un programa de apli-
cación, y el control de compromiso para los archivos que utiliza este
programa está vigente, las operaciones COMMIT o ROLBK continúan
funcionando en base al archivo y no base al dispositivo. Puede que la
base de datos se actualice con los bloques COMMIT que se hayan
completado parcialmente, o que se eliminen los cambios que hayan
completado otros usuarios. Es responsabilidad del usuario asegurarse
de que no ocurra esto.
C IF INDICOMPR = '1'
C IF \IN9ð OR \IN91
C ROLBK
C ELSE
C COMMIT
C ENDIF
C ENDIF
C\
Archivos DDM
Los programas ILE RPG/400 acceden a archivos de sistemas remotos a través
de la gestión de datos distribuidos (DDM). DDM permite a programas de
aplicación de un sistema utilizar archivos almacenados en un sistema remoto
como si fueran archivos de base de datos. No es obligatorio utilizar sentencias
específicas en programas ILE RPG/400 para dar soporte a archivos DDM.
Para los archivos descritos por programa como para los descritos exter-
namente, el número de línea y el número de página están disponibles en la
sección de realimentación de impresora de la INFDS del archivo. Para
acceder a esta información, especifique la palabra clave INFDS en la especifi-
cación de archivos. En la especificación, defina el número de línea en las
posiciones 367 y 368, y defina el número de página en las posiciones 369 a
372 de la estructura de datos. Tanto el campo de número de línea como el de
número de página deben estar definidos en binario sin posiciones decimales.
Como la INFDS se actualiza después de cada operación de salida hacia el
archivo de impresora, estos campos pueden utilizarse para determinar el
número de línea y el número de página actuales sin que se necesite una lógica
de recuento de líneas del programa.
Nota: Si altera temporalmente un archivo de impresora por otro dispositivo,
como un disco, la sección de realimentación de la impresora de la
INFDS no se actualizará y la lógica de recuento de líneas no será
válida.
Lea los registros de cinta de longitud variable como si fueran registros de cual-
quier archivo organizado secuencialmente. Asegúrese de que la longitud de
registro especificada en la especificación de descripción de archivos se ajusta
al registro más largo del archivo.
┌──────────────────────────────────────────────────────┐
│ Posiciones de las Posiciones de las │
│ especificaciones de especificaciones de │
│ descripción de archivos cálculo │
│ 17 18 26-35 │
├──────────────────────────────────────────────────────┤
│ I P/S CLOSE, FEOD │
│ │
│ I F READ, OPEN, CLOSE, │
│ FEOD │
│ │
│ O WRITE, OPEN, CLOSE, │
│ FEOD │
│ │
└──────────────────────────────────────────────────────┘
Nota: Para un archivo secuencial no están permitidas las especificaciones
de control de impresión.
Figura 157. Códigos de operación de archivo válidos para un archivo secuencial
ILE RPG/400 llama a esta rutina escrita por el usuario para abrir el archivo,
leer y grabar registros y cerrar el archivo. ILE RPG/400 también crea una lista
de parámetros que la rutina escrita por el usuario va a utilizar. La lista de
parámetros contiene:
parámetro de código de opción (opción)
parámetro de estado de retorno (estado)
parámetro de error encontrado (error)
parámetro de área de registro (área)
Valor
pasado Descripción
O Abrir el archivo.
C Cerrar el archivo.
F Forzar el final del archivo.
R Leer un registro y situarlo en el área definida por el parámetro de área.
W El programa ILE RPG/400 ha colocado un registro en el área definida
por el parámetro de área; el registro, es para grabarlo.
D Suprimir el registro.
U El registro es una actualización del último registro leído.
Valor
de Descripción
retorno
0 Retorno normal. Se ha procesado la acción solicitada.
1 El archivo de entrada está al final del archivo y no se ha devuelto
ningún registro. Si el archivo es de salida, este valor de retorno es un
error.
2 No se ha procesado la acción solicitada; existe una condición de error.
La Figura 159 muestra los códigos de operación que son válidos para un
archivo SPECIAL.
┌──────────────────────────────────────────────────────┐
│ Posiciones de las Posiciones de las │
│ especificaciones de especificaciones de │
│ descripción de archivos cáculo │
│ 17 18 26-35 │
├──────────────────────────────────────────────────────┤
│ I P/S CLOSE, FEOD │
│ │
│ C P/S WRITE, CLOSE, FEOD │
│ │
│ U P/S UPDAT, DELETE, CLOSE │
│ FEOD │
│ │
│ O WRITE, OPEN, CLOSE, │
│ FEOD │
│ │
│ I F READ, WRITE, OPEN, │
│ CLOSE, FEOD │
│ │
│ C F READ, WRITE, OPEN, │
│ CLOSE, FEOD │
│ │
│ U F READ, UPDATE, DELETE, │
│ OPEN, CLOSE, FEOD │
└──────────────────────────────────────────────────────┘
Figura 159. Operaciones de archivo válidas para archivo SPECIAL
\----------------------------------------------------------------\
\ Los 4 primeros parámetros son una lista de parámetros creada \
\ por ILE RPG/4ðð. \
\ El resto se han definido en el PLIST definido por el \
\ programador \
\----------------------------------------------------------------\
C \ENTRY PLIST
C PARM OPTION 1
C PARM STATUS 1
C PARM ERROR 5 ð
C PARM AREA 2ð
C PARM FLD1 1
\----------------------------------------------------------------\
\ El programa escrito por el usuario efectuará la E/S de archivo \
\ de acuerdo con las opciones pasadas. \
\----------------------------------------------------------------\
C SELECT
C WHEN OPTION = 'O'
C\ efectúa la operación OPEN
C WHEN OPTION = 'W'
C\ efectúa la operación WRITE
C WHEN OPTION = 'C'
C\ efectúa la operación CLOSE
C ENDSL
C RETURN
Los archivos de pantalla son objetos de tipo *FILE con atributos DSPF del
sistema AS/400. Utilice los archivos de pantalla para comunicarse de forma
interactiva con usuarios en terminales de pantalla. De la misma manera que
los archivos de base de datos, los archivos de pantalla puede estar descritos
externamente o por programa.
Los archivos ICF son objetos de tipo *FILE con el atributo ICFF del sistema
AS/400. Utilice archivos ICF para comunicarse (enviar y recibir datos) con
otros programas de aplicación en sistemas remotos (AS/400 o no AS/400). Un
archivo ICF contiene los formatos de comunicación necesarios para enviar y
recibir datos entre sistemas. Puede grabar programas que utilicen archivos
ICF y que le permitan comunicarse (enviar y recibir datos) con otros programas
de aplicación en sistemas remotos.
Las teclas de función se especifican en las DDS con la palabra clave CFxx
(función de mandato) o CAxx (atención de mandato). Por ejemplo, la palabra
clave CF01 autoriza la utilización de la tecla de función 1. Cuando pulsa la
tecla de función 1, se activa el indicador de tecla de función KA en el programa
RPG. Si especifica la tecla de función como CF01(99), se activarán en el pro-
grama RPG el indicador KA de tecla de función y el indicador 99. Si el usuario
de la estación de trabajo pulsa una tecla de función que no está especificada
en las DDS, el OS/400 informa al usuario que ha pulsado una tecla no válida.
Un programa RPG puede procesar las teclas de mandato siempre que el com-
pilador procese una operación READ o una operación EXFMT en un formato
de registro para el que se hayan especificado en las DDS las palabras clave
apropiadas. Cuando las teclas de mandato están en vigor y se pulsa una tecla
de función, el OS/400 devuelve el control al programa RPG. Si se especifica
un indicador de respuesta en las DDS para el mandato seleccionado, se activa
dicho indicador y se desactivan todos los demás indicadores de respuesta que
estén en vigor para el formato de registro y para el archivo.
El OS/400 proporciona información para el control del dispositivo para que éste
efectúe operaciones de entrada/salida. Cuando se solicita un registro de
entrada del dispositivo, el OS/400 emite la solicitud y a continuación elimina de
los datos la información de control del dispositivo antes de transferir los datos
al programa. Además, el OS/400 puede transferir indicadores al programa que
reflejan qué campos, si hay alguno, han sido alterados en el registro.
Utilización de subarchivos
En las especificaciones de descripción de datos (DDS) pueden especificarse
subarchivos de un archivo de dispositivo de pantalla para permitir al usuario
manejar múltiples registros del mismo tipo en la pantalla. (Consulte la
Figura 163 en la página 351.) Un subarchivo es un grupo de registros que se
leen o se graban en un archivo de dispositivo de pantalla. Por ejemplo, un pro-
grama lee registros de un archivo de base de datos y crea un subarchivo de
registros de salida. Cuando se haya grabado el subarchivo en su totalidad, el
programa envía el subarchivo completo a la pantalla en una operación de
grabación.El usuario de la estación de trabajo puede alterar los datos o entrar
datos adicionales en el subarchivo. El programa lee a continuación todo el
subarchivo desde el dispositivo de pantalla, lo transfiere al programa y procesa
individualmente cada registro del subarchivo.
à ð
Búsqueda Nombre Cliente
Cod. Búsqueda______
á ñ
Figura 163. Visualización de un subarchivo
El proceso de subarchivos sigue las reglas para el proceso por número relativo
de registro. El programa en RPG coloca el número relativo de registro de cual-
quier registro recuperado mediante una operación READC en el campo citado
en la segunda posición de la palabra clave SFILE. Este campo se utiliza
también para especificar el número de registro que el programa en RPG utiliza
Utilización de subarchivos
Algunos usos clásicos de subarchivos incluyen:
Sólo visualización. El usuario de la estación de trabajo revisa la
visualización.
Visualización con selección. El usuario solicita más información sobre uno
de los elementos de la pantalla.
Modificación. El usuario modifica uno o más registros.
Sólo entrada, sin comprobación de validez. Se emplea un subarchivo para
una función de entrada de datos.
Sólo entrada, con comprobación de validez. Se emplea un subarchivo
para una función de entrada de datos, pero se comprueban los registros.
Combinación de tareas. Puede emplearse un subarchivo como una pan-
talla con modificación, más la entrada de nuevos registros.
Operación EXFMT
La operación EXFMT es una combinación de una operación WRITE seguida
de una operación READ para el mismo formato de registro (corresponde a la
operación WRITE-READ de gestión de datos). Si define un archivo
WORKSTN en las especificaciones de descripción de archivos como un
archivo combinado (C en la posición 17), controlado en cálculo (F en la posi-
ción 18), que utiliza datos descritos externamente en (E en la posición 22),
puede usarse el código de operación EXFMT (ejecutar formato) para grabar y
leer en la pantalla.
Operación READ
La operación READ es válida para un archivo combinado controlado en cálculo
o para un archivo controlado en cálculo de entrada que utilice los datos des-
critos externamente o los datos descritos por programa.La operación READ
recupera un registro de la pantalla. No obstante, debe haber un formato en el
dispositivo antes que pueda producirse una operación de entrada. Esta nece-
sidad puede satisfacerse en un dispositivo de pantalla condicionando un
registro de salida con el indicador 1P, grabando el primer formato en el disposi-
tivo desde otro programa o, si la lectura se efectúa mediante el nombre de
formato de registro, empleando en la descripción de registro en las DDS la
palabra clave INZRCD.
Operación WRITE
La operación WRITE graba un nuevo registro en una pantalla y es válido para
un archivo combinado o un archivo de salida. Las especificaciones de salida y
la operación EXCPT también se pueden utilizar para grabar en un archivo
WORKSTN. Consulte la publicación ILE RPG/400 Reference para obtener una
descripción completa de cada uno de estos códigos de operación.
El programa RPG accede a los dispositivos a través de los dispositivos del pro-
grama, los cuales son un mecanismo simbólico para dirigir las operaciones a
un dispositivo real. Cuando el usuario crea un archivo (utilizando las especifi-
caciones de las DDS y mandatos tales como los de creación de archivo), debe
considerar cosas tales como qué dispositivo está asociado con un dispositivo
de programa, si un archivo tiene o no un dispositivo solicitante, qué formatos
de registro habrán de utilizarse para pedir a los dispositivos que respondan a
una operación READ por nombre de archivo y cuanto tiempo habrá de esperar
una respuesta a esta operación READ. Para obtener una información deta-
llada de las opciones y requisitos para crear un archivo de múltiples disposi-
tivos, consulte el capítulo sobre archivos de pantalla en la publicación Gestión
de datos y la información sobre archivos ICF en la publicación ICF
Programming además de los manuales a los que se hace referencia en estas
dos publicaciones.
Cada módulo utiliza un archivo WORKSTN para solicitar al usuario que entre y
visualice información en la pantalla. Cada módulo, excepto el módulo principal
CLIPRIN, también utiliza un archivo lógico que muestra una vista del archivo
de base de datos maestro. Esta vista se compone únicamente de los campos
del archivo maestro que el módulo requiere para su proceso.
Nota: Cada módulo, excepto CLIPRIN, puede compilarse como un programa
libre, es decir, cada módulo puede utilizarse como un programa inde-
pendiente.
Tabla 20. Descripción de cada uno de los módulos en el ejemplo de aplicación interac-
tiva
Modulo Descripción
“Consulta de menú Un ejemplo de un programa básico de consulta de
principal” en la menús utilizando el archivo WORKSTN para
página 363 visualizar opciones de menú y aceptar entradas.
“Mantenimiento de Un ejemplo de un programa de mantenimiento que
archivos” en la permite actualizar, suprimir, añadir y visualizar
página 366 registros de clientes en un archivo maestro.
“Búsqueda por código Un ejemplo de un programa que utiliza el proceso
postal” en la del subarchivo WORKSTN para visualizar todos los
página 376 registros coincidentes para un código postal especi-
ficado.
“Búsqueda y consulta Un ejemplo de un programa que utiliza el proceso
por nombre” en la del subarchivo WORKSTN para visualizar todos los
página 383 registros coincidentes para un nombre de cliente
especificado, y permite al usuario seleccionar un
registro del subarchivo para visualizar la infor-
mación del cliente completa.
A\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
A\ NOMBRE ARCHIV: MAECLI \
A\ PROGS RELAC: CUSMNT, SCHZIP, SCHNAM \
A\ ARCHIV RELAC: MAECLIL1, MAECLIL2, MAECLIL3 (ARCH LOGICOS) \
A\ DESCRIPCION: ESTE ES EL ARCHIVO FISICO MAECLI. TIENE UN \
A\ FORMATO DE REGISTRO LLAMADO CUSREC. \
A\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
A\ ARCHIVO MAESTRO DE CLIENTES -- MAECLI
A R CUSREC
A CLIE 5 ð TEXT('NUMERO DEL CLIENTE')
A NOMB 2ð TEXT('NOMBRE DEL CLIENTE')
A DIRE1 2ð TEXT('DIRECCION DEL CLIENTE')
A DIRE2 2ð TEXT('DIRECCION DEL CLIENTE')
A CIUD 2ð TEXT('CIUDAD DEL CLIENTE')
A PROVI 2 TEXT('PROVINCIA DEL CLIENTE')
A CDP 5 ð TEXT('CODIGO POSTAL DEL CLIENTE')
A SALCD 1ð 2 TEXT('SALDO C/D')
Figura 167. DDS para el archivo maestro de base de datos MAECLI (archivo físico)
A\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
A\ ARCHIV RELAC: MENUPRIN \
A\ PROGS RELAC: CLIPRIN \
A\ DESCRIPCION: ESTE ES EL ARCHIVO DE PANTALLAS MENUPRIN. \
A\ TIENE EL FORMATO DE REGISTRO HDRSCN. \
A\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
A DSPSIZ(24 8ð \DS3)
A CHGINPDFT(CS)
A PRINT(QSYSPRT)
A INDARA
A R HDRSCN
A CAð3(ð3 'FIN DE CONSULTA')
A CAð5(ð5 'MODALIDAD DE MANTENIMIENTO')
A CAð6(ð6 'MODAL. BÚSQ. CÓDIGO POSTAL')
A CAð7(ð7 'MODALIDAD BÚSQUEDA NOMBRE')
A 2 4TIME
A DSPATR(HI)
A 2 28'CONSULTA PRINCIPAL CLIENTE'
A DSPATR(HI)
A DSPATR(RI)
Figura 168 (Parte 1 de 2). DDS para el archivo de dispositivo de pantalla MENUPRIN
A 2 7ðDATE
A EDTCDE(Y)
A DSPATR(HI)
A 6 5'Pulse una de las teclas PF'
A 6 32'siguientes.'
A 8 22'F3 Fin del Trabajo'
A 9 22'F5 Mantener Archivo del Cliente'
A 1ð 22'F6 Buscar Cliente por Código Postal'
A 11 22'F7 Buscar Cliente por Nombre'
Figura 168 (Parte 2 de 2). DDS para el archivo de dispositivo de pantalla MENUPRIN
Además de describir las constantes, los campos, los números de línea y las
posiciones horizontales para la pantalla, los formatos de registro definen
también los atributos de pantalla para estas entradas.
Nota: Normalmente los atributos de campo se definen en el archivo de refe-
rencias de campo en lugar de en las DDS para un archivo. Los atributos se
muestran en las DDS para que pueda observar cuales son.
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\ NOMBRE DEL MÓDULO: CLIPRIN \
\ ARCHIVOS RELACIONADOS: MENUPRIN (DSPF) \
\ PROGRAMAS RELACIONADOS: CUSMNT (ILE RPG PGM) \
\ SCHZIP (ILE RPG PGM) \
\ SCHNAM (ILE RPG PGM) \
\ DESCRIPCION: ESTE UN PROGRAMA DE CONSULTA PRINCIPAL DE \
\ CLIENTE. LE PIDE AL USUARIO QUE ELIJA UNA \
\ DE LAS ACCIONES SIGUIENTES: \
\ 1.MANTENER (AÑADIR, ACTUALIZAR, SUPRIMIR Y \
\ VISUALIZAR EL REGISTRO DE CLIENTE. \
\ 2.BUSCAR REGISTRO CLIENTE POR CODIGO POSTAL. \
\ 3.BUSCAR REGISTRO DE CLIENTE POR NOMBRE. \
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
FMENUPRIN CF E WORKSTN
C EXFMT HDRSCN
C\
à ð
22:3ð:ð5 CONSULTA PRINCIPAL CLIENTE 23/ð9/94
F3 Fin de Trabajo
F5 Mantener Archivo Cliente
F6 Buscar Cliente por Código Postal
F7 Buscar Cliente por Nombre
á ñ
Figura 170. Pantalla de solicitud Consulta principal cliente
Mantenimiento de archivos
A continuación se muestra un programa de mantenimiento utilizando el archivo
WORKSTN. Este programa le permite añadir, suprimir, actualizar y visualizar
registros del archivo maestro de clientes.
A\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
A\ NOMBRE ARCHIV: MAECLIL1 \
A\ PROGS RELAC: CUSMNT \
A\ ARCHIVO RELAC: MAECLI (ARCHIVO FISICO) \
A\ DESCRIPCION: ESTE ES EL ARCHIVO LOGICO MAECLIL1. \
A\ CONTIENE EL FORMATO DE REGISTRO CMLREC1. \
A\ VISTA LOGICA DEL ARCHIVO MAESTRO DE CLIENTES \
A\ (MAECLI) POR NUMERO DE CLIENTE (CLIE) \
A\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
A R CMLREC1 PFILE(MAECLI)
A CLIE
A NOMB
A DIRE1
A DIRE2
A CIUD
A PROVI
A CDP
A K CLIE
Las DDS para el archivo de base de datos utilizado por este programa des-
criben un formato de registro: CMLREC1. Se describe cada campo del
formato de registro y el campo CLIE se identifica como el campo de clave para
el formato de registro.
A\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
A\ NOMBRE ARCHIV: MENUMNT \
A\ PROGS RELAC: MNTCLIT \
A\ ARCHIV RELAC: MAECLIL1 (ARCHIVO LOGICO) \
A\ DESCRIPCION: ESTE ES EL ARCHIVO DE PANTALLA MENUMNT. \
A\ TIENE 3 FORMATOS DE REGISTRO. \
A\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
A REF(CUSMSTL1)
A CHGINPDFT(CS)
A PRINT(QSYSPRT)
A INDARA
Figura 172 (Parte 1 de 3). DDS para el archivo de dispositivo de pantalla MENUMNT
A R HDRSCN
A TEXT('SOLICITUD NÚMERO CLIENTE')
A CAð3(ð3 'FIN DE MANTENIMIENTO')
A CAð5(ð5 'MODALIDAD ADICIÓN')
A CAð6(ð6 'MODALIDAD ACTUALIZACIÓN')
A CAð7(ð7 'MODALIDAD SUPRESIÓN')
A CAð8(ð8 'MODALIDAD VISUALIZACIÓN')
A MODE 8A O 1 4DSPATR(HI)
A 1 13'MODALIDAD'
A DSPATR(HI)
A 2 4TIME
A DSPATR(HI)
A 2 28'MANTENIMIENTO ARCHIVO CLIENTE'
A DSPATR(HI RI)
A 2 7ðDATE
A EDTCDE(Y)
A DSPATR(HI)
A CUST R Y I 1ð 25DSPATR(CS)
A CHECK(RZ)
A 51 ERRMSG('CLIENTE YA ENTRADO +
A FILE' 51)
A 52 ERRMSG('CLIENTE NO EN ARCHIVO' +
A 52)
A 1ð 33'<--Entre número de cliente'
A DSPATR(HI)
A 23 4'F3 Fin de Trabajo'
A 23 21'F5 Añadir'
A 23 34'F6 Actualizar'
A 23 5ð'F7 Suprimir'
A 23 66'F8 Visualizar'
A R CSTINQ
A TEXT('VISUALIZAR INF. CLIENTE')
A CA12(12 'PANTALLA ANTERIOR')
A MODE 8A O 1 4DSPATR(HI)
A 1 13'MODALIDAD'
A DSPATR(HI)
A 2 4TIME
A DSPATR(HI)
A 2 28'MANTENIMIENTO ARCHIVO CLIENTE'
A DSPATR(HI)
A DSPATR(RI)
A 2 7ðDATE
A EDTCDE(Y)
A DSPATR(HI)
A 4 14'Cliente:'
A DSPATR(HI)
A DSPATR(UL)
Figura 172 (Parte 2 de 3). DDS para el archivo de dispositivo de pantalla MENUMNT
A CUST R O 4 25DSPATR(HI)
A NAME R B 6 25DSPATR(CS)
A ð4 DSPATR(PR)
A ADDR1 R B 7 25DSPATR(CS)
A ð4 DSPATR(PR)
A ADDR2 R B 8 25DSPATR(CS)
A ð4 DSPATR(PR)
A CITY R B 9 25DSPATR(CS)
A ð4 DSPATR(PR)
A STATE R B 1ð 25DSPATR(CS)
A ð4 DSPATR(PR)
A ZIP R B 1ð 4ðDSPATR(CS)
A EDTCDE(Z)
A ð4 DSPATR(PR)
A 23 2'F12 Cancelar'
A MODE1 8 O 23 13
A R CSTBLD TEXT('AÑADIR REGISTRO CLIENTE')
A CA12(12 'PANTALLA ANTERIOR')
A MODE 8 O 1 4DSPATR(HI)
A 1 13'MODALIDAD' DSPATR(HI)
A 2 4TIME
A DSPATR(HI)
A 2 28'MANTENIMIENTO ARCHIVO CLIENTE'
A DSPATR(HI RI)
A 2 7ðDATE
A EDTCDE(Y)
A DSPATR(HI)
A 4 14'Cliente:' DSPATR(HI UL)
A CUST R O 4 25DSPATR(HI)
A 6 2ð'Nombre' DSPATR(HI)
A NAME R I 6 25
A 7 17'Dirección' DSPATR(HI)
A ADDR1 R I 7 25
A 8 17'Dirección' DSPATR(HI)
A ADDR2 R I 8 25
A 9 2ð'Ciudad' DSPATR(HI)
A CITY R I 9 25
A 1ð 19'Provincia' DSPATR(HI)
A STATE R I 1ð 25
A 1ð 36'Código' DSPATR(HI)
A ZIP R Y I 1ð 4ð
A 23 2'F12 Cancelar adición'
Figura 172 (Parte 3 de 3). DDS para el archivo de dispositivo de pantalla MENUMNT
Las DDS del archivo del dispositivo de pantalla MENUMNT contienen tres
formatos de registro: HDRSCN, CSTINQ y CSTBLD. El registro HDRSCN soli-
cita el número de cliente y la modalidad de proceso. El registro CSTINQ se
utiliza para las modalidades de Actualización, Supresión y Visualización. Los
campos se definen como entrada/salida (B en la posición 38). Los campos
están protegidos cuando se selecciona la modalidad de Visualización o Supre-
sión (DSPATR(PR)). El registro CSTBLDT sólo proporciona campos de
entrada para un nuevo registro (I en la posición 38).
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\ NOMBRE PROG: MNTCLIT \
\ ARCHIV RELAC: MAECLIL1 (LF) \
\ MNTMENU (DSPF) \
\ DESCRIPCION: ESTE PROGRAMA MUESTRA UN PROGRAMA DE \
\ MANTENIMIENTO DE MAESTRO DE CLIENTES \
\ UTILIZANDO EL ARCHIVO WRKSTN. ESTE PROGRAMA \
\ PERMITE AL USUARIO AÑADIR, ACTUALIZAR \
\ SUPRIMIR Y VISUALIZAR REGISTROS DE CLIENTES. \
\ PARA SALIR DEL PROGRAMA SE HA DE PULSAR FP3. \
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
FCUSMSTL1 UF A E K DISK
FMNTMENU CF E WORKSTN
C CSTKEY KLIST
C KFLD CUST
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\ PRINCIPAL \
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\ SUBRUTINA - ADDSUB \
\ PROPOSITO - AÑADIR NUEVO CLIENTE AL ARCHIVO \
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
C ADDSUB BEGSR
C CSTKEY CHAIN CMLREC1 5ð
C IF NOT \IN5ð
C MOVE \ON \IN51
C ELSE
C MOVE \OFF \IN51
C MOVE \BLANK NAME
C MOVE \BLANK ADDR1
C MOVE \BLANK ADDR2
C MOVE \BLANK CITY
C MOVE \BLANK STATE
C Z-ADD \ZERO ZIP
C EXFMT CSTBLD
C IF NOT \IN12
C WRITE CMLREC1
C ENDIF
C ENDIF
C ENDSR
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\ SUBRUTINA - UPDSUB \
\ PROPOSITO - ACTUALIZAR REGISTRO MAESTRO DE CLIENTES \
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
C UPDSUB BEGSR
C MOVE \OFF \INð4
C CSTKEY CHAIN CMLREC1 52
C IF NOT \IN52
C EXFMT CSTINQ
C IF NOT \IN12
C UPDATE CUSMSTL1
C ELSE
C UNLOCK CUSMSTL1
C ENDIF
C ENDIF
C ENDSR
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\ SUBRUTINA - DELSUB \
\ PROPOSITO - SUPRIMIR REGISTRO MAESTRO DE CLIENTES \
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
C DELSUB BEGSR
C MOVE \ON \INð4
C CSTKEY CHAIN CMLREC1 52
C IF NOT \IN52
C EXFMT CSTINQ
C IF NOT \IN12
C DELETE CMLREC1
C ELSE
C UNLOCK CUSMSTL1
C ENDIF
C ENDIF
C ENDSR
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\ SUBRUTINA - INQSUB \
\ PROPOSITO - VISUALIZAR REGISTRO MAESTRO DE CLIENTES \
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
C INQSUB BEGSR
C MOVE \ON \INð4
C CSTKEY CHAIN CMLREC1 52
C IF NOT \IN52
C EXFMT CSTINQ
C UNLOCK MAECLIL1
C ENDIF
C ENDSR
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\ SUBRUTINA - SETMOD \
\ PROPOSITO - ESTABLECER MODALIDAD DE MANTENIMIENTO \
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
C SETMOD BEGSR
C SELECT
C WHEN \INð5
C MOVE 'ADICION ' MODA
C WHEN \INð6
C MOVE 'ACTUALIZACION' MODA
C WHEN \INð7
C MOVE 'SUPRESION' MODA
C WHEN \INð8
C MOVE 'VISUALIZACION' MODA
C ENDSL
C\
C MOVE MODE MODA1
C ENDSR
à MODALIDAD VISUALIZACION
ð
22:3ð:21 MANTENIMIENTO ARCHIVO CLIENTES 23/ð9/94
á ñ
Figura 174. Pantalla de solicitud en modalidad de visualización 'Mantenimiento archivo
clientes'
à MODALIDAD VISUALIZACION
ð
22:31:ð6 MANTENIMIENTO ARCHIVO CLIENTES 23/ð9/94
Cliente: ðððð7
Miguel García
Entenza, 16
Suite 17ð2
Barcelona
BCN ð8ð15
á ñ
Figura 175. Pantalla en modalidad de visualización 'Mantenimiento archivo clientes'
à MODALIDAD ADICION
ð
22:31:43 MANTENIMIENTO ARCHIVO CLIENTES 23/ð9/94
á ñ
Figura 176. Pantalla de solicitud en modalidad de adición 'Mantenimiento archivo clientes'
à MODALIDAD ADICION
ð
22:32:ð4 MANTENIMIENTO ARCHIVO CLIENTES 23/ð9/94
Cliente: ððð12
á ñ
Figura 177. Pantalla de solicitud en modalidad de adición 'Mantenimiento archivo clientes'
à MODALIDAD SUPRESION
ð
22:32:55 MANTENIMIENTO ARCHIVO CLIENTES 23/ð9/94
á ñ
Figura 178. Pantalla de solicitud en modalidad de supresión 'Mantenimiento archivo clientes'
à MODALIDAD ACTUALIZACION
ð
22:33:17 MANTENIMIENTO ARCHIVO CLIENTES 23/ð9/94
á ñ
Figura 179. Pantalla de solicitud en modalidad de actualización 'Mantenimiento archivo
clientes'
A\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
A\ NOMBRE ARCHIV: MAECLIL2 \
A\ PROGS RELAC: BUSCOD \
A\ ARCHIV RELAC: MAECLI (ARCHIVO FISICO) \
A\ DESCRIPCION: ESTE ES EL ARCHIVO LOGICO MAECLI2. \
A\ CONTIENE EL FORMATO DE REGISTRO CMLREC2. \
A\ VISTA LOGICA DEL ARCHIVO MAESTRO DE CLIENTES \
A\ (MAECLI) POR CODIGO POSTAL DE CLIENTE (CDP) \
A\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
A R CMLREC2 PFILE(MAECLI)
A CDP
A NOMB
A SALCD
A K CDP
Las DDS para el archivo de base de datos utilizado por este programa des-
criben un formato de registro CMLREC2. El archivo lógico MAECLIL2 especifi-
cado por distrito postal se basa en el archivo físico MAECLI, tal como indica la
palabra clave PFILE. El formato de registro generado por el archivo lógico
incluirá solamente los campos especificados en el archivo lógico DDS. Se
excluirán todos los demás campos.
A\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
A\ NOMBRE ARCHIV: MENUBCOD \
A\ PROGS RELAC: BUSCOD \
A\ ARCHIV RELAC: MAECLIL2 (ARCHIVO LOGICO) \
A\ DESCRIPCIÓN: ESTE ES EL ARCHIVO DE PANTALLAS MENUBCOD. \
A\ TIENE 6 FORMATOS DE REGISTRO. \
A\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
A REF(CUSMSTL2)
A CHGINPDFT(CS)
A PRINT(QSYSPRT)
A INDARA
A CAð3(ð3 'FIN DEL TRABAJO')
Figura 181 (Parte 1 de 3). DDS para el archivo de dispositivo de pantalla MENUBCOD
A R HEAD
A OVERLAY
A 2 4TIME
A DSPATR(HI)
A 2 28'BUSCAR CLIENTE POR CÓDIGO'
A DSPATR(HI RI)
A 2 7ðDATE
A EDTCDE(Y)
A DSPATR(HI)
A R FOOT1
A 23 6'INTRO - Continuar'
A DSPATR(HI)
A 23 29'F3 - Fin del Trabajo'
A DSPATR(HI)
A R FOOT2
A 23 6'INTRO - Continuar'
A DSPATR(HI)
A 23 29'F3 - Fin del Trabajo'
A DSPATR(HI)
A 23 47'F4 - REINICIAR CÓDIGO POSTAL'
A DSPATR(HI)
A R PROMPT
A OVERLAY
A 4 4'Entre código postal'
A DSPATR(HI)
A ZIP R Y I 4 19DSPATR(CS)
A CHECK(RZ)
A 61 ERRMSG('NO SE ENCONTRÓ CÓD. POSTAL' +
A 61)
A R SUBFILE SFL
A NAME R 9 4
A ARBAL R 9 27EDTCDE(J)
A R SUBCTL SFLCTL(SUBFILE)
A 55 SFLCLR
A N55 SFLDSPCTL
A N55 SFLDSP
A SFLSIZ(13)
A SFLPAG(13)
A ROLLUP(95 'GIRO HACIA ARRIBA')
A OVERLAY
A CAð4(ð4 'REINICIAR CÓDIGO POSTAL')
A 4 4'Código postal'
Figura 181 (Parte 2 de 3). DDS para el archivo de dispositivo de pantalla MENUBCOD
A ZIP R O 4 14DSPATR(HI)
A 7 4'Nombre cliente'
A DSPATR(HI UL)
A 7 27'Saldo C/D'
A DSPATR(HI UL)
Figura 181 (Parte 3 de 3). DDS para el archivo de dispositivo de pantalla MENUBCOD
El formato del registro SUBFILE debe estar definido inmediatamente antes del
formato de registro de control de subarchivo SUBCTL. El formato de registro
de subarchivo, que está definido mediante la palabra clave SFL, describe cada
campo del registro y especifica la ubicación donde va a aparecer el primer
registro en la pantalla (aquí, en la línea 9).
El formato del registro de control del subarchivo contiene las siguientes pala-
bras clave únicas:
SFLCTL identifica este formato como formato de registro de control y da un
nombre al formato de registro de subarchivo asociado.
SFLCLR describe cuándo van a borrarse los registros existentes del subar-
chivo (cuando está activado el indicador 55). Se necesita esta palabra
clave para pantallas adicionales.
SFLDSPCTL indica cuándo va a visualizarse el formato del registro de
control del subarchivo (cuando está desactivado el indicador 55).
SFLDSP indica cuando va a visualizarse el subarchivo (cuando está desac-
tivado el indicador 55).
SFLSIZ especifica el tamaño total del subarchivo. En este ejemplo, el
tamaño del subarchivo es de 13 registros que se visualizan en las líneas 9
a 21.
SFLPAG define el número de registros de una página. En este ejemplo, el
tamaño de la página es el mismo que el tamaño del subarchivo.
ROLLUP indica que el indicador 95 se activa en el programa cuando se
utiliza la función de giro hacia arriba.
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\ NOMBRE PROG: BUSCOD \
\ ARCHIV RELAC: MAECLIL2 (ARCHIVO LOGICO) \
\ MENUBCOD (ARCHIVO DE ESTACION DE TRABAJO) \
\ DESCRIPCION: ESTE PROGRAMA MUESTRA UN PROGRAMA DE BUSQUEDA \
\ DE MAESTRO DE CLIENTES MEDIANTE EL PROCESO \
\ DE SUBARCHIVOS DE ESTACION DE TRABAJO. \
\ ESTE PROGRAMA SOLICITA AL USUARIO EL CODIGO \
\ POSTAL Y VISUALIZA EL REGISTRO DE MAESTRO DE \
\ CLIENTES POR CODIGO POSTAL. PUEDE UTILIZAR LA \
\ TECLA DE GIRO ARRIBA PARA VER OTRA PAGINA. \
\ FP3 SE UTILIZA PARA SALIR DEL PROGRAMA. \
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
FMAECLIL2 IF E K DISK
FMENUBCOD CF E WORKSTN SFILE(SUBFILE:RECNUM)
C CSTKEY KLIST
C KFLD ZIP
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\ PRINCIPAL \
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
C WRITE FOOT1
C WRITE HEAD
C EXFMT PROMPT
C\
C DOW NOT \INð3
C MOVE \OFF \IN61
C CSTKEY SETLL CMLREC2 2ð
C IF NOT \IN2ð
C MOVE \ON \IN61
C ELSE
C EXSR SFLPRC
C END
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\ SUBRUTINA - SFLPRC \
\ PROPOSITO - PROCESAR SUBARCHIVO Y VISUALIZAR \
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
C SFLPRC BEGSR
C NXTPAG TAG
C EXSR SFLCLR
C EXSR SFLFIL
C SAMPAG TAG
C WRITE FOOT2
C WRITE HEAD
C EXFMT SUBCTL
C IF \IN95
C IF NOT \IN71
C GOTO NXTPAG
C ELSE
C GOTO SAMPAG
C ENDIF
C ENDIF
C ENDSR
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\ SUBRUTINA - SFLFIL \
\ PROPOSITO - COMPLETAR SUBARCHIVO \
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
C SFLFIL BEGSR
C DOW NOT \IN21
C ZIP READE CMLREC2 71
C IF \IN71
C MOVE \ON \IN21
C ELSE
C ADD 1 RECNUM
C WRITE SUBFILE 21
C ENDIF
C ENDDO
C ENDSR
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\ SUBRUTINA - SFLCLR \
\ PROPOSITO - BORRAR REGISTROS DE SUBARCHIVO \
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
C SFLCLR BEGSR
C MOVE \ON \IN55
C WRITE SUBCTL
C MOVE \OFF \IN55
C MOVE \OFF \IN21
C Z-ADD \ZERO RECNUM 5 ð
C ENDSR
à ð
22:34:38 BUSQUEDA DE CLIENTE POR CóD. POSTAL 23/ð9/94
á ñ
Figura 183. Pantalla de solicitud 'Búsqueda de cliente por cód. postal'
à ð
22:34:45 BUSQUEDA DE CLIENTE POR CÓD. POSTAL 23/ð9/94
á ñ
Figura 184. Pantalla 'Búsqueda de cliente por cód. postal'
A\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
A\ NOMBRE ARCHIV: MAECLIL3 \
A\ PROGS RELAC: NOMBUS \
A\ ARCHIV RELAC: MAECLI \
A\ DESCRIPCION: ESTE ES EL ARCHIVO LOGICO MAECLI3. TIENE UN \
A\ FORMATO DE REGISTRO LLAMADO CUSREC. \
A\ VISTA LOGICA DEL ARCHIVO MAESTRO DE CLIENTES \
A\ (MAECLI) POR NOMBRE (NOMBRE) \
A\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
A R CUSREC PFILE(MAECLI)
A K NOMB
A\
A\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
A\ NOTE: PUESTO QUE EL FORMATO DE REGISTRO DEL ARCHIVO FISICO \
A\ (MAECLI) TIENE EL MISMO NOMBRE DE FORMATO DE REGISTRO, \
A\ NO SE NECESITA EL LISTADO DE CAMPOS EN ESTE ARCHIVO \
A\ DDS. \
A\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
Las DDS para el archivo de base de datos utilizado en este programa definen
el formato de registro que lleva por nombre CUSREC e identifican el campo
NAME como campo de clave.
A\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
A\ NOMBRE ARCHIV: MENUBNOM \
A\ PROGS RELAC: NOMBUS \
A\ ARCHIV RELAC: MAECLIL3 (ARCHIVO LOGICO) \
A\ DESCRIPCIÓN: ESTE ES EL ARCHIVO DE PANTALLA MENUBNOM. \
A\ TIENE 7 FORMATOS DE REGISTRO. \
A\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
A REF(CUSMSTL3)
A CHGINPDFT(CS)
A PRINT(QSYSPRT)
A INDARA
A CAð3(ð3 'FIN DEL TRABAJO')
A R HEAD
A OVERLAY
A 2 4TIME
A DSPATR(HI)
A 2 25'BÚSQ. Y CONSULTA CLIENTE POR NOMBRE'
A DSPATR(HI UL)
A 2 7ðDATE
A EDTCDE(Y)
A DSPATR(HI)
A R FOOT1
A 23 6'INTRO - Continuar'
A DSPATR(HI)
A 23 29'F3 - Fin del Trabajo'
A DSPATR(HI)
A R FOOT2
A 23 6'INTRO - Continuar'
A DSPATR(HI)
A 23 29'F3 - Fin del Trabajo'
A DSPATR(HI)
A 23 47'F4 - Reiniciar nombre'
A DSPATR(HI)
A R PROMPT
A OVERLAY
A 5 4'Entre nombre de búsqueda'
A DSPATR(HI)
A SRCNAM R I 5 23REFFLD(NOM MAECLIL3)
A DSPATR(CS)
Figura 186 (Parte 1 de 2). DDS para el archivo de dispositivo de pantalla MENUBNOM
A R SUBFILE SFL
A CHANGE(99 'CAMPO MODIFICADO')
A SEL 1A B 9 8DSPATR(CS)
A VALUES(' ' 'X')
A ZIP R O 9 54
A CUST R O 9 43
A NAME R O 9 17
A R SUBCTL SFLCTL(SUBFILE)
A SFLSIZ(ðð13)
A SFLPAG(ðð13)
A 55 SFLCLR
A N55 SFLDSPCTL
A N55 SFLDSP
A ROLLUP(95 'GIRO HACIA ARRIBA')
A OVERLAY
A CAð4(ð4 'REINICAR NOMBRE BÚSQUEDA')
A 5 4'Nombre Búsqueda'
A SRCNAM R O 5 17REFFLD(NAME CUSMSTL3)
A DSPATR(HI)
A 7 6'Seleccionar'
A DSPATR(HI)
A 8 6' "X" Nombre cliente '
A DSPATR(HI)
A DSPATR(UL)
A 8 42' Número Código postal'
A DSPATR(HI)
A DSPATR(UL)
A R CUSDSP
A OVERLAY
A CAð4(ð4 'REINICIAR CÓD. POSTAL')
A 6 25'Cliente'
A CUST 5S ðO 6 35DSPATR(HI)
A 8 25'Nombre'
A NAME 2ðA O 8 35DSPATR(HI)
A 1ð 25'Dirección'
A ADDR1 2ðA O 1ð 35DSPATR(HI)
A ADDR2 2ðA O 11 35DSPATR(HI)
A 13 25'Ciudad'
A CITY 2ðA O 13 35DSPATR(HI)
A 15 25'Provincia'
A STATE 2A O 15 35DSPATR(HI)
A 15 41'Código postal'
A ZIP 5S ðO 15 5ðDSPATR(HI)
A 17 25'Saldo CC'
A ARBAL 1ðY 2O 17 42DSPATR(HI)
A EDTCDE(J)
Figura 186 (Parte 2 de 2). DDS para el archivo de dispositivo de pantalla MENUBNOM
El formato del registro SUBFILE debe estar definido inmediatamente antes del
formato de registro de control de subarchivo SUBCTL. El formato de registro
de subarchivo definido con la palabra clave SFL describe cada campo del
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\ NOMBRE PROG: NOMBUS \
\ ARCHIV RELAC: MAECLIL3 (ARCHIVO LOGICO) \
\ MENUBNOM (ARCHIVO DE ESTACION TRABAJO) \
\ DESCRIPCION: ESTE PROGRAMA MUESTRA UN PROGRAMA DE BUSQUEDA \
\ DE MAESTRO DE CLIENTES MEDIANTE UN PROCESO DE \
\ SUBARCHIVOS DE ESTACION DE TRABAJO. ESTE \
\ PROGRAMA SOLICITA AL USUARIO EL NOMBRE DEL \
\ CLIENTE Y LO UTILIZA PARA SITUAR EN EL ARCHIVO\
\ MAECLIL3 MEDIANTE LA OPERACION SETLL. A \
\ CONTINUACION VISUALIZA LOS REGISTROS \
\ UTILIZANDO SUBARCHIVOS. PARA RELLENAR OTRA \
\ PAGINA, PULSE LA TECLA GIRO ARRIBA. \
\ PARA VISUALIZAR DETALLES DEL CLIENTE, ENTRE \
\ 'X' JUNTO A ESE CLIENTE Y PULSE INTRO. \
\ PARA SALIR DEL PROGRAMA, PULSE FP3. \
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
FMAECLIL3 IF E K DISK
FMENUBNOM CF E WORKSTN SFILE(SUBFILE:RECNUM)
C CSTKEY KLIST
C KFLD SRCNAM
C ZIPKEY KLIST
C KFLD NAME
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\ PRINCIPAL \
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
C WRITE FOOT1
C WRITE HEAD
C EXFMT PROMPT
C DOW NOT \INð3
C CSTKEY SETLL CUSREC
C EXSR SFLPRC
C EXSR SFLCHG
C IF (NOT \INð3) AND (NOT \INð4)
C WRITE FOOT1
C WRITE HEAD
C EXFMT PROMPT
C ENDIF
C ENDDO
C\
C SETON LR
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\ SUBRUTINA - SFLPRC \
\ PROPOSITO - PROCESAR SUBARCHIVO Y VISUALIZAR \
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
C SFLPRC BEGSR
C NXTPAG TAG
C EXSR SFLCLR
C EXSR SFLFIL
C SAMPAG TAG
C WRITE FOOT2
C WRITE HEAD
C EXFMT SUBCTL
C IF \IN95
C IF NOT \IN71
C GOTO NXTPAG
C ELSE
C GOTO SAMPAG
C ENDIF
C ENDIF
C ENDSR
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\ SUBRUTINA - SFLFIL \
\ PROPOSITO - COMPLETAR SUBARCHIVO \
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
C SFLFIL BEGSR
C DOW NOT \IN21
C READ CUSREC 71
C IF \IN71
C MOVE \ON \IN21
C ELSE
C ADD 1 RECNUM
C MOVE \BLANK SEL
C WRITE SUBFILE 21
C ENDIF
C ENDDO
C ENDSR
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\ SUBRUTINA - SFLCLR \
\ PROPOSITO - BORRAR REGISTROS DE SUBARCHIVO \
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
C SFLCLR BEGSR
C MOVE \ON \IN55
C WRITE SUBCTL
C MOVE \OFF \IN55
C MOVE \OFF \IN21
C Z-ADD \ZERO RECNUM 5 ð
C ENDSR
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\ SUBRUTINA - SFLCHG \
\ PROPOSITO - REGISTRO DE CLIENTE SELECCIONADO \
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
C SFLCHG BEGSR
C READC SUBFILE 98
C IF NOT \IN98
C ZIPKEY CHAIN CUSREC 71
C EXFMT CUSDSP
C ENDIF
C ENDSR
à ð
22:35:26 BÚSQUEDA DE CLIENTE POR NOMBRE 3ð/9/94
á ñ
Figura 188. Pantalla de solicitud 'Búsqueda y consulta de cliente por nombre'
à ð
22:35:43 BÚSQUEDA DE CLIENTE POR NOMBRE 3ð/9/94
Seleccione
"X" Nombre de Cliente Número Código Postal
X JUAN PEREZ ððð12 ð8ð19
JUAN PEREZ ðð2ð9 ð8ð16
á ñ
Figura 189. Pantalla de información 'Búsqueda y consulta de cliente por nombre'
à ð
23:39:48 BÚSQUEDA DE CLIENTE POR NOMBRE 3ð/9/94
Cliente ððð12
Ciudad BARCELONA
á ñ
Figura 190. Pantalla de información detallada 'Búsqueda y consulta de cliente por nombre'
Compilación
1. En RPG IV no existe ninguna dependencia entre DATEDIT y DECEDIT en la
especificación de control.
2. Con relación a los mandatos de crear de ILE RPG/400 (CRTBNDRPG y
CRTRPGMOD):
Si especifica CVTOPT(*NONE) en ILE RPG/400, todos todos los campos
descritos externamente que sean de un tipo o que tengan atributos que
RPG no de soporte (por ejemplo, carácter de longitud variable y gráfico de
longitud variable) se ignorarán.Esto significa también que los campos que
sean de tipo gráfico, de fecha, hora e indicación de la hora se llevarán al
programa con el mismo tipo que se especifique en la descripción externa.
El parámetro IGNDECERR del mandato CRTRPGPGM se ha sustituido por
el parámetro FIXNBR de los mandatos de crear de ILE RPG/400.
Existe un nuevo parámetro, TRUNCNBR, para controlar si se permite el
desbordamiento numérico.
No existe ninguna función ni mandato de generación automática de
informes en el RPG IV.
No es posible solicitar un listado MI desde el compilador.
3. En un listado del compilador, los números de línea comienzan por 1 y
aumentan 1 en cada línea de las especificaciones fuente o generadas. Los ID
de fuente son numéricos, es decir, ya no existen más números de línea
AA000100 para los miembros /COPY o las DDS ampliadas.
4. RPG IV precisa que todas las directivas del compilador aparezcan antes de los
datos de tiempo de compilación, incluida /TITLE. Cuando RPG IV encuentra
una directiva /TITLE, la trata como si fueran datos. (El RPG III trata las especi-
ficaciones /TITLE como directivas del compilador en cualquier punto del
fuente.)
La Ayuda para la conversión eliminará las especificaciones /TITLE que
encuentre en los datos en tiempo de compilación.
5. ILE RPG/400 es más riguroso al detectar solapamientos de campos en las
estructuras de datos. En algunas operaciones de cálculo con operandos
solapados ILE RPG/400 emite un mensaje mientras que el compilador OPM
no.
6. En ILE RPG/400 no es posible utilizar la palabra NOT como nombre de
variable. NOT es una palabra especial que se utiliza como operador en expre-
siones.
| 7. Durante la compilación, el fuente se lee utilizando el CCSID del archivo fuente
| principal, mientras que para OPM RPG el fuente se lee utilizando el CCSID del
| trabajo.
E/S
1. En ILE RPG/400 se puede leer un registro de un archivo abierto para actua-
lizar, o uno creado o alterado temporalmente con SHARE(*YES), y a conti-
nuación actualizar este registro bloqueado en otro programa que haya abierto
el mismo archivo para actualizar.
2. No se puede modificar el indicador MR con operaciones MOVE o SETON. (El
RPG III sólo impide la utilización de SETON con MR.)
3. La entrada de Tipo de archivo de las especificaciones de archivo ya no condi-
ciona el tipo de operaciones de E/S que deben estar presentes en las especifi-
caciones de cálculo.
Por ejemplo, en RPG III, si define un archivo como un archivo de actualización,
entonces debe haber una operación UPDAT en el programa. Este ya no es el
caso en RPG IV. Sin embargo, la definición de archivos todavía debe ser
coherente con las operaciones de E/S presentes en el programa. Por lo tanto,
si tiene una operación UPDATE en el fuente, el archivo debe estar definido
como un archivo de actualización.
4. ILE RPG/400 permite la agrupación por bloques de registros incluso cuando se
especifica la palabra clave COMMIT en la especificación de descripción de
archivo.
5. En RPG IV, un archivo abierto para actualización se abrirá también con posi-
bilidad de supresión. No precisa ninguna operación DELETE para que tenga
posibilidad de supresión.
6. En RPG IV, no tiene que codificar un número real para el número de disposi-
tivos que un archivo de dispositivos múltiples utilizará. Si especifica
MAXDEV(*FILE) en una especificación de descripción de archivos, entonces el
número de las áreas de salvar que se creen para SAVEDS y SAVEIND se
basa en el número de dispositivos que puede manejar el archivo. (Las pala-
bras clave SAVEDS, SAVEIND y MAXDEV de la especificación de descripción
de archivos de RPG IV corresponde a las opciones SAVDS, IND y NUM res-
pectivamente de una línea de continuación de la especificación de descripción
de archivos del RPG III.)
En ILE RPG/400, el número total de dispositivos de programa que puede
adquirir el programa no puede ser distinto al número máximo de dispositivos
definido en el achivo de dispositivo. OPM RPG/400 lo permite a través de la
opción NUM.
La ayuda para la conversión supone que el código fuente está libre de errores de
compilación. Si así es, entonces convertirá de forma satisfactoria la mayor parte
del código fuente. En algunos casos, puede haber una pequeña porción del código
que deberá convertir manualmente. Algunos de estos casos son identificados por
la Ayuda para la Conversión. Otros no se detectan hasta que el usuario intente
compilar el fuente convertido. Para ver cuáles puede identificar la ayuda para la
conversión, puede ejecutar la ayuda para la conversión utilizando el miembro no
convertido como entrada, y especificar un informe de conversión pero ningún
miembro de salida. Para obtener información sobre los tipos de codificación que
no pueden convertirse, consulte “Resolución de problemas de conversión” en la
página 423.
RPG36 No N/A
RPT36 No N/A
SQLRPG Sí SQLRPGLE
Cualquier otro tipo No N/A
Para obtener más información sobre cómo convertir miembros fuente del gene-
rador automático de informes, consulte el apartado “Conversión de miembros
fuente del generador automático de informes” en la página 413.
12 8ð 2ð
┌───────────┬──────────────────────────────────────────┬─────────────┐
│ Núm. Sec. │ Código │ Comentarios │
└───────────┴──────────────────────────────────────────┴─────────────┘
Si el archivo fuente convertido tiene una longitud de registro menor que 92 carac-
teres, entonces se emitirá un mensaje de error y se detendrá la conversión. El
motivo es que la longitud de registro no tiene la longitud suficiente para contener
los 80 caracteres permitidos para el código fuente y por tanto es probable que se
pierdan algunos códigos.
Apéndice B. Utilización del RPG III como ayuda para la conversión al RPG IV 403
Conversión del código fuente
Para convertir el código fuente al formato RPG IV, siga estos pasos generales:
1. Si utiliza un área de datos como una especificación de control, debe crear una
nueva área de datos en el formato RPG IV. Consulte el capítulo sobre especi-
ficaciones de control en la publicación ILE RPG/400 Reference para obtener
más información.
2. Cree un archivo de anotaciones cronológicas, si es necesario.
A menos que especifique LOGFILE(*NONE), debe existir un archivo de ano-
taciones cronológicas al que acceda la Ayuda para la Conversión. Si no tiene
ninguno, puede crearlo utilizando el mandato CRTDUPOBJ. Para obtener más
información, consulte los apartados “El archivo de anotaciones cronológicas”
en la página 403 y “Utilización del archivo de anotaciones cronológicas” en la
página 421.
Apéndice B. Utilización del RPG III como ayuda para la conversión al RPG IV 405
Conversión del código fuente
El mandato CVTRPGSRC
Para convertir el fuente RPG III o RPG/400 al nuevo formato RPG IV, utilice el
mandato CVTRPGSRC para arrancar la ayuda para la conversión. La Tabla 22
muestra los parámetros del mandato en base a su función.
Tabla 22. Parámetros de CVTRPGSRC y sus valores por omisión agrupados por función
Identificación del programa
FROMFILE Identifica el nombre de biblioteca y archivo del fuente RPG que
se va a convertir.
FROMMBR Identifica qué miembros fuente se van a convertir.
TOFILE(*LIBL/QRPGLESRC) Identifica el nombre de biblioteca y archivo de la salida
convertida.
TOMBR(*FROMMBR) Identifica los nombres de los miembros de archivo del fuente
convertido.
Proceso de conversión
TOMBR Si se especifica *NONE, entonces no se salva ningún miembro de
archivo.
EXPCPY(*NO) Determina si se incluyen las sentencias /COPY en la salida
convertida.
INSRTPL(*NO) Indica si las plantillas de especificaciones se han de incluir en la
salida convertida.
Resultado de conversión
CVTRPT(*YES) Determina si se genera un informe de conversión.
SECLVL(*NO) Determina si se incluye texto de mensaje de segundo nivel.
LOGFILE(*LIBL/QRNCVTLG) Identifica el archivo de anotaciones cronológicas para el informe
de seguimiento.
LOGMBR(*FIRST) Identifica qué miembro del archivo de anotaciones cronológicas se
ha de utilizar para el informe de seguimiento.
┌─\LIBL/─────────────┐
55──CVTRPGSRC──FROMFILE──(──┼────────────────────┼────nombre-archivo-fuente────)───────────────────────────────────────5
├─\CURLIB/───────────┤
└─nombre-biblioteca/─┘
┌─nombre-miembro-archivo-fuente─┐
5──FROMMBR──(──┼─\ALL──────────────────────────┼──)────────────────────────────────────────────────────────────────────5
└─nombre-miembro-genérico\──────┘
5──┬────────────────────────────────────────────────────────────────────┬──────────────────────────────────────────────5
│ ┌─\LIBL/────────────┐ ┌─QRPGLESRC─────────────┐ │
└─TOFILE──(──┬─┼───────────────────┼──┴─nombre-archivo-fuente─┴─┬──)─┘
│ ├─\CURLIB/──────────┤ │
│ └─nombre-bibliteca/─┘ │
└─\NONE────────────────────────────────────────────┘
(P) ──┬────────────────────────┬──┬────────────────────────┬───────5
5──┬────────────────────────────────────────────────┬───
│ ┌─\FROMMBR──────────────────────┐ │ │ ┌─\NO──┐ │ │ ┌─\YES─┐ │
└─TOMBR──(──┴─nombre-miembro-archivo-fuente─┴──)─┘ └─EXPCPY──(──┴─\YES─┴──)─┘ └─CVTRPT──(──┴─\NO──┴──)─┘
5──┬────────────────────────┬──┬─────────────────────────┬─────────────────────────────────────────────────────────────5
│ ┌─\NO──┐ │ │ ┌─\NO──┐ │
└─SECLVL──(──┴─\YES─┴──)─┘ └─INSRTPL──(──┴─\YES─┴──)─┘
5──┬────────────────────────────────────────────────────────────────────────────────────────┬──────────────────────────5
│ ┌─\LIBL/─────────────┐ ┌─QRNCVTLG────────────────────────────────┐ │
└─LOGFILE──(──┬─┼────────────────────┼──┴─nombre-archivo-anotaciones cronológicas─┴─┬──)─┘
│ ├─\CURLIB/───────────┤ │
│ └─nombre-biblioteca/─┘ │
└─\NONE───────────────────────────────────────────────────────────────┘
5──┬───────────────────────────────────────────────────────────────────┬──────────────────────────────────────────────5%
│ ┌─\FIRST──────────────────────────────────────────┐ │
└─LOGMBR──(──┼─\LAST───────────────────────────────────────────┼──)─┘
└─nombre-miembro-archivo-anotaciones cronológicas─┘
Nota:
P Todos los parámetros anteriores a este punto pueden especificarse por posición
FROMFILE
Especifica el nombre del archivo fuente que contiene el código fuente RPG III
o RPG/400 que se ha de convertir y la biblioteca en la que se encuentra el
archivo fuente. Este es un parámetro necesario. No existe un nombre de
archivo por omisión.
*LIBL
El sistema busca en la lista de bibliotecas la biblioteca en la que está
almacenado el archivo fuente.
*CURLIB
Se utiliza la biblioteca actual para buscar el archivo fuente. Si no ha espe-
cificado una biblioteca actual, se utilizará la biblioteca QGPL.
Apéndice B. Utilización del RPG III como ayuda para la conversión al RPG IV 407
Conversión del código fuente
nombre de la biblioteca
Entre el nombre de la biblioteca en la que está almacenado el archivo
fuente.
FROMMBR
Especifica el/los nombres del/los miembros que se han de convertir. Este es
un parámetro necesario. No existe un nombre de miembro por omisión.
Los tipos de miembro fuente válidos de los miembros fuentes que se han con-
vertir son RPG, RPT, RPG38, RPT38, SQLRPG y blanco. El mandato Con-
vertir fuente RPG no soporta los tipos de miembros fuente RPG36, RPT36 y
otros tipos de miembros fuente no de RPG (por ejemplo, CLP y TXT).
*ALL
El mandato convierte todos los miembros del archivo fuente especificado.
TOFILE
Especifica el nombre del archivo fuente que contiene los miembros fuente con-
vertidos y la biblioteca en la que se almacena el archivo fuente convertido. El
archivo fuente convertido debe existir y tener una longitud de registro de 112
caracteres: 12 para el número de secuencia y fecha, 80 para el código y 20
para los comentarios.
QRPGLESRC
El archivo fuente por omisión QRPGLESRC contiene los miembros fuente
convertido(s).
*NONE
No se genera un miembro convertido. Se ignora el valor del parámetro
TOMBR. Debe especificarse también CVTRPT(*YES) o la conversión fina-
lizará inmediatamente.
Esta característica le permite buscar algunos problemas potenciales sin
tener que crear el miembro fuente convertido.
*LIBL
El sistema busca en la lista de bibliotecas la biblioteca en la que está
almacenado el archivo fuente convertido.
*CURLIB
Se utiliza la biblioteca actual para buscar el archivo fuente convertido. Si
no ha especificado una biblioteca actual, se utilizará la biblioteca QGPL.
nombre de la biblioteca
Entre el nombre de la biblioteca en la que está almacenado el archivo
fuente convertido.
TOMBR
Especifica el nombre que tendrán los miembros fuente en el archivo fuente
convertido. Si el valor especificado en el parámetro FROMMBR es *ALL o
genérico*, entonces TOMBR debe ser igual a *FROMMBR.
*FROMMBR
Se utiliza el nombre de miembro especificado en el parámetro FROMMBR
como el nombre de miembro fuente convertido. Si se especifica
FROMMBR(*ALL), entonces se convierten todos los miembros fuente de
FROMFILE. Los miembros fuente convertidos tienen los mismos nombres
que los miembros fuente originales. Si se especifica un nombre genérico
en el parámetro FROMMBR, entonces se convierten todos los miembros
fuente especificados que tengan el mismo prefijo en sus nombres. Los
miembros fuente convertidos tienen los mismos nombres que los miembros
fuente genéricos originales.
EXPCPY
Especifica si se amplían o no el/los miembros /COPY en el miembro fuente
convertido. Debe especificarse EXPCPY(*YES) únicamente si tiene problemas
de conversión relacionados con los miembros /COPY.
Nota: Si el miembro es de tipo RPT o RPT38, EXPCPY(*YES) o
EXPCPY(*NO) no tiene efecto alguno porque el programa de generación auto-
mática de informes ampliará siempre los miembros /COPY.
*NO
No se amplían los miembros /COPY del archivo en el fuente convertido.
Apéndice B. Utilización del RPG III como ayuda para la conversión al RPG IV 409
Conversión del código fuente
*YES
Se amplían los miembros /COPY del archivo en el fuente convertido.
CVTRPT
Especifica si se imprime o no un informe de conversión.
*YES
Se imprime un informe de conversión.
*NO
No se imprime un informe de conversión.
SECLVL
Especifica si se imprime el texto de segundo nivel en el informe de conversión
en la sección de resumen de mensajes.
*NO
No se imprime el texto de mensaje de segundo nivel en el informe de con-
versión.
*YES
Se imprime el texto de mensaje de segundo nivel en el informe de conver-
sión.
INSRTPL
Especifica si se insertan las plantillas de especificación ILE RPG/400 (plantillas
de especificación H-, F-, D-, I-, C- y/u O-), en el/los miembros convertidos. El
valor por omisión es *NO.
*NO
No se insertan plantillas de especificación en el miembro fuente convertido.
*YES
Se inserta una plantilla de especificación en el miembro fuente convertido.
Cada plantilla de especificación se inserta al principio de la sección de
especificación adecuada.
LOGFILE
Especifica el nombre del archivo de anotaciones que se utilizará para hacer el
seguimineto de la información de conversión. A menos que se especifique
*NONE, debe haber un archivo de anotaciones. El archivo debe existir ya y
debe ser un archivo de datos físico. Cree el archivo de anotaciones utilizando
el mandato CPYF con el archivo del "objeto origen" QARNCVTLG de la biblio-
teca QRPGLE y "nuevo objeto" el archivo QRNCVTLG de su biblioteca.
QRNCVTLG
Se utiliza el archivo de anotaciones por omisión QRNCVTLG para que con-
tenga la información de la conversión.
*NONE
No se graba información de la conversión en un archivo de anotaciones.
*LIBL
El sistema busca en la lista de bibliotecas la biblioteca en la que está
almacenado el archivo de anotaciones.
nombre de la biblioteca
Entre el nombre de la biblioteca en la que está almacenado el archivo de
anotaciones.
LOGMBR
Especifica el nombre del miembro del archivo de anotaciones que se utilizará
para hacer el seguimiento de la información de conversión. La nueva infor-
mación se añade a los datos existentes del miembro del archivo de ano-
taciones especificado.
Si el archivo de anotaciones no contiene ningún miembro, entonces se crea un
miembro con el mismo nombre que el archivo de anotaciones.
*FIRST
El mandato utiliza el primer miembro del archivo de anotaciones especifi-
cado.
*LAST
El mandato utiliza el último miembro del archivo de anotaciones especifi-
cado.
Apéndice B. Utilización del RPG III como ayuda para la conversión al RPG IV 411
Conversión del código fuente
Por ejemplo, si desea convertir todos los miembros fuente del archivo QRPGSRC
al archivo QRPGLESRC, deberá entrar:
CVTRPGSRC FROMFILE(RPGANT/QRPGSRC)
FROMMBR(\ALL)
TOFILE(RPGNUE/QRPGLESRC)
TOMBR(\FROMMBR)
Este mandato convierte todos los miembros del fuente de la biblioteca RPGANT y
del archivo físico fuente QRPGSRC. Los nuevos miembros se crean en la biblio-
teca RPGNUE del archivo físico fuente QRPGLESRC.
Si prefiere guardar todos los fuentes (fuente DDS, fuentes RPG, etc.) en el mismo
archivo, también puede convertir los miembros fuente en RPG en un solo paso,
especificando FROMMBR(*ALL). La ayuda para la conversión sólo convertirá los
miembros con un tipo de RPG válido (consulte la Tabla 21 en la página 402).
Por ejemplo, si desea convertir todos los miembros con el prefijo GAST, deberá
entrar:
CVTRPGSRC FROMFILE(RPGANT/QRPGSRC)
FROMMBR(GAST\)
TOFILE(RPGNUE/QRPGLESRC)
TOMBR(\FROMMBR)
Este mandato convierte todos los miembros del fuente de la biblioteca RPGANT y
del archivo físico fuente QRPGSRC. Los nuevos miembros se crean en la biblio-
teca RPGNUE del archivo físico fuente QRPGLESRC.
Apéndice B. Utilización del RPG III como ayuda para la conversión al RPG IV 413
Conversión del código fuente
H TSTPGM
FFILE1 IF E DISK COM1
FQSYSPRT O F 132 OF LPRINTER
LQSYSPRT 6ðFL 56OL
E ARR1 3 3 1 COMM2
E ARR2 3 3 1
IFORMAT1
I OLDNAME NAME
I\ COMENTARIO DE ESTRUCTURA DE DATOS
IDS1 DS
I 1 3 FIELD1
I\ COMENTARIO DE CONSTANTE CON NOMBRE
I 'XYZ' C CONST1 COMM3
I 4 6 ARR1
C ARR1,3 DSPLY
C READ FORMAT1 ð1
C NAME DSPLY
C SETON LR
C EXCPTOUTPUT
OQSYSPRT E ð1 OUTPUT
O ARR2,3 1ð
\\
123
\\
456
Apéndice B. Utilización del RPG III como ayuda para la conversión al RPG IV 415
Ejemplo de conversión del fuente
1 .....H\unctions+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Comments+++++++++
2 H DFTNAME(TSTPGM)
3 .....F\ilename++IPEASFRlen+LKlen+AIDevice+.Functions++++++++++++++++++++++++++++Comments+++++++++
4 FFILE1 IF E DISK COMM1
5 FQSYSPRT O F 132 PRINTER OFLIND(\INOF)
6 F FORMLEN(6ð)
7 F FORMOFL(56)
8 .....D\ame+++++++++++ETDsFrom+++To/L+++IDc.Functions++++++++++++++++++++++++++++Comments+++++++++
9 D ARR2 S 1 DIM(3) CTDATA PERRCD(3)
1ð D\ COMENTARIO DE ESTRUCTURA DE DATOS
11 D DS1 DS
12 D FIELD1 1 3
13 D ARR1 4 6
14 D DIM(3) CTDATA PERRCD(3) COMM2
15 D\ COMENTARIO DE CONSTANTE CON NOMBRE
16 D CONST1 C CONST('XYZ') COMM3
17 .....I\ilename++SqNORiPos1+NCCPos2+NCCPos3+NCC..................................Comments+++++++++
18 .....I\.............Ext_field+Fmt+SPFrom+To+++DcField+++++++++L1M1FrP1MnZr......Comments+++++++++
19 IFORMAT1
2ð I OLDNAME NAME
21 .....C\ðNð1Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....Comments+++++++++
22 C ARR1(3) DSPLY
23 C READ FORMAT1 ð1
24 C NAME DSPLY
25 C SETON LR
26 C EXCEPT OUTPUT
27 OQSYSPRT E OUTPUT ð1
28 O ARR2(3) 1ð
29 \\CTDATA ARR1
3ð 123
31 \\CTDATA ARR2
32 456
Apéndice B. Utilización del RPG III como ayuda para la conversión al RPG IV 417
Análisis de la conversión
Análisis de la conversión
La ayuda para la conversión le proporciona dos maneras de analizar los resultados
de la conversión. Son éstas:
El informe de errores de conversión
El archivo de anotaciones cronológicas.
La primera parte del listado incluye un resumen de las opciones de mandato utili-
zadas por CVTRPGSRC. La Figura 194 muestra el resumen del mandato para
una conversión de prueba.
5716RG1 V3R6Mð 95ð929RN IBM ILE RPG/4ðð AS4ððSð1 12/3ð/95 2ð:41:35 Page 1
Mandato . . . . . . . . . . . . : CVTRPGSRC
emitido por . . . . . . . . . : DAVID
De archivo . . . . . . . . . . . : QRPGSRC
de biblioteca . . . . . . . . : MIBIB
De miembro . . . . . . . . . . : INFORME
De archivo . . . . . . . . . . . : QRPGLESRC
a biblioteca . . . . . . . . . : MIBIB
A miembro . . . . . . . . . . . : \FROMMBR
La sección fuente incluye las líneas que contiene mensajes informativos, de aviso
o de error asociados con los mismos. Estas líneas presentan un asterisco (*) en la
columna 1 para facilitar su examen en el SEU. El resumen de mensajes contiene
los tres tipos de mensajes.
Todos los miembros /COPY de un programa deben convertirse para que el pro-
grama en ILE RPG/400 correspondiente compile sin errores. De forma similar,
puede que desee convertir todos los miembros relacionados mediante CALL a la
vez. Utilice esta parte del informe como ayuda para identificar estos miembros. La
5716RG1 V3R6Mð 95ð929RN IBM ILE RPG/4ðð AS4ððSð1 12/3ð/95 2ð:41:35 Page 2
De archivo . . . . . . . . . . . : MIBIB/QRPGSRC(INFORME)
A archivo. . . . . . . . . . . . : MIBIB/QRPGLESRC(INFORME)
Archivo anotaciones. . . . . . . . . . . : \NONE
I n f o r m e d e C o n v e r s i ó n
\ \ \ \ \ F I N D E L F U E N T E \ \ \ \ \
El resumen de mensajes del listado muestra los diferentes mensajes que se han
emitido. Si especifica SECLVL(*YES), aparecerán los mensajes de segundo nivel
en el resumen de mensajes. La Figura 196 en la página 420 muestra la sección
de mensajes para la conversión de ejemplo, incluidos los mensajes de segundo
nivel.
Apéndice B. Utilización del RPG III como ayuda para la conversión al RPG IV 419
Análisis de la conversión
5716RG1 V3R6Mð 95ð929RN IBM ILE RPG/4ðð AS4ððSð1 12/3ð/95 2ð:41:35 Page 2
R e s u m e n d e M e n s a j e s
El resumen final del listado proporciona estadísticas sobre los mensajes y regis-
tros. En las anotaciones de trabajo también se coloca un mensaje de estado final.
La Figura 197 en la página 421 muestra la sección de mensajes de la conversión
de ejemplo
R e s u m e n f i n a l
Total mensajes:
Información (ðð) . . . . . . . : 2
Aviso (1ð) . . . . . . . : ð
Error grave (3ð+) . . . . . . : 1
--------------------------------- -------
Total . . . . . . . . . . . . . : 3
Total fuente:
Registros originales leídos . . . . : 3
Registros convertidos grabados . . : 4
Mensaje de gravedad superior emitido: 3ð
\ \ \ \ \ F I N D E R E S U M E N F I N A L \ \ \ \ \
\ \ \ \ \ F I N D E C O N V E R S I O N \ \ \ \ \
Apéndice B. Utilización del RPG III como ayuda para la conversión al RPG IV 421
Análisis de la conversión
A R QRNCVTFM
A LGCENT 1A COLHDG('CVT' 'CENT')
A TEXT('Siglo Conversión: ð-2ð 1-21+')
A LGDATE 6A COLHDG('CVT' 'DATE')
A TEXT('Fecha Conversión: el formato +
A es AAMMDD')
A LGTIME 6A COLHDG('CVT' 'TIME')
A TEXT('Hora conversión: el formato +
A es HMMSS')
A LGSYST 8A COLHDG('CVT' 'SYST')
A TEXT('Nombre del sistema que ejecuta +
A la conversion')
A LGUSER 1ðA COLHDG('CVT' 'USER')
A TEXT('Nombre perfil de usuario que +
A ejecuta conversión')
A LGFRFL 1ðA COLHDG('FROM' 'FILE')
A TEXT('Archivo Origen')
A LGFRLB 1ðA COLHDG('FROM' 'LIB')
A TEXT('Biblioteca Origen')
A LGFRMR 1ðA COLHDG('FROM' 'MBR')
A TEXT('Miembro Origen')
A LGFRMT 1ðA COLHDG('FMBR' 'TYPE')
A TEXT('Tipo de Miembro Origen')
A LGTOFL 1ðA COLHDG('TO' 'FILE')
A TEXT('Archivo Destino')
A LGTOLB 1ðA COLHDG('TO' 'LIB')
A TEXT('Biblioteca Destino')
A LGTOMR 1ðA COLHDG('TO' 'MBR')
A TEXT('Miembro Destino')
A LGTOMT 1ðA COLHDG('TMBR' 'TYPE')
A TEXT('Tipo de Miembro Destino')
A LGLGFL 1ðA COLHDG('LOG' 'FILE')
A TEXT('Archivo de Anotaciones')
Debe sustituir los códigos de operación FREE o DEBUG por una lógica equivalente
antes o después de la conversión.
Para obtener más información sobre cómo convertir miembros del generador auto-
mático de informes, consulte el apartado “Conversión de miembros fuente del
generador automático de informes” en la página 413. Para obtener más infor-
mación sobre las diferencias entre RPG III y RPG IV, consulte el apartado Apén-
dice A, “Diferencias de comportamiento entre OPM RPG/400 e ILE RPG/400” en la
página 395.
Apéndice B. Utilización del RPG III como ayuda para la conversión al RPG IV 423
Resolución de problemas de conversión
Problemas de fusión
Debido a las diferencias entre los lenguajes RPG III y RPG IV, la ayuda para la
conversión debe volver a ordenar ciertas sentencias del fuente. Un ejemplo de
esta reordenación se muestra en el apartado “Ejemplo de conversión del fuente” en
la página 415 para el miembro fuente en RPG III PRUEBA1. Si compara la ubi-
cación de la estructura de datos DS1 de la Figura 192 en la página 415 y de la
Figura 193 en la página 416, observará que la estructura de datos DS1 se ha
movido de modo que precede al formato de registro FORMAT1.
Ahora suponga que el miembro RPG III PRUEBA1 se ha divido en dos miembros,
PRUEBA2 y COPYDS1, donde la estructura de datos DS1 y la constante con
nombre CONST1 están en un miembro de copia COPYDS1. Este miembro de
copia se incluye en el fuente para PRUEBA2. La Figura 199 y la Figura 200
muestran el fuente para PRUEBA2 y COPYDS1 respectivamente.
H TSTPGM
FFILE1 IF E DISK COMM1
FQSYSPRT O F 132 OF LPRINTER
LQSYSPRT 6ðFL 56OL
E ARR1 3 3 1 COMM2
E ARR2 3 3 1
IFORMAT1
I NOMANT NOMBRE
/COPY COPYDS1
C ARR1,3 DSPLY
C READ FORMAT1 ð1
C NAME DSPLY
C SETON LR
C EXCPTOUTPUT
OQSYSPRT E ð1 OUTPUT
O ARR2,3 1ð
\\
123
\\
456
Fíjese que la ayuda para la conversión no ha podido mover la directiva /COPY por
encima de FORMAT1 porque el contenido del miembro /COPY es desconocido.
Apéndice B. Utilización del RPG III como ayuda para la conversión al RPG IV 425
Resolución de problemas de conversión
En los dos casos anteriores, se asume una estructura de datos y se generan espe-
cificaciones de definición.También se genera un bloque de comentarios que con-
tiene el código de especificación de entrada. Por ejemplo, la ayuda para la
conversión convertirá el fuente de la Figura 201 al código que se muestra en la
Figura 203 en la página 427. Si se necesita el código de especificación de
entrada, suprima las especificaciones de definición y borre los asteriscos de las
especificaciones de entrada correspondientes.
Recuerde que tiene dos modos de corregir estos tipos de problemas. Utilice la
opción EXPCPY(*YES) del mandato CVTRPGSRC o corrija manualmente el código
después de la conversión.
Dado que estos problemas causarán errores de tiempo de compilación, puede uti-
lizar la información del listado del compilador del ILE RPG/400 y el manual ILE
RPG/400 Reference para corregirlos.
Por ejemplo, el campo ARRAY en la Figura 204 en la página 428 se incluye dos
veces en la Figura 205 en la página 428. Se incluye una vez como una matriz
autónoma y una vez en la estructura de datos descritos externamente EXTREC.
Cuando se convierte, el fuente RPG IV generado se muestra en la Figura 206 en
la página 428. Este código no se compilará ya que ARRAY está definido dos
veces. Para corregir este problema, suprima la matriz autónoma y añada un sub-
campo con las palabras clave a la estructura de datos DSONE, como se muestra
en la Figura 207 en la página 428.
Apéndice B. Utilización del RPG III como ayuda para la conversión al RPG IV 427
Resolución de problemas de conversión
A R RECORD
A CHARACTER 1ð
A ARRAY 1ð
E ARRAY 1ð 1
IDSONE E DSEXTREC
C CHAR DSPLY
C SETON LR
D ARRAY S 1 DIM(1ð)
D DSONE E DS EXTNAME(EXTREC)
C CHAR DSPLY
C SETON LR
D DSONE E DS EXTNAME(EXTREC)
D ARRAY E DIM(1ð)
C CHAR DSPLY
C SETON LR
IDSONE E DSEXTREC
I CHARACTER CHAR
I I 'XYZ' CHAR
C CHAR DSPLY
C SETON LR
D DSONE E DS EXTNAME(EXTREC)
D CHAR E EXTFLD(CHARACTER)
D CHAR E INZ('XYZ')
C CHAR DSPLY
C SETON LR
D DSONE E DS EXTNAME(EXTREC)
D CHAR E EXTFLD(CHARACTER) INZ('XYZ')
C CHAR DSPLY
C SETON LR
En general, debe evitar situaciones en las que una aplicación compuesta por pro-
gramas OPM e ILE esté dividida entre el grupo de activación por omisión OMP y
un grupo de activación con nombre.Al producir una división entre estos dos grupos
de activación, se mezcla el comportamiento de OPM con el comportamiento de ILE
y el resultado puede ser difícil de prever. Consulte en el Capítulo 3, “Estrategias
de creación de programas” en la página 23 o la publicación ILE Conceptos para
obtener más información.
Apéndice B. Utilización del RPG III como ayuda para la conversión al RPG IV 429
Resolución de problemas de conversión
Para obtener información sobre los mandatos Crear programa y Crear programa de
servicio, consulte el manual CL Reference.
Utilización de mandatos CL
Los mandatos de Lenguaje de Control (CL), parámetros y palabras clave
pueden entrarse en caracteres en mayúsculas o minúsculas. En el diagrama de
sintaxis estos se muestran en mayúsculas (por ejemplo, PARAMETRO,
VALOR-PREDEFINIDO). Las variables aparecen en letras minúsculas en cursiva
(por ejemplo, valor-definido-usuario). Las variables son nombres o valores defi-
nidos por el usuario.
55──PARAMETRO──(──┬───────────────────┬──valor-definido-usuario──)──────────────────────5%
└─VALOR-PREDEFINIDO─┘
El símbolo ──(──)── indica que el parámetro o valor debe entrarse entre paréntesis.
55──PARÁMETRO-NECESARIO──(──┬─VALOR-PREDEFINIDO──────┬──)────────────────────────────────5
└─valor-definido-usuario─┘
5──┬──────────────────────────────────────────────────────┬─────────────────────────────5%
└─PARAMETRO-OPCIONAL──(──┬─VALOR-PREDEFINIDO──────┬──)─┘
└─valor-definido-usuario─┘
Los valores por omisión aparecen por encima de la línea base y no necesita
entrarlos. Se utilizan cuando no se especifica un parámetro. En el ejemplo
siguiente, el usuario puede entrar VALOR-POR-OMISIÓN,
OTRO-VALOR-PREDEFINIDO o nada. Si no se entra nada, se supone que es
VALOR-POR-OMISIÓN.
┌─VALOR-OMISIÓN──────────┐
55──PARAMETRO──(──┴─OTRO-VALOR-PREDEFINIDO─┴──)─────────────────────────────────────────5%
Los valores opcionales se indican por una línea en blanco. La línea en blanco
indica que no es necesario que entre un valor del primer grupo
(VALOR-OPCIONAL1, VALOR-OPCIONAL2, valor-definido-usuario). Por ejemplo,
basándose en la sintaxis siguiente, el usuario podría entrar:PARAMETRO(VALOR
NECESARIO).
┌─VALOR1-OPCIONAL────────┐
55──PARAMETRO──(──┼────────────────────────┼────VALOR-NECESARIO────)────────────────────5%
├─VALOR2-OPCIONAL────────┤
└─valor-definido-usuario─┘
Pueden especificarse valores repetidos para algunos parámetros. La coma (,) del
siguiente ejemplo indica que cada valor-definido-usuario debe ir separado por una
coma.
┌─,──────────────────────────┐
55──PALABRA CLAVE──(───6───valor-definido-usuario───┴──)─────────────────────────────────5%
Mandato CRTBNDRPG
El mandato Crear RPG Enlazado (CRTBNDRPG) realiza las tareas combinadas de
los mandatos Crear Módulo RPG (CRTRPGMOD) y Crear Programa (CRTPGM)
creando un objeto de módulo temporal desde el código fuente, y a continuación
creando el objeto programa. Una vez se haya creado el objeto de programa,
CRTBNDRPG suprime el objeto de módulo que haya creado. El diagrama de sin-
taxis completo para el mandato CRTBNDRPG se muestra a continuación.
55──CRTBNDRPG──┬──────────────────────────────────────────────────────┬────────────────────────────────────────────────5
│ ┌─\CURLIB/───────────┐ ┌─\CTLSPEC────────┐ │
└─PGM(──┼────────────────────┼──┴─nombre-programa─┴──)─┘
└─nombre-biblioteca/─┘
5──┬────────────────────────────────────────────────────────────────┬──────────────────────────────────────────────────5
│ ┌─\LIBL/─────────────┐ ┌─QRPGLESRC─────────────┐ │
└─SRCFILE(──┼────────────────────┼──┴─nombre-archivo-fuente─┴──)─┘
├─\CURLIB/───────────┤
└─nombre-biblioteca/─┘
(P) ──┬──────────────────────────────────────┬──────────────────────5
5──┬───────────────────────────────────────────────┬───
│ ┌─\PGM──────────────────────────┐ │ │ ┌─1ð───────────────────┐ │
└─SRCMBR(──┴─nombre-miembro-archivo-fuente─┴──)─┘ └─GENLVL(──┴─valor-nivel-gravedad─┴──)─┘
5──┬─────────────────────────────┬──┬─────────────────────────┬──┬────────────────────────────────────┬────────────────5
│ ┌─\SRCMBRTXT────┐ │ │ ┌─\YES─┐ │ └─OPTION(──┤ Detalles de OPTION ├──)─┘
└─TEXT(──┼─\BLANK────────┼──)─┘ └─DFTACTGRP(──┴─\NO──┴──)─┘
└─'descripción'─┘
5──┬──────────────────────────┬──┬────────────────────────┬──┬──────────────────────────┬──────────────────────────────5
│ ┌─\STMT───┐ │ │ ┌─\PRINT─┐ │ │ ┌─\NONE──┐ │
└─DBGVIEW(──┼─\SOURCE─┼──)─┘ └─OUTPUT(──┴─\NONE──┴──)─┘ └─OPTIMIZE(──┼─\BASIC─┼──)─┘
├─\LIST───┤ └─\FULL──┘
├─\COPY───┤
├─\ALL────┤
└─\NONE───┘
5──┬────────────────────────────────┬──────────────────────────────────────────────────────────────────────────────────5
│ ┌─\NONE──────────┐ │
└─INDENT(──┴─valor-carácter─┴──)─┘
5──┬────────────────────────────────────────────────────────────────────────────────┬──────────────────────────────────5
│ ┌─\NONE──────────────────────────────────────────────────────────┐ │
└─CVTOPT(──┴─┬────────────────────────────────────────────────────────────┬─┴──)─┘
└─┬───────────┬──┬──────────┬──┬──────────┬──┬─────────────┬─┘
└─\DATETIME─┘ └─\GRAPHIC─┘ └─\VARCHAR─┘ └─\VARGRAPHIC─┘
5──┬────────────────────────────────────────────────────────────────────┬──┬──────────────────────────────────────┬────5
│ ┌─\HEX───────────────────────────────────────────────┐ │ │ ┌─\JOBRUN──────────────┐ │
└─SRTSEQ(──┼─\JOB───────────────────────────────────────────────┼──)─┘ └─LANGID(──┼─\JOB─────────────────┼──)─┘
├─\JOBRUN────────────────────────────────────────────┤ └─identificador-idioma─┘
├─\LANGIDUNQ─────────────────────────────────────────┤
├─\LANGIDSHR─────────────────────────────────────────┤
└─┬────────────────────┬──nombre-tabla-clasificación─┘
├─\LIBL/─────────────┤
├─\CURLIB/───────────┤
└─nombre-biblioteca/─┘
5──┬───────────────────────┬──┬────────────────────────┬──┬──────────────────────────────────────────┬─────────────────5
│ ┌─\YES─┐ │ │ ┌─\USER──┐ │ │ ┌─\LIBCRTAUT──────────────────┐ │
└─REPLACE(──┴─\NO──┴──)─┘ └─USRPRF(──┴─\OWNER─┴──)─┘ └─AUT(──┼─\ALL────────────────────────┼──)─┘
├─\CHANGE─────────────────────┤
├─\USE────────────────────────┤
├─\EXCLUDE────────────────────┤
└─nombre-lista-autorizaciones─┘
5──┬────────────────────────┬──┬────────────────────────┬──┬──────────────────────────┬────────────────────────────────5
│ ┌─\YES─┐ │ │ ┌─\NONE──┐ │ │ ┌─\CURRENT─┐ │
└─TRUNCNBR(──┴─\NO──┴──)─┘ └─FIXNBR(──┴─\ZONED─┴──)─┘ └─TGTRLS(──┼─\PRV─────┼──)─┘
└─VxRxMx───┘
5──┬─────────────────────────────┬──┬──────────────────────────────────────────────────────────────────┬───────────────5
│ ┌─\NO────────┐ │ │ ┌─\NONE────────────────────────────────────────────┐ │
| └─ALWNULL(──┼─\INPUTONLY─┼──)─┘ └─BNDDIR(──┼──────────────────────────────────────────────────┼──)─┘
| ├─\USRCTL────┤ │ ┌─\LIBL/─────────────┐ │
└─\YES───────┘ └─┼────────────────────┼──nombre-directorio-enlace─┘
├─\CURLIB/───────────┤
├─\USRLIBL/──────────┤
└─nombre-biblioteca/─┘
5──┬─────────────────────────────────────────┬──┬───────────────────────────────┬──────────────────────────────────────5
| │ ┌─QILE────────────────────┐ │ │ ┌─\PEP───────┐ │
| └─ACTGRP(──┼─\NEW────────────────────┼──)─┘ └─ENBPFRCOL(──┼─\ENTRYEXIT─┼──)─┘
| ├─\CALLER─────────────────┤ └─\FULL──────┘
└─nombre-grupo-activación─┘
5──┬──────────────────────────────────┬───────────────────────────────────────────────────────────────────────────────5%
| │ ┌─\NONE────────────┐ │
| └─DEFINE(──┴─nombre-condición─┴──)─┘
Nota:
P Todos los parámetros anteriores a este punto pueden especificarse por posición
Detalles de OPTION:
| ┌─\XREF───┐ ┌─\GEN───┐ ┌─\NOSECLVL─┐ ┌─\SHOWCPY───┐ ┌─\EXPDDS───┐ ┌─\EXT───┐ ┌─\NOSHOWSKP─┐ ┌─\NOEVENTF─┐
├──┼─────────┼──┼────────┼──┼───────────┼──┼────────────┼──┼───────────┼──┼────────┼──┼────────────┼──┼───────────┼────┤
| └─\NOXREF─┘ └─\NOGEN─┘ └─\SECLVL───┘ └─\NOSHOWCPY─┘ └─\NOEXPDDS─┘ └─\NOEXT─┘ └─\SHOWSKP───┘ └─\EVENTF───┘
PGM
Especifica el nombre del programa y el nombre de la biblioteca del objeto de
tipo programa (*PGM) que está creando. El nombre del programa y el nombre
de la biblioteca deben seguir el convenio de denominación de AS/400. Si no
se especifica una biblioteca, el programa creado se almacena en la biblioteca
actual.
*CTLSPEC
El nombre del programa compilado se toma del nombre especificado en la
palabra clave DFTNAME de la especificación de control. Si no se especi-
fica el nombre del programa en la especificación de control y el miembro
fuente es de un archivo de base de datos, se utiliza como nombre de pro-
grama el nombre del miembro, especificado en el parámetro SRCMBR.Si
el fuente no es de un archivo de base de datos, por omisión el nombre del
programa será RPGPGM.
*CURLIB
El objeto de tipo programa creado se almacena en la biblioteca actual. Si
no ha especificado una biblioteca actual, se utilizará QGPL.
nombre de la biblioteca
Entre el nombre de la biblioteca en la que se almacenará el objeto de tipo
programa creado.
SRCFILE
Especifica el nombre del archivo fuente que contiene el miembro fuente ILE
RPG que se ha de compilar y la biblioteca en la que se encuentra el archivo
fuente. La longitud recomendada para el archivo físico fuente es de 112 carac-
teres: 12 para el número de secuencia y la fecha, 80 para el código y 20 para
los comentarios. Esta es la cantidad máxima de fuente que se muestra en el
listado del compilador.
QRPGLESRC
El archivo fuente por omisión, QRPGLESRC, contiene el miembro fuente
ILE RPG que se ha de compilar.
*LIBL
El sistema busca en la lista de bibliotecas la biblioteca en la que está
almacenado el archivo fuente.Este es el valor por omisión.
*CURLIB
Se utiliza la biblioteca actual para buscar el archivo fuente. Si no ha espe-
cificado una biblioteca actual, se utilizará QGPL.
nombre de la biblioteca
Entre el nombre de la biblioteca en la que está almacenado el archivo
fuente.
SRCMBR
Especifica el nombre del miembro del archivo fuente que contiene el programa
fuente ILE RPG que se ha de compilar.
*PGM
Utilice el nombre especificado mediante el parámetro PGM como nombre
de miembro del archivo fuente.El objeto de tipo programa compilado tendrá
el mismo nombre que el miembro del archivo fuente. Si no se especifica
un nombre de programa mediante el parámetro PGM, el mandato utiliza
como nombre de miembro fuente el primer miembro creado o añadido al
archivo fuente.
GENLVL
Controla la creación del objeto de tipo programa. El programa se crea si todos
los errores encontrados durante la compilación tienen un nivel de gravedad
menor o igual al nivel de gravedad de generación especificado.
TEXT
Le permite entrar texto que describe brevemente el programa y su función.El
texto aparecer cuando se visualiza la información del programa.
*SRCMBRTXT
Se utiliza el texto del miembro fuente.
*BLANK
No aparece texto.
'descripción'
Entre un texto que describa brevemente la función de las especificaciones
fuente. El texto puede tener un máximo de 50 caracteres y debe estar
encerrado entre apóstrofos.Los apóstrofos no forman parte de la serie de
50 caracteres. No son necesarios los apóstrofos si está entrando el texto
desde la pantalla de solicitud.
DFTACTGRP
Especifica si el programa creado está diseñado para ejecutarse siempre en el
grupo de activación por omisión.
*YES
Cuando se llama a este programa se ejecutará siempre en el grupo de
activación por omisión. El grupo de activación por omisión es el grupo de
activación donde se ejecutan los programas del modelo de programa ori-
ginal (OPM).
Especificar DFTACTGRP(*YES) permite que los programas ILE RPG/400
se comporten como programas OPM en las áreas de ámbito de alteración
temporal, ámbito de apertura y RCLRSC.
El enlace estático ILE no está disponible cuando se crea un programa con
DFTACTGRP(*YES). Esto significa que no puede utilizar los parámetros
BNDDIR o ACTGRP cuando cree este programa. Además, todas las ope-
raciones de llamada del fuente deben llamar a un programa, no a un pro-
cedimiento.
DFTACTGRP(*YES) resulta útil cuando se intenta trasladar una aplicación
en base programa a programa a ILE RPG/400.
*NO
El programa se asocia con el grupo de activación especificado por el pará-
metro ACTGRP. El enlace estático está permitido cuando se especifica
*NO.
Si se especifica ACTGRP(*CALLER) y se llama a este programa desde un
programa que se ejecuta en el grupo de activación por omisión, entonces
este programa se comportará según la semántica ILE en las áreas de com-
partición archivos, ámbito de archivos y RCLRSC.
DFTACTGRP(*NO) resulta útil cuando desea beneficiarse de los conceptos
ILE, como por ejemplo ejecutar en un grupo de activación con nombre o
enlazar con un programa de servicio.
OPTION
Especifica las opciones que se han de utilizar cuando se compila el miembro
fuente. Puede especificar cualquier o todas las opciones en cualquier orden.
Separe las opciones con uno o más espacios en blanco. Si se especifica una
opción más de una vez, se utiliza la última.
*XREF
Genera un listado de referencias cruzadas (cuando resulta adecuado) del
miembro fuente.
*NOXREF
No se genera el lista de referencias cruzadas.
*GEN
Se crea un objeto de tipo programa si el nivel de gravedad más alto
devuelto por el compilador no sobrepasa el nivel de gravedad especificado
en la opción GENLVL.
*NOGEN
No crea un objeto de tipo programa.
*NOSECLVL
No se imprime el texto del mensaje de segundo nivel en la línea siguiente
al texto del mensaje de primer nivel.
*SECLVL
Se imprime el texto de mensaje de segundo nivel en la línea siguiente al
texto de mensaje de primer nivel en la sección de resumen de mensajes.
*SHOWCPY
Muestra los registros fuentes de los miembros incluidos por la directiva del
compilador /COPY.
*NOSHOWCPY
No muestra los registros fuente de los miembros incluidos por la directiva
del compilador /COPY.
*EXPDDS
Muestra la expansión de los archivos descritos externamente en el listado
y visualiza la información de campo clave.
*NOEXPDDS
No muestra la expansión de los archivos descritos externamente en el
listado ni la información de campo clave.
*EXT
Muestra la lista de los procedimientos externos y campos a los que se
hace referencia durante la compilación del listado.
*NOEXT
No se muestra la lista de procedimientos externos y campos a los que se
hace referencia durante la compilación del listado.
| *NOSHOWSKP
| No muestra las sentencias a que se hace caso omiso en la parte fuente
| del listado. El compilador ignora las instrucciones originadas por las direc-
| trices /IF, /ELSEIF o /ELSE.
| *SHOWSKP
| Muestra todas las sentencias de la parte fuente del listado con indepen-
| dencia de si el compilador las ha saltado o no las ha saltado.
*NOEVENTF
No se crea un archivo de eventos para que lo utilice CoOperative
Development Environment/400 (CODE/400). CODE/400 utiliza este archivo
*EVENTF
Se crea un archivo de eventos para que lo utilice CoOperative
Development Environment/400 (CODE/400). El archivo de eventos se crea
como un miembro del archivo EVFEVENT de la biblioteca en la que se va
a almacenar el módulo u objeto de tipo programa creado. Si no existe el
archivo EVFEVENT se crea automáticamente. El nombre de miembro del
archivo de eventos es el mismo que el nombre del objeto que se está
creando.
CODE/400 utiliza este archivo para proporcionar información de retorno de
errores integrada con el editor CODE/400. Generalmente se crea un
archivo de eventos al crear un módulo o un programa en CODE/400.
DBGVIEW
Especifica qué nivel de depuración está disponible para el objeto de tipo pro-
grama compilado y qué vistas del fuente están disponibles para la depuración
a nivel de fuente.
*STMT
Permite que se depure el programa utilizando los números de línea que
aparecen en la columna más a la izquierda de la sección fuente del listado
del compilador.
*SOURCE
Genera la vista del fuente para depurar el programa compilado. Esta vista
no está disponible si el miembro fuente raíz es un archivo DDM. También,
si se realizan cambios en cualquier miembro fuente después de la compi-
lación y antes de intentar depurar el programa, es posible que las vistas
para dichos miembros fuente no sean utilizables.
*LIST
Genera la vista de listado para depurar el objeto de programa compilado.
La información que figura en la vista del listado depende de si se ha espe-
cificado o no *SHOWCPY y *EXPDDS en el parámetro OPTION.
Nota: La vista de listado no mostrará ningún tipo de sangrado que pueda
haber solicitado utilizando la opción de sangrado.
*COPY
Genera las vistas del fuente y de copia para depurar el programa compi-
lado. La vista del fuente para esta opción es la misma que la vista del
fuente generada para la opción *SOURCE. La vista de copia es una vista
de depuración que tiene incluidos todos los miembros fuente /COPY.
Estas vistas no estarán disponibles si el miembro fuente raíz es un archivo
DDM. También, si se realizan cambios en cualquier miembro fuente
después de la compilación y antes de intentar depurar el programa, es
posible que las vistas para dichos miembros fuente no sean utilizables.
*ALL
Genera las vistas del listado, fuente y copia para depurar el programa com-
pilado. La información que figura en la vista del listado depende de si se
ha especificado o no *SHOWCPY y *EXPDDS en el parámetro OPTION.
*NONE
Inhabilita todas las opciones de depuración para depurar el programa com-
pilado.
OUTPUT
Especifica si se genera un listado del compilador.
*PRINT
Genera un listado del compilador que consta del fuente del programa ILE
RPG/400 y de todos los mensajes de tiempo de compilación. La infor-
| mación contenida en el listado depende de si se ha especificado *XREF,
| *SECLVL, *SHOWCPY, *SHOWSKP, *EXPDDS y *EXT en el parámetro
OPTION.
*NONE
No se genera el listado del compilador.
OPTIMIZE
Especifica el nivel de optimización, si existe, del programa.
*NONE
No se optimizará el código generado. Este es es el método más rápido en
cuanto a tiempo de traducción. Permite que las variables se visualicen y
modifiquen mientras está en modalidad de depuración.
*BASIC
Se realiza un cierto nivel de optimización en el código generado. Permite
que se visualicen y modifiquen las variables durante la depuración.
*FULL
La optimización que genera el código más eficaz. El tiempo de traducción
es el más prolongado.Es posible que no se modifiquen las variables
aunque puede que los valores presentados no sean los valores actuales.
INDENT
Especifica si para mejorar la legibilidad del listado fuente se ha de efectuar un
sangrado en las operaciones estructuradas. También especifica los caracteres
que se utilizarán para marcar las cláusulas de las operaciones estructuradas.
Nota: El sangrado que se solicite aquí no se reflejará en la vista del depu-
ración de listado que se crea cuando se especifica DBGVIEW(*LIST).
*NONE
No se efectuará un sangrado a las operaciones estructuradas en el listado
fuente.
CVTOPT
Especifica cómo el compilador ILE RPG maneja los tipos de datos de fecha,
hora, indicación de la hora y los tipos de datos de longitud variable que se
recuperan de los archivos de base de datos descritos externamente.
*NONE
Ignora los tipos de datos de base de datos de longitud variable y utiliza los
tipos de datos RPG de fecha, hora, indicación de la hora y de gráficos.
*DATETIME
Especifica que los tipos de datos de base de datos de fecha, hora e indi-
cación de la hora se han de declarar como campos de caracteres de lon-
gitud fija.
*GRAPHIC
Especifica que los tipos de datos de gráficos del juego de caracteres de
doble byte (DBCS) se han de declarar como campos de caracteres de lon-
gitud fija.
*VARCHAR
Especifica que los tipos de datos de caracteres de longitud variable se han
de declarar como campos de caracteres de longitud fija.
*VARGRAPHIC
Especifica que los tipos de datos de gráficos del juego de caracteres de
doble byte de longitud variable (DBCS) se han de declarar como campos
de caracteres de longitud fija.
SRTSEQ
Especifica la tabla de secuencias de ordenación que se ha de utilizar en el
programa fuente ILE RPG.
*HEX
No se utiliza una secuencia de ordenación.
*JOB
Se utiliza el valor SRTSEQ que tenía el trabajo cuando se creó el *PGM.
*JOBRUN
Se utiliza el valor SRTSEQ del trabajo que ejecuta el *PGM.
*LANGIDUNQ
Se utiliza una tabla de pesos exclusiva. Este valor especial se utiliza junto
con el parámetro LANGID para determinar la tabla de secuencias de orde-
nación adecuada.
*LANGIDSHR
Se utiliza una tabla de pesos compartida. Este valor especial se utiliza
junto con el parámetro LANGID para determinar la tabla de secuencias de
ordenación adecuada.
*LIBL
El sistema busca en la lista de bibliotecas la biblioteca en la que está
almacenada la tabla de secuencias de ordenación.
*CURLIB
Se utiliza la biblioteca actual para buscar la tabla de secuencias de orde-
nación. Si no ha especificado una biblioteca actual, se utilizará QGPL.
nombre de la biblioteca
Entre el nombre de la biblioteca en la que está almacenada la tabla de
secuencias de ordenación.
LANGID
Especifica el identificador de idioma que se utilizará cuando la secuencia de
ordenación sea *LANGIDUNQ y *LANGIDSHR. El parámetro LANGID se utiliza
junto con el parámetro SRTSEQ para seleccionar la tabla de secuencias de
ordenación.
*JOBRUN
Se utiliza el valor LANGID del trabajo que ejecuta el programa RPG.
*JOB
Se utiliza el valor LANGID asociado con el trabajo que crea el programa
RPG.
identificador de idioma
Utilice el identificador de lenguaje especificado. (Por ejemplo, FRA para el
francés y DEU para el alemán).
REPLACE
Especifica si se crea un nuevo programa cuando ya existe un programa con el
mismo nombre en la biblioteca especificada (o implícita). El módulo intermedio
creado durante el proceso del mandato CRTBNDRPG no está sometido a las
especificaciones REPLACE y tiene REPLACE(*NO) implícito en la biblioteca
QTEMP. Se suprimen los módulos intermedios una vez ha finalizado el
proceso del mandato CRTBNDRPG.
*YES
Se crea un nuevo programa en la biblioteca especificada. El programa
existente con el mismo nombre en la biblioteca especificada se pasa a la
biblioteca QRPLOBJ.
*NO
No se crea un nuevo programa si ya existe un programa con el mismo
nombre en la biblioteca especificada. No se sustituye el programa exis-
tente, se visualiza un mensaje y se detiene la compilación.
USRPRF
Especifica el perfil de usuario que ejecutará el objeto de tipo programa creado.
El perfil del propietario del programa o del usuario del programa se utiliza para
ejecutar el programa y controlar qué objetos puede utilizar el programa
(incluida la autorización que el programa tiene sobre cada objeto). Este pará-
metro no se actualiza si ya existe el programa. Para cambiar el valor de
USRPRF, suprima el programa y vuelva a compilarlo utilizando el valor
correcto (o si existen los objetos componentes *MODULE, puede optar por
invocar el mandato CRTPGM).
*USER
El programa se ejecuta bajo el perfil de usuario del usuario del programa.
*OWNER
El programa se ejecuta bajo el perfil de usuario del usuario y del propie-
tario del programa.Se utiliza el conjunto de autorizaciones sobre objetos de
ambos perfiles de usuario para buscar y acceder a los objetos mientras se
ejecuta el programa.Los objetos creados durante la ejecución del programa
son propiedad del usuario del programa.
AUT
Especifica la autorización que se otorga a los usuarios que no tiene autori-
zación específica sobre el objeto, que no están en la lista de autorizaciones y
cuyo grupo de usuario no tiene una autorización específica sobre el objeto.Una
vez creado el programa, la autorización puede alterarse para todos o para los
usuarios especificados con los mandatos CL Otorgar autorización sobre objeto
(GRTOBJAUT) o Revocar autorización sobre objeto (RVKOBJAUT).Para
obtener más información sobre estos mandatos, consulte la publicación. CL
Reference
*LIBCRTAUT
La autorización pública sobre el objeto se toma de la palabra clave
CRTAUT de la biblioteca destino (la biblioteca que contiene el objeto). El
valor se determina cuando se crea el objeto. Si cambia el valor CRTAUT
para la biblioteca después de la operación de crear, el nuevo valor no afec-
tará a los objetos existentes.
*ALL
Autorización para todas las operaciones sobre el objeto de tipo programa
excepto para las limitadas al propietario o controladas por la autorización
de gestión de lista de autorizaciones.El usuario puede controlar la exis-
*CHANGE
Proporciona autorizaciones sobre los datos y autorización para realizar
todas las operaciones sobre el objeto de tipo programa excepto las limi-
tadas al propietario o controladas por la autorización sobre objeto y por la
autorización de gestión de objetos. El usuario puede cambiar el objeto y
realizar funciones básicas en él.
*USE
Proporciona autorización operativa sobre objeto y autorización de lectura;
autorización para operaciones básicas sobre el objeto de tipo programa. El
usuario no puede cambiar el objeto.
*EXCLUDE
El usuario no puede acceder al objeto.
TRUNCNBR
Especifica si el valor truncado se desplaza al campo de resultado o se genera
un error cuando se produce un desbordamiento numérico mientras se ejecuta
el programa.
Nota: La opción TRUNCNBR no se aplica a los cálculos realizados en las
expresiones.(Las expresiones se encuentran en el campo de factor
ampliado 2).Si se produce un desbordamiento para estos cálculos, se
producirá siempre un error. Además, el desbordamiento siempre es
señalado para cualquier operación en la que el valor que se asigna a
un campo de enteros o sin signo está fuera de rango.
*YES
Se ignora el desbordamiento numéricos y se mueve el valor truncado al
campo de resultado.
*NO
Cuando se detecta el desbordamiento numérico, se genera un error de
tiempo de ejecución con el código de error RNX0103.
FIXNBR
Especifica si el compilador arregla los datos decimales con zona no válidos
tras la conversión a datos empaquetados.
*NONE
El compilador no arreglará los datos decimales con zona tras la conversión
a datos empaquetados y si se utilizan darán como resultado errores deci-
males durante la ejecución.
*ZONED
El compilador arreglará los datos decimales con zona tras la conversión a
datos empaquetados.Los blancos en campos numéricos se tratarán como
ceros.Se comprobará la validez de todos los dígitos decimales. Si un
dígito decimal no es válido, se sustituye por un cero. Si un signo no es
válido, se forzará el signo a un código de signo positivo de hex 'F'. Si el
signo es válido, se cambiará por un signo hexadecimal positivo 'F' o un
signo hexadecimal negativo 'D' como corresponda. Si los datos empaque-
tados resultantes no son válidos, no se arreglarán.
TGTRLS
| Especifica el release del sistema operativo en el que se va a ejecutar el objeto
| que está creándose. En los ejemplos que se proporcionan para los valores
| *CURRENT y *PRV y cuando especifique el valor release-destino, se utiliza el
| formato VxRxMx para especificar el release, donde Vx es la versión, Rx es el
| release y Mx es el nivel de modificación. Por ejemplo, V2R3M0 es la versión
| 2, release 3, nivel de modificación 0.
| Los valores válidos para este parámetro cambian en cada release.
| Los valores posibles son los siguientes:
| *CURRENT
| El objeto se ha de utilizar en el release del sistema operativo que está eje-
| cutándose actualmente en el sistema. Por ejemplo, si está ejecutándose
| V2R3M5 en el sistema, *CURRENT significa que piensa utilizar el objeto
| en un sistema que tenga instalado V2R3M5. También puede utilizar el
| objeto en un sistema que tenga instalado cualquier release subsiguiente
| del sistema operativo.
| Nota: Si está ejecutándose V2R3M5 en el sistema y el objeto debe utili-
| zarse en un sistema que tenga instalado V2R3M0, especifique
| TGTRLS(V2R3M0) y no TGTRLS(*CURRENT).
| *PRV
| El objeto se ha de utilizar en el release anterior con el nivel de modifi-
| cación 0 del sistema operativo. Por ejemplo, si está ejecutándose V2R3M5
| en el sistema, *PRV significa que piensa utilizar el objeto en un sistema
| que tenga instalado V2R2M0. Puede utilizarse el objeto en un sistema que
| tenga instalado cualquier release subsiguiente del sistema operativo.
| release-destino
| Especifique el release con el formato VxRxMx. Puede utilizarse el objeto
| en un sistema que tenga instalado el realease especificado o cualquier
| release subsiguiente del sistema operativo.
| Los valores válidos dependen de la versión, release y nivel de modificación
| actual y cambian con cada nuevo release. Si especifica un nivel-release
| anterior al primer nivel de release que este mandato soporta, se envía un
| mensaje de error que indica el primer release que se soporta.
ALWNULL
| Especifica la forma en que se permitirá que el programa RPG ILE utilice los
| registros que contenga campos con posibilidad de nulos de archivos de bases
| de datos descritos externamente.
| *NO
| Especifica que el programa ILE RPG no procesará los registros con
| campos de valores nulos desde archivos descritos externamente.Si intenta
| recuperar un registro que contenga valores nulos, los datos del registro no
| serán accesibles al programa ILE RPG y se producirán errores de corre-
| lación de datos.
| *INPUTONLY
| Especifica que el programa RPG ILE puede leer de forma satisfactoria
| registros con campos con posibilidad de nulos que contengan valores nulos
| de archivos de bases de datos de sólo entrada descritos externamente.
| Cuando se recupera un registro que contiene valores nulos, no se pro-
| ducen errores de correlación de datos y los valores por omisión de la base
| de datos se colocan en cualquier campo que contenga valores nulos. El
| programa no puede realizar ninguna de las siguientes acciones:
| *USRCTL
| Especifica que el programa RPG ILE puede leer, escribir y actualizar regis-
| tros que contengan valores nulos de archivos de bases de datos descritos
| externamente. Los registros con claves nulas pueden recuperarse utili-
| zando operaciones en clave. El programa puede determinar si un campo
| con posibilidad de nulos realmente presenta un valor nulo y puede esta-
| blecer un campo con posibilidad de nulos para que muestre un valor nulo
| para la salida o la actualiación. Es responsabilidad del programador la
| verificación de que los campos que contienen valores nulos se utilicen de
| forma correcte en el programa.
| *YES
| Igual que *INPUTONLY.
BNDDIR
Especifica la lista de directorios de enlace que se utiliza en la resolución de
símbolos.
*NONE
No se especifica un directorio de enlace.
El nombre del directorio puede calificarse con uno de los valores de biblio-
teca siguientes:
*LIBL
El sistema busca en la lista de bibliotecas para encontrar la biblioteca en la
que está almacenado el directorio de enlace.
*CURLIB
Se busca en la biblioteca actual del trabajo. Si no se especifica una biblio-
teca como biblioteca actual del trabajo, se utiliza la biblioteca QGPL.
*USRLIBL
Sólo se busca en las bibliotecas de la parte de usuario de la lista de biblio-
tecas del trabajo.
nombre de la biblioteca
Especifique el nombre de la biblioteca en la que se ha de buscar.
ACTGRP
Especifica el grupo de activación al que está asociado este programa cuando
se le llama.
QILE
Cuando se llama a este programa, se activa en el grupo de activación
QILE.
*NEW
Cuando se llama a este programa, se activa en un nuevo grupo de acti-
vación.
*CALLER
Cuando se llama a este programa, se activa en el grupo de activación del
llamador.
| ENBPFRCOL
| Especifica si se habilita la recogida de rendimiento.
| *PEP
| Sólo se recogen datos para la estadística de rendimiento en la entrada y
| salida del procedimiento de entrada del programa. Esto es aplicable al
| procedimiento real de entrada del programa para un programa y no al pro-
| cedimiento principal de los módulos del programa. Este es el valor por
| omisión.
| *ENTRYEXIT
| Los datos para la estadística de rendimiento se recogen en la entrada y
| salida de todos los procedimientos del programa.
| *FULL
| Los datos para la estadística de rendimiento se recogen en la entrada y
| salida de todos los procedimientos del programa. Además, también se
| recogen datos estadísiticos antes y después de cada llamada a un proce-
| dimiento externo.
| DEFINE
| Especifica los nombres de condición que se definen antes de empezar la com-
| pilación. La utilización del parámetro DEFINE(nombre) es equivalente a la
| codificación de la directriz de nombre /DEFINE en la primera línea del archivo
| fuente.
| *NONE
| No se define ningún nombre de condición. Este es el valor por omisión.
| nombre-condición
| Pueden especificarse 32 nombres de condición como máximo. Cada
| nombre puede tener una longitud de hasta 50 caracteres. Se considera
| que los nombres de condición están definidos al inicio de la compilación.
Mandato CRTRPGMOD
El mandato Crear Módulo de RPG (CRTRPGMOD) compila el código fuente del
ILE RPG/400 para crear un objeto de tipo módulo (*MODULE). El diagrama de
sintaxis completo para el mandato CRTRPGMOD se muestra a continuación.
Trab: B,I Prog: B,I REXX: B,I Exec
55──CRTRPGMOD──┬───────────────────────────────────────────────────────┬───────────────────────────────────────────────5
│ ┌─\CURLIB/───────────┐ ┌─\CTLSPEC──────┐ │
└─MODULE(──┼────────────────────┼──┴─nombre-módulo─┴──)─┘
└─nombre-biblioteca/─┘
5──┬────────────────────────────────────────────────────────────────┬──────────────────────────────────────────────────5
│ ┌─\LIBL/─────────────┐ ┌─QRPGLESRC─────────────┐ │
└─SRCFILE(──┼────────────────────┼──┴─nombre-archivo-fuente─┴──)─┘
├─\CURLIB/───────────┤
└─nombre-biblioteca/─┘
(P) ──┬──────────────────────────────────────┬──────────────────────5
5──┬───────────────────────────────────────────────┬───
│ ┌─\MODULE───────────────────────┐ │ │ ┌─1ð───────────────────┐ │
└─SRCMBR(──┴─nombre-miembro-archivo-fuente─┴──)─┘ └─GENLVL(──┴─valor-nivel-gravedad─┴──)─┘
5──┬─────────────────────────────┬──┬────────────────────────────────────┬──┬──────────────────────────┬───────────────5
│ ┌─\SRCMBRTXT────┐ │ └─OPTION(──┤ Detalles de OPTION ├──)─┘ │ ┌─\STMT───┐ │
└─TEXT(──┼─\BLANK────────┼──)─┘ └─DBGVIEW(──┼─\SOURCE─┼──)─┘
└─'descripción'─┘ ├─\LIST───┤
├─\COPY───┤
├─\ALL────┤
└─\NONE───┘
5──┬────────────────────────┬──┬──────────────────────────┬──┬────────────────────────────────┬────────────────────────5
│ ┌─\PRINT─┐ │ │ ┌─\NONE──┐ │ │ ┌─\NONE──────────┐ │
└─OUTPUT(──┴─\NONE──┴──)─┘ └─OPTIMIZE(──┼─\BASIC─┼──)─┘ └─INDENT(──┴─valor-carácter─┴──)─┘
└─\FULL──┘
5──┬────────────────────────────────────────────────────────────────────────────────┬──────────────────────────────────5
│ ┌─\NONE──────────────────────────────────────────────────────────┐ │
└─CVTOPT(──┴─┬────────────────────────────────────────────────────────────┬─┴──)─┘
└─┬───────────┬──┬──────────┬──┬──────────┬──┬─────────────┬─┘
└─\DATETIME─┘ └─\GRAPHIC─┘ └─\VARCHAR─┘ └─\VARGRAPHIC─┘
5──┬────────────────────────────────────────────────────────────────────┬──┬──────────────────────────────────────┬────5
│ ┌─\HEX───────────────────────────────────────────────┐ │ │ ┌─\JOBRUN──────────────┐ │
└─SRTSEQ(──┼─\JOB───────────────────────────────────────────────┼──)─┘ └─LANGID(──┼─\JOB─────────────────┼──)─┘
├─\JOBRUN────────────────────────────────────────────┤ └─identificador-idioma─┘
├─\LANGIDUNQ─────────────────────────────────────────┤
├─\LANGIDSHR─────────────────────────────────────────┤
└─┬────────────────────┬──nombre-tabla-clasificación─┘
├─\LIBL/─────────────┤
├─\CURLIB/───────────┤
└─nombre-biblioteca/─┘
5──┬───────────────────────┬──┬──────────────────────────────────────────┬──┬────────────────────────┬─────────────────5
│ ┌─\YES─┐ │ │ ┌─\LIBCRTAUT──────────────────┐ │ │ ┌─\YES─┐ │
└─REPLACE(──┴─\NO──┴──)─┘ └─AUT(──┼─\ALL────────────────────────┼──)─┘ └─TRUNCNBR(──┴─\NO──┴──)─┘
├─\CHANGE─────────────────────┤
├─\USE────────────────────────┤
├─\EXCLUDE────────────────────┤
└─nombre-lista-autorizaciones─┘
5──┬────────────────────────┬──┬──────────────────────────┬──┬─────────────────────────────┬───────────────────────────5
│ ┌─\NONE──┐ │ │ ┌─\CURRENT─┐ │ │ ┌─\NO────────┐ │
| └─FIXNBR(──┴─\ZONED─┴──)─┘ └─TGTRLS(──┼─\PRV─────┼──)─┘ └─ALWNULL(──┼─\INPUTONLY─┼──)─┘
| └─VxRxMx───┘ ├─\USRCTL────┤
└─\YES───────┘
5──┬───────────────────────────────┬──┬──────────────────────────────────┬────────────────────────────────────────────5%
| │ ┌─\PEP───────┐ │ │ ┌─\NONE────────────┐ │
| └─ENBPFRCOL(──┼─\ENTRYEXIT─┼──)─┘ └─DEFINE(──┴─nombre-condición─┴──)─┘
| └─\FULL──────┘
Nota:
P Todos los parámetros anteriores a este punto pueden especificarse por posición
Detalles de OPTION:
| ┌─\XREF───┐ ┌─\GEN───┐ ┌─\NOSECLVL─┐ ┌─\SHOWCPY───┐ ┌─\EXPDDS───┐ ┌─\EXT───┐ ┌─\NOSHOWSKP─┐ ┌─\NOEVENTF─┐
├──┼─────────┼──┼────────┼──┼───────────┼──┼────────────┼──┼───────────┼──┼────────┼──┼────────────┼──┼───────────┼────┤
| └─\NOXREF─┘ └─\NOGEN─┘ └─\SECLVL───┘ └─\NOSHOWCPY─┘ └─\NOEXPDDS─┘ └─\NOEXT─┘ └─\SHOWSKP───┘ └─\EVENTF───┘
Prólogo
La sección del prólogo resume los parámetros del mandato y su valor tal como se
el analizador de mandatos CL los procesó. Si se especificó *CURLIB o *LIBL, se
lista el nombre de la biblioteca real. También se indica en el prólogo el efecto de
las alteraciones temporales. La Figura 212 muestra cómo interpretar la sección
del prólogo del listado para el programa MISRC, que se ha compilado utilizando el
mandato CRTRPGMOD.
| Mandato . . . . . . . . . . . . : CRTBNDRPG
Emitido por. . . . . . . . . . : MIIDUSUA
Programa . . . . . . . . . . . . : MISRC 2
Biblioteca . . . . . . . . . . : MIBIB
Texto 'descripción'. . . . . . . : \SRCMBRTXT
1 Cabecera de página
La información de cabecera de página incluye la línea de información
sobre el producto y el texto suministrado por una directiva /TITLE. El
apartado “Personalización de un listado del compilador” en la página 66
describe cómo puede personalizar la cabecera de página y el espaciado
del listado del compilador.
2 Módulo o programa
El nombre del objeto de módulo creado (si utiliza CRTRPGMOD) o el
nombre del objeto de programa creado (si utiliza CRTBNDRPG)
3 Miembro fuente
El nombre del miembro fuente desde el que se recuperaron los registros
fuente (puede ser distinto a 2 si utiliza mandatos de alteración
temporal).
4 Fuente
El nombre del archivo realmente utilizado para suministrar los registros
fuente. Si se altera temporalmente el archivo, se utiliza el fuente que lo
altera temporalmente.
5 Opciones del compilador
Las opciones del compilador vigentes en el momento de la compilación,
tal como se especifiquen en el mandato CRTRPGMOD o el mandato
CRTBNDRPG.
6 Marca de sangrado
El carácter utilizado para marcar operaciones estructuradas en la sección
del fuente del listado.
Sección de fuente
La sección del fuente muestra los registros que comprenden las especificaciones
fuente del ILE RPG/400. Los registros del miembro fuente raíz siempre se mues-
tran. Si OPTION(*EXPDDS) también se especifica, entonces la sección de fuente
muestra registros generados desde archivos descritos externamente, y los marca
con un '=' en la columna junto al número de línea. Estos registros no se muestran
si está especificado *NOEXPDDS. Si se especifica OPTION(*SHOWCPY),
entonces también muestra los registros de los miembros /COPY especificados en
el fuente, y los marca con un '+' en la columna junto al número de línea. Estos
registros no se muestran si se especifica *NOSHOWCPY.
La sección del fuente identifica los errores de sintaxis del fuente, e incluye una
tabla de campos de comparación cuando es necesario.
Fíjese en que los números de línea del listado reflejan el fuente compilado. Por
ejemplo, el programa MISRC tiene una sentencia /COPY en la línea 26. En el
miembro fuente raíz, la siguiente línea es una operación DOWEQ. En el listado,
sin embargo, la operación DOWEQ está en la línea 30. Las tres líneas que inter-
vienen que aparecen en el listado son del miembro fuente /COPY.
5 D
Azul S 4 DIM(5) CTDATA PERRCD(1) 96ð624 ððð5ðð
6 D
Verde S 2 DIM(5) ALT(Azul) 96ð624 ððð6ðð
7 D
Rojo S 4 DIM(2) CTDATA PERRCD(1) 96ð624 ððð7ðð
8 D
DSEXT1 E DS 1ðð PREFIX(BI_) 96ð624 ððð8ðð
\--------------------------------------------------------------------------------------------\ 3 1
\ Estructura datos . . . . . : DSEXT1 \ 1
\ Prefijo. . . . . . . . . . : BI_ \ 1
\ Formato externo . . . . . : REC1 : MIBIB/DSEXT1 \ 1
\ Texto formato. . . . . . . : INF.ALMACENAMIENTO INTERMEDIO \ 1
\--------------------------------------------------------------------------------------------\ 1
4
9=D BI_CPO1 5A CPOEXT (CPO1) ENTRADA DE TABLA 1 1
1ð=D BI_CPO2 1ðA CPOEXT (CPO2) DE FORMATO 1 2
11=D BI_CPO3 18A CPOEXT (CPO3) COINCIDENTE 1 3
12=IINREC 2 1
\--------------------------------------------------------------------------------------------\ 2
\ Formato registro RPG . . . : INREC \ 2
\ Formato externo . . . . . : INREC : MIBIB/ARCHEN \ 2
\--------------------------------------------------------------------------------------------\ 2
13=I 1 25 CPOA 2 2
14=I 26 9ð CPOB 2 3
15=IREC1 3 1
\--------------------------------------------------------------------------------------------\ 3
\ Formato registro RPG . . . : REC1 \ 3
\ Formato externo . . . . . : REC1 : MIBIB/CLVL6 \ 3
\--------------------------------------------------------------------------------------------\ 3
16=I \ISO-D 1 1ð FLD12 3 2
17=I 11 13 FLD13 3 3
18=I 14 17 FLD14 3 4
19=I 18 22 FLD15 3 5
2ð=IREC2 4 1
\--------------------------------------------------------------------------------------------\ 4
\ Formato registro RPG . . . : REC2 \ 4
\ Formato externo . . . . . : REC2 : MIBIB/CLVL6 \ 4
\--------------------------------------------------------------------------------------------\ 4
21=I \ISO-D 1 1ð CPO22 4 2
22=I 11 13 CPO23 4 3
23=I 14 17 CPO24 4 4
24=I 18 22 CPO25 4 5
Número <-------------------- Especificaciones fuente ----------------------------><--- Comentarios ---> Núm. Línea Fecha ID Número
línea ....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8....+....9....+...1ð Do pág. cambio SRC sec.
38=OOUTREC 6 1
\--------------------------------------------------------------------------------------------\ 6
\ Formato registro RPG . . . : OUTREC \ 6
\ Formato externo . . . . . : OUTREC : MIBIB/ARCHSAL \ 6
\--------------------------------------------------------------------------------------------\ 6
39=O CPOY 1ðð CHAR ðð 6 2
4ð=O CPOZ 132 CHAR 32 6 3
\ \ \ \ \ F I N D E F U E N T E \ \ \ \ \
1 Cabecera de fuente
Número de línea
Comienza por 1 y aumenta en 1 por cada registro fuente o registro
generado. Utilice este número al depurar utilizando números de
sentencia.
Línea de regla
Esta línea se ajusta cuando se especifica sangrado.
Número Do
Identifica el nivel de las operaciones estructuradas. Este número no
aparecerá si se solicita el sangrado.
Línea de página
Muestra las 5 primeras columnas del registro fuente.
ID de fuente
Identifica el fuente (/COPY o DDS) del registro. Para los miembros
/COPY, se puede utilizar para obtener el nombre de miembro
externo de la tabla de miembros /COPY.
Número de secuencia
Muestra el número de secuencia del SEU del registro de un
miembro de un archivo físico fuente. Muestra un número de incre-
M e n s a j e s d e d i a g n ó s t i c o a d i c i o n a l e s
\ \ \ \ \ F I N D E M E N S A J E S D E D I A G N O S T I C O A D I C I O N A L E S \ \ \ \
P o s i c i o n e s A l m a c e n a m i e n t o I n t e r m e d i o d e S a l i d a
Núm Pos Pos Campo o constante
Línea Inic. Final
8ð 1 3 RPTNUM
81 4 1ð3 RPTNAME
82 1ð4 2ð3 RPTADDR
83 2ð4 2ð9 AMOUNT
84 21ð 219 DUEDATE
\ \ \ \ \ F I N D E P O S I C I Ó N A L M A C E N A M I E N T O I N T E R M E D I O D E S A L I D A \ \ \ \ \
M i e m b r o s / C o p y
Número ID Nombre RPG <-------- Nombre externo-------> CCSID <- Ultimo cambio ->
línea Fte. Biblioteca Archivo Miembro Fecha Hora
26 5 MICOPI MIBIB QRPGLESRC MICOPI 37 95/12/3ð 11:55:2ð
\ \ \ \ \ F I N D E M I E M B R O S / C O P Y \ \ \ \ \
27 \\ 94ð6ð9 ðð18ðð
\--------------------------------------------------------------------\
\ Datos de tabla de orden de clasificación alternativo: \
\--------------------------------------------------------------------\
31 ALTSEQ 1122ACAB4B7C36F83A657D73 94ð6ð9 ðð19ðð
\--------------------------------------------------------------------\
\ Tabla de orden de clasificación alternativo: \
\ Número de caracteres con un orden alterado. . . . . . . . : 6 1 \
\ ð_ 1_ 2_ 3_ 4_ 5_ 6_ 7_ 8_ 9_ A_ B_ C_ D_ E_ F_ 2 \
\ _ð . . . . . . . . . . . . . . . . _ð \
\ _1 . 22 3 . . . . . . . . . . . . . _1 \
\ _2 . . . . . . . . . . . . . . . . _2 \
\ _3 . . . . . . . . . . . . . . . . _3 \
\ _4 . . . . . . . . . . . . . . . . _4 \
\ _5 . . . . . . . . . . . . . . . . _5 \
\ _6 . . . F8 . . . . . . . . . . . . _6 \
\ _7 . . . . . . . . . . . . . . . . _7 \
\ _8 . . . . . . . . . . . . . . . . _8 \
\ _9 . . . . . . . . . . . . . . . . _9 \
\ _A . . . 65 . . . . . . . . . . . . _A \
\ _B . . . . 7C . . . . . . . . . . . _B \
\ _C . . . . . . . . . . AB . . . . . _C \
\ _D . . . . . . . 73 . . . . . . . . _D \
\ _E . . . . . . . . . . . . . . . . _E \
\ _F . . . . . . . . . . . . . . . . _F \
\ ð_ 1_ 2_ 3_ 4_ 5_ 6_ 7_ 8_ 9_ A_ B_ C_ D_ E_ F_ \
\--------------------------------------------------------------------\
32 \\ ðððððð ðð2ððð
\--------------------------------------------------------------------\
\ Matriz. . . : AZUL Matriz alternativa . . . . : VERDE \
\--------------------------------------------------------------------\
33 1234ZZ ðððððð ðð21ðð
34 ABCDYY ðððððð ðð22ðð
35 5432XX ðððððð ðð23ðð
36 EDCBWW ðððððð ðð24ðð
\RNF8ð42 ðð 37 Registros de fuente insuficientes para cargar matriz/tabla.
37 \\ 94ð6ð8 ðð25ðð
\--------------------------------------------------------------------\
\ Matriz. . . : ROJA \
\--------------------------------------------------------------------\
38 3861 94ð6ð8 ðð26ðð
39 TKJL 94ð6ð8 ðð27ðð
\ \ \ \ F I N D A T O S T I E M P O C O M P I L A C I O N \ \ \ \ \
I n f o r m a c i ó n d e c a m p o s d e c l a v e
\ \ \ \ \ F I N I N F O R M A C I O N C A M P O S C L A V E \ \ \ \ \
Además, contiene campos locales que utiliza cada subprocedimiento. Utilice esta
tabla para comprobar dónde se utilizan los archivos, campos e indicadores en el
módulo/programa.
| Los nombres con una longitud superior a los 122 caracteres aparecerán divididos
| en varias líneas en la sección de referencias cruzadas. El nombre entero se impri-
| mirá con los caracteres '...' al final de las líneas. Si la parte final del nombre tiene
| una longitud superior a los 17 caracteres, los atributos y los números de línea se
| listarán empezando en la línea siguiente. La Figura 219 en la página 461 muestra
| un ejemplo del módulo TRANSRPT, que tiene dos subprocedimientos.
La parte sobre los procedimientos de enlace estático contiene el nombre del proce-
| dimiento, y las referencias al nombre de la operación CALLB o de la función incor-
| porada %PADDR, o el nombre de un procedimiento enlazado de prototipos al que
| CALLP ha llamado o que se encuentra dentro de una expresión.
Resumen de mensajes
El resumen de mensajes contiene totales ordenador por la gravedad de los errores
que se han producido. Si se especifica OPTION(*SECLVL), también proporciona
texto de mensajes de segundo nivel. La Figura 221 muestra un ejemplo.
R e s u m e n d e m e n s a j e s
\ \ \ \ \ F I N D E R E S U M E N D E M E N S A J E S \ \ \ \
Resumen final
La sección sobre el resumen final proporciona las estadísticas finales sobre los
mensajes y sobre el fuente También especifica el estado de la compilación. La
Figura 222 en la página 463 muestra un ejemplo.
Total de mensajes:
Información (ðð) . . . . . . . : 17
Aviso (1ð) . . . . . . . : ð
Error (2ð) . . . . . . . : ð
Error grave (3ð+) . . . . . . : ð
--------------------------------- -------
Total . . . . . . . . . . . . . : 17
Registros . . . . . . . . . . . : 5ð
Especificaciones. . . . . . . . : 39
Registros de datos. . . . . . . : 7
Comentarios . . . . . . . . . . : ð
\ \ \ \ \ F I N D E R E S U M E N F I N A L \ \ \ \ \
Programa MISRC ubicado en biblioteca MIBIB. ðð nivel de gravedad más alto. Creado el 95/12/3ð a las 17:44:55.
\ \ \ \ \ F I N D E C O M P I L A C I O N \ \ \ \ \
Bibliografía 467
con funciones de soporte, realizar la limpieza del Tape and Diskette Device Programming,
sistema, etcétera. SC41-4716, proporciona información para ayudar a
los usuarios a desarrollar y dar soporte a pro-
Puesta a punto del sistema y gestión de problemas,
gramas que utilizan dispositivos de cinta y disquete
SC10-9623 (SC41-4206), proporciona información
para E/S. Incluye información sobre archivos y
sobre el panel de control de la unidad del sistema,
descripciones de dispositivo para dispositivos de
cómo arrancar e interrumpir el sistema, utilizar
cinta y disquete.
cintas y disquetes, trabajar con arreglos temporales
del programa y manejar problemas.
Índice 471
Cambiar programa de servicio (CHGSRVPGM), CL de ILE
mandato 102 como lenguaje ILE 17
cambiar valores de campos al depurar 210 como módulo en programa ILE 28
cambio de nombre de formato de registro 272 en aplicación avanzada 31
campo en aplicación en lenguaje mixto 30
cambiar el valor al depurar 210 llamada a un programa en RPG 25
igualar a un nombre al depurar 213 llamada a un programa ILE RPG/400 29
longitud variable 278 manejo inesperado de excepciones de estado y de
mantener valores actuales al depurar 166 notificación 253
visualizar al depurar método para pasar parámetros 152
como valores hexadecimales 207 CL, mandatos
en formato de caracteres 207 ADDRPLYE 111
utilizar EVAL 201 Añadir programa (ADDPGM) 174
visualizar atributos de un campo 212 Arrancar Depuración (STRDBG) 171, 173
campos de longitud variable 278 autorización xiii
campos numéricos CALL 105
generador automático de informes Cambiar Módulo (CHGMOD) 90
cancelar manejador 221 CRTRPGMOD 76
CEERTX (Registrar procedimiento de salida de CVTRPGSRC 406
usuario de finalización de entrada de pila de lla- CHGPGM 91
madas) 249 DSPMOD 154
CEEUTX (Procedimiento de salida de usuario de DSPPGMREF 154
finalización de entrada de pila de llamadas) 249 Eliminar programa (RMVPGM) 174
ejemplo 250 Finalizar Depuración (ENDDBG) 171
utilizar 249 lectura de diagramas de sintaxis 431
CEE4ABN 160 mandato CRTPGM 84
CEECRHP (Crear área de almacenamiento dinámico), mandatos adicionales de programa de servicio 95
API enlazable 20, 122 mandatos utilizados con frecuencia 13
CEECZST (Reasignar almacenamiento), API MONMSG 253
enlazable 21 RCLACTGRP 112
CEEDOD (Recuperar información del descriptor ope- RCLRSC 115
rativo) 96 relacionados con el programa 88
descriptores operativos 143 relacionados con módulos 83
ejemplo 144 UPDPGM 89
CEEDSHP (Eliminar área de almacenamiento diná- utilización 431
mico), API enlazable 20, 122 Visualizar Fuente de Módulo (DSPMODSRC) 173,
CEEFRST (Liberar almacenamiento, API enlazable 20 174, 175, 177
CEEGTST (Obtener almacenamiento de área de alma- WRKRPLYE 111
cenamiento dinámico), API enlazable 20, 122 clave
CEEHDLR (Registrar Manejador de Condiciones Véase también argumento de búsqueda
ILE) 243 compuesta 295
CEEHDLU (Eliminar del Registro Manejador de Con- para un registro o archivo 294
diciones ILE) 243 parcial 295
CEERTX (Registrar procedimiento de salida de usuario clave parcial 295
de finalización de entrada de pila de llamadas) 249 claves válidas
CEESGI (Obtener Información de Descripción acerca para archivo 294
de un Argumento de Serie) 143 para registros 294
CEETREC 160 CLEAR, mandato de depuración
CEETSTA (Comprobar argumento omitido) 144 definición 166
CEEUTX (Procedimiento de salida de usuario de finali- eliminar todos 189
zación de entrada de pila de llamadas) 249 utilizar 181, 183, 188
ciclo de programa códigos de estado
control de compromiso 325 errores de gestión de datos 398
descripción general 4 códigos de operación 357
lógica de obtención de desbordamiento 333 discusión general 6
último ciclo 6 permitido con archivo DISK 317
Índice 473
corregir errores de compilación 68 Crear programa límite en RPG (CRTBNDRPG),
corregir errores en tiempo de ejecución 70 mandato (continuación)
creación de programas crear programas 59
compatible con OPM 23 descripción de parámetros 434
creación 23 diagrama de sintaxis 432
estrategia que debe evitar 32 e ILE 18
consideraciones acerca de la codificación 46, 47 ejemplos
ejemplos de 62, 63, 87 programa compatible con OPM 63
estrategia que debe evitar 32 programa con enlace estático 63
estrategias para 23 programa para depuración del fuente 62
ILE aplicación utilizando CRTRPGMOD 28 estrategia de creación de programas 23, 25
mandato CRTPGM 84 parámetros agrupados por funciones 60
utilización de CRTBNDRPG 25 utilizar 59
utilizando CRTRPGMOD y CRTPGM 75 valores por omisión de parámetros 60
utilizar proceso de un solo paso 59 crear un archivo físico fuente 53
creación de programas de servicio crear un listado del enlazador 88
acerca de 93 crear un programa con el mandato CRTBNDRPG 59
métodos 94 crear una biblioteca 53
creación de un módulo CRTBNDRPG, mandato
discusión general 75 Véase Crear programa límite en RPG
utilizando CRTRPGMOD 76 (CRTBNDRPG), mandato
utilizando valores por omisión de CRTRPGMOD 78 CRTPGM, mandato
creación de una vista de depuración Véase Crear programa (CRTPGM), mandato
COPY 169 CRTRPGMOD, mandato
fuente raíz 169 Véase Crear módulo RPG (CRTRPGMOD), mandato
listado 170 CRTRPTPGM (crear programa generador automático
sentencias 171 de informes), mandato
Crear área de almacenamiento dinámico (CEECRHP), conversión de miembros del generador automático
API enlazable 20, 122 de informes 413
Crear módulo RPG (CRTRPGMOD), mandato CRTSRVPGM, mandato
agrupación de parámetros por función 76 Véase Crear programa de servicio (CRTSRVPGM),
descripción de parámetros 449 mandato
diagrama de sintaxis 448 CTDATA, palabra clave
e ILE 18 CVTOPT, parámetro
ejemplos 99, 100 diferencias entre ILE RPG/400 y OPM
estrategia de creación de programas 28 RPG/400 395
utilizar 76 mandato CRTBNDRPG 60, 440
valores por omisión 78 mandato CRTRPGMOD 76
valores por omisión de parámetros 76 manejo de campos de longitud variable 278
Crear programa (CRTPGM), mandato 28 CVTRPGSRC (Convertir RPG fuente), mandato
acciones del sistema 86 descripción de parámetros 407
crear un programa 75 diagrama de sintaxis 406
e ILE 18 ejemplo 412
ejemplos 100 utilización de los valores por omisión de
enlazar varios módulos 87 mandatos 411
parámetros 85 valores por omisión del parámetro 406
utilizar 84 CVTRPT, parámetro 410, 413, 418
Crear programa de servicio (CRTSRVPGM), mandato
e ILE 18
ejemplo 99 CH
parámetros 95 CHGMOD, mandato
Crear programa límite en RPG (CRTBNDRPG), Véase Cambiar módulo (CHGMOD), mandato
mandato CHGPGM, mandato
área de datos RETURNCODE 72 Véase Cambiar programa (CHGPGM), mandato
coordinar opciones de listado con vista de depu- CHGSRVPGM
ración 71 Véase Cambiar programa de servicio
(CHGSRVPGM), mandato
Índice 475
depuración del fuente (continuación) detectar errores en un programa 165
visualizar datos direccionados por punteros 208 DETL 242
visualizar datos y expresiones 201 DFTACTGRP en CRTBNDRPG, parámetro
visualizar el contenido de una matriz 203 'descripción' 436
visualizar el contenido de una tabla 204 ejecutar OPM por omisión 113
visualizar estructuras de datos de múltiples apari- utilizar 59, 63
ciones 205 diagnosticar errores en un programa 165
visualizar indicadores 206 diagrama de flujo
depuración, funciones incorporadas desbordamiento, lógica de obtención de 333
%ADDR 208 diagramas de sintaxis
%INDEX 208 interpretación 431
%SUBSTR 208 mandato CRTBNDRPG 432
%VARS 208 Mandato CRTRPGMOD 448
cambiar valores utilizando %SUBSTR 210 mandato CVTRPGSRC 406
ejemplos 209 diferencias de compatibilidad entre OPM RPG/400 e
depuración, mandatos ILE RPG/400 395
ATTR 212 diferencias de comportamiento entre OPM RPG/400 e
CLEAR 181 ILE RPG/400 395
discusión general 166 Diferencias de E/S entre ILE RPG/400 y OPM
DISPLAY 177 RPG/400 397
EQUATE 213 diferencias entre OPM y RPG/400 de ILE
EVAL 201, 210 diferencias de funcionamiento 395
igualar a un nombre al depurar 213 manejo de excepciones 226
STEP 195, 196 diferentes vistas de un módulo 178
STEP INTO 197 dinámico, almacenamiento 115
STEP OVER 197 dirección
WATCH 189 directivas del compilador
depuración, vista cambiar una cabecera del listado 66
cambiar al depurar 178 directivas condicionales del compilador
definición 168 diseño de aplicaciones
fuente COPY 169 Véase creación de programas
fuente raíz 169 DISK, archivo
listado 170 códigos de operación de archivo permitidos
por omisión 171 para métodos de proceso por clave 317
sentencias 171 para métodos de proceso sin clave 317
depurador de fuente de ILE descripción general 289
descripción 165 descrito externamente
iniciar 171 como descrito por programa 270
mandatos de depuración 166 descripción general 290
desbordamiento ejemplos 291
indicadores 329 especificaciones de formato de registro 290
página 328 vía de acceso 291
desbordamiento de página en archivo PRINTER 328 descrito por programa
DESCEND, palabra clave archivo de direcciones de registros 300
descomprimir un objeto 91 archivo indexado 297
descripción de parámetros archivo secuencial 300
mandato CRTBNDRPG 434 proceso 302
mandato CRTRPGMOD 449 especificaciones de formato de registro 290
mandato CVTRPGSRC 407 métodos de proceso
descriptores operativos proceso al azar por clave 311
definición 142 proceso consecutivo 303
ejemplo 96 proceso por número relativo de registro 315
DETAIL, parámetro proceso secuencial entre límites 312
crear un listado del enlazador 88 proceso secuencial por clave 303
DETC 242 DISPLAY, mandato de depuración
definición 166
Índice 477
eliminar objetos de una sesión de depuración 174 especificaciones (continuación)
ENBPFRCOL, parámetro formato de registro 290
CRTBNDRPG, mandato 60, 446 orden 3
CRTRPGMOD, mandato 76 tipos 3
encabezamiento de página 66 especificaciones adicionales
enlace lógico problemas de conversión 417, 425
definición 83 especificaciones de cálculo
después de modificar un módulo 89 archivo WORKSTN descrito por programa 356
módulos a un programa 83 descripción general 3
programa de servicio a programa 100 especificaciones de control
enlace lógico estático consideraciones acerca de la conversión 404
Véase enlace lógico descripción general 3
enlazador, listado ejemplo 8
básico 103 especificaciones de definición
como recurso de mantenimiento 89 descripción general 3
crear 88 especificaciones de descripción de archivo
determinar exportaciones en programa de control de compromiso 321
servicio 93 descripción general 3
secciones de 88 para archivos descritos externamente 272
enlazar varios módulos 87 especificaciones de descripción de datos (DDS)
ENTMOD, parámetro 85 Véase la referencia DDS
entorno especificaciones de encabezamiento
Véase Integrated Language Environment (ILE) Véase especificaciones de control
entrada especificaciones de entrada
archivo 356 Véase también indicadores
ENTRY PLIST 156 descripción general 3
EQUATE, mandato de depuración especificaciones de salida
definición 166 archivo WORKSTN descrito por programa 354
ejemplo 213 con descripciones externas 276
utilizar 213 descripción general 3
error de función no manejado 229 ejemplo 9
errores especificar el formato del listado del compilador 66
Véase también excepción especificar indicadores de error 231
corregir los de compilación 68 especificar un grupo de activación 112
corregir, en tiempo de ejecución 70 especificar un punto de retorno 242
de archivo 224 establecer opciones de depuración 173
de programa 224 establecer pasos al depurar
errores de compilación, corregir 68 en un programa 195
errores de enlace del listado del compilador 463 en un programa o procedimiento 197
errores de generación de código del listado del compi- un programa o procedimiento 197
lador 463 establecer puntos de interrupción
errores en tiempo de ejecución, corregir con un listado acerca de 180
del compilador 70 condicional 182
especificación de procedimiento ejemplo 181, 184
especificaciones puntos de interrupción incondicionales 181
Véase también especificación de procedimiento utilizando números de sentencia 187
Véase también especificaciones de cálculo estrategias para crear programas en ILE 23
Véase también especificaciones de control estructura de datos de estado del programa
Véase también especificaciones de definición ejemplo 155, 236
Véase también especificaciones de descripción de utilizar en una subrutina de error 236
archivo estructura de datos de información de archivos
Véase también especificaciones de entrada ejemplo 233
Véase también especificaciones de salida utilizar en una subrutina de error 232
archivo descrito externamente 272 estructuras de datos
descripción de 3 apariciones múltiples
descripción de archivo 272 visualizar al depurar 205
Índice 479
ILE
G Véase Integrated Language Environment (ILE)
GDDM 162 ILE C/400
generación de un programa como lenguaje ILE 17
Véase compilación en aplicación avanzada 31
Véase especificaciones de control en aplicación en lenguaje mixto 30
GENLVL, parámetro fuente del módulo en ejemplo de depuración 219
mandato CRTBNDRPG 60, 435 método para pasar parámetros 152
mandato CRTRPGMOD 76 ILE COBOL/400
gestión de almacenamiento como lenguaje ILE 17
asignar durante la ejecución 122 método para pasar parámetros 152
dinámico 115 ILE RPG/400
gestionar en ejecución 115 comportamiento de los módulos enlazados 83
gestión de datos distribuidos (DDM) conversión a 401
archivos 326 diferencias de funcionamiento entre OPM
gestión de programas 19 RPG/400 395
gestionar almacenamiento en la ejecución 115 operaciones de gestión de datos 280
gestionar el área de almacenamiento dinámico por programa de ejemplo 7
omisión utilizando operaciones RPG 116 tipos de dispositivo a los que se da soporte 327
gestionar grupos de activación 112 visión general del lenguaje RPG IV 3
Gestor de Representación Gráfica de Datos visión general del manejo de excepciones 224
(GDDM) 162 incluir vista del fuente, crear 169
Gestor para el Desarrollo de Aplicaciones para INDENT, parámetro 170
OS/400 14 mandato CRTBNDRPG 60, 439
grupo de activación mandato CRTRPGMOD 76
*CALLER 113 indicador de retorno (RT)
con nombre 85 utilizado para finalizar un programa o
definición 112 procedimiento 157, 158, 159
ejecutar en OPM por omisión 113 indicador de último registro (LR)
especificar 112, 113 utilizado para finalizar un programa o
finalizar 113 procedimiento 157, 158, 159
función en manejo de excepciones 222 indicadores
gestionar 112 Véase también códigos de operación individuales
identificar 85, 112 como indicadores de error 231
*NEW 85 desbordamiento
OPM por omisión 113 con archivo PRINTER 328
por omisión 23, 32 descripción general 328
QILE 85, 112 ejemplos 332, 333
suprimir 112, 114 lógica de obtención de desbordamiento 332
grupo de activación con nombre 112 presencia o ausencia de 330
grupo de activación por omisión 23, 32, 113 relación con el ciclo del programa 333
ejecutar en 113 valores de 333
descripción general 6
error 231
H parada (H1-H9)
H1-H9
utilizado para finalizar un programa o proce-
Véase indicadores de parada (H1-H9)
dimiento 157, 158, 159
retorno (RT)
I utilizado para finalizar un programa o proce-
ICF archivo de comunicaciones 345 dimiento 157, 158, 159
identificar un grupo de activación 112 tecla de función (KA-KN, KP-KY)
ignorar formato de registro 273 último registro (LR)
IGNORE, palabra clave 273 utilizado para finalizar un programa o proce-
igualar un nombre a un campo, expresión o dimiento 157, 158, 159
mandato 213 utilización 6
visualizar al depurar 206
Índice 481
listado del compilador (continuación) llamadas estáticas 19, 132
sangrar operaciones estructuradas 67 llamadas, pila 133, 222
secciones de 65, 452 llamar a una rutina de gráficos 162
utilizar 65
utilizar como documentación 71
listado del enlazador M
básico 103 mandato creado por el usuario, ejecutar un programa
como recurso de mantenimiento 89 RPG 110
crear 88 mandatos
determinar exportaciones en programa de Véase CL, mandatos
servicio 93 depuración, mandatos
secciones de 88 manejador de condiciones 221
LOGFILE, parámetro 410 ejemplo 243
LOGMBR, parámetro 411 llamadas recurrentes 243
longitud de registros de archivo, consideraciones de registrar 243
conversión 402 traspasar una excepción 244
longitud de registros de un archivo, consideraciones de visión general 243
conversión 402 manejador de excepciones
LR (último registro), indicador específico de RPG 224, 230
Véase indicador de último registro (LR) prioridad 227
manejador de excepciones por omisión de RPG 224
manejo de campos de longitud variable 278
LL manejo de errores
llamada a programas/procedimientos Véase manejo de excepciones/errores
devolver valores 138 manejo de excepciones/errores
en el ILE 19 Véase también manejo de excepciones/errores
llamada de formato fijo 153 consideraciones acerca de la optimización 230
llamada de formato libre 138 consideraciones generales 226
llamadas entre lenguajes 152 diferencias entre el de ILE RPG/400 y el de OPM
llamadas estáticas 132 RPG/400 226
llamadas recurrentes 134 diferencias entre ILE RPG/400 y OPM
llamar a API enlazables 160 RPG/400 396
llamar a gráficos 162 especificar un punto de retorno 242
llamar a procedimientos 132 específico de RPG 224
llamar a programas 132 evitar un bucle 239
llamar a rutinas especiales 162 indicadores de error 231
métodos para pasar parámetros 140 manejador de cancelación 249
pila de llamadas 133 manejador de condiciones 243
terminación anormal de programa o no manejada 227
procedimiento 158 palabra clave NOOPT 230
terminación normal de programa o subrutina de error *PSSR 236
procedimiento 157 subrutina de error/excepción de archivo
utilizar la operación CALL 153 (INFSR) 232
utilizar la operación CALLB 153 tipos 221
visión general 131 traspaso 222
volver de un programa o procedimiento visión general 222
llamado 156 visión general de subrutina de error/excepción 231
volver sin finalizar 159 mantenimiento de la compatibilidad con OPM 63, 114
llamada de prototipos matriz
orden de evaluación de parámetros 151 archivo
llamada estática a procedimiento 132 carga 429
llamadas a punteros de procedimientos 132 matrices en tiempo de preejecución 429
llamadas dinámicas 19, 132 nombre
Véase también programas/procedimientos, llamada problemas de conversión 427
llamadas entre lenguajes 152 tiempo de ejecución
visualizar al depurar 203
Índice 483
Obtener Información de Descripción acerca de un Argu- orden de clasificación (continuación)
mento de Serie (CEESGI) 143 consideraciones de depuración 185
obtener un listado del compilador 65 efecto de los parámetros SRTSEQ 288
OFL 242 Tabla ALTSEQ del listado del compilador 458
OMIT, palabra clave 144 orden de clasificación alternativo
opción de control de impresora consideraciones de depuración 185
Véase PRTCTL orden de evaluación
operaciones de archivo en llamada de prototipos 151
permitido con archivo DISK 317 OUTPUT, parámetro
permitido con archivo PRINTER 328 mandato CRTBNDRPG 60, 439
permitido con archivo secuencial 339 mandato CRTRPGMOD 76
permitido con archivo SPECIAL 341, 342 utilizar 65
permitido con archivo WORKSTN 357
operaciones de archivo válidas
archivo SPECIAL 342 P
operaciones de gestión de datos 280 PACKEVEN, palabra clave
operaciones de llamada palabras clave
consultar nombres de procedimientos llamados 154 Véase también ?
DSPPGMREF 154 Véase también palabras clave de especificación de
llamada de formato libre 138 control
llamadas a programas 153 Véase también palabras clave de especificación de
llamadas de formato fijo 153 procedimiento
rutinas especiales 162 ALT
utilización 138 DDS 289
operaciones de programación estructuradas EXPORT 86
operaciones estructuradas NOOPT 90, 230
sangrar 67 OMIT 144
operativos, descriptores para archivo de dispositivo de pantalla
definición 142 CLEAR 349
ejemplo 96 HELP 349
OPM, grupo de activación por omisión 23, 32 HOME 349
ejecutar en 113 PRINT 349
OPM, mantenimiento de la compatibilidad 63, 114 ROLLDOWN 349
optimización ROLLUP 349
consideraciones acerca del manejo de para línea de continuación 289
excepciones 230 CLEAR 349
definición 90 HELP 349
efecto sobre los campos al depurar 166 HOME 349
nivel de PRINT 349
comprobar 90 ROLLDOWN 349
de un objeto, cambiar 90 ROLLUP 349
OPTIMIZE, parámetro palabras clave de especificación de control
mandato CRTBNDRPG 60, 439 palabras clave de especificación de procedimiento
mandato CRTRPGMOD 76 parámetro de área para SPECIAL PLIST 341
OPTION, parámetro parámetro de estado de retorno 340
coordinar con opciones de vista de depuración 71 parámetros de prototipos
coordinar listado y opciones de vista de parámetros omitidos 144
depuración 170 OMIT 144
mandato CRTBNDRPG 60, 436 parámetros, descripciones
mandato CRTRPGMOD 76 mandato CRTBNDRPG 434
utilizar 66, 71 mandato CRTRPGMOD 449
OPTIONS, palabra clave mandato CVTRPGSRC 407
*NOPASS 145 parámetros, tabla
*OMIT 144 mandato CRTBNDRPG 60
orden de clasificación mandato CRTRPGMOD 76
Véase también orden de clasificación alternativo mandato CVTRPGSRC 406
Índice 485
programa (continuación) programa fuente (continuación)
estrategia de creación de programas 23, 32 conversión de algunos miembros 412
estructura interna 83 conversión de miembros fuente del generador auto-
finalizar 111 mático de informes 413
ILE avanzado 31 conversión de todos los miembros 412
lenguaje combinado 30 entrada en el sistema 53
lenguaje simple 29 entrar sentencias SQL 57
efecto del ILE 26 longitud de registros durante la conversión 402
liberar recursos 115 nombres de archivo y miembro durante la
llamada utilizando la operación CALLP 138 conversión 403
llamar 131, 132 RPG
llamar utilizando expresiones 138 tipos de miembros fuente durante la
llamar utilizando la operación CALL 153 conversión 402
mandatos CL relacionados 88 programa o procedimiento de prototipos
modificar 89 llamada de prototipos 34
múltiples módulos programa, activación 112
estrategia de creación general 28 programa, ciclo
pasar parámetros 136 control de compromiso 325
preparar para depuración 168 descripción general 4
procedimiento de entrada del programa 83 lógica de obtención de desbordamiento 333
reducir tamaño 91 último ciclo 6
saltar 197 programa, creación
seguir los pasos 195 compatible con OPM 23
terminación anormal 158 creación 23
terminación normal 157 estrategia que debe evitar 32
ver fuente al depurar 176 consideraciones acerca de la codificación 46, 47
volver de 156 ejemplos de 62, 63, 87
volver sin finalizar 159 estrategia que debe evitar 32
programa de generación automática de informes estrategias para 23
conversión al ILE RPG/400 413 ILE aplicación utilizando CRTRPGMOD 28
especificaciones generadas mandato CRTPGM 84
programa de lenguaje de control (CL) utilización de CRTBNDRPG 25
Véase también CL de ILE utilizando CRTRPGMOD y CRTPGM 75
como módulo en un programa ILE 28 utilizar proceso de un solo paso 59
en aplicación compatible con OPM 23 programas de ejemplo
mandatos utilizados con frecuencia 13 Véase ejemplos
mandatos utilizados con RPG/400 13 programas de servicio, creación
programa de servicio acerca de 93
actualizar 102 métodos 94
añadir a una sesión de depuración 174 programas, gestión 19
crear 93 programas/procedimientos, llamada
ejemplo 96 devolver valores 138
ejemplo de listado del enlazador 103 en el ILE 19
en aplicación avanzada 31 llamada de formato fijo 153
enlazar con CRTBNDRPG 63 llamada de formato libre 138
lenguaje enlazador 99 llamadas entre lenguajes 152
mandatos CL relacionados 95 llamadas estáticas 132
métodos para crear 94 llamadas recurrentes 134
modificar 95 llamar a API enlazables 160
razones para utilizar 93 llamar a gráficos 162
reclamar recursos 114 llamar a procedimientos 132
programa de utilidad para entrada del fuente (SEU) 53 llamar a programas 132
entrar fuente 54 llamar a rutinas especiales 162
examinar un listado del compilador 70 métodos para pasar parámetros 140
programa fuente pila de llamadas 133
conversión al ILE RPG/400 404 terminación anormal de programa o
procedimiento 158
Índice 487
restricciones de conversión de códigos 423 SRCMBR, parámetro
resumen de mensajes del listado del compilador 462 mandato CRTBNDRPG 60, 435
resumen final del listado del compilador 462 mandato CRTRPGMOD 76
retorno desde un programa llamado 156 SRTSEQ, parámetro
RETURN (devolver al llamador), código de operación consideraciones de depuración 185
ROLBK (retrotraer), código de operación efecto en las comparaciones de clave 288
RPG IV mandato CRTBNDRPG 60, 440
Véase también ILE RPG/400 mandato CRTRPGMOD 76
características de RPG III no soportadas 423 STEP, mandato de depuración
conversión a 23, 25, 401 definición 167
diferencias de funcionamiento entre RPG III 395 en 197
visión general 3 saltar 197
RT (retorno), indicador STRDBG, mandato
Véase indicador de retorno (RT) Véase Iniciar depuración (STRDBG), mandato
Rutinas de Gráficos de Presentación (PGR) 162 STRSEU (mandato editar fuente) 54
rutinas especiales, llamar a 162 subarchivos
códigos de operación de archivo permitidos
con 351
S descripción general 350, 351
sangrar operaciones estructuradas en el listado del descripciones 350
compilador 67 ejemplos 353
sección de fuente del listado del compilador 454 formato de registro 350
sección de mensajes de diagnóstico adicionales del formato de registro de control 350
listado del compilador 457 utilizaciones de 353
sección del prólogo del listado del compilador 452 subcampos
sección fuente principal para estructura de datos de estado del
SECLVL, parámetro 410 programa 258
secuencia ascendente para estructura de datos de información de
SEQ, archivo archivo 260, 261
códigos de operación de archivo permitidos 339 para PRTCTL 335
descripción general 338 subprocedimientos
diagrama de proceso 339 ámbito de archivos 83
ejemplo 339 consideraciones acerca de la codificación 47
longitud variable 338 datos locales en listado de vuelco 264
restricciones 338 depuración 200
Servicios de Diccionario de Aplicaciones para ejemplo 10
OS/400 14 entrar en 197
SEU flujo de lógica 6
Véase programa de utilidad para entrada del fuente información en el listado del compilador 461
(SEU) saltar 197
sin datos de depuración 168 visión general 33
sintaxis de formato libre volver de 159
soporte de gráficos 162 SUBR23R3 (recuperación de mensajes) 162
Soporte de Idiomas Nacionales (NLS) del depurador de SUBR40R3 (manipulación de variables Caracteres de
fuentes 214 doble byte) 162
SPECIAL, archivo SUBR41R3 (manipulación de variables Caracteres de
operaciones de archivo válidas 342 doble byte) 162
supresión de registros de 342 subrutina de condición de excepción/error del programa
visión general 340, 342 descripción 236
spooling 287 ejemplo 236
spooling de salida 287 subrutina de excepción/error de archivos (INFSR)
SQL descripción 232
Véase DB2/400 SQL ejemplo 233
SRCFILE, parámetro especificaciones 232
mandato CRTBNDRPG 60, 434 subrutinas
mandato CRTRPGMOD 76 de error de archivo (INFSR) 232
Índice 489
vista de depuración WORKSTN, archivo (continuación)
cambiar al depurar 178 ejemplos 361
definición 168 indicadores de tecla de función con 348
fuente COPY 169 múltiples dispositivos 358
fuente raíz 169 proceso 357
listado 170 programa de ejemplo de proceso de
por omisión 171 subarchivo 376
sentencias 171 subarchivos
vista de sentencia ejemplos 353
creación 171 formato de registro 350
utilizando para depuración 187 formato de registro de control 350
vista del fuente raíz, crear 169 para archivo de dispositivo de pantalla 350
vista del listado, crear 170 utilizaciones de 353
visualizar atributos de un campo 212 utilización 346
visualizar datos y expresiones al depurar 201 WRKRPLYE, mandato
Visualizar módulo (DSPMOD), mandato 154 Véase Trabajar con entrada de lista de respuestas
Visualizar módulo fuente (DSPMODSRC), (WRKRPLYE), mandato
mandato 173, 174, 175, 177
Visualizar programa (DSPPGM), mandato
determinar nivel de optimización 90
Visualizar programa de servicio (DSPSRVPGM),
mandato 93
Visualizar referencias del programa (DSPPGMREF),
mandato 154
volver a enlazar 89
volver de un procedimiento principal 157
volver de un procedimiento principal llamado 156
volver de un subprocedimiento 159
volver sin finalizar 159
volver utilizando API ILE enlazables 160
vuelco con formato 257
W
WORKSTN, archivo
códigos de operación de archivo permitidos
con 357
definición 346
descrito externamente
proceso 349
descrito por programa
archivo combinado 357
archivo de entrada 356
archivo de salida 356
con nombre de formato 354
consideraciones 356
especificaciones de cálculo 356
especificaciones de entrada 355
especificaciones de salida 354
general 354
sin nombre de formato 356
descritos externamente 346
ejemplo de programa de consulta 363
ejemplo de programa de consulta y búsqueda 383
ejemplo de programa de mantenimiento de
datos 366
Comentarios y sugerencias:
Nombre Dirección
Compañía u Organización
Teléfono
Corte o Doble
Hoja de Comentarios
IBM
Por la Línea
SC10-9659-01
Dóblese por la línea de puntos Por favor no lo grape Dóblese por la línea de puntos
PONER
EL
SELLO
AQUÍ
IBM, S.A.
National Language Solutions Center
Av. Diagonal, 571
08029 Barcelona
España
Dóblese por la línea de puntos Por favor no lo grape Dóblese por la línea de puntos
Corte o Doble
SC10-9659-01 Por la Línea
IBM
SC1ð-9659-ð1