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))