./ ADD NAME=ALXEXT0 ALEXT001 .TYPE=ACTION 'The Message ID is required. Specify up to 10 character MSGID' ALEXT002 .TYPE=ACTION 'The FUNCTION is requiried and must be REPLY, COMMAND or EXEC' ALEXT003 .TYPE=ACTION 'If the FUNCTION specified is REPLY then you must supply a Reply' ALEXT004 .TYPE=ACTION 'If the FUNCTION specified is COMMAND then you must supply a Command' ALEXT005 .TYPE=ACTION 'SELECT and EXCLUDE values cannot be the same. Use Y for one desired.' ALEXT006 .TYPE=ACTION 'If SELECT is specified then Y or N are the only values allowed.' ALEXT007 .TYPE=ACTION 'If EXCLUDE is specified then Y or N are the only values allowed.' ALEXT008 .TYPE=ACTION 'If Multi-Line specified then Y or N are the only values allowed' ./ ADD NAME=ALXPEXT )ATTR @ TYPE(TEXT) INTENS(LOW) COLOR(YELLOW) $ TYPE(TEXT) INTENS(LOW) SKIP(OFF) + TYPE(TEXT) INTENS(LOW) SKIP(ON) _ TYPE(INPUT) ! TYPE(INPUT) JUST(RIGHT) NUMERIC(ON) # TYPE(OUTPUT) INTENS(HIGH) )BODY @------------------ Automated Operations ------------------ %OPTION==>_ZCMD + + + Add WTO/WTOR Messages for Automated Operations Processing + + Message ID %==>_MSGID + + Enter up to 20 characters of the Message you wish to process + + Action to Perform %==>_FUNCTION+ + Valid Actions are REPLY, COMMAND, EXEC or EVENT + + Reply %==>_REPLY + + If Action was REPLY then specify the REPLY to the Message + + Command %==>_COMMAND + + If Action was COMMAND then specify the COMMAND to issue + + Search Argument %==>_SEARCH + + (%Single Quotes +are not allowed in Search Argument ) + Select if Argument Found %=>_S+ Exclude if Argument Found %=>_E+ + + Process Multi-Line WTO (Y/N) %==>_M+ + %PF1 - Help/Description of Facility PF3 - End/Assemble )INIT &ZCMD = &Z .CURSOR = MSGID .HELP = ALXPEXTH )PROC VER (&MSGID,NONBLANK,MSG=ALEXT001) IF (&FUNCTION ^= REPLY,COMMAND,EXEC,EVENT) .MSG=ALEXT002 IF (&FUNCTION = REPLY) VER (&REPLY,NONBLANK,MSG=ALEXT003) IF (&FUNCTION = COMMAND) VER (&COMMAND,NONBLANK,MSG=ALEXT004) IF (VER (&SEARCH,NONBLANK)) IF (&S = Y AND &E = Y or &S = N and &E = N) .MSG=ALEXT005 IF (VER (&S,NONBLANK)) IF (&S ^= Y,N) .MSG=ALEXT006 IF (VER (&E,NONBLANK)) IF (&E ^= Y,N) .MSG=ALEXT007 IF (VER (&M,NONBLANK)) IF (&M ^= Y,N) .MSG=ALEXT008 )END ++ ++ ++ ++ (C) COPYRIGHT 1995, SSC, INC. ++ ++ SSC, Inc. ++ 13530 Wilt Store Rd. ++ Leesburg, VA 20176 ++ (703) 777-2771 FAX (703) 777-6839 ++ WHSweeney@sscmainframe.com ./ ADD NAME=ALXPEXTH )ATTR @ TYPE(TEXT) INTENS(LOW) COLOR(YELLOW) $ TYPE(TEXT) INTENS(LOW) COLOR(RED) )BODY @-------------------- Automated Operations ------------------ + + The Company is taking advantage of the WTO exit IEVMXIT to process + WTO/WTOR messages generated on the MVS/ESA system. Rather than modifying + the exit every time a new message must be added the exit was written to + be table driven. The use of these ISPF Panels and a REXX EXEC will + allow you to add new messages to the table used by IEAVMXIT. + + The four Functions available are: REPLY (which allows you to reply + to an outstanding WTOR), COMMAND (which allows you to issue a command + to MVS), EXEC (which takes the message and invokes a REXX EXEC to + process the specified MSGID) or EVENT (which takes the message and invokes + a REXX EXEC to save it). Remember, if the EXEC Function is selected then + someone must create a REXX EXEC in SYS2.SYSTEMS.REXXLIB with the same + name as the MSGID. The EXEC will be executed and as much of the + message that can fit within the 100 byte Paramter limit will be passed to + the EXEC (Actually, (100 - MSGID - 1) (subtract 3 more if a WTOR)). + + The use of the SEARCH facility allows you to SELECT or EXCLUDE a + message if an argument is found. This might save you from having to + process the message with an EXEC. The Multi-Line option must be used + if your message is not the first line of a Multiple Line WTO. + + (hit PF3 to end) )PROC )END ++ ++ ++ ++ (C) COPYRIGHT 1995, SSC, INC. ++ ++ SSC, Inc. ++ 13530 Wilt Store Rd. ++ Leesburg, VA 20176 ++ (703) 777-2771 FAX (703) 777-6839 ++ WHSweeney@sscmainframe.com ./ ADD NAME=ALXREXT /* REXX */ /* REMEMBER THAT AN 'OR' IN EBCDIC REXX IS X'4F' AND A */ /* NOT IS X'5F' (IN CASE THE ASCII TO EBDCIC IS OFF) */ /* */ /* YOU MUST SPECIFY THE DATASET NAME WHERE THE TABLE SOURCE */ /* RESIDES AND WHERE THE LINK EDIT MSGTABLE TABLE AND */ /* IEAVMXIT MODULE RESIDE. */ /* THE FOLLOWING SOURCE DATASET IS WHERE THE MSGTABLE IS STORED */ /* THE MEMBER COULD BE ANYTHING, BUT MSGTABLE IS RECOMMENDED */ /* BECAUSE THE IEAVMXIT LINKS TO THE NAME MSGTABLE. WHY CHANGE IT*/ TABLE_SOURCE_DSN = 'SYS2.SYSTEMS.SOURCE' TABLE_MEMBER = 'MSGTABLE' OLD_MEMBER = 'ZSGTABLE' /* THIS DATASET CONTAINS THE JCL TO ASSEMBLE THE MSGTABLE MEMBER */ /* AND RELINK IEAVMXIT TO REPLACE THE MSGTABLE. */ ASMHCL_TABLE_DSN = 'SYS2.SYSTEMS.CNTL(ASMLTABL)' SOURCE_DSN = TABLE_SOURCE_DSN'('TABLE_MEMBER')' OLDSRCE_DSN = TABLE_SOURCE_DSN'('OLD_MEMBER')' STAT = MSG("OFF") "FREE F(MSGTABLE)" "ALLOCATE F(MSGTABLE) DA('"SOURCE_DSN"') SHR" "EXECIO * DISKR MSGTABLE (STEM MESSAGE. FINIS" "FREE F(MSGTABLE,ZSGTABLE)" "ALLOCATE F(ZSGTABLE) DA('"OLDSRCE_DSN"') SHR" "EXECIO " MESSAGE.0 " DISKW ZSGTABLE (STEM MESSAGE. FINIS" "FREE F(ZSGTABLE)" /* LOOP THROUGH THE TABLE AND FIND THE RANGE OF MESSAGES */ /* WHICH ARE DELIMITED BETWEEN LABEL START AND LABEL LENGTH */ DO I = 1 TO MESSAGE.0 PARSE VAR MESSAGE.I LABEL REMAINDER IF LABEL = 'START' THEN START_MESSAGE = I + 1 IF LABEL = 'LENGTH' THEN DO LAST_MESSAGE = I - 1 LENGTH_MESSAGE = MESSAGE.I END END /* WITH OUR RANGE ESTABLISHED WE WILL LOOP THRU THE MESSAGES */ /* AND EXTRACT THE MSGID FOR COMPARISON ON DUPLICATES */ MSG = 0 DO SUFFIX = START_MESSAGE TO LAST_MESSAGE POS_MESSAGE = POS(' MESSAGE ',MESSAGE.SUFFIX,1) POS_MSGID = POS('MSGID=',MESSAGE.SUFFIX,1) IF POS_MESSAGE ^= 0 & POS_MSGID ^= 0 THEN DO POS_COMMA = POS(',',MESSAGE.SUFFIX,POS_MSGID) QUOTE = SUBSTR(MESSAGE.SUFFIX,POS_MSGID+6,1) IF POS_COMMA = 0 THEN DO SAY 'ERROR WITH MSGTABLE MESSAGES' "FREE F(MSGTABLE)" EXIT 16 END /* SEE IF MSGID HAS SINGLE QUOTE DELIMITERS */ IF QUOTE = "'" THEN DO POS_ENDQUOTE = POS("'",MESSAGE.SUFFIX,POS_MSGID+7) MSGID_LENGTH = (POS_ENDQUOTE - POS_MSGID) - 7 EMSGID = SUBSTR(MESSAGE.SUFFIX,POS_MSGID+7,MSGID_LENGTH) END ELSE DO MSGID_LENGTH = (POS_COMMA - POS_MSGID) - 6 EMSGID = SUBSTR(MESSAGE.SUFFIX,POS_MSGID+6,MSGID_LENGTH) END MSG = MSG + 1 EMSGID.MSG = STRIP(EMSGID,'B',"'") END END FIRST_MESSAGE = 'NO' /* SET THIS AS INITIAL FLAG */ /* WE WILL NOW DISPLAY THE PANEL AND ADD OUR NEW MESSAGES TO */ /* THE TABLE. WE WILL PICK AT THE LABEL LENGTH RECORD NUMBER */ NSFX = LAST_MESSAGE DO 100 /* GIVE THEM AN OPPORTUNITY TO DEFINE A 100 */ MSGID = ' ' FUNCTION = ' ' REPLY = ' ' COMMAND = ' ' SEARCH = ' ' S = ' ' E = ' ' M = ' ' "ISPEXEC DISPLAY PANEL(ALXPEXT)" IF RC ^= 0 THEN LEAVE MATCH = 'NO' /* SET THE FLAG BEFORE STARTING LOOP */ MSGID = STRIP(MSGID,'B',"'") /* REMOVE SINGLE QUOTES IF THERE*/ IF MSG ^= 0 THEN DO I = 1 TO MSG IF MSGID = EMSGID.I THEN MATCH = 'YES' END IF MATCH = 'YES' THEN SAY 'MSGID ' MSGID 'MATCHES AN EXISTING ENTRY IN THE TABLE' ELSE DO MSG = MSG + 1 /* INCREMENT THE COUNT SAVED */ EMSGID.MSG = MSGID /* SAVE THIS FOR FUTURE CHECKS */ MSGID = "'"MSGID"'" /* PUT BACK THE QUOTES */ FIRST_MESSAGE = 'YES' /* SET THIS TO YES */ IF FUNCTION = 'REPLY' THEN COMMAND = REPLY IF FUNCTION = 'EXEC' THEN COMMAND = 'S OPSAUTO' NSFX = NSFX + 1 MESSAGE.NSFX = ' MESSAGE MSGID='MSGID',FUNCTION='FUNCTION', ' MESSAGE.NSFX = LEFT(MESSAGE.NSFX,80) MESSAGE.NSFX = OVERLAY('+',MESSAGE.NSFX,72,1) NSFX = NSFX + 1 MESSAGE.NSFX = " COMMAND='"COMMAND"'" IF SEARCH ^= '' | SEARCH ^= ' ' THEN DO SEARCH = STRIP(SEARCH,'B',"'") LENGTH_PREVIOUS = LENGTH(MESSAGE.NSFX) MESSAGE.NSFX = OVERLAY(',',MESSAGE.NSFX,LENGTH_PREVIOUS+1,1) MESSAGE.NSFX = OVERLAY('+',MESSAGE.NSFX,72,1) NSFX = NSFX + 1 MESSAGE.NSFX = " SEARCH='"SEARCH"'," MESSAGE.NSFX = OVERLAY('+',MESSAGE.NSFX,72,1) IF S = 'Y' THEN /* CHECK FOR SELECT EXCLUDE OPTION*/ SELECT = 'SELECT' ELSE SELECT = 'EXCLUDE' NSFX = NSFX + 1 MESSAGE.NSFX = " SELECT="SELECT END IF M = 'Y' THEN /* CHECK FOR MULTI-LINE */ DO LENGTH_PREVIOUS = LENGTH(MESSAGE.NSFX) MESSAGE.NSFX = OVERLAY(',',MESSAGE.NSFX,LENGTH_PREVIOUS+1,1) MESSAGE.NSFX = OVERLAY('+',MESSAGE.NSFX,72,1) NSFX = NSFX + 1 MESSAGE.NSFX = " MULTLINE=Y" END END END /* VERIFY THAT AT LEAST 1 MESSAGE ADDED BEFORE SUBMITTING JOB */ /* TO REASSEMBLE AND LINK THE TABLE WITH IEAVMXIT */ IF FIRST_MESSAGE = 'YES' THEN DO NSFX = NSFX + 1 MESSAGE.NSFX = LENGTH_MESSAGE NSFX = NSFX + 1 MESSAGE.NSFX = ' END' "ALLOCATE F(MSGTABLE) DA('"SOURCE_DSN"') SHR" "EXECIO " NSFX " DISKW MSGTABLE (STEM MESSAGE. FINIS" "SUBMIT '"ASMHCL_TABLE_DSN"'" END EXIT ./ ADD NAME=ASMLTABL //IEAVMXIT JOB (ACCT),'WTO EXIT',CLASS=Q,MSGCLASS=Q,NOTIFY=&SYSUID, // COND=(4,LT) //ASM EXEC ASMACL,PARM.C=(RENT,NODECK,OBJECT), // PARM.L=(LIST,LET,NCAL,MAP,RENT,'AC(1)') //C.SYSLIB DD // DD DSN=SYS1.MODGEN,DISP=SHR //C.SYSPUNCH DD DUMMY,DCB=BLKSIZE=80 //C.SYSIN DD DSN=SYS2.SYSTEMS.SOURCE(MSGTABLE),DISP=SHR //L.SYSLMOD DD DSN=SYSL.OS390.LINKLIB,DISP=SHR //L.SYSIN DD * NAME MSGTABLE(R) INCLUDE SYSLMOD(MSGTABLE) INCLUDE SYSLMOD(IEAVMXIT) REPLACE MSGTABLE ORDER WTOEXIT ENTRY WTOEXIT NAME IEAVMXIT(R) /* //STEP3 EXEC PGM=ALEXCMDS,COND=(4,LT) //* WHERE CSVLLA03 HAS SYSL.OS390.LINKLIB //* THIS WILL REFRESH THE LINKLIST AND THEN REFRESH IEAVMXIT //CMDIN DD * F LLA,UPDATE=03 #WAIT=3 CONTROL M,UEXIT=N #WAIT=3 CONTROL M,UEXIT=Y // ./ ADD NAME=OPSAUTO //OPSAUTO PROC M1=,M2= //STEP1 EXEC PGM=IKJEFT01,TIME=1440,DYNAMNBR=80, // PARM=('&M1&M2') //* PLACE YOUR REXX EXECS, WITH A MEMBER NAME THAT MATCHES THE //* MESSAGE PASSED IN THE FOLLOWING SYSEXEC LIBRARY //SYSEXEC DD DSN=SYS2.SYSTEMS.REXXLIB,DISP=SHR //SYSPRINT DD SYSOUT=Q //SYSTSPRT DD SYSOUT=Q //READER DD SYSOUT=(A,INTRDR),DCB=(LRECL=80,BLKSIZE=80,RECFM=F) //SYSTSIN DD DUMMY,DCB=BLKSIZE=80 //* THIS DD WOULD PROVIDE SUPPORT FOR ISSUING A CALL TO //* ALEXCMDS //CMDIN DD DSN=&&CMDIN,DISP=(NEW,PASS),DCB=(LRECL=80, // BLKSIZE=800,RECFM=FB),SPACE=(TRK,(1,1)) ./ ENDUP OPSAUTO