View previous topic :: View next topic
Author
Message
ofer71 Global Moderator Joined: 27 Dec 2005Posts: 2358 Location: Israel
Hi all -
We all know the standard way of submitting jobs from within NATURAL (RJE/NATRJE).
However, there are other ways to do this, and here is one of them.
The pseudo code of the following program is as follow:
- Put your JCL cards in an array.
- Allocate work file to SYSOUT, with the special program INTRDR. The allocation of work file to SYSOUT is done by NATURAL user exit 2021 (USR2021), which resides in your SYSEXT library.
- Write the cards (using the array) to that work file.
- Free the SYSOUT.
Here is the code for the main program:
Code:
DEFINE DATA LOCAL
1 #INLINE (A80/11)
1 #I (I2)
1 #ALLOC-PARMS
2 #ALLOC-NUMBER (N1)
2 #ALLOC-ACTION (A8)
2 #ALLOC-RC (B2)
END-DEFINE
*
#INLINE(1) := '//OFERFFT JOB (),@RXX,MSGCLASS=T,CLASS=A,NOTIFY=&SYSUID'
#INLINE(2) := '//* '
#INLINE(3) := '//REXXEX EXEC PGM=IKJEFT01 '
#INLINE(4) := '//SYSPROC DD DISP=SHR,DSN=OFERF.A.REXX '
#INLINE(5) := '//SYSUDUMP DD SYSOUT=* '
#INLINE(6) := '//SYSPRINT DD SYSOUT=* '
#INLINE(7) := '//SYSTSPRT DD SYSOUT=* '
#INLINE(8) := '//SYSOUT DD SYSOUT=* '
#INLINE(9) := '//SYSTSIN DD * '
#INLINE(10) := ' %TEMP '
#INLINE(11) := '/* '
*
#ALLOC-NUMBER := 1
#ALLOC-ACTION := 'ALLOC '
CALLNAT 'SYSOUT' #ALLOC-PARMS
*
FOR #I = 1 TO 11
WRITE WORK FILE 1 #INLINE(#I)
END-FOR
*
#ALLOC-NUMBER := 1
#ALLOC-ACTION := 'UNALLOC '
CALLNAT 'SYSOUT' #ALLOC-PARMS
*
END
And this is the code of the SYSOUT subprogram (which is just an adaptation of USR2021P example in library SYSEXT):
Code:
DEFINE DATA
PARAMETER
1 #ALLOC-PARMS
2 #ALLOC-NUMBER (N1)
2 #ALLOC-ACTION (A8)
2 #ALLOC-RC (B2)
LOCAL
01 ALC /* DYNAMIC ALLOCATION (MVS ONLY)
02 ALC-FUNCTION (A8) /* FUNCTION (ALLOC/UNALLOC)
02 ALC-ERROR-CODE (B2) /* SVC 99 ERROR CODE OR NUMBER
02 ALC-INFO-CODE (B2) /* SVC 99 INFORMATION CODE
02 ALC-ERROR-TEXT (A60) /* ERROR TEXT FROM LAST ERROR
02 ALC-DDNAME (A8) /* LOGICAL DATASET NAME
02 ALC-DSNAME (A44) /* PHYSICAL DATASET NAME
02 ALC-MEMBER (A8) /* PDS MEMBER NAME
02 ALC-DUMMY (A1) /* Y = DUMMY DATASET
02 ALC-TERM (A1) /* Y = TSO TERMINAL DATASET
02 ALC-DISP1 (A4) /* DISPOSITION (NEW/OLD/MOD/SHR)
02 ALC-DISP2 (A8) /* (CATLG/UNCATLG/KEEP/DELETE)
02 ALC-DISP3 (A8) /* (CATLG/UNCATLG/KEEP/DELETE)
02 ALC-UNALLOC-CLOSE (A1) /* Y = UNALLOCATE AT CLOSE
02 ALC-SPACE-TYPE (A8) /* CYLINDER/TRACKS/BLOCKS
02 ALC-SPACE-PRIMARY (N8) /* PRIMARY SPACE AMOUNT
02 ALC-SPACE-SECONDARY (N8) /* SECONDARY SPACE AMOUNT
02 ALC-SPACE-DIRECTORY (N8) /* NUMBER OF DIRECTORY BLOCKS
02 ALC-SPACE-RELEASE (A1) /* Y = RELEASE UNUSED SPACE
02 ALC-SPACE-FORMAT (A6) /* (CONTIG/ALX/MXIG)
02 ALC-SPACE-ROUND (A1) /* Y = ROUND UP TO NEXT CYL.
02 ALC-VOLUME-SERIAL (A6) /* VOLUME NAME
02 ALC-UNIT (A8) /* TYPE OF UNIT
02 ALC-UNIT-DEFER (A1) /* Y = DEFER MOUNTING
02 ALC-LABEL-SEQUENCE (N4) /* SEQUENCE NUMBER ON TAPE
02 ALC-LABEL-TYPE (A3) /* (SL/NL/BLP/AL/AUL/SUL/NSL/LTM
02 ALC-LABEL-EXPDT (N7) /* EXPIRATION DATE (YYYYDDD)
02 ALC-LABEL-RETPD (N4) /* RETENTION PERIOD IN DAYS
02 ALC-SYSOUT-CLASS (A1) /* JES OUTPUT CLASS
02 ALC-SYSOUT-PROGRAM (A8) /* JES OUTPUT WRITER NAME
02 ALC-SYSOUT-FORM (A4) /* JES OUTPUT FORM NAME
02 ALC-SYSOUT-LIMIT (N8) /* JES OUTPUT LIMIT
02 ALC-SYSOUT-COPIES (N3) /* JES OUTPUT COPIES
02 ALC-SYSOUT-HOLD (A1) /* Y = JES OUTPUT HOLD QUEUE
02 ALC-SYSOUT-SEGMENT (N5) /* JES OUTPUT SEGMENTATION
02 ALC-SYSOUT-NODE (A8) /* JES OUTPUT REMOTE NODE
02 ALC-SYSOUT-USERID (A8) /* JES OUTPUT REMOTE NODE USERID
02 ALC-SYSOUT-OUTPUT (A8) /* REFERENCED OUTPUT STATEMENT
02 ALC-DCB-DDNAME (A8) /* DCB RETRIEVED FROM DDNAME
02 ALC-DCB-DSORG (A3) /* DATASET ORG. (PS/PO/DA)
02 ALC-DCB-RECFM (A4) /* RECORD FORMAT
02 ALC-DCB-BLKSZ (N5) /* BLOCK SIZE
02 ALC-DCB-LRECL (N5) /* RECORD LENGTH
02 ALC-DCB-BUFNO (N2) /* NUMBER OF I/O BUFFERS
02 ALC-DCB-DENSITY (N1) /* TAPE DENSITY (1/2/3/4)
02 ALC-SMS-STORCLAS (A8) /* SMS STORAGE CLASS
02 ALC-SMS-MGMTCLAS (A8) /* SMS MANAGEMENT CLASS
02 ALC-SMS-DATACLAS (A8) /* SMS DATA CLASS
02 ALC-PATH (A253) /* PATH NAME
02 ALC-PATH-DISP1 (A6) /* PATH DISP. 1 (DELETE/KEEP)
02 ALC-PATH-DISP2 (A6) /* PATH DISP. 2 (DELETE/KEEP)
02 ALC-PATH-OPTS (B4) /* PATH OPTIONS
02 ALC-PATH-MODE (B4) /* PATH MODE
02 ALC-PATH-FILEDAT (A6) /* FILE TYPE (BINARY/TEXT)
01 WORKA1 (A1)
01 USR2021N
02 VERSION (I01) INIT <0>
01 REDEFINE USR2021N
02 EXTENDED-PARMS
03 EXTENDED-DATA (A01/1:1)
END-DEFINE
SET KEY ALL
*
ALC-FUNCTION := #ALLOC-ACTION
COMPRESS 'CMWKF0' #ALLOC-NUMBER INTO ALC-DDNAME LEAVING NO
ALC-SYSOUT-CLASS := '*'
ALC-SYSOUT-PROGRAM := 'INTRDR '
*
CALLNAT 'USR2021N' ALC USR2021N.EXTENDED-PARMS
*
IF ALC-ERROR-TEXT EQ ' ' THEN
#ALLOC-RC := 0
ELSE
#ALLOC-RC := ALC-ERROR-CODE
END-IF
*
END
Enjoy
O.
Back to top
eniyanp New User Joined: 05 Jul 2006Posts: 5
HI,
I am facing the below problem.
I have a map which has three fields (year, month and dealer numbers).
When ever the user enter a year and month, dealers numbers, then if he /she press ENTER, then one job will be submitted to create a report for that dealers. The report generating program will get a input from maps. How i will pass this data from the natural online maps to JCL. I tried the JCL you given, but I am getting some problem. Even i am very new to this natural area. Please suggest any efficient method to achieve this task.
Back to top
eniyanp New User Joined: 05 Jul 2006Posts: 5
THis is the program i was written for my previous request
0010 DEFINE DATA
0020 LOCAL
0030 1 #OFFSET (N2) INIT<0>
0040 1 #INLINE (A80/28)
0050 * 1 #OUTINE (A5/1:26)
0060 1 #TEMP-DEAL-MAP
0070 2 #TEMP-DEAL-MAP1 (A5)
0080 2 #TEMP-DEAL-MAP2 (A5)
0090 2 #TEMP-DEAL-MAP3 (A5)
0100 2 #TEMP-DEAL-MAP4 (A5)
0110 2 #TEMP-DEAL-MAP5 (A5)
0120 2 #TEMP-DEAL-MAP6 (A5)
0130 1 #I (I2)
0140 1 #J (P2)
0150 1 #ALLOC-PARMS
0160 2 #ALLOC-NUMBER (N1)
0170 2 #ALLOC-ACTION (A8)
0180 2 #ALLOC-RC (B2)
0190 1 #CHNLUSID
0200 2 #LOCAL(A5)
0210 2 #DEALER-NUMBER1 (A5/1:13)
0220 2 #DEALER-NUMBER2 (A5/1:13)
0230 2 #DEALER-TOTAL-ALL (A158)
0240 2 #CALENDAR-YEAR (A4)
0250 2 REDEFINE #CALENDAR-YEAR
0260 3 #CALENDAR-CC (A2)
0270 3 #CALENDAR-YY(A2)
0280 2 #CALENDAR-MM (A2)
0290 2 #DATE (A8)
0300 2 REDEFINE #DATE
0310 3 #DATE-DD (A2)
0320 3 #FILLER1 (A1)
0330 3 #DATE-MM (A2)
0340 3 #FILLER2 (A1)
0350 3 #DATE-YY (A2)
0360 1 #INDEX1 (N2)
0370 1 #TOTAL (N2)
0380 1 #EX-IND (N2)
0390 * 1 #OUTPUT-WORK
0400 * 2 #YEAR (A4)
0410 * 2 #MONTH (A2)
0420 * 2 #DEALER-NUMBR (A5)
0430 *
0440 1 DEALER-FILE-VIEW VIEW OF DEALER-FILE
0450 02 DEALER-NUMBER (A5)
0460 1 #ARRAY (A5/1:26)
0470 1 #INDEX (P2)
0480 END-DEFINE
0490 MOVE *DATE TO #DATE
0500 *
0510 RESET #DEALER-NUMBER1(*) #DEALER-NUMBER2(*) #INDEX
0520 SET KEY ALL
0530 INPUT USING MAP 'MAP1'
0540 *
0550 DECIDE ON FIRST VALUE *PF-KEY
0560 VALUE 'PF3'
0570 TERMINATE
0580 VALUE 'ENTR'
0590 PERFORM DATE-VALIDATION
0600 PERFORM SUBMIT-JOB-BATCH
0610 FETCH 'JCL1'
0620 NONE
0630 IGNORE
0640 *
0650 END-DECIDE
0660 *
0670 ********************************************************************
0680 DEFINE SUBROUTINE PROCESS
0690 ********************************************************************
0700 RESET #ARRAY(*) #INDEX #EX-IND
0710 FOR1.
0720 FOR #INDEX1 1 13
0730 IF #DEALER-NUMBER1(#INDEX1) EQ ' '
0740 ESCAPE TOP
0750 END-IF /*(0730)
0760 EXAMINE #ARRAY(*) FOR #DEALER-NUMBER1(#INDEX1) GIVING INDEX
0770 #EX-IND
0780 IF #EX-IND NE 0
0790 REINPUT FULL 'DUPLICATE' MARK *#DEALER-NUMBER1(#INDEX1) ALARM
0800 END-IF /*(0780)
0810 #INDEX := #INDEX + 1
0820 #ARRAY(#INDEX) := #DEALER-NUMBER1(#INDEX1)
0830 END-FOR /*(FOR1.)
0840 *
0850 FOR2.
0860 FOR #INDEX1 1 13
0870 IF #DEALER-NUMBER2(#INDEX1) EQ ' '
0880 ESCAPE TOP
0890 END-IF /*(0870)
0900 EXAMINE #ARRAY(*) FOR #DEALER-NUMBER2(#INDEX1) GIVING INDEX
0910 #EX-IND
0920 IF #EX-IND NE 0
0930 REINPUT FULL 'DUPLICATE' MARK *#DEALER-NUMBER2(#INDEX1) ALARM
0940 ESCAPE TOP
0950 END-IF /*(0780)
0960 #INDEX := #INDEX + 1
0970 #ARRAY(#INDEX) := #DEALER-NUMBER2(#INDEX1)
0980 END-FOR /*(FOR2.)
0990 *
1000 FOR3.
1010 FOR #INDEX1 1 #INDEX
1020 FD1.
1030 FIND DEALER-FILE-VIEW WITH DEALER-NUMBER EQ #ARRAY(#INDEX1)
1040 END-FIND
1050 *
1060 IF *NUMBER(FD1.) EQ 0
1070 EXAMINE #DEALER-NUMBER1(*) FOR #ARRAY(#INDEX1) GIVING INDEX #EX-IND
1080 IF #EX-IND NE 0
1090 REINPUT FULL 'INVALID DEALER NUMBER' MARK *#DEALER-NUMBER1(#EX-IND)
1100 ALARM
1110 END-IF /*(1080)
1120 EXAMINE #DEALER-NUMBER2(*) FOR #ARRAY(#INDEX1) GIVING INDEX #EX-IND
1130 IF #EX-IND NE 0
1140 REINPUT FULL 'INVALID DEALER NUMBER' MARK *#DEALER-NUMBER2(#EX-IND)
1150 ALARM
1160 END-IF /*(1130)
1170 END-IF /*(1060)
1180 END-FOR
1190 *
1200 * WRITE '=' #INDEX
1210 * WRITE '=' #ARRAY(*)
1220 * MOVE #CALENDAR-CC TO WORK01
1230 * MOVE #CALENDAR-YY TO WORK01
1240 * MOVE #CALENDAR-MM TO WORK01
1250 * MOVE #ARRAY-CC TO WORK01
1260 END-SUBROUTINE
1270 ***********************************************************************
1280 * END
1290 ***********************************************************************
1300 DEFINE SUBROUTINE DATE-VALIDATION
1310 ***********************************************************************
1320 IF #CALENDAR-YY < #DATE-YY
1330 PERFORM PROCESS
1340 ELSE
1350 IF #CALENDAR-YY> #DATE-YY
1360 REINPUT FULL 'ENTER A VALID YEAR'
1370 ELSE
1380 IF #CALENDAR-MM < #DATE-MM
1390 PERFORM PROCESS
1400 ELSE
1410 REINPUT FULL 'ENTER A VALID MONTH'
1420 END-IF /*(1320)
1430 END-IF /*(1350)
1440 END-IF /*(1380)
1450 END-SUBROUTINE
1460 *******************************************************************
1470 DEFINE SUBROUTINE SUBMIT-JOB-BATCH
1480 *******************************************************************
1490 * #OUTPUT-WORK.#YEAR := #CALENDAR-YEAR
1500 * #OUTPUT-WORK.#MONTH := #CALENDAR-MM
1510 * FOR #INDEX 1 25
1520 * MOVE #ARRAY(#INDEX) TO #OUTPUT-WORK.#DEALER-NUMBR
1530 * WRITE WORK FILE 4 #OUTPUT-WORK
1540 * END-FOR
1550 * RESET #K
1560 RESET #J
1570 RESET #ALLOC-PARMS
1580 MOVE #ARRAY(1) TO #TEMP-DEAL-MAP5
1590 MOVE #ARRAY(2) TO #TEMP-DEAL-MAP6
1600 #INLINE(1) :="//KCV369UX JOB (C,I),P,CLASS=A,MSGCLASS=X,NOTIFY=KCV369U"
1610 #INLINE(2) :="//PROCLIB JCLLIB ORDER=KCV369U.FINA "
1620 #INLINE(3) :="//SETEM INCLUDE MEMBER=DEVLE "
1630 #INLINE(4) :="// SET DBID=E "
1640 #INLINE(5) :="//INCJLIB INCLUDE MEMBER=JLIBAPP "
1650 #INLINE(6) :="// INCLUDE MEMBER=JLIBAGF "
1660 #INLINE(7) :="//STEP01 EXEC N2TINF&DBID,FLIST='OPRB=(.ALL)' "
1670 #INLINE(8) :="//IBMTBLS DD DSN=KCV369U.IPV.IBM9000.BUS.TAB,DISP=SHR "
1680 #INLINE(9) :="//CMPRINT DD SYSOUT=* "
1690 #INLINE(10) :="//CMWKF01 DD DSN=KCV369U.IBM.SORT.STAT.FILE,DISP=SHR "
1700 #INLINE(11) :="//CMWKF02 DD DSN=KCV369U.IBM.STATIC.TEST1, "
1710 #INLINE(12) :="// DISP=(NEW,CATLG,DELETE), "
1720 #INLINE(13) :="// DCB=(LRECL=200,BLKSIZE=0,RECFM=FB), "
1730 #INLINE(14) :="// SPACE=(CYL,(100,20),RLSE) "
1740 #INLINE(15) :="//CMWKF03 DD DSN=KCV369U.IBMN964.STATIC.TEST2, "
1750 #INLINE(16) :="// DISP=(NEW,CATLG,DELETE), "
1760 #INLINE(17) :="// DCB=(LRECL=80,BLKSIZE=0,RECFM=FB), "
1770 #INLINE(18) :="// SPACE=(TRK,(10,10),RLSE) "
1780 #INLINE(19) :="//CMWKF04 DD * "
1790 #INLINE(20) := #TEMP-DEAL-MAP5
1800 #INLINE(21) := #TEMP-DEAL-MAP6
1810 #INLINE(22) :="//CMWKF05 DD DSN=KCV369U.IBMN964.STATIC.FILE5, "
1820 #INLINE(23) :="// DISP=(NEW,CATLG,DELETE), "
1830 #INLINE(24) :="// DCB=(LRECL=200,BLKSIZE=0,RECFM=FB), "
1840 #INLINE(25) :="// SPACE=(CYL,(100,20),RLSE) "
1850 #INLINE(26) :="//SYSIN DD DSN=KCV369U.MAP.NMC.PARMLIB(IBMN6601), "
1860 #INLINE(27) :="// DISP=SHR "
1870 PRINT #INLINE(01)
1880 PRINT #INLINE(02)
1890 PRINT #INLINE(03)
1900 PRINT #INLINE(04)
1910 PRINT #INLINE(05)
1920 PRINT #INLINE(06)
1930 PRINT #INLINE(07)
1940 PRINT #INLINE(08)
1950 PRINT #INLINE(09)
1960 PRINT #INLINE(10)
1970 PRINT #INLINE(11)
1980 PRINT #INLINE(12)
1990 PRINT #INLINE(13)
2000 PRINT #INLINE(14)
2010 PRINT #INLINE(15)
2020 PRINT #INLINE(16)
2030 PRINT #INLINE(17)
2040 PRINT #INLINE(18)
2050 PRINT #INLINE(19)
2060 PRINT #INLINE(20)
2070 PRINT #INLINE(21)
2080 PRINT #INLINE(22)
2090 PRINT #INLINE(23)
2100 PRINT #INLINE(24)
2110 PRINT #INLINE(25)
2120 PRINT #INLINE(26)
2130 PRINT #INLINE(27)
2140 PRINT #INLINE(28)
2150 * PRINT #INLINE(29)
2160 * PRINT #INLINE(30)
2170 * PRINT #INLINE(31)
2180 *
2190 #ALLOC-NUMBER := 1
2200 #ALLOC-ACTION := 'ALLOC '
2130 PRINT #INLINE(27)
2140 PRINT #INLINE(28)
2150 * PRINT #INLINE(29)
2160 * PRINT #INLINE(30)
2170 * PRINT #INLINE(31)
2180 *
2190 #ALLOC-NUMBER := 1
2200 #ALLOC-ACTION := 'ALLOC '
2210 CALLNAT 'JCL3' #ALLOC-PARMS
2220 *
2230 FOR #J = 1 TO 28
2240 WRITE WORK FILE 1 #INLINE(#J)
2250 END-FOR
2260 *
2270 #ALLOC-NUMBER := 1
2280 #ALLOC-ACTION := 'UNALLOC '
2290 CALLNAT 'JCL3' #ALLOC-PARMS
2300 END-SUBROUTINE
2310 ***********************************************************************
2320 END
Back to top
ofer71 Global Moderator Joined: 27 Dec 2005Posts: 2358 Location: Israel
Can you please specify what do you mean by "input to jcl"? Do you want any data item to be put in "PARM="?
Also, when submitting your code in this forum, please use the [code] tags.
O.
Back to top
eniyanp New User Joined: 05 Jul 2006Posts: 5
HI,
I am passing the dealers number to the jcl through //Sysin card.
The dealer numbers are enterted by the user's in the online screen.
Back to top
ofer71 Global Moderator Joined: 27 Dec 2005Posts: 2358 Location: Israel
I understood the first part. You want the dealers numbers to be "passed" to the SYSIN. Currently, your SYSIN is: #INLINE(26) :="//SYSIN DD DSN=KCV369U.MAP.NMC.PARMLIB(IBMN6601), " , so I really (again) don't understand what do you mean by "passing to the jcl"...
O.
Back to top
eniyanp New User Joined: 05 Jul 2006Posts: 5
HI, I am not going to pass any value in #INLINE(26) :="//SYSIN DD DSN=KCV369U.MAP.NMC.PARMLIB(IBMN6601), ", This is the member where the natural program name and the natural library name are mentioned.
I am going to pass the varibale through CMWKF04, see below.
1780 #INLINE(19) :="//CMWKF04 DD * "
1790 #INLINE(20) := #TEMP-DEAL-MAP5
1800 #INLINE(21) := #TEMP-DEAL-MAP6
In this #TEMP-DEAL-MAP1 ... #TEMP-DEAL-MAP5 up to 26 ,are the dealer numbers. I am getting this values from the map and giving a input to the jcl.
Even i passes this varable successfully, even job also submitted properly, but after that it come in to the program and says a error message of
"NAT1520 WORK file 2 not available."
[/img]
Back to top
ofer71 Global Moderator Joined: 27 Dec 2005Posts: 2358 Location: Israel
Error 1520 means that you have a problem with the dataset. It has nothing to do with your program. In your case, check the dataset allocated to CMWKF02.
O.
Back to top
Please enable JavaScript!