Ever wonder how we got along without cell phones, BlackBerrys, notebook computers, and fax machines? How did our past generations manage to have fun without video games, MP3 players, and DVRs?

Come to think of it, how did we ever survive without the Internet?

I don't know how, but they did. And you know what? They don't remember ever thinking that they were missing something. They played records, wrote letters, used the phone book, and shopped at stores.

But then for us we got "GADGETS" for everything they make our lives very easier n entertaining....

Today GADGETS evolved n are ruling the technology in this technical world. ..

Snap Shots

Get Free Shots from Snap.com

GADGETS n GIZMOS are IN...


Saturday, June 01, 2013

Email Communication Points

1)       Subject Lines are Headlines
o   Two functions:
1.       It grabs your attention, and
2.       it tells you what the email is about
o   If your message is one of a regular series of emails, such as a weekly project report, include the date in the subject line.
o   For a message that needs a response, you might want to include a call to action, such as "Please reply by November 7".
2)      Meeting Invite
o   your calendar is full of meetings, It is advisable to have full details in the subject like when and where the meeting's being held.
e.g. Late Charge Project discussion Meeting – Tuesday (dated) 6:00PM to 7:00PM

Ø  Please let me know if you can make that time.
Ø  If you have any questions, feel free to get in touch
Ø  Do let me know if you have any questions!
Good Example
Subject: Reminder of 10am Meeting Sched. 10/05 on PASS Process.
Hi Jim,
I just wanted to remind you about the meeting we have scheduled for Monday, October 5, at 10:00am. It's being held in conference room A, and we'll be discussing the new PASS Process.
If you have any questions, feel free to get in touch (x3024).
Best Wishes,
Mark
3)      Make One Point per Email
o   If you need to communicate with someone about a number of different things, consider writing a separate email on each subject.
o   If you do want to put several points in an email - perhaps because they relate to the same project - consider presenting each point in a separate, numbered paragraph. This makes each point stand out, significantly increasing the likelihood that each point will be addressed.
Good Example
Subject: Revisions for Sales Report
Hi Jackie,
Thanks for sending in that report last week. I read through it yesterday and feel that you need more specific information regarding our sales figures in Chapter 2. I also felt that the tone could be a bit more formal. The report is going to be read by our Executive Team, and needs to reflect our professionalism.
Thanks for your hard work on this!
Monica
AND
Subject: Friday 10/9, 11am Meeting w/PR Dept
Hi Jackie,
I wanted to let you know that I've scheduled a meeting with the PR department for this Friday, 10/9, regarding the new ad campaign.
It's at 11:00am, and will be in the small conference room. Please let me know if you can make that time.

Thanks!
Monica
4)      Specify the Response You Want
Good Example
Subject: Checking On Reliable Landscapes Proposal
Dear Lynn,
I just wanted to check that you have received the landscaping proposal I emailed to you last week. I haven't heard back and wanted to make sure it went through.
Can you please call me by Thursday so we can discuss? This is when our discount offer expires, and I want to make sure you don't miss it!
The quickest way to contact me is by cell phone.
Thanks!
Peter Schuell, Owner
 Reliable Landscaping, Inc.
 555.135.4598 (office)
 555.135.2929 (cell)

5)      Using EOM Headlines
o   When you have a very short message to convey, you can use the EOM, or End Of Message, technique
Example
Subject: 10/5 Meeting, 10am, Conf. Rm. A, On PASS Procedure EOM
6)       Be a Good Correspondent
o   If a detailed response is required to an email, and you don't have the time to pull together the information straight away, send a holding reply saying that you have received the message, and indicating when you will respond fully.
Always set your Out of Office agent when you're going to be away from your email for a day or more, whether on leave or because you're at meetings

CICS Refresher

CICS (Customer Information Control System)

History

IBM launched the initial version of CICS in 1968.
It is a Database/Data Communication Control System where an application program can concentrate on the application processing without worrying about OS, hardware and others. Initially CICS was on macro level and later upgraded to command level.

This book is written based on CICS/MVS V2R3

Task and Transaction

Task is a unit of work and transaction is an entity that initiates the execution of task. The transaction identifier identifies the transaction in CICS.

Conversation and Pseudo conversation

Program can communicate with user by a pair of SEND and RECEIVE commands. But in between the SEND and RECEIVE, that is during the human response time, all the resources are held by the program.
Once the user entered the information in the screen, the program proceeds further. This mode of communication is called Conversational mode. It is un-famous for the resource wastage.

In Pseudo conversation mode, whenever there is a need for conversation with user, the program logically terminates there, releases the resources held by it and pass control information to next transaction and the next transaction is automatically started once user entered the information in the screen.
It is actually multi task operation but looks like conversation from user point of view.

For easy understanding we would say the communication in telephone line is conversational mode (Telephone line is in usage through out the communication.)  IRC as Pseudo conversation (Once the message sent, the line is freed and it again gets the resources when the other side replied.)

Multitasking and Multithreading

Operating system allows execution of more than one task concurrently and this is called multitasking. If the one or more concurrent tasks use the same copy of the program, then this is called multithreading. So it is obvious that multitasking is a subset of multithreading.

Reentrant and Quasi-reentrant

If the same copy of the program is used by multiple tasks, then the system should take care of the proper reentrance after the SVC/CICS interruption.

Reentrant program is defined as a program that does not modify itself so that it can reenter to itself and continue processing after an interruption by the SVC call of OS. Batch programs are non-reentrant. Reentrancy under CICS environment is called quasi entrant as the interruption in CICS may involve more than one SVC calls or no SVC at all.

COBOL programs should be compiled with RENT option for reentrancy in multithreading environment.

CICS Control Program and Control Tables
CICS Nucleus consists of IBM-Supplied CICS control programs and corresponding user-specified CICS control tables. The important tables with respect to developer point of view are given below:

Control
Table  
Function
PCT      

The transactions and the main program associates with the transaction should be registered in Program table. Task control Program (KCP) refers PCT.
PPT
All the CICS programs and Maps have to be registered in Processing Program Table. Program Control Program (PCP) refers PPT.
FCT
All the VSAM files used in the CICS programs has to be registered in File Control Table. File Control Program (FCP) refers FCT.
DCT
Transient data queues should be predefined in Destination Control Table. Transient Data Program refers DCT.
TST
If you want to recover Temporary storage queues during system crash, then they should be registered in Temporary Storage Table.
RCT
If any DB2 commands are used in the program, then the PLAN should be registered here.
SNT
User ID and Password should be registered in Sign-On-Table.
TCT
All the terminals should be registered in Terminal Control Table.
PLT
All the programs that need to be automatically started during CICS start up and Shut down should be listed in Program List Table.
JCT
Control information of system logs and journal files is stored in Journal Control Table. Journal Control Program refers to JCT.

CICS-DB2-COBOL Program –Compilation
COBOL programs cannot recognize CICS commands. So all the CICS commands are coded within EXEC CICS and END-EXEC scope. The program is first passed to CICS Translator and the translator will convert all the CICS commands to COBOL call statements and this modified source is passed to COBOL compiler.

If your Program has DB2 commands then the sequence of preparing load module would be DB2 Pre-compiler, CICS Translator, COBOL Compiler and Link editor. Logically speaking the order of DB2 precompiler and CICS translator can be reversed also. But as a convention we are first doing precompilation.

If translation is done first, CICS translator tries to recognize to DB2 statements and would issue diagnostic messages. The other reason is, most of the programs do lot of DB2 operations than CICS operations. So if you do pre-compilation first, all the DB2 statements are converted into COBOL call statements in first phase itself and the translation time would be less.

          COBOL-CICS programs should be compiled with RENT RESIDENT NODYNAM and LIB options.

