DSN8MP1

RETRIEVES LAST CONVERSATION.

 /********************************************************************* 00010000
 *                                                                    * 00020000
 *   MODULE NAME = DSN8MP1                                            * 00030000
 *                                                                    * 00040000
 *   DESCRIPTIVE NAME = DB2 SAMPLE APPLICATION PROGRAM                * 00050000
 *                      SQL 1 COMMON MODULE                           * 00060000
 *                      IMS & CICS                                    * 00070000
 *                      PL/I                                          * 00080000
 *                                                                    * 00090000
 *                                                                    * 00100000
 *     COPYRIGHT = 5665-DB2 (C) COPYRIGHT IBM CORP 1982, 1989         * 00110000
 *     REFER TO COPYRIGHT INSTRUCTIONS FORM NUMBER G120-2083          * 00120000
 *                                                                    * 00130000
 *     STATUS = VERSION 2 RELEASE 2, LEVEL 0                          * 00140000
 *                                                                    * 00150000
 *   FUNCTION = RETRIEVES LAST CONVERSATION.                          * 00160000
 *              HANDLE 'RESEND' AND 'END' CASES.                      * 00170000
 *              CALL VALIDATION ROUTINES DSN8MP3 THRU DSN8MP5.        * 00180000
 *              CALLS SQL2 ROOT (DSN8CP2 OR DSN8IP2).                 * 00190000
 *                           OR (DSN8CP8 OR DSN8IP8).                 * 00200000
 *                                                                    * 00210000
 *   NOTES =  NONE                                                    * 00220000
 *                                                                    * 00230000
 *   MODULE TYPE = BLOCK OF PL/I CODE                                 * 00240000
 *      PROCESSOR   = DB2  PRECOMPILER, PL/I OPTIMIZER                * 00250000
 *      MODULE SIZE = SEE LINKEDIT                                    * 00260000
 *      ATTRIBUTES  = NONE                                            * 00270000
 *                                                                    * 00280000
 *   ENTRY POINT = DSN8MP1                                            * 00290000
 *      PURPOSE = SEE FUNCTION                                        * 00300000
 *      LINKAGE = INCLUDED BY MODULE DSN8IP1 OR DSN8CP1               * 00310000
 *                                OR DSN8IP7 OR DSN8CP7               * 00320000
 *                                                                    * 00330000
 *      INPUT   = PARAMETERS EXPLICITLY PASSED TO THIS FUNCTION:      * 00340000
 *                SYMBOLIC LABEL/NAME = NONE                          * 00350000
 *                DESCRIPTION         = NONE                          * 00360000
 *                                                                    * 00370000
 *      OUTPUT  = PARAMETERS EXPLICITLY RETURNED:                     * 00380000
 *                SYMBOLIC LABEL/NAME = NONE                          * 00390000
 *                DESCRIPTION         = NONE                          * 00400000
 *                                                                    * 00410000
 *                                                                    * 00420000
 *   EXIT-NORMAL = DROP THRU TO NEXT LINE OF CODE IN DSN8CP1/IP1      * 00430000
 *                                                OR DSN8CP7/IP7      * 00440000
 *                                                                    * 00450000
 *   EXIT-ERROR = IF SQLERROR OR SQLWARNING, SQL WHENEVER CONDITION   * 00460000
 *                SPECIFIED IN DSN8CP1/DSN8CP7/DSN8IP1/DSN8IP7        * 00470000
 *                WILL BE RAISED AND PROGRAM                          * 00480000
 *                WILL GO TO THE LABEL  DB_ERROR.                     * 00490000
 *                                                                    * 00500000
 *                                                                    * 00510000
 *      RETURN CODE = NONE                                            * 00520000
 *                                                                    * 00530000
 *      ABEND CODES = NONE                                            * 00540000
 *                                                                    * 00550000
 *      ERROR-MESSAGES =                                              * 00560000
 *             DSN8051I - PROGRAM ENDED                               * 00570000
 *                                                                    * 00580000
 *   EXTERNAL REFERENCES = MOST VARIABLES ARE GLOBAL AND DEFINED      * 00590000
 *                         IN DSN8CP1/IP1/CP7/IP7.                    * 00600000
 *      ROUTINES/SERVICES =                                           * 00610000
 *             INCLUDING DSN8MP3 THRU DSN8MP5.                        * 00620000
 *             DSN8MPG - ERROR MESSAGE ROUTINE                        * 00630000
 *                                                                    * 00640000
 *      DATA-AREAS        = NONE                                      * 00650000
 *                                                                    * 00660000
 *      CONTROL-BLOCKS    =                                           * 00670000
 *         SQLCA        - SQL COMMUNICATION AREA                      * 00680000
 *                                                                    * 00690000
 *   TABLES =  NONE                                                   * 00700000
 *                                                                    * 00710000
 *   CHANGE-ACTIVITY =  NONE                                          * 00720000
 *                                                                    * 00730000
 *                                                                    * 00740000
 *  *PSEUDOCODE*                                                      * 00750000
 *                                                                    * 00760000
 *  PROCEDURE                                                         * 00770000
 *      ELIMINATE LEADING BLANKS ON DATA LINE IF NOT ALL BLANK.       * 00780000
 *                                                                    * 00790000
 *      SET UP CONTROL FLAGS FOR 'RESEND' 'END' 'NEXT'                * 00800000
 *          FIRST BY EXAMINING THE DATA LINE AND THEN COMPARING THE   * 00810000
 *          PF KEYS (COMPARM.PFKIN)                                   * 00820000
 *                                                                    * 00830000
 *      RETRIEVE LAST CONVERSATION FROM VCONA.                        * 00840000
 *                                                                    * 00850000
 *      IF LAST CONVERSATION IS NOT FOUND THEN DO.                    * 00860000
 *          COMPARM.NEWCONV = 'Y'.                                    * 00870000
 *          PCONVSTA        = '' .                                    * 00880000
 *      END.                                                          * 00890000
 *                                                                    * 00900000
 *      ELSE DO.                                                      * 00910000
 *          PCONVSTA = LAST CONVERSATION RETRIEVED.                   * 00920000
 *          IF RESEND, BYPASS VALIDATION AND SAVE, JUST RESEND.       * 00930000
 *          IF END, DELETE CONVERSATION, SEND MESSAGE & GOTO CP1EXIT. * 00940000
 *          IF NO SYSTEMS FIELDS WAS CHANGED, BYPASS VALIDATION.      * 00950000
 *      END.                                                          * 00960000
 *                                                                    * 00970000
 *      CALL VALIDATION MODULES DSN8MP3 THRU DSN8MP5 WHILE            * 00980000
 *      RETURN CODE IS 0.  OTHERWISE GO TO MP1SAVE.                   * 00990000
 *                                                                    * 01000000
 *      GO TO CP1CALL IN DSN8CP1/IP1 TO CALL DSN8CP2/IP2.             * 01010000
 *                    OR DSN8CP7/IP7 TO CALL DSN8CP8/IP8.             * 01020000
 *                                                                    * 01030000
 *      MP1SAVE:                                                      * 01040000
 *        INSERT/UPDATE CURRENT CONVERSATION INTO VCONA.              * 01050000
 *                                                                    * 01060000
 *  END.                                                              * 01070000
 *********************************************************************/ 01080000
 /*------------------------------------------------------------------*/ 01090000
 /*                                                                  */ 01100000
 /*              INITIAL EDITING FOR DATA INPUT                      */ 01110000
 /*                                                                  */ 01120000
 /*     1. THE DATA LINE IS SHIFTED LEFT UNTIL ALL LEADING BLANKS    */ 01130000
 /*        HAVE BEEN ELIMINATED.                                     */ 01140000
 /*     2. THE APPROPRIATE BITS FOR 'RESEND' , 'END' ETC. ARE THEN   */ 01150000
 /*        SET ACCORDING TO INPUT ON DATA LINE.  '                   */ 01160000
 /*     3. IF PFKEY  1/2/3/8 HAS BEEN USED, THE APPROPRIATE BIT      */ 01170000
 /*        IS SET FOR 'RESEND' , 'SEND' ETC..  THIS TAKES PRECEDENCE */ 01180000
 /*        OVER THE SETTING OF THE SAME BITS IN STEP2.*              */ 01190000
 /*                                                                  */ 01200000
 /*     *     I.E. IF SOMEONE TYPES IN 'RESEND' ON THE DATA LINE AND */ 01210000
 /*                USES THE PF3 KEY AT THE SAME TIME, THE PF3 (END)  */ 01220000
 /*                FUNCTION IS ASSUMED TO BE THE ACTUAL REQUEST.     */ 01230000
 /*                                                                  */ 01240000
 /*------------------------------------------------------------------*/ 01250000
