Lenguaje RPG



Comments



Description

Lenguaje RPGRPG 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 programación 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 años, IBM ha mejorado en mucho RPG, ahora llamado RPG IV o RPG ILE, dotándolo de muchas opciones y funciones (como rpg-free y %bifs), mejoras en el compilador y creando el entorno ILE para facilitar la programación más estructurada y la combinación de múltiples lenguajes, como Java, C++, etc. Un ejemplo de la flexibilidad y potencia de RPG es RpgForWeb, un entorno que facilita la creación de Aplicaciones Web usando RPG IV y el estándar de la Web; html y javascript. Las Aplicaciones se pueden desarrollar con muchos lenguajes, incluso puede ser bueno combinar varios lenguajes en una Aplicación, y en la mayoría de las ocasiones no importa tanto el lenguaje con el que está desarrollada una Aplicación como el conocimiento del medio y la inteligencia del programador. tema del mes El ILE en acción 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 dispondrán 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, estarán en producción (no las que se habrán vendido) más 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 en abril del 94. 54). podemos separar las funciones del lenguaje ILE (RPG IV y su nueva sintaxis) de las características de la nueva arquitectura ILE (utilización de recursos como grupos de activación. Y uno de sus retos más inmediatos será el entorno ILE de programación entender como aplicarlo con la suficiente astucia para conseguir el máximo partido posible del nuevo modelo de programación y de lo que éste ofrece. como para los que todavía continuáis en V2. la escasa documentación de IBM y los escasos ejemplos. anticipándonos a la salida de la V3. Si ya has jugado un poco con el ILE sabrás que no es fácil hacerse con él a la primera y que incluso resulta fustrante aprenderlo. Luego hemos publicado artículos generales como "Por fin. como "Los Grupos de Activación" (Mayo 95. núm. uno sobre cómo crear programas de servicio y otro sobre las nuevas operaciones de llamada y programación modular." (Marzo 95. Mi consejo personal: si queréis poneros al día. de forma práctica. incluidas las CLs. números 55 y 56.. ILE para todos" y "Del RPG III al ILE RPG IV y al revés. o más detallados. Dada la abundancia de nuevos conceptos. tienen funciones . pretende familiarizar al lector en el ILE. Establecer esta división nos ayudará a aprender y utilizar este entorno con eficacia. 52). "Las especificaciones tipo D del RPG IV" y dos partes del artículo sobre las "Operaciones de fecha/hora del RPG IV" (Junio y Septiembre 95... con el título de "El próximo ILE RPG IV" publicamos una avanzadilla sobre cómo evolucionaría el RPG en el futuro. para el próximo número tenemos previstos dos nuevos artículos. Así. no perdáis esta serie e intentad recuperar los números con lo que ya se ha publicado. incluso un veterano programador en RPG puede desmoralizarse. dejando para el siguiente un repaso a los Grupos de Activación. Así. Tanto para aquellos que ya habéis pasado a V3.). porque podréis aprovechar su contenido de inmediato. incluimos una Utilidad (CVTRPG) para convertir los campos definidos en cálculo a las nuevas especificaciones D y diez Trucos & Técnicas sobre el tratamiento de fechas. En números anteriores de NEWS/400 ya se han tratado algunos aspectos del ILE y del RPG IV. iniciamos una serie que. Afortunadamente. A partir de este número.Versión 3 (Release x). además de los artículos Las funciones incorporadas y los Subprocedimientos en RPG IV que explican otras posibilidades añadidas al RPG. Creemos que esta serie de artículos pueden ser una buena ayuda para el aprendizaje de ILE. respectivamente). núm. Carlos Bell 1 .. llamadas estáticas. puesto que con ellos podréis valorar las posibilidades del ILE y prepararos convenientemente para el futuro.Las funciones incorporadas del RPG IV Muchos lenguajes del AS/400. el manejo de errores en ILE o el código de operación EVAL. además. cinco caracteres a partir de la posición 12. la función %SUBST extrae todos los . La función %SUBST La función incorporada %SUBST (subserie) extrae una parte de una serie de caracteres y expande las posibilidades del código de operación SUBST. Con RPG IV se pueden utilizar las funciones incorporadas que son eficientes y fáciles de entender. las funciones incorporadas son totalmente nuevas. realizaba alguna de estas funciones con códigos de operación (por ejemplo SUBST) metiendo a presión los argumentos en el primer o en el segundo factor. En el ejemplo A de la figura 1 la función %SUBST coloca el valor ABC en la variable Start. los tres últimos caracteres. Como en el último ejemplo no se ha especificado la longitud de la subserie a extraer. e incluso pueden hacer tareas que previamente requerían de ciertos trucos de programación. Lo básico de las BIFs IBM ha añadido las BIFs con sólo unas cuantas operaciones básicas.incorporadas (BIF o Built-In Function) desde hace bastante tiempo. esta última es opcional. constantes. La variable Middle tendrá los caracteres LMNOP. se ha añadido la función incorporada %PARMS. que son los primeros tres caracteres de la constante con nombre UpperCase. Aunque normalmente se utilizan en los cálculos del programa. %PADDR En la V3R6. también están soportadas por las especificaciones D utilizando valores en tiempo de compilación. la posición inicial desde la cual se extraerán los caracteres y la longitud. O directamente no soportaba la función y era necesario que uno mismo se creara las sentencias para realizar el trabajo. Pero para el RPG. Los argumentos pueden ser variables. expresiones e incluso otras funciones incorporadas. Hasta la llegada de la V3R1. Podemos pensar que las BIFs son códigos de operación que devuelven un valor sin necesidad de tener que colocar un campo de resultado. %TRIML. añadiendo el carácter ‘:’ para separarlos cuando era preciso. %TRIMR %SIZE %ELEM %ADDR. Se debe especificar la serie de caracteres. pero se espera que expanda estas funciones en próximos releases. En la V3R1 el RPG IV soporta las siguientes funciones incorporadas: %SUBST %TRIM. Finalmente la variable End tendrá los caracteres XYX.Cuando se utiliza una BIF se debe indicar los argumentos de la función de acuerdo con el siguiente formato: %funcion(argumento:argumento) . blanquea los bytes de la derecha no rellenados por %SUBST y trunca la serie si el campo de resultado es demasiado pequeño. Las sentencias del ejemplo extraen el nombre y el apellido de una serie que contiene el nombre completo con un signo "/" como separador. La función %TRIM recorta los blancos del comienzo y del final. un literal o una constante. o sea para cambiar una parte de una serie de caracteres. El RPG III necesita bastantes sentencias con operaciones SCAN. Además de utilizar %SUBST para extraer una serie de caracteres.caracteres hasta el final de la serie. Las funciones %TRIM x reducen las sentencias necesarias para concatenar campos cuando es necesario eliminar los blancos intermedios. CHECK. En el ejemplo C cambia el contenido de la variable Swine a "PigPigPigPearlsPigPig" al especificar la función %SUBST a la izquierda del signo igual de la operación EVAL. El único argumento de las funciones %TRIM x es la serie de caracteres que será ajustada. tal como muestra el ejemplo D. La sentencia EVAL cambia el valor de BarGraph de forma que la regla aparece por el lado izquierdo del campo y muestra el número de caracteres indicado por la variable Percent. también se puede utilizar como resultado de una asignación. Si es necesario. Probablemente es más practico utilizar %SUBST para insertar el valor de una variable (en lugar de un literal) en una serie de caracteres. tal como se ve en el ejemplo B de la figura 1. el código de operación EVAL mueve la subserie a la izquierda del campo de resultado. El tamaño del campo La función incorporada %SIZE da al RPG una función totalmente . que las pantallas del AS/400 identifican como final de campo. 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. Por ejemplo si el contenido del campo LastFirst es SMITH/JOHN. Este argumento puede ser una variable. las sentencias del ejemplo extraen SMITH y lo colocan en el campo Last y hacen lo mismo con JOHN en el campo First. CHEKR y CAT para hacer lo mismo que una sentencia EVAL de RPG IV con una o más funciones %TRIM x . 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 ejecución. la variable BarGraph contiene el valor hexadecimal ‘20’. Los argumentos de %SUBST también pueden ser expresiones. En este ejemplo. %TRIML sólo recorta los blancos del comienzo (izquierda) y %TRIMR sólo recorta los blancos del final (derecha). tabla o estructura de datos de apariciones múltiples se debe incluir *ALL como segundo argumento. La serie WeeklyComm. También se puede utilizar la función %ELEM en los cálculos. que contiene las comisiones por semana y está definida como asociada a la serie WeeklySIs. Con esta definición. Cuando se utiliza para determinar el tamaño de un campo empaquetado o binario no devuelve el número de dígitos del campo. Si la longitud del campo CustName. Los ejemplos A y B de la figura 3 combinan las funciones %SIZE y %TRIM para determinar si la línea a imprimir supera los 35 caracteres de longitud. en la figura 4 la serie WeeklySIs contiene las ventas por semana y tiene 53 elementos que es el máximo número de semanas que puede tener un año. esta devuelve el tamaño de un elemento o una ocurrencia. se puede ver en la figura 5. en el que se basan todas las definiciones. tiene los mismos atributos. ya que la sentencia con la palabra clave DIM utiliza la función %ELEM(WeeklySIs). La función %ELEM Esta función devuelve el número de elementos de una serie. Otro ejemplo que mejora la claridad del programa. Es necesario recordar que las BIFs se pueden resolver durante la compilación lo que permite utilizarlas en las especificaciones D. o una estructura de datos de múltiples ocurrencias como argumento de la función %SIZE. Cuando se utiliza una serie o una tabla. una estructura de datos o una constante con nombre. y por lo tanto hace más fácil posteriores modificaciones. También tiene el mismo número de elementos que WeeklySIs.nueva: devuelve el número de bytes que tiene un campo. cambia. Es importante destacar que en el ejemplo B el argumento de una de las funciones incorpora otras funciones. La función %ELEM coloca el número de elementos de la serie en el campo ArrayLimit. En este ejemplo se limita el número de veces que se ejecuta el DOU con el número de elementos de la serie WeeklySIS. La estructura de datos contiene un campo de trabajo que además es contenido por una serie con elementos de 1 byte de longitud. De esta forma. Se puede utilizar esta función para que sea más sencillo mantener el programa. Por ejemplo. tal como se muestra en el ejemplo B. Además. no es necesario modificar ninguna sentencia si cambia el número de elementos de la serie. si se cambia el número de elementos de WeeklySIs también se ajustará automáticamente el número de elementos de WeeklyComm cuando se vuelva a compilar el programa. una tabla o el número de ocurrencias de una estructura de datos de apariciones múltiples. Para recuperar el tamaño de toda la serie. . un literal. Es importante recordar que la función %SIZE devuelve el número de bytes. sólo es necesario recompilar el programa y se ajustarán todos los valores y tamaños de las variables que dependen de él. lo que permite eliminar sentencias y campos intermedios de trabajo. en las especificaciones de cálculo. En el ejemplo C de la figura 6 se define un puntero de procedimiento (tipo de datos *) con la palabra clave PROCPTR. Aunque trataremos más ampliamente el tema de punteros en próximos números. El resultado es una variable (del nuevo tipo de datos puntero) con la dirección de la variable especificada. tal como se puede ver en el ejemplo B. en este artículo daremos una visión rápida para estas dos BIFs. procedimiento principal y subprocedimientos . En A en la figura 6 se ha definido DayPtr con el tipo de datos *. Se puede cambiar el valor de la dirección del puntero asignándole un nuevo valor en las sentencias de cálculo. queda documentado el motivo del bucle: para procesar cada elemento de la serie. Apuntando a %ADDR y %PADDR Las funciones %ADDR (Dirección) y %PADDR (Dirección de Procedimiento) son dos formas de dar soporte de punteros al RPG. Normalmente. lo que indica que el campo es un puntero. La variable que recibe la dirección debe ser del tipo de datos puntero. Esta BIF devuelve el número de parámetros que se han pasado al procedimiento donde se está utilizando la función %PARMS. La función incorporada más reciente En la V3R6 se ha incorporado la función %PARMS.como regalo. si se escribe de esta forma la sentencia DOU. Se ha utilizado la palabra clave INZ junto con la palabra clave %ADDR para inicializar este puntero con la dirección de la serie DayOfWeeks. se ejecuta más rápidamente la llamada a un procedimiento por su dirección que si se utiliza un literal o una constante con nombre en el segundo factor. Para el procedimiento principal la función %PARMS es equivalente a la palabra especial *PARMS de la estructura de datos del programa. En este caso se ha incluido la función %ADDR en una sentencia EVAL para asignarle a DayPtr la dirección del cuarto elemento de la serie DaysOfWeek. un elemento de una serie o una expresión en un puntero. se llama al procedimiento ADDCUST mediante la operación CALLB. Se pueden utilizar los punteros de procedimientos con el código de operación CALLB (Llamar a un procedimiento enlazado) para enlazar estáticamente una llamada a un procedimiento. 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 función %PADDR devuelve la dirección del punto de entrada de un procedimiento (programa). Puede obtener más información sobre procedimientos. Luego se inicializa el puntero con la dirección del procedimiento ADDCUST utilizando la función %PADDR en la palabra clave INZ. Después. La función %ADDR coloca la dirección de una variable. BIF) propias para las . La finalidad de los subprocedimientos es muy similar a la de las subrutinas. la posibilidad de definir variables locales en una subrutina. El ILE RPG/400 siempre pasa esta descripción operacional pero otros lenguajes no pasan ninguna. ¿Algo más sobre las BIFs? Ahora que conoce las funciones incorporadas puede comenzar a utilizar estas nueve BIFs que IBM ha incorporado en el RPG. Después de un año y pico de la presentación del RPG IV. es director de los servicios de información de KOA y miembro del equipo de redactores técnicos internacionales de NEWS/400. 2 . Si el número de parámetros es desconocido el valor devuelto es -1. • Los subprocedimientos pueden devolver un valor. pero existen diferencias. en la primera release no se encontraban algunas de las más esperadas. ha añadido los subprocedimiento y las variables locales. • Con subprocedimientos se pueden definir datos y variables locales. Y un poco después. • Los subprocedimientos se pueden utilizar directamente en expresiones. CLs o Basic para ver algunas de las posibilidades que las funciones incorporadas al ILE RPG IV ofrecen al programador. Para comenzar. Las mayores diferencias entre ambas son las siguientes: • Se pueden pasar parámetros a los subprocedimientos. mejores. IBM ha empezado a atender esta lista de deseos y está añadiendo nuevas funciones. Examine sus aplicaciones e intente ver dónde puede utilizar las BIFs (conjuntamente con las demás novedades del RPG IV) para conseguir que sus programas RPG sean más fáciles de mantener. El valor devuelto por %PARMS no está disponible si al programa o procedimiento que llama al procedimiento que ejecuta la función %PARMS no envía un mínimo de información de la descripción operacional.en el artículo "Subprocedimientos en RPG IV" en este mismo número. En la parte superior de esa hipotética lista se encontraba poder pasar parámetros a las subrutinas. Bryan Meyers. que probablemente sean dos de las funciones más deseadas/necesarias. más fiables. más entendibles.Subprocedimientos en RPG IV La introducción e implementación del RPG IV ha tenido muchas controversias. Los subprocedimientos ayudan a crear código fuente modular y crear "funciones incorporadas" (built-in-functions. más eficiente y. A pesar de que la nueva sintaxis del lenguaje añade muchas funciones. Puede mirar otros lenguajes como C. en general. de forma que cambiar alguna de ellas no afectara al resto del programa. compromisos y concesiones. etc. o compilarán. el valor devuelto será el número que le corresponde al día de la semana. pero no se podía ejecutar una sola subrutina del programa. se pueden escribir programas RPG que tengan un procedimiento principal y. 2=Lunes. 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.aplicaciones RPG. miembros fuentes que se compilará.Para poder entender mejor los subprocedimientos y en qué casos se pueden utilizar. Procedimientos dentro de un procedimiento Hasta ahora. Para ejecutarla sólo es necesario escribir una sentencia con el código de operación EXSR y el nombre de la subrutina. opcionalmente. Para ejecutar este subprocedimiento debe utilizarse el mismo tipo de llamada que se utiliza con las nuevas BIF (funciones incorporadas o built-in- . los programas RPG eran programas con un sólo procedimiento. por lo tanto no es necesario que se compre un nuevo AS/400 RISC para poder utilizarlos. que tengan uno o más subprocedimientos. Con el nuevo soporte de subprocedimientos. puede actualizar una variable global o posicionar el puntero de un archivo. La figura 2 muestra la misma subrutina escrita como un subprocedimiento que devuelve un valor numérico que representa el día de la semana (1=Domingo. con un sólo punto de entrada al programa. publicado en este mismo número. A éstos se les pueden pasar parámetros y pueden tener sus propias variables locales que no interfieren con el resto de variables del programa. Esto significa que solamente se podía llamar a "todo" el programa. por separado. Una función de un subprocedimiento.). 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 código correspondiente a los subprocedimientos en otro. La metamorfosis Nuestra subrutina ejemplo convierte una fecha en el día de la semana correspondiente. sin embargo. 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. veamos un ejemplo que convierte una subrutina RPG IV en un subprocedimiento. En el ejemplo anterior. un subprocedimiento devuelve un valor al procedimiento principal. La figura 1 muestra esta subrutina dentro de una parte de un programa RPG IV y se ha seleccionado de un ejemplo del artículo "Trucos de fechas en RPG IV". Oficialmente los subprocedimientos son una mejora añadida al RPG IV en la V3R6. u otros. pero también estarán disponibles en la V3R2 para los modelos CISC. Un subprocedimiento puede tener más de un código de operación RETURN. Después de la especificación P se define la interfase de procedimiento (PI). A primera vista. las sentencias de la figura 2 se pueden escribir de la siguiente forma: IF DayNbr < 1 RETURN DayNbr + 7 ELSE . En este caso.functions). Si esto ocurre varias veces. Para empezar. pero sólo se puede devolver un valor. sin embargo. En la misma línea también se puede definir la longitud. Para definir el PI se utilizan las especificaciones D y se debe indicar PI como tipo de estructura en las columnas 24 y 25. Los campos siguientes definen los parámetros que son pasados al procedimiento. No solamente es una forma de finalizar el subprocedimiento sino que también indica el nombre de la variable cuyo valor será devuelto al programa que ha llamado al subprocedimiento. por ejemplo el campo DayNbr. La especificación P contiene sólo el nombre del procedimiento y una letra B si se está definiendo el inicio del procedimiento o una E si se define el final. se devuelve el valor de DayNbr. no se conservan en la siguiente llamada. A continuación se colocan las especificaciones D que definen las variables locales que necesita el subprocedimiento. DayNbr + 2). El código de operación RETURN puede devolver el valor de una variable (como en la figura 2) y también el resultado de una expresión de formato libre (como por ejemplo. el tipo de datos y las posiciones decimales del valor que será devuelto. Como estas variables son definidas dentro de los limites del subprocedimiento. Es importante señalar que se ha incluido el código de operación RETURN con una nueva función. Si otro procedimiento en el programa (incluido el procedimiento principal) define un campo con el mismo nombre. El sistema no conserva los valores de las variables locales en las distintas llamadas a un procedimiento. ambos campos representarán variables distintas. las sentencias de la figura 2 parecen ser las de un programa normal en RPG IV. Por lo tanto. en el ejemplo de la figura 2 el campo pasado es DateIn. son variables locales especificas para él. Las sentencias C de la figura 2 son concisas. Digamos que la sentencia que contiene la B es equivalente al código de operación BEGSR en la subrutina y la que contiene la E es equivalente a ENDSR. aparece la nueva especificación tipo "P" (de procedimiento) que define el comienzo y el final del subprocedimiento. los valores de las variables locales de una llamada anterior. que es similar a la lista de parámetros *ENTRY. cuando se mira con profundidad aparecen las diferencias entre la subrutina y el subprocedimiento. en este ejemplo el campo es de un dígito empaquetado con cero posiciones decimales. Los nombres de variables aparecen en la lista de parámetros del prototipo pero se puede utilizar cualquier nombre de variable e incluso no utilizar ninguno. Se puede ver que el tipo de estructura.RETURN DayNbr ENDIF Cuando se ejecuta una operación RETURN el subprocedimiento finaliza. usualmente. Una definición prototipo es una lista de los parámetros de los subprocedimientos en orden. normalmente. A pesar de que es una practica habitual en muchos lenguajes utilizar el mismo nombre de variable que utiliza el subprocedimiento. Los prototipos aparecen. permitiendo que el compilador compruebe si la llamada al subprocedimiento es correcta. Normalmente se copia la definición prototipo en el programa que utiliza el subprocedimiento. Esto es prototípico Antes de que pueda utilizar un subprocedimiento en un programa hay un concepto más que debe entender: la definición prototipo . Además de copiar el prototipo en los programas que llaman a los subprocedimientos. tanto si devuelve el valor de una variable como si devuelve el resultado de un cálculo. en las columnas 24 y 25. La definición de la figura 3 también indica que cada vez que el programa llame al subprocedimiento DayofWeek. Sin la definición prototipo podrían crearse misteriosos errores de programas causados por pasar datos inválidos a un subprocedimiento o asumiendo tipos de datos devueltos incorrectamente. 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. Para no tener que escribirlas varias veces en distintos programas. en el procedimiento principal de un programa que utiliza subprocedimientos. Cada procedimiento utilizado por un programa tiene su propia definición prototipo que tiene. se puede utilizar /COPY para copiar las diferentes definiciones prototipo. el programa debe pasar una variable de fecha y debe esperar que la devolución de un número empaquetado de 1 byte. el mismo formato que el PI. es PR y aparece junto con el nombre del subprocedimiento en la primera línea de la definición prototipo. El compilador pasa por alto los prototipos no referenciados en el código. no es algo obligatorio. y evitar los posibles errores. describiendo el tipo de datos del valor devuelto y el tipo de datos de los parámetros que se envían. debería incluir el prototipo en el fuente que contiene los subprocedimientos. Esto permite al compilador asegurar . La figura 3 muestra la definición prototipo para el subprocedimiento DayofWeek del ejemplo. Los prototipos suministran una verificación de seguridad entre procedimientos y subprocedimientos. esto incluye todas las APIs para ILE (con la condición de que el RPG soporte los mismo tipos de datos que utiliza la API). Cuando se compila el subprocedimiento. el compilador indicará cualquier diferencia en las longitudes y los tipos de datos. Puede utilizarlos para crear su propio conjunto de herramientas y luego las podrá incluir en sus aplicaciones fácilmente. es director de los servicios de información de KOA y miembro del equipo de redactores técnicos internacionales de NEWS/400. en lugar de utilizar el subprocedimiento en una sentencia EVAL o IF. (Todos los derechos reservados) . También se pueden utilizar los prototipos con el nuevo código de operación CALLP (Llamar subprocedimiento). 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. Aunque esta industria nunca pueda competir con el mercado de custom controls VBX del Visual Basic. con más de 20 años de experiencia en proceso de datos. actualmente es asesor de desarrollos en los Laboratorios de IBM Toronto.. para llamar a subprocedimientos o subprogramas que no devuelven un valor.que el prototipo que utilizará en sus programas coincide con el subprocedimiento que está definiendo. La operación CALLP permite especificar los parámetros en formato libre y tiene la siguiente sintaxis: CALLP Prototype(Parm1:Parm2: . se puede llamar al programa (o a la API) con la misma sintaxis que se utiliza para ejecutar las funciones incorporadas. también puede utilizarlos para crear funciones que se salgan del estándar suministrado por IBM en el RPG. Bryan Meyers . Si se utiliza un prototipo para definir los parámetros. © Publicaciones HELP400.L. puedan armar en aplicaciones completas. Jon Paris. :ParmN) La última palabra en subprocedimientos Probablemente ya estará pensando en las diferentes formas de incorporar subprocedimientos en sus programas.. sin tener que preocuparse de posibles conflictos con los nombres de campo o con los indicadores. S. Se puede utilizar esta capacidad de los prototipos para asegurar que son correctos la cantidad y tipo de parámetros pasados cuando se utiliza RPG para llamar un programa o un subprocedimiento hecho en cualquier lenguaje ILE. Los subprocedimientos pueden crear una industria totalmente nueva en el mundo del RPG: podrán suministrar juegos de herramientas especializados para que aquellas instalaciones de AS/400 con pocos medios técnicos. Y por supuesto. help400.es Información técnica y de gestión para IBM i .AS/400 Acceda al Sumario de cualquier número Número (y pulse INTRO) Actualizado el 31 Julio 2011 1024 x 768 de resolución MENU de OPCIONES RPG IV %BIFs . para restar un valor de fecha. %TLOOKUPGT. La función %SUBDT. – Funciones para buscar un elemento en una matriz: %LOOKUP. %TLOOKUPGE. creciendo con cada versión del Operativo y del Lenguaje.. %LOOKUPGT. %hours. la %trim anidada los quita Hay un montón de funciones %bif. en los cuales ha tenido incontables mejoras sucesivas hasta alcanzar hoy dia la version RPG IV (tambien llamado ILE). %mseconds. %TIME y %TIMESTAMP. %TLOOKUPLT y %TLOOKUPLE. %LOOKUPGE. %days. hora o indicación de la hora: %DATE. ya que al editar un campo quizá queden espacios en blanco. – Funciones para buscar un elemento en una tabla: %TLOOKUP. principalmente usado en su plataforma intermedia. hora o indicación de la hora de otro Funciones para convertir una serie de caracteres (o fecha o indicación de la hora) en una fecha. %seconds. Por ejemplo:    Alfa = %trim(PgmName). %months y %years %DIFF.funciones incorporadas en Lenguaje IBM RPG IV información provisional RPG es un Lenguaje de Programación de IBM. edita el campo Saldo con el codigo de edicion J Alfa = %trim(%edit(Saldo:'J')). que incluye un formato de escritura libre denominado rpg-free y contando con un montón de funciones incorporadas denominadas %bif.. para extraer un subconjunto de una fecha. y con una historia de 40 años. la funcion %trim elimina los blancos Alfa = %edit(Saldo:'J'). %minutes. En la página RPG hay algunos enlaces interesantes de IBM Los %bif son funciones incorporadas dentro del lenguaje para hacerlo más poderoso. hora o indicación de la hora – Funciones para asignar o reasignar almacenamiento: %ALLOC y %REALLOC. . %LOOKUPLT y %LOOKUPLE. %DEC('-12345. %UNS. para calcular la raíz cuadrada de un número.67. %INTH. numDdMmYy = %dec(date : *dmy). and the optional second parameter to specify the format of the resulting numeric value. using %DEC: %DEC is enhanced (v5r3) to allow the first parameter to be a date. %UNSH and %FLOAT are enhanced to allow character parameters. – La función %SHTDN. --New assignment operators . For example.67' : 7 : 2) returns the numeric value -12345. – La función %SQRT. // now numDdMmYy = 210803 Conversion from character to numeric Built-in functions %DEC. – La función %OCCUR. %DECH. %SCAN La función 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. time or timestamp. %INT. para obtener o establecer la aparición actual de una estructura de datos de apariciones múltiples. para determinar si el operador ha solicitado la conclusión. Example: D numDdMmYy s 6p 0 D date s d datfmt(*jul) date = D'2003-08-21'. para convertir una serie a partir de una lista de caracteres origen en caracteres destino.– Funciones para verificar que una serie contenga sólo los caracteres especificados (o buscar la primera o última excepción a esta norma): %CHECK y %CHECKR – La función %XLATE. **= allow a variable to be modified based on its old value in a more concise manner. SETLL. The new *NEXT parameter on the OVERLAY(name:*NEXT) keyword indicates that a subfield overlays another subfield at the next available position. -=. The new FOR operation code performs an iterative loop and allows free-form expressions for the initial. The new *START and *END values for the SETLL operation code position to the beginning or end of the file. and %OPEN have been added to query the results of input/output operations. and limit values. Built-in functions %ERROR and . READE and READPE. %FOUND. 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. /=. 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. 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. The new LEAVESR operation code can be used to exit from any point within a subroutine. for getting or setting the current occurrence in a multipleoccurrence data structure.The new assignment operators +=. Example: totals(current_customer) += count. for translating a string based on a list of from-characters and to-characters. increment. *=. The %OCCUR function. Built-in functions %EOF. SETGT. The %SHTDN function. %EQUAL. The assignment right-adjusts the data within the result. to indicate that the keys for the operation are in the data structure. %EQUAL{file name} Returns '1' if the most recent SETLL (for a particular file. SETGT. starting at the start position and replacing the specified number of characters. if specified) or LOOKUP operation found an exact match. *CDMY. it returns '0'. %OPEN(file name) Returns '1' if the specified file is open and '0' if the specified file is closed. %FOUND{file name} Returns '1' if the most recent relevant operation (for a particular file. SETLL). If a file is specified. if specified) found a record (CHAIN. and the operation code extender 'E' have been added for error handling. it returns 0. %ERROR Returns '1' if the most recent operation code with extender 'E' specified resulted in an error. If an error occurred. it returns '0'. DELETE. CHECKR and SCAN). Built-in functions %CHAR and %REPLACE have been added to make string manipulation easier New support for externally defined *CMDY. the value returned is the most recent status for that file.%STATUS. an element (LOOKUP). it returns '0'. %EOF{file name} Returns '1' if the most recent file input operation or write to a subfile (for a particular file. time or timestamp expression) Returns the value in a character data type. if specified) ended in an end-of-file or beginning-of-file condition. or a match (CHECK. %REPLACE(replacement string: source string {:start position {:source length to replace}}) Returns the string produced by inserting a replacement string into a source string. . date. otherwise. and *LONGJUL date data formats Built-in functions %CHAR(graphic. %STATUS{file name} If no program or file error occurred since the most recent operation code with extender 'E' specified. otherwise. 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. it returns the most recent value set for any program or file status. it returns '0'. otherwise. otherwise. and TEST operations. %DECPOS) absolute value (%ABS) set and test null-capable fields (%NULLIND) handle null terminated strings (%STR) . %UNS) type conversions with half-adjust (%INTH. %EDITFLT) scanning strings (%SCAN) type conversions (%INT. editing (%EDITW. MOVEL. MOVEL. %FLOAT. %EDITC. %UNSH) precision of intermediate results for decimal expressions (%DEC) length and decimals of variables and expressions (%LEN. %DEC. MOVEL. *CDMY (cdd/mm/yy) To be used by the MOVE.New century formats *CMDY (cmm/dd/yy) To be used by the MOVE. %DECH. and TEST operations. New 4-digit year format *LONGJUL (yyyy/ddd) To be used by the MOVE. and TEST operations.
Copyright © 2024 DOKUMEN.SITE Inc.