General Syntax of CICS statement
EXEC CICS function
          [(option (argument value)]
[(option (argument value)]
END-EXEC.
Restricted COBOL commands in CICS environment

OS SVC Triggering statements
ACCEPT CURRENT-DATE DATE DAY DISPLAY

I/O statements
OPEN CLOSE READ WRITE REWRITE DELETE START
SORT statement
RETURN RELEASE

VS COBOL 2 allows STOP RUN and that returns control back to CICS.

MAP DESIGN
          Before get into program design, let us see how maps (screens) are designed in CICS. Most of the installations use tools like SDF for screen designing. The tools generate BMS macros for the designed screen. We brief the BMS macros involved in the map design. BMS is acronym for Basic Mapping Support.

MAP and MAPSET
          A screen designed thru BMS is called MAP. One or a group of maps makes up a MAPSET.

PHYSICAL MAP AND SYMBOLIC MAP
Physical maps control the screen alignment, sending and receiving of CONSTANTS and data to and from a terminal. They are coded using BMS macros, assembled and link edited into CICS LOAD LIBRARY. They ensure the device independence in application programs.

Symbolic maps define the map fields used to store the VARIABLE data referenced in COBOL program. They are also coded used BMS Macros. But after assembling, they are placed in a COPY library and then copied into CICS programs using COPY statement. They ensure device and format independence to the application programs.

BMS Macro Coding Sheet

Since BMS map definitions are purely assembler macros, the following coding convention must me maintained.

 


1             10         16                                                                        72
(1-8) Label    (10-15) Macro name     (16-71) Operands                72-Continuation.  
      
Macro name. There are three macros used in BMS coding. 
1. DFHMSD. Defining Mapset
2. DHMDI.   Defining Maps
3. DFHMDF. Defining Fields.
All the BMS coding starts with DFHMSD followed by one or more DFHMDI. One or more DFHMDF follow DFHMDI.

Label: Label is name of the operation. If the macro is DFHMSD, it specifies map-set name. If the macro is DFHMDF then it specifies field name.
Operands: Define the parameters for the macro being invoked.
Continuation: Continuation of macro is achieved by  ‘X’ in 72nd column of the current line and continues from the 16th column of next line.
Comments: Comment lines are indicated by ‘*’ in column 1. A comment line cannot be placed between continuation lines and comment lines cannot be continued.
Blank lines: You cannot have blank lines in the assembler program.

DFHMSD
          It is used to define a mapset with its characteristic and to end a mapset. So you will find two DFHMSD in any BMS coding. The important operands are below:

TYPE.
It should be DSECT for Symbolic map generation, MAP for physical map generation and FINAL to indicate the end of mapset. Alternatively symbolic parameter &SYSPARM can be coded in the TYPE of defining DFHMSD and the value can be overridden in the PARM parameter of assembly procedure. This avoids the change in the BMS coding.

MODE.
IN for input maps like order entry screens and OUT for output maps like display screens and INOUT for input-output maps like update screens.

LANG.
It specifies the language in which the symbolic map is to be generated. It can be COBOL, PLI, ASM or RPG.

STORAGE.
AUTO is used to acquire separate symbolic map area for each mapset.
BASE=MAP-IOAREA allows multiple maps from more than one mapset to share 
same storage area. MAP-IOAREA will be redefined multiple times to achieve it.

TIOAPFX.
It should be ‘YES’ to reserve the prefix space of 12 bytes for BMS commands to access TIOA properly. This is required for command level CICS.

CTRL.
Device control requests are placed here. Multiple parameters are separated by comma. FREEKB is used to unlock the keyboard. FRSET is used to reset the MDT of all the fields in all the maps to zero. ALARM is used to set an alarm at screen display time. PRINT is used to send the mapset to printer.

TERM.
If anything other than 3270 terminal is used for display of screens, then it should be coded here. This ensures device independence by means of providing the suffix. SUFFIX is used to specify suffix for the terminal and it should correspond to TCT entry of the terminal.

DFHMDI
          It is used to define a map with its characteristic in a mapset. There can be any number of DFHMDI. Some of the important operands of DFHMDI are below:
SIZE.            It has two arguments namely length and breadth and as a whole the
size of the map is specified here.
LINE.            The map starting line is mentioned here.
COLUMN.       The map-starting column within the LINE is mentioned here.
JUST.            RIGHT or LEFT is coded here to inform the justification of the map within mapset.
The above four parameters decides the size and location of map within map set. CTRL and TIOAPFX can be also coded in DFHMDI. Value of DFHMDI overrides the value of DFHMSD.

DFHMDF
          It is used to define a field with its characteristic in a map. There can be any number of DFHMDF within DFHMDI. Some of the important operands of DFHMDF are below:

POS.
It has two arguments that decided the position of the field. The two arguments are line and column. It is the position where the attribute byte of the field starts.

LENGTH.
The length of the field is coded here. It excludes the attribute character.

ATTRIB.
All the input and output fields are prefixed by one byte attribute field that defines the attributes of the field. Some of the attributes are:
1.    ASKIP/PROT/UNPROT          Mutually exclusive parameters that define the type of the field. UNPROT is coded for input and input-output fields. PROT is coded for output and stopper fields. ASKIP is coded for screen literals and skipper fields. The cursor automatically skipped to next field and so you cannot enter data into skipper field.
2.    NUM.                               0-9,Period and – are the only allowed characters.
3.    BRT/NORM/DRK                 Mutually exclusive parameters that define the intensity of the field.
4.    IC                                    Insert Cursor. Cursor will be positioned on display of map. If IC is specified in more than one field of a map, the cursor will be placed in the last field.
5.    FSET                                Independent of whether the field is modified or not, it will be passed to the program. MDT is set for the field.

JUSTIFY.
RIGHT is the default value. Code LEFT for numeric fields.

PICIN and PICOUT.
It defines the Picture clause of the symbolic map in COBOL and useful for numeric field editing.

INITIAL.
The default value of the field is coded here. When the MAP is sent, this value will appear in the field. The constant information like TITLE is coded using INITIAL keyword of field definition. To avoid data traffic, these constant information fields should not be coded without LABEL parameter. If there is no LABEL parameter, then symbolic map will not generated for those fields as they are unnamed fields

How a field looks like in a Symbolic map 
Let the label of one DFHMDF is EMPNAME in the map EMPDET and the length of it is 20. The respective symbolic map would look like follows.

01 EMPDETI.
     02 FILLER PIC X(12)                        TIOAPFX = YES creates this 12 byte filler.
     02 EMPNAMEL PIC S9(04) COMP.      Length Field
     02 EMPNAMEF PIC X.                       Flag byte
     02 FILLER REDEFINES EMPNAMEF.
          03 EMPNAMEA PIC X.                  Attribute byte
     02 EMPNAMEI  PIC X(20).                 Actual field (Input)
Other fields….
01 EMPDETOO REDEFINES EMPDETI.
    02 FILLER PIC X(12)                        TIOAPFX = YES creates this 12 byte filler.
    02 FILLER PIC X(03)   
    02 EMPNAMEO  PIC X(20).                 Actual field (Output)
Other fields…

So four fields are generated for every named field in the BMS.
Fieldname+L
It has length of the field entered by the user during the input operation.
Fieldname+I 
It is the actual input field that carries the entered information. The value of this field is X’00’ if no data is entered. The space corresponds to X’40’.
Fieldname+A
It is attribute byte. It defines the attributes of the field.
Fieldname+F
It is a flag byte. It has X’00’ by default. It will be set to X’80’ if the user modifies the field but no data is sent. That is when the user pressed clear key over the field.
Fieldname+O
This field should be populated in the program before sending the screen to display.
Please note that the words INPUT (RECEIVE) and OUTPUT (SEND) are with respect to program.

More on Attribute field
We have just seen that attribute field is of 1 byte that specifies the attributes of the field. One byte is of eight bits and the values in each bit has its own meaning.
For example,
Bit 2 - ‘0’ indicates the field is unprotected and ‘1’ indicates the field is protected.
Bit 3 – ‘0’ indicates the field is alphanumeric and ‘1’ indicates the field is numeric.
Bit 2 and 3 – ‘11’ indicates that the field is Auto-skip.
Bit 4 and 5 – ‘00’ indicates Normal intensity and non-detectable.
                    ‘01’ indicates Normal intensity and detectable.
                   ‘10’ indicates High intensity and detectable.
                   ‘11’ indicates Dark and Non-detectable.
Bit 7 – ‘0’ indicates MDT is OFF ‘1’ indicates MDT is ON.


Modified Data Tag(MDT)
MDT is one bit field of the attribute byte. The program can receive only the fields with MDT ‘1’ on RECEIVE. Effective use of MDT can reduce the data traffic drastically in the communication line.

MDT can be SET/RESET in the following ways.

1.    When the user modifies the field, the MDT of the field is automatically set to ON.
2.    CTRL=FRSET of DFHMSD or DFHMDI will RESET the MDT to ‘OFF’ for all the fields in the mapset or map. FSET keyword of the attribute operand definition of DFHMDF will set the MDT to ‘ON ‘. It overrides the FRSET definition for the specific field.
3.    Before sending the screen, by overriding the MDT bit of attribute byte of field the MDT can be set to ‘ON’.

If you are specific on the values of some fields independent of whether the user has modified or not, code them with FSET. One good example is default values for the input fields (like Order received date). If the user finds default value (current date) in the screen and it is fine with his requirement, then he won’t touch the field and MDT will not be set. The program cannot receive the field as MDT is OFF.
But actually the program needs this field. So this field should have been defined with FSET.

CURSOR Positioning
          Positioning of cursor is an important area in screen design. By default, the cursor will be placed in the first unprotected field.

Static Positioning.
If IC is coded in the attribute operand of DFHMDF macro, then the cursor will be placed in that field. If IC is coded in more than one field, then last field with IC will get the cursor.

Symbolic Positioning.
Move –1 to length of the field where you want place the cursor and send the map with CURSOR option. This is device independent method and recommended to control the cursor position dynamically.

Relative Positioning.
Send the map with CURSOR(value) option. This will set the cursor at the position coded by ‘value’, relative to the first column of the screen. This is device dependant method of dynamic cursor positioning and not recommended. When there is change in screen layout, the program needs to be modified.
CURSOR(30) will place the cursor in the 30th column. (First line first column is ZERO).

Cursor Position.
EIBPOSN of DFHEIBLK contains the offset of cursor position in the screen when the data was transferred to program from the terminal.(relative to zero). It is half word binary field.



Dynamic attribute setting
          Any attribute of the field can be modified in the program by setting the bits of attribute field properly. Changing the attribute in the program in a dynamic method.
CICS provides the standard attribute character list in the form of copybook. (DFHBMSCA). This can be copied into our application program using COPY statement and we can use the variables in the copybook to change the attribute of a field in the program.
For example, if the information entered by the user in a particular field is failed in validation, then as a usual practice, in addition to throw an error message in the bottom of the screen, you may wish to hi-light the field that is in error.
MOVE DFHUNIMD to FIELDA.  == > Will achieve this.

SKIPPER and STOPPER field
Skipper is unlabelled one byte field with the auto-skip attribute and stopper is unlabelled one byte field with protected attribute.
Skipper field skips the cursor to next field when the current field is filled up to its full length, whereas stopper field stops entering any more character after the length of the field is reached. The user has to press RESET key to proceed further. 
Skipper field is used to speed up the user entry and recommended to code at the end of each unprotected field. Stopper field is coded based on requirement and importance of the field. Stopper field usually follows the last unprotected field in the screen.

BMS INPUT-OUTPUT OPERATIONS
Basic BMS input-output operations are carried out using the following commands. RECEIVE MAP, SEND MAP, SEND CONTROL, SEND TEXT, SEND PAGE.

RECEIVE MAP.
It is used to receive the information entered by the user into program. If INTO is not coded, then CICS automatically finds the symbolic map area (mapname+I) and places the mapped data. The values of the field can be read in the program by referring to fieldname+I.
EXEC CICS RECEIVE MAP(map-name) MAPSET(mapset-name) END-EXEC.
The option TERMINAL ASIS overrides the upper-case translation specified in the TCT. As we already discussed, if the user didn’t modify any of the fields then  MDT will be ‘OFF’ for all the fields. Zero bytes transmission results MAPFAIL exception error.

SEND MAP.
This is used to send a map to a terminal. Before issuing this command, the application program should prepare the data in the symbolic map area. If FROM is not coded, then CICS automatically finds the symbolic map area (mapname+O) and takes the data to the terminal.
EXEC CICS SEND MAP(map-name) MAPSET(mapset-name) END-EXEC.
Other Options in SEND MAP are:
ERASE. Erases the screen before displaying the MAP. When you first time throw the screen, it should be specified with ERASE. It will not be coded when you just want to display the error messages over the current screen.  ERASEUP erases only the unprotected fields of the screen before displaying the MAP.
DATAONLY. Only symbolic map data is sent to the terminal.
MAPONLY. Only physical map data is sent to the terminal. FROM cannot be coded.
FREEKB, ALRAM and FRSET can be also coded and the meaning is already discussed.
TEXT Building- SEND-TEXT, ACCUM and PAGING
Text streams can be sent to the terminal without any pre-defined BMS maps. This is called text building. Text streams can optionally have header and trailer.

Syntax the SEND TEXT command is:
          EXEC CICS SEND TEXT
                           FROM(data-value)
                         LENGTH(data-value)     
                         [HEADER(data-value)]
                         [TRAILER(data-value)]
                         [ERASE] [ACCUM] [PAGING]
          END-EXEC.

When to code ACCUM?
The text stream can consist of multiple paragraphs and the building of message can happen in multiple stages. If you want to send the text stream only after the building of all the paragraphs, use ACCUM option for the SEND-TEXT of every individual paragraph being built. They are accumulated and will not be sent immediately.
Once the page is built with complete message of all the paragraphs, issue SEND PAGE command that will send the complete text-stream to the terminal. HEADER is placed in the first SEND-TEXT and TRAILER is placed in the SEND PAGE.

When to code PAGING?
ACCUM alone is enough if the text-stream can fit within a single page.
But if the text stream is expected to exceed one page, then code PAGING in all the
SEND-TEXT commands in addition to ACCUM option. The last SEND-PAGE command sends the first page of message to the terminal.
The user can enter paging commands or keys to walk through the pages. 
To use keys instead paging commands, the keys should be mapped with paging commands in the System Initialization Table (SIT).  Usually there will be a mapping for PF7 and PF8 with page up and page down commands respectively. PURGE MESSAGE is used to purge the message that is accumulated but not yet send.

Format of HEADER and TRAILER
If TEXT-HEADER is the variable used in HEADER command and the header is
‘ORDER INVENTORY –Page nn- ‘, then the variable TEXT-HEADER should be defined as follows in working-storage section.

01 TEXT-HEADER.
      05 FILLER PIC S9(4) COMP VALUE 27.  => Length of the text.
      05 FILLER PIC X  VALUE ‘&’.                 => Character identifying automatic
                                                                     page number in the text.

      05 FILLER PIC X.                               => One byte control field used by BMS. 
      05 FILLER PIC X(27) VALUE ‘ORDER INVENTORY – Page && - ‘.
                                                            => Actual text in the header.

TRAILER also can be coded in the same way. Automatic- page-number-identifying character will be spaces for TRAILER working storage variable.
ACCUM and PAGING can be also used with SEND-MAP and the meaning is same.

SEND-CONTROL
          When the MAP is sent, we can specify device control options like FREEKB ALARM ERASE, along with SEND-MAP. If one wants to issue the device control options before sending the map, SEND CONTROL will be useful. It is used to establish the device control options dynamically.
Syntax:
EXEC CICS SEND CONTROL
                 [CURSOR(data-value)] [ERASE | ERASEUP] [FREEKB] [ALARM] [FRSET]
END-EXEC

PRINT Through BMS
          PRINT option of SEND MAP command allows the reports to be printed at the local printer connected to the terminal. In this case, MAP is sent to the printer and not to the terminal.
Syntax:
EXEC CICS SEND MAP(‘MAP-NAME’)
                         MAPSET(‘MAPSET-NAME’)
                         PRINT
                          NLEOM
END-EXEC.
NLEOM option is recommended with PRINT option. When this option is used,
1.    BMS builds the data stream using new line characters and blank characters to position the fields on the printer page.
2.    The data stream is terminated by EOM (end of message) that stops printing. So printer buffer is efficiently used, allows larger pages to be printed from the same buffer that makes the printing faster.

Message Routing
A message can be routed to one or more terminals other than the direct
terminal with which the program has been communicating. The message eligible for message routing is, a message constructed by the SEND MAP command with the ACCUM option.
ROUTE command establishes the message routing environment and the SEND
PAGE command issued after ROUTE command sends the message to the destination.
Syntax:
EXEC CICS ROUTE [LIST(data-area)], [OPCLASS(data-area)],
                            [INTERVAL(hhmmss)|TIME(hhmmss)],
                          [TITLE(data-area)], [ERRTERM(name)]
END-EXEC.
LIST and OPCLASS name the route list and operator class codes respectively. INTERVAL / TIME determines the actual timing of message delivery in the time interval or the time respectively.
TITLE names the title field defined in the working storage section and
ERRTERM specify the terminal ID where the error message (if any) to be sent.
Route list is prepared in working storage using the following convention.
TTTTrrOOOsrrrrrr – 8 bytes named ‘r’ are declared as spaces. TTTT names the terminal identifier as in TCT and OOO specify the operator id as in SNT. s is status flag. Code as many 16 bytes fields as the destinations and indicate end of route list is with the declaration of half word binary field with –1 value.
The message can be routed to every terminal at which users of the specified operator class is signed on. This is done using OPCLASS.

Program Design

Pseudo logic in CICS programs is achieved in three ways.

1.Multiple Programs and Multiple Transaction Ids.                              
          The conversation program is logically and physically divided into multiple programs and each program is registered with one transaction ID. Each program issues RETURN command with next transaction ID. So after the screen is sent, the first program will be terminated. Once the user filled up the information in screen and press ENTER, the next program of the next transaction ID (returned by the first program) gets control and the same process is followed for n programs.
Advantage:       Easy development and maintenance.
Disadvantage:   Possible Code redundancy and number of PCT and PPT entries.

2.Multiple Transactions and single program.
First paragraph of the procedure division controls the flow the different sections of the program based on the transaction identifier stored in EIBTRNID.
Every section ends with RETURN command with next transaction to be invoked on completion of the screen information by the user.
Thus the conversational program is logically divided than physical division.
Advantage:      PPT entries are less compared to case 1.
Disadvantage:  Number of PCT entries are still the same as case 1.

3.One transaction and One program. (Preferred way)
RETURN command has an optional parameter of COMMAREA and LENGTH. Using this parameter we can pass information between the transactions.
So first paragraph of your program will check whether this is the first entry or
nth entry. If EIBCALEN is zero, this is first entry. So divert the program to the section that will do all initial processing and throw the first screen for the user.
In addition to this it updates COMMAREA with some control information like internal transaction identifier. This COMMAREA is passed along with RETURN TRANSID. So EIBCALEN is updated with LENGTH of COMMAREA. The second and nth entrances don’t have EIBCALEN as zero and so based on the information in the COMMAREA, transfer the control to different sections of the program.

Task Initiation Process
          1.User entered transaction identifier.
          2.Terminal Control Program along with Terminal Control Table recognizes the incoming data from the terminal.
          3.Storage Control Program acquires the storage for the terminal input output area (TIOA)
          4.Terminal Control Program places the data from the terminal into TIOA and sets the pointer into TCT entry of the terminal.
          5.If there is no task is associated with the terminal, then TCP gives the control to task Control Program, which realizes the transaction identifier in the data in TIOA. (KCP)
          6.SCP acquires the storage area for task control area (TCA) in which KCP prepares the control data for this task.
          7.KCP refer PCT to identify the program associated with the transaction.
          8.Program Control Program (PCP) loads the program into main memory from the load library and gives the control back to KCP.
          9.KCP gives the control to application program loaded into main memory.
          10.Program started processing – Task is initiated.
Ways of Data Passing between transactions

1. By COMMAREA.
          In the example below, Working Storage item WS-ITEM of length WS-LENGTH is passed to the transaction EMPC. The program for the transaction ‘EMPC’ should have DFHCOMMAREA of size WS-LENGTH in the linkage section to receive the information passed by RETURN of this program.

EXEC CICS
RETURN TRANSID(‘EMPC’) COMMAREA(WS-ITEM) LENGTH(WS-LENGTH)
END-EXEC

WS-LENGTH is full word binary and the maximum length that can be specified is 64K. So we can pass data of maximum size 64K. But it is recommended not to pass more than 24K.
LINK and XCTL can also have use COMMAREA to pass the information to the program being called and the concept is same.

 2. Queues.
          There are two types of queues TSQ and TDQ. TSQ can be used as scratch pad in main memory. You can write as much as you want in TSQ and they will be available to all the transactions that are aware of the queue name. TSQ is primarily used to share huge amount of information across the transactions. Refer Queues section for more details.

3. TCTCA, TWA, CWA.
           TWA – Transaction work area – One per task  - Work area associated with the task.
          TCTUA – Terminal Control Table User Area – Work area associated with a terminal and defined as one per terminal in TCT.           
          CWA   - Common work area – System work area defined by system programmer in SIT. (System Initialization Table)
We can use TWA, TCTUA and CWA for sharing the information across the transactions.

External address ability using BLL CELLS of OS/VS COBOL
          Base Locator for Linkage is used to access the memory outside you working storage. If it is used in input commands like READ, RECEIVE, the performance will be good as we would be directly accessing the input buffer than working storage item.
If you want to access system areas like CWA, TCTUA or CSA that exist outside your program, then you should use BLL.

Code Linkage section as below:
01 PARM-LIST.
          05 FILLER                PIC S9(08) COMP.
          05 TCTUA-PTR          PIC S9(08) COMP.
          05 TWA-PTR            PIC S9(08) COMP.

01 TCTUA-AREA.
          05 TCTUA-INFORMATION PIC X(m).
01 TWA-AREA.
          05 TWA-INFORMATION PIC X(n).

The mapping between the pointers and data area is done in linkage section as follows.
First filler is points the current 01 level, which is PARM-LIST itself.
TCTUA-PTR points to next 01 level, which is TCTCA-PTR
TWS-PTR points to next 01 level, which is TWA-PTR.

In the procedure division, code the following:
EXEC CICS ADDRESS TWA(TWA-PTR)  TCTUA(TCTUA-PTR) END-EXEC.
SERVICE RELOAD TCTUA-AREA
SERVICE RELOAD TWA-AREA

          This will store the pointer of TWA in TWA-PTR and TCTUA in TCTUA-PTR.
As the mapping between BLL cells and areas is already done in linkage section,
TCTUA-AREA can access m bytes of TCTUA, which exist outside your working storage and similarly TWA-AREA to access n bytes of TWA, which exist outside your working storage area.

To ensure the addressability, SERVICE RELOAD statement should follow whenever the content of BLL cell is changed in anyway. So there should be a SERVICE RELOAD statement after the ADDRESS statement as follows.

Enhancement by VS COBOL2
          ADDRESS OF operator of VS COBOL2 easies the access of external items.
The above requirement can be met in VS COBOL2 as follows. There is no need for PARM-LIST or SERVICE RELOAD.

LINKAGE SECTION.
01 TCTUA-AREA.
          05 TCTUA-INFORMATION PIC X(m).
01 TWA-AREA.
          05 TWA-INFORMATION PIC X(n).

PROCEDURE DIVISION.
EXEC CICS ADDRESS TCTUA (ADDRESS OF TCTUA-AREA)
                              TWA(ADDRESS OF TWA-AREA)     
END-EXEC.
ADDRESS OF maps the TCTUA-AREA with TCTUA exists outside your working storage.

ASSIGN statement
          It is used to access the system value outside of application program.
Some of them are length of common areas, user-id.
CWALENG, TCTUALENG, TWALENG – assign to full word binary working storage item.
USERID                                      - assign to X(08) field.

EXEC CICS ASSIGN
                 USERID(WS-USERID)
END-EXEC
 The above command fetches the user id into WS-USERID.




EIB-Executive Interface Block
          When CICS translator translates your program, it adds DFHEIBLK copybook as the first entry in your linkage section. Whenever a task is initiated, the task related information could be accessed using the fields in the copybook. EIB is acronym for Executive Interface Block.

Some of the fields in EIB are:
EIBCALEN                         – Length of DFHCOMMAREA.
EIBDATE and EIBTIME         – Date and Time of task initiation.
EIBAID                    - The last attention identifier pressed by the user.
EIBFN                              - Function code of the last command.   (2 bytes)
EIBRCODE                         - Response code of the last command. (6 bytes)
EIBTRMID                         - Terminal ID
EIBTRNID                          - Transaction ID                

CICS PROGRAM LINKAGE SECTION
If you look into the translated source listing, the linkage section of CICS program might have the following. 
1.    DFHEIBLK (Introduced by Translator)
2.    DFHCOMMAREA (Coded by you as the first entry in linkage section.)
3.    PARM-LIST (BLL cells coded by you)
4.    Multiple 01 levels (The number of 01 entries is equal to number of BLL cells you have coded in PARM-LIST excluding the first BLL cell that points to PARM-LIST itself.)

GETMAIN and FREEMAIN.
GETMAIN command is used to obtain a certain amount of storage in the main memory.
EXEC CICS GETMAIN SET(ADDRESS OF LK-ITEM)
LENGTH(data-value)|FLENGTH(data-value)
INITIMG(data-value)
END-EXEC.

LK-ITEM is a linkage 01 item whose length is equal to length mentioned in the LENGTH parameter and that much memory will be allocated for you in the main memory. The initial value of this field will be set by INITIMG parameter.

EXEC CICS FREEMAIN DATA(LK-ITEM)
END-EXEC
The above command will release the main memory occupied by you using GETMAIN.

These commands are highly useful in macro level coding where the quasi-reentrancy is the responsibility of the application programmer. Quasi-reentrancy is guaranteed in the CICS command level COBOL programs and so the need and usage of these commands are almost obsolete.


LINK XCTL and CALL
It is good practice to develop several functional modules rather than building one lengthy program that does all the functions. It makes the program tough to maintain, understand and debug. The size of the program will be large and it also occupies more resources. Functional splitting of sub modules and calling or transferring the control to them is achieved by LINK, XCTL and CALL.

CICS programs are usually run at various levels. The first program, which gets the control from CICS, that is the program registered against the transaction in PCT, runs at first level. Linked and Called programs are running one level lower than linking or calling program and so the RETURN or GO BACK in these programs will give the control back to Linking or calling program. XCTL programs run at the same level and so the RETURN gives control to next upper level.

Syntax: EXEC CICS LINK|XCTL PROGRAM(name) COMMAREA(ws-area)
                             LENGTH(ws-length)  END-EXEC.

Ws-length is length of ws-area and ws-area has the information that needs to be passed to LINK/XCTL program. VS COBOL 2 allows reentrant program and so whatever is achieved using LINK or XCTL can be also achieved by COBOL CALL statement. The called programs should be attached to the main program during link edit and so the size of the load module will be large in this case.

Prefer XCTL whenever possible as it involves fewer overheads. If that is not possible then based on sub-program size and possible modification, go for LINK or CALL.  If the size of the program is less and used by only very few programs go for CALL as it wont increase the size much at the same time application will run fast.

If the program is expecting more changes, then calling program also need to be compiled for every change in sub program. In case of LINK, the compilation of linked programs is enough. Called CICS programs need not be registered in PPT whereas LINK and XCTL programs should be.


LOAD and RELEASE
LOAD is used to load the program or table that is compiled or assembled, link edited and registered in PPT. It is mostly used for loading the assembler table.

EXEC CICS LOAD PROGRAM(PGM1) SET (ADDRESS OF LK-ITEM)
LENGTH(WS-LENGTH)
END-EXEC

Program PGM1 is loaded and the address of the program or table is mapped to LK-ITEM and so the table can be accessed using the linkage are LK-ITEM. The size of the linkage item is WS-LENGTH. If ‘HOLD’ keyword is coded in the LOAD command, then loaded program or table will be permanently resident until explicitly released. If it is not mentioned, then termination of the task release the program or table.

EXEC CICS RELEASE PROGRAM(PGM1) END-EXEC is used to release the program or table.



AID and HANDLE AID
There are certain attention identifiers (AID) associates with every screen. Entry screens have ENTER and PF1 (Help) keys. Query screens have PF7 (Page Up), PF8 (Page down), PF1 (Help) and so on. Based on the key pressed by the user, the processing should happen in the program. EIBAID of DFHEIBLK has the last user pressed key. It can be verified in the program after the RECEIVE command.
For verification of values in EIBAID, Copy the standard AID list copybook provided by CICS in your program (COPY DFHAID). Now you can easily verify the key pressed as follows.
EVALUATE EIBAID
WHEN DFHENTER PERFORM PARA-1
WHEN DFHPF1 PERFORM PARA-2
WHEN OTHER PERFORM PARA-3
END-EVALUATE.
The above checking is done in COBOL and this kind of check has to be done after every RECEIVE command to properly route the flow. CICS provides its own routing processing based on the key pressed by HANDLE AID command. This will be effective through out the program and reduce the code redundancy. The routing will be automatically invoked on every RECEIVE.
EXEC CICS HANDLE AID
                             DFHENTER(PARA-1)
          DFHPF1(PARA-2)
          ANYKEY(PARA-3)
END-EXEC.

HANDLE CONDITION and NO HANDLE
Every CICS command has its own exception list. One example is MAPFAIL exception of RECEIVE command. HANDLE CONDITION is used to transfer control to the proper procedure on expected exceptions.  HANDLE condition cannot track program interrupted ABENDS like S0C4 or S0C7. It deals only with exceptions of CICS commands.
The conditions handled are effective from where it appears to the end of the program. One Handle Condition can be overridden by another condition. The main program conditions will not be effective in sub-programs. 

EXEC CICS HANDLE CONDITION
          MAPFAIL(PARA-1)
          PGMIDERR(PARA-2)
          LENGERR(PARA-3)
          ERROR(PARA-X)                          
END-EXEC.
= >Any error condition other than MAPFAIL,PGMIDERR and LENGERR will transfer the control to PARA-X.
If you want to reset the diversion done by previous HANDLE condition, code the condition name but don’t mention the paragraph name. Maximum 12 conditions can be coded in one HANDLE CONDITION statement.
If you want to deactivate all the conditions for a particular CICS command, code NOHANDLE. There are possibilities for infinite loop when the CICS command in the exception routine of the HANDLE CONDITION ends with same exception. In the above example, if the there is LENGERR in PARA-3 for any of the CICS command coded there, then the control again come to PARA-3 and forms infinite loop. In such cases, NOHANDLE will be useful (in the ABEND routine CICS commands).

IGNORE CONDITION.
The syntax is same as HANDLE CONDITION but it causes no action to be taken if the specified condition occurs in the program. The control will be returned to the next instruction following the command, which encountered the exceptional condition. It will be effective from the place where it appears to the end of the program or until any HANDLE condition overrides it.
Maximum 12 conditions can be coded in one IGNORE CONDITION statement.

RESP
          Like the file status verification of batch COBOL program, SQLCODE verification of DB2 program, the success or failure of CICS command can be done using COBOL statements and this give more structured look for the program.
To achieve this, code RESP along with CICS command. CICS will place the result into the variable coded in RESP. It can be checked against DFHRESP(NORMAL) or DFHRESP(condition) and appropriately control the flow following the command.

EXEC CICS RECEIVE MAP(A) MAPSET(B) RESP(WS-RCODE) END-EXEC
EVALUATE WS-RCODE
WHEN DFHRESP(NORMAL) PERFORM PROCESS-PARA
WHEN DFHRESP(MAPFAIL) PERFORM PARA-1
WHEN OTHER PERFORM PARA-X
END-EVALUATE.
WS-RCODE should be defined as full word binary in working storage. If you code RESP, then HANDLE CONDTION will not be effective for those CICS commands.

PUSH and POP.
          They are used to suspend and reactivate respectively, all the HANDLE CONDITION requests currently in effect. In real life programming, you may want to deactivate all the active handle conditions and diversions for a subroutine (section) embedded in the program. This can be achieved using PUSH HANDLE. When you come out of that section, you can reactivate all the pushed commands and that can be done using POP HANDLE.

HANDLE ABEND
          HANDLE CONDITION command intercepts only abnormal conditions of the CICS command execution whereas HANDLE ABEND takes care of any abnormal termination within the program.

EXEC CICS HANDLE ABEND
       LABEL(ABEND-ROUTINE)|RESET|CANCEL
END-EXEC.
LABEL is to activate an exit. CANCEL is used to cancel the previously established HANDLE ABEND request. RESET is to reactivate the previously cancelled HANDLE ABEND request.

USER-ABEND
In batch COBOL, the user ABENDS can be thrown by calling the assembler routine ILBOABN0 using AB-CODE whereas AB-CODE is working storage field of half word binary.
The following command is used to throw user ABENDS in CICS.
EXEC CICS ABEND ABCODE(‘9999’)
END-EXEC is used to throw user ABEND 9999.

FILE-HANDLING.
CICS supports only VSAM and BDAM files. All the files, that you want to use in your CICS application, should be registered in FCT with their complete attributes.
CICS commands refer the FCT entry name for doing operation on the file. 

As all the files are already declared and defined in tables, coding File-Control Paragraph of ENVIRONMENT division or FILE SECTION of DATA DIVISION is meaningless and not required. Thus CICS frees the application program from any data dependant coding.

The unit of IO during READ is one control interval. So even you read one record into your program, the complete control interval is read into main memory buffer. The size of control interval is preferred to be large for sequential processing and small for random processing.

The file should be OPEN to issue an I-O command. The status of the file can be queried using the master transaction CEMT. It can be OPENED, CLOSED, ENABLED or DISABLED. This explicit opening or closing can be done using CEMT.
But this needs human intervention.

CICS Version 1.7 introduces automatic opening of the file if it is not in open status during the access. It is always better to close it the when you no longer need it. DFOC (Dynamic File Open Close) can be done in program using the SET command or linking to DFHEMTP.

DFOC BY LINK COMMAND
          The application program links the master terminal program (DFHEMTP) and passes CEMT parameter data required for the file open/close through COMMAREA.
Receiving the data, DFHEMTP program opens/closes the files specified, after which the control is returned to the application program.

EXEC CICS LINK PROGRAM(DFHEMTP)
                             COMMAREA(WS-COMMAREA)
                             LENGTH(WS-LENGTH)
END-EXEC

The file open command is written into WS-COMMAREA and its length is populated in WS-LENGTH.
File Open Command: SET DATASET(FCT-NAME) OPENED
         
DFOC BY SET COMMAND     

EXEC CICS SET
         DATASET(name) | FILE(name)
         OPEN|CLOSED
END-EXEC

DFOC BY BATCH JOB
          DFOC can be achieved from a batch job, which issues the CEMT as the data for the JES Modify (F) command against the system console terminal.
// F cicsjob, ‘CEMT SET DATASET(FCTNAME) OPENED’


RANDOM ACCESS OF FILES

READ: EXEC CICS     READ FILE(FCT-NAME)  [UPDATE]                                S1
                             INTO(WS-ITEM) | SET (ADDRESS OF LK-ITEM)               S2     
                             LENGTH(WS-LENGTH)                                                S3
                             RIDFLD(WS-KEY)                                                      S4
                             KEYLENGTH(WS-KEY-LENGTH) GENERIC                        S5     
                             SYSID(SYSTEM-NAME)                                               S6
                             GTEQ | EQUAL                                                          S7
          END-EXEC.

S1.     Reads the file and if update is intended then code UPDATE clause. This will get exclusive access over the complete control interval where the specific record exists, during the READ. Thus CICS ensures data integrity.

S2.     Read the file into working storage variable WS-ITEM. Alternatively, the address of the record in the input-output area can be mapped to linkage section variable by using SET command. Performance-wise SET is better than READ INTO. VS COBOL2 supports ADDRESS of keyword and makes the code easier. In the prior version COBOL, PARM list and SERVICE RELOAD should be used to achieve the same.

S3.     After the READ, the LENGTH of the record READ is updated into WS-LENGTH. WS-LENGTH is the working storage half word binary item.

S4.     Key of the record to be read is moved into WS-KEY, a working storage item and a part of record structure (WS-ITEM).

S5.     If partial key is used, then the length of the partial key should be moved to
WS-KEY-LENGTH and the keyword GENERIC should be coded. This is optional for full-key read.

S6.     Remote system name where the request to be directed, is coded here. (1-4 character name)

S7.     EQUAL is default. GTEQ can be coded when you know the full key, but you are not sure the record with that key exists in the file.

REWRITE

EXEC CICS REWRITE FILE(FCT-NAME)
                             FROM(WS-ITEM)
                             LENGTH(WS-LENGTH)
                             SYSID(SYSTEM-NAME)
END-EXEC.

To release the exclusive access acquired during the READ with UPDATE, the record should be REWRITTEN using the above syntax. The parameters are self-explanatory.
After you read record, if you feel that you don’t want to update it, then inform the same to CICS by issuing UNLOCK command so that CICS release the lock acquired by you on the record.
EXEC CICS UNLOCK FILE(FCT-NAME) END-EXEC.

WRITE

The syntax of WRITE is same as REWRITE. There is a parameter RIDFLD with Key-value is coded in the WRITE command. (Like S4 for READ command)
When you want to add a set of records whose keys are in ascending order, then qualify your first WRITE with another parameter MASSINSERT. This will get exclusive control over the file and provide high performance during the mass insert.
If you use MASSINSERT, then you should issue UNLOCK to inform the completion of your additions. CICS releases the file on UNLOCK.

DELETE

1.The record read using READ with UPDATE can be deleted using
EXEC CICS DELETE DATASET(FCT-NAME) END-EXEC.
2.The record in the file can directly be deleted by providing complete key.
EXEC CICS DELETE DATASET(FCT-NAME) RIDFLD(WS-KEY) END-EXEC.
3.Group of records can be deleted using partial key. After the deletion, the number of records deleted is updated in the variable coded in NUMREC parameter. (WS-DEL-COUNT)
EXEC CICS DELETE    DATASET(FCT-NAME)
RIDFLD(WS-KEY)
KEYLEGNTH(WS-KEY-LENGTH) GENERIC
NUMREC(WS-DEL-COUNT)
END-EXEC

SEQUENTIAL READ:
          Sequential access of VSAM file under CICS is called Browsing. It has FIVE Commands associated with it.

STARTBR.
It establishes a position to start browsing.

EXEC CICS STARTBR FILE(FCT-NAME) RIDFLD(WS-KEY)
                             KEYLENGTH(WS-KEY-LENGTH) GENERIC
                             REQID(Integer-value)
                             SYSID(SYSTEM-NAME)
                             GTEQ | EQUAL
END-EXEC.

Meaning of the parameters is same as READ operation explanation. When you want to do multiple browsing concurrently over the same file, then use REQID. The first STARTBR can be coded with REQID(1) and the second STARTBR can be coded with REQID(2).
One browse operation occupies one string of VSAM. If all VSAM strings are exhausted for one VSAM file, then the other transactions will have to wait for one of the strings to become free. So it is not recommended to use multiple browsing. Instead, once the browsing is completed, using RESETBR set the position to another place and start browsing. The syntax of RESETBR is same as STARTBR.





READNEXT and READPREV.

EXEC CICS READNEXT| READPREV FILE(FCT-NAME) RIDFLD(WS-KEY)
                                                INTO(WS-ITEM)
                                                LENGTH(WS-LENGTH)
                                                KEYLENGTH(WS-KEY-LENGTH)
                                                REQID(INTEGER-VALUE)
                                                SYSID(SYSTEM-NAME)        END-EXEC.

READNEXT is used to read the records in the forward direction from the position established by STARTBR. READPREV is used to read the records in the reverse direction. READPREV followed by READNEXT retrieves the same record once again.
                            
During the browse, if you want to skip set of records, then move the key of the next record you intended to read to RIDFLD and then issue READNEXT. This is called skip sequential read. Thus RIDFLD can be used as both input as well as output field.
As VSAM files are variable length in most of the cases, WS-LENGTH should be populated with maximum record length before issuing READ command.
KEYLENGTH(0) will position the cursor at the beginning of the file.

If you specify READPREV immediately after STARTBR, then you should code key of a record that exists on the dataset. Otherwise NOTFND condition occurs on READPREV.

ENDBR
It is used to terminate the current browse function.
EXEC CICS ENDBR FILE(FCT-NAME) REQID(INTEGER-VALUE) SYSID(SYSTEM-NAME)
END-EXEC.

UPDATE during BROWSE
Update and Browse are mutually exclusive functions. So if you want to update a record during the browse operation, first issue ENDBR. Then give random read using the key in hand with UPDATE option. REWRITE the record. Then issue STARTBR with the key in hand and continue the browsing.

ESDS-BROWSING
Define a full-word binary item in working storage for the RBA of ESDS file. Move LOW-VALUES or HIGH-VALUES to the field for the forward or reverse read respectively. Issue STARTBR with RBA and EQUAL option. RIDFLD should point to defined RBA field. Now issue READNEXT or READPREV for forward or REVERSE read respectively.
GTEQ is invalid for ESDS.

MOVE LOW-VALUES TO ESDS-RBA
EXEC CICS STARTBR FILE(FCT-NAME) RIDFLD(ESDS-RBA) RBA EQUAL END-EXEC
MOVE 226 to WS-LENGTH.
EXEC CICS READNEXT FILE(FCT-NAME) INTO(WS-ITEM) RIDFLD(ESDS-RBA) LENGTH(WS-LENGTH) RBA
END-EXEC.


ESDS-WRITE
The syntax is same as KSDS WRITE command. Qualify the WRITE with RBA option. The record will be appended to the file and the RBA of the record is placed into RBA field mentioned in the WRITE command. (ESDS-RBA)

MOVE 225 TO WS-LENGTH
EXEC CICS WRITE FILE(FCT-NAME) RIDFLD(ESDS-RBA) LENGTH(WS-LENGTH) RBA
END-EXEC.

ESDS-RANDOM ACCESS
If you know the RBA value of the record you want to access, then you can randomly access the ESDS file. The syntax is same as READ of KSDS file but qualify it with RBA option. RIDFLD should point to full-word binary item pre-filled with RBA of the record to be accessed.

RRDS ACCESS
    RRDS file can be accessed using RRN in place of RBA and populating the RIDFLD with RRN number. The field should be full word binary.

Alternate Index access
Register the path in FCT and use the path name as file name to read the file randomly using alternate index. Please refer VSAM section of the book for understanding what exactly PATH is.
As the alternate key need not be unique, DUPKEY condition is very common during the alternate index usage and so it has to be properly handled.






ASKTIME
EIBDATE and EIBTIME have the values at task initiation time. Upon the completion of ASKTIME, these two fields are populated with current date and time.
     EXEC CICS ASKTIME END-EXEC.

FORMATTIME
FORMATTIME is used to receive the information of date and time in various formats. EXEC CICS FORMATTIME FORMAT-TYPE(data-area) END-EXEC
Format-type:  YYDDD, YYMMDD, YYDDMM, MMDDYY, DDMMYY, DAYOFWEEK, 
                      DAYOFMONTH, MONTHOFYEAR, YEAR, TIME, TIMESEP, and
            DATESEP.
Example:
EXEC CICS
     FORMATTIME MMDDYY(WS-DATE) DATESEP TIME(WS-TIME) TIMESEP
     END-EXEC

WS-DATE contains the current date in MM/DD/YY (Default DATESEP is ‘’/’)
WS-TIME contains the current time in HH:MM:SS (Default TIMESEP is ‘:’)

DELAY and SUSPEND
It is used to delay the processing of a task for a specified time interval or until the specified time. If your task is doing some heavy CPU bounded work, it is a good to place the DELAY command in order to allow the other tasks to proceed.
EXEC CICS DELAY INTERVAL(HHMMSS) | TIME(HHMMSS) END-EXEC.

SUSPEND is used to suspend a task. During the execution of the command, the task will be suspended and the control will be given to other tasks with higher priority. As soon as all higher priority tasks have been executed, control will be returned to the suspended task.
EXEC CICS SUSPEND END-EXEC.

POST and WAIT EVENT
POST is used to request notification when the specific time has expired and the WAIT EVENT command is used to wait for an event to occur. Usually these two commands are used in pair, as alternative to the DELAY command.
EXEC CICS POST INTERVAL(HHMMSS) | TIME(HHMMSS)
SET (ADDRESS OF POST-ECB) END-EXEC.
          END-EXEC
EXEC CICS WAIT EVENT ECAADDR(ADDRESS OF POST-ECB)
END-EXEC

CANCEL
It is used to cancel the interval control commands such as DELAY, POST and START which have been issued. The interval commands to be cancelled are identified using REQID.

EXEC CICS START REQID(‘STARTS’) END-EXEC.
EXEC CICS CANCEL REQID(‘STARTS’) END-EXEC.         Cancels all the starts issued.





START and RETRIEVE
START command is used to start a transaction at the specified terminal and at the specified time or interval. Optionally, data can be passed to the to-be-initiated transaction.
EXEC CICS START     TRANSID(‘EMPC’)  TERMID(‘TST1’)                               S1
                             TIME(123000)|INTERVAL(003000)                                S2
                             FROM(WS-ITEM) LENGTH(WS-LENGTH)                         S3
                             RTRANSID(‘EMPD’) RTERMID(‘TST0’)                            S4
                             QUEUE(‘EMPDET’)                                                     S5
END-EXEC.

S1.     EMPC is to be started at the terminal TST1
S2.     TIME and INTERVAL are mutually exclusive. If TIME(HHMMSS) is coded, then the task start at the terminal at the specific time. In the above example it is 12:30.
If INTERVAL(HHMMSS) is coded then the task will start after the expiry of the interval. In the example, the task starts after 30 minutes.
S3.     This program passes WS-ITEM of size WS-LENGTH to the task EMPC.
S4.     Transaction ID EMPD and Terminal Id TST0 are passed to EMPC. EMPC can receive this information and may use for next triggering.
S5.     TSQ queue name can be passed from this transaction. EMPDET is passed in our case.

The data passed by START command is received by the new transaction using RETRIEVE command upon the expiry of START command.

EXEC CICS RETREIVE INTO(WS-ITME)| SET(ADDRESS OF LK-ITEM)
                             LENGTH(WS-LENGTH)
                             RTRANSID(WS-TRAN) RTERMID(WS-TERM)
                             QUEUE(WS-QUEUE)
END-EXEC.

ENQ and DEQ
ENQ gets the exclusive control over the resource and DEQ releases the exclusive control acquired over the resource. As CICS takes care of exclusive access over the resource whenever needed, it is advisable not to use it in application programs.
But sometimes it may be needed in few cases like updating TSQ records or getting access of the printer.
EXEC CICS ENQ/DEQ RESOURCE(QUEUE-NAME) END-EXEC.

SYNCPOINT and TWO-PHASE-COMMIT
The updates done by a task is automatically committed at task termination. SYNCPOINT is used to commit portion of work completed without terminating the task.
EXEC CICS SYNPOINT END-EXEC.
During the program processing, if you want to roll back the changes made by you, then you can code SYNPOINT with ROLLBACK. This will backed out all resource modifications done since the last sync point.
EXEC CICS SYNCPOINT ROLLBACK END-EXEC.
SYNCPOINT in CICS-DB2 environment is called as two-phase commit.
The changes made in the resources that are directly under the control of CICS are committed in the first phase and the changes made to DB2 environment are committed in the second phase.
Queues

There are two types of queues available in CICS.
1.Temporary Storage Queue (TSQ)
2.Transient Data Queue (TDQ)

Their properties are listed below:

TSQ
No need to predefine anywhere. By default, TS queues are created in main memory. So the content cannot be recovered after system crash. If you want to recover, then you should define them in TST.

Records can be randomly accessed using ITEM option of READQ. READ is not destructive.

Deletion of queue deletes all the records in it. Deletion of recoverable TSQ should follow sync point before next WRITEQ.

Primarily used as scratch pad memory facility for any purpose.
Example: Page-up and Page-down logic, Passing huge data in between the phases of transaction, Review and correction of multiple order entry screens.

TDQ
TDQ should be predefined in DCT.

READ is destructive and only sequential. Once the record is READ, it will be logically deleted and cannot be read again.

Automatic Task Initiation: When number of records in the queue exceeds the TRIGLEV defined in the DFHDCT entry of the queue, the transaction coded in the TRANSID of DFHDCT is automatically triggered. This ATI is possible only in TDQ.

There are two types of TDQ – Intra and Extra partition. The DCT entry identifies the type of queue from TYPE parameter.

Intra Partition Queues are used within a CICS region and DELETEQ deletes all the records physically in the queue.

Extra partition Queues are used across the regions and systems. If you want to pass some data from CICS to batch or receive data from Batch to CICS, you should go for extra partition queue.

In the same program TDQ cannot be opened in both input and output mode.

TSQ are preferred over TDQ for data passing. TDQ is used for batch interface or on ATI requirement.







MRO and ISC
          Within one processor, there could be more than one CICS region, each of which runs independently under the same operating system. This is called Multi region Operation. (MRO) .It is achieved by four inter communication facilities.
1.Function Request Shipping.
2.Asynchronous Processing.
3.Transaction routing.
4.Distributed Transaction Processing.
          One CICS in one processor can communicate with other CICS in other processor or other non-CICS system regardless of where the other processor physically located. This is called Inter System Communication (ISC). It requires sophisticated communication networks based on the System Network Architecture (SNA).

MASTER TRANSACTIONS

CEMT:
This is Master Terminal transaction. It is menu driven and easy-to-use transaction but due to its nature of manipulating the CICS environment, most of the functions are restricted to application programmer or end user.
CEMT INQUIRE|SET|PERFORM
CEMT INQ TRAN|PRO|FILE – Display information from PCT|PPT|FCT
CEMT INW TASK               – Display the active running tasks in the region
CEMT SET command can be used to reset the values of PCT|PPT|FCT.
PERFORM has to be handled carefully. CEMT PERFORM SHUTDOWN will shut down the entire CICS region.
Frequently used commands:
CEMT SET PR(PGM-NAME) NEW  - To create a new copy of an application program
CEMT SET DA(file-name) CLO/OPEN        -  To close/open a file from CICS.

CECI:
This is Command Interpreter transaction. CICS commands can be pre-tested using this command before placing them into the program.
CEBR:
This is browse transaction. TSQ can be browsed using this transaction.
CEDF:
This is Diagnostic Facility transaction. If you want to debug your program step by step, then before typing transaction ID type CEDF so that debug mode will be set.
It intercepts a transaction at initiation and termination of a program, before and after execution of any EXEC CICS or EXEC SQL commands.
CMAC:  
This transaction is used to get ABEND codes and messages.


Different ways of initiating a transaction in CICS
1.By entering transaction identifier.
2.By START command.
3.By RETURN TRANSID 
4.By registering the programs in PLT, they will be automatically initiated during CICS startup.
5.Automatic Task Initiation of TDQ.
6.PF or PA keys could be defined in PCT to initiate a CICS transaction.

CICS Dump Analysis
Dump usually consists of Dump Header Area, TCA(User Area), TCA(System Area), Trace Table, Transaction Storage and Program Storage.

At the top of the ABEND dump, there is a dump header area, which provides ABEND code, TASK (the transaction ID), Program Status Word (PSW) and the contents of registers at the time of ABEND.

PSW.
It is a double word field containing the status information at the time of ABEND. 32nd bit says the addressing mode in use. If the addressing mode is 31 bits, then the bit will be ‘1’ and the bits 33 to 63 contains the next sequential instruction (NSI), which would have been executed if the ABEND had not occurred. 

First make sure that you have program compilation and link edited SYSPRINTS of the program ABENDED and dump prints of the ABENDED transaction is with you. Program should be compiled with LIST option.

Finding the statement caused the ABEND

1.Identify the address of next sequential instruction from the PSW.

2. From the program storage, identify the starting address of program storage.

3.Subtract the starting address of program storage from the NSI address identified in the first step, you will get the displacement of the NSI from the beginning of program storage.

4.Find the displacement of application program from the beginning of the load module in the link edit list and subtract this value from the calculated NSI displacement to get the real NSI displacement.

5.Find the statement in the compilation listing that corresponds to the OFFSET calculated in the previous step. The statement one above is the statement that caused the ABEND.

6.Analyse the statement for the cause of ABEND. This might have involved one or more fields. Most of the times, you can easily come to conclusion the cause of the ABEND once you identified the statement. If you could not, then you may check the value of the field at the time of ABEND as follows.

Finding the value of the field in error.
1.Find the Base Locator (BL), Displacement and length of the field from the MAP of compilation listing.
2. Find the register number corresponding to the base locator from the bottom of compilation listing.
3. Find the address of this register in the dump.
4. Add the displacement to the register of the address to get the address of the field.
5. Locate the address in the dump to get the value of the field.



CICS TABLE ENTRIES

FCT
All the VSAM files, PATH between base cluster and alternate index and any BDAM datasets are to be registered in FCT to access them in the application program.

DFHFCT         TYPE       =DATSET| FILE,
                   ACCMETH=BDAM | VSAM,
                   DATASET= name | FILE=name,
                   SERVREQ = (ADD, BROWSE, DELETE, READ, UPDATE),
                   [FILESTAT= (ENABLED|DISABLED, OPENED|CLOSED)],
                   [BUFND= n+1],
                   [BUFNI=n],
                   [STRNO=n],
                   [DSNAME=name],
                   [DISP=OLD | SHR],
                   [BASE=name],

ACCMETH defines data access method.
Name mentioned in the FILE parameter is the one with which we use in the CICS file commands. The name should correspond to the DDNAME of the file specified in the JCL of the CICS job itself. If DSNAME and DISP are coded, then JCL entry is not needed.

SERVREQ lists the authorized input/output operations against the file. If other than the specified services is requested in the file control command, then INVREQ condition will occur.
FILESTAT indicates the initial file status when CICS initially starts. BUFND and BUFNI indicate the number of data buffers and index buffers respectively. Default value is one for BUFNI and two for BUFND. STRNO is the number of VSAM strings by which concurrent access to the file is allowed.

If the file being registered is path, then BASE indicates the FCT name of the base cluster.

PPT
          All the CICS application programs and BMS map sets must be registered in PPT. If the program is not registered here, then the program is unrecognizable to CICS.

DFHPPT         TYPE=ENTRY,
                   PROGRAM=name| MAPSET= name
                   [PGMLANG=(ASSEMBLER | COBOL | PLI)],
                   options..

ASSEMBLER is the default program language. All the map-sets are considered as written in assembler.






PCT
The control information of all CICS transactions must be registered in program control table (PCT).

DFHPCT                  TYPE=ENTRY,
                             TRANSID=name,
                             TASKREQ=xxxx,                   (PF1-PF24, PA1-PA3)
                             PROGRAM=name,
                             [DTIMOUT=mmss],                     
                             [RTIMOUT=mmss],
                             [RESTART= NO | YES],
                             [TRANSEC=1 | DECIMAL],    (1-64)
                             [DUMP=YES|NO],    
                             …Other options..

TRANSID       – Transaction identifier name (1-4 characters)
PROGRAM      – Name of the program associated with the transaction.
TASKREQ       - Key associated with the transaction initiation.
DTIMOUT       - Defines the timeout (waiting time) in case of deadlock.
RTIMOUT       - Defines the time limit within which the user has to respond. If he didn’t then the task will be cancelled.
RESTART       – Automatic transaction is applied after the completion of the transaction recovery from the abnormal termination of the transaction.
TRANSEC       –Transaction security code.
DUMP            - Whether DUMP is to be taken in case of abnormal termination
of the transaction.

TCT
          All the terminals, which are to be under CICS control, should be registered in TCT. Terminal Control Program uses this table for identifying the terminals and performs all input/output operations against these terminals.

DFHTCT         TYPE=ENTRY,
                   ACCMETH=VTAM,
                   TRMIDNT=name,
                   TRMTYPE=type,
                   FEATURE=(UCTRAN,..)
                   Options..

TRMIDNT is (1-4 characters) terminal ID.
TRMTYPE is type of terminal. Ex. IBM3270.
FEATURE indicates the terminal services CICS offers. UCTRAN is used to translate all   the lowercase characters to upper case characters.

DCT
          TDQ control information is registered here. Destination Control Program uses this table for identifying all TDQs and performs input/output operations against them.

Intra partition queue can be defined as follows.
DFHDCT        TYPE=INTRA,
                   DESTID=name,
                   [TRANSID=name],
                   [TRIGLEV=number],
                   [REUSE= YES|NO]

TYPE can be INTRA (Intra partition TDQ) 

ATI:
TRANSID and TRIGLEV are used for automatic task initiation. If the number of records in TDQ exceeded the number of records mentioned against TRIGLEV, then transaction ID mentioned against TRANSID will be invoked automatically.

Once a record of intra partition TDQ is read by a transaction, the record is logically removed from, the queue. If REUSE = YES is coded, then the space occupied by it can be used by other records in future but the logically deleted records are not recoverable.

Extra partitioned queue can be defined as follows.
DFHDCT        TYPE=EXTRA,
                   DESTID=name,
                   DSCNAME=name-2,
                   [OPEN=INITIAL|DEFERED]
DFHDCT        TYPE=SDSCI,
                   DSCNAME=name-2,
                   [TYPFILE=INPUT|OUTPUT|RDBACK]

OPEN=INITIAL means the file will be open at the CICS start-up time and DEFERED means the file will be closed until it is specifically opened by CEMT.
DSCNAME defines data control block and for one DSCNAME, a corresponding DFHDCT entry must be made with TYPE=SDSCI and the same DSCNAME, which in effect indicates DDNAME of extra partition dataset in JCL or CICS JOB itself.
TYPFILE indicates the file to be INPUT, OUTPUT or READ BACKWARD (RDBACK)

How to submit JCL from a CICS program?
JCL can be submitted using the SPOOLOPEN, SPOOLWRITE and SPOOLCLOSE commands.

Ø  First you must open a spool for output using SPOOLOPEN
EXEC CICS
SPOOLOPEN OUTPUT NODE('*') USERID(INTRDR)
     TOKEN(report_token) RESP(response field)
END-EXEC.

NODE('*') specifies a destination node to send the JCL to. USERID is set to the name of the internal reader INTRDR. A unique token will be allocated by CICS when the SPOOLOPEN is executed and placed in the field you specify using TOKEN(report_token). The token will be used as a sending field on subsequent commands. The token will be 8 bytes long.

Ø  To write each line of the job to the spool use the SPOOLWRITE command.
          EXEC CICS
          SPOOLWRITE FROM(io_area) TOKEN(report_token)
          RESP(resonse_field)
END-EXEC.

The "io_area" field should be the name of a data item containing the line of JCL. The "report_token" field should be the same as the 8 byte token returned from SPOOLOPEN. An end of job statement ('//' or '/*EOF') should be written as the last line.

Ø  Finally you must close the spool using SPOOLCLOSE. (Note if you do not explicitly close the spool it will be closed when the transaction terminates, However it is good practice to close the spool explicitly)
          EXEC CICS
          SPOOLCLOSE TOKEN(report_token) RESP(response_field)
END-EXEC.

Again the "report_token" field must be the same as the one allocated at SPOOLOPEN.

Notes:
Ø  The RESP option should be coded on all the Commands and it is recommended that you also code RESP2, because additional information is returned for some exception conditions in this field.
Ø  DCT entries and JCL DD statements are not needed when using this method.
Ø  Note that in order to use this method DFHSIT SPOOL=YES must be coded in the CICS System Initialization Table. Check with your friendly local SysProg if you are unsure.
Ø  Under OS/VS COBOL the SPOOLWRITE command had to have FLENGTH specified. FLENGTH specifies the length of the data being written in a fullword binary field. This field is optional in newer versions, if it is omitted then the length is assumed to be the length of the data item (io-area) specified in FROM.


Be aware of the performance considerations for writing to the spool, IBM says "Transactions that process SYSOUT data sets larger than 1000 records, either for INPUT or for OUTPUT, are likely to have a performance impact on the rest of CICS".
 (Source: CICS/ESA V4R1 Application Programming Reference SC33-1170-00)