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(&REGISTROS) 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(&REGISTROS)\par 0091.00 IF COND(&REGISTROS *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 }

Responder a