Site icon TechTricky: A Technology Blog on HTML, CSS, JQuery, Webaps and How to\'s

CICS Scrolling logic with examples

CICS scrolling logic looks very simple in algorithm representation but implementing it practically so many questions arises. This topic is to clear all the queries related to CICS scrolling (page Up / Down) logic with suitable examples.

Let me give few basic points before getting into detailed implementation logic.

NOTES →

Declaration →

Declare Commarea fields that are to be preserved for the next execution of the transaction in working storage area like below.

DATA DIVISION.

WORKING-STORAGE SECTION.

** MAP AREA

01 WW-SCREEN.
    05 WW-SCREEN-FEILDS PIC X(10) OCCURS 10 TIMES.

** communication Area

01 WW-COMM-AREA.
   05 WW-CA-LAST-KEY        PIC X(10).
   05 WW-CA-FIRST-KEY       PIC X(10).
   05 WW-CA-SCREEN-NUM      PIC 9(01).
   05 WW-CA-NEXT-PAGE-IND   PIC X(01).
      88 CA-NEXT-PAGE-EXISTS          VALUE 'Y'.
      88 CA-NEXT-PAGE-NOT-EXISTS      VALUE 'N'.

** WW-COMM-AREA is used in RETRUN after sending the map***

LINKAGE SECTION.

01 DFHCOMMAREA.
    05 LK-COMM-AREA PIC X(11).

LK-COMM-AREA is used to receive the data in next transaction.

Procedure Division.

A000-MAINPARA.
*
EXEC CICS HANDLE ABEND
     LABEL(Z9999-ABEND-PARA)
END-EXEC

In case if the Formatted date & time are needed

EXEC CICS ASKTIME
     ABSTIME(WW-ABS-TIME)
END-EXEC

EXEC CICS FORMATTIME
    ABSTIME(WW-ABS-TIME)
    YYYYMMDD(WW--DATE)
    TIME(WW-TIME)
END-EXEC

IF EIBCALEN=0–> Do nothing, just return the control back to CICS and clear the screen

IF EIBCALEN = ZERO
   EXEC CICS SEND CONTROL
       ERASE
       FREEKB
   END-EXEC
   EXEC CICS RETURN END-EXEC.
END-IF
MOVE DFHCOMMAREA TO WW-COMM-AREA

First time, Nothing will be in DFHCOMMAREA, but in PF7/PF8 case Last Key, First Key and Page Exists indicator would be present as these items would be sent in RETURN command.

Receive the map and check the response. If it is normal proceed further.

EXEC CICS RECEIVE MAP(MAP1)
     MAPSET(MAP1-SET)
     INTO(WW-MAP1)
     RESP(WW-RESP)
END-EXEC

EVALUATE TRUE
  WHEN ENTER
       PERFORM A100-GET-INITIAL-DATA
  WHEN PFKEY7
       PERFORM A200-SCROLL-UP
  WHEN PFKEY8
       PERFORM A300-SCROLL-DOWN
END-EVALUATE .

A100-GET-INITIAL-DATA .

ADD +1 TO WW-CA-SCREEN-NUM
EXEC CICS STARTBR
    DATASET(WW-FILE-NAME)
    RIDFLD(WW-KEY)
    KEYLENGTH(WW-KEY-LNGTH)
    RESP(WW-RESP)
END-EXEC

MOVE ZEROES TO WW-SCRN-SIZE-COUNTER
SET CA-NEXT-PAGE-NOT-EXISTS TO TRUE

PERFORM UNTIL END-OF-PROCESS
    EXEC CICS READNEXT
         DATASET(-FILE-NAME)
         INTO(WW-FILE-DATA)
         LENGTH(WW-FILE-LNGTH)
         RIDFLD(WW-KEY)
         KEYLENGTH(WW-KEY-LNGTH)
         RESP(WS-RESP)
    END-EXEC

    IF SUCCESS
       ADD +1 TO WW-SCRN-COUNTER
       MOVE WW-FILE-DATA TO WW-SCREEN-FEILDS(WW-SCRN-COUNTER)
       IF WW-SCRN-COUNTER = 1
