Sie sind auf Seite 1von 17

Lenguaje RPG

RPG es un lenguaje de programacion de IBM orientado al desarrollo de aplicaciones empresariales, y que es muy usado en la plataforma de servidores intermedios de IBM. Ha sido la base de los antiguos sistemas S/32, S/34, S/36, S/38, AS/400, iSeries, System i, as como de la nueva plataforma Power 7. En el curso del tiempo ha tenido incontables mejoras continuas hasta convertirlo en lo que es hoy, un lenguaje muy poderoso para hacer aplicaciones de negocios. Es un lenguaje "propietario", inventado por IBM para facilitar la programacin de tareas de negocio en las Empresas. La historia del lenguaje RPG est llena de continuas mejoras y versiones, y la realidad ahora es que es la base (junto con Cobol) de los programas que funcionan en muchas empresas. En los ltimos aos, IBM ha mejorado en mucho RPG, ahora llamado RPG IV o RPG ILE, dotndolo de muchas opciones y funciones (como rpg-free y %bifs), mejoras en el compilador y creando el entorno ILE para facilitar la programacin ms estructurada y la combinacin de mltiples lenguajes, como Java, C++, etc. Un ejemplo de la flexibilidad y potencia de RPG es RpgForWeb, un entorno que facilita la creacin de Aplicaciones Web usando RPG IV y el estndar de la Web; html y javascript. Las Aplicaciones se pueden desarrollar con muchos lenguajes, incluso puede ser bueno combinar varios lenguajes en una Aplicacin, y en la mayora de las ocasiones no importa tanto el lenguaje con el que est desarrollada una Aplicacin como el conocimiento del medio y la inteligencia del programador.

tema del mes


El ILE en accin

68
noviembre 1996

En los AS/400 CISC, la V3R1 ha demostrado que es estable y pronto ser sustituida por la V3R2; en los AS/400 RISC, que iniciaron su andadura con la V3R6, pronto dispondrn de la nueva V3R7: Muchos de nosotros hemos instalado alguna de estas releases o lo haremos muy pronto. De hecho, la consultora Gartner Group opina que a nivel mundial, y antes de que finalice 1996, estarn en produccin (no las que se habrn vendido) ms de 100.000 copias de la V3R1/V3R2. Muchos programadores se hallan a punto de arremangarse para ponerse a trabajar con las nuevas funciones de la

Versin 3 (Release x). Y uno de sus retos ms inmediatos ser el entorno ILE de programacin entender como aplicarlo con la suficiente astucia para conseguir el mximo partido posible del nuevo modelo de programacin y de lo que ste ofrece. Si ya has jugado un poco con el ILE sabrs que no es fcil hacerse con l a la primera y que incluso resulta fustrante aprenderlo. Dada la abundancia de nuevos conceptos, la escasa documentacin de IBM y los escasos ejemplos, incluso un veterano programador en RPG puede desmoralizarse. Afortunadamente, podemos separar las funciones del lenguaje ILE (RPG IV y su nueva sintaxis) de las caractersticas de la nueva arquitectura ILE (utilizacin de recursos como grupos de activacin, llamadas estticas...). Establecer esta divisin nos ayudar a aprender y utilizar este entorno con eficacia. En nmeros anteriores de NEWS/400 ya se han tratado algunos aspectos del ILE y del RPG IV. As, en abril del 94, anticipndonos a la salida de la V3, con el ttulo de "El prximo ILE RPG IV" publicamos una avanzadilla sobre cmo evolucionara el RPG en el futuro. Luego hemos publicado artculos generales como "Por fin, ILE para todos" y "Del RPG III al ILE RPG IV y al revs..." (Marzo 95, nm. 52), o ms detallados, como "Los Grupos de Activacin" (Mayo 95, nm. 54), "Las especificaciones tipo D del RPG IV" y dos partes del artculo sobre las "Operaciones de fecha/hora del RPG IV" (Junio y Septiembre 95, nmeros 55 y 56, respectivamente). A partir de este nmero, adems de los artculos Las funciones incorporadas y los Subprocedimientos en RPG IV que explican otras posibilidades aadidas al RPG, incluimos una Utilidad (CVTRPG) para convertir los campos definidos en clculo a las nuevas especificaciones D y diez Trucos & Tcnicas sobre el tratamiento de fechas, iniciamos una serie que, de forma prctica, pretende familiarizar al lector en el ILE. As, para el prximo nmero tenemos previstos dos nuevos artculos, uno sobre cmo crear programas de servicio y otro sobre las nuevas operaciones de llamada y programacin modular, dejando para el siguiente un repaso a los Grupos de Activacin, el manejo de errores en ILE o el cdigo de operacin EVAL. Creemos que esta serie de artculos pueden ser una buena ayuda para el aprendizaje de ILE. Tanto para aquellos que ya habis pasado a V3, porque podris aprovechar su contenido de inmediato, como para los que todava continuis en V2, puesto que con ellos podris valorar las posibilidades del ILE y prepararos convenientemente para el futuro. Mi consejo personal: si queris poneros al da, no perdis esta serie e intentad recuperar los nmeros con lo que ya se ha publicado.
Carlos Bell

