Basic examples
A simple example of a program that creates a channel and passes it to second program.
CLIENT1
,
that:
-
Uses PUT CONTAINER(
container-name
) CHANNEL(
channel-name
)
commands to create a channel called
inqcustrecand add two containers,custnoandbranchno, to it; these contain a customer number and a branch number, respectively. -
Uses a LINK PROGRAM(
program-name
) CHANNEL(
channel-name
)
command to link to program
SERVER1, passing theinqcustrecchannel. -
Uses a GET CONTAINER(
container-name
) CHANNEL(
channel-name
)
command to retrieve the customer record returned by
SERVER1. The customer record is in thecustreccontainer of theinqcustrecchannel.
Note that the same COBOL copybook,
INQINTC
, is
used by both the client and server programs. Line 3 and lines 5 through
7 of the copybook represent the
INQUIRY-CHANNEL
and
its containers. These lines are not strictly necessary to the working
of the programs, because channels and containers are created by being
named on, for example,
PUT CONTAINER
commands;
they do not have to be defined. However, the inclusion of these lines
in the copybook used by both programs makes for easier maintenance;
they record the names of the containers used.
Recommendation
IDENTIFICATION DIVISION.
PROGRAM-ID. CLIENT1.
WORKING-STORAGE SECTION.
COPY INQINTC
* copybook INQINTC
* Channel name
* 01 INQUIRY-CHANNEL PIC X(16) VALUE 'inqcustrec'.
* Container names
* 01 CUSTOMER-NO PIC X(16) VALUE 'custno'.
* 01 BRANCH-NO PIC X(16) VALUE 'branchno'.
* 01 CUSTOMER-RECORD PIC X(16) VALUE 'custrec'.
* Define the data fields used by the program
* 01 CUSTNO PIC X(8).
* 01 BRANCHNO PIC X(5).
* 01 CREC.
* 02 CUSTNAME PIC X(80).
* 02 CUSTADDR1 PIC X(80).
* 02 CUSTADDR2 PIC X(80).
* 02 CUSTADDR3 PIC X(80).
PROCEDURE DIVISION.
MAIN-PROCESSING SECTION.
*
* INITIALISE CUSTOMER RECORD
*
... CREATE CUSTNO and BRANCHNO
*
* GET CUSTOMER RECORD
*
EXEC CICS PUT CONTAINER(CUSTOMER-NO) CHANNEL(INQUIRY-CHANNEL) FROM(CUSTNO) FLENGTH(LENGTH OF CUSTNO) END-EXEC
EXEC CICS PUT CONTAINER(BRANCH-NO) CHANNEL(INQUIRY-CHANNEL) FROM(BRANCHNO) FLENGTH(LENGTH OF BRANCHNO) END-EXEC
EXEC CICS LINK PROGRAM('SERVER1') CHANNEL(INQUIRY-CHANNEL) END-EXEC
EXEC CICS GET CONTAINER(CUSTOMER-RECORD) CHANNEL(INQUIRY-CHANNEL) INTO(CREC) END-EXEC
*
* PROCESS CUSTOMER RECORD
*
... FURTHER PROCESSING USING CUSTNAME and CUSTADDR1 etc...
EXEC CICS RETURN END-EXEC
EXIT.
Figure 2
shows the
SERVER1
program
linked to by
CLIENT1.
SERVER1
retrieves
the data from the
custno
and
branchno
containers
it has been passed, and uses it to locate the full customer record
in its database. It then creates a new container,
custrec
,
on the same channel, and returns the customer record in it.
CHANNEL
keyword
on the
GET
and
PUT
commands in
SERVER1
:
if the channel isn't specified explicitly, the current channel is
used—that is, the channel that the program was invoked with.
IDENTIFICATION DIVISION.
PROGRAM-ID. SERVER1.
WORKING-STORAGE SECTION.
COPY INQINTC
* copybook INQINTC
* Channel name
* 01 INQUIRY-CHANNEL PIC X(16) VALUE 'inqcustrec'.
* Container names
* 01 CUSTOMER-NO PIC X(16) VALUE 'custno'.
* 01 BRANCH-NO PIC X(16) VALUE 'branchno'.
* 01 CUSTOMER-RECORD PIC X(16) VALUE 'custrec'.
* Define the data fields used by the program
* 01 CUSTNO PIC X(8).
* 01 BRANCHNO PIC X(5).
* 01 CREC.
* 02 CUSTNAME PIC X(80).
* 02 CUSTADDR1 PIC X(80).
* 02 CUSTADDR2 PIC X(80).
* 02 CUSTADDR3 PIC X(80).
PROCEDURE DIVISION.
MAIN-PROCESSING SECTION.
EXEC CICS GET CONTAINER(CUSTOMER-NO) INTO(CUSTNO) END-EXEC
EXEC CICS GET CONTAINER(BRANCH-NO) INTO(BRANCHNO) END-EXEC
... USE CUSTNO AND BRANCHNO TO FIND CREC IN A DATABASE
EXEC CICS PUT CONTAINER(CUSTOMER-RECORD) FROM(CREC) FLENGTH(LENGTH OF CREC) END-EXEC
EXEC CICS RETURN END-EXEC
EXIT.