** Communication area field to be used in PF7/8 logic
         MOVE WW-KEY TO WW-CA-FIRST-KEY
       END-IF

       IF WW-SCRN-SIZE-COUNTER = MAX-SCRN-SIZE
          SET END-OF-PROCESS TO TRUE
** Communication area field to be used in PF7/8 logic
          MOVE WW-KEY TO WW-CA-LAST-KEY
*** This is to check whether the next record exists or not
          EXEC CICS READNEXT
               DATASET(-FILE-NAME)
               INTO(WW-FILE-DATA)
               LENGTH(WW-FILE-LNGTH)
               RIDFLD(WW-KEY)
               KEYLENGTH(WW-KEY-LNGTH)
               RESP(WS-RESP)
          END-EXEC

          IF RECORD-FND
             SET CA-NEXT-PAGE-EXISTS TO TRUE
          END-IF
       END-IF
   ELSE
       IF NO-RECORDS-IN-FILE
          SET END-OF-PROCESS TO TRUE
       END-IF
   END-IF
END-PERFORM

** Send the map & Issue a return command with Commarea

PERFORM A999-SEND-MAP-AND-RETURN.

A200-SCROLL-UP.

MOVE DFHCOMMAREA TO WW-COMM-AREA

IF WW-CA-SCREEN-NUM = 1
   MOVE 'ALREADY AT THE FIRST PAGE' TO SCREEN-WARNING-MSG
**send map & return
   PERFORM A999-SEND-MAP-AND-RETURN
ELSE
   MOVE WW-CA-FIRST-KEY TO WW-KEY
** Issue a Start Browse and read previous records from that point
   EXEC CICS STARTBR
        DATASET(WW-FILE-NAME)
        RIDFLD(WW-KEY)
        KEYLENGTH(WW-KEY-LNGTH)
        RESP(WW-RESP)
   END-EXEC

   MOVE MAX-SCRN-SIZE TO WW-SCRN-SIZE-COUNTER
   SET CA-NEXT-PAGE-EXISTS TO TRUE

   PERFORM UNTIL END-OF-PROCESS

     EXEC CICS READPREV
          DATASET(-FILE-NAME)
          INTO(WW-FILE-DATA)
          LENGTH(WW-FILE-LNGTH)
          RIDFLD(WW-KEY)
          KEYLENGTH(WW-KEY-LNGTH)
          RESP(WS-RESP)
     END-EXEC
     IF SUCCESS
        MOVE WW-FILE-DATA TO WW-SCREEN-FEILDS(WW-SCRN-COUNTER)
        IF WW-SCRN-COUNTER = 1
** Communication area field to be used in PF7/8 logic
          SET END-OF-PROCESS TO TRUE
          MOVE WW-KEY TO WW-CA-FIRST-KEY
        END-IF

        IF WW-SCRN-SIZE-COUNTER = MAX-SCRN-SIZE
** Communication area field to be used in PF7/8 logic
           MOVE WW-KEY TO WW-CA-LAST-KEY
        END-IF
     ELSE
        IF NO-RECORDS-IN-FILE
           SET END-OF-PROCESS TO TRUE
        END-IF
     END-IF
     SUBTRACT 1 FROM WW-SCRN-COUNTER
END-PERFORM

** Send the map & Issue a return command with Commarea
PERFORM A999-SEND-MAP-AND-RETURN

A300-SCROLL-DOWN.

MOVE DFHCOMMAREA TO WW-COMM-AREA

IF CA-NEXT-PAGE-EXISTS
    ADD +1 TO WW-CA-SCREEN-NUM
    MOVE WW-CA-LAST-KEY TO WW-KEY
ELSE
    MOVE 'Further scrolling not possible ' to SCREEN-WARNING-MSG
END-IF.

A999-SEND-MAP-AND-RETURN.

EXEC CICS SEND MAP(MAP1)
     MAPSET(MAP1-SET)
     FROM(WW-SCREEN)
     CURSOR
     ERASE
     RESP(WW-RESP)
END-EXEC

EXEC CICS RETURN
     TRANSID(MAP1-TRAN) 
     COMMAREA(WW-COMM-AREA)
     LENGTH(WW-COMM-AREA-LGTH)
END-EXEC.
Exit mobile version
Close Bitnami banner
Bitnami