顯示具有 SPLF 標籤的文章。 顯示所有文章
顯示具有 SPLF 標籤的文章。 顯示所有文章

星期一, 11月 13, 2023

2023-11-13 Retrieve Current job last spooled file ID with API QSPRILSP


Retrieve Last Spooled file ID with API QSPRILSP
擷取 Job 最後產生的報表資訊 API QSPRILSP

pgm 
                                                  
   dcl   &SplfNbr1    *int    4
   dcl   &SplfNbr2    *int    4                   
                                                  
   dcl   &RcvVar        *char  70                   
   dcl     &BytesAvail  *int    4  stg(*defined) defvar(&RcvVar  1) 
   dcl     &BytesRtn    *int    4  stg(*defined) defvar(&RcvVar  5) 
   dcl     &SplfName    *char  10  stg(*defined) defvar(&RcvVar  9) 
   dcl     &JobName     *char  10  stg(*defined) defvar(&RcvVar 19) 
   dcl     &UserName    *char  10  stg(*defined) defvar(&RcvVar 29) 
   dcl     &JobNbr      *char   6  stg(*defined) defvar(&RcvVar 39) 
   dcl     &SplfNbr     *int    4  stg(*defined) defvar(&RcvVar 45) 
   dcl     &SysName     *char   8  stg(*defined) defvar(&RcvVar 49) 
   dcl     &SplfCrtDat  *char   7  stg(*defined) defvar(&RcvVar 57) 
   dcl     &SplfCrtTim  *char   6  stg(*defined) defvar(&RcvVar 65) 

   dcl   &RcvVarLen   *int    4    value(70)               
   dcl   &FmtName     *char  10                   
   dcl   &ErrorCode   *char   8                   
                                                  
   dcl   &Stat        *lgl                        
   dcl   &SplfExists  *lgl                        
                                                  

   callsubr subr(RtvSplfNbr) rtnval(&SplfNbr1)                   
   call     pgm1                                               
   callsubr subr(RtvSplfNbr) rtnval(&SplfNbr2)                   

/* If pgm1 created a report, continue with other tasks. */
   if (&SplfNbr2 *ne &SplfNbr1) do  
      call pgm2                             
      call pgm3                             
      call pgm4                             
   enddo                                     
   return                                    
       
subr subr(RtvSplfNbr) 
        
   chgvar   &BytesAvail         70 
   chgvar   &FmtName            'SPRL0100' 
   chgvar   &ErrorCode          x'0000000000000000' 
                                         
   chgvar   &SplfExists  '1'         
   call     QSPRILSP     (&RcvVar &RcvVarLen &FmtName &ErrorCode)  
   monmsg   cpf333a      exec(chgvar &SplfExists '0') 
   if (&SplfExists) then
   else do        
      chgvar   &SplfNbr        0    
   enddo                                
                                        
endsubr rtnval(&SplfNbr) 
                           
endpgm



Copy from https://www.itjungle.com/2006/02/08/fhg020806-story01/

星期四, 11月 09, 2023

2014-05-12 如何於 java 環境中透過 QTEMP library 取得執行指令所輸出的報表內容?(AS400CommandOutput.java)


2014-05-12 如何於 java 環境中透過 QTEMP library 取得執行指令所輸出的報表內容?
AS400CommandOutput.java -- AS400 command output spooled file to TEXT file within QTEMP 

Many CLP to get command spooled output to QTEMP outfile in CLP, but when the CLP call by Java command server, 
could not get the QTEMP file. 

The AS400CommandOutput will run your command output to spooled and use CPYSPLF command to copy spooled to 
QTEMP outfile and read all record to TEXT file within QTEMP use AS400File.runCommand() method. 





