31 enero, 2014
Ejecutar mandatos del iSeries desde programas ILERPG
Cuando queremos ejecutar un mandato desde un programa RPG teníamos que hacer un CALL al típico QCMDEXC, lo que tenía sus limitaciones.
En ILERPG, la llamada a los mandatos del sistema la podemos realizar mediante un procedimiento externo a ese mismo programa, pero de una manera más ágil y sencilla.
Llamada directa a Mandatos
El procedimiento es bien sencillo, y comienza por incluir en las definiciones D la siguiente estructura
D Cmd PR ExtPgm(‘QCMDEXC’)
D command 200A const
D len 15P 5 const
En ella definimos el procedimiento externo con dos parámetros, la cadena del mandato que queremos ejecutar y la longitud del mismo.
Una vez definido el procedimiento, tan solo debemos declarar una variable y rellenarla con el mandato que queremos ejecutar y realizar la llamada.
C Eval Mandato=’COPY OBJ(»’+%Trim(Ruta)+»’) ‘+
C ‘TOOBJ(»’+%Trim(RutaDesc)+»’)’
C callp(e) cmd(Mandato:200)
Con este ejemplo realizamos un CPYF de un archivo cuyos nombres varían dentro del programa.
Yo personalmente, este procedimiento lo uso en casi todos los programas, sobre todo cuando tengo que hacer variaciones de ficheros y no quiero usar CL.
Un ejemplo muy práctico es cambiar el fichero de salida de impresión dentro del programa dependiendo de una opción introducida por pantalla.
Un caso práctico es este programa de impresión, que antes pregunta al usuario en que formato lo quiere, si en spool, en PDF o enviarlo por correo. De su elección dependerá a que impresora se envía dicho fichero de spool.
Lo primero a tener en cuenta es que no debemos abrir el archivo de spool hasta no haber tomado la decisión mediante la palabra clave USROPN en la definición o cerrarlo antes de modificarlo y luego volverlo a abrir.
Una vez tomada la decisión, montamos el mandato OVRPRTF, lo ejecutamos y abrimos el fichero.
Os dejo una muestra simplificada de como hacerlo….
FQSYSPRT O F 45 PRINTER USROPN
*——————————————————————————*
D Cmd PR ExtPgm(‘QCMDEXC’)
D command 400A const
D len 15P 5 const
D Mandato S 400A INZ(»)
*—————————————————————-
* Solicitamos Por Pantalla si Queremos PDF
C Call ‘CSMAP’
C Parm Opcion
*
C Select
C Opcion WhenEq ‘2’
C Movel ‘PRTPDF ‘ ImpPdf 7
C Opcion WhenEq ‘3’
C Movel ‘PRTPDF2’ ImpPdf
C Opcion WhenEq ‘4’
C Movel ‘PRTPDF3’ ImpPdf
C EndSl
*
C Movel VrcNDO NumPdf 7
C Eval Mandato=’OVRPRTF FILE(QSYSPRT) ‘
C +’OUTQ(‘+ImpPdf+’) DEVTYPE(*AFPDSLINE) ‘
C +’PAGDFN(PDFFAC) FORMDF(PDFFAC) ‘
C +’FORMTYPE(*STD) ‘
C +’USRDTA(‘+VrcSer+NumPdf+’)’
C callp cmd(Mandato:400)
C Open QSYSPRT
Tambien puedes usar lo siguiente:
Eval Mandato=’OVRPRTF FILE(QSYSPRT) ‘
C +’OUTQ(‘+ImpPdf+’) DEVTYPE(*AFPDSLINE) ‘
C +’PAGDFN(PDFFAC) FORMDF(PDFFAC) ‘
C +’FORMTYPE(*STD) ‘
C +’USRDTA(‘+VrcSer+NumPdf+’)’
C callp cmd(Mandato:%len(mandato))
Con esto no haces la llamada con la longitud completa, sino con la exacta que tenga la variable mandato. No es gran cosa, pero por aprender…
Pregunta: desde un programa en sqlrpg, puedo ejecutar el comando (QCMDEXC) para hacer una actualizacion a un archivo con una sentencia (SQL) update *libl/archivo set campo1 = cambio1 where campo2 =variable2
o este comando solo sirve para hacer (delete-cpyf-etc.etc.)
gracias por su respuesta
Buenos días Angel.
El mandato QCMDEXC solo sirve para ejecutar directamente mandatos del iSeries.
Para hacer lo que tu pretendes yo me crearía un programa RPGSQL con los parámetros necesarios y un mandato que lo llame y desde el programa RPGSQL solo tendrías que llamar a ese mandato que has creado.
También, en las ultimas versiones existe en mandato RUNSQL donde puedes ejecutar directamente una sentencia SQL.
Aquí el problema está en el paso de parámetros, por lo que tendrías que crearte una CL con el parámetro que montase una variable con la sentencia completa que ejecuta el RUNSQL.
No sé si te soluciono el problema, pero si quieres más información de alguna de estas dos opciones no dudes en preguntar.
Saludos