Os env�o un CL y un QMQRY en formato SQL, para que pod�is controlar en una cadena, un
trabajo que hay�is sometido con SBMJOB.
Yo lo utilizo, sobre todo, para trabajos que generan un fichero y este fichero se
utiliza en el siguiente paso de la cadena.
Antes utilizaba el mandato CHKOBJ, pero no me val�a porque el fichero se crea en el
momento que el DB2/400 estima que tiene X registros pero no cuando ha terminado de
llenarlo.
Espero que os sirva.
Saludos.
Francisco Rubio Enr�quez
{\rtf1\ansi\ansicpg1252\deff0\deflang1034{\fonttbl{\f0\fnil\fcharset0 Courier New;}}
{\colortbl ;\red255\green0\blue0;}
\viewkind4\uc1\pard\f0\fs20 0001.00 /* *****************************************************/\par
0004.00 /* */\par
0005.00 /* CONTROL DE TRABAJOS EN SBMJOB */\par
0006.00 /* */\par
0007.00 /* *****************************************************/\par
0008.00 /* Este programa realiza el control de los trabajos */\par
0009.00 /* que se est\'e1n ejecutando mediante SBMJOB */\par
0010.00 /* */\par
0011.00 /* Utilizaremos la QTEMP para poder llamar a este */\par
0012.00 /* programa desde cualquier pantalla. */\par
0013.00 /* */\par
0014.00 /* Proceso */\par
0015.00 /* ======= */\par
0016.00 /* 1. El programa llamante realiza el SBMJOB con el */\par
0017.00 /* nombre del JOB determinado */\par
0018.00 /* 2. El programa llamante llamar\'e1 a este programa */\par
0019.00 /* pas\'e1ndole dos par\'e1metros: */\par
0020.00 /* P1 - Nombre del JOB del SBMJOB */\par
0021.00 /* P2 - Estado relleno a blancos */\par
0022.00 /* 3. El programa llamante a continuaci\'f3n de la llamada*/\par
0023.00 /* del punto 2, preguntar\'e1 por el par\'e1metro P2: */\par
0024.00 /* Si P2 = espacios, el trabajo ha finalizado */\par
0025.00 /* y podremos continuar en secuencia */\par
0026.00 /* Si P2 = 'ACTIVO', el trabajo est\'e1 todav\'eda */\par
0027.00 /* ejecut\'e1ndose en Batch, entonces */\par
0028.00 /* volveremos a ejecutar el paso 2 */\par
0029.00 /* IMPORTANTE: */\par
0030.00 /* ---------- */\par
0031.00 /* Este programa genera el listado proporcionado por */\par
0032.00 /* el mandato WRKSBMJOB *USER *PRINT de la versi\'f3n del */\par
0033.00 /* OS/400 V4R4M0. */\par
0034.00 /* Esto quiere decir que debemos controlar cuando */ \par
0035.00 /* cambia la versi\'f3n, si el formato del listado ha */ \par
0036.00 /* cambiado, ya que se hacen preguntar (SQL) sobre */ \par
0037.00 /* determinadas posiciones de dicho listado, una vez */ \par
0038.00 /* que se ha transformado en fichero (NMESBMJOB) */ \par
0039.00 /* *****************************************************/ \par
0040.00 PGM PARM(&SBMJOB &ESTADO) \par
0041.00 DCL VAR(&SBMJOB) TYPE(*CHAR) LEN(10) \par
0042.00 DCL VAR(&ESTADO) TYPE(*CHAR) LEN(6) \par
0043.00 \par
0044.00 DCL VAR(&PANTALLA) TYPE(*CHAR) LEN(10) \par
0045.00 DCL VAR(&USUARIO) TYPE(*CHAR) LEN(10) \par
0046.00 DCL VAR(&NUMTRABAJO) TYPE(*CHAR) LEN(6) \par
0047.00 \par
0048.00 DCL VAR(®ISTROS) TYPE(*DEC) LEN(10 0) \par
0049.00 \par
0050.00 DCL VAR(&APOSTROFO) TYPE(*CHAR) LEN(1) + \par
0051.00 VALUE('''') \par
0052.00 DCL VAR(&VARSBMJOB) TYPE(*CHAR) LEN(12) \par
0053.00 \par
0054.00 /* Generamos el listado del WRKSBMJOB (QPDSPSBJ) */ \par
0055.00 \par
0056.00 WRKSBMJOB OUTPUT(*PRINT) \par
0057.00 \par
0058.00 /* Creamos el fichero f\'edsico para transformar el listado anterior */ \par
0059.00 \par
0060.00 DLTF FILE(QTEMP/NMESBMJOB) \par
0061.00 MONMSG MSGID(CPF2105) \par
\cf1\b 0062.00 CRTPF FILE(QTEMP/NMESBMJOB) RCDLEN(132) TEXT('NME + \par
0063.00 - CONTROL DE TRABAJOS SBMJOB') \par
\cf0\b0 0064.00 \par
0065.00 /* Copiamos el listado al fichero f\'edsico */ \par
0066.00 /* Recuperamos antes valores de la sesi\'f3n que llama a este programa */\par
0067.00 \par
0068.00 RTVJOBA JOB(&PANTALLA) USER(&USUARIO) NBR(&NUMTRABAJO) \par
0069.00 CPYSPLF FILE(QPDSPSBJ) TOFILE(QTEMP/NMESBMJOB) + \par
0070.00 JOB(&NUMTRABAJO/&USUARIO/&PANTALLA) + \par
0071.00 SPLNBR(*LAST) \par
0072.00 \par
0073.00 /* Ejecutamos QMQRY con la sentencia SQL correspondiente */ \par
0074.00 /* Le pasamos como par\'e1mtro el &SBMJOB recibido */ \par
0075.00 /* Nos generar\'e1 un fichero temporal con los registros deseados */ \par
0076.00 /* Consideraremos los valores OUTQ (11/02/03) para ver si ha acabado */\par
0077.00 \par
0078.00 DLTF FILE(QTEMP/NMESBMJOBX) \par
0079.00 MONMSG MSGID(CPF2105) \par
0080.00 CHGVAR VAR(&VARSBMJOB) VALUE(&APOSTROFO || &SBMJOB + \par
0081.00 || &APOSTROFO) \par
\cf1\b 0082.00 STRQMQRY QMQRY(NMEQSQSBMJ) OUTPUT(*OUTFILE) + \par
0083.00 OUTFILE(QTEMP/NMESBMJOBX) + \par
0084.00 SETVAR((QSQSBMJOB &VARSBMJOB)) \par
\cf0\b0 0085.00 \par
0086.00 /* Contamos los registros del fichero generado */ \par
0087.00 /* Si tiene registros quiere decir que ha acabado */ \par
0088.00 \par
0089.00 CHGVAR VAR(&ESTADO) VALUE('ACTIVO') \par
0090.00 RTVMBRD FILE(QTEMP/NMESBMJOBX) NBRCURRCD(®ISTROS)\par
0091.00 IF COND(®ISTROS *NE 0) THEN(DO) \par
0092.00 CHGVAR VAR(&ESTADO) VALUE(' ') \par
0093.00 ENDDO \par
0094.00 \par
0095.00 /* Final del programa y borrado de ficheros temporales */ \par
0096.00 \par
0097.00 DLTF FILE(QTEMP/NMESBMJOBX) \par
0098.00 MONMSG MSGID(CPF2105) \par
0099.00 DLTF FILE(QTEMP/NMESBMJOB) \par
0100.00 MONMSG MSGID(CPF2105) \par
0101.00 DLTSPLF FILE(QPDSPSBJ) + \par
0102.00 JOB(&NUMTRABAJO/&USUARIO/&PANTALLA) +\par
0103.00 SPLNBR(*LAST) \par
0104.00 MONMSG MSGID(CPF3303) \par
0105.00 \par
0106.00 ENDPGM \par
\par
\par
\cf1\ul\b Y ESTA ES LA SENTENCIA SQL GENERADA POR EL QMQRY "NMEQSQSBMJ"\par
\cf0\ulnone\b0\par
0001.00 SELECT \par
0002.00 -- Columnas \par
0003.00 A.NMESBMJOB \par
0004.00 -- Tablas \par
0005.00 FROM "QTEMP"/"NMESBMJOB" A \par
0006.00 -- Selecci\'f3n de Filas \par
0007.00 -- El valor OUTQ nos indicar\'e1 que ha terminado \par
0008.00 WHERE (SUBSTR(NMESBMJOB, 4, 10) = &QSQSBMJOB) \par
0009.00 AND (SUBSTR(NMESBMJOB, 49, 6) = 'OUTQ ') \par
\par
\par
\par
\par
\par
}