AS400CommandOutput.java
        



    package com.free400.vengoal;
     
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.Enumeration;
     
    import com.ibm.as400.access.AS400;
    import com.ibm.as400.access.AS400Exception;
    import com.ibm.as400.access.AS400File;
    import com.ibm.as400.access.AS400FileRecordDescription;
    import com.ibm.as400.access.AS400Message;
    import com.ibm.as400.access.CommandCall;
    import com.ibm.as400.access.Job;
    import com.ibm.as400.access.QSYSObjectPathName;
    import com.ibm.as400.access.Record;
    import com.ibm.as400.access.RecordFormat;
    import com.ibm.as400.access.SequentialFile;
    import com.ibm.as400.access.SpooledFile;
    import com.ibm.as400.access.SpooledFileList;
     
    public class AS400CommandOutput {
        
        private static final String FILE_SEPARATOR_PROP = "file.separator";
        public static java.text.SimpleDateFormat datetimeFmt = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        private AS400 as400;
        private CommandCall commandCall;
        private SequentialFile seqfile;
        private String lastSplfName=null, lastSplfJob=null, lastSplfUsr=null, lastSplfJobNbr=null;
        private int lastSplfNbr=0;
        private String file;
        private String commandJobNbr;
        private String ddmJobNbr;
        private File toFile = null;
        private PrintWriter writer_;
        private FileOutputStream os;
        private boolean fileOpened = false;
     
        public AS400CommandOutput(AS400 as400){
            this.as400 = as400;
            this.commandCall = new CommandCall(this.as400);
        }
        
        public AS400CommandOutput(AS400 as400, File toFile){
            this.as400 = as400;
            this.toFile = toFile;
            this.commandCall = new CommandCall(this.as400);
        }
        
        public AS400 getSystem(){
            return as400;
        }    
     
        public String getCommandJobNbr(){
            String cmdJobNbr = null;
            try {
                as400.connectService(AS400.COMMAND);
                Job[] as400Jobs = as400.getJobs(AS400.COMMAND);
                for(int i=0; i < as400Jobs.length; i++){
                    cmdJobNbr = as400Jobs[i].getNumber();
                    System.out.println("Linking to AS400 job: " + as400Jobs[i].getNumber() + "/" + as400Jobs[i].getUser() + "/" + as400Jobs[i].getName());
                }
            } catch (Exception e) {
                e.printStackTrace();
            }        
            return cmdJobNbr;
        }
        
        public String getDDMJobNbr(){
            String ddmJobNbr = null;
            try {
                as400.connectService(AS400.RECORDACCESS);
                Job[] as400Jobs = as400.getJobs(AS400.RECORDACCESS);
                for(int i=0; i < as400Jobs.length; i++){
                    ddmJobNbr = as400Jobs[i].getNumber();
                    System.out.println("Linking to AS400 job: " + as400Jobs[i].getNumber() + "/" + as400Jobs[i].getUser() + "/" + as400Jobs[i].getName());
                }
            } catch (Exception e) {
                e.printStackTrace();
            }        
            return ddmJobNbr;
        }
        
        public void getLastSplfInfo(String selectSplfName, boolean deleteSplf) throws Exception{
            String splfName, splfJob, splfUsr, splfJobNbr, splfDate,splfTime;
            int splfNbr; 
            String lastSplfDateTime=" ";
            String splfDateTime;     
        
            SpooledFileList splfList = new SpooledFileList( as400 );
            // set filters, all users, on all queues
            splfList.setUserFilter(as400.getUserId());
            splfList.setQueueFilter("/QSYS.LIB/%ALL%.LIB/%ALL%.OUTQ");
            // open list, openSynchronously() returns when the list is completed.
            splfList.openSynchronously();
            Enumeration enumer = splfList.getObjects();            
            while( enumer.hasMoreElements() )
            {
                SpooledFile splf = (SpooledFile)enumer.nextElement();
                if ( splf != null )
                {
                    // output this spooled file's name
                    splfName = splf.getStringAttribute(SpooledFile.ATTR_SPOOLFILE);
                    splfJob = splf.getStringAttribute(SpooledFile.ATTR_JOBNAME);
                    splfUsr = splf.getStringAttribute(SpooledFile.ATTR_JOBUSER);
                    splfJobNbr =  splf.getStringAttribute(SpooledFile.ATTR_JOBNUMBER);
                    splfDate =  splf.getStringAttribute(SpooledFile.ATTR_DATE);
                    splfTime =  splf.getStringAttribute(SpooledFile.ATTR_TIME);
                    splfNbr = splf.getIntegerAttribute(SpooledFile.ATTR_SPLFNUM);
                    splfDateTime = splfDate + splfTime;
                    //System.out.println("splfDate:" + splfDate + " splfTime:" + splfTime + " job:" + splfJobNbr + "/"+ splfUsr + "/" + splfJob +  " spooled file = " + splfName + " splfNbr=" + splfNbr);
                    if(splfName.equalsIgnoreCase(selectSplfName) && splfJob.equalsIgnoreCase("QPRTJOB")){
                        if (deleteSplf){
                            splf.delete();
                        } else if (splfDateTime.compareTo(lastSplfDateTime) > 0){
                            lastSplfDateTime = splfDateTime;
                            lastSplfName = splfName;
                            lastSplfJob  = splfJob;
                            lastSplfUsr  = splfUsr;                         
                            lastSplfJobNbr=splfJobNbr;
                            lastSplfNbr = splfNbr;
                        }
                    }
                }
                //System.out.println("last SPLFInfo: job " + lastSplfJobNbr + "/"+ lastSplfUsr + "/" + lastSplfJob + " lastSplfName:" + lastSplfName + " lastSplfNbr:" + lastSplfNbr);
            }
            // clean up after we are done with the list
            splfList.close();
        }
        
        public void cpysplfWithQtemp(String splfName, boolean deleteTempFile) throws Exception{
            if(seqfile == null){
                seqfile = new SequentialFile();
                seqfile.setSystem(as400);
                seqfile.setPath("/QSYS.LIB/QGPL.LIB/QDDSSRC.FILE"); // for run following command use;
            }
     
            if(ddmJobNbr == null)
                ddmJobNbr = getDDMJobNbr();        
     
            file = splfName.substring(0, 4) + ddmJobNbr;        
            
            getLastSplfInfo(splfName, false);
            CPYSPLF(seqfile, lastSplfName, lastSplfJob, lastSplfUsr, lastSplfJobNbr, lastSplfNbr, true, "QTEMP", file, "M000000000", 201);
            seqfile.setPath(new QSYSObjectPathName("QTEMP", file, "M000000000", "MBR").getPath());
            setRecordFormat();
            if(toFile == null)
                readAll();
            else
                readAll(toFile);
            getLastSplfInfo(splfName, true);
        }
        
        public void readAll(){
            readAll(null);
        }
        
        public void readAll(File toFile){
            try {
                seqfile.open(AS400File.READ_ONLY, 100, AS400File.COMMIT_LOCK_LEVEL_NONE);
                Record dataRcd = seqfile.readNext();
                while (dataRcd != null) {
                    if(toFile == null)
                        onRecord(dataRcd);
                    else
                        onRecord(toFile, dataRcd);
                    dataRcd = seqfile.readNext();
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    seqfile.close();
                    if(fileOpened){
                        writer_.close();
                        os.close();
                        fileOpened = false;
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        
        public void onRecord(Record record) {
            System.out.println(getClass() + ":" + record);        
        }
        
        public void onRecord(File file, Record record) throws IOException{
            if(!fileOpened){
                os = new FileOutputStream(file, file.exists());
                writer_ = new PrintWriter(os, true);
                fileOpened = true;
            }
             writer_.println(record);
             writer_.flush();    
        }
        
        public void setRecordFormat() throws Exception{
            AS400FileRecordDescription recordDescription = new AS400FileRecordDescription(as400, seqfile.getPath());
            RecordFormat[] formats = recordDescription.retrieveRecordFormat();
            RecordFormat recordFormat = formats[0];
            seqfile.setRecordFormat(recordFormat);
        }
        
        public void CPYSPLF(SequentialFile seqFile, String splfName, String splfJob, String splfUsr, String splfJobNbr, int splfNbr , boolean includeIGCData, String toLibrary, String toFile, String toMbr, int toFileRecordLength){
     
            String cmdCRTPF = "CRTPF FILE(" 
                    + toLibrary.toUpperCase().trim()  
                    + "/" 
                    + toFile.toUpperCase().trim()  
                    + ") RCDLEN(" 
                    + toFileRecordLength 
                    + ") MBR(" 
                    + toMbr.toUpperCase().trim() 
                    + ") MAXMBRS(*NOMAX) SIZE(*NOMAX)";
            
            String cmdCPYSPLF = "CPYSPLF FILE(" 
                    + splfName
                    + ") TOFILE(" 
                    + toLibrary.toUpperCase().trim() 
                    + "/" 
                    + toFile.toUpperCase().trim() 
                    + ") JOB("
                    + splfJobNbr 
                    + "/" 
                    + splfUsr 
                    + "/" 
                    + splfJob
                    + ") SPLNBR(" 
                    + splfNbr 
                    + ") MBROPT(*REPLACE)";
            try {
                if(!chkObjExist(seqFile, toLibrary, toFile, "*FILE"))
                    seqFile.runCommand(cmdCRTPF);    
     
                AS400Message[] messagelist = seqFile.runCommand(cmdCPYSPLF);
                for (int i = 0; i < messagelist.length; i++) {
                    if (messagelist[i].getID() != null){                    
                        if(messagelist[i].getID().equalsIgnoreCase("CPF3485")){
                            System.out.println(cmdCPYSPLF +" Command successful"); 
                        } else
                            System.out.println(messagelist[i].getID() + " " + messagelist[i].getText());
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        
        public boolean chkObjExist(SequentialFile seqFile, String objLib, String objName, String objType) throws Exception {
            boolean objectExist = true;
            String cmdChkObj;
            cmdChkObj = "CHKOBJ OBJ(" + objLib + "/" + objName + ") OBJTYPE(" + objType + ")";
            AS400Message[] messagelist = seqFile.runCommand(cmdChkObj);
            for (int i = 0; i < messagelist.length; i++) {
                if (messagelist[i].getID() != null){
                    System.out.println(messagelist[i].getID() + " " + messagelist[i].getText());
                    if (messagelist[i].getID().equalsIgnoreCase("CPF9801")){
                        objectExist = false;
                    }
                }
            }
            return objectExist;
        }
        
        public boolean runCmd(String commandString) {        
            boolean success = false;
            try {
                // Run the command.
                if (success = commandCall.run(commandString)){
                    //System.out.println(commandString + " Command successful");
                }else{
                    System.out.println(commandString + " Command failed");
                    throw new AS400Exception(commandCall.getMessageList());
                }
            } catch (Exception e) {
                System.out.println("Command " + commandCall.getCommand() + " did not run");
                e.printStackTrace();
            }
            return success;
        }
        
        public static void main(String[] args) {
            try {
                AS400 as400 = new AS400("as400ip", "user", "userpass");
                AS400CommandOutput get400ACTJOB = new AS400CommandOutput(as400, new File("d:\\temp\\WRKACTJOB.TXT"));
                get400ACTJOB.runCmd("WRKACTJOB OUTPUT(*PRINT) RESET(*YES) SEQ(*CPUPCT)");
                Thread.sleep(5000);
                get400ACTJOB.runCmd("WRKACTJOB OUTPUT(*PRINT) SEQ(*CPUPCT)");
                get400ACTJOB.cpysplfWithQtemp("QPDSPAJB", true);
     
                get400ACTJOB.runCmd("WRKSYSSTS OUTPUT(*PRINT)");
                get400ACTJOB.cpysplfWithQtemp("QPDSPSTS", true);
     
            } catch (Exception e) {
                e.printStackTrace();
            }
        }    
    }
     





2013-07-03 如何將 outq 中所有報表搬移至另一個 outq ?(Command MOVOUTQ with List Spooled Files (QUSLSPL) API)


如何將 outq 中所有報表搬移至另一個 outq ?(Command MOVOUTQ with List Spooled Files (QUSLSPL) API)

File  : QCLSRC

Member: MOVOUTQ

Type  : CLP

Usage : CRTCLPGM MOVOUTQ TGTRLS(V5R4M0)
OS    : V5R4 later


/*  ===============================================================  */
/*  = Command MovOutQ    CPP                                      =  */
/*  =   MovOutQ    CLP                                            =  */
/*  =   Paramater notes:                                          =  */
/*  =     FromOutq: from outq                                     =  */
/*  =     ToOutq  : to outq                                       =  */
/*  =                                                             =  */
/*  =   Only spooled file status RDY, SAV, HLD selected to move   =  */
/*  ===============================================================  */
/*  = Date  : 2013/07/02                                          =  */
/*  = Author: Vengoal Chang                                       =  */
/*  ===============================================================  */

Pgm          (&qfromoutq &qtooutq)

     Dcl        &qfromoutq   *CHAR  20
     Dcl        &qtooutq     *CHAR  20

     Dcl        &FROMLIB     *CHAR  10
     Dcl        &FROMOUTQ    *CHAR  10
     Dcl        &FROMQUAL    *CHAR  20
     Dcl        &TOLIB       *CHAR  10
     Dcl        &TOOUTQ      *CHAR  10

     Dcl        &PDATA       *PTR
     Dcl        &PGENERIC    *PTR
     Dcl        &PUSRSPC     *PTR

     Dcl        &SFJNAME     *CHAR  10
     Dcl        &SFJUSER     *CHAR  10
     Dcl        &SFJNBR      *CHAR   6
     Dcl        &SFNAME      *CHAR  10
     Dcl        &SFNBR       *CHAR   4
     Dcl        &SFSTS       *UINT   4

     Dcl        &USGENERIC   *CHAR  STG(*BASED) +
                  LEN(256) BASPTR(&PGENERIC)
     Dcl        &USDTAOFF    *UINT   4
     Dcl        &USDTACNT    *UINT   4
     Dcl        &USDTASIZ    *UINT   4
     Dcl        &USDTAENT    *CHAR  STG(*BASED) +
                  LEN(256) BASPTR(&PDATA)

     Dcl        &CH4         *CHAR   4
     Dcl        &CH4A        *CHAR   4
     Dcl        &CH4B        *CHAR   4
     Dcl        &OFFSET      *UINT   4
     Dcl        &OFFSET2     *UINT   4
     Dcl        &USRSPC      *CHAR  20
     Dcl        &USRSPCL     *CHAR  10  'QTEMP     '
     Dcl        &USRSPCS     *CHAR  10
     Dcl        &X           *UINT   4  0

     MonMsg     CPF0000      *N        GoTo Error

/* First ensure that variables are extracted correctly */

     ChgVar     &FromOutQ  %SST(&qfromoutq 1 10)
     ChgVar     &FromLib   %SST(&qfromoutq 11 10)

     ChgVar     &ToOutQ    %SST(&qtooutq 1 10)
     ChgVar     &ToLib     %SST(&qtooutq 11 10)

/* Resolve special values */

     If         (&ToOutQ *EQ '*FROMOUTQ')  +
                  ChgVar   &ToOutQ &FromOutQ

     RtvObjD    Obj(&FromLib/&FromOutQ) ObjType(*OUTQ) +
                  RtnLib(&FromLib)

     RtvObjD    Obj(&ToLib/&ToOutQ) ObjType(*OUTQ) +
                  RtnLib(&ToLib)

/*  If both from and to are the same then issue an error */

     If         ((&FromLib *EQ &ToLib)    *AND  +
                 (&FRomOutQ *EQ &ToOutQ))     DO
                SndPgmMsg  MsgID(CPF9898) MsgF(QCPFMSG) +
                           MsgDta('FromOutQ could not same as +
                           ToOutQ') MsgType(*ESCAPE)
                Return
     EndDO

     SndPgmMsg  MsgID(CPF9898) MsgF(QCPFMSG) +
                  MsgDta('Retrieving output queue entries') +
                  ToPgmQ(*EXT) MsgType(*STATUS)

     ChgVar     &USRSPCS   'MOVOUTQSPC'
     ChgVar     &USRSPC    (&USRSPCS *CAT &USRSPCL)

     ChgVar     &FROMQUAL  (&FROMOUTQ *CAT &FROMLIB)

     DltUsrSpc  UsrSpc(&USRSPCL/&USRSPCS)
     MonMsg     CPF0000

     Call       QUSCRTUS  (&USRSPC 'MOVOUTQ   ' +
                           X'00000100' x'00' '*ALL      ' 'User space +
                           for MOVOUTQ                            ')

     Call       QUSLSPL   (&USRSPC 'SPLF0300' +
                           '*ALL      ' &FROMQUAL '*ALL      ' +
                           '*ALL      ')

/* Get header information pointer */

     Call       QUSPTRUS  (&USRSPC &PUSRSPC)

/* Generic Header is at offset x'6C'-decimal 108 */

     ChgVar     &PGENERIC  &PUSRSPC
     ChgVar     &OFFSET    %OFFSET(&PGENERIC)
     ChgVar     &OFFSET2   (&OFFSET + 108)
     ChgVar     %OFFSET(&PGENERIC)  &OFFSET2

/* Get user data offset */
     ChgVar     &CH4       %SST(&USGENERIC 17 4)
     ChgVar     &USDTAOFF  %BIN(&CH4)

/* Get user data size */
     ChgVar     &CH4       %SST(&USGENERIC 29 4)
     ChgVar     &USDTASIZ  %BIN(&CH4)

/* Get number of entries for status message */
     ChgVar     &CH4       %SST(&USGENERIC 25 4)
     ChgVar     &USDTACNT  %BIN(&CH4)

/* If no entries, then bypass processing */
     If         (&USDTACNT *EQ 0) +
                Goto END
/* link to first data entry */

     ChgVar     &PDATA     &PUSRSPC
     ChgVar     &OFFSET    %OFFSET(&PDATA)
     ChgVar     &OFFSET2   (&OFFSET + &USDTAOFF)
     ChgVar     %OFFSET(&PDATA)  &OFFSET2

     ChgVar     &X         1
     ChgVar     %BIN(&CH4A)  &X
     ChgVar     %BIN(&CH4B)  &USDTACNT

/* Process the list of entries on the usrspc */

 LOOP:

     ChgVar     &SFJNAME     %SST(&USDTAENT 1 10)
     ChgVar     &SFJUSER     %SST(&USDTAENT 11 10)
     ChgVar     &SFJNBR      %SST(&USDTAENT 21 6)
     ChgVar     &SFNAME      %SST(&USDTAENT 27 10)
     ChgVar     &CH4         %SST(&USDTAENT 37 4)
     ChgVar     &SFNBR       %BIN(&CH4)
     ChgVar     &CH4         %SST(&USDTAENT 41 4)
     ChgVar     &SFSTS       %BIN(&CH4)

     If         (&SFSTS *EQ 1  *OR +
                 &SFSTS *EQ 4  *OR +
                 &SFSTS *EQ 6 ) Do
       ChgSplFa   File(&SFNAME)                          +
                    Job(&SFJNBR/&SFJUSER/&SFJNAME)       +
                    SplNbr(&SFNBR) OutQ(&TOLIB/&TOOUTQ)
     EndDo
     Else Do
       SndPgmMsg  MsgID(CPF9898) MsgF(QCPFMSG) +
                    MsgDta('Spooled file' *BCAT      +
                           &SFNAME  *Bcat 'in job' *BCAT +
                           &SFJNBR  *CAT  '/' *CAT   +
                           &SFJUSER *TCAT '/' *CAT   +
                           &SFJNAME *BCAT 'in' *BCAT +
                           &FROMLIB *TCAT '/' *CAT   +
                           &FROMOUTQ *BCAT           +
                          'is not moved.') +
                          ToPgmQ(*EXT) MsgType(*STATUS)
     EndDo

     IF         (&X *LT &USDTACNT)  DO
       ChgVar     &OFFSET      %OFFSET(&PDATA)
       ChgVar     &OFFSET2     (&OFFSET + &USDTASIZ)
       ChgVar     %OFFSET(&PDATA)    &OFFSET2
       ChgVar     &X           (&X + 1)
       ChgVar     %BIN(&CH4A)  &X
       Goto       LOOP
     EndDo

 END:
     DltUsrSpc  UsrSpc(&USRSPCL/&USRSPCS)

 Return:
     Return

/*-- Error handling:  -----------------------------------------------*/
 Error:
     Call      QMHMOVPM    ( '    '                                  +
                             '*DIAG'                                 +
                             x'00000001'                             +
                             '*PGMBDY'                               +
                             x'00000001'                             +
                             x'0000000800000000'                     +
                           )

     Call      QMHRSNEM    ( '    '                                  +
                             x'0000000800000000'                     +
                           )

 EndPgm:
     EndPgm


File  : QCMDSRC

Member: MOVOUTQ

Type  : CMD

Usage : CRTCMD CMD(MOVOUTQ) PGM(MOVOUTQ)


/*  ===============================================================  */
/*  = Command....... MovOutQ                                      =  */
/*  = CPP........... MovOutQ  CLP                                 =  */
/*  = Description... Move output queue spooled files to another   =  */
/*  =                output queue                                 =  */
/*  =                                                             =  */
/*  = CrtCmd      Cmd( MovOutQ   )                                =  */
/*  =             Pgm( MovOutQ    )                               =  */
/*  =             SrcFile( YourSourceFile )                       =  */
/*  ===============================================================  */
/*  = Date  : 2013/07/02                                          =  */
/*  = Author: Vengoal Chang                                       =  */
/*  ===============================================================  */
             CMD        PROMPT('Move Output Queue')


             PARM       KWD(FROMOUTQ) TYPE(FROM) PROMPT('From output +
                          queue')

             PARM       KWD(TOOUTQ) TYPE(TO) PROMPT('To output queue')


 FROM:       QUAL       TYPE(*NAME) LEN(10) MIN(1)
             QUAL       TYPE(*NAME) LEN(10) DFT(*LIBL) +
                          SPCVAL((*LIBL)) PROMPT('Library')

 TO:         QUAL       TYPE(*NAME) LEN(10) DFT(*FROMOUTQ) +
                          SPCVAL((*FROMOUTQ))
             QUAL       TYPE(*NAME) LEN(10) DFT(*LIBL) +
                          SPCVAL((*LIBL)) PROMPT('Library')





參考資訊:

List Spooled Files (QUSLSPL) API



星期三, 11月 08, 2023

2012-01-04 使用 QSPRILSP API 取得 current job 的最後一份報表的 ID 資訊(Command RTVLSTSPLI)


使用 QSPRILSP API 取得 current job 的最後一份報表的 ID 資訊(Command RTVLSTSPLI)

從 V5R2 後系統提供新 API QSPRILSP 來取得 current job 的最後一份報表的 ID 資訊。

File  : QCLSRC

Member: RTVLSTSPLI

Type  : CLP

Usage : CRTCLPGM yourlib/RTVLSTSPLI
        
OS    : V5R2

/*-------------------------------------------------------------------*/
/*  Program . . : RTVLSTSPLI                                         */
/*  Description : Retrieve Last Spooled Id under current job         */
/*  Author  . . : Vengoal Chang                                      */
/*  Published . : AS400ePaper                                        */
/*  Date  . . . : January 4, 2012                                    */
/*                                                                   */
/*  Program function:  Retrieve Last Spooled Id under current job    */
/*                                                                   */
/*                                                                   */
/*  Compile options:                                                 */
/*    CrtClPgm    Pgm( RTVLSTSPLI )                                  */
/*                SrcFile( QCLSRC )                                  */
/*                SrcMbr( *PGM )                                     */
/*                                                                   */
/*-------------------------------------------------------------------*/
/*    In V5R2 new API                                                */
/*    RETRIEVE IDENTITY OF LAST SPOOLED FILE CREATED (QSPRILSP) API  */
/*-------------------------------------------------------------------*/
     Pgm      ( &Splf                  +
                &Job                   +
                &User                  +
                &Nbr                   +
                &SplfNbrC              +
              )

    Dcl         &RcvVar      *Char    70
    Dcl         &RcvVarLen   *Char     4

    Dcl         &ApiErrCode  *Char     8

    /* FIELDS FROM FORMAT SPRL0100 */
    Dcl         &BytesRtn    *Dec (10 0)
    Dcl         &BytesAvl    *Dec (10 0)
    Dcl         &Splf        *Char    10
    Dcl         &Job         *Char    10
    Dcl         &User        *Char    10
    Dcl         &Nbr         *Char     6
    Dcl         &SplfNbr     *Dec  (6 0)
    Dcl         &SplfNbrC    *Char     6
    Dcl         &SystemName  *Char     8
    Dcl         &CreateDate  *Char     7
    Dcl         &CreateTime  *Char     6


/*-- Global error monitoring:  --------------------------------------*/
    MonMsg     CPF0000      *N        GoTo Error

    ChgVar      (%bin(&ApiErrCode 1 4))   0


    ChgVar      (%bin(&RcvVarLen 1 4))   70

    Call        QSPRILSP  ( &RcvVar    +
                            &RcvVarLen +
                            'SPRL0100' +
                            &ApiErrCode   )

    ChgVar      &BytesRtn    %bin(&RcvVar  1  4)
    ChgVar      &BytesAvl    %bin(&RcvVar  5  4)
    ChgVar      &Splf        %sst(&RcvVar  9 10)

    ChgVar      &Job         %sst(&RcvVar 19 10)
    MonMsg      Mch3601

    ChgVar      &User        %sst(&RcvVar 29 10)
    MonMsg      Mch3601

    ChgVar      &Nbr         %sst(&RcvVar 39  6)
    MonMsg      Mch3601

    ChgVar      &SplfNbr     %bin(&RcvVar 45  4)
    ChgVar      &SplfNbrC    &SplfNbr
    ChgVar      &SystemName  %sst(&RcvVar 49  8)
    ChgVar      &CreateDate  %sst(&RcvVar 57  7)
    ChgVar      &CreateTime  %sst(&RcvVar 65  6)

 Return:
     Return

/*-- Error handling:  -----------------------------------------------*/
 Error:
     Call      QMHMOVPM    ( '    '                                  +
                             '*DIAG'                                 +
                             x'00000001'                             +
                             '*PGMBDY'                               +
                             x'00000001'                             +
                             x'0000000800000000'                     +
                           )

     Call      QMHRSNEM    ( '    '                                  +
                             x'0000000800000000'                     +
                           )

 EndPgm:
     EndPgm




File  : QCMDSRC

Member: RTVLSTSPLI

Type  : CMD

Usage : CRTCMD Cmd(yourlib/RTVLSTSPLI) Pgm(RTVLSTSPLI) Allow( *Ipgm *Bpgm ) 

OS    : V5R2

/*  ===============================================================  */
/*  = Command....... RtvLstSplI                                   =  */
/*  = CPP........... RtvLstSplI                                   =  */
/*  = Description... Retrieve Last Spooled Id under current job   =  */
/*  =                                                             =  */
/*  =                                                             =  */
/*  = CrtCmd      Cmd( RtvLstSplI )                               =  */
/*  =             Pgm( RtvLstSplI )                               =  */
/*  =             SrcFile( YourSourceFile )                       =  */
/*  =             Allow( *Ipgm *Bpgm )                            =  */
/*  ===============================================================  */
/*  = Date  : 2012/01/04                                          =  */
/*  = Author: Vengoal Chang                                       =  */
/*  ===============================================================  */

          CMD        PROMPT('Retrieve Last Spooled File Id')

          PARM       KWD(SPLF    ) TYPE(*CHAR) LEN(10)            +
                          RTNVAL(*YES) MIN(1)                     +
                          PROMPT('CL var for SPLF         (10)')

          PARM       KWD(JOB     ) TYPE(*CHAR) LEN(10)            +
                          RTNVAL(*YES)                            +
                          PROMPT('CL var for JOB          (10)')

          PARM       KWD(USER    ) TYPE(*CHAR) LEN(10)            +
                          RTNVAL(*YES)                            +
                          PROMPT('CL var for USER         (10)')

          PARM       KWD(NBR     ) TYPE(*CHAR) LEN( 6)            +
                          RTNVAL(*YES)                            +
                          PROMPT('CL var for NBR           (6)')

          PARM       KWD(SPLNBR  ) TYPE(*CHAR) LEN( 6)            +
                          RTNVAL(*YES) MIN(1)                     +
                          PROMPT('CL var for SPLNBR        (6)')


File  : QCLSRC

Member: RTVLSTSPLT

Type  : CMD

Usage : CRTCLPGM pgm(yourlib/RTVLSTSPLT) 

        CALL RTVLSTSPLT

PGM

    Dcl         &Splf        *Char    10
    Dcl         &Job         *Char    10
    Dcl         &User        *Char    10
    Dcl         &Nbr         *Char     6
    Dcl         &SplNbrC     *Char     6

    RTVLSTSPLI SPLF(&SPLF) JOB(&JOB) USER(&USER) NBR(&NBR) +
                          SPLNBR(&SPLNBRC)
    MONMSG CPF333A /* No spooled file created under the current job */

    DMPCLPGM
    
    DSPSPLF    FILE(QPPGMDMP) SPLNBR(*LAST)

ENDPGM



詳細資訊參照:Retrieve Identity of Last Spooled File Created (QSPRILSP) API



2011-08-18 如何取得使用者於系統中有幾份報表存在 ?(Retrieve Spool Information QSPSPLI API )


如何取得使用者於系統中有幾份報表存在 ?(Retrieve Spool Information QSPSPLI API )

File  : QRPGLESRC

Member: RTVSPLINFO

Type  : RPGLE

Usage : CRTBNDRPG RTVSPLINFO

OS    : V6R1

      * From V6R1 new Retrieve Spool Information (QSPSPLI) API
      * http://publib.boulder.ibm.com/infocenter/iseries/v6r1m0/index.jsp?topic=/apis/qspspli.htm
      *
      * PTF SI44375 for 6.1 and SI44376 for 7.1
      * Supersedes
      * PTF SI33959 for 6.1 and SI34013 for 7.1

     H DEBUG  OPTION(*SRCSTMT:*NODEBUGIO) DFTACTGRP(*NO) ACTGRP(*CALLER)

     DRtvSplInfo       pr                  extpgm('QSPSPLI')
     D RcvVar                     65535    options(*varsize)
     D RcvVarLen                     10I 0 const
     D Format                         8    const
     D ASP                           10    const
     D UsrName                       10    const
     D ErrCde                              likeds(ErrorCode)

     D SPLI0100        ds
     D   bytesRtn                    10I 0
     D   bytesAvl                    10I 0
     D   nbrOfSplFile                10I 0
     D   aspGrpName                  10A
     D   userName                    10A

     D ErrorCode       ds
     D   BytesProv                   10I 0 inz(%Size(ErrorCode))
     D   BytesAvail                  10I 0 inz(0)
     D   ExpMsgId                     7
     D   Reserved                     1
     D   ExptionData                256

      /free

       RtvSplInfo(SPLI0100        :
                  %size(SPLI0100) :
                  'SPLI0100'      :
                  '*SYSBAS'       :
                  '*CURRENT'      :
                  ErrorCode);

       dsply ('For ' + %trimr(aspGrpName) + ':');

       dsply (%trimr(userName) + ' has ' +
              %char(nbrOfSplFile) + ' spool files');

       RtvSplInfo(SPLI0100        :
                  %size(SPLI0100) :
                  'SPLI0100'      :
                  '*SYSBAS'       :
                  '*ALL'          :
                  ErrorCode);

       dsply ('All users have ' + %char(nbrOfSplFile) +
              ' spool files');

       *inlr = *on;

       return;

      /end-free



Retrieve Spool Information (QSPSPLI) API




2007-11-05 如何將報表轉為 Text 或 Html 格式 ? (Command:CVTSPLSTMF)


如何將報表轉為 Text 或 Html 格式 ? (Command:CVTSPLSTMF)

此指令是將報表轉換為 Text 或 Html 格式,並可以轉換中文而且可將報表對齊,不過報表
中文控制碼(0E0F)要前後配對完整才可以,並將之存放在 IFS 目錄中,所以使用前須先建立
一個目錄,例如使用指令 MD '/spool' 建立一 spool 的目錄,使用 WRKLNK '/spool' ,並
選用 5 ,即可檢視該目錄內容:
===============================================================================
                            Work with Object Links                             
                                                                               
Directory  . . . . :   /                                                       
                                                                               
Type options, press Enter.                                                     
  2=Edit   3=Copy   4=Remove   5=Display   7=Rename   8=Display attributes     
  11=Change current directory ...                                              
                                                                               
Opt     Object link                                                            
 5      spool                                                                  
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                        Bottom 
Parameters or command                                                          
===>                                                                           
F3=Exit   F4=Prompt   F5=Refresh   F9=Retrieve   F12=Cancel   F17=Position to  
F22=Display entire field           F23=More options                            
===============================================================================
                            Work with Object Links                             
                                                                               
Directory  . . . . :   /spool                                                  
                                                                               
Type options, press Enter.                                                     
  2=Edit   3=Copy   4=Remove   5=Display   7=Rename   8=Display attributes     
  11=Change current directory ...                                              
                                                                               
Opt     Object link                                                            
        
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                               
                                                                        Bottom 
Parameters or command                                                          
===>                                                                           
F3=Exit   F4=Prompt   F5=Refresh   F9=Retrieve   F12=Cancel   F17=Position to  
F22=Display entire field           F23=More options                            
===============================================================================
使用CVTSPLSTMF 指令範例:

利用 AS/400 列印螢幕功能(HOST print),列印一份報表 QSYSPRT,在使用下列指令將
QSYSPRT 報表複製至目錄 /spool 中:

                    Convert Spool to Stream File (CVTSPLSTMF)                   
                                                                                
 Type choices, press Enter.                                                     
                                                                                
 From spooled file name . . . . . > QSYSPRT       Name                          
 To stream file name  . . . . . . > QSYSPRT.TXT                                 
                                                                                
 To directory . . . . . . . . . . > '/spool'                                    
                                                                                
 Job name . . . . . . . . . . . .   *             Name, *                       
   User . . . . . . . . . . . . .                 Name                          
   Number . . . . . . . . . . . .                 000000-999999                 
 Spooled file number  . . . . . . > *LAST         1-9999, *LAST, *ONLY          
 Stream file format . . . . . . .   *TEXT         *TEXT, *HTML                  
 Stream file option . . . . . . . > *REPLACE      *NONE, *REPLACE, *ADD         
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                         Bottom 
 F3=Exit   F4=Prompt   F5=Refresh   F10=Additional parameters   F12=Cancel      
 F13=How to use this display        F24=More keys                               
 ==============================================================================
此時使用 WRKLNK '/spool' ,按執行鍵,並使用選項 5,會得到下列畫面,使用選項 5,
可以檢視報表資料:
                             Work with Object Links                             
                                                                                
 Directory  . . . . :   /spool                                                  
                                                                                
 Type options, press Enter.                                                     
   2=Edit   3=Copy   4=Remove   5=Display   7=Rename   8=Display attributes     
   11=Change current directory ...                                              
                                                                                
 Opt     Object link                                                            
         QSYSPRT.TXT                                                            
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                         Bottom 
 Parameters or command                                                          
 ===>                                                                           
 F3=Exit   F4=Prompt   F5=Refresh   F9=Retrieve   F12=Cancel   F17=Position to  
 F22=Display entire field           F23=More options                            
 ==============================================================================
當轉換為一般文字檔後,可以使用 FTP 方式或 AS/400 NetServer 方式將目錄分享出來,
PC 端即可取得報表資料了。

有關 As/400(iSeries) NetServer 詳細資料請參照 
http://www-1.ibm.com/servers/eserver/iseries/netserver/



File  : QRPGLESRC
Member: CVTSPLSTMR
Type  : RPGLE
Usage : CRTBNDRPG CVTSPLSTMR     

      ******************************************************************
      *                                                                *
      * PROGRAM NAME: CVTSPLSTMR called by CVTSPLSTMC                  *
      *                                                                *
      * AUTHOR      : Vengoal Chang                                    *
      *                                                                *
      * DATE WRITTEN: March 2006                                       *
      *                                                                *
      * DESCRIPTION : Converts spooled file data in work file          *
      *               CvtSplWrk2 to HTML or TEXT format to work file   *
      *               CvtSplWrk1.                                      *
      *                                                                *
      * FUNCTIONS   : Adds basic HTML headings and footings and a      *
      *               title.                                           *
      *                                                                *
      * Copyright 2006 (c) Vengoal Chang.                              *
      * All rights reserved.                                           *
      *                                                                *
      ******************************************************************

     H  DFTACTGRP(*NO) Debug

     FCvtSplWrk2IF   F  382        DISK

     FCvtSplWrk1UF A F  378        DISK

      * Standard HTML header lines

     D aaHeader        S             80A   DIM(2) CTDATA PERRCD(1)

      * Standard HTML footer line

     D aaFooter        S             80A   DIM(1) CTDATA PERRCD(1)

      * Input spooled file data including control characters

     D InputData       DS
     D   saSkipLine                   3A
     D   ssSkipLine                   3S 0 OVERLAY(saSkipLine:1)
     D   saSpceLine                   1A
     D   ssSpceLine                   1S 0 OVERLAY(saSpceLine:1)
     D   saInput                    378A

      * Output HTML-format data

     D OutputData      DS
     D   saOutput                   378A

      * Program parameters - title and page length in lines

     D paToFmt         S              5A
     D paTitle         S             50A
     D piPageLen       S             10I 0

      * Line counter variable

     D wiLine          S             10I 0

      * Procedure prototypes

     D HTMLHeader      PR

     D HTMLFooter      PR

     D Convert         PR

     D Merge           PR                  LIKE(saOutput)
     D    iaOutput                         LIKE(saOutput)
     D    iaInput                          LIKE(saInput)

     D SpceLines       PR
     D    isSpceLine                       LIKE(ssSpceLine)

     D SkipLines       PR
     D    isSkipLine                       LIKE(ssSkipLine)

     D ParseInput      PR

      **********************************************************************
      * Program parameters

     C     *ENTRY        PLIST
     C                   PARM                    paToFmt
     C                   PARM                    paTitle
     C                   PARM                    piPageLen

      * Output HTML header lines

     C                   If        paToFmt = '*HTML'
     C                   CALLP     HTMLHeader
     C                   EndIf

      * Convert spool file lines to HTML or Text

     C                   EVAL      wiLine = 1
     C                   READ      CvtSplWrk2    InputData                LR
     C                   DOW       *INLR = *OFF
     C                   CALLP     ParseInput
     C                   CALLP     Convert
     C                   READ      CvtSplWrk2    InputData                LR
     C                   ENDDO

      * Output HTML footer lines

     C                   If        paToFmt = '*HTML'
     C                   CALLP     HTMLFooter
     C                   EndIf

     C                   RETURN

      **********************************************************************
      * Procedure to create HTML header lines                              *
      **********************************************************************

     P HTMLHeader      B

     D HTMLHeader      PI

     C                   EVAL      saOutput = aaHeader(1)
     C                   WRITE     CvtSplWrk1    OutputData

     C                   IF        paTitle <> '*NONE'
     C                   EVAL      saOutput   = '< TITLE>'
     C                                        + %trim(paTitle)
     C                                        + ''
     C                   WRITE     CvtSplWrk1    OutputData
     C                   ENDIF

     C                   EVAL      saOutput = aaHeader(2)
     C                   WRITE     CvtSplWrk1    OutputData

     P HTMLHeader      E

      **********************************************************************
      * Procedure to create HTML footer line                               *
      **********************************************************************

     P HTMLFooter      B

     D HTMLFooter      PI

     C                   EVAL      saOutput = aaFooter(1)
     C                   WRITE     CvtSplWrk1    OutputData

     P HTMLFooter      E

      **********************************************************************
      * Procedure to convert spooled file data to HTML text                *
      **********************************************************************

     P Convert         B

     D Convert         PI

      * If 'space' position is zero, 'overprint' previous line

     C                   IF        saSpceLine = '0'

     C     *HIVAL        SETGT     CvtSplWrk1
     C                   READP     CvtSplWrk1    OutputData               99
     C                   EVAL      saOutput = Merge(saOutput:saInput)
     C                   UPDATE    CvtSplWrk1    OutputData

     C                   ELSE

      * Skip to a line if specified

     C                   IF        saSkipLine <> *BLANKS
     C                   CALLP     SkipLines(ssSkipLine)
     C                   ENDIF

      * Space a number of lines if specified

     C                   IF        saSpceLine <> *BLANKS
     C                   CALLP     SpceLines(ssSpceLine)
     C                   ENDIF

      * 'Print' line

     C                   EVAL      saOutput   = saInput
     C                   WRITE     CvtSplWrk1    OutputData
     C                   EVAL      wiLine = wiLine + 1

     C                   ENDIF

     C                   RETURN

     P Convert         E

      **********************************************************************
      * Procedure to merge two overlaid lines of text                      *
      **********************************************************************

     P Merge           B

     D Merge           PI                  LIKE(saOutput)
     D    iaOutput                         LIKE(saOutput)
     D    iaInput                          LIKE(saInput)

     D laOutput        S                   LIKE(saOutput)

     D i               S              5I 0

     C                   EVAL      i = 1
     C                   DOW            i <= %size(iaInput )
     C                             and  i <= %size(iaOutput)
     C                             and  i <= %size(laOutput)
     C                   IF        %subst(iaInput:i:1) = *BLANK
     C                   EVAL      %subst(laOutput:i:1) = %subst(iaOutput:i:1)
     C                   ELSE
     C                   EVAL      %subst(laOutput:i:1) = %subst(iaInput :i:1)
     C                   ENDIF
     C                   EVAL      i = i + 1
     C                   ENDDO

     C                   RETURN    laOutput

     P Merge           E

      **********************************************************************
      * Procedure to skip to a given line number                           *
      **********************************************************************

     P SkipLines       B

     D SkipLines       PI
     D    isSkipLine                       LIKE(ssSkipLine)

     C                   EVAL      saOutput = *BLANKS

     C                   IF        wiLine > isSkipLine

     C                   DOW       wiLine <= piPageLen
     C                   WRITE     CvtSplWrk1    OutputData
     C                   EVAL      wiLine = wiLine + 1
     C                   ENDDO

     C                   If        paToFmt = '*HTML'
     C                   EVAL      saOutput   = '< hr>'
     C                   WRITE     CvtSplWrk1    OutputData
     C                   EndIf
     C                   EVAL      saOutput = *BLANKS
     C                   EVAL      wiLine = 1

     C                   EndIf

     C                   DOW       wiLine < isSkipLine
     C                   WRITE     CvtSplWrk1    OutputData
     C                   EVAL      wiLine = wiLine + 1
     C                   ENDDO

     C                   RETURN

     P SkipLines       E

      **********************************************************************
      * Procedure to space a number of lines                               *
      **********************************************************************

     P SpceLines       B

     D SpceLines       PI
     D    isSpceLine                       LIKE(ssSpceLine)

     D liCount         S              5I 0

     C*                  EVAL      wiLine  = wiLine  + 1
     C                   EVAL      saOutput = *BLANKS
     C                   DOW       liCount < isSpceLine - 1
     C                   WRITE     CvtSplWrk1    OutputData
     C                   EVAL      wiLine  = wiLine  + 1
     C                   EVAL      liCount = liCount + 1
     C                   ENDDO

     C                   RETURN

     P SpceLines       E
      **********************************************************************
     P ParseInput      B
     D ParseInput      PI

     D Input           S           2048
     D InpLen          S              5I 0
     D DATA            S           2048
     D X0E             C                   X'0E'
     D X0F             C                   X'0F'
     C                   z-add     1             i                 5 0
     C                   z-add     1             J                 5 0
     C                   Clear                   Data
     C                   Eval      Input = InputData
     C                   Eval      InpLen= %len(%trimr(InputData))

     C     1             Do        InpLen
     C                   If        %SUBST(Input : i : 1) = X0E
     C                   Eval      %SubSt(Data : j : 1) = ' '
     C                   Eval      J = J + 1
     C                   Eval      %SubSt(Data : j : 1)
     C                             = %SubSt(Input : i : 1)
     C                   Else
     C                   If        %SUBST(Input  : i : 1) = X0F
     C                   Eval      %SubSt(Data : j : 1)
     C                             = %SubSt(Input  : i : 1)
     C                   Eval      J = J + 1
     C                   Eval      %SubSt(Data : j : 1) = ' '
     C                   Else
     C                   Eval      %SubSt(Data : j : 1)
     C                             = %SubSt(Input : i : 1)
     C                   EndIf
     C                   EndIf
     C                   Eval      i = i + 1
     C                   Eval      j = j + 1
     C                   If        i > InpLen
     C                   Leave
     C                   EndIf
     C                   EndDo

     C                   Eval      InputData = Data
     C                   Eval      InpLen = j -1
     C
     C                   RETURN

     P ParseInput      E
**
< html>< head>
< body>< pre>
**
< hr>
File : QCLSRC Member: CVTSPLSTMC Type : CLP Usage : CRTCLPGM CVTSPLSTMC /*****************************************************************/ /* */ /* COMMAND: CVTSPLSTM CPP */ /* */ /* PROGRAM NAME: CVTSPLSTMC */ /* */ /* VERSION : 1.1 */ /* */ /* AUTHOR : Vengoal Chang */ /* */ /* DATE WRITTEN: March 2006 */ /* */ /* DESCRIPTION : Convert Spooled File to Stream File */ /* command processing program. */ /* */ /* FUNCTIONS : Converts an AS/400 spooled file to a stream */ /* file in one of two formats: */ /* */ /* 1. Plain ASCII text */ /* 2. HTML */ /* */ /* Copyright 2006 (c) Vengoal Chang. */ /* All rights reserved. */ /* */ /*****************************************************************/ PGM (&FromFile + &ToStmf + &ToDir + &QualJob + &SplId + &ToFmt + &StmfOpt + &StmfCodPag + &Title ) DCL &FromFile *CHAR 10 DCL &ToFile *CHAR 10 DCL &ToStmf *CHAR 64 DCL &ToDir *CHAR 256 DCL &QualJob *CHAR 26 DCL &IntJob *CHAR 16 DCL &IntSplID *CHAR 16 DCL &Job *CHAR 10 DCL &User *CHAR 10 DCL &JobNbr *CHAR 6 DCL &SplID *DEC (4 0) DCL &HexSplID *CHAR 4 DCL &ToFmt *CHAR 5 DCL &StmfOpt *CHAR 8 DCL &StmfCodPag *DEC (5 0) DCL &CodePage *CHAR 8 DCL &Title *CHAR 50 DCL &SplInfo *CHAR 2000 DCL &InfoLen *CHAR 4 DCL &PageLen *CHAR 4 DCL &SplNbr *CHAR 5 DCL &Path *CHAR 1024 DCL &Rpyle *LGL DCL &RpyleSeq *DEC (4 0) DCL &InqMsgRpy *CHAR 10 DCL &CtlChar *CHAR 7 '*NONE' DCL &MsgID *CHAR 7 DCL &Msgf *CHAR 10 DCL &MsgfLib *CHAR 10 DCL &MsgDta *CHAR 100 DCL &MsgKey *CHAR 4 DCL &Msg *CHAR 100 DCL &Sev *DEC (2 0) DCL &ErrorFlag *LGL 1 /* Global message monitor to trap any unmonitored errors */ MONMSG (CPF9999 CPF0000 MCH0000) EXEC(GOTO ERROR) /* (A) Extract job name from qualified Job name */ CHGVAR &Job %sst(&QualJob 1 10) CHGVAR &User %sst(&QualJob 11 10) CHGVAR &JobNbr %sst(&QualJob 21 6) /* (B) Convert special value * to current job details */ IF (&Job *eq '*') DO RTVJOBA JOB(&Job) USER(&User) NBR(&JobNbr) ENDDO /* (C) Set up spooled file number from special values */ CHGVAR &SplNbr &SplID IF (&SplID *EQ -2) DO CHGVAR &SplNbr '*LAST' ENDDO IF (&SplID *EQ -3) DO CHGVAR &SplNbr '*ONLY' ENDDO /* (D) Create first work file */ DLTF QTEMP/CVTSPLWRK1 MONMSG CPF2105 CRTPF FILE(QTEMP/CVTSPLWRK1) RCDLEN(378) + IGCDTA(*YES) SIZE(1000000 10000 10) CHGVAR &ToFile 'CVTSPLWRK1' /* (E) Create second work file if not converting to plain text */ DLTF QTEMP/CVTSPLWRK2 MONMSG CPF2105 CRTPF FILE(QTEMP/CVTSPLWRK2) RCDLEN(382) + IGCDTA(*YES) SIZE(1000000 10000 10) CHGVAR &ToFile 'CVTSPLWRK2' /* (F) Set Job to use reply list entries */ RTVJOBA InqMsgRpy(&InqMsgRpy) CHGJOB InqMsgRpy(*SYSRPYL) /* (G) Add reply list entry for CPYSPLF message */ CHGVAR &RpyleSeq 9999 ADDRPYLE: ADDRPYLE &RpyleSeq MSGID(CPA3311) RPY('G') MONMSG CPF2555 EXEC(DO) CHGVAR &RpyleSeq (&RpyleSeq -1) IF (&RpyleSeq *GT 0) (GOTO ADDRPYLE) ENDDO MONMSG CPF0000 EXEC(GOTO START) CHGVAR &Rpyle '1' START: IF (&ToFmt *NE '*TEXT') DO /* (I) Set up Title if a special value */ IF (&Title *EQ '*STMFILE') DO CHGVAR &Title &ToStmf ENDDO IF (&Title *EQ '*NONE') DO CHGVAR &Title ' ' ENDDO ENDDO /* (H) We need control characters for TEXT or HTML conversion */ CHGVAR &CtlChar '*PRTCTL' /* (J) Copy spooled file into work file */ CPYSPLF &FromFile + QTEMP/&ToFile + JOB(&JobNbr/&User/&Job) + SPLNBR(&SplNbr) + MBROPT(*REPLACE) + CTLCHAR(&CtlChar) /* (K) Call API to get spooled file info */ CHGVAR %bin(&HexSplID) &SplID IF (&SplNbr *EQ '*ONLY') (CHGVAR %bin(&HexSplID) 0) IF (&SplNbr *EQ '*LAST') (CHGVAR %bin(&HexSplID) -1) CHGVAR %bin(&InfoLen) 2000 CALL PGM(QUSRSPLA) PARM(&SplInfo + &InfoLen + 'SPLA0100' + &QualJob + &IntJob + &IntSplID + &FromFile + &HexSplID ) CHGVAR &PageLen %sst(&SplInfo 425 4) /* (L) Convert spooled file data to HTML OR TEXT format */ OVRDBF CvtSplWrk1 QTEMP/CVTSPLWRK1 OVRSCOPE(*JOB) OVRDBF CvtSplWrk2 QTEMP/CVTSPLWRK2 OVRSCOPE(*JOB) CALL CVTSPLSTMR PARM(&ToFmt &Title &PageLen) /* (N) Set codepage of stream file to be created */ CHGVAR &CodePage &StmfCodPag IF (&StmfCodPag *EQ -1) (CHGVAR &CodePage *PCASCII) IF (&StmfCodPag *EQ -2) (CHGVAR &CodePage *STMF) /* (O) Convert spooled file data in work file to stream file */ CHGVAR &Path (&ToDir *TCAT '/' *CAT &ToStmf) CPYTOSTMF FROMMBR('/qsys.lib/qtemp.lib/CVTSPLWRK1.fil+ e/CVTSPLWRK1.mbr') + TOSTMF(&Path) + STMFOPT(&StmfOpt) + STMFCODPAG(&CodePage) /* (P) Send completion message */ SNDPGMMSG MSGID(CPF9898) + MSGF(QCPFMSG) + MSGDTA('Spooled file' *BCAT &FromFile *BCAT + 'copied to stream file' *BCAT &ToStmf) + MSGTYPE(*COMP) /* (Q) Delete work file(s) */ DLTOVR CvtSplWrk1 LVL(*JOB) MONMSG CPF0000 DLTOVR CvtSplWrk2 LVL(*JOB) MONMSG CPF0000 DLTF QTEMP/CVTSPLWRK1 MONMSG CPF2105 DLTF QTEMP/CVTSPLWRK2 MONMSG CPF2105 /* (R) Remove reply list entry and reset job attribute if changed */ IF (&Rpyle *EQ '1') DO RMVRPYLE &RpyleSeq ENDDO CHGJOB INQMSGRPY(&InqMsgRpy) /* Finish */ RETURN /* */ /* Error Handling logic */ /* */ ERROR: /* */ /* If looping in the error handling routine, end in error */ /* */ IF (&ErrorFlag) DO SNDPGMMSG MSGID(CPF9999) MSGF(QCPFMSG) MSGTYPE(*ESCAPE) MONMSG CPF0000 GOTO ENDPGM ENDDO /* */ /* Set flag to prevent looping */ /* */ CHGVAR &ErrorFlag '1' /* Re-send any diagnostic messages sent to this program */ ERROR1: RCVMSG MSGTYPE(*DIAG) + RMV(*NO) + KEYVAR(&MsgKey) + MSG(&Msg) + MSGDTA(&MsgDta) + MSGID(&MsgID) + MSGF(&Msgf) + SNDMSGFLIB(&MsgFLib) IF (&MsgKey *EQ ' ') (GOTO ERROR2) RMVMSG MSGKEY(&MsgKey) SNDPGMMSG MSGID(&MsgID) + MSGF(&MsgfLib/&Msgf) + MSGDTA(&MsgDta) + MSGTYPE(*DIAG) GOTO CMDLBL(ERROR1) /* Re-send any escape messages sent to this program */ ERROR2: IF (&Rpyle *EQ '1') DO RMVRPYLE &RpyleSeq MONMSG CPF0000 ENDDO CHGJOB INQMSGRPY(&InqMsgRpy) MONMSG CPF0000 RCVMSG MSGTYPE(*EXCP) + RMV(*NO) + MSG(&Msg) + MSGDTA(&MsgDta) + MSGID(&MsgID) + SEV(&Sev) + MSGF(&Msgf) + SNDMSGFLIB(&MsgFLib) IF (&Sev *gt 00) THEN(DO) SNDPGMMSG MSGID(&MsgID) + MSGF(&MsgfLib/&Msgf) + MSGDTA(&MsgDta) + MSGTYPE(*ESCAPE) ENDDO ELSE DO SNDPGMMSG MSGID(CPF9897) + MSGF(QCPFMSG) + MSGDTA(&Msg) + MSGTYPE(*ESCAPE) ENDDO ENDPGM: ENDPGM File : QCMDSRC Member: CVTSPLSTMF Type : CMD Usage : CRTCMD CMD(lib/CVTSPLSTMF) PGM(lib/CVTSPLSTMC) /*****************************************************************/ /* */ /* COMMAND NAME: CVTSPLSTMF */ /* */ /* AUTHOR : Vengoal Chang */ /* */ /* DATE WRITTEN: March 2006 */ /* */ /* DESCRIPTION : Convert Spooled File to Stream File command */ /* */ /* FUNCTIONS : Converts an AS/400 spooled file to a stream */ /* file in one of three formats: */ /* */ /* 1. Plain ASCII text */ /* 2. HTML */ /* */ /*****************************************************************/ CMD PROMPT('Convert Spool to Stream File') PARM KWD(FROMFILE) TYPE(*NAME) LEN(10) MIN(1) + PROMPT('From spooled file name') PARM KWD(TOSTMF) TYPE(*NAME) LEN(64) MIN(1) + PROMPT('To stream file name') PARM KWD(TODIR) TYPE(*PNAME) LEN(256) MIN(1) + PROMPT('To directory') PARM KWD(JOB) TYPE(JOB) DFT(*) SNGVAL((*)) + PROMPT('Job name') JOB: QUAL TYPE(*NAME) LEN(10) MIN(1) QUAL TYPE(*NAME) LEN(10) MIN(1) PROMPT('User') QUAL TYPE(*CHAR) LEN(6) RANGE(000000 999999) + MIN(1) PROMPT('Number') PARM KWD(SPLNBR) TYPE(*DEC) LEN(4) DFT(*ONLY) + RANGE(1 9999) SPCVAL((*LAST -2) (*ONLY + -3)) PROMPT('Spooled file number') PARM KWD(TOFMT) TYPE(*CHAR) LEN(5) RSTD(*YES) + DFT(*TEXT) VALUES(*TEXT *HTML) + PROMPT('Stream file format') PARM KWD(STMFOPT) TYPE(*CHAR) LEN(8) RSTD(*YES) + DFT(*NONE) VALUES(*NONE *REPLACE *ADD) + PROMPT('Stream file option') PARM KWD(STMFCODPAG) TYPE(*DEC) LEN(5 0) + DFT(*PCASCII) RANGE(1 32767) + SPCVAL((*PCASCII -1) (*STMF -2)) + PMTCTL(*PMTRQS) PROMPT('Stream file code + page') PARM KWD(TITLE) TYPE(*CHAR) LEN(50) RSTD(*NO) + DFT(*NONE) SPCVAL((*NONE) (*STMFILE)) + PMTCTL(HTML) PROMPT('Title for HTML') HTML: PMTCTL CTL(TOFMT) COND((*EQ *HTML)) + NBRTRUE(*EQ 1)

2007-09-28 如何依照指定保留天數清除逾期的報表 ? (Command: PRGSPLF)


如何依照指定保留天數清除逾期的報表 ? (Command: PRGSPLF)

File  : QRPGLESRC
Member: PRGSPLF
Type  : RPGLE
Usage : CRTBNDRPG PRGSPLF     

     H**************************************************************
     H*
     H*   FUNTION: THIS APPLICATION WILL DELETE OLD SPOOLED FILES
     H*            FROM THE SYSTEM, BASED ON THE INPUT PARAMETERS.
     H*
     H*   API USED: QUSCRTUS  CREATE USER SPACE
     H*             QUSLSPL   GENERATE SPOOLED FILE LIST
     H*             QUSRTVUS  RETRIEVE USER SPACE INFORMATION
     H*             QUSRSPLA  RETRIEVE SPOOLED FILE ATR INFORMATION
     H*

     H DEBUG

     D PrgSplf         PR                  ExtPgm('PRGSPLF')
     D  nDaysOld                      5U 0 OPTIONS(*NOPASS)
     D  szUsrPrf                     10A   OPTIONS(*NOPASS)
     D  szDltSav                      4A   OPTIONS(*NOPASS)
     D  szDltHld                      4A   OPTIONS(*NOPASS)

     D PrgSplf         PI
     D  nDaysOld                      5U 0 OPTIONS(*NOPASS)
     D  szUsrPrf                     10A   OPTIONS(*NOPASS)
     D  szDltSav                      4A   OPTIONS(*NOPASS)
     D  szDltHld                      4A   OPTIONS(*NOPASS)

     D RunCLCmd        PR                  EXTPGM('QCMDEXC')
     D  CmdStr                      512    CONST OPTIONS(*VARSIZE)
     D  CmdLen                       15  5 CONST

     D SndPgmMsg       PR                  ExtPgm( 'QMHSNDPM' )
     D  MsgID                         7
     D  QualMsgF                     20
     D  MsgDta                      256
     D  MsgDtaLen                    10I 0
     D  EscMsgType                   10
     D  CallStkEnt                   10
     D  CallStkCnt                   10I 0
     D  MsgKey                        4
     D  Error                         8

     D RcvPgmMsg       PR                  ExtPgm( 'QMHRCVPM' )
     D  MsgDta                      256
     D  MsgDtaLen                    10I 0
     D  MsgFormat                     8
     D  CallStkEnt                   10
     D  CallStkCnt                   10I 0
     D  MsgType                      10
     D  MsgKey                        4
     D  MsgWait                      10I 0
     D  MsgAction                    10
     D  Error                         8

      * SndMsg Parameter declare
     D QualMsgF        DS
     D  MsgFName                     10    Inz( 'QCPFMSG' )
     D  MsgFLib                      10    Inz( 'QSYS' )

     D MsgID           s              7    inz('CPF9898')
     D MsgDta          S            256
     D MsgType         S             10    Inz( '*COMP')
     D MsgDtaLen       S             10I 0 Inz(512)
     D CallStkEnt      S             10    Inz( '*' )
     D CallStkCnt      S             10I 0 Inz( 2 )
     D MsgKey          S              4    Inz(*blanks)
     D MsgError        S              8    Inz( *AllX'00' )
      * MSGTYPE  ENT  CallStkcnt      Joblog  End(line 24) X:message N: No Message
      * INFO      *    2                 XX    X
      * COMP      *    2                 XX    X
      * INFO      *    1                 X     N
      * COMP      *    1                 X     N
      * INFO      *    0                 X     N
      * COMP      *    0                 X     N
      * STATUS    *    2                 Error Error
      * STATUS    *    1                 N     N
      * STATUS    *    0                 N     N

      * RcvMsg Parameter declare
     D  MsgFormat      s              8    inz('RCVM0100')
     D  RMsgType       S             10    Inz( '*LAST')
     D  MsgWait        s             10I 0 inz( 0 )
     D  MsgAction      s             10    inz('*OLD')
     D  CurrMsgStk     S             10I 0 inz( 0 )

      * API Error data structure
     DQUSEC            DS
     D QUSBPRV                       10I 0 Inz(%size(QUSEC))
     D QUSBAVL                       10I 0
     D QUSEI                          7
     D QUSERVED                       1
     D*MSGDTA                       256
     D*
      *
      * Parameter for Create User Space Begin
     D USRSPC          DS
     D  USNAME                 1     10    INZ('USRSPC    ')
     D  USLIB                 11     20    INZ('QTEMP     ')
      *
     D                 DS
     D  EXTATR                 1     10    INZ('QUSLSPL   ')
     D  USINIT                11     11    INZ(X'00')
     D  FMTNME                12     21    INZ('SPLF0100')
     D  FMTNM1                22     31    INZ('SPLA0100')
      *
     D                 DS
     D  USSIZE                       10I 0 INZ(640000)
      * Parameter for Create User Space End

      * Retrive User Space Entry data
     D RCVVAR          DS
     D  OFFSET                 1      4B 0
     D  NOENTR                 9     12B 0
     D  LSTSIZ                13     16B 0

      * Retrive User Space Spooled data
     D RCVAR1          DS
     D  USRNM1                 1     10
     D  OUTQNA                11     30
     D  USRDT1                31     40
     D  FRMTY1                41     50
     D  IJOBID                51     66
     D  ISPLID                67     82

      * Spooled file Attributes parameter Begin
     D RCVAR2          DS
     D  BYTRTN                 1      4B 0
     D  BYTVAL                 5      8B 0
     D  JOBID                  9     24
     D  SPLFID                25     40
     D  JOBNAM                41     50
     D  USRNAM                51     60
     D  JOBNUM                61     66
     D  FILNAM                67     76
     D  FILNUM                77     80B 0
     D  FRMTYP                81     90
     D  USRDTA                91    100
     D  STATUS               101    110
     D  FILVAL               111    120
     D  HLDF                 121    130
     D  SAVF                 131    140
     D  TOTPAG               141    144B 0
     D  PAGWRT               145    148B 0
     D  STRPAG               149    152B 0
     D  ENDPAG               153    156B 0
     D  LASPAG               157    160B 0
     D  RESPRT               161    164B 0
     D  TOTCPY               165    168B 0
     D  CPYLFT               169    172B 0
     D  LPI                  173    176B 0
     D  CPI                  177    180B 0
     D  OUTPRI               181    182
     D  OUTQNM               183    192
     D  OUTQLB               193    202
     D  DATFOP               203    209
     D  DATCEN               203    203
     D  DATYR                204    205
     D  DATMTH               206    207
     D  DATDAY               208    209
     D  TIMFOP               210    215
     D  DEVFNA               216    225
     D  DEVFLB               226    235
     D  PGMOPF               236    245
     D  PGMOPL               246    255
     D  ACCCOD               256    270
     D  PRTTXT               271    300
     D  RCDLEN               301    304B 0
     D  MAXRCD               305    308B 0
     D  DEVCLS               309    318
     D  PRTTYP               319    328
     D  DOCNAM               329    340
     D  FLDNAM               341    404
     D  S36PRC               405    412
     D  PRTFID               413    422
     D  RPLUN                423    423
     D  RPLCHR               424    424
     D  PAGLEN               425    428B 0
     D  PAGWID               429    432B 0
     D  NUMSEP               433    436B 0
     D  OVRLIN               437    440B 0
     D  DBCSDA               441    450
     D  DBCSEC               451    460
     D  DBCSSO               461    470
     D  DBCSCR               471    480
     D  DBCSCI               481    484B 0
     D  GRAPHI               485    494
     D  CODPAG               495    504
     D  FORNAM               505    514
     D  FORLIB               515    524
     D  SRCDRW               525    528  0
     D  PRTFON               529    538
     D  S36SPL               539    544
     D  PAGROT               545    548B 0
     D  JUSTIF               549    552B 0
     D  PRTBOT               553    562
     D  FLDRCD               563    572
     D  CTLCHR               573    582
     D  ALGFRM               583    592
     D  PRTQUA               593    602
     D  FRMFED               603    612
     D  VOLUME               613    683
     D  FLABID               684    700
     D  EXCTYP               701    710
     D  CHRCOD               711    720
     D  TOTRCD               721    724B 0
     D  PGPSID               725    728B 0
     D  FOVNAM               729    738
     D  FOVLIB               739    748
     D  FOVOFD               749    756P 5
     D  FOVOFA               757    764P 5
     D  BOVNAM               765    774
     D  BOVLIB               775    784
     D  BOVOFD               785    792P 5
     D  BOVOFA               793    800P 5
     D  UOM                  801    810
     D  PAGNAM               811    820
     D  PAGLIB               821    830
     D  LINSPC               831    840
     D  PNTSIZ               841    848P 5
      * Spooled file Attributes parameter End

      * Retrive User Space Parameter Begin
     D                 DS
     D  LENDTA                 1      4B 0
     D  STRPOS                 5      8B 0
     D  SPLF#                  9     12B 0
     D  RCVLE1                13     16B 0
     D  FIL#                  17     22
     D  RCVLE2                23     26B 0
      * Retrive User Space Parameter End

      * Work area variable
     D  WRKSTR         S            100
     D  UsrId          S             10
     D  RcvMsgId       S              7

      **  How long before we delete the SPLF?
     D DFTExpired      C                   Const(14)

     D dltSav          S              4A
     D dltHld          S              4A
     D szUser          S             10A   Inz(*USER)
     D today           S               D   Inz(*SYS)
     D crtDate         S               D   DatFmt(*ISO)
     D nExpired        S             10I 0
     D nDays           S             10I 0
      *
      *
     C*********************************************************
     C*
     C*       OPERABLE CODE STARTS HERE
     C*
     C*********************************************************
     C*
     C                   Eval      *InLR     = *On

      **  If the caller passed in the number of days-old to delete,
      **  use that value, other use the default of 14 days.
     C                   if        %Parms >= 1
     C                   eval      nExpired = nDaysOld
     C                   else
     C                   eval      nExpired = DFTExpired
     C                   endif
      **  If the caller passed in a specific user profile,
      **  use that profile, otherwise use the default *CURRENT.
     C                   if        %Parms >= 2
     C                   if        szUsrPrf <> *BLANKS
     C                              and %subst(szUsrPrf:1:1) <> '*C'
     C                   eval      szUser   = szUsrPrf
     C                   endif
     C                   endif

     C                   if        %Parms >= 3
     C                   if        szDltSav <> *BLANKS
     C                   eval      dltSav = szDltSav
     C                   else
     C                   eval      dltSav = '*NO'
     C                   endif
     C                   endif

     C                   if        %Parms >= 4
     C                   if        szDltHld <> *BLANKS
     C                   eval      dltHld = szDltHld
     C                   else
     C                   eval      dltHld = '*NO'
     C                   endif
     C                   endif

     C                   Z-ADD     0             DLTCNT           10 0

     C*
     C*  CREATE USER SPACE USING TE PARAMETERS FROM THE CL COMMAND
     C*
     C                   Z-ADD     16            QUSBPRV
      *
     C                   CALL      'QUSCRTUS'
     C                   PARM                    USRSPC
     C                   PARM                    EXTATR
     C                   PARM                    USSIZE
     C                   PARM                    USINIT
     C                   PARM      '*ALL'        USAUTH           10            AUTHORITY
     C                   PARM      *BLANKS       USTEXT           50
     C                   PARM      '*YES'        USRPLC           10            REPLACE
     C                   PARM                    QUSEC
      *
     C*
     C*  FILL THE USER SPACE JUST CREATED WITH SPOOLED FILES AS
     C*  DEFINED IN THE CL COMMAND
     C*
     C                   CALL      'QUSLSPL'
     C                   PARM                    USRSPC
     C                   PARM                    FMTNME
     C                   PARM      szUser        USRNME           10
     C                   PARM      '*ALL'        OUTQ             20
     C                   PARM      '*ALL'        FRMTYP           10
     C                   PARM      '*ALL'        USRDTA           10
     C******************************************************
     C*
     C*          BEGINNING OF LOOP
     C*
     C******************************************************
     C*
     C*   YOU CAN USE QUSRTVUS API RETRIEVE USER SPACE ENTRY DATA
     C*
     C*****************************************************
     C*
     C                   Z-ADD     16            LENDTA
     C                   Z-ADD     125           STRPOS
     C*
     C                   CALL      'QUSRTVUS'
     C                   PARM                    USRSPC
     C                   PARM                    STRPOS
     C                   PARM                    LENDTA
     C                   PARM                    RCVVAR
     C*
     C* CHECK RCVVAR DATA STRUCTURE FOR NUMBER OF LIST ENTRIES,OFFSET
     C* TO LIST ENTRIES, AND SIZE OF EAC LIST ENTRY.
     C* INFORMATION NEEDED FOR TE QUSLSPL API IS CONTAINED WITHIN
     C* THE 164 BYTES OF FORMAT SPLF0100 LIST DATA SECTION
     C*
     C                   Z-ADD     OFFSET        STRPOS
     C                   ADD       1             STRPOS
     C                   Z-ADD     LSTSIZ        LENDTA
     C                   Z-ADD     164           RCVLE1
     C                   Z-ADD     209           RCVLE2
     C                   Z-ADD     1             COUNT            15 0

     C                   eval      MsgDta = 'Total processing spooled files:' +
     C                             %char(NOENTR)
     C                   eval      MsgType = '*INFO'
     C                   ExSr      SndMsg

     C     COUNT         DOWLE     NOENTR
     C*
     C* RETRIEVE THE INFORMATION FROM THE USER SPACE ABOUT THE SPOOLED
     C* FILE.
     C*
     C                   CALL      'QUSRTVUS'
     C                   PARM                    USRSPC
     C                   PARM                    STRPOS
     C                   PARM                    LENDTA
     C                   PARM                    RCVAR1

     C*
     C* NOW RETRIVE SPOOLED ATR USING THE INFORMATION IN THE
     C* USER SPACE , WHICH WAS RETRIVED BEFORE THIS COMMENT.
     C*
     C                   MOVE      IJOBID        JOBID
     C                   MOVE      ISPLID        SPLFID
     C                   MOVE      *BLANKS       JOBINF
     C                   MOVEL     '*INT'        SPLFNM           10
     C                   MOVE      *BLANKS       SPLF#
     C                   MOVEL     '*INT'        JOBINF           26
     C*
     C                   Reset                   QUSEC
     C                   CALL      'QUSRSPLA'
     C                   PARM                    RCVAR2
     C                   PARM                    RCVLE2
     C                   PARM                    FMTNM1
     C                   PARM                    JOBINF
     C                   PARM                    JOBID
     C                   PARM                    SPLFID
     C                   PARM                    SPLFNM
     C                   PARM                    SPLF#
     C                   PARM                    QUSEC

      * Call API No Error
     C                   If        QUSBAVL =  0

     C* CHECK RCVAR1 DATA STRUCTURE FOR DATA FILE OPENED.
     C*
     C* DELETE SPOOLED FILE THAT ARE OLDER THAN THE TARGET DATE
     C* SPECIFIED ON THE COMMAND. A MESSAGE IS SENT FOR EACH SPOOLED
     C* FILE DELETED.
     C*
     C     *CYMD0        TEST(DE)                DATFOP
     C                   If        NOT %ERROR
     C     *CYMD0        MOVE      DATFOP        CrtDate
     C     Today         SubDur    CrtDate       nDays:*DAYS
     C                   If        nDays >= nExpired
     C                   If        Status = '*READY'
     C                             Or  ( Status = '*SAVED'
     C                             And   dltSav ='*YES' )
     C                             Or  ( Status = '*HELD'
     C                             And   dltHld ='*YES' )
     C                   EXSR      SPLDLT
     C                   EndIf
     C                   EndIf
     C                   EndIf

     C                   EndIf

     C*
     C* GO BACK AND PROCESS THE REST OF ENTRIES IN THE USER SPACE
     C*
     C                   ADD       LSTSIZ        STRPOS
     C                   ADD       1             COUNT
     C                   ENDDO
     C******************************************
     C*        END LOOP
     C******************************************
     C*
     C* AFTER ALL SPOOLED FILES ARE DELETED THAT MEET THE REQUIREMENTS
     C* , SEND A FINAL MESSAGE TO THE USER .
     C* DELETE THE USER SPACE OBJECT THAT WAS CREATED.
     C*

     C                   Move      DltCnt        DltCntC          10

     C                   Eval      MsgDta = %Char(DltCnt)     +
     C                                      ' spooled files deleted ' +
     C                                      'completely'
     C                   eval      MsgType = '*COMP'

     C                   Exsr      SndMsg

     C******************************************
     C     SPLDLT        BegSr
     C                   Add       1             DLTCNT
     C                   Move      FILNUM        FIL#
      *
     C                   clear                   WrkStr
     C                   Eval      WRKSTR =
     C                               'DltSplF ' + %Trim( FILNAM )     +
     C                                  ' '                               +
     C                               'Job('     + %Trim( JOBNUM )     +
     C                                  '/'     + %Trim( USRNAM )     +
     C                                  '/'     + %Trim( JOBNAM )     +
     C                                  ') '                              +
     C                               'SplNbr('  + %Trim( FIL# ) +
     C                                  ') '
      *
     C                   CallP(e)  RunCLCmd(WRKSTR : %size(wrkstr))

     C                   EndSr
      *  -------------------------------------------------------------
      *  - Subroutine.... SndMsg                                     -
      *  - Description... Send escape message when error is found    -
      *  -------------------------------------------------------------

     C     SndMsg        BegSr

     C                   Eval      MsgDtaLen = %Size( MsgDta )

     C                   CallP     SndPgmMsg( MsgID      :
     C                                        QualMsgF   :
     C                                        MsgDta     :
     C                                        MsgDtaLen  :
     C                                        MsgType    :
     C                                        CallStkEnt :
     C                                        CallStkCnt :
     C                                        MsgKey     :
     C                                        MsgError   )

     C                   EndSr
      *  -------------------------------------------------------------
      *  - Subroutine.... RcvMsg                                     -
      *  - Description... Receive  Program message                   -
      *  -------------------------------------------------------------

     C     RcvMsg        BegSr

     C                   CallP     RcvPgmMsg( MsgDta     :
     C                                        MsgDtaLen  :
     C                                        MsgFormat  :
     C                                        CallStkEnt :
     C                                        CurrMsgStk :
     C                                        RMsgType   :
     C                                        MsgKey     :
     C                                        MsgWait    :
     C                                        MsgAction  :
     C                                        MsgError   )
      * Retrieve Message ID
     C                   Eval      RcvMsgId= %subst(MsgDta : 13 : 7 )

     C                   EndSr
      *---------------------------------------------------------------------
     C     ExitOnErr     BegSr
      *---------------------------------------------------------------------
     C                   Eval      *InLR     = *On

     C                   Eval      RcvMsgId = *blanks
     C                   Exsr      RcvMsg
     C                   Clear                   MsgDta
     C                   Eval      MsgDta = 'Error Message ID: ' +
     C                                      RcvMsgId             +
     C                                      ', Please see Joblog for detail'

     C                   Exsr      SndMsg

     C                   Return

     C                   EndSr



File  : QCMDSRC
Member: PRGSPLF
Type  : CMD
Usage : CRTCMD CMD(PRGSPLF) PGM(PRGSPLF)     

/*  ===============================================================  */
/*  =  Command....... PrgSplf                                     =  */
/*  =  Source type... CMD                                         =  */
/*  =  Description... Purge spooled files                         =  */
/*  =                                                             =  */
/*  =  CPP........... PrgSplf                                     =  */
/*  =                                                             =  */
/*  ===============================================================  */
/*  = Date  : 2007/09/21                                          =  */
/*  = Author: Vengoal Chang                                       =  */
/*  ===============================================================  */

 PRGSPLF:    CMD        PROMPT('Purge Spooled Files')

             /*   Command processing program is: PRGSPLF    */

             PARM       KWD(DAYS) TYPE(*UINT2) DFT(14) EXPR(*YES) +
                          PROMPT('Number of days to keep')
             PARM       KWD(USRPRF) TYPE(*NAME) LEN(10) +
                          DFT(*CURRENT) SPCVAL((*CURRENT) (*ALL)) +
                          EXPR(*YES) PROMPT('User profile')
             PARM       KWD(DLTSAV) TYPE(*CHAR) LEN(4) RSTD(*YES) +
                          DFT(*NO) VALUES(*YES *NO) PROMPT('Delete +
                          saved spool')
             PARM       KWD(DLTHLD) TYPE(*CHAR) LEN(4) RSTD(*YES) +
                          DFT(*NO) VALUES(*YES *NO) PROMPT('Delete +
                          held spool')


File  : QCLSRC
Member: PRGSPLFC
Type  : CLP
Usage : CRTCLPGM  PRGSPLFC
        此測試程式會將系統中超過 60 天的逾期報表(包含報表狀態為 RDY, SAV, HLD)清除
        CALL PRGSPLFC   
        當然也可以直接使用
        SBMJOB CMD(PRGSPLF DAYS(60) USRPRF(*ALL) DLTSAV(*YES) DLTHLD(*YES)) JOB(PRGSPLF)
        不過執行時間會因系統報表多寡而有所不同   

PGM

             DCLF       FILE(QADSPOBJ)

             DSPOBJD    OBJ(*ALL) OBJTYPE(*USRPRF) OUTPUT(*OUTFILE) +
                          OUTFILE(QTEMP/USRPRFOBJ)

             OVRDBF     FILE(QADSPOBJ) TOFILE(QTEMP/USRPRFOBJ)

READ:
             RCVF
             MONMSG CPF0864 EXEC(GOTO END)

       /*    IF (%SST(&ODOBNM 1 1) *EQ 'Q') GOTO READ */

             SBMJOB     CMD(PRGSPLF DAYS(60) USRPRF(&ODOBNM) +
                          DLTSAV(*YES) DLTHLD(*YES)) JOB(&ODOBNM)

             GOTO READ
END:
             DLTOVR     FILE(QADSPOBJ)

             RETURN
ENDPGM


                        



星期二, 11月 07, 2023

2006-02-22 如何針移動整個 outq 的報表至另一個outq ?(Command PRCSLTSPLF)


如何針移動整個 outq 的報表至另一個outq ?(Command PRCSLTSPLF)

工具: PRCSLTSPLF(Process selected spool files)
此工具整合 MOVSPLF, HLDSPLF, DLTSPLF, RLSSPLF

The Process Selected Spool Files Utility

下載 Source code
                        

/*==================================================================*/
/* Process a group of spool files                                   */
/*==================================================================*/
/* To compile:                                                      */
/*                                                                  */
/*           CRTCMD     CMD(XXX/PRCSLTSPLF) PGM(XXX/SPL001CL) +     */
/*                        SRCFILE(XXX/QCMDSRC)                      */
/*                                                                  */
/*==================================================================*/
             CMD        PROMPT('Process selected spool files')

             PARM       KWD(FROMOUTQ) TYPE(Q1) PROMPT('From output +
                          queue')
 Q1:         QUAL       TYPE(*NAME) LEN(10) MIN(1) EXPR(*YES)
             QUAL       TYPE(*NAME) LEN(10) DFT(*LIBL) +
                          SPCVAL((*LIBL) (*CURLIB)) EXPR(*YES) +
                          PROMPT('Library')

             PARM       KWD(ACTION) TYPE(*CHAR) LEN(3) RSTD(*YES) +
                          DFT(MOV) VALUES(DLT HLD MOV RLS) +
                          EXPR(*YES) PROMPT('Action')

             PARM       KWD(FILE) TYPE(*NAME) LEN(10) DFT(*ALL) +
                          SPCVAL((*ALL)) EXPR(*YES) PROMPT('File name')
             PARM       KWD(FORMTYPE) TYPE(*NAME) LEN(10) DFT(*ALL) +
                          SPCVAL((*ALL) (*STD)) EXPR(*YES) +
                          PROMPT('Form type')
             PARM       KWD(USERDATA) TYPE(*NAME) LEN(10) DFT(*ALL) +
                          SPCVAL((*ALL)) EXPR(*YES) PROMPT('User data')
             PARM       KWD(USERID) TYPE(*NAME) LEN(10) DFT(*ALL) +
                          SPCVAL((*ALL)) EXPR(*YES) PROMPT('User +
                          profile')
             PARM       KWD(DATE) TYPE(*DATE) DFT(*ALL) SPCVAL((*ALL +
                          010140)) PROMPT('Creation date')

             PARM       KWD(TOOUTQ) TYPE(Q1) PMTCTL(OUTQ2) +
                          PROMPT('To output queue')
 OUTQ2:      PMTCTL     CTL(ACTION) COND((*EQ MOV))
/*==================================================================*/
/* CPP for PRCSLTSPLF command                                       */
/*==================================================================*/
/* To compile:                                                      */
/*                                                                  */
/*           CRTCLPGM   PGM(XXX/SPL001CL) SRCFILE(XXX/QCLSRC)       */
/*                                                                  */
/*==================================================================*/
PGM        PARM(&FROMOUTQ &ACTION &SELFILE &SELFORM +
               &SELUSRDTA &SELUSER &SELDATE &TOOUTQ)

  DCL  &ACOUNT      *CHAR   5
  DCL  &ACTION      *CHAR   3
  DCL  &COUNT       *DEC    5
  DCL  &DONE        *CHAR  10
  DCL  &ERROR       *LGL       VALUE('0')
  DCL  &ERRBYTES    *CHAR   4  VALUE(X'00000000')
  DCL  &ERRORDATA   *CHAR  80
  DCL  &ERRORID     *CHAR   7
  DCL  &FROMOUTQ    *CHAR  20
  DCL  &FROMOUTQLI  *CHAR  10
  DCL  &FROMOUTQNA  *CHAR  10
  DCL  &MSGKEY      *CHAR   4
  DCL  &MSGTYP      *CHAR  10  VALUE('*DIAG')
  DCL  &MSGTYPCTR   *CHAR   4  VALUE(X'00000001')
  DCL  &PGMMSGQ     *CHAR  10  VALUE('*')
  DCL  &SELDATE     *CHAR   7
  DCL  &SELFILE     *CHAR  10
  DCL  &SELFORM     *CHAR  10
  DCL  &SELUSER     *CHAR  10
  DCL  &SELUSRDTA   *CHAR  10
  DCL  &SPLFDATE    *CHAR   7
  DCL  &SPLFFILE    *CHAR  10
  DCL  &SPLFJOBNAM  *CHAR  10
  DCL  &SPLFJOBNBR  *CHAR   6
  DCL  &SPLFJOBUSR  *CHAR  10
  DCL  &SPLFNBR     *CHAR   6
  DCL  &STKCTR      *CHAR   4  VALUE(X'00000001')
  DCL  &TOOUTQ      *CHAR  20
  DCL  &TOOUTQLIB   *CHAR  10
  DCL  &TOOUTQNAME  *CHAR  10

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

  CHGVAR     VAR(&FROMOUTQNA) VALUE(&FROMOUTQ)
  CHGVAR     VAR(&FROMOUTQLI) VALUE(%SST(&FROMOUTQ 11 10))
  CHKOBJ     OBJ(&FROMOUTQLI/&FROMOUTQNA) OBJTYPE(*OUTQ)

  IF         COND(&ACTION *EQ MOV) THEN(DO)
    CHGVAR     VAR(&TOOUTQNAME) VALUE(&TOOUTQ)
    CHGVAR     VAR(&TOOUTQLIB) VALUE(%SST(&TOOUTQ 11 10))
    CHKOBJ     OBJ(&TOOUTQLIB/&TOOUTQNAME) OBJTYPE(*OUTQ)
  ENDDO

GETENTRY:
  CALL       PGM(SPL001RG) PARM(&FROMOUTQ &SELFORM +
               &SELUSRDTA &SELUSER &SELDATE &SELFILE +
               &SPLFFILE &SPLFJOBNBR &SPLFJOBUSR +
               &SPLFJOBNAM &SPLFNBR &SPLFDATE &ERRORID &ERRORDATA)
  IF         COND(&ERRORID *NE ' ') THEN(DO)
    SNDPGMMSG  MSGID(&ERRORID) MSGF(QCPFMSG) +
                 MSGDTA(&ERRORDATA) MSGTYPE(*ESCAPE)
  ENDDO
  IF         COND(&SPLFFILE *EQ '**********') THEN(GOTO +
               CMDLBL(ENDENTRY))
  IF         COND(&ACTION *EQ MOV) THEN(DO)
    CHGSPLFA   FILE(&SPLFFILE) +
                 JOB(&SPLFJOBNBR/&SPLFJOBUSR/&SPLFJOBNAM) +
                 SPLNBR(&SPLFNBR) OUTQ(&TOOUTQLIB/&TOOUTQNAME)
    CHGVAR     VAR(&COUNT) VALUE(&COUNT + 1)
    CHGVAR     VAR(&DONE) VALUE('moved')
  ENDDO
  ELSE       CMD(IF COND(&ACTION *EQ DLT) THEN(DO))
    DLTSPLF    FILE(&SPLFFILE) +
                 JOB(&SPLFJOBNBR/&SPLFJOBUSR/&SPLFJOBNAM) +
                 SPLNBR(&SPLFNBR)
    CHGVAR     VAR(&COUNT) VALUE(&COUNT + 1)
    CHGVAR     VAR(&DONE) VALUE('deleted')
  ENDDO
  ELSE       CMD(IF COND(&ACTION *EQ HLD) THEN(DO))
    HLDSPLF    FILE(&SPLFFILE) +
                 JOB(&SPLFJOBNBR/&SPLFJOBUSR/&SPLFJOBNAM) +
                 SPLNBR(&SPLFNBR)
    CHGVAR     VAR(&COUNT) VALUE(&COUNT + 1)
    CHGVAR     VAR(&DONE) VALUE('held')
  ENDDO
  ELSE       CMD(IF COND(&ACTION *EQ RLS) THEN(DO))
    RLSSPLF    FILE(&SPLFFILE) +
                 JOB(&SPLFJOBNBR/&SPLFJOBUSR/&SPLFJOBNAM) +
                 SPLNBR(&SPLFNBR)
    CHGVAR     VAR(&COUNT) VALUE(&COUNT + 1)
    CHGVAR     VAR(&DONE) VALUE('released')
  ENDDO
  GOTO       CMDLBL(GETENTRY)

ENDENTRY:
  IF         COND(&COUNT *EQ 0) THEN(DO)
    CHGVAR     VAR(&ACOUNT) VALUE('0')
  ENDDO
  ELSE       CMD(DO)
    CHGVAR     VAR(&ACOUNT) VALUE(&COUNT)
RADJ:
    IF         COND(%SST(&ACOUNT 1 1) *EQ '0') THEN(DO)
      CHGVAR     VAR(&ACOUNT) VALUE(%SST(&ACOUNT 2 4))
      GOTO       CMDLBL(RADJ)
    ENDDO
  ENDDO
  SNDPGMMSG  MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA('Spool +
               files' *BCAT &DONE *TCAT ':' *BCAT +
               &ACOUNT) MSGTYPE(*COMP)
  RETURN

  /*==================================================================*/
  /* Error processing routine                                         */
  /*==================================================================*/
ERRPROC:
  IF         COND(&ERROR) THEN(GOTO CMDLBL(ERRDONE))
  ELSE       CMD(CHGVAR VAR(&ERROR) VALUE('1'))

  /* Move all *DIAG messages to previous program queue */
  CALL       PGM(QMHMOVPM) PARM(&MSGKEY &MSGTYP +
               &MSGTYPCTR &PGMMSGQ &STKCTR &ERRBYTES)

  /* Resend last *ESCAPE message */
ERRDONE:
  CALL       PGM(QMHRSNEM) PARM(&MSGKEY &ERRBYTES)
  MONMSG     MSGID(CPF0000) EXEC(DO)
    SNDPGMMSG  MSGID(CPF3CF2) MSGF(QCPFMSG) +
                 MSGDTA('QMHRSNEM') MSGTYPE(*ESCAPE)
    MONMSG     MSGID(CPF0000)
  ENDDO

ENDPGM
      *===============================================================
      * Return information about a spool file. Used by PRCSLTSPLF.
      *===============================================================
      * To compile:
      *      CRTRPGPGM  PGM(XXX/SPL001RG) SRCFILE(XXX/QRPGSRC)
      *
      *===============================================================
      *  API error data structure
     IAPIERR      DS
     I                                    B   1   40ERRPRV
     I                                    B   5   80ERRAVL
     I                                        9  15 ERRID
     I                                       17  96 ERRPDT
      *  API general header
     IAPIHDR      DS
     I                                    B 125 1280GUSOFF
     I                                    B 133 1360GUSNBE
     I                                    B 137 1400GUSLEN
      * Spool file header data, SPLF0200 format
     ISPLHDR      DS
     I                                        1  10 SPHUSR
     I                                       11  20 SPHOTQ
     I                                       21  30 SPHOQL
     I                                       31  40 SPHFRM
     I                                       41  50 SPHUDT
     I                                    B  83  860SPHNKY
     I                                       87 102 SPHNU1
     I                                      103 112 SPHNAM
      * Spool file header data for fields
     ISPLHD2      DS
     I                                       21  30 SPANAM
     I                                       49  58 SPAJOB
     I                                       77  86 SPAUSR
     I                                      105 110 SPAJBN
     I                                    B 129 1320SPANUM
     I                                      149 155 SPDATE
      * Data structure to define binary variables
     I            DS
     I                                    B   1   40SPLKEY
     I                                    B   5   80GUSSPO
     I                                    B   9  120GUSHLN
     I                                    B  13  160SPSIZE
     I                                    B  17  200SPALRV
      * Binary DS for QUSLSPL list of keys
     I            DS
     I                                        1  24 SPLK
     I                                    B   1   40SPLK1
     I                                    B   5   80SPLK2
     I                                    B   9  120SPLK3
     I                                    B  13  160SPLK4
     I                                    B  17  200SPLK5
     I                                    B  21  240SPLK6
      *
     I              '#SPLFWORK#QTEMP     'C         USRSPN
     C           *ENTRY    PLIST
     C                     PARM           I#OUTQ 20        output queue
     C                     PARM           I#FORM 10        form
     C                     PARM           I#USRD 10        user data
     C                     PARM           I#USNM 10        user name
     C                     PARM           I#DATE  7        creation date
     C                     PARM           I#FILE 10        file name
     C                     PARM           O#FILE 10        file name
     C                     PARM           O#JBNR  6        job number
     C                     PARM           O#JBUS 10        user profile
     C                     PARM           O#JBNM 10        job name
     C                     PARM           O#SPNR  6        spool file nbr
     C                     PARM           O#SPDT  7        creation date
     C                     PARM           O#ERID  7        Error msg ID
     C                     PARM           O#ERDT 80        Error msg data
      *
      * Process next spool file entry
      *
     C           SELECT    DOUEQ'1'
     C                     MOVE '1'       SELECT  1
     C                     ADD  1         ENTRCT  90
     C           ENTRCT    IFLE GUSNBE
      * Get the attributes of the spooled file
     C                     CALL 'QUSRTVUS'
     C                     PARM           SPACNM
     C                     PARM           GUSSPO
     C                     PARM           GUSLEN
     C                     PARM           SPLHD2
     C                     PARM           APIERR
     C                     EXSR CHKERR
     C           I#DATE    IFNE '0400101'
     C           I#DATE    ANDNESPDATE
     C                     MOVE '0'       SELECT
     C                     ENDIF
     C           I#FILE    IFNE '*ALL'
     C           I#FILE    ANDNESPANAM
     C                     MOVE '0'       SELECT
     C                     ENDIF
     C           SELECT    IFEQ '1'
     C                     MOVELSPANAM    O#FILE           file name
     C                     MOVELSPAJOB    O#JBNM           job name
     C                     MOVELSPAUSR    O#JBUS           user ID
     C                     MOVE SPAJBN    O#JBNR           job number
     C                     MOVE SPDATE    O#SPDT           creation date
     C                     MOVE SPANUM    O#SPNR           file number
     C                     ENDIF
     C                     ADD  GUSLEN    GUSSPO           goto next entry
     C                     ELSE
     C                     MOVE *ALL'*'   O#FILE
     C                     MOVE *ON       *INLR
     C                     ENDIF
     C                     ENDDO
      *
     C                     RETRN
      * =========================================================
     C           *INZSR    BEGSR
      *
     C                     MOVE *BLANKS   O#ERID
      * Create the user space
     C                     CALL 'QUSCRTUS'
     C                     PARM USRSPN    SPACNM 20
     C                     PARM           SPATTR 10
     C                     PARM 8192      SPSIZE
     C                     PARM X'00'     SPIVAL  1
     C                     PARM '*CHANGE' SPAUTH 10
     C                     PARM           SPTEXT 50
     C                     PARM '*YES'    SPREPL 10
     C                     PARM           APIERR
     C                     EXSR CHKERR
      *
      * initialize user space list variables
     C                     Z-ADD6         SPLKEY
     C                     Z-ADD201       SPLK1            file name
     C                     Z-ADD202       SPLK2            job name
     C                     Z-ADD203       SPLK3            user name
     C                     Z-ADD204       SPLK4            job number
     C                     Z-ADD205       SPLK5            spool file nbr
     C                     Z-ADD216       SPLK6            creation date
     C                     CALL 'QUSLSPL'
     C                     PARM           SPACNM 20        usrspc name
     C                     PARM 'SPLF0200'SPFMT   8        format
     C                     PARM I#USNM    SPUSNM 10        user name
     C                     PARM I#OUTQ    SPOUTQ 20        output queue
     C                     PARM I#FORM    SPFORM 10        formtype
     C                     PARM I#USRD    SPUSRD 10        user data
     C                     PARM           APIERR
     C                     PARM *BLANKS   SPLJBN 26        job name
     C                     PARM           SPLK
     C                     PARM           SPLKEY
     C                     EXSR CHKERR
      *
      * Get User Space Detail Parameter list
     C                     Z-ADD140       GUSHLN
     C                     CLEARAPIHDR
      * Get header data from user space
     C                     Z-ADD1         GUSSPO
     C                     CALL 'QUSRTVUS'
     C                     PARM           SPACNM
     C                     PARM 1         GUSSPO
     C                     PARM           GUSHLN
     C                     PARM           APIHDR
     C                     PARM           APIERR
     C                     EXSR CHKERR
      *
     C           GUSOFF    ADD  1         GUSSPO
     C                     CALL 'QUSRTVUS'
     C                     PARM           SPACNM
     C                     PARM           GUSSPO
     C                     PARM           GUSHLN
     C                     PARM           SPLHDR
     C                     PARM           APIERR
     C                     EXSR CHKERR
      *
     C                     ENDSR
      * =========================================================
     C           CHKERR    BEGSR
      *
     C           ERRID     IFNE *BLANKS
     C                     MOVELERRID     O#ERID
     C                     MOVELERRPDT    O#ERDT
     C                     MOVE *ON       *INLR
     C                     RETRN
     C                     ENDIF
      *
     C                     ENDSR