Uso de funciones en los parámetros de comandos CALL en IBM i
Introducción
Desde la versión 7.4 de IBM i, puedes usar funciones integradas de CL (llamadas BiF) directamente en los parámetros de tus comandos CALL. Esto te permite escribir código CL más flexible y potente, similar a lo que ya podías hacer en RPG.
Ejemplos prácticos
Eliminar espacios en blanco al principio
Imagina que necesitas quitar los espacios del inicio de un texto antes de enviarlo a un programa. Puedes hacerlo así:
DCL VAR(&CHAR) TYPE(*CHAR) LEN(30)
CHGVAR VAR(&CHAR) VALUE(' Text starts here')
CALL PGM(TESTCL) PARM((%TRIML(&CHAR)))
En este ejemplo, %TRIML elimina los espacios al principio de la variable &CHAR antes de pasarla al programa TESTCL.
Convertir texto a número
También puedes convertir un número en formato texto a un valor numérico decimal:
DCL VAR(&CHAR) TYPE(*CHAR) LEN(6)
CHGVAR VAR(&CHAR) VALUE('123.45')
CALL PGM(TESTCL) PARM((%DEC(&CHAR 5 2) (*DEC 5 2)))
Aquí, %DEC convierte el texto a un número decimal. (*DEC 5 2) indica el tipo de dato del parámetro en el comando CALL (un número decimal con 5 dígitos y 2 decimales).
Enviar la longitud de una variable
Si necesitas enviar la longitud de una variable, puedes usar la función %LEN:
DCL VAR(&CHAR) TYPE(*CHAR) LEN(15)
CHGVAR VAR(&CHAR) VALUE('Something')
CALL PGM(TESTCL) PARM((&CHAR) (%LEN(&CHAR) (*DEC 3 0)))
Este código envía la variable &CHAR y su longitud (como un número decimal de 3 dígitos) al programa TESTCL.
Extraer parte de un texto
Para extraer una parte específica de un texto (una subcadena), puedes usar %SST (que es lo mismo que %SUBSTRING):
DCL VAR(&CHAR) TYPE(*CHAR) LEN(26)
CHGVAR VAR(&CHAR) VALUE('ABCDEFGHIJKLMNOPQRSTUVWXYZ')
CALL PGM(TESTCL) PARM((%SST(&CHAR 5 5) (*CHAR 5)))
Este código extrae 5 caracteres del texto &CHAR, comenzando en la posición 5, y los envía al programa TESTCL.
Limitaciones
Ten en cuenta que no puedes anidar funciones dentro de otras dentro de un parámetro. Por ejemplo, intentar usar %LEN(%TRIM(&CHAR)) causará un error.
Conclusión
Poder usar funciones directamente en los parámetros de los comandos CALL te da más control y flexibilidad al programar en CL. Aunque hay algunas limitaciones, esta funcionalidad es una herramienta muy útil para los desarrolladores de IBM i.
Puedes encontrar más información y ejemplos en: https://www.rpgpgm.com/2024/11/using-expression-in-cl-call-parameters.html