View previous topic :: View next topic
|
Author |
Message |
rackshit
New User
Joined: 19 Dec 2009 Posts: 16 Location: Mumbai
|
|
|
|
Hi,
Please see the following image,
which shows the various Flow of control between COBOL programs, run units, and CICS.
Based on this I have some questions:
Question1:
What will happen if in Program Y, a statement SEND MAP (MENU) is encountered and the program Y has the following statements at the end of the program
Code: |
EXEC CICS
RETURN TRANSID(‘MENU’)
COMMAREA(COMMUNICATION-AREA)
END-EXEC
|
TRANSID-MENU is associated with program Y.
In the second run will the Program Y or Program W or Program U be executed ?
Assume: program control flow reaches program Y
Question 2:
Suppose Program W has following send map which is executed
and at the end of program W, the following statements are present
Code: |
EXEC CICS
RETURN TRANSID(‘MENUW’)
COMMAREA(COMMUNICATION-AREAW)
END-EXEC
|
TRANSID-MENUW is associated with program W.
In the second run will the Program W or Program U be executed ?
Thanks in advance ! |
|
Back to top |
|
|
Bill O'Boyle
CICS Moderator
Joined: 14 Jan 2008 Posts: 2501 Location: Atlanta, Georgia, USA
|
|
|
|
RETURN TRANSID can only be issued when a program is at Logical Level 0. If it's issued from a non Logical Level 0 program, an INVREQ condition will be raised.
You can issue a SEND MAP from a non Logical Level 0 program.
All CICS/COBOL programs should have a CICS RETURN followed by a GOBACK. All sub-programs that are CALLED as opposed to LINK-TO, should terminate with a GOBACK and not a RETURN.
Inasmuch as a STOP RUN (according to IBM) can be used, I'd stick with the GOBACK (I'm a creature of old habits).
When I was coding and a given sub-program was CALLED as opposed to LINKED-TO, I would issue a GOBACK to return to the Caller.
You can tell if a program had been Called or Linked-To by checking (as the first line of code), whether EIBRSRCE equals or does NOT equal the sub-program name. When equal, then the program had been accessed via a LINK-API.
Keep in mind that because a CALL is outside of the scope of CICS API's, the Logical Level doesn't change, as opposed to a LINK-API. Of course, an XCTL-API is a horizontal move and therefore the current Logical Level remains.
Also (last time I looked), WS in a Called sub-program is not freed until Task Termination as opposed to a LINK-API, whose storage is freed upon return to the Linker.
When storage is freed at the return of a sub-program who had been Linked-To, this is recognized as the termination of an LE Enclave.
You can find all of these interesting tidbits in a transaction dump with a trace or a standalone trace.
Mr. Bill |
|
Back to top |
|
|
rackshit
New User
Joined: 19 Dec 2009 Posts: 16 Location: Mumbai
|
|
|
|
Thanx Bill.
Quote: |
You can issue a SEND MAP from a non Logical Level 0 program. |
So if we do a SEND MAP from non logical level 0 then in the next pseudoconversational run of the transaction the program flow will start from the logical level 0 program ?
And in the below level 0 program
Code: |
PROCEDURE DIVISION.
.
.
.
.
SEND-MAP SECTION.
EXEC CICS
SEND MAP
END-EXEC
.
.
.
.
EXEC CICS
RETURN TRANSID(XXXX)
COMM-AREA(COMMUNICATION-AREA)
END-EXEC. |
The control never reaches to RETURN verb, since SEND MAP sends the map and RETURN is never executed, then how does CICS come to know that it has to return the control to TRANSID XXXX when running it second time in pseudoconversational program? Is this thing internal to CICS?
Thanks in advance. |
|
Back to top |
|
|
Eshwar CICS
New User
Joined: 18 May 2011 Posts: 47 Location: India
|
|
|
|
Bill,
I have seen RETURN TRANSID issued by the programs not executing at logical level 0 (I believe CICS gets executed at logical level 0) & they work properly. Please correct me if there is a mistake in my understanding. |
|
Back to top |
|
|
Eshwar CICS
New User
Joined: 18 May 2011 Posts: 47 Location: India
|
|
|
|
rackshit,
In your supplied code, RETURN executes after the SEND MAP. Let us know, Why do you think RETURN will not execute? |
|
Back to top |
|
|
Bill O'Boyle
CICS Moderator
Joined: 14 Jan 2008 Posts: 2501 Location: Atlanta, Georgia, USA
|
|
|
|
Eshwar CICS wrote: |
Bill,
I have seen RETURN TRANSID issued by the programs not executing at logical level 0 (I believe CICS gets executed at logical level 0) & they work properly. Please correct me if there is a mistake in my understanding. |
Unless Hursley-Park has recently eased up on internal restrictions, I don't believe with certainty RETURN TRANSID at a non Logical Level 0 will execute without error as a RETURN TRANSID has always implied/signaled Task Termination.
I'd be surprised if this restriction has been lifted....
Mr. Bill |
|
Back to top |
|
|
Robert Sample
Global Moderator
Joined: 06 Jun 2008 Posts: 8696 Location: Dubuque, Iowa, USA
|
|
|
|
The CICS Application Programming Reference manual says this about RETURN:
Quote: |
TRANSID(name)
specifies the transaction identifier (1-4 characters) to be used with the next input message entered from the terminal with which the task that issued the RETURN command has been associated. The specified name must have been defined as a transaction to CICS.
If TRANSID is specified for a program running on a terminal that is defined with a permanent transaction ID, the terminal's permanent transaction is initiated next rather than the transaction specified on the RETURN.
If you specify a TRANSID of binary zeros, the transaction identifier for the next program to be associated with the terminal may be determined from subsequent input from the terminal. Issuing a RETURN with a TRANSID of binary zeros and a COMMAREA can cause unpredictable results if the next transaction is not coded to handle the COMMAREA or if it receives a COMMAREA not intended for it.
If you specify TRANSID on a program that is not at the highest level, and there is a subsequent error on COMMAREA or INPUTMSG on the final RETURN, the TRANSID is cleared.
The next transaction identifier is also cleared on an abnormal termination of the transaction.
If IMMEDIATE is specified with this option, control is passed to the transaction specified in the TRANSID option in preference to any transactions enqueued by ATI.
If IMMEDIATE is not specified with this option, an ATI initiated transaction of the same name enqueued to the terminal nullifies this option.
This option is not valid if the transaction issuing the RETURN command is not associated with a terminal, or is associated with an APPC logical unit. |
which indicates CICS will allow a RETURN TRANSID at non Logical Level 0. This would be poor system design, however, as it allows for multiple ways to exit a module. |
|
Back to top |
|
|
Eshwar CICS
New User
Joined: 18 May 2011 Posts: 47 Location: India
|
|
|
|
All our CICS application programs execute starting at Level 1, Level 2 etc...coding of RETURN command always happens in our application programs...how can we code it at level 0? and how coding of it at non zero logical level is considered as poor design? |
|
Back to top |
|
|
Robert Sample
Global Moderator
Joined: 06 Jun 2008 Posts: 8696 Location: Dubuque, Iowa, USA
|
|
|
|
Modular coding mandates one entry and one exit point per program. If the program was entered on logical level 2, for example, via a CICS LINK then the exit should be via CICS RETURN to go back to level 1. Having a CICS RETURN TRANSID in the program allows the module to have two exits.
And note that EXEC CICS RETURN and EXEC CICS RETURN TRANSID have very different outcomes -- another case where terminology is so critical to IT. |
|
Back to top |
|
|
Eshwar CICS
New User
Joined: 18 May 2011 Posts: 47 Location: India
|
|
|
|
RETURN with trans-id can be coded at logical level 1 (non zero logical level)...i doubt if it is considered a bad design. |
|
Back to top |
|
|
Bill O'Boyle
CICS Moderator
Joined: 14 Jan 2008 Posts: 2501 Location: Atlanta, Georgia, USA
|
|
|
|
Robert,
Yes, should have checked the doc rather than to rely upon my memory.
But, I agree that it can be somewhat confusing to code the RETURN TRANSID at a non Logical Level 0.
Began coding CICS command in the mid-70's (CICS/OS 1.4) and always issued a RETURN TRANSID at Logical Level 0. To this day (if I was still coding), I'd do the same (agreed, one entry/one exit).
With that, issuing the RETURN TRANSID at a non Logical Level 0; just because you CAN doesn't mean you SHOULD.
Mr. Bill |
|
Back to top |
|
|
dbzTHEdinosauer
Global Moderator
Joined: 20 Oct 2006 Posts: 6966 Location: porcelain throne
|
|
|
|
Quote: |
RETURN with trans-id can be coded at logical level 1 (non zero logical level)...i doubt if it is considered a bad design. |
is like using a GO TO when one can not properly code functional/modular logic.
it is just a short-cut when one is being lazy and does not want to properly extend the modular construct of a module/sub-system.
it prohibits any future extension. |
|
Back to top |
|
|
Eshwar CICS
New User
Joined: 18 May 2011 Posts: 47 Location: India
|
|
|
|
how RETURN TRANS-ID (or any other CICS command) can be coded at level 0.....when application programs triggered by transaction in CICS environment start at Level 1 |
|
Back to top |
|
|
dbzTHEdinosauer
Global Moderator
Joined: 20 Oct 2006 Posts: 6966 Location: porcelain throne
|
|
|
|
Eshwar CICS wrote: |
how RETURN TRANS-ID (or any other CICS command) can be coded at level 0.....when application programs triggered by transaction in CICS environment start at Level 1 |
yadadadada,
point was being made that the RETURN should be issued at the same level as invokation.
if point was lost at lvl/0,lvl/1 or whatever,
then of course you are correct. (as if anybody cares, except you of course) |
|
Back to top |
|
|
dick scherrer
Moderator Emeritus
Joined: 23 Nov 2006 Posts: 19244 Location: Inside the Matrix
|
|
|
|
Hello,
Quote: |
i doubt if it is considered a bad design. |
People who do good work do consider this a bad design. Just because something can be done does not make it "good".
Beginner's doubts should not weigh as heavily as senior developers. . .
Suggest you do lots of research and get to an understanding of why this is a bad design. |
|
Back to top |
|
|
Bill Woodger
Moderator Emeritus
Joined: 09 Mar 2011 Posts: 7309 Location: Inside the Matrix
|
|
|
|
Eshwar CICS,
So it was an old requirment. No, then, no point in starting a new topic.
What you required was probably achievable (I certainly can't be exact without the details, but...) but if you want to get tied up with it being a "run-unit" and grab at the first straw to "confirm" that you and your colleagues were failing for a very good reason, go with that, have a good weekend as well.
When faced with a task I've never thought "that can only be done with XYZ like we can under QRTJ, so let's get that working in batch and then deal with the task". OK, I'm sure I'd have looked a lot cleverer at parties if I'd done that (actually, I am far from sure, but I can't see any other use for the technique except for firing blanks), but I think I'd have got less done. I'm annoyed if the later-revealed complexity of a task means it takes longer than budgeted for. I've never had a "can't be done, so we didn't do it" moment.
Why am I getting annoyed about this? Thought we'd get an interesting question before the weekend, then it turned out to be the above.
EDIT: Sorry Robert, I was typing while you were splitting. |
|
Back to top |
|
|
Eshwar CICS
New User
Joined: 18 May 2011 Posts: 47 Location: India
|
|
|
|
Robert,
Thanks again for making it much clear why this cannot be done in COBOL alone. |
|
Back to top |
|
|
rackshit
New User
Joined: 19 Dec 2009 Posts: 16 Location: Mumbai
|
|
|
|
Eshwar CICS wrote: |
rackshit,
In your supplied code, RETURN executes after the SEND MAP. Let us know, Why do you think RETURN will not execute? |
Thanks all for replies, its a good discussion and knowledge sharing.
As per my understanding, once the send map is done the control goes to CICS and when the user enters any attention key or function key, CICS sends the control to the program associated with RETURN TRANSID (XXXX). So CICS will return to that program which is mapped to TRANSID (XXXX)
It may be a non logical level 0 program. But when a send map is done, the program flow (control) never reaches the end of program where RETURN statement is coded. (this understanding i got from Murach's book, where pseudoconversational is explained). So is there a mechanism where CICS looks out for RETURN statement in the program to let it understand which program is to be invoked when user presses function key ?
Please let me know if my understanding is incorrect.
Thanks in advance. |
|
Back to top |
|
|
dbzTHEdinosauer
Global Moderator
Joined: 20 Oct 2006 Posts: 6966 Location: porcelain throne
|
|
|
|
from what I understand,
Murach's book
is too good a book to have made such a comment.
you are miss/reading/understanding.
if you have a pc background / visual basic / forget what you knew.
is not even remotely related to how a mainframe works. |
|
Back to top |
|
|
Robert Sample
Global Moderator
Joined: 06 Jun 2008 Posts: 8696 Location: Dubuque, Iowa, USA
|
|
|
|
Quote: |
But when a send map is done, the program flow (control) never reaches the end of program where RETURN statement is coded. (this understanding i got from Murach's book, where pseudoconversational is explained). So is there a mechanism where CICS looks out for RETURN statement in the program to let it understand which program is to be invoked when user presses function key ? |
Your understanding is wrong. If this were the case, how could a conversational program ever work?
Once the SEND MAP has been done, the program may do whatever it needs to do -- including RETURN -- and you can easily confirm this by using CEDF on your program. You will discover that after the SEND MAP is done, your program is still running until the RETURN is executed. |
|
Back to top |
|
|
|