1 - Las funciones incorporadas del RPG IV


Muchos lenguajes del AS/400, incluidas las CLs, tienen funciones

incorporadas (BIF o Built-In Function) desde hace bastante tiempo. Pero para el RPG, las funciones incorporadas son totalmente nuevas. Podemos pensar que las BIFs son cdigos de operacin que devuelven un valor sin necesidad de tener que colocar un campo de resultado. Hasta la llegada de la V3R1, realizaba alguna de estas funciones con cdigos de operacin (por ejemplo SUBST) metiendo a presin los argumentos en el primer o en el segundo factor, aadiendo el carcter : para separarlos cuando era preciso. O directamente no soportaba la funcin y era necesario que uno mismo se creara las sentencias para realizar el trabajo. Con RPG IV se pueden utilizar las funciones incorporadas que son eficientes y fciles de entender, e incluso pueden hacer tareas que previamente requeran de ciertos trucos de programacin. Lo bsico de las BIFs IBM ha aadido las BIFs con slo unas cuantas operaciones bsicas, pero se espera que expanda estas funciones en prximos releases. En la V3R1 el RPG IV soporta las siguientes funciones incorporadas:

%SUBST %TRIM, %TRIML, %TRIMR %SIZE %ELEM %ADDR, %PADDR


En la V3R6, adems, se ha aadido la funcin incorporada %PARMS.Cuando se utiliza una BIF se debe indicar los argumentos de la funcin de acuerdo con el siguiente formato: %funcion(argumento:argumento) . Los argumentos pueden ser variables, constantes, expresiones e incluso otras funciones incorporadas. Aunque normalmente se utilizan en los clculos del programa, tambin estn soportadas por las especificaciones D utilizando valores en tiempo de compilacin. La funcin %SUBST La funcin incorporada %SUBST (subserie) extrae una parte de una serie de caracteres y expande las posibilidades del cdigo de operacin SUBST. Se debe especificar la serie de caracteres, la posicin inicial desde la cual se extraern los caracteres y la longitud, esta ltima es opcional. En el ejemplo A de la figura 1 la funcin %SUBST coloca el valor ABC en la variable Start, que son los primeros tres caracteres de la constante con nombre UpperCase. La variable Middle tendr los caracteres LMNOP, cinco caracteres a partir de la posicin 12. Finalmente la variable End tendr los caracteres XYX, los tres ltimos caracteres. Como en el ltimo ejemplo no se ha especificado la longitud de la subserie a extraer, la funcin %SUBST extrae todos los

