Hola Jaime

Hace tiempo que se publico una utilidad para poder ejecutar sentencias SQL desde un CL. Te la envio adjunto al mensaje para que la utilices. Fue publicada por la revista News 3x/400 en Enero del 95 (ya ha llovido). Solo tienes que crear un QM con las siguientes instrucciones:

&LINE01&LINE02&LINE03&LINE04&LINE05&LINE06&LINE07&LINE08&LINE09&LINE10

   y después compilar el programa y el comando.

   Salu2

   Fernando Martínez


Jaime Villa Torres escribió:

Fernando, la idea es poder crear dinámicamente la consulta o query de la
misma forma que se crea utilizando el cmd WRKQRY, y luego realizar el runqry
o strqmqry
Jaime Villa T.
----- Mensaje original ----- De: "Fernando Martínez" <[EMAIL PROTECTED]>
Para: <[email protected]>
Enviado: Martes, 06 de Septiembre de 2005 01:29 a.m.
Asunto: Re: Qry o Cpyf - Fernando Martinez


Hola Jaime

   Otra opcion mas rapida de probar es ejecutando el comando STRQMQRY
de la siguiente forma:

   STRQMQRY QMQRY(MY_LIB/MY_QRY)  ==> Aqui pones el Query ya creado
                          OUTPUT(*OUTFILE)
                         OUTFILE(MY_LIB/MY_OUTFILE)  ==> Aqui tu
fichero de salida
                         ALWQRYDFN(*ONLY)  ==> Y este parametro para
hacer que utilize exclusivamente la definicion del Query.

   Salu2

   Fernando Martinez


Jaime Villa Torres escribió:

Podrías ampliarnos un poco mas tu conocimiento, respecto a como en QM

Jaime Villa T.
----- Mensaje original ----- De: "Fernando Martínez" <[EMAIL PROTECTED]>
Para: <[email protected]>
Enviado: Lunes, 05 de Septiembre de 2005 02:14 a.m.
Asunto: Re: Qry o Cpyf


Podrias hacerlo con QM que te permite pasarle los parametros que necesitas.

Salu2

Fernando Martinez


Jaime Villa Torres escribió:



Estuve en una prueba de copiar 15.000.000. de registros de un archivo
a otro, en tres tipos de máquina, la conclusión, el qry la realizó en
mucho menos tiempo que el cpyf. El qry simplemente tenia definido el
nombre del archivo/biblioteca de consulta y de salida, generar el
informe a: archivo, y el archivo/biblioteca destino, archivo que por
supuesto tiene las mismas especificaciones técnicas del de entrada y
además sus respectivos lógicos.
Mirando esta eficiencia, les pregunto, existe alguna forma, desde CL o
RPGIV de crear el qry y omitir el WRKQRY, para ingresar como
parámetros el nombre del consulta, el nombre del archivo/biblioteca de
consulta, decirle al qry que genere el informe a un archivo, y el
archivo/biblioteca del archivo de salida?, teniendo esto ya se
realizaría simplemente el RUNQRY de la consulta antes creada.

Jaime Villa T.





/******************************************************************/
/* CL del Mandato RUNSQL - (c) NEWS 3X/400 En español. Enero 1995 */
/******************************************************************/

 SQL:        PGM        PARM(&LINES &TYPE &OUTFILE &OUTMBR &PRTFILE)
             DCL        VAR(&TYPE) TYPE(*CHAR) LEN(10)
             DCL        VAR(&LINES) TYPE(*CHAR) LEN(550)
             DCL        VAR(&LINE01) TYPE(*CHAR) LEN(55)
             DCL        VAR(&LINE02) TYPE(*CHAR) LEN(55)
             DCL        VAR(&LINE03) TYPE(*CHAR) LEN(55)
             DCL        VAR(&LINE04) TYPE(*CHAR) LEN(55)
             DCL        VAR(&LINE05) TYPE(*CHAR) LEN(55)
             DCL        VAR(&LINE06) TYPE(*CHAR) LEN(55)
             DCL        VAR(&LINE07) TYPE(*CHAR) LEN(55)
             DCL        VAR(&LINE08) TYPE(*CHAR) LEN(55)
             DCL        VAR(&LINE09) TYPE(*CHAR) LEN(55)
             DCL        VAR(&LINE10) TYPE(*CHAR) LEN(55)

             DCL        VAR(&OUTFILE) TYPE(*CHAR) LEN(20)
             DCL        VAR(&OFIL) TYPE(*CHAR) LEN(10)
             DCL        VAR(&OLIB) TYPE(*CHAR) LEN(10)
             DCL        VAR(&OUTMBR) TYPE(*CHAR) LEN(20)
             DCL        VAR(&OMBR) TYPE(*CHAR) LEN(10)
             DCL        VAR(&ORPL) TYPE(*CHAR) LEN(10)
             DCL        VAR(&PRTFILE) TYPE(*CHAR) LEN(20)
             DCL        VAR(&PFIL) TYPE(*CHAR) LEN(10)
             DCL        VAR(&PLIB) TYPE(*CHAR) LEN(10)

