View previous topic :: View next topic
|
Author |
Message |
vinaysetlur
New User
Joined: 04 Jan 2008 Posts: 13 Location: United States
|
|
|
|
Hi , I ran into this strange issue that is as follows: -
Method of execution: - TSO
I get the dataset name from the user and pass it using a simple say and pull combination.
I then use queue to push IDCAMS allocate statements into the external data queue and then invoke IDCAMS using Address link.
The call is successfull and the dataset is created.
However when I code a sysdsn check in my program , it says that the dataset is not created.
I am familiar with the 'problem' with quotes on sysdsn . A quick reference says it all. But this is really strange because on a separate standalone invocation of the sysdsn alone, it recognizes and honors the dataset existence.
Here's the code:
Code: |
/* rexx */
say ' Pass Dsname '
pull dsname
address tso
"alloc f(sysprint) new reu unit(vio) lrecl(121)",
"recfm(f b) space(1) tra"
"ALLOC F(SYSIN) DUMMY REU "
q = ''
q.0 = 3
q.1 = " ALLOC DSN('"dsname"') "
q.2 = " SPACE(1,1) CYL LRECL(80) BLKSIZE(80) RECFM(F)"
q.3 = " DSORG(PS) NEW CAT STORCLAS(STND) "
do i=1 to q.0
q = q||q.i
end
queue q
queue
address link 'IDCAMS'
"free f(sysin sysprint)"
if rc/=0 then say 'rc = ' rc
else
do
x = sysdsn("'"dsname"'")
if x = 'OK' then say 'DS is created !!! '
else
say 'Error' X
end
exit |
Code'd |
|
Back to top |
|
|
vinaysetlur
New User
Joined: 04 Jan 2008 Posts: 13 Location: United States
|
|
|
|
Looks like this is because the "dataset only gets created" when the complete exec is run . Because that is one unit of work ?
In other words,
The dataset is not created after the IDCAMS execution and not yet until the last line of the code gets executed.
I am living with this notion currently and keeping the thread open for any different views or ideas on this.
Thanks in anticipation |
|
Back to top |
|
|
Pedro
Global Moderator
Joined: 01 Sep 2006 Posts: 2593 Location: Silicon Valley
|
|
|
|
It is not clear why you use IDCAMS for allocation.
Why not just use TSO?
Code: |
Address TSO "ALLOC DSN('"dsname"') ",
" SPACE(1,1) CYL LRECL(80) BLKSIZE(80) RECFM(F)",
" DSORG(PS) NEW CAT STORCLAS(STND) " |
|
|
Back to top |
|
|
vinaysetlur
New User
Joined: 04 Jan 2008 Posts: 13 Location: United States
|
|
|
|
That is true . We can use TSO . In fact , we must always so that we keep things straight and simple.
But this was a intended as a demo for my other team members on how to invoke IDCAMS through REXX. So under that intention , I used a simple ALLOC statement for IDCAMS . |
|
Back to top |
|
|
steve-myers
Active Member
Joined: 30 Nov 2013 Posts: 917 Location: The Universe
|
|
|
|
vinaysetlur wrote: |
...
"ALLOC F(SYSIN) DUMMY REU "
...
address link 'IDCAMS'
"free f(sysin sysprint)"
if rc/=0 then say 'rc = ' rc
else ...
|
- How is IDCAMS even seeing your statements?
- I think the return code you are testing is the return code from the TSO FREE command.
|
|
Back to top |
|
|
sureshpathi10
Active User
Joined: 03 May 2010 Posts: 158 Location: Kuala Lumpur
|
|
|
|
If you comment out the call to IDCAMS also, your dataset will get created. I found that, your code
Code: |
q = ''
q.0 = 3
q.1 = " ALLOC DSN('"dsname"') "
q.2 = " SPACE(1,1) CYL LRECL(80) BLKSIZE(80) RECFM(F)"
q.3 = " DSORG(PS) NEW CAT STORCLAS(STND) "
do i=1 to q.0
q = q||q.i
end
queue q |
is generating the Dataset, after the execution by TSO.
and as per your issue about SYSDSN, Since the allocation command processing at the end of your program, there was no information about the file existence at the time of SYSDSN execution. |
|
Back to top |
|
|
Pedro
Global Moderator
Joined: 01 Sep 2006 Posts: 2593 Location: Silicon Valley
|
|
|
|
I have never seen IDCAMS to pull from the TSO stack. Where did you get the idea that it would?
Instead of QUEUEing the command, put them in a SYSIN file before you call IDCAMS. |
|
Back to top |
|
|
steve-myers
Active Member
Joined: 30 Nov 2013 Posts: 917 Location: The Universe
|
|
|
|
Pedro: Agreed, but first he has to write the command to a SYSIN data set that is a real data set, not DUMMY. If he is going to write the lines he has placed in the q array, he has to indicate the first and second lines are continued for IDCAMS.
sureshpathi10: Agreed, but then why is SYSDSN not working? Possibly because of the flawed return code test?
There are so many problems with the Rexx EXEC I think the TS should start over.- Use TSO to do the allocation.
- Forget IDCAMS
- Test the return code after the allocate command.
- Free the data set before he exits the Rexx exec.
|
|
Back to top |
|
|
Pedro
Global Moderator
Joined: 01 Sep 2006 Posts: 2593 Location: Silicon Valley
|
|
|
|
I recall this from the original poster:
Quote: |
intended as a demo ... on how to invoke IDCAMS through REXX |
|
|
Back to top |
|
|
Pedro
Global Moderator
Joined: 01 Sep 2006 Posts: 2593 Location: Silicon Valley
|
|
|
|
Quote: |
sureshpathi10: Agreed, but then why is SYSDSN not working? |
He is putting the ALLOCATE in the stack. The stack apparently gets executed after the rexx program completes. At the time of the SYSDSN function, the ALLOCATE is still in the stack and has not yet been executed. |
|
Back to top |
|
|
steve-myers
Active Member
Joined: 30 Nov 2013 Posts: 917 Location: The Universe
|
|
|
|
Just another lesson to me I should not butt in where I really don't know much about Rexx. I deduced he was building something in the queue. Silly me, I thought it was executed immediately! Thanks Pedro. |
|
Back to top |
|
|
Pedro
Global Moderator
Joined: 01 Sep 2006 Posts: 2593 Location: Silicon Valley
|
|
|
|
There are some commands, such as CONSOLE, ACCOUNT, TEST, and IPCS where it will change from 'READY' prompt to some other prompt (or blank). For those commands, I think it will pull subcommands from the stack.
Also, some commands, such as RECEIVE, will prompt the user for missing parameters. I think it will pull from the stack. When you add stuff to the stack, it is not executed immediately, but pulled by the program as needed.
However, IDCAMS is not such a command. To my knowledge, it will not pull from the stack. |
|
Back to top |
|
|
sureshpathi10
Active User
Joined: 03 May 2010 Posts: 158 Location: Kuala Lumpur
|
|
|
|
Thanks for backing up Pedro.... As Pedro mentioned earlier, IDCAMS looks for commands to execute in SYSIN file. |
|
Back to top |
|
|
vinaysetlur
New User
Joined: 04 Jan 2008 Posts: 13 Location: United States
|
|
|
|
Sorry. I had been out for a while and not following the updates.
I guess , this is what I had also mentioned as my notion and cannot agree any less with Pedro's note: -
Quote: |
"The stack apparently gets executed after the rexx program completes. At the time of the SYSDSN function, the ALLOCATE is still in the stack and has not yet been executed." |
In other words : -
Quote: |
The dataset is not created after the IDCAMS execution and not yet until the last line of the code gets executed.
|
Also I did try to write to sysin. But it had failed with a different error and that's when i tried to directly put data to the stack via queue and pass that to IDCAMS. I then kept SYSIN dummy .
This was the error I received
IEC141I 013-34,IGG0191A,E8751AJ,IKJACCNT,SYSIN,VIO , ,,
SYS14031.T121543.RA000.E8751AJ.R0396963,
***,
when I tried to allocate SYSIN as follows: -
Code: |
"alloc f(SYSIN) new reu unit(vio) lrecl(80) recfm(f b) space(1) tracks" |
Then I looked up the IEC141I 013-34 message and changed recfm to variable with some blocksize for sysin as follows: -
Code: |
"alloc f(SYSIN) new reu unit(vio) lrecl(80) recfm(v) space(1) tracks blksize(800)" |
and it worked OK. But the sysdsn doesn't detect the dataset which is because of the dataset not getting created yet at the time of call.
Thanks , this thread may now be closed |
|
Back to top |
|
|
|