caracteres hasta el final de la serie. Si es necesario, el cdigo de operacin EVAL mueve la subserie a la izquierda del campo de resultado, blanquea los bytes de la derecha no rellenados por %SUBST y trunca la serie si el campo de resultado es demasiado pequeo. Los argumentos de %SUBST tambin pueden ser expresiones, tal como se ve en el ejemplo B de la figura 1. Las sentencias del ejemplo extraen el nombre y el apellido de una serie que contiene el nombre completo con un signo "/" como separador. Por ejemplo si el contenido del campo LastFirst es SMITH/JOHN, las sentencias del ejemplo extraen SMITH y lo colocan en el campo Last y hacen lo mismo con JOHN en el campo First. Cuando se utilizan expresiones como argumentos de las funciones incorporadas es necesario asegurar que los argumentos y que los valores devueltos por la BIF son correctos o el programa dar un error durante la ejecucin. Adems de utilizar %SUBST para extraer una serie de caracteres, tambin se puede utilizar como resultado de una asignacin, o sea para cambiar una parte de una serie de caracteres. En el ejemplo C cambia el contenido de la variable Swine a "PigPigPigPearlsPigPig" al especificar la funcin %SUBST a la izquierda del signo igual de la operacin EVAL. Probablemente es ms practico utilizar %SUBST para insertar el valor de una variable (en lugar de un literal) en una serie de caracteres, tal como muestra el ejemplo D. En este ejemplo, la variable BarGraph contiene el valor hexadecimal 20, que las pantallas del AS/400 identifican como final de campo. La sentencia EVAL cambia el valor de BarGraph de forma que la regla aparece por el lado izquierdo del campo y muestra el nmero de caracteres indicado por la variable Percent. Quitar caracteres en blanco con las BIFs de ajuste de blancos Las tres funciones %TRIM x devuelven una serie de caracteres a la que se le han recortado los blancos del comienzo y/o del final. La funcin %TRIM recorta los blancos del comienzo y del final, %TRIML slo recorta los blancos del comienzo (izquierda) y %TRIMR slo recorta los blancos del final (derecha). Las funciones %TRIM x reducen las sentencias necesarias para concatenar campos cuando es necesario eliminar los blancos intermedios. El RPG III necesita bastantes sentencias con operaciones SCAN, CHECK, CHEKR y CAT para hacer lo mismo que una sentencia EVAL de RPG IV con una o ms funciones %TRIM x . El nico argumento de las funciones %TRIM x es la serie de caracteres que ser ajustada. Este argumento puede ser una variable, un literal o una constante. El tamao del campo La funcin incorporada %SIZE da al RPG una funcin totalmente

nueva: devuelve el nmero de bytes que tiene un campo, un literal, una estructura de datos o una constante con nombre. Los ejemplos A y B de la figura 3 combinan las funciones %SIZE y %TRIM para determinar si la lnea a imprimir supera los 35 caracteres de longitud. Es importante destacar que en el ejemplo B el argumento de una de las funciones incorpora otras funciones, lo que permite eliminar sentencias y campos intermedios de trabajo. Cuando se utiliza una serie o una tabla, o una estructura de datos de mltiples ocurrencias como argumento de la funcin %SIZE, esta devuelve el tamao de un elemento o una ocurrencia. Para recuperar el tamao de toda la serie, tabla o estructura de datos de apariciones mltiples se debe incluir *ALL como segundo argumento. Es importante recordar que la funcin %SIZE devuelve el nmero de bytes. Cuando se utiliza para determinar el tamao de un campo empaquetado o binario no devuelve el nmero de dgitos del campo. La funcin %ELEM Esta funcin devuelve el nmero de elementos de una serie, una tabla o el nmero de ocurrencias de una estructura de datos de apariciones mltiples. Se puede utilizar esta funcin para que sea ms sencillo mantener el programa. Por ejemplo, en la figura 4 la serie WeeklySIs contiene las ventas por semana y tiene 53 elementos que es el mximo nmero de semanas que puede tener un ao. La serie WeeklyComm, que contiene las comisiones por semana y est definida como asociada a la serie WeeklySIs, tiene los mismos atributos. Tambin tiene el mismo nmero de elementos que WeeklySIs, ya que la sentencia con la palabra clave DIM utiliza la funcin %ELEM(WeeklySIs). Con esta definicin, si se cambia el nmero de elementos de WeeklySIs tambin se ajustar automticamente el nmero de elementos de WeeklyComm cuando se vuelva a compilar el programa. Es necesario recordar que las BIFs se pueden resolver durante la compilacin lo que permite utilizarlas en las especificaciones D. Otro ejemplo que mejora la claridad del programa, y por lo tanto hace ms fcil posteriores modificaciones, se puede ver en la figura 5. La estructura de datos contiene un campo de trabajo que adems es contenido por una serie con elementos de 1 byte de longitud. La funcin %ELEM coloca el nmero de elementos de la serie en el campo ArrayLimit. Si la longitud del campo CustName, en el que se basan todas las definiciones, cambia, slo es necesario recompilar el programa y se ajustarn todos los valores y tamaos de las variables que dependen de l. Tambin se puede utilizar la funcin %ELEM en los clculos, tal como se muestra en el ejemplo B. En este ejemplo se limita el nmero de veces que se ejecuta el DOU con el nmero de elementos de la serie WeeklySIS. De esta forma, no es necesario modificar ninguna sentencia si cambia el nmero de elementos de la serie. Adems,

