Code: |
//INPUT DD DSN=YOUR PDS(MEM1), // DISP=SHR // DD DSN=YOUR PDS(MEM2), // DISP=SHR ..... // DD DSN=YOUR PDS(MEM'N'), // DISP=SHR |
Code: |
FILE-CONTROL. (Do not code this DD name in the JCL ) SELECT INPUT-FILE ASSIGN UT-S-DYNFILE FILE STATUS IS INPUT-FILE-STATUS. 01 RC PIC 9(9) BINARY. 01 ADDRESS-POINTER POINTER. 01 FILE-ENVIRONMENT-VARIABLE PIC X(xx) VALUE 'DYNFILE=DSN(xxx.xxx(xxx) SHR'. 01 FILE-ENVIRONMENT-OUT PIC X(150) VALUE SPACES. SET ADDRESS-POINTER TO ADDRESS OF FILE-ENVIRONMENT-VARIABLE. CALL "PUTENV" USING BY VALUE ADDRESS-POINTER RETURNING RC. IF RC NOT = ZERO THEN DISPLAY 'PUTENV FAILED' STOP RUN END-IF. OPEN INPUT INPUT-FILE. READ INPUT-FILE (maybe in a loop) CLOSE INPUT-FILE. STOP RUN. |
Code: |
IDENTIFICATION DIVISION. PROGRAM-ID. DYN DATE-COMPILED. ENVIRONMENT DIVISION. CONFIGURATION SECTION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT IN-PDS ASSIGN TO INFILE ORGANIZATION IS SEQUENTIAL. DATA DIVISION. FILE SECTION. FD IN-PDS RECORDING MODE IS F LABEL RECORDS ARE STANDARD BLOCK CONTAINS 0 RECORDS DATA RECORD IS IN-REC. 01 IN-REC PIC X(80). WORKING-STORAGE SECTION. 01 BPXWDYN PIC X(08) VALUE 'BPXWDYN'. 01 S-EOF-FILE PIC X(01) VALUE 'N'. 01 PDS-STRING. 05 PDS-LENGTH PIC S9(4) COMP VALUE 100. 05 PDS-TEXT PIC X(100) VALUE 'ALLOC DD(INFILE) DSN(''YOUR.PDS.FILE(MEMBER)'') SHR'. PROCEDURE DIVISION. CALL BPXWDYN USING PDS-STRING IF RETURN-CODE = ZERO DISPLAY 'ALLOCATION OK' ELSE DISPLAY 'ALLOC FAILED, RETURN-CODE WAS ' RETURN-CODE PERFORM INHOUSE-ABEND-ROUTINE END-IF OPEN INPUT IN-PDS PERFORM 1000-READ-INFILE UNTIL S-EOF-FILE = 'Y' CLOSE IN-PDS GOBACK. 1000-READ-INFILE. READ IN-PDS AT END MOVE 'Y' TO S-EOF-FILE NOT AT END DISPLAY IN-REC END-READ . |
Code: |
1. The call using PUTENV is static. You MUST compile the program with NODYNAM compiler option. If you don't then you will have abends like S0C1 2. The minimum level of COBOL required for the PUTENV to work is COBOL 2.2 and you would also need some Language environment PTF's. The older versions of COBOL do not have the ability to set a pointer to the Address Of a Working-Storage item. 3.The PUTENV by itself is only a stub to the routine in SCEERUN, not a complete module. 4. BPXWDYN on the other hand is a well written program which does not have any of the above listed problems. |
Quote: |
WORKING-STORAGE SECTION. 01 BPXWDYN PIC X(08) VALUE 'BPXWDYN'. 01 S-EOF-FILE PIC X(01) VALUE 'N'. 01 PDS-STRING. 05 PDS-LENGTH PIC S9(4) COMP VALUE 100. 05 PDS-TEXT PIC X(100) VALUE 'ALLOC DD(INFILE) DSN(''YOUR.PDS.FILE(MEMBER)'') SHR'. PROCEDURE DIVISION. CALL BPXWDYN USING PDS-STRING IF RETURN-CODE = ZERO DISPLAY 'ALLOCATION OK' ELSE DISPLAY 'ALLOC FAILED, RETURN-CODE WAS ' RETURN-CODE PERFORM INHOUSE-ABEND-ROUTINE END-IF OPEN INPUT IN-PDS PERFORM 1000-READ-INFILE UNTIL S-EOF-FILE = 'Y' CLOSE IN-PDS GOBACK. |
Quote: |
I am able to creat a file dynamically,but when i try to open it...gives a file status code of 96. Plz advice. |
Code: |
For QSAM file: An OPEN statement with the OUTPUT phrase was attempted, or an OPEN statement with the I-O or EXTEND phrase was attempted for an optional file but no DD statement was specified for the file and the CBLQDA(OFF) runtime option was specified. |
naveen_mehatak@hotmail.co wrote: |
yes bill
i close , free then reopen it. but when i open it as open output => file status 96 open extend => file status 35 |
Quote: |
The text field length was taken care of.so that was not the problem |
Quote: |
so because i want these files in the next step. my question was when CBLQDA=ON is set the file disp is set to (new ,delete,delete) so will i have the file after the program ends. |
Code: |
IDENTIFICATION DIVISION. PROGRAM-ID. PDSREAD. ****************************************************************** ** ** ** PROGRAM TITLE: PDSREAD ** ** ** ** PROGRAM PURPOSE: THIS COBOL PROGRAM IS A TEST PROGRAM THAT ** ** READS THE DIRECTORY MEMBERS OF A PDS DATASET AND THEN ** ** FOR EACH MEMBER DYNAMICALLY ALLOCATES A FILE TO BE OPENED ** ** AND READ TO DISPLAY THE PDS CONTENTS TO SYSOUT. ** ** ** ** INPUT FILES: PDS-DATASET SYS010 ** ** IN-PDS INFILE (DYNAMICALLY ASSIGNED) ** ** ** ** OUTPUT FILES: SYSOUT ** ** ** ** LINKAGE PARMS: NONE ** ** ** ** ** ****************************************************************** ** MODIFICATION LOG: ** ****************************************************************** ** ANALYST DATE CHANGE DESCRIPTION ** ** ------- ------ ----------------------------------------------** ** EBAKKE 071608 ORIGINAL CREATION ** ****************************************************************** ENVIRONMENT DIVISION. CONFIGURATION SECTION. SOURCE-COMPUTER. IBM-370. OBJECT-COMPUTER. IBM-370. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT PDS-DATASET ASSIGN TO UT-S-PDS. SELECT IN-PDS ASSIGN TO INFILE. DATA DIVISION. FILE SECTION. FD PDS-DATASET. 01 PDS-DIRECTORY. 05 USED-BYTES PIC S9(4) COMP. 05 REST-OF-RECORD PIC X(254). FD IN-PDS RECORDING MODE IS F BLOCK CONTAINS 0 RECORDS RECORD CONTAINS 80 CHARACTERS LABEL RECORDS ARE STANDARD. 01 IN-REC PIC X(080). WORKING-STORAGE SECTION. * CONSTANTS 77 BPXWDYN PIC X(08) VALUE 'BPXWDYN'. 77 CLEANUP PIC S9(9) COMP SYNC VALUE 1. * DIRECTORY ENTRY LAYOUT 01 DIRECTORY-ENTRY. 05 MEMBER-NAME PIC X(8). 05 FILLER PIC X(3). 05 WS-INDC PIC X. * PDS ALLOCATION STRING 01 PDS-STRING. 05 PDS-LENGTH PIC S9(4) COMP VALUE 100. 05 PDS-TEXT PIC X(100). * WORK FIELD FOR PARSING THRU DIRECTORY RECORDS 01 WG-WORK-FIELD. 05 WG-WORK-FIELD-NUMERIC PIC S9(4) COMP. * GENERAL WORKING STORAGE VARIABLES 01 WG-GENERAL-WORKAREA. 05 WG-IX-1 PIC S9(4) COMP. 05 WG-TRASH PIC S9(4) COMP. 05 WG-HALF-WORDS PIC S9(4) COMP. 05 WG-ABEND-CODE PIC S9(9) COMP. * 88-LEVEL SWITCHES 01 WS-SWITCHES. 05 END-OF-DIRECTORY-SW PIC X VALUE 'N'. 88 EOF-DIRECTORY VALUE 'Y'. 05 END-OF-MEMBER-SW PIC X VALUE 'N'. 88 EOF-MEMBER VALUE 'Y'. LINKAGE SECTION. 01 LINK-PARM. 05 PARM-LENGTH PIC S9(4) COMP. 05 PARM-TEXT PIC X(44). PROCEDURE DIVISION USING LINK-PARM. DISPLAY ' '. DISPLAY 'PROCESSING PDS FILE ' PARM-TEXT. PERFORM 0100-INITIALIZATION. PERFORM 0200-PROCESS-LOOP UNTIL EOF-DIRECTORY. PERFORM 0300-FINALIZATION. STOP RUN. ****************************************************************** * 0100-INITIALIZATION * ****************************************************************** 0100-INITIALIZATION. * CHECK INPUT PARM FOR DATA THAT IS UP TO MAX DSN SIZE OF 44 BYTES IF PARM-LENGTH < 1 OR PARM-LENGTH > 44 DISPLAY 'INVALID INPUT PARM LENGTH' PARM-LENGTH MOVE 1 TO WG-ABEND-CODE PERFORM 9999-ABEND END-IF. * OPEN INPUT PDS DATASET OPEN INPUT PDS-DATASET. * DO PRIMING READ OF PDS DATASET PERFORM 8000-READ-DIRECTORY. ****************************************************************** * 0200-PROCESS-LOOP * ****************************************************************** 0200-PROCESS-LOOP. * PROCESS EACH DIRECTORY ENTRY LISTING THE MEMBERS NAME AND * CONTENTS TO SYSOUT MOVE 1 TO WG-IX-1. PERFORM UNTIL USED-BYTES - WG-IX-1 < 11 OR REST-OF-RECORD (WG-IX-1:1) = HIGH-VALUES MOVE REST-OF-RECORD (WG-IX-1:12) TO DIRECTORY-ENTRY PERFORM 1000-PROCESS-MEMBER INITIALIZE WG-WORK-FIELD MOVE WS-INDC TO WG-WORK-FIELD (2:1) DIVIDE WG-WORK-FIELD-NUMERIC BY 32 GIVING WG-TRASH REMAINDER WG-HALF-WORDS COMPUTE WG-IX-1 = WG-IX-1 + 12 + WG-HALF-WORDS * 2 END-PERFORM. * READ NEXT DIRECTORY RECORD IF NOT DONE YET IF REST-OF-RECORD (WG-IX-1:1) = HIGH-VALUES SET EOF-DIRECTORY TO TRUE ELSE PERFORM 8000-READ-DIRECTORY END-IF. ****************************************************************** * 0300-FINALIZATION * ****************************************************************** 0300-FINALIZATION. * CLOSE PDS DATASET USED FOR ACCESSING DIRECTORY RECORDS. CLOSE PDS-DATASET. ****************************************************************** * 1000-PROCESS-MEMBER * ****************************************************************** 1000-PROCESS-MEMBER. * DISPLAY MEMBER NAME TO SYSOUT DISPLAY '** PROCESSING MEMBER ''' MEMBER-NAME ''' **'. * INITIALIZE STUFF FORE EACH DIRECTORY MEMBER MOVE SPACES TO PDS-TEXT, END-OF-MEMBER-SW. * STRING TOGETHER THE PDS ALLOCATION STRING WITH MEMBER NAME STRING 'ALLOC DD(INFILE) DSN(''' DELIMITED BY SIZE PARM-TEXT (1:PARM-LENGTH) DELIMITED BY SIZE '(' DELIMITED BY SIZE MEMBER-NAME DELIMITED BY ' ' ')'') SHR REUSE' DELIMITED BY SIZE INTO PDS-TEXT. * DYNAMICALLY ALLOCATE PDS DATASET WITH MEMBER AS IN-PDS FILE CALL BPXWDYN USING PDS-STRING. * CHECK RETURN CODE AND ABEND IF CAN'T ALLOCATE DATASET IF RETURN-CODE = 0 CONTINUE ELSE DISPLAY 'ALLOC FAILED, RETURN-CODE WAS ' RETURN-CODE MOVE 2 TO WG-ABEND-CODE PERFORM 9999-ABEND END-IF. * OPEN IN-PDS FILE TO START READING MEMBER RECORDS OPEN INPUT IN-PDS. * DISPLAY EACH MEMBER RECORD UNTIL THE END IS REACHED DISPLAY ' MEMBER RECORDS ARE: '. PERFORM 8100-READ-MEMBER UNTIL EOF-MEMBER. DISPLAY ' '. * CLOSE DYNAMICALLY ALLOCATED IN-PDS FILE CLOSE IN-PDS. ****************************************************************** * 8000-READ-DIRECTORY * ****************************************************************** 8000-READ-DIRECTORY. READ PDS-DATASET AT END SET EOF-DIRECTORY TO TRUE. ****************************************************************** * 8100-READ-MEMBER. * ****************************************************************** 8100-READ-MEMBER. READ IN-PDS AT END SET EOF-MEMBER TO TRUE NOT AT END DISPLAY IN-REC. ****************************************************************** * 9999-ABEND. * ****************************************************************** 9999-ABEND. CALL 'CEE3ABD' USING WG-ABEND-CODE, CLEANUP. |
Code: |
//JS001 EXEC PGM=IKJEFT1B,REGION=0M //STEPLIB DD DSN={your.loadlib},DISP=SHR //PDS DD DSN={your.pds.dataset},DISP=SHR,RECFM=U,LRECL=256 //SYSOUT DD SYSOUT=* //SYSUDUMP DD SYSOUT=* //SYSPRINT DD SYSOUT=* //SYSTSPRT DD SYSOUT=* //SYSTSIN DD * DSN SYSTEM(DSN) RUN PROGRAM(PDSREAD) PARM('{your pds dataset}') END //* END OF JCL |
Sreejith wrote: |
Hi,
Did anyone successfully managed to use BPXWDYN to read PDS member ? I use the same code given above by Kolusu. It work for a dataset, but if I use a PDS it abends with 4072 and the return code from BPXWDYN is 0002M. The dataset I am using is PDS not a PDSE. Any idea why I am getting this error. |
Code: |
01 PDS-STRING. 05 PDS-LENGTH PIC S9(4) COMP VALUE 100. 05 PDS-TEXT PIC X(100) VALUE 'ALLOC DD(INFILE) DSN(''YOUR.PDS.FILE(MEMBER)'') SHR'. |
Code: |
ALLOC DD(CCCTRIGF) DSN([i]'dataset.name.here[/i].TRIGGER') NEW CATALOG RECFM(F) LRECL(80) SPACE(1,1) TRACKS DSORG(PS) |
Code: |
CALL 'BPXWDYN' USING WS-ALLOCATION-STRING. |
jim haire wrote: |
Never mind. I figured out what it was.
2. The length of the string being passed to BPXWDYN can be longer than 100. I'm not sure what the maximum length it can be. (Mine is 132). |
output generated using printer-friendly topic mod. All times are GMT - 5 Hours