Basic mapping support example

This example shows the procedure to use the CICS basic mapping support (BMS) in the REXX/CICS environment.

  1. BMS maps must be assembled and linked into a CICS library. This library must be in the LIBDEF in the CICS region startup JCL.
  2. If you are going to use the REXX/CICS CONVTMAP command to generate a file structure, the BMS map must be assembled to produce the map DSECT.
  3. BMS maps must be defined to CICS using Resource Definition Online (RDO).
  4. If you want to read from or send data to the screen, you need to GETMAIN CICS storage for the length of the map input/output areas. The storage must be initialized to nulls.
  5. If a field within a file structure is represented by more than one label, then the last label to reference that field in the structure must be used when referencing the field.
This example uses BMS map PANELG. The map definition is as follows.
         TITLE 'PANEL GROUP FOR REXX/CICS       '                       00000010
         PRINT ON,NOGEN                                                 00000020
PANELG   DFHMSD TYPE=MAP,LANG=ASM,MODE=INOUT,STORAGE=AUTO,SUFFIX=       00000030
         TITLE 'TEST PANEL FOR REXX/CICS        '                       00000040
DPANEL1  DFHMDI SIZE=(24,80),CTRL=(FREEKB),MAPATTS=(COLOR,HILIGHT),    *00000050
               DSATTS=(COLOR,HILIGHT),COLUMN=1,LINE=1,DATA=FIELD,      *00000060
               TIOAPFX=YES,OBFMT=NO                                     00000070
         DFHMDF POS=(1,1),LENGTH=1,ATTRB=(PROT,BRT)                     00000080
         DFHMDF POS=(5,27),LENGTH=22,INITIAL='REXXCICS HEADER PANEL1', *00000090
               ATTRB=(PROT,NORM)                                        00000100
         DFHMDF POS=(5,73),LENGTH=6,INITIAL='PANEL1',ATTRB=(PROT,NORM)  00000110
         DFHMDF POS=(9,6),LENGTH=25,                                   *00000120
               INITIAL='PLEASE ENTER YOUR USERID:',ATTRB=(PROT,NORM)    00000130
* DUSERID                                                               00000140
DUSERID  DFHMDF POS=(9,32),LENGTH=8,ATTRB=(UNPROT,BRT,IC,FSET)          00000150
         DFHMDF POS=(9,41),LENGTH=1,ATTRB=(PROT,NORM)                   00000160
         DFHMDF POS=(14,6),LENGTH=4,INITIAL='MSG:',ATTRB=(PROT,NORM)    00000170
* DMSG                                                                  00000180
DMSG     DFHMDF POS=(14,11),LENGTH=29,ATTRB=(UNPROT,NORM,FSET)          00000190
         DFHMDF POS=(14,41),LENGTH=1,ATTRB=(PROT,NORM)                  00000200
         DFHMSD TYPE=FINAL                                              00000210
         END                                                            00000220
The map DSECT is as follows. The DSECT is in an MVS™ PDS named USER.REXXCICS.MAPS(PANELG).

             DS    0H                 ENSURE ALIGNMENT     
DPANEL1S  EQU  *      .             START OF MAP DEFINITION
         DS    12C .             TIOA PREFIX               
        SPACE                                              
DUSERIDL DS    CL2 .  INPUT DATA FIELD LEN                 
DUSERIDF DS    0C .   DATA FIELD FLAG                      
DUSERIDA DS    C .    DATA FIELD ATTRIBUTE                 
DUSERIDC DS    C .   COLOUR ATTRIBUTE                      
DUSERIDH DS    C .   HIGHLIGHTING ATTRIBUTE                
DUSERIDI DS    0CL8 .  INPUT DATA FIELD                    
DUSERIDO DS    CL8 .   OUTPUT DATA FIELD                   
        SPACE                                              
DMSGL DS    CL2 .  INPUT DATA FIELD LEN                    
DMSGF DS    0C .   DATA FIELD FLAG                         
DMSGA DS    C .    DATA FIELD ATTRIBUTE                    
DMSGC DS    C .   COLOUR ATTRIBUTE                     
DMSGH DS    C .   HIGHLIGHTING ATTRIBUTE                         
DMSGI DS    0CL29 .  INPUT DATA FIELD                            
DMSGO DS    CL29 .   OUTPUT DATA FIELD                           
        SPACE                                                    