como regalo, si se escribe de esta forma la sentencia DOU, queda documentado el motivo del bucle: para procesar cada elemento de la serie. Apuntando a %ADDR y %PADDR Las funciones %ADDR (Direccin) y %PADDR (Direccin de Procedimiento) son dos formas de dar soporte de punteros al RPG. Aunque trataremos ms ampliamente el tema de punteros en prximos nmeros, en este artculo daremos una visin rpida para estas dos BIFs. Los punteros son variables que contienen las direcciones de otras variables (o procedimientos) de un programa en lugar de contener el valor de las variables. La funcin %ADDR coloca la direccin de una variable, un elemento de una serie o una expresin en un puntero. El resultado es una variable (del nuevo tipo de datos puntero) con la direccin de la variable especificada. En A en la figura 6 se ha definido DayPtr con el tipo de datos *, lo que indica que el campo es un puntero. Se ha utilizado la palabra clave INZ junto con la palabra clave %ADDR para inicializar este puntero con la direccin de la serie DayOfWeeks. Se puede cambiar el valor de la direccin del puntero asignndole un nuevo valor en las sentencias de clculo, tal como se puede ver en el ejemplo B. En este caso se ha incluido la funcin %ADDR en una sentencia EVAL para asignarle a DayPtr la direccin del cuarto elemento de la serie DaysOfWeek. La funcin %PADDR devuelve la direccin del punto de entrada de un procedimiento (programa). La variable que recibe la direccin debe ser del tipo de datos puntero. Se pueden utilizar los punteros de procedimientos con el cdigo de operacin CALLB (Llamar a un procedimiento enlazado) para enlazar estticamente una llamada a un procedimiento. En el ejemplo C de la figura 6 se define un puntero de procedimiento (tipo de datos *) con la palabra clave PROCPTR. Luego se inicializa el puntero con la direccin del procedimiento ADDCUST utilizando la funcin %PADDR en la palabra clave INZ. Despus, en las especificaciones de clculo, se llama al procedimiento ADDCUST mediante la operacin CALLB. Normalmente, se ejecuta ms rpidamente la llamada a un procedimiento por su direccin que si se utiliza un literal o una constante con nombre en el segundo factor. La funcin incorporada ms reciente En la V3R6 se ha incorporado la funcin %PARMS. Esta BIF devuelve el nmero de parmetros que se han pasado al procedimiento donde se est utilizando la funcin %PARMS. Para el procedimiento principal la funcin %PARMS es equivalente a la palabra especial *PARMS de la estructura de datos del programa. Puede obtener ms informacin sobre procedimientos, procedimiento principal y subprocedimientos

en el artculo "Subprocedimientos en RPG IV" en este mismo nmero. Si el nmero de parmetros es desconocido el valor devuelto es -1. El valor devuelto por %PARMS no est disponible si al programa o procedimiento que llama al procedimiento que ejecuta la funcin %PARMS no enva un mnimo de informacin de la descripcin operacional. El ILE RPG/400 siempre pasa esta descripcin operacional pero otros lenguajes no pasan ninguna. Algo ms sobre las BIFs? Ahora que conoce las funciones incorporadas puede comenzar a utilizar estas nueve BIFs que IBM ha incorporado en el RPG. Puede mirar otros lenguajes como C, CLs o Basic para ver algunas de las posibilidades que las funciones incorporadas al ILE RPG IV ofrecen al programador. Examine sus aplicaciones e intente ver dnde puede utilizar las BIFs (conjuntamente con las dems novedades del RPG IV) para conseguir que sus programas RPG sean ms fciles de mantener, ms fiables, ms entendibles, ms eficiente y, en general, mejores.
Bryan Meyers, es director de los servicios de informacin de KOA y miembro del equipo de redactores tcnicos internacionales de NEWS/400.

2 - Subprocedimientos en RPG IV
La introduccin e implementacin del RPG IV ha tenido muchas controversias, compromisos y concesiones. A pesar de que la nueva sintaxis del lenguaje aade muchas funciones, en la primera release no se encontraban algunas de las ms esperadas. En la parte superior de esa hipottica lista se encontraba poder pasar parmetros a las subrutinas. Y un poco despus, la posibilidad de definir variables locales en una subrutina, de forma que cambiar alguna de ellas no afectara al resto del programa. Despus de un ao y pico de la presentacin del RPG IV, IBM ha empezado a atender esta lista de deseos y est aadiendo nuevas funciones. Para comenzar, ha aadido los subprocedimiento y las variables locales, que probablemente sean dos de las funciones ms deseadas/necesarias. La finalidad de los subprocedimientos es muy similar a la de las subrutinas, pero existen diferencias. Las mayores diferencias entre ambas son las siguientes: Se pueden pasar parmetros a los subprocedimientos. Con subprocedimientos se pueden definir datos y variables locales. Los subprocedimientos pueden devolver un valor. Los subprocedimientos se pueden utilizar directamente en expresiones. Los subprocedimientos ayudan a crear cdigo fuente modular y crear "funciones incorporadas" (built-in-functions, BIF) propias para las