0DSN8_MODULE_NAME.MAJOR = 'DSN8MP1 ';    /* GET MODULE NAME       */    01260000
 MODULE = 'DSN8MP1';                                                    01270000
                                                                        01280000
     /***********************************************************/      01290000
     /*     **INITIALIZE CONTROL FLAGS                          */      01300000
     /***********************************************************/      01310000
                                                                        01320000
 OFF = '0'B ;                                                           01330000
                                                                        01340000
 ON  = '1'B ;                                                           01350000
                                                                        01360000
 SENDBIT,ENDBIT,NEXTBIT = '0'B ;                                        01370000
                                                                        01380000
   /****************************************************************/   01390000
   /*     **SET UP CONTROL FLAGS FOR 'RESEND' 'END' 'NEXT'         */   01400000
   /*     **USING THE INPUT DATA                                   */   01410000
   /****************************************************************/   01420000
                                                                        01430000
0IF COMPARM.DATA ^= ' ' THEN                                            01440000
  DO;                                                                   01450000
     DO WHILE (SUBSTR(COMPARM.DATA,1,1) = ' ');                         01460000
           SUBSTR(COMPARM.DATA,1,60) = SUBSTR(COMPARM.DATA,2,59) || ' ';01470000
     END;                                                               01480000
                                                /*RESEND COMMAND OR*/   01490000
                                                 /*PF KEY 02       */   01500000
     IF SUBSTR(COMPARM.DATA,1,7) = 'RESEND ' THEN SENDBIT = ON;         01510000
                                                                        01520000
                                                /*END COMMAND OR  */    01530000
                                                /*PF KEY 03       */    01540000
     ELSE IF SUBSTR(COMPARM.DATA,1,4) = 'END ' THEN ENDBIT = ON;        01550000
                                                                        01560000
                                                /*NEXT COMMAND OR */    01570000
                                                /*PF KEY 08       */    01580000
     ELSE IF SUBSTR(COMPARM.DATA,1,5) = 'NEXT ' THEN NEXTBIT = ON;      01590000
  END;                                                                  01600000
                                                                        01610000
                                                                        01620000
   /****************************************************************/   01630000
   /*     **SET UP CONTROL FLAGS FOR 'RESEND' 'END' 'NEXT'         */   01640000
   /*     **USING THE PFKEYS                                       */   01650000
   /****************************************************************/   01660000
                                                                        01670000