DPANEL1E  EQU   *     .               END OF MAP DEFINITION      
           ORG  DPANEL1S  .               ADDRESS START OF MAP   
* CALCULATE MAPLENGTH, ASSIGNING A VALUE OF ONE WHERE LENGTH=ZERO
DPANEL1L  EQU  DPANEL1E-DPANEL1S                                 
DPANEL1I  DS  0CL(DPANEL1L+1-(DPANEL1L/DPANEL1L))                
DPANEL1O  DS  0CL(DPANEL1L+1-(DPANEL1L/DPANEL1L))                
           ORG                                                   
* * * END OF MAP DEFINITION * * *                                
         SPACE 3                                                 
         ORG
The CONVTMAP command is used to take the DSECT and create a file structure stored in the RFS. The command is entered as follows:
'CONVTMAP USER.TEST(PANELG) POOL1:\USERS\USER1\PANELG.DATA'
The following is the file structure created by CONVTMAP.
00000 ***************************** TOP OF DATA *************************
00001 DUSERIDL 13 2   C
00002 DUSERIDF 15 1   C
00003 DUSERIDA 15 1   C
00004 DUSERIDC 16 1   C
00005 DUSERIDH 17 1   C
00006 DUSERIDI 18 8   C
00007 DUSERIDO 18 8   C
00008 DMSGL 26 2   C
00009 DMSGF 28 1   C
00010 DMSGA 28 1   C
00011 DMSGC 29 1   C
00012 DMSGH 30 1   C
00013 DMSGI 31 29   C
00014 DMSGO 31 29   C
00015 ***************************** BOTTOM OF DATA***********************
The following example is exec BMSMAP1. It creates a simple panel that asks for a user ID.
/* This EXEC uses CICS SEND and RECEIVE commands                 */
/* The panel has two fields USERID and a message                 */
/* field.  The panel is initially displayed with                 */
/* a message - "USERID must be 8 characters"                     */

/* GETMAIN storage to be used for data mapping                   */
/* and initialize                                                */
'PSEUDO OFF'
ZEROES = '00'x
'CICS GETMAIN SET(WORKPTR) LENGTH(90) INITIMG(ZEROES)'

VAR1 = 'USERID must be 8 characters'

/* Copy the REXX variable VAR1 to the GETMAINed storage          */
'COPYR2S VAR1 WORKPTR 30'

/* Copy the storage area to REXX variable                        */
'COPYS2R WORKPTR X 0 90'

'CICS SEND MAP(PANELG) FREEKB ERASE FROM(X)'
'CICS RECEIVE MAP(PANELG) INTO(Y)'

/* Copy Y into the GETMAINED storage area and then copy the data */
/* to REXX variables using the file structure generated          */
/* previously by the CONVTMAP command                            */
'COPYR2S Y WORKPTR 0 90'
'COPYS2R WORKPTR * POOL1:\USERS\USER1\PANELG.DATA'

/* loop until the user enters a USERID exactly 8 characters in   */
/* length                                                        */
do forever
MUSERID = STRIP(DUSERIDO)
if LENGTH(MUSERID) < 8  then
  do
   DMSGO = 'Please enter 8 char USERID'
   'COPYR2S * WORKPTR POOL1:\USERS\USER1\PANELG.DATA'
   'COPYS2R WORKPTR X 0 90'
   'CICS SEND MAP(PANELG) FREEKB ERASE FROM(X)'
   'CICS RECEIVE MAP(PANELG) INTO(Z)'
   'COPYR2S Z WORKPTR 0 90'
   'COPYS2R WORKPTR * POOL1:\USERS\USER1\PANELG.DATA'
  END
 ELSE LEAVE
END
'SENDE'
say ' '
say 'Hello' DUSERIDO', Welcome to REXX/CICS !!'
exit
The BMSMAP1 exec created the following panels.
                 REXX/CICS HEADER PANEL1                     PANEL1

PLEASE ENTER YOUR USERID:

MSG: USERID must be 8 characters








                 REXX/CICS HEADER PANEL1                     PANEL1

PLEASE ENTER YOUR USERID: TEST

MSG: Please enter 8 character USERID