aplicaciones RPG. Oficialmente los subprocedimientos son una mejora aadida al RPG IV en la V3R6, pero tambin estarn disponibles en la V3R2 para los modelos CISC, por lo tanto no es necesario que se compre un nuevo AS/400 RISC para poder utilizarlos. Procedimientos dentro de un procedimiento Hasta ahora, los programas RPG eran programas con un slo procedimiento, con un slo punto de entrada al programa. Esto significa que solamente se poda llamar a "todo" el programa, pero no se poda ejecutar una sola subrutina del programa. Con el nuevo soporte de subprocedimientos, se pueden escribir programas RPG que tengan un procedimiento principal y, opcionalmente, que tengan uno o ms subprocedimientos. A stos se les pueden pasar parmetros y pueden tener sus propias variables locales que no interfieren con el resto de variables del programa. Se pueden incluir todas las sentencias del procedimiento principal y de cada uno de los subprocedimientos en el mismo miembro fuente o se puede tener el cdigo correspondiente a los subprocedimientos en otro, u otros, miembros fuentes que se compilar, o compilarn, por separado. Desde el procedimiento principal se pueden llamar a los subprocedimientos utilizando una sintaxis similar a la utilizada para ejecutar las funciones incorporadas (BIF) del RPG IV. Por ejemplo para llamar al subprocedimiento DayOfWeek puede escribir la siguiente sentencia: EVAL O puede WeekDay utilizar el = subprocedimiento DayOfWeek(TodaysDate) en una sentencia IF:

IF DayOfWeek(TodaysDate) > 1 Normalmente, un subprocedimiento devuelve un valor al procedimiento principal. En el ejemplo anterior, el valor devuelto ser el nmero que le corresponde al da de la semana. Una funcin de un subprocedimiento, sin embargo, puede actualizar una variable global o posicionar el puntero de un archivo.Para poder entender mejor los subprocedimientos y en qu casos se pueden utilizar, veamos un ejemplo que convierte una subrutina RPG IV en un subprocedimiento. La metamorfosis Nuestra subrutina ejemplo convierte una fecha en el da de la semana correspondiente. La figura 1 muestra esta subrutina dentro de una parte de un programa RPG IV y se ha seleccionado de un ejemplo del artculo "Trucos de fechas en RPG IV", publicado en este mismo nmero. Para ejecutarla slo es necesario escribir una sentencia con el cdigo de operacin EXSR y el nombre de la subrutina. La figura 2 muestra la misma subrutina escrita como un subprocedimiento que devuelve un valor numrico que representa el da de la semana (1=Domingo, 2=Lunes, etc.). Para ejecutar este subprocedimiento debe utilizarse el mismo tipo de llamada que se utiliza con las nuevas BIF (funciones incorporadas o built-in-

functions). A primera vista, las sentencias de la figura 2 parecen ser las de un programa normal en RPG IV, sin embargo, cuando se mira con profundidad aparecen las diferencias entre la subrutina y el subprocedimiento. Para empezar, aparece la nueva especificacin tipo "P" (de procedimiento) que define el comienzo y el final del subprocedimiento. La especificacin P contiene slo el nombre del procedimiento y una letra B si se est definiendo el inicio del procedimiento o una E si se define el final. Digamos que la sentencia que contiene la B es equivalente al cdigo de operacin BEGSR en la subrutina y la que contiene la E es equivalente a ENDSR. Despus de la especificacin P se define la interfase de procedimiento (PI), que es similar a la lista de parmetros *ENTRY. Para definir el PI se utilizan las especificaciones D y se debe indicar PI como tipo de estructura en las columnas 24 y 25. En la misma lnea tambin se puede definir la longitud, el tipo de datos y las posiciones decimales del valor que ser devuelto, en este ejemplo el campo es de un dgito empaquetado con cero posiciones decimales. Los campos siguientes definen los parmetros que son pasados al procedimiento, en el ejemplo de la figura 2 el campo pasado es DateIn. A continuacin se colocan las especificaciones D que definen las variables locales que necesita el subprocedimiento. Como estas variables son definidas dentro de los limites del subprocedimiento, son variables locales especificas para l. Si otro procedimiento en el programa (incluido el procedimiento principal) define un campo con el mismo nombre, por ejemplo el campo DayNbr, ambos campos representarn variables distintas. El sistema no conserva los valores de las variables locales en las distintas llamadas a un procedimiento. Si esto ocurre varias veces, los valores de las variables locales de una llamada anterior, no se conservan en la siguiente llamada. Las sentencias C de la figura 2 son concisas. Es importante sealar que se ha incluido el cdigo de operacin RETURN con una nueva funcin. No solamente es una forma de finalizar el subprocedimiento sino que tambin indica el nombre de la variable cuyo valor ser devuelto al programa que ha llamado al subprocedimiento. En este caso, se devuelve el valor de DayNbr. El cdigo de operacin RETURN puede devolver el valor de una variable (como en la figura 2) y tambin el resultado de una expresin de formato libre (como por ejemplo, DayNbr + 2). Un subprocedimiento puede tener ms de un cdigo de operacin RETURN, pero slo se puede devolver un valor. Por lo tanto, las sentencias de la figura 2 se pueden escribir de la siguiente forma: IF DayNbr < 1 RETURN DayNbr + 7 ELSE

