Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1298646
  • 博文数量: 287
  • 博客积分: 11000
  • 博客等级: 上将
  • 技术积分: 3833
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-16 08:43
文章分类
文章存档

2013年(15)

2012年(17)

2011年(17)

2010年(135)

2009年(85)

2008年(18)

分类: 系统运维

2010-06-04 17:17:04

Retrieve Job Schedule Entries ******************************************************************** * PROGRAM : JOBSCDER * DESCRIPTION : Retrieve Job Schedule Entries, sort by Time * AUTHOR : Joe Marx * * NOTES : Written for Sox Remedation * * APIs Used: QWCLSCDE - Retrieve Job Schedule Entries * QLGSORT - Sort List * QUSCRTUS - Create User Space * QUSDLTUS - Delete User Space * QUSPTRUS - Retrieve From User Space w/ Pointer * QWCRNETA - Retrieve Network Attributes * QMHSNDPM - Send Message * * * MAINTENANCE PROGRAMMER, PROJECT #, AND DESCRIPTION. * ----------- --------------------------------------- * 10/26/2004 Joe Marx - Created ******************************************************************** FQSYSPRT O F 132 PRINTER OFLIND(*INOF) * DATE FORMATS -------------------------------------------- D FORMATMDY S D DATFMT(*MDY) D FORMATUSA S D DATFMT(*USA) D FORMATYMD S D DATFMT(*YMD) D FORMATISO S D DATFMT(*ISO) D PGM_INFO SDS D PGM_NAME *PROC D PGM_STATUS *STATUS D PGM_USER 254 263 * DELETE USER SPACE D DELETESPACE PR EXTPGM('QUSDLTUS') D 20 D 116 * CREATE USER SPACE D USERSPACE PR EXTPGM('QUSCRTUS') D 20 D 10 D 10I 0 D 1 D 10 D 50 D 10 D 116 D 10 * GET A RESOLVED POINTER TO THE USER SPACE D GETPOINTER PR EXTPGM('QUSPTRUS') D 20 CONST D * D 116 *** API for List of Job Schedule Entries D JobSch PR EXTPGM('QWCLSCDE') D 20 CONST D 8 CONST D 10 CONST D 16 CONST D 116 *** QCMD DCOMMAND PR EXTPGM('QCMDEXC') D CMDSTRING 3000 CONST OPTIONS(*VARSIZE) D CMDLENGTH 15P 5 CONST D CMDOPT 3 CONST OPTIONS(*NOPASS) D SendMsg PR extpgm('QMHSNDPM') D MsgID 7 const D MsgFile 20 const D MsgDta 80 const D MsgDtaLen 10i 0 const D MsgType 10 const D MsgQ 10 const D MsgQNbr 10i 0 const D MsgKey 4 D ErrorDS 16 *** API Error Handling D DS D APIERROR 116 D BYTPRV 9B 0 OVERLAY(APIERROR) INZ(16) D BYTAVA 9B 0 OVERLAY(APIERROR:5) D MSGID 7 OVERLAY(APIERROR:9) D ERR### 1 OVERLAY(APIERROR:16) D MSGDTAE 100 OVERLAY(APIERROR:17) * GENERIC LIST HEADER D SPCPTR S * D QUSH0100 DS BASED(SPCPTR) D QUSUA 64 USER AREA D QUSSGH 10I 0 HEADER SIZE D QUSSRL 4 RELEASE LEVEL D QUSFN 8 FORMAT NAME D QUSAU 10 API USED D QUSDTC 13 DATE/TIME CREATED D QUSIS 1 INFO STATUS D QUSSUS 10I 0 SIZE USER SPACE D QUSOIP 10I 0 OFSET INPUT PARM D QUSSIP 10I 0 INPUT PARM SIZE D QUSOHS 10I 0 OFFSET HDR SECTION D QUSSHS 10I 0 HEADER SECTION SIZE D QUSOLD 10I 0 OFFSET LIST DATA D QUSSLD 10I 0 SIZE LIST DATA D QUSNBRLE 10I 0 NUMBER LIST ENTRIES D QUSSEE 10I 0 SIZE EACH ENTRY D QUSSIDLE 10I 0 CCSID LIST ENT D QUSCID 2 COUNTRY ID D QUSLID 3 LANGUAGE ID D QUSSLI 1 SUBSET LIST INDICO D QUSERVED00 42 RESERVED D JS_PTR S * D JS S 1 BASED(JS_PTR) DIM(32767) D JS_Detail DS 1156 Based(JS_PTR) D JS_Char1 1 Overlay(JS_Detail:1) D JS_Job 10 Overlay(JS_Detail:*Next) D JS_Entry 10 Overlay(JS_Detail:*Next) D JS_SchDate 10 Overlay(JS_Detail:*Next) D JS_SchDays 70 Overlay(JS_Detail:*Next) D JS_SchTime 6 Overlay(JS_Detail:*Next) D JS_Freq 10 Overlay(JS_Detail:*Next) D JS_DayofMon 50 Overlay(JS_Detail:*Next) D JS_Recovery 10 Overlay(JS_Detail:*Next) D JS_NextDate 10 Overlay(JS_Detail:*Next) D JS_Status 10 Overlay(JS_Detail:*Next) D JS_JobqNam 10 Overlay(JS_Detail:*Next) D JS_JobqLib 10 Overlay(JS_Detail:*Next) D JS_UsrPrf 10 Overlay(JS_Detail:*Next) D JS_LastDate 10 Overlay(JS_Detail:*Next) D JS_LastTime 6 Overlay(JS_Detail:*Next) D JS_Text 50 Overlay(JS_Detail:*Next) D JS_Fill1 23 Overlay(JS_Detail:*Next) D JS_JobqStatus 10 Overlay(JS_Detail:*Next) D JS_DatesOmit 200 Overlay(JS_Detail:*Next) D JS_JobdNam 10 Overlay(JS_Detail:*Next) D JS_JobdLib 10 Overlay(JS_Detail:*Next) D JS_UsrPrf2 10 Overlay(JS_Detail:*Next) D JS_MsgQNam 10 Overlay(JS_Detail:*Next) D JS_MsgQlib 10 Overlay(JS_Detail:*Next) D JS_SaveEnt 10 Overlay(JS_Detail:*Next) D JS_LastSubN 10 Overlay(JS_Detail:*Next) D JS_LastSubU 10 Overlay(JS_Detail:*Next) D JS_LastSubJ 6 Overlay(JS_Detail:*Next) D JS_LastAttD 10 Overlay(JS_Detail:*Next) D JS_LastAttT 6 Overlay(JS_Detail:*Next) D JS_LastAttS 10 Overlay(JS_Detail:*Next) D JS_Fill2 2 Overlay(JS_Detail:*Next) D JS_Len 4 0 Overlay(JS_Detail:*Next) D JS_Command 512 Overlay(JS_Detail:*Next) * Sort Block DSORTBLOCK DS D BLOCKLEN 1 4B 0 INZ(0) D REQTYPE 5 8B 0 INZ(8) D RSVP1 9 12B 0 INZ(0) D OPTIONS 13 16B 0 INZ(0) D RECLEN 17 20B 0 INZ(0) D RECCOUNT 21 24B 0 INZ(0) D OFF2KEY 25 28B 0 INZ(80) D NBROFKEYS 29 32B 0 INZ(0) D OFF2NLSI 33 36B 0 INZ(0) D OFF2IFL 37 40B 0 INZ(0) D NBRINF 41 44B 0 INZ(0) D OFF2OFL 45 48B 0 INZ(0) D NBROUTF 49 52B 0 INZ(0) D KEYENTLEN 53 56B 0 INZ(16) D NLSSLEN 57 60B 0 INZ(290) D IFELEN 61 64B 0 INZ(0) D OFELEN 65 68B 0 INZ(0) D OFF2NBM 69 72B 0 INZ(0) D OFF2VLRA 73 76B 0 INZ(0) D RSVP2 77 80B 0 INZ(0) D KEYINF 16A DIM(MaxKey) * Sort Block IO DSORTIOBLOC DS D IOTYPE 1 4B 0 INZ(0) D RSVP3 5 8B 0 INZ(0) D IORECLEN 9 12B 0 INZ(0) D IORECCNT 13 16B 0 INZ(0) * Sort INFO Data Structure DKEYINFDS DS D KEYSTART 1 4B 0 D KEYSIZE 5 8B 0 D KEYDTATYP 9 12B 0 D KEYASCDESC 13 16B 0 *---------------------------------------------------------------- * QWCRNETA Retrieve network attribute - get system name * See SYSTEM PROGRAMMER'S INTERFACE REFERENCE for API detail. *---------------------------------------------------------------- D vsd s 5u 0 START OF DATA D vso s 5u 0 START OFFSET * Load number of attributes to retrieve and attribute name D vapiky ds D vnkfld 10i 0 inz(1) D vkarry 11 inz('SYSNAME') * Number of keys returned and offset to attribute data D vrcvr1 ds 200 inz D vnkyrt 10i 0 D voffna 10i 0 D vrcvln s 10i 0 inz(200) * Network Attribute Information Table returned D vnait ds inz D vrtatt 1 10 D vrttyp 11 11 D vrtsta 12 12 D vrtlen 10i 0 * User Defined Variables D JS_Format S 20 INZ('SCDL0200') D JS_Name S 8 INZ('*ALL') D JS_Handle S 10 INZ(' ') D SPC_LIB S 10 INZ('QTEMP ') D EXT_ATTR S 10 INZ D SPACE_SIZE S 10I 0 INZ(500000) D SPACE_INIT S 1 INZ(X'00') D SPACE_AUT S 10 INZ('*ALL') D SPACE_TEXT S 50 INZ('MEDI001R TEXT') D SPACE_RPL S 10 INZ('*YES') D SPACEDOMAN S 10 INZ('*USER') D SPACENAME S 20 INZ('MEDI001R QTEMP ') D TIMES S 7 0 D COUNT S 7 0 D LLEN S 7 0 D Ljob S 10 D COUNT2 S 7 0 D #Status S 3A D #Date S 10A D #Command S 31A D #Time S 6 0 D #Frequency S 10A D MAXKEY C 4 D EXITER S 1A D NOTUSED S 16A D RETURNSIZE S 9B 0 D SIZELIST S 9B 0 D SYSNAME S 8 D #str S 4 0 D #end S 4 0 D #Len S 4 0 D CMDSTRING S 3000 VARYING D CMDLENGTH S 15 5 D MsgDta s 80 D MsgKey s 4 ** Initial Startup C EXSR INIT ** Main Processing C EXSR Main ** Special Processing C EXSR Special * Send Message that Job has completed. C*** CALLP COMMAND( CMDSTRING : %LEN(CMDSTRING)) C eval MsgDta = 'AS/400 Batch Job Schedule - C has printed' C callp SendMsg ('CPF9898': C 'QCPFMSG QSYS': C MsgDta: C %len(MsgDta): C '*ESCAPE': C '*': C 2: C MsgKey: C ApiError) ** End Program C EVAL *INLR = *ON *============================================================== * Subroutine - Main * This subroutine processing.... *============================================================== C Main begsr ** Print Header at least 1 time.... C EXCEPT HEAD1 ** RETRIEVE DATABASE FILE DESCRIPTION USING USER SPACE ** CREATE USER SPACE C CALLP USERSPACE(SPACENAME : C EXT_ATTR : SPACE_SIZE : C SPACE_INIT : SPACE_AUT : C SPACE_TEXT : SPACE_RPL : C APIERROR : SPACEDOMAN ) ** RETRIEVE WRKJOBSCDE API - QWCLSCDE C CALLP JOBSCH(SPACENAME : C JS_Format : JS_Name : C JS_Handle : APIERROR ) * GET A RESOLVED POINTER TO THE USER SPACE * RECEIVES HEADER INFO FROM USER SPACE C CALLP GETPOINTER(SPACENAME : SPCPTR : C APIERROR) C * SET JS_PTR TO THE FIRST BYTE OF THE USER SPACE C EVAL JS_PTR = SPCPTR * Initial Sort API c EXSR $InzSort * Initial Sort List c EXSR $SortList * DELETE ALL USER SPACES BEFORE EXITING PROGRAM C CALLP DELETESPACE(SPACENAME : APIERROR ) * Print Totals C EXSR @@HEAD C EXCEPT TOT1 C EndSr *============================================================== * Subroutine - Special * This subroutine processing.... *============================================================== C Special begsr ** Print Header at least 1 time.... C EXCEPT HEAD2 ** RETRIEVE DATABASE FILE DESCRIPTION USING USER SPACE ** CREATE USER SPACE C CALLP USERSPACE(SPACENAME : C EXT_ATTR : SPACE_SIZE : C SPACE_INIT : SPACE_AUT : C SPACE_TEXT : SPACE_RPL : C APIERROR : SPACEDOMAN ) ** RETRIEVE WRKJOBSCDE API - QWCLSCDE C CALLP JOBSCH(SPACENAME : C JS_Format : JS_Name : C JS_Handle : APIERROR ) * GET A RESOLVED POINTER TO THE USER SPACE * RECEIVES HEADER INFO FROM USER SPACE C CALLP GETPOINTER(SPACENAME : SPCPTR : C APIERROR) C * SET JS_PTR TO THE FIRST BYTE OF THE USER SPACE C EVAL JS_PTR = SPCPTR * Initial Sort API c EXSR $InzSort * Initial Sort List c EXSR $SortList2 * DELETE ALL USER SPACES BEFORE EXITING PROGRAM C CALLP DELETESPACE(SPACENAME : APIERROR ) * Print Totals C EXSR @@HEAD2 C EXCEPT TOT2 C EndSr *============================================================== * Subroutine - Init * This subroutine Initializes the Program *============================================================== C Init begsr C call 'QWCRNETA' RETRIEVE SPACE C parm vrcvr1 C parm 200 vrcvln C parm vnkfld NUMBER OF KEYS C parm vkarry KEY ARRAY C parm ApiError C voffna add 1 vso START OFFSET C voffna add 1 vso START OFFSET C eval vnait = %subst(vrcvr1:vso:16) LOAD NAIT DST C vso add 16 vsd START OF DATA C vrtlen subst vrcvr1:vsd SYSNAME EXTRACT SYSNAM c Endsr *============================================================== * Subroutine - @@HEAD * Check for Overflow - Reprints Heading *============================================================== C @@HEAD begsr c if *inOF = *on C EXCEPT HEAD1 c Eval *inOF = *off c EndIf C Endsr *============================================================== * Subroutine - @@HEAD2 * Check for Overflow - Reprints Heading for Special *============================================================== C @@HEAD2 begsr c if *inOF = *on C EXCEPT HEAD1 c Eval *inOF = *off c EndIf C Endsr *============================================================== * Subroutine - InzSort * This subroutine Initializes the Sort API *============================================================== c $InzSort begsr * Initialize the key fields to sort on. * Load JS_Freq field as key field, 06 byte, Char, ascending sequence. c eval KeyStart = 107 c eval KeySize = 10 c eval KeyDtaTyp = 2 c eval KeyAscDesc = 1 c eval KeyInf(1) = KeyInfDs * Load JS_schTime field as key field, 06 byte, Char, ascending sequence. c eval KeyStart = 101 c eval KeySize = 06 c eval KeyDtaTyp = 2 c eval KeyAscDesc = 1 c eval KeyInf(2) = KeyInfDs * Load JS_Job field as key field, 10 byte, char , ascending sequence. c eval KeyStart = 1 c eval KeySize = 10 c eval KeyDtaTyp = 6 c eval KeyAscDesc = 1 c eval KeyInf(3) = KeyInfDs * Load other sort parameters. c eval BlockLen = 80 + 16 * MaxKey c eval NbrOfKeys = 3 Variable c eval RecLen = %size(JS_Detail) * Initialize Sort I/O API fields. c eval IORecLen = RecLen c eval IORecCnt = 1 * All done initializing. c ENDSR *============================================================== * Subroutine - SortList * This subroutine sorts the List *============================================================== c $SortList begsr * First step - Initialize the sort routine. c call 'QLGSORT' c parm SortBlock c parm NotUsed c parm NotUsed c parm SizeList c parm ReturnSize c parm ApiError * Next step - write records to I/O routine. c eval IOType = 1 * INCREMENT JS_PTR TO THE FIRST LIST ENTRY C EVAL JS_PTR = %ADDR(JS(QUSOLD + 1)) C FOR TIMES=1 BY 1 TO QUSNBRLE c call 'QLGSRTIO' c parm SortIOBloc c parm JS_Detail c parm NotUsed c parm SizeList c parm NotUsed c parm ApiError C EVAL JS_PTR = %ADDR(JS(QUSSEE + 1)) C Endfor * Next step - Signal end of input, clear JS_DETAIL for reload. c eval IOType = 2 c call 'QLGSRTIO' c parm SortIOBloc c parm JS_Detail c parm NotUsed c parm SizeList c parm NotUsed c parm ApiError * Final step - write the records back to the subfile. c eval IOType = 3 C EVAL JS_PTR = %ADDR(JS(QUSOLD + 1)) C FOR TIMES=1 BY 1 TO QUSNBRLE c call 'QLGSRTIO' c parm SortIOBloc c parm NotUsed c parm JS_Detail c parm IORecLen c parm NotUsed c parm ApiError * Set up Date of Run.... C Eval #DATE = JS_SCHDATE C Select C WHEN JS_SCHDATE = '*NONE' C and JS_SchDays <> '*ALL' C Eval #DATE = 'USER DEF' C WHEN JS_SCHDATE = '*NONE' C and JS_SchDays = '*ALL' C Eval #DATE = '*All' C EndSL * Set up #Status... C Eval #Status = %subst(JS_Status:1:3) * Set up #Time..... C Move JS_SCHTIME #Time * Set up #command..... C Eval #COMMAND = %subst(JS_COMMAND:1:31) C If %subst(JS_COMMAND:1:9) = 'CALL PGM(' C Eval #str = %scan('/': JS_Command ) C Eval #end = %scan(')': JS_Command ) * check if library with program(meaning / comes after program) C If #str > #end C or #str = 0 C Eval #COMMAND = %subst(JS_COMMAND: 10 C :(#End-1) - 9) C Else C Eval #COMMAND = %subst(JS_COMMAND: #str+1 C :(#End-1)-#Str) C Endif C Endif C Eval #LEN = %len(%trim(JS_COMMAND)) C If #LEN > LLEN C Eval LLEN = #LEN C Eval LJOB = JS_Job C Endif C EVAL COUNT = COUNT + 1 C EXSR @@HEAD C EXCEPT DET1 C EVAL JS_PTR = %ADDR(JS(QUSSEE + 1)) C ENDFOR c endsr *============================================================== * Subroutine - SortList2 * This subroutine sorts the List *============================================================== c $SortList2 begsr * First step - Initialize the sort routine. c call 'QLGSORT' c parm SortBlock c parm NotUsed c parm NotUsed c parm SizeList c parm ReturnSize c parm ApiError * Next step - write records to I/O routine. c eval IOType = 1 * INCREMENT JS_PTR TO THE FIRST LIST ENTRY C EVAL JS_PTR = %ADDR(JS(QUSOLD + 1)) C FOR TIMES=1 BY 1 TO QUSNBRLE c call 'QLGSRTIO' c parm SortIOBloc c parm JS_Detail c parm NotUsed c parm SizeList c parm NotUsed c parm ApiError C EVAL JS_PTR = %ADDR(JS(QUSSEE + 1)) C Endfor * Next step - Signal end of input, clear JS_DETAIL for reload. c eval IOType = 2 c call 'QLGSRTIO' c parm SortIOBloc c parm JS_Detail c parm NotUsed c parm SizeList c parm NotUsed c parm ApiError * Final step - write the records back to the subfile. c eval IOType = 3 C EVAL JS_PTR = %ADDR(JS(QUSOLD + 1)) C FOR TIMES=1 BY 1 TO QUSNBRLE c call 'QLGSRTIO' c parm SortIOBloc c parm NotUsed c parm JS_Detail c parm IORecLen c parm NotUsed c parm ApiError * Set up Date of Run.... C Eval #DATE = JS_SCHDATE C Select C WHEN JS_SCHDATE = '*NONE' C and JS_SchDays <> '*ALL' C Eval #DATE = 'USER DEF' C WHEN JS_SCHDATE = '*NONE' C and JS_SchDays = '*ALL' C Eval #DATE = '*All' C EndSL * Set up #Status... C Eval #Status = %subst(JS_Status:1:3) * Set up #Time..... C Move JS_SCHTIME #Time * Set up #command..... C Eval #COMMAND = %subst(JS_COMMAND:1:31) C If %subst(JS_COMMAND:1:9) = 'CALL PGM(' C Eval #str = %scan('/': JS_Command ) C Eval #end = %scan(')': JS_Command ) C Eval #COMMAND = %subst(JS_COMMAND:#str+1 C :(#End-1)-#Str) C Endif * Set up #Frequency.... C Eval #Frequency = '*SUNDAY' c If %scan('*SUN' : JS_SchDays) > 0 C EVAL COUNT2 = COUNT2 + 1 C EXSR @@HEAD2 C EXCEPT DET2 c Endif C EVAL JS_PTR = %ADDR(JS(QUSSEE + 1)) C ENDFOR c endsr OQSYSPRT E HEAD1 01 O + 50 'Job Schedule List' O E HEAD1 1 O + 1 'Date of Report....:' O *Date y + 1 O 120 'PAGE......:' O PAGE Z 132 O E HEAD1 1 O + 1 'Program Name......:' O PGM_NAME + 1 O 120 'UserId....:' O PGM_USER 132 O E HEAD1 2 O + 1 'System Name.......:' O SYSNAME + 1 O E HEAD1 1 O +0 'Opt Job' O +4 'Status' O +2 'Date' O +7 'Time' O +5 'Frequency' O +2 'Description' O +40 'Program/Command' O E HEAD1 1 O +0 '--------------------' O +0 '--------------------' O +0 '--------------------' O +0 '--------------------' O +0 '--------------------' O +0 '--------------------' O +0 '------------' O E DET1 1 O JS_Job +0 O #Status +1 O #Date +5 O #Time +1 ' : : ' O JS_Freq +1 O JS_Text +1 O #Command +1 O E TOT1 3 O +0 'COUNT:' O COUNT 4 +2 O*** E TOT1 1 O*** +0 'Longest Length of Command:' O*** LLEN 4 +2 O*** LJOB +2 OQSYSPRT E HEAD2 01 O + 46 'Special Job Schedule List' O E HEAD2 1 O + 1 'Date of Report....:' O *Date y + 1 O 120 'PAGE......:' O PAGE Z 132 O E HEAD2 1 O + 1 'Program Name......:' O PGM_NAME + 1 O 120 'UserId....:' O PGM_USER 132 O E HEAD2 2 O + 1 'System Name.......:' O SYSNAME + 1 O E HEAD2 1 O +0 'Opt Job' O +4 'Status' O +2 'Date' O +7 'Time' O +5 'Frequency' O +2 'Description' O +40 'Program/Command' O E HEAD2 1 O +0 '--------------------' O +0 '--------------------' O +0 '--------------------' O +0 '--------------------' O +0 '--------------------' O +0 '--------------------' O +0 '------------' O E DET2 1 O JS_Job +0 O #Status +1 O #Date +5 O #Time +1 ' : : ' O #Frequency +1 O JS_Text +1 O #Command +1 O E TOT2 3 O +0 'COUNT:' O COUNT2 4 +2 Thanks to Joe Marx
阅读(886) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~