0IF COMPARM.PFKIN ^= '  ' THEN                                          01680000
  DO;                                                                   01690000
                                                /*RESEND COMMAND OR*/   01700000
                                                /*PF KEY 02       */    01710000
      IF COMPARM.PFKIN = '02' THEN SENDBIT = ON;                        01720000
                                                                        01730000
                                                /*END COMMAND OR  */    01740000
                                                /*PF KEY 03       */    01750000
      ELSE IF COMPARM.PFKIN = '03' THEN ENDBIT = ON;                    01760000
                                                                        01770000
                                                /*NEXT COMMAND OR */    01780000
                                                /*PF KEY 08       */    01790000
      ELSE IF COMPARM.PFKIN = '08' THEN NEXTBIT = ON;                   01800000
                                                                        01810000
  END;                                                                  01820000
                                                               %PAGE;   01830000
 /*------------------------------------------------------------------*/ 01840000
 /*                                                                  */ 01850000
 /*   RESTORE LAST MESSAGE AND DETERMINE IF VALIDATION IS NECESSARY  */ 01860000
 /*                                                                  */ 01870000
 /*   1. RETRIEVE LAST CONVERSATION, IF RETRIEVAL NOT SUCCESSFUL     */ 01880000
 /*      THEN CONVERSATION IS NEW.                                   */ 01890000
 /*   2. IF RETRIEVAL SUCCESSFUL, THEN PUT LAST CONVERSATION         */ 01900000
 /*      INTO PCONVSTA.                                              */ 01910000
 /*   3. IF RESEND REQUEST, DON'T VALIDATE & DON'T SAVE, JUST RESEND.*/ 01920000
 /*   4. IF END REQUEST, DELETE CONVERSATION, SEND END MESSAGE, EXIT.*/ 01930000
 /*   5. IF NONE OF THE SYSTEMS FIELDS HAS BEEN CHANGED SINCE        */ 01940000
 /*      LAST SAVED, BYPASS VALIDATION ALSO.                         */ 01950000
 /*   6. OTHERWISE VALIDATE EACH OF THE SYSTEM FIELDS.               */ 01960000
 /*                                                                  */ 01970000
 /*------------------------------------------------------------------*/ 01980000
                                                                        01990000
0COMPARM.NEWREQ   = 'N' ;            /* INITIALIZE TO NOT NEW REQUEST*/ 02000000
 SAVE_CONVID      = PCONVSTA.CONVID; /* SAVE THE CURRENT CONVID      */ 02010000
                                                                        02020000