/* Campos del tratamiento estandard de errores */
             DCL        VAR(&MSGID) TYPE(*CHAR) LEN(7)
             DCL        VAR(&MSGDTA) TYPE(*CHAR) LEN(100)
             DCL        VAR(&MSGF) TYPE(*CHAR) LEN(10)
             DCL        VAR(&MSGFLIB) TYPE(*CHAR) LEN(10)
             DCL        VAR(&ERRORSW) TYPE(*LGL)

             MONMSG     MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))

             CHGVAR     VAR(&LINE01) VALUE(%SST(&LINES 1 55))
             CHGVAR     VAR(&LINE02) VALUE(%SST(&LINES 56 55))
             CHGVAR     VAR(&LINE03) VALUE(%SST(&LINES 111 55))
             CHGVAR     VAR(&LINE04) VALUE(%SST(&LINES 166 55))
             CHGVAR     VAR(&LINE05) VALUE(%SST(&LINES 221 55))
             CHGVAR     VAR(&LINE06) VALUE(%SST(&LINES 276 55))
             CHGVAR     VAR(&LINE07) VALUE(%SST(&LINES 331 55))
             CHGVAR     VAR(&LINE08) VALUE(%SST(&LINES 386 55))
             CHGVAR     VAR(&LINE09) VALUE(%SST(&LINES 441 55))
             CHGVAR     VAR(&LINE10) VALUE(%SST(&LINES 496 55))

             CHGVAR     VAR(&OFIL) VALUE(%SST(&OUTFILE 1 10))
             CHGVAR     VAR(&OLIB) VALUE(%SST(&OUTFILE 11 10))
             CHGVAR     VAR(&OMBR) VALUE(%SST(&OUTMBR 1 10))
             CHGVAR     VAR(&ORPL) VALUE(%SST(&OUTMBR 11 10))


             CHGVAR     VAR(&PFIL) VALUE(%SST(&PRTFILE 1 10))
             CHGVAR     VAR(&PLIB) VALUE(%SST(&PRTFILE 11 10))

             IF (&TYPE = '*OUTFILE') +
               THEN(DO)
             STRQMQRY  QMQRY(ZUQXSQL) OUTPUT(&TYPE) +
                             OUTFILE(&OLIB/&OFIL) OUTMBR(&OMBR +
                             &ORPL) ALWQRYDFN(*YES) SETVAR((LINE01 +
                             &LINE01) (LINE02 &LINE02) (LINE03 +
                             &LINE03) (LINE04 &LINE04) (LINE05 +
                             &LINE05) (LINE06 &LINE06) (LINE07 +
                             &LINE07) (LINE08 &LINE08) (LINE09 +
                             &LINE09) (LINE10 &LINE10))
             MONMSG     MSGID(QWM0000) EXEC(DO)
             SNDPGMMSG  MSGID(CPF9898) MSGF(QCPFMSG) MSGDTA('Error +
                          de sintaxis en la sentencia SQL.Vea los +
                          mensajes anteriores para mayor detalle ') +
                          MSGTYPE(*DIAG)
             ENDDO
           ENDDO
           ELSE (DO)
             OVRPRTF FILE(QPQXPRTF) TOFILE(&PLIB/&PFIL)
             STRQMQRY  QMQRY(ZUQXSQL) OUTPUT(&TYPE) +
                             ALWQRYDFN(*YES) SETVAR((LINE01 +
                             &LINE01) (LINE02 &LINE02) (LINE03 +
                             &LINE03) (LINE04 &LINE04) (LINE05 +
                             &LINE05) (LINE06 &LINE06) (LINE07 +
                             &LINE07) (LINE08 &LINE08) (LINE09 +
                             &LINE09) (LINE10 &LINE10))
             MONMSG     MSGID(QWM0000) EXEC(DO)
             SNDPGMMSG  MSGID(CPF9898) MSGF(QCPFMSG) MSGDTA('Error +
                          de sintaxis en la sentencia SQL.Vea los +
                          mensajes anteriores para mayor detalle ') +
                          MSGTYPE(*DIAG)
             ENDDO
           DLTOVR   FILE(QPQXPRTF)
           ENDDO
      RETURN    /* Final normal del programa */
ERROR: /* Tratamiento estandard de errores */
      IF COND(&ERRORSW) THEN(SNDPGMMSG MSGID(CPF9999) +
           MSGF(QCPFMSG) MSGTYPE(*ESCAPE)) /* Mensaje +
           de verificacion de funcion */
      CHGVAR VAR(&ERRORSW) VALUE('1')
ERROR2: RCVMSG MSGTYPE(*DIAG) MSGDTA(&MSGDTA) MSGID(&MSGID) +
                 MSGF(&MSGF) MSGFLIB(&MSGFLIB)
        IF COND(&MSGID = '       ') THEN(GOTO +
             CMDLBL(ERROR3))
        SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) +
                    MSGDTA(&MSGDTA) MSGTYPE(*DIAG)
        GOTO CMDLBL(ERROR2)
ERROR3: RCVMSG MSGTYPE(*EXCP) MSGDTA(&MSGDTA) MSGID(&MSGID) +
                 MSGF(&MSGF) MSGFLIB(&MSGFLIB)
        SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) +
                    MSGDTA(&MSGDTA) MSGTYPE(*ESCAPE)
        ENDPGM