RETURN DayNbr ENDIF Cuando se ejecuta una operacin RETURN el subprocedimiento finaliza, tanto si devuelve el valor de una variable como si devuelve el resultado de un clculo. Esto es prototpico Antes de que pueda utilizar un subprocedimiento en un programa hay un concepto ms que debe entender: la definicin prototipo . Una definicin prototipo es una lista de los parmetros de los subprocedimientos en orden, describiendo el tipo de datos del valor devuelto y el tipo de datos de los parmetros que se envan. Los prototipos suministran una verificacin de seguridad entre procedimientos y subprocedimientos, permitiendo que el compilador compruebe si la llamada al subprocedimiento es correcta. Sin la definicin prototipo podran crearse misteriosos errores de programas causados por pasar datos invlidos a un subprocedimiento o asumiendo tipos de datos devueltos incorrectamente. Los prototipos aparecen, normalmente, en el procedimiento principal de un programa que utiliza subprocedimientos. Cada procedimiento utilizado por un programa tiene su propia definicin prototipo que tiene, usualmente, el mismo formato que el PI. La figura 3 muestra la definicin prototipo para el subprocedimiento DayofWeek del ejemplo. Se puede ver que el tipo de estructura, en las columnas 24 y 25, es PR y aparece junto con el nombre del subprocedimiento en la primera lnea de la definicin prototipo. La definicin de la figura 3 tambin indica que cada vez que el programa llame al subprocedimiento DayofWeek, el programa debe pasar una variable de fecha y debe esperar que la devolucin de un nmero empaquetado de 1 byte. A pesar de que es una practica habitual en muchos lenguajes utilizar el mismo nombre de variable que utiliza el subprocedimiento, no es algo obligatorio. Los nombres de variables aparecen en la lista de parmetros del prototipo pero se puede utilizar cualquier nombre de variable e incluso no utilizar ninguno. Normalmente se copia la definicin prototipo en el programa que utiliza el subprocedimiento. De hecho se pueden agrupar todas las definiciones prototipo de todos los subprocedimientos en un miembro fuente y luego copiar el miembro en los programas. El compilador pasa por alto los prototipos no referenciados en el cdigo. Para no tener que escribirlas varias veces en distintos programas, y evitar los posibles errores, se puede utilizar /COPY para copiar las diferentes definiciones prototipo. Adems de copiar el prototipo en los programas que llaman a los subprocedimientos, debera incluir el prototipo en el fuente que contiene los subprocedimientos. Esto permite al compilador asegurar