0     EXEC SQL SELECT  *                                                02030000
               INTO    :PCONA                                           02040000
               FROM    VCONA                                            02050000
               WHERE   CONVID =:SAVE_CONVID;                            02060000
                                                                        02070000
                                  /*RETRIEVAL NOT SUCCESSFUL-     */    02080000
                                  /*INITIALIZE TO NEW CONVERSATION*/    02090000
                                                                        02100000
      IF SQLCODE = +100 THEN                                            02110000
       DO;                                                              02120000
          COMPARM.NEWCONV  = 'Y';    /* SET TO A NEW CONVERSATION */    02130000
          PCONVSTA         = '';                                        02140000
          PCONVSTA.CONVID  = SAVE_CONVID ; /* RESTORE CONVID      */    02150000
          PCONVSTA.LASTSCR = 'DSN8001 ' ;  /* DEFAULT SCREEN      */    02160000
          PCONA.CONVID = PCONVSTA.CONVID;  /* SET CONVERSATION  ID*/    02170000
       END;                                                             02180000
                                                                        02190000
      ELSE                                                              02200000
       DO;                                                              02210000
                                       /*RETRIEVAL SUCCESSFUL-    */    02220000
                                  /*INITIALIZE TO OLD CONVERSATION*/    02230000
                                                                        02240000
          COMPARM.NEWCONV = 'N' ;    /* SET TO AN OLD CONVERSATION*/    02250000
          PCONVSTA.LASTSCR = PCONA.LASTSCR ;                            02260000
          STRING( PCONVSTA.LASTPOS ) = PCONA.LASTPOS ;                  02270000
          PCONVSTA.LASTPOSC= PCONA.LASTPOSC;                            02280000
          STRING(OUTAREA)  = PCONA.LASTMSG ;                            02290000
                                                                        02300000
                                /*IF CONVERSATION EXISTS BUT DATA*/     02310000
                                /*ENTERED FROM CLEARED SCREEN,   */     02320000
                                /*THEN TREAT LIKE RESEND         */     02330000
                                                                        02340000
          IF ( COMPARM.PFKIN = '00' ) | SENDBIT  THEN                   02350000
              GO TO CP1EXIT ;                                           02360000
                                                                        02370000
                                /*IF END REQUEST THEN DELETE CON-*/     02380000
                                /*VERSATION AND SEND END MESSAGE */     02390000
                                                                        02400000
          IF ENDBIT THEN                                                02410000
           DO;                                                          02420000
              EXITCODE = '1';      /* NOTE THAT WE SHOULD EXIT    */    02430000
              DSN8_MODULE_NAME.MINOR = 'DELETE  ';                      02440000
              STRING(PCONVSTA.OUTAREA) = ' ';                           02450000
              EXEC SQL DELETE                                           02460000
                       FROM   VCONA                                     02470000
                       WHERE  CONVID = :PCONA.CONVID;                   02480000
                                                                        02490000
                                            /*  PRINT MESSAGE:     */   02500000
                                            /*  PROGRAM ENDED      */   02510000
                                                                        02520000
              CALL DSN8MPG (MODULE, '051I', OUTMSG);                    02530000
              MESSAGE.MSGTXT = OUTMSG;                                  02540000
              OUTAREA.MAJSYS = INAREA.MAJSYS;  /* SET MAJ SYSTEM */     02550000
              GO TO CP1EXIT;                                            02560000
           END;                                                         02570000
                                                                        02580000
    /*************************************************************/     02590000
    /*                  **IF OLD CONVERSATION AND SYSTEM         */     02600000
    /*                  **FIELDS HAVE NOT CHANGED THEN           */     02610000
    /*                  **BYPASS VALIDATION                      */     02620000
    /*************************************************************/     02630000
                                                                        02640000
                                                                        02650000
          IF ( SUBSTR(STRING(COMPARM.INAREA),1,6) =                     02660000
               SUBSTR(STRING(PCONVSTA.OUTAREA),1,6) ) THEN              02670000
              DO;                              /* OLD CONVERSATION*/    02680000
                IF PCONVSTA.PREV='D' &                                  02690000
                    (COMPARM.PFKIN ^= '10' | COMPARM.OBJFLD ^= 'DS') &  02695002
                   ((COMPARM.DATA^=PCONVSTA.DATA) |                     02700000
                    (COMPARM.ACTION = 'D')) THEN                        02705000
                   COMPARM.NEWREQ = 'Y';                                02710000
                GOTO MP1BOTH;                                           02720000
              END;                                                      02730000
       END;                                                             02740000
                                                                        02750000
                                               /* NEW CONVERSATION*/    02760000
     /************************************************************/     02770000
     /*                  **VALIDATES FIELDS                      */     02780000
     /************************************************************/     02790000
                                                                        02800000
      COMPARM.NEWREQ = 'Y' ;                                            02810000
      OUTAREA.MAJSYS = INAREA.MAJSYS;          /* SET MAJ SYSTEM  */    02820000
      OUTAREA.OBJFLD = INAREA.OBJFLD;          /* SET OBJECT      */    02830003
      OUTAREA.DESC3  = '';                     /* CLEAR DESCRIPTN */    02840000
      OUTAREA.SEARCH = INAREA.SEARCH;          /* SET SEARCH CRIT */    02850000
      OUTAREA.DESC4  = '';                     /* CLEAR DESCRIPTN */    02860000
      CALL DSN8MP3 ;                           /* VALIDATE ACTION */    02870000
      IF RETCODE = '1' THEN GO TO MP1SAVE ;                             02880000
      CALL DSN8MP4 ;                           /* VALIDATE OBJECT */    02890004
      IF RETCODE = '1' THEN GO TO MP1SAVE ;                             02900000
      CALL DSN8MP5 ;                           /* VALIDATE SEARCH */    02910000
      IF RETCODE = '1' THEN GO TO MP1SAVE ;                             02920000
                                                             %PAGE;     02930000
    /**********************************************************/        02940000
    /*           **IF ALL SYSTEM FIELDS ARE OK, CONTINUE      */        02950000
    /**********************************************************/        02960000
                                                                        02970000
 MP1BOTH:                                                               02980000
                                                                        02990000
                                                 /* NEW REQUEST   */    03000000
      IF ( PCONVSTA.PREV = ' ' )                                        03010000
       | ( ( PCONVSTA.PREV  = 'S' )                                     03020000
         & ( SUBSTR(COMPARM.DATA,3,58) ^= ' ' )                         03030000
         & ( NEXTBIT = OFF )   )                                        03040000
      THEN COMPARM.NEWREQ = 'Y' ;                                       03050000
                                        /*GO TO CP1CALL WHERE A CALL */ 03060000
                                       /*TO EITHER DSN8CC2 OR DSN8IC2*/ 03070000
                                        /*IS PERFORMED. CC1-CALL IS A*/ 03080000
                                        /*LABEL IN DSN8CP1 OR DSN8IP1*/ 03090000
      GO TO CP1CALL ;                                                   03100000
                                                                        03110000
    /*********************************************************/         03120000
    /*                 **DSN8CP1 OR DSN8IP1 WILL             */         03130000
    /*                 **BRANCH BACK TO MP1SAVE AFTER        */         03140000
    /*                 **CALLING SQL2. AT MP1SAVE,           */         03150000
    /*                 **THE DATA RETURNED BY SQL2 OR THE    */         03160000
    /*                 **VALIDATION ROUTINES WILL BE         */         03170000
    /*                 **SAVED IN VCONA                      */         03180000
    /*********************************************************/         03190000
                                                                        03200000
 MP1SAVE:                                                               03210000
      PCONVSTA.DATA = COMPARM.DATA ;           /* MOVE INPUT DATA    */ 03220000
      PCONA.LASTMSG = STRING(PCONVSTA.OUTAREA);                         03230000
      PCONA.CONVID  = PCONVSTA.CONVID;                                  03240000
      PCONA.LASTSCR = PCONVSTA.LASTSCR;                                 03250000
      PCONA.LASTPOS = STRING ( PCONVSTA.LASTPOS );                      03260000
      PCONA.LASTPOSC= PCONVSTA.LASTPOSC;                                03270000
      DSN8_MODULE_NAME.MINOR = 'MP1SAVE ';                              03280000
                                                                        03290000
      IF COMPARM.NEWCONV = 'Y' THEN            /* INSERT NEW VALUES */  03300000
        EXEC SQL INSERT                                                 03310000
                 INTO    VCONA                                          03320000
                 VALUES  (:PCONA);                                      03330000
      ELSE                                                              03340000
        EXEC SQL UPDATE  VCONA                 /* UPDATE OLD VALUES*/   03350000
                 SET     LASTSCR  = :PCONA.LASTSCR,                     03360000
                         LASTPOS  = :PCONA.LASTPOS,                     03370000
                         LASTPOSC = :PCONA.LASTPOSC,                    03380000
                         LASTMSG  = :PCONA.LASTMSG                      03390000
                 WHERE   CONVID   = :SAVE_CONVID;                       03400000