/**************************************************************/
/* MANDATO RUNSQL - (C) NEWS 3X/400 EN ESPAÑOL, ENERO 1995    */
/**************************************************************/

             CMD        PROMPT('Procesador de mandatos SQL')
             PARM       KWD(REQUEST) TYPE(*CHAR) LEN(550) MIN(1) +
                          PROMPT('Solicitud de SQL')
             PARM       KWD(OUTPUT) TYPE(*CHAR) LEN(10) RSTD(*YES) +
                          DFT(*) VALUES(* *PRINT *OUTFILE) MIN(0) +
                          PROMPT('Salida')
             PARM       KWD(OUTFILE) TYPE(T1) MIN(0) PMTCTL(P1) +
                          PROMPT('Archivo para recibir la salida')
             PARM       KWD(MEMBER) TYPE(T2) MIN(0) PMTCTL(P1) +
                          PROMPT('Opciones de salida miembro')
             PARM       KWD(PRTFILE) TYPE(T3) MIN(0) PMTCTL(P2) +
                          PROMPT('Archivo de impresora a usar')
 T1:         QUAL       TYPE(*NAME) LEN(10)
             QUAL       TYPE(*NAME) LEN(10) DFT(*LIBL) +
                          SPCVAL((*LIBL) (*CURLIB)) +
                          PROMPT('Biblioteca')
 T2:         QUAL       TYPE(*NAME) LEN(10) DFT(*FIRST) +
                          SPCVAL((*FIRST))
             QUAL       TYPE(*NAME) LEN(10) RSTD(*YES) DFT(*REPLACE) +
                          SPCVAL((*REPLACE) (*ADD)) +
                          PROMPT('Reemplazar o añadir registros')
 T3:         QUAL       TYPE(*NAME) LEN(10) DFT(QPQXPRTF)
             QUAL       TYPE(*NAME) LEN(10) DFT(*LIBL) +
                          SPCVAL((*LIBL) (*CURLIB)) +
                          PROMPT('Biblioteca')
 P1:         PMTCTL     CTL(OUTPUT) COND((*EQ *OUTFILE))
 P2:         PMTCTL     CTL(OUTPUT) COND((*EQ *PRINT))

Responder a