que el prototipo que utilizar en sus programas coincide con el subprocedimiento que est definiendo. Cuando se compila el subprocedimiento, el compilador indicar cualquier diferencia en las longitudes y los tipos de datos. Se puede utilizar esta capacidad de los prototipos para asegurar que son correctos la cantidad y tipo de parmetros pasados cuando se utiliza RPG para llamar un programa o un subprocedimiento hecho en cualquier lenguaje ILE, esto incluye todas las APIs para ILE (con la condicin de que el RPG soporte los mismo tipos de datos que utiliza la API). Si se utiliza un prototipo para definir los parmetros, se puede llamar al programa (o a la API) con la misma sintaxis que se utiliza para ejecutar las funciones incorporadas. Tambin se pueden utilizar los prototipos con el nuevo cdigo de operacin CALLP (Llamar subprocedimiento), en lugar de utilizar el subprocedimiento en una sentencia EVAL o IF, para llamar a subprocedimientos o subprogramas que no devuelven un valor. La operacin CALLP permite especificar los parmetros en formato libre y tiene la siguiente sintaxis: CALLP Prototype(Parm1:Parm2: ... :ParmN) La ltima palabra en subprocedimientos Probablemente ya estar pensando en las diferentes formas de incorporar subprocedimientos en sus programas. Puede utilizarlos para crear su propio conjunto de herramientas y luego las podr incluir en sus aplicaciones fcilmente, sin tener que preocuparse de posibles conflictos con los nombres de campo o con los indicadores. Y por supuesto, tambin puede utilizarlos para crear funciones que se salgan del estndar suministrado por IBM en el RPG. Los subprocedimientos pueden crear una industria totalmente nueva en el mundo del RPG: podrn suministrar juegos de herramientas especializados para que aquellas instalaciones de AS/400 con pocos medios tcnicos, puedan armar en aplicaciones completas. Aunque esta industria nunca pueda competir con el mercado de custom controls VBX del Visual Basic, los componentes pueden ser un buen negocio para muchos suministradores de software y cambiar la forma en que se compran las aplicaciones para el AS/400.
Bryan Meyers , es director de los servicios de informacin de KOA y miembro del equipo de redactores tcnicos internacionales de NEWS/400. Jon Paris, con ms de 20 aos de experiencia en proceso de datos, actualmente es asesor de desarrollos en los Laboratorios de IBM Toronto.

Publicaciones

HELP400,

S.L.

(Todos

los

derechos

reservados)

help400.es
Informacin tcnica y de gestin para IBM i - AS/400

Acceda al Sumario de cualquier nmero

Nmero (y pulse INTRO)

Actualizado el 31 Julio 2011 1024 x 768 de resolucin

MENU de OPCIONES

RPG IV %BIFs

funciones incorporadas en Lenguaje IBM RPG IV


informacin provisional

RPG es un Lenguaje de Programacin de IBM, principalmente usado en su plataforma intermedia, y con una historia de 40 aos, en los cuales ha tenido incontables mejoras sucesivas hasta alcanzar hoy dia la version RPG IV (tambien llamado ILE), que incluye un formato de escritura libre denominado rpg-free y contando con un montn de funciones incorporadas denominadas %bif. En la pgina RPG hay algunos enlaces interesantes de IBM Los %bif son funciones incorporadas dentro del lenguaje para hacerlo ms poderoso. Por ejemplo:

Alfa = %trim(PgmName); la funcion %trim elimina los blancos Alfa = %edit(Saldo:'J'); edita el campo Saldo con el codigo de edicion J Alfa = %trim(%edit(Saldo:'J')); ya que al editar un campo quiz queden espacios en blanco, la %trim anidada los quita

Hay un montn de funciones %bif, creciendo con cada versin del Operativo y del Lenguaje... %mseconds, %seconds, %minutes, %hours, %days, %months y %years %DIFF, para restar un valor de fecha, hora o indicacin de la hora de otro Funciones para convertir una serie de caracteres (o fecha o indicacin de la hora) en una fecha, hora o indicacin de la hora: %DATE, %TIME y %TIMESTAMP. La funcin %SUBDT, para extraer un subconjunto de una fecha, hora o indicacin de la hora Funciones para asignar o reasignar almacenamiento: %ALLOC y %REALLOC. Funciones para buscar un elemento en una matriz: %LOOKUP, %LOOKUPGT, %LOOKUPGE, %LOOKUPLT y %LOOKUPLE. Funciones para buscar un elemento en una tabla: %TLOOKUP, %TLOOKUPGT, %TLOOKUPGE, %TLOOKUPLT y %TLOOKUPLE.

Funciones para verificar que una serie contenga slo los caracteres especificados (o buscar la primera o ltima excepcin a esta norma): %CHECK y %CHECKR La funcin %XLATE, para convertir una serie a partir de una lista de caracteres origen en caracteres destino. La funcin %OCCUR, para obtener o establecer la aparicin actual de una estructura de datos de apariciones mltiples. La funcin %SHTDN, para determinar si el operador ha solicitado la conclusin. La funcin %SQRT, para calcular la raz cuadrada de un nmero. %SCAN La funcin incorporada %PADDR ahora puede tomar un nombre de prototipo o un nombre de punto de entrada como argumento Direct conversion of date/time/timestamp to numeric, using %DEC: %DEC is enhanced (v5r3) to allow the first parameter to be a date, time or timestamp, and the optional second parameter to specify the format of the resulting numeric value. Example: D numDdMmYy s 6p 0 D date s d datfmt(*jul) date = D'2003-08-21'; numDdMmYy = %dec(date : *dmy); // now numDdMmYy = 210803 Conversion from character to numeric Built-in functions %DEC, %DECH, %INT, %INTH, %UNS, %UNSH and %FLOAT are enhanced to allow character parameters. For example, %DEC('-12345.67' : 7 : 2) returns the numeric value -12345.67. --New assignment operators

