View previous topic :: View next topic
|
Author |
Message |
ajithajt
New User
Joined: 21 Mar 2016 Posts: 10
|
|
|
|
Hi,
I am having a Rexx program to split a file into number of files( number will vary depending on data) and create those files dynamically. I achieved it thru Rexx, but since the volume of data is huge its consuming high CPU. So now we were advised to perform the copy operation by invoking the DFSORT utility. I have the below code to perform the operation.
/* SIMPLE REXX CLIST TO EXECUTE DFSORT */
/* ASSUMES DFSORT IS IN SYS1.LPALIB */
"FREE FI(SYSOUT SORTIN SORTOUT SYSIN)"
"ALLOC FI(SYSOUT) DA(*)"
"ALLOC FI(SORTIN) DA('userid.INS1') REUSE"
"ALLOC FI(SORTOUT) DA('userid.OUTS1') REUSE"
"ALLOC FI(SYSIN) DA('userid.SORT.STMTS') SHR REUSE"
ADDRESS LINKMVS ICEMAN
But my issue here is i don't want the SORTIN to be passed with a dataset. I have the data available in my REXX stem variable. I need to pass this data as an input to this DFSORT operation.
What we are looking for is to take the copy operation from REXX plate to DFSORT. Could someone please help me on this.
Regards,
Ajt |
|
Back to top |
|
|
expat
Global Moderator
Joined: 14 Mar 2007 Posts: 8797 Location: Welsh Wales
|
|
|
|
You will probably find that you are unlucky in what you want.
Although, as you have given hardly any information at all ...............
So how did the data get into the stem variable - surely not the huge volume of records already mentioned ? Please tell me NO.
What you really need to do is the sit down and analyse what you want to achieve. From scratch seems like a good idea as like so many, it appears that you are looking at only the short term solution.
My first thoughts would be to work out exactly what was needed, then look at the sort solution. Why bother invoking sort via REXX unless this is one of those "Let's lock a terminal for hours" solutions.
Take the time to explain fully and accurately exactly what it is that you want to achieve and then be prepared to accept solutions that are not the ones that you had thought of.
MORE INFORMATION REQUIRED ! |
|
Back to top |
|
|
PeterHolland
Global Moderator
Joined: 27 Oct 2009 Posts: 2481 Location: Netherlands, Amstelveen
|
|
|
|
You can call DFSORT from Rexx by passing a parameterlist.
Read the manuals or do some searching on the internets. |
|
Back to top |
|
|
Willy Jensen
Active Member
Joined: 01 Sep 2015 Posts: 712 Location: Denmark
|
|
|
|
DFSORT must have the input from either SORTIN, or from a SORT exit E15. So unless you are prepared to write a SORT exit, which in my opinion would be overkill, then you need that dataset.
As PeterHolland wrote, you can use a parameter list to change the name of SORTIN, but not eliminate the need for it.
Keep in mind that it could be a temporary dataset. If you have the PIPE command available then that would simplify writing the stem to a dataset. If not, what is the big deal? It takes 2 statements to write a stem to a dataset:
- BPXWDYN ALLOCATE (BPXWDYN can allocate a temporary dataset)
- EXECIO to write the stem
At the end you must BPXWDYN FREE or TSO FREE the dataset.
I too would like to know the reason why you want to avoid the SORTIN dataset. |
|
Back to top |
|
|
Nic Clouston
Global Moderator
Joined: 10 May 2007 Posts: 2455 Location: Hampshire, UK
|
|
|
|
I believe that what you are being asked to do with sort is to REPLACE your rexx program - not include sort in it. Large number of records and Rexx are not a good combination even if you compile your Rexx. Any thing more than a few (say 30) thousand records then you should be looking at not using Rexx at all. |
|
Back to top |
|
|
ajithajt
New User
Joined: 21 Mar 2016 Posts: 10
|
|
|
|
Hi All,
Thank you for your responses. Below mentioned is my exact requirement.
I have the below two data sets as input.
data set1.test - which is a control card in which the flags are set for stake holders that requires the report.
data set2. Test - which contains the consolidated monthly report of all stake holders.
Each stake holders records will be split using the variable split in pos 1 to 6.
Eg.
Split
Stkhldr1
Stkhldr1
Stkhldr1
Split
Stkhldr2
Stkhldr2
Split
Stkhldr3
Current Rexx Logic.
It will first read the control card and stores all stakeholder ids in a list. Then it will read the consolidated report data set and whenever it finds the identifier split, it will check whether that stake id is available in list and it will allocate a data set which contains the name of that stake holder (eg. Stkhldr1.File) and copies the data to it. If no report is found in consolidated data set for a stake holder then dummy data set will be created.
Issue am facing here is copy operation is taking a lot of cpu. So thought of moving that alone to Dfsort. If the whole operation can be achieved through sort then that is also fine.
Please share your thoughts.
Regards,
Ajt
edited to correct spelling and mis-use of 'file' |
|
Back to top |
|
|
Nic Clouston
Global Moderator
Joined: 10 May 2007 Posts: 2455 Location: Hampshire, UK
|
|
|
|
Find, on the internet, the document by the DFSort team describing the various ways of splitting a data set (amongst other topics). The document is "Smart DFSORT Tricks".
Presumably the consolidated report file has a means of identifying which report is for which stake-holder? |
|
Back to top |
|
|
Arun Raj
Moderator
Joined: 17 Oct 2006 Posts: 2481 Location: @my desk
|
|
|
|
Quote: |
Issue am facing here is copy operation is taking a lot of cpu. So thought of moving that alone to Dfsort. If the whole operation can be achieved through sort then that is also fine. |
You could consider writing some COBOL code to allocate output data sets dynamically using BPXWDYN, reading both your control input as well as the consolidated input data sets.
This can also be achieved using a sort solution, but you may probably need to build a split job dynamically just reading your control input to create as many output DD statements and OUTFIL control statements as needed. Then the dynamic job would need to be submitted through internal reader. Most shops may not prefer implementing something like this in production though. |
|
Back to top |
|
|
Pedro
Global Moderator
Joined: 01 Sep 2006 Posts: 2547 Location: Silicon Valley
|
|
|
|
Quote: |
"ALLOC FI(SORTIN) DA('userid.INS1') REUSE"
...
But my issue here is i don't want the SORTIN to be passed with a dataset. I have the data available in my REXX stem variable. I need to pass this data as an input to this DFSORT operation. |
I think what you want is to:
1. use EXECIO to write your desired SORT control statements based on your rexx stem information,
2. allocate your new data set to SORTIN, then
3. call DFSORT. |
|
Back to top |
|
|
sergeyken
Senior Member
Joined: 29 Apr 2008 Posts: 2018 Location: USA
|
|
|
|
Pedro wrote: |
Quote: |
"ALLOC FI(SORTIN) DA('userid.INS1') REUSE"
...
But my issue here is i don't want the SORTIN to be passed with a dataset. I have the data available in my REXX stem variable. I need to pass this data as an input to this DFSORT operation. |
I think what you want is to:
1. use EXECIO to write your desired SORT control statements based on your rexx stem information,
2. allocate your new data set to SORTIN, then
3. call DFSORT. |
SYSIN, not SORTIN |
|
Back to top |
|
|
|