View previous topic :: View next topic |
Author |
Message |
kolusu Site Admin
Joined: 26 Nov 2002 Posts: 12376 Topics: 75 Location: San Jose
|
Posted: Sun Dec 01, 2002 10:50 pm Post subject: File I/O Mode |
|
|
Q.I want a sequential File to be opened in the i/o mode and if a condition is matched I will be updating the said sequential file.Can I have a sample code of how to do this task in cobol??
Answer:
Code: |
IDENTIFICATION DIVISION.
PROGRAM-ID. INOUT.
AUTHOR. KOLUSU.
DATE-WRITTEN. 12/01/2002
DATE-COMPILED.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT INPUT-PARM-FILE
ASSIGN TO INPARM
FILE STATUS IS W-PARM-FILE-STATUS
ORGANIZATION IS SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD INPUT-PARM-FILE
RECORDING MODE F
LABEL RECORDS ARE STANDARD
BLOCK CONTAINS 0 RECORDS
DATA RECORD IS INPUT-PARM-REC.
01 INPUT-PARM-REC.
05 I-KEY PIC X(5).
05 FILLER PIC X(09).
05 I-VAR PIC X(3).
05 FILLER PIC X(63).
WORKING-STORAGE SECTION.
01 S-INPUT-PARM-EOF PIC X(01) VALUE 'N'.
01 W-REC.
05 W-KEY PIC X(5).
05 FILLER PIC X(09).
05 W-VAR PIC X(3).
05 FILLER PIC X(63).
01 W-PARM-FILE-STATUS PIC X(02) VALUE '00'.
01 W-COUNT PIC 9(09) VALUE 0.
******************************************************************
PROCEDURE DIVISION.
******************************************************************
0000-MAINLINE.
OPEN I-O INPUT-PARM-FILE
PERFORM 2000-READ-PARM-FILE
PERFORM UNTIL S-INPUT-PARM-EOF = 'Y'
IF W-KEY = ('23456' OR '67890')
MOVE 'ABC' TO W-VAR
REWRITE INPUT-PARM-REC FROM W-REC
ADD +1 TO W-COUNT
END-IF
PERFORM 2000-READ-PARM-FILE
END-PERFORM
CLOSE INPUT-PARM-FILE
DISPLAY 'NO: OF REWRITES:' W-COUNT
GOBACK
.
2000-READ-PARM-FILE.
******************************************************************
* THIS PARAGRAPH IS PERFORMED TO READ THE INPUT FILE. *
******************************************************************
MOVE SPACES TO W-REC
READ INPUT-PARM-FILE INTO W-REC
AT END
MOVE 'Y' TO S-INPUT-PARM-EOF
END-READ
.
|
|
|
Back to top |
|
|
GaneshB Beginner
Joined: 03 Dec 2002 Posts: 17 Topics: 5 Location: Columbus, GA
|
Posted: Sat Dec 07, 2002 3:26 pm Post subject: |
|
|
Kolusu,
Your post is very useful. Thanks for the information. Is it possible to update a record in an ESDS file? _________________ Regards,
Ganesh.B |
|
Back to top |
|
|
kolusu Site Admin
Joined: 26 Nov 2002 Posts: 12376 Topics: 75 Location: San Jose
|
Posted: Sat Dec 07, 2002 5:45 pm Post subject: |
|
|
GaneshB,
An ESDS is comparable to a sequential non-VSAM data set in the sense that records are sequenced by the order of their entry in the data set, rather than by key field in the logical record. This could be fixed or variable length records.All new records are placed at the end of the data set. Existing records can never be deleted. If the application wants to delete a record, it must flag that record as inactive. As far as VSAM is concerned, the record is not deleted. It is the responsibility of the application program to identify that record as invalid.
Records can be updated,but without length change. To change the length of a record, you must either store it at the end of the data set as a new record, or override an existing record of the same length that you have flagged as inactive.
A record can be accessed sequentially or directly by its RBA:
- Sequential processing: VSAM automatically retrieves records in stored sequence. Sequential processing can be started from the beginning or somewhere in the middle of a data set. If processing is to begin in the middle of a data set, positioning is necessary before sequential processing can be performed.
- Direct processing: When a record is loaded or added, VSAM indicates its RBA. To retrieve records directly, you must supply the RBA for the record as a search argument. Although an ESDS does not contain an index component, you can build an alternate index to keep track of these RBAs.Skip sequential processing is not allowed for an ESDS.
Hope this helps...
cheers
kolusu |
|
Back to top |
|
|
GaneshB Beginner
Joined: 03 Dec 2002 Posts: 17 Topics: 5 Location: Columbus, GA
|
Posted: Sun Dec 08, 2002 8:59 am Post subject: |
|
|
Kolusu,
Thanks for the information & quick response. _________________ Regards,
Ganesh.B |
|
Back to top |
|
|
Bechu Beginner
Joined: 02 Dec 2002 Posts: 2 Topics: 0 Location: Kottayam, Kerala, India
|
Posted: Mon Dec 09, 2002 5:29 am Post subject: |
|
|
Kolusu,
Excellent piece of information. However I beg to differ on one small point:
Quote: | Skip sequential processing is not allowed for an ESDS. |
I too had the same impression till the middle of last week. I came across a program(online) that plays with an ESDS, using RBA. I distinctly remember that the program did skip sequential processing too.
Perhaps we can say "Skip sequential processing is not allowed for an ESDS in a batch program (COBOL)". Or is that possible too ?
Thanks,
Bechu |
|
Back to top |
|
|
Mike Tebb Beginner
Joined: 02 Dec 2002 Posts: 20 Topics: 0 Location: Yorkshire, England
|
Posted: Mon Dec 09, 2002 5:58 am Post subject: |
|
|
Bechu, yes you are quite right that in CICS it is possible to read directly from an ESDS file by using the Relative Bytes Address.
That is not an option in batch COBOL as far as I am aware. _________________ Cheers - Mike |
|
Back to top |
|
|
Manas Biswal Intermediate
Joined: 29 Nov 2002 Posts: 382 Topics: 27 Location: Chennai, India
|
Posted: Mon Dec 09, 2002 6:23 am Post subject: |
|
|
Hi Bechu, Ravi and Mike
Kolusu is talking about skip sequential processing and not Random Read using RBA. You can very well specify the exact RBA and do a random read from an ESDS in CICS. But I am not too sure about skip sequential processing. In skip seq processing, you basically read records sequentially using STARTBR and READNEXT with the option of skipping some records by directly specifying the key in the RIDFLD parameter. And I am not sure that you can do the same for VSAM ESDS in CICS.
As a matter of fact, I think you cannot also use the GTEQ option(in STARTBR) to position the pointer to the next record after your partial key.
Whatever programs that I have seen using CICS-VSAM ESDS(Not many) first of all move LOW VALUES or HIGH VALUES to the RBA WS field and then issue successive READNEXT or READPREV commands to process records forward or backward sequentially. There is of course a RANDOM READ using RBA which is separate from this.
Please correct me if I am wrong.
Regards,
Manas |
|
Back to top |
|
|
Bechu Beginner
Joined: 02 Dec 2002 Posts: 2 Topics: 0 Location: Kottayam, Kerala, India
|
Posted: Mon Dec 09, 2002 8:24 am Post subject: |
|
|
Manas,
We too were talking about skip sequential processing and not random read using RBA.
1. Yes, you can use STARTBR and READNEXT with ESDS in CICS, provided you know the RBA.
2. You may be right about the GTEQ option (I have never tried it), but we really don't need GTEQ. If you know the RECL and the record number you are trying to access, RBA can be easily computed and used with STARTBR and EQ itself. (i.e. RBA of first record is 0, LRECL is 100, then you can know that the second record's RBA is 100, third's is 200, tenth's is 900 etc.) I don't see any reason why we'll ever have to do a GTEQ 250 or so! It also does not make sense to use a 'partial key' for an ESDS, which you have mentioned.
Anyway, why worry too much about things that can be easily done with a KSDS? Why force an ESDS to behave like a KSDS? Let us use it for simple functions it is capable of. The others we'll leave to the KSDS.
My question was "Is it right to say skip-sequential processing is not possible on an ESDS?". The answer just happens to be NO (at least, in CICS).
Thanks,
Bechu |
|
Back to top |
|
|
Manas Biswal Intermediate
Joined: 29 Nov 2002 Posts: 382 Topics: 27 Location: Chennai, India
|
Posted: Mon Dec 09, 2002 9:12 am Post subject: |
|
|
Hi Bechu,
Let me make myself a little bit clearer. The following is for KSDS.
Code: |
EXEC CICS STARTBR
DATASET(FCT ENTRY)
RIDFLD(WS-RECORD-PARTIAL-KEY)
GTEQ
END-EXEC
|
The above code positions the pointer at the first record greater than or equal to the partial key mentioned in the RIDFLD parameter.
Code: |
EXEC CICS READNEXT
DATASET(FCT ENTRY)
INTO(WS-AREA)
RIDFLD(WS-RECORD-KEY)
END-EXEC.
|
The above code will read the first record into the ws area and at the same time will populate the entire key in WS-RECORD-KEY for that record.
Now, if we want to do skip seq processing, we will move a record key(some other record key other than the sequentially next record) into WS-RECORD-KEY and then execute
Code: |
EXEC CICS READNEXT
DATASET(FCT ENTRY)
INTO(WS-AREA)
RIDFLD(WS-RECORD-KEY)
END-EXEC.
|
This will now start sequential processing from the record whose key is mentioned in WS-RECORD-KEY.
Basically, we are not doing a random read.(WE ARE STILL USING READNEXT AND NOT READ) We are processing sequentially only but with skips in between by specifying a record key which is not the next seq key.
Now, my question is can we do the same thing for an ESDS using RBA? I am not talking of a random read but seq processing with skips like this.
Regards,
Manas |
|
Back to top |
|
|
Dibakar Advanced
Joined: 02 Dec 2002 Posts: 700 Topics: 63 Location: USA
|
Posted: Wed Jan 22, 2003 8:07 am Post subject: |
|
|
Hi,
Through a single CICS program I want to add a record to a VSAM ESDS and update it a few times. I don't know how to go about it. Can some body help me here, starting from add step.
Thanks,
Dibakar. |
|
Back to top |
|
|
kolusu Site Admin
Joined: 26 Nov 2002 Posts: 12376 Topics: 75 Location: San Jose
|
|
Back to top |
|
|
Dibakar Advanced
Joined: 02 Dec 2002 Posts: 700 Topics: 63 Location: USA
|
Posted: Wed Jan 22, 2003 9:37 am Post subject: |
|
|
It helped.
Thanks,
Dibakar. |
|
Back to top |
|
|
|
|