|
Hey Folks! A while back, someone requested information on how to tell if a job was active or not (sorry, already toasted the originals so I can't specify anything other than the mentioned "Brian & Dawn" below). We had a rather lengthy discussion of data area utilization for this purpose, but Mr. David Anderson may have a more elegant solution. He just reviewed a MIDRANGE-L "digest" from a co-worker and offered the following (and YES, I already asked him to join "the list" so please do not inundate him with similar requests). I have stored the mentioned RPG for interested parties, but won't waste David's bandwidth with it unless I receive too many requests. Please feel free to write me directly at the address below if you need the RPG... In a message dated 97-10-29 22:30:10 EST, DaveAnd@ix.netcom.com writes: > A co-worker of mine gave me a printout from the Midrange mailing list > that he has. You were answering a question for a "Brian & Dawn". They > have a batch job that needs to know if another batch job is running. > Unfortunately he didn't print the pages with their names on it, yours is > the only one I have. If you can pass something on to them I would > appreciate it. If not, let me know, and I'll try another way. > > I use AS/400 system API's to make sure that a job is not already running > or waiting in a JOBQ to run, so that it won't run more than once. > > The following is a sample of how I use it, and attached is the RPG > program I wrote to actually do the checking. It's generic, so it should > work for anyone. This was written on a system running V3R1. > > /* See if TCP_SNDF is already running */ > > PGM > > DCL VAR(&TGTJOB) TYPE(*CHAR) LEN(10) > DCL VAR(&RTNCOD) TYPE(*CHAR) LEN(10) > > CHGVAR VAR(&TGTJOB) VALUE('TCP_SNDF') > CHGVAR VAR(&RTNCOD) VALUE(' ') > > CALL PGM(TCPCHK) PARM(&TGTJOB &RTNCOD) > > IF COND(&RTNCOD *EQ '*INACTIVE') THEN(DO) > SBMJOB CMD(CALL PGM(TCR001) PARM('TCPFILES')) + > JOB(TCP_SNDF) JOBD(TCPJOBD) JOBQ(MACHH) OUTQ(*JOBD) + > USER(MACHTCP) CURLIB(*USRPRF) INLLIBL(*JOBD) > ENDDO > > > I hope you don't mind this intrusion, but I like to help when I can. > Who knows, maybe > this will help you to. > > Dave Anderson > DaveAnd@ix.netcom.com > Sysco Food Services of Los Angeles, Inc. Regards! Dean Asmussen Enterprise Systems Consulting, Inc. Fuquay-Varina, NC USA E-Mail: DAsmussen@aol.com "Too many people expect wonders from democracy, when the most wonderful thing of all is just having it." -- Walter Winchell --------------------- Forwarded message: From: DaveAnd@ix.netcom.com (David Anderson) To: DAsmussen@aol.com Date: 97-10-29 22:30:10 EST Dean, A co-worker of mine gave me a printout from the Midrange mailing list that he has. You were answering a question for a "Brian & Dawn". They have a batch job that needs to know if another batch job is running. Unfortunately he didn't print the pages with their names on it, yours is the only one I have. If you can pass something on to them I would appreciate it. If not, let me know, and I'll try another way. I use AS/400 system API's to make sure that a job is not already running or waiting in a JOBQ to run, so that it won't run more than once. The following is a sample of how I use it, and attached is the RPG program I wrote to actually do the checking. It's generic, so it should work for anyone. This was written on a system running V3R1. /* See if TCP_SNDF is already running */ PGM DCL VAR(&TGTJOB) TYPE(*CHAR) LEN(10) DCL VAR(&RTNCOD) TYPE(*CHAR) LEN(10) CHGVAR VAR(&TGTJOB) VALUE('TCP_SNDF') CHGVAR VAR(&RTNCOD) VALUE(' ') CALL PGM(TCPCHK) PARM(&TGTJOB &RTNCOD) IF COND(&RTNCOD *EQ '*INACTIVE') THEN(DO) SBMJOB CMD(CALL PGM(TCR001) PARM('TCPFILES')) + JOB(TCP_SNDF) JOBD(TCPJOBD) JOBQ(MACHH) OUTQ(*JOBD) + USER(MACHTCP) CURLIB(*USRPRF) INLLIBL(*JOBD) ENDDO I hope you don't mind this intrusion, but I like to help when I can. Who knows, maybe this will help you to. Dave Anderson DaveAnd@ix.netcom.com Sysco Food Services of Los Angeles, Inc.
F*---------------------------------------------------------------- F* PROGRAM: TCPCHK F* DESCRIPTION: THIS PROGRAM USES API'S TO DETERMINE IF A PARTICULAR F* JOB IS ACTIVE, OR ON THE JOB QUEUE. IF THE JOB IS F* ACTIVE, THIS PROGRAM RETURNS *ACTIVE IN THE RETURN F* CODE FIELD. IF THE TARGET PROGRAM IS ON A JOB QUEUE, F* *JOBQ IS RETURNED TO THE CALLING PROGRAM. IF THE TARGET F* JOB IS NOT ACTIVE AND IS NOT ON A JOB QUEUE, *INACTIVE F* IS RETURNED IN RTNCOD. F*---------------------------------------------------------------- F* API routines used: F* F* QUSCRTUS -- Create user space F* QUSLJOB -- Load job info into user space F* QUSRTVUS -- Retrieve user space F* QUSRJOBI -- Retrieve job information F* QWCRSSTS -- Retrieve system status information F*---------------------------------------------------------------- I* I*---------------------------------------------------------------- I* DEFINE CONSTANTS I*---------------------------------------------------------------- I* I 'User Space for User -C @USPTX I 'Jobs ' I* I*---------------------------------------------------------------- I* DATA STRUCTURES I*---------------------------------------------------------------- I* IBINARY DS I B 1 40SSIZE2 I B 5 80DTALG2 I B 9 120STRPO2 I B 13 160RCVLG2 I B 17 200@RCVLG I B 21 240@BYTPR I B 25 280@BYTAV I B 29 320@MSKLN I B 33 360@RCVLN I B 37 400@SRCPR I B 41 440@SRCDP I* I*---------------------------------------------------------------- I* Data structures for API QUSLJOB I*---------------------------------------------------------------- I* IINPUT2 DS I 1 26 QJOBI I 1 10 JOBNMI I 11 20 USRNMI I 21 26 JOBNOI I 27 36 STATI I 37 56 USRSP2 I 37 46 SNAME2 I 47 56 SLIBR2 I 57 64 FORMT2 I 65 65 JOBTYI I B 69 720FLDRTN I* 75 100 FLDNMI IJOB100 DS I 1 26 QJOBL I 1 10 JOBNML I 11 20 USRNML I 21 26 JOBNOL I 27 42 IJOBID I 43 52 STATL I 53 53 JOBTYP * Generic header description IHEADER DS I 1 64 HDUSAR I B 65 680HDGRSZ I 69 72 HDRLLV I 73 80 HDFMTN I 81 90 HDAPI I 91 103 HDDTTM I 104 104 HDISTS I B 105 1080HDSIZE I B 109 1120HDIPOS I B 113 1160HDIPSZ I B 117 1200HDHDOS I B 121 1240HDHDSZ I B 125 1280HDDSOS I B 129 1320HDDSIZ I B 133 1360HDNOEN I B 137 1400HDENSZ I* I*---------------------------------------------------------------- I* Data structures for API QUSRJOBI I*---------------------------------------------------------------- I* IINPUT3 DS I B 1 40DTALG3 I 5 12 FORMT3 I 13 38 JOBNM3 IJOB200 DS I B 1 40BYTRTN I B 5 80BYTVAL I 9 18 JOBNA3 I 19 28 USRNA3 I 29 34 JOBNB3 I 35 50 INTID3 I 51 60 JOBST3 I 61 61 JOBTY3 I 62 62 SUBTY3 I 63 72 SBSNA3 I B 73 760RUNPR3 I B 77 800POOLI3 I B 81 840CPUUS3 I B 85 880AUXRE3 I B 89 920INTRA3 I B 93 960RSPTI3 I 97 97 FNCTY3 I 98 107 FNCNA3 I 108 111 ACTJO3 I* I*---------------------------------------------------------------- I* Data structure for API QSYRUSRI I*---------------------------------------------------------------- I* IERRCOD DS I B 1 40BYTPRO I B 5 80BYTAVA I 9 15 EXCID I 16 16 RSVD01 I 17 116 EXDTA I* IPSSRC SDS I *STATUS PSTS C* C*---------------------------------------------------------------- C* Main Routune C*---------------------------------------------------------------- C* C EXSR SETUP C* C* Process the active jobs C* C MOVEL'*ACTIVE' STATI C EXSR GETDTA C* C* If nothing found - try the jobs queued on the job queues. C* C RTNCOD IFEQ *BLANK C MOVEL'*JOBQ ' STATI C EXSR GETDTA C ENDIF C* C* NORMAL END OF JOB C* C RTNCOD IFEQ *BLANK C MOVEL'*INACTIV'RTNCOD C MOVE 'E ' RTNCOD C ENDIF C* C MOVE *ON *INLR C* C*---------------------------------------------------------------- C* ERROR HANDLING ROUTINE C*---------------------------------------------------------------- C* C *PSSR BEGSR C* C* Error processing an API call - C* C PSRACT IFEQ '*ABEND ' C Z-ADD999999999 INC C MOVE *ON *INLR C ENDIF C* C ENDSR C* C*---------------------------------------------------------------- C* C*---------------------------------------------------------------- C* C SETUP BEGSR C* C *ENTRY PLIST C PARM TGTJOB 10 C PARM RTNCOD 10 C* C TGTJOB IFEQ *BLANKS C MOVEL'*ERROR' RTNCOD C ENDIF C* C MOVE *BLANK RTNCOD C* C* User space initialization values. C* C MOVEL'USRJOB' SNAME2 NAME C MOVEL'QTEMP' SLIBR2 LIBRARY C MOVE ' ' INZCHR 1 INITIAL VALUE C MOVEL' ' EXTATR 10 ATTRIBUTE C MOVEL'*ALL' SAUTH 10 PUBLIC AUTH. C MOVEL@USPTX STEXT 50 TEXT C Z-ADD8192 SSIZE2 SIZE C MOVE ' ' INZCHR 1 INITIAL VALUE C MOVEL'*YES' SREPL 4 REPLACE? C* C* User space retrieval initialization value. C* C MOVEL'*YES' REPLC 10 Replace Usr Spc C MOVE *BLANKS ERRCOD C MOVE *ZEROS BYTPRO C MOVE *ZEROS BYTAVA C* C* Create user space for user jobs C* C CALL 'QUSCRTUS' 56 C PARM USRSP2 C PARM EXTATR C PARM SSIZE2 C PARM INZCHR C PARM SAUTH C PARM STEXT C PARM REPLC C PARM ERRCOD C* C *IN56 CASEQ*ON *PSSR C ENDCS C* C ENDSR C* C*---------------------------------------------------------------- C* GETDTA: FILL USER SPACE WITH JOB INFORMATION C*---------------------------------------------------------------- C* C GETDTA BEGSR C* C MOVEL'JOBL0100'FORMT2 C MOVELTGTJOB JOBNMI C MOVEL'*ALL' USRNMI C MOVEL'*ALL' JOBNOI C* C MOVE *BLANKS ERRCOD C MOVE *ZEROS BYTPRO C MOVE *ZEROS BYTAVA C* C CALL 'QUSLJOB' C PARM USRSP2 C PARM FORMT2 C PARM QJOBI C PARM STATI C PARM ERRCOD C* C *IN56 CASEQ*ON *PSSR C ENDCS C* C* Set up the user profile extract data space header C* C Z-ADD001 STRPO2 C Z-ADD140 DTALG2 C* C* Load the data space header C* C CALL 'QUSRTVUS' 56 C PARM USRSP2 C PARM STRPO2 C PARM DTALG2 C PARM HEADER C PARM ERRCOD C* C* Load the offsets to the input data section C* C HDIPOS ADD 1 STRPO2 C Z-ADDHDIPSZ DTALG2 C* C* Load the input data from header C* C MOVE *BLANKS ERRCOD C MOVE *ZEROS BYTPRO C MOVE *ZEROS BYTAVA C* C CALL 'QUSRTVUS' 56 C PARM USRSP2 C PARM STRPO2 C PARM DTALG2 C PARM INPUT2 C PARM ERRCOD C* C* Process the detail data C* C* Load the offsets to the entry data section C* C HDDSOS ADD 1 STRPO2 C Z-ADDHDENSZ DTALG2 C* C 1 DO HDNOEN INC 60 C* C* Load the input data from header C* C MOVE *BLANKS ERRCOD C MOVE *ZEROS BYTPRO C MOVE *ZEROS BYTAVA C* C CALL 'QUSRTVUS' 56 C PARM USRSP2 C PARM STRPO2 C PARM DTALG2 C PARM JOB100 C PARM ERRCOD C* C* Get the detail information for the job - QUSRJOBI C* C MOVEL'JOBI0200'FORMT3 C MOVEL'*INT 'JOBNM3 C MOVE IJOBID INTID3 C Z-ADD111 DTALG3 C* C MOVE *BLANKS ERRCOD C MOVE *ZEROS BYTPRO C MOVE *ZEROS BYTAVA C* C MOVEL'*SKIP 'PSRACT 8 C CALL 'QUSRJOBI' 56 C PARM JOB200 C PARM DTALG3 C PARM FORMT3 C PARM JOBNM3 C PARM INTID3 C PARM ERRCOD C* C *IN56 CASEQ*ON *PSSR C ENDCS C* C* Flag the status based on the type of run... ACTIVE or JOBQ C* C MOVELSTATI RTNCOD C* C ENDDO C* C ENDSR
As an Amazon Associate we earn from qualifying purchases.
This mailing list archive is Copyright 1997-2024 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].
Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.