Page 1 of 1

How to conduct this scenario using DFSORT

PostPosted: Thu Aug 21, 2014 10:42 pm
by Muhammed H
Hello There,

I have this scenario which is planned to be covered through a Cobol program. Have been trying to workout the same using DFSORT(PARSE, IFTHEN) but without any success till now.

Scenario: There is this variable length file which contains two types of records indicated through a "Indicator Field". The need is to segregate the two types of record in two different files but the challenge is that the fields before "Indicator Field" may or may not occur which makes deriving of "Indicator Field" quite difficult.

Here is how the file structure looks like.

01 MASTER-RECORD.
05 KEY-FIELD PIC X(10).
05 SEGMENT-BYTE PIC X(01).
05 FIELD-01 PIC X(05) OCCURS 0 TO 1 DEPENDING ON SEGMENT-BYTE-BIT01.
05 FIELD-02 PIC X(02) OCCURS 0 TO 1 DEPENDING ON SEGMENT-BYTE-BIT02.
--
--
05 FIELD-08 PIC X(08) OCCURS 0 TO 1 DEPENDING ON SEGMENT-BYTE-BIT08.
05 X-FIELD-LENGTH PIC 9(02).
05 Y-FIELD-LENGTH PIC 9(02).
05 X-FIELD PIC X(01) OCCURS 0 TO 20 DEPENDING ON X-FIELD-LENGTH.
05 Y-FIELD PIC X(01) OCCURS 0 TO 30 DEPENDING ON Y-FIELD-LENGTH.
05 INDICATOR-FIELD PIC X(01). ===========> Possible values are "E" or Space

Many Thanks,
Muhammed H

Re: How to conduct this scenario using DFSORT

PostPosted: Fri Aug 22, 2014 12:18 am
by BillyBoyo
So is INDICATOR-FIELD the last field of the record? Silly idea to put anything after those OCCURS DEPENDING ON.

You simply want to split on the indicator? E to one file, anything else to another?

Re: How to conduct this scenario using DFSORT

PostPosted: Fri Aug 22, 2014 4:22 pm
by Muhammed H
Yes, unfortunately this "INDICATOR-FIELD" is the last field of the record and I don't have the option of placing it at the start.

Also splitting on the indicator value "E" won't help as fields "X-Field" & "Y-Field" are text field and might contain character "E" which will fail the purpose.

Re: How to conduct this scenario using DFSORT

PostPosted: Fri Aug 22, 2014 6:07 pm
by BillyBoyo
Yes, I noticed the text, don't worry :-)

First thing to do is to PARSE with a length of the maximum record-length. You need that, because we're just about to destroy the data...

Then FINDREP to change C' ' (a space) to something else (your choice, except C'E').

Then OVERLAY to put a character at max-rec-length-plus-one. From that point all your records are fixed-length, space-padded and with no spaces in the data.

Then BUILD with JFY and SHIFT=RIGHT, which will jam all the data over to the right of the record. Your E/non-E is now in the position of the original maximum record-length.

Now BUILD with the PARSEd field from earlier, and the indicator.

OUTFIL first-file,INCLUDE= for the C'E', set the indicator to space, and use VLTRIM.

OUTFIL second-file,SAVE,set indicstor to space use VLTRIM.

Should get you close.

Re: How to conduct this scenario using DFSORT

PostPosted: Tue Aug 26, 2014 9:44 pm
by Muhammed H
Well thanks a lot Bill; your solution ROCKS. Just implemented & tested successfully!!!

Now was just wondering what if that “INDICATOR-FIELD” wasn’t the last field & there were some more variable fields under it.

Is it still possible to cover this with DFSORT?????(I think I am heading toward one ;) )

Do you have a trick (for this scenario) in your bag of wonders???

Re: How to conduct this scenario using DFSORT

PostPosted: Wed Aug 27, 2014 12:43 am
by BillyBoyo
It may still be possible as a general solution with a number of IFTHENs which "de-code" the positions. Whether there is a "short" solution depends entirely on the actual case. If the number of possibilities for the ODO is limited (like your example where there were only eight possible) there may be a PARSE solution (with multiple PARSEs, and ADDPOS) but we need to see the actual situation you have when you arriver there,

So, that's a guarded "probably" :-)

Re: How to conduct this scenario using DFSORT

PostPosted: Tue Sep 02, 2014 10:12 pm
by Muhammed H
Run against Live file failed.
There are couple of records defying my earlier layout where “Indicator-Field” isn’t the last field hence voiding the initial solution perceived considering it to be last field.


New Layout is below(My bad for overlooking this earlier).

Is it possible to make length option in sort card to refer to a specific position in file? (Probably not) I am not able to over come this limitation of specifying a numeric integer value for the length option in sort card. Is there any way to de-code length of the variable fields?

01 MASTER-RECORD.
05 KEY-FIELD PIC X(10).
05 SEGMENT-BYTE PIC X(01).
05 FIELD-01 PIC X(05) OCCURS 0 TO 1 DEPENDING ON SEGMENT-BYTE-BIT01.
05 FIELD-02 PIC X(02) OCCURS 0 TO 1 DEPENDING ON SEGMENT-BYTE-BIT02.
--
--
05 FIELD-08 PIC X(08) OCCURS 0 TO 1 DEPENDING ON SEGMENT-BYTE-BIT08.
05 X-FIELD-LENGTH PIC 9(02).
05 Y-FIELD-LENGTH PIC 9(02).
05 X-FIELD PIC X(01) OCCURS 0 TO 20 DEPENDING ON X-FIELD-LENGTH.
05 Y-FIELD PIC X(01) OCCURS 0 TO 30 DEPENDING ON Y-FIELD-LENGTH.
05 INDICATOR-FIELD PIC X(01). ==============================> Possible values are "E" or Space
05 PREV-KEY-FIELD PIC X(10).
05 PREV-SEGMENT-BYTE PIC X(01).
05 PREV-FIELD-01 PIC X(05) OCCURS 0 TO 1 DEPENDING ON PREV-SEGMENT-BYTE-BIT01.
05 PREV-FIELD-02 PIC X(02) OCCURS 0 TO 1 DEPENDING ON PREV-SEGMENT-BYTE-BIT02.
--
--
05 PREV-FIELD-08 PIC X(08) OCCURS 0 TO 1 DEPENDING ON PREV-SEGMENT-BYTE-BIT08.
05 PREV-X-FIELD-LENGTH PIC 9(02).
05 PREV-Y-FIELD-LENGTH PIC 9(02).
05 PREV-X-FIELD PIC X(01) OCCURS 0 TO 20 DEPENDING ON PREV-X-FIELD-LENGTH.
05 PREV-Y-FIELD PIC X(01) OCCURS 0 TO 30 DEPENDING ON PREV-Y-FIELD-LENGTH.


Code'd, for what is was worth

Re: How to conduct this scenario using DFSORT

PostPosted: Wed Sep 03, 2014 12:25 am
by BillyBoyo
You have 58 possible starting-positions for your indicator. You also have eight possible starting-positions for your lengths. It can be done with a lot of code. Perhaps 66 IFTHEN=WHEN=(logical expression, and HIT=NEXT

I'll have to have a think about something more convenient. May not be possible...

Re: How to conduct this scenario using DFSORT

PostPosted: Wed Sep 03, 2014 2:46 pm
by BillyBoyo
Sorry, not come up with anything that doesn't involve a lot of code.

COBOL is going to be much easier.