Ejecutar mandatos del iSeries desde programas ILERPG

1 Flares Twitter 0 Facebook 0 LinkedIn 1 Google+ 0 1 Flares ×

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

JoBenCa

http://jobenca.es

Administrador y desarrollador de sistemas IBM System i y curioso de todo tipo de tecnología.

View more posts from this author
3 thoughts on “Ejecutar mandatos del iSeries desde programas ILERPG
  1. Antonio Jesus Balboa Tome

    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…

     
    Reply
  2. Angel

    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

     
    Reply
    1. JoBenCa

      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

       
      Reply

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

1 Flares Twitter 0 Facebook 0 LinkedIn 1 Google+ 0 1 Flares ×