The new assignment operators +=, -=, *=, /=, **= allow a variable to be modified based on its old value in a more concise manner. Example: totals(current_customer) += count; This statement adds "count" to the value currently in "totals(current_customer)" without having to code "totals(current_customer)" twice ---%KDS(data structure) Used in free-form keyed operation codes CHAIN, SETLL, SETGT, READE and READPE, to indicate that the keys for the operation are in the data structure. Functions for verifying that a string contains only specified characters (or finding the first or last exception to this rule): %CHECK and %CHECKR The %XLATE function, for translating a string based on a list of from-characters and to-characters. The %OCCUR function, for getting or setting the current occurrence in a multipleoccurrence data structure. The %SHTDN function, for determining if the operator has requested shutdown %XFOOT built-in function sums all elements of a specified array expression EVALR operation code evaluates expressions and assigns the result to a fixedlength character or graphic result. The assignment right-adjusts the data within the result. The new FOR operation code performs an iterative loop and allows free-form expressions for the initial, increment, and limit values. The new LEAVESR operation code can be used to exit from any point within a subroutine. The new *NEXT parameter on the OVERLAY(name:*NEXT) keyword indicates that a subfield overlays another subfield at the next available position. The new *START and *END values for the SETLL operation code position to the beginning or end of the file. Built-in functions %EOF, %EQUAL, %FOUND, and %OPEN have been added to query the results of input/output operations. Built-in functions %ERROR and

%STATUS, and the operation code extender 'E' have been added for error handling. Built-in functions %CHAR and %REPLACE have been added to make string manipulation easier New support for externally defined *CMDY, *CDMY, and *LONGJUL date data formats Built-in functions %CHAR(graphic, date, time or timestamp expression) Returns the value in a character data type. %EOF{file name} Returns '1' if the most recent file input operation or write to a subfile (for a particular file, if specified) ended in an end-of-file or beginning-of-file condition; otherwise, it returns '0'. %EQUAL{file name} Returns '1' if the most recent SETLL (for a particular file, if specified) or LOOKUP operation found an exact match; otherwise, it returns '0'. %ERROR Returns '1' if the most recent operation code with extender 'E' specified resulted in an error; otherwise, it returns '0'. %FOUND{file name} Returns '1' if the most recent relevant operation (for a particular file, if specified) found a record (CHAIN, DELETE, SETGT, SETLL), an element (LOOKUP), or a match (CHECK, CHECKR and SCAN); otherwise, it returns '0'. %OPEN(file name) Returns '1' if the specified file is open and '0' if the specified file is closed. %REPLACE(replacement string: source string {:start position {:source length to replace}}) Returns the string produced by inserting a replacement string into a source string, starting at the start position and replacing the specified number of characters. %STATUS{file name} If no program or file error occurred since the most recent operation code with extender 'E' specified, it returns 0. If an error occurred, it returns the most recent value set for any program or file status. If a file is specified, the value returned is the most recent status for that file. Operation code Extender E Allows for error handling using the %ERROR and %STATUS built-in functions on the CALLP operation and all operations that allow error indicators.

New century formats *CMDY (cmm/dd/yy) To be used by the MOVE, MOVEL, and TEST operations. *CDMY (cdd/mm/yy) To be used by the MOVE, MOVEL, and TEST operations. New 4-digit year format *LONGJUL (yyyy/ddd) To be used by the MOVE, MOVEL, and TEST operations. editing (%EDITW, %EDITC, %EDITFLT) scanning strings (%SCAN) type conversions (%INT, %FLOAT, %DEC, %UNS) type conversions with half-adjust (%INTH, %DECH, %UNSH) precision of intermediate results for decimal expressions (%DEC) length and decimals of variables and expressions (%LEN, %DECPOS) absolute value (%ABS) set and test null-capable fields (%NULLIND) handle null terminated strings (%STR)

Das könnte Ihnen auch gefallen