DSN8MPT

THIS MODULE BUILDS A PROJECT ACTIVITY LIST, COMPOSED OF A SELECTED PROJECT AND ITS ESTIMATED AND/OR STAFFED ACTIVITIES.

 DSN8MPT:  PROC REORDER;                                                00010000
 /********************************************************************* 00020000
  *                                                                   * 00030000
  *  MODULE NAME      = DSN8MPT                                       * 00040000
  *                                                                   * 00050000
  *  DESCRIPTIVE NAME = DB2 SAMPLE APPLICATION                        * 00060000
  *                     PROJECT ACTIVITY LIST - DETAIL MODULE         * 00070000
  *                     PL/I                                          * 00080000
  *                     PROJECT                                       * 00090000
  *                                                                   * 00100000
  *    COPYRIGHT = 5740-XYR (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 = THIS MODULE BUILDS A PROJECT ACTIVITY LIST,           * 00160000
  *             COMPOSED OF A SELECTED PROJECT AND ITS                * 00170000
  *             ESTIMATED AND/OR STAFFED ACTIVITIES.                  * 00180000
  *                                                                   * 00190000
  *             THE SELECTED PROJECT CAN BE SPECIFIED                 * 00200000
  *             IN SEVERAL WAYS:                                      * 00210000
  *               THROUGH A 'NEW' REQUEST                             * 00220000
  *                . IT CAN BE SPECIFIED IN SECONDARY SELECTION       * 00230000
  *                . IT CAN BE THE ONLY  IN SECONDARY SELECTION       * 00240000
  *               THROUGH A 'SCROLL' REQUEST                          * 00250000
  *                . IT IS THE SAME AS LAST TIME                      * 00260000
  *                  ('NEXT'           FUNCTION)                      * 00270000
  *                                                                   * 00280000
  *  NOTES =                                                          * 00290000
  *     DEPENDENCIES = NONE                                           * 00300000
  *     RESTRICTIONS = THE VALID OPTIONS ARE:                         * 00310000
  *                    P - D - AL - DI,DN,EI,EN,PI,PN,RI,RN           * 00320000
  *                                                                   * 00330000
  *  MODULE TYPE =                                                    * 00340000
  *     PROCESSOR   = DB2  PRECOMPILER, PL/I OPTIMIZER                * 00350000
  *     MODULE SIZE = SEE LINK-EDIT                                   * 00360000
  *     ATTRIBUTES  =  REUSABLE                                       * 00370000
  *                                                                   * 00380000
  *  ENTRY POINT = DSN8MPT                                            * 00390000
  *     PURPOSE = SEE FUNCTION                                        * 00400000
  *     LINKAGE = MODULE CALLED BY DSN8MPM                            * 00410000
  *                                                                   * 00420000
  *     INPUT   = PARAMETERS EXPLICITLY PASSED TO THIS FUNCTION:      * 00430000
  *               COMMON AREA.                                        * 00440000
  *                                                                   * 00450000
  *              SYMBOLIC LABEL/NAME = PCONVSTA.MAXSEL                * 00460000
  *              DESCRIPTION         = NUMBER OF SELECTIONS           * 00470000
  *                                                                   * 00480000
  *              SYMBOLIC LABEL/NAME = COMPARM .NEWREQ                * 00490000
  *              DESCRIPTION         = Y-NEW REQUEST                  * 00500000
  *                                    N-OLD REQUEST                  * 00510000
  *                                                                   * 00520000
  *              SYMBOLIC LABEL/NAME = OUTAREA .OUTPUT                * 00530000
  *              DESCRIPTION         = SECONDARY SELECTION OUTPUT     * 00540000
  *                                    OR 'LAST TIME' DETAIL OUTPUT   * 00550000
  *                                                                   * 00560000
  *              SYMBOLIC LABEL/NAME = INAREA                         * 00570000
  *              DESCRIPTION         = USER INPUT                     * 00580000
  *                                                                   * 00590000
  *              SYMBOLIC LABEL/NAME = DSN8MP_POS.MPTSAVE             * 00600000
  *              DESCRIPTION         = SAVED DATA FROM 'LAST TIME'    * 00610000
  *                                                                   * 00620000
  *                                                                   * 00630000
  *     OUTPUT = PARAMETERS EXPLICITLY RETURNED:                      * 00640000
  *              COMMON AREA.                                         * 00650000
  *                                                                   * 00660000
  *              SYMBOLIC LABEL/NAME = PCONVSTA.PREV                  * 00670000
  *              DESCRIPTION         = 'D'                            * 00680000
  *                                                                   * 00690000
  *              SYMBOLIC LABEL/NAME = OUTAREA .OUTPUT                * 00700000
  *              DESCRIPTION         = SCREEN DETAIL OUTPUT           * 00710000
  *                                                                   * 00720000
  *  EXIT-NORMAL =                                                    * 00730000
  *                                                                   * 00740000
  *  EXIT-ERROR =                                                     * 00750000
  *                                                                   * 00760000
  *     RETURN CODE =     NONE                                        * 00770000
  *                                                                   * 00780000
  *     ABEND CODES =     NONE                                        * 00790000
  *                                                                   * 00800000
  *     ERROR-MESSAGES =                                              * 00810000
  *       DSN8018I 'CURRENT' DEPARTMENT NOT FOUND                     * 00820000
  *       DSN8019E 'HIGHER' DEPARTMENT DOES NOT EXIST                 * 00830000
  *       DSN8038I 'CURRENT' PROJECT NOT FOUND                        * 00840000
  *       DSN8056I NO MORE DATA TO DISPLAY                            * 00850000
  *       DSN8066E UNSUPPORTED PFK OR LOGIC ERROR                     * 00860000
  *       DSN8070E VITAL DATA IS MISSING IN                           * 00870000
  *                 TABLE 'TOPTVAL'                                   * 00880000
  *       DSN8073E SPECIFIED LINE-NUMBER NOT FOUND IN                 * 00890000
  *                 PREVIOUS SCREEN                                   * 00900000
  *                                                                   * 00910000
  *                                                                   * 00920000
  *  EXTERNAL REFERENCES =                                            * 00930000
  *     ROUTINES/SERVICES =                                           * 00940000
  *       DSN8MPG = ERROR MESSAGE ROUTINE                             * 00950000
  *                                                                   * 00960000
  *     DATA-AREAS =                                                  * 00970000
  *       DSN8MPEM = DCLGEN FOR VEMP     - EMPLOYEE TABLE             * 00980000
  *       DSN8MPPJ = DCLGEN FOR VPROJ    - PROJECT TABLE              * 00990000
  *       DSN8MPSA = DCLGEN FOR VSTAFACT - STAFFING LIST TABLE        * 01000000
  *       DSN8MPOV = DCLGEN FOR VOPTVAL  - OPTIONS VALIDATION TABLE   * 01010000
  *       DSN8MPDT = DCLGEN FOR VDSPTXT  - DISPLAY AREA TEXT TABLE    * 01020000
  *       DSN8MPCA = SAMPLE APPLICATION COMMUNICATIONS AREA           * 01030000
  *       DSN8MPDH = CURSOR FOR DISPLAY AREA TEXT                     * 01040000
  *       DSN8MPSL = CURSOR FOR PROJECT STAFFING LIST                 * 01050000
  *                                                                   * 01060000
  *     CONTROL-BLOCKS =                                              * 01070000
  *       SQLCA    = SQL COMMUNICATION AREA                           * 01080000
  *                                                                   * 01090000
  *  TABLES = NONE                                                    * 01100000
  *                                                                   * 01110000
  *  CHANGE-ACTIVITY =  NONE                                          * 01120000
  *                                                                   * 01130000
  *                                                                   * 01140000
  * *PSEUDOCODE*                                                      * 01150000
  *                                                                   * 01160000
  *   PROCEDURE                                                       * 01170000
  *    MAIN PROCESSING.                                               * 01180000
  *      SQL-GET TEXTLINES (HEADER, INFO AND PFK) FROM TABLE VOPTVAL  * 01190000
  *      IF NOT FOUND, ERROR('070E')                                  * 01200000
  *      IF NEW REQUEST THEN                                          * 01210000
  *         IF MAX SELECTION IS 1 THEN SELECTED-LINE = '01'           * 01220000
  *         ELSE GET SELECTED-LINE FROM INPUT DATA                    * 01230000
  *         FIND SELECTED PROJECT IN PREVIOUS SCREEN                  * 01240000
  *         IF NOT FOUND, ERROR('073E')                               * 01250000
  *      SQL-FETCH DISPLAY AREA HEADER LINES FROM VDSPTXT USING DH    * 01260000
  *      IF NEW REQUEST THEN                                          * 01270000
  *         CLEAR SAVED SCROLLING LIMITS                              * 01280000
  *         CALL BUILD-PROJECT-LINE                                   * 01290000
  *         CALL BUILD-DISPLAY-ASCENDING                              * 01300000
  *      ELSE                                                         * 01310000
  *         FIND SELECTED PROJECT IN PREVIOUS SCREEN                  * 01320000
  *         SELECT PFK VALUE                                          * 01330000
  *           WHEN('08' OR 'NEXT') CALL BUILD-DISPLAY-ASCENDING       * 01340000
  *           OTHERWISE ERROR('066E')                                 * 01350000
  *      RETURN TO CALLER (OF DSN8MPT)                                * 01360000
  *                                                                   * 01370000
  *    ERROR AND MESSAGE HANDLER.                                     * 01380000
  *      SQL-GET MESSAGE TEXT FROM DSN8MPG FOR GIVEN ARGUMENT         * 01390000
  *      IF NOT FOUND, BUILD MESSAGE TEXT                             * 01400000
  *      RETURN TO CALLER (OF DSN8MPT)                                * 01410000
  *                                                                   * 01420000
  *    BUILD-PROJECT-LINE.                                            * 01430000
  *      SQL-GET PROJECT DATA FOR 'CURRENT' PROJECT                   * 01440000
  *              FROM TABLE VPROJ                                     * 01450000
  *      IF 'CURRENT' PROJECT NOT FOUND, ERROR('037I')                * 01460000
  *      MOVE PROJECT DATA TO PROJECT LINE IN DISPLAY AREA            * 01470000
  *      SQL-GET EMPLOYEE DATA FOR RESPONSIBLE EMPLOYEE               * 01480000
  *              FROM TABLE VEMP                                      * 01490000
  *      IF FOUND, MOVE EMPLOYEE NAME TO PROJECT LINE IN DISPLAY AREA * 01500000
  *      RETURN TO CALLER                                             * 01510000
  *                                                                   * 01520000
  *    BUILD-DISPLAY-ASCENDING.                                       * 01530000
  *      SQL-OPEN CURSOR SLA                                          * 01540000
  *      DO WHILE(MORE DATA AND THERE IS ROOM IN DISPLAY AREA)        * 01550000
  *        SQL-FETCH INTO PSTAFACT USING SLA                          * 01560000
  *        IF FIRST TIME                                              * 01570000
  *          CLEAR DISPLAY AREA (EXCEPT HEADERS)                      * 01580000
  *        SELECT RECORD TYPE                                         * 01590000
  *          WHEN('1')  PUT ESTIMATE DATA (MAY BE NULL)               * 01600000
  *          WHEN('2')  PUT STAFFING DATA (MAY BE NULL)               * 01610000
  *        MOVE CURRENT LINE                                          * 01620000
  *      END                                                          * 01630000
  *      IF NO DATA FOUND, MESSAGE('056I')                            * 01640000
  *      SAVE LIMIT VALUE FOR NEXT TIME SCROLLING                     * 01650000
  *      SQL-CLOSE CURSOR SLA                                         * 01660000
  *      IF THERE IS SAME ACTIVITY ON TWO CONSECUTIVE LINES,          * 01670000
  *        BLANK THE SECOND ONE                                       * 01680000
  *      RETURN TO CALLER                                             * 01690000
  *  END.                                                             * 01700000
  *-------------------------------------------------------------------*/01710000
                                                                        01720000
     /********************************************************/         01730000
     /*          **  FIELDS SENT TO MESSAGE ROUTINE          */         01740000
     /********************************************************/         01750000
                                                                        01760000
 DCL  MODULE            CHAR (07) INIT ('DSN8MPT');                     01770000
 DCL  OUTMSG            CHAR (69);                                      01780000
                                                                        01790000
 /********************************************************************/ 01800000
 /*          ** BUILT-IN FUNCTIONS                                   */ 01810000
 /********************************************************************/ 01820000
    DCL                                                                 01830000
      (ADDR,                                                            01840000
       HBOUND,                                                          01850000
       HIGH,                                                            01860000
       LENGTH,                                                          01870000
       LOW,                                                             01880000
       SUBSTR) BUILTIN;                                                 01890000
                                                                        01900000
 /********************************************************************/ 01910000
 /*          ** PROGRAM VARIABLES                                    */ 01920000
 /********************************************************************/ 01930000
                                                                        01940000
    DCL                                                                 01950000
       TOPLINE         FIXED BIN(31), /* TOP LINE ON     SCREEN */      01960000
       BOTLINE         FIXED BIN(31), /* BOTTOM LINE ON  SCREEN */      01970000
       CURRLINE        FIXED BIN(31), /* CURRENT LINE ON SCREEN */      01980000
       I               FIXED BIN(31),                                   01990000
       CURRLINE_PTR    PTR,           /* CURRENT LINE POINTER   */      02000000
       PREV_ACTNO      FIXED DEC(5),                                    02010000
       LINE_SELECT_C   CHAR(2),                                         02020000
       LINE_SELECT_P   PIC'99' DEF LINE_SELECT_C;                       02030000
                                                               %SKIP(2);02040000
   /***************************************************************/    02050000
   /* ARRAY USED TO RECOGNIZE 'NULL'- VALUES FOR SPECIFIC FIELDS  */    02060000
   /* IN THE 'PSTAFACT' STRUCTURE                                 */    02070000
   /***************************************************************/    02080000
                                                                        02090000
    DCL                                                                 02100000
       NULL_INDICATORS(11) FIXED BIN(15);                               02110000
                                                                  %PAGE;02120000
   /***************************************************************/    02130000
   /* THREE OVERLAYS USED TO PLACE OUTPUT DATA CORRECT ON SCREEN  */    02140000
   /***************************************************************/    02150000
                                                                        02160000
    DCL                                                                 02170000
       1 PROJ_LINE  BASED(CURRLINE_PTR),       /* PROJECT          */   02180000
        3 P1NO  CHAR( 6),                                               02190000
        3 X11   CHAR( 1),                                               02200000
        3 P1NA  CHAR(24),                                               02210000
        3 X12   CHAR( 1),                                               02220000
        3 P1ST  CHAR(10),                                               02230000
        3 X13   CHAR( 1),                                               02240000
        3 P1EN  CHAR(10),                                               02250000
        3 X14   CHAR( 2),                                               02260000
        3 P1ES  PIC'ZZV.99',                                            02270000
        3 X15   CHAR( 3),                                               02280000
        3 P1RE  CHAR(16);                                               02290000
                                                               %SKIP(2);02300000
    DCL                                                                 02310000
       1 ESTM_LINE  BASED(CURRLINE_PTR),       /* ACTIVITY ESTIMATE */  02320000
        3 X21   CHAR( 1),                                               02330000
        3 E1NO  PIC'ZZZZZ',                                             02340000
        3 X22   CHAR( 1),                                               02350000
        3 E1NA  CHAR(23),                                               02360000
        3 X23   CHAR( 2),                                               02370000
        3 E1ST  CHAR(10),                                               02380000
        3 X24   CHAR( 1),                                               02390000
        3 E1EN  CHAR(10),                                               02400000
        3 X25   CHAR( 2),                                               02410000
        3 E1ES  PIC'ZZV.ZZ',                                            02420000
        3 X26   CHAR(20);                                               02430000
                                                               %SKIP(2);02440000
    DCL                                                                 02450000
       1 STAF_LINE  BASED(CURRLINE_PTR),        /* STAFFING        */   02460000
        3 X31   CHAR( 1),                                               02470000
        3 S1NO  PIC'ZZZZZ',                                             02480000
        3 X32   CHAR( 1),                                               02490000
        3 S1NA  CHAR(23),                                               02500000
        3 X33   CHAR( 2),                                               02510000
        3 S1ST  CHAR(10),                                               02520000
        3 X34   CHAR( 1),                                               02530000
        3 S1EN  CHAR(10),                                               02540000
        3 X35   CHAR( 3),                                               02550000
        3 S1AL  PIC'ZZV.99',                                            02560000
        3 X36   CHAR( 2),                                               02570000
        3 S1RE  CHAR(16),                                               02580000
        3 X37   CHAR( 1);                                               02590000
                                                                  %PAGE;02600000
   /***************************************************************/    02610000
   /*      ** INITIALIZE CONTROL FIELD TO DETAIL HANDLER          */    02620000
   /*      ** INITIALIZE MODULE TO DSN8MPD                        */    02630000
   /***************************************************************/    02640000
                                                                        02650000
    PCONVSTA.PREV = 'D';                /*INITIALIZE CONTROL FIELD*/    02660000
    DSN8_MODULE_NAME.MAJOR = 'DSN8MPT'; /*INITIALIZE MODULE NAME  */    02670000
    DSN8_MODULE_NAME.MINOR = '';        /* CLEAR ROUTINE NAME     */    02680000
                                                                        02690000
   /*************************************************************/      02700000
   /*  ** RETRIEVE HEADING LINE, PFKEY DESCRIPTION, AND MESSAGE */      02710000
   /*************************************************************/      02720000
                                                                        02730000
    EXEC SQL SELECT  *                  /* RETRIEVE INFORMATION */      02740000
                                                                        02750000
               INTO :POPTVAL                                            02760000
               FROM  VOPTVAL                                            02770000
               WHERE MAJSYS   = :INAREA.MAJSYS                          02780000
                 AND ACTION   = :INAREA.ACTION                          02790000
                 AND OBJFLD   = :INAREA.OBJFLD                          02800002
                 AND SCRTYPE  = 'D';                                    02810000
                                                               %SKIP(2);02820000
    IF SQLCODE^=0 THEN                                                  02830000
                               /* SOME VITAL DATA IS MISSING IN */      02840000
                               /* THE PROGRAM RELATED TABLE     */      02850000
                               /* PRINT ERROR MESSAGE           */      02860000
                                                                        02870000
       DO;                                                              02880000
          CALL DSN8MPG (MODULE, '070E', OUTMSG);                        02890000
          CALL ERROR_HANDLER;               /* WITHOUT RETURNING*/      02900000
       END;                                                             02910000
                                                                        02920000
   /*********************************************************/          02930000
   /*      ** PUT DATA IN THE SCREEN                        */          02940000
   /*********************************************************/          02950000
                                                                        02960000
    PCONVSTA.LASTSCR  = 'DSN8001';                                      02970000
    PCONVSTA.TITLE    =  POPTVAL.HEADTXT;   /* OBTAIN HEADING       */  02980000
    PCONVSTA.MSG      =  POPTVAL.INFOTXT;   /* OBTAIN MESSAGE INFO. */  02990000
    PCONVSTA.PFKTEXT  =  POPTVAL.PFKTXT;    /* OBTAIN PFKEY INFO.   */  03000000
                                                                  %PAGE;03010000
                                                                        03020000
                                 /* SET UP INDEX FOR THE BOTTOMLINE */  03030000
                                 /* IN THE DISPLAY AREA             */  03040000
                                                                        03050000
    BOTLINE = HBOUND(PCONVSTA.LINE,1);                                  03060000
                                                                        03070000
   /*********************************************************/          03080000
   /* ** DETERMINE IF NEW REQUEST                           */          03090000
   /* ** IF SO, PREVIOUS REQUEST WAS SECONDARY SEL          */          03100000
   /*********************************************************/          03110000
                                                                        03120000
    IF COMPARM.NEWREQ='Y' THEN       /* NEW REQUEST ?     */            03130000
       DO;                                                              03140000
          IF PCONVSTA.MAXSEL=1 THEN                                     03150000
             LINE_SELECT_C = '01';   /* SPECIFIED LINE NO. = '01'*/     03160000
                                                                        03170000
          ELSE                       /* ELSE                     */     03180000
                                     /* GET SPECIFIED LINE NO.   */     03190000
                                     /* FROM INPUT DATA          */     03200000
                                                                        03210000
             DO;                                                        03220000
                LINE_SELECT_C = SUBSTR(COMPARM.INAREA.DATA,1,2);        03230000
                PCONVSTA.OUTAREA.DATA  = '';                            03240000
             END;                                                       03250000
                                                               %SKIP(2);03260000
          DO I=1 TO HBOUND(DSN8MP2_POS.LINENO,1);                       03270000
             IF LINE_SELECT_P = DSN8MP2_POS(I).LINENO THEN              03280000
                LEAVE;                                                  03290000
          END;                                                          03300000
                                                               %SKIP(2);03310000
          IF I>HBOUND(DSN8MP2_POS.LINENO,1) THEN                        03320000
                                                                        03330000
                                 /* THE SPECIFIED LINE NO. WAS NOT */   03340000
                                 /* FOUND IN THE PREVIOUS SCREEN   */   03350000
             DO;                 /* PRINT ERROR MESSAGE            */   03360000
                CALL DSN8MPG (MODULE, '073E', OUTMSG);                  03370000
                CALL ERROR_HANDLER;            /* WITHOUT RETURNING*/   03380000
             END;                                                       03390000
                                                               %SKIP(2);03400000
                                 /* SAVE SELECTED PROJECT NUMBER*/      03410000
                                                                        03420000
          PSTAFACT.PROJNO = DSN8MP2_POS(I).PROJNUM;                     03430000
       END;                                                             03440000
                                                                  %PAGE;03450000
     /**********************************************************/       03460000
     /*  ** USING THE SQL-CURSOR 'DH'                          */       03470000
     /*  ** GET HEATING LINES FOR DISPLAY AREA                 */       03480000
     /**********************************************************/       03490000
                                                                        03500000
    EXEC SQL OPEN DH;                     /* OPEN DH CURSOR    */       03510000
                                                                        03520000
    DO I=1 TO BOTLINE UNTIL(SQLCODE^=0);  /* GET HEATING LINES */       03530000
       EXEC SQL FETCH DH                                                03540000
                 INTO :PDSPTXT.DSPLINE, :PDSPTXT.LINENO;                03550000
       IF SQLCODE=0 THEN                                                03560000
          PCONVSTA.LINE(I) = PDSPTXT.DSPLINE;                           03570000
    END;                                                                03580000
    EXEC SQL CLOSE DH;                    /*  CLOSE DH CURSOR   */      03590000
                                                                        03600000
                                   /* TOPLINE IS THE FIRST AVAILABLE */ 03610000
    TOPLINE = I;                   /* LINE IN THE DISPLAY AREA       */ 03620000
    CURRLINE_PTR = ADDR(PCONVSTA.LINE(TOPLINE));                        03630000
                                                                  %PAGE;03640000
    IF COMPARM.NEWREQ='Y' THEN                                          03650000
                                   /* THIS IS A NEW REQUEST, SO MAKE */ 03660000
                                   /* SURE WE DON'T LIMIT OUT SEARCH */ 03670000
       DO;                                                              03680000
         MPTSAVE.ACTMIN =  0;                                           03690000
         MPTSAVE.NULMIN =  0;                                           03700000
         MPTSAVE.STDMIN = '1601-01-01';                                 03710000
         MPTSAVE.TYPMIN =  LOW(LENGTH(TYPMIN));                         03720000
         MPTSAVE.EMPMIN =  LOW(LENGTH(EMPMIN));                         03730000
                                                                        03740000
          CALL BUILD_PROJECT_LINE;        /* BUILD THE PROJECT LINE */  03750000
          CALL BUILD_DISPLAY_ASCENDING;   /* BUILD DISPLAY AREA  */     03760000
       END;                                                             03770000
    ELSE                                                                03780000
                                   /* THIS IS AN ANSWER (SHOULD BE A */ 03790000
                                   /* SCROLL REQUEST) SO WE SAVE THE */ 03800000
                                   /* CURRENT PROJECT                */ 03810000
                                   /* FROM THE PREVIOUS SCREEN       */ 03820000
       DO;                                                              03830000
          PSTAFACT.PROJNO = CURRLINE_PTR->PROJ_LINE.P1NO;               03840000
                                                                        03850000
                                   /* DETERMINE THE SCROLL REQUEST   */ 03860000
                                   /* AND CALL CORRESPONDING ROUTINE */ 03870000
          SELECT;                                                       03880000
             WHEN(COMPARM.PFKIN='08',               /*PFKEY 8 OR NEXT*/ 03890000
                  SUBSTR(COMPARM.DATA,1,4)='NEXT')                      03900000
                CALL BUILD_DISPLAY_ASCENDING;                           03910000
                                                                        03920000
                                   /* UNSUPPORTED PFK OR LOGIC ERROR */ 03930000
             OTHERWISE             /* PRINT ERROR MESSAGE            */ 03940000
                DO;                                                     03950000
                   CALL DSN8MPG (MODULE, '066E', OUTMSG);               03960000
                   CALL ERROR_HANDLER;           /* WITHOUT RETURNING*/ 03970000
                END;                                                    03980000
          END;                                                          03990000
       END;                                                             04000000
                                                                  %PAGE;04010000
 BUILD_PROJECT_LINE:                                                    04020000
    PROC REORDER;                                                       04030000
       DSN8_MODULE_NAME.MINOR = 'PROJLINE';                             04040000
       EXEC SQL SELECT  *                                               04050000
                  INTO :PPROJ:PNULLS_INDS                               04060000
                  FROM  VPROJ                                           04070000
                  WHERE PROJNO=:PSTAFACT.PROJNO;                        04080000
                                                               %SKIP(2);04090000
       IF SQLCODE^=0 THEN                                               04100000
          DO;                                                           04110000
             CALL DSN8MPG (MODULE, '038I', OUTMSG);                     04120000
             CALL ERROR_HANDLER;                /* WITHOUT RETURNING*/  04130000
          END;                                                          04140000
                                                               %SKIP(2);04150000
       PROJ_LINE      = '';                                             04160000
       PROJ_LINE.P1NO = PPROJ.PROJNO;                                   04170000
       PROJ_LINE.P1NA = PPROJ.PROJNAME;                                 04180000
                                                                        04190000
 /********************************************************************/ 04200000
 /* IF THE NULL INDICATOR FOR THE START DATE IS 0, THE VALUE IS NOT  */ 04210000
 /* NULL.  SET THE START DATE TO THE RETRIEVE VALUE.  IF THE NULL    */ 04220000
 /* INDICATOR IS -1 THEN THE VALUE IS NULL.  SET THE START DATE TO   */ 04230000
 /* BLANKS.                                                          */ 04240000
 /********************************************************************/ 04250000
                                                                        04260000
       IF PNULLS_INDS(6) = 0 THEN                                       04270000
         PROJ_LINE.P1ST = PPROJ.PRSTDATE;                               04280000
       ELSE                                                             04290000
         PROJ_LINE.P1ST = BLKDATE;                                      04300000
                                                                        04310000
 /********************************************************************/ 04320000
 /* IF THE NULL INDICATOR FOR THE END DATE IS 0, THE VALUE IS NOT    */ 04330000
 /* NULL.  SET THE START DATE TO THE RETRIEVE VALUE.  IF THE NULL    */ 04340000
 /* INDICATOR IS -1 THEN THE VALUE IS NULL.  SET THE END DATE TO     */ 04350000
 /* BLANKS.                                                          */ 04360000
 /********************************************************************/ 04370000
                                                                        04380000
       IF PNULLS_INDS(7) = 0 THEN                                       04390000
         PROJ_LINE.P1EN = PPROJ.PRENDATE;                               04400000
       ELSE                                                             04410000
         PROJ_LINE.P1EN = BLKDATE;                                      04420000
       PROJ_LINE.P1ES = PPROJ.PRSTAFF;                                  04430000
                                                               %SKIP(2);04440000
                         /* HERE WE CAN PUT CODE TO FIND THE */         04450000
                         /* RESPONSIBLE EMPLOYEE FOR THE PROJECT*/      04460000
                                                                        04470000
   /*************************************************************/      04480000
   /*   ** GET THE RESPONSIBLE EMPLOYEE                         */      04490000
   /*   ** FROM TABLE VEMP                                      */      04500000
   /*************************************************************/      04510000
                                                                        04520000
       EXEC SQL SELECT  *                                               04530000
                  INTO :PEMP.EMPNO,                                     04540000
                       :PEMP.FIRSTNME,                                  04550000
                       :PEMP.MIDINIT,                                   04560000
                       :PEMP.LASTNAME,                                  04570000
                       :PEMP.WORKDEPT:NULL_IND1                         04580000
                  FROM VEMP                                             04590000
                  WHERE EMPNO=:PPROJ.RESPEMP;                           04600000
                                                               %SKIP(2);04610000
       IF SQLCODE=0 THEN                                                04620000
          DO;                                                           04630000
             IF NULL_IND1 = -1 THEN                                     04640000
               PEMP.WORKDEPT = ' ';                                     04650000
             PROJ_LINE.P1RE = PEMP.LASTNAME||' '||                      04660000
                       SUBSTR(PEMP.FIRSTNME,1,1)||                      04670000
                              PEMP.MIDINIT;                             04680000
          END;                                                          04690000
                                                               %SKIP(2);04700000
    END /* OF PROCEDURE BUILD_PROJECT_LINE */;                          04710000
                                                                  %PAGE;04720000
   /**********************************************************/         04730000
   /*  ** BUILD DISPLAY AREA                                 */         04740000
   /**********************************************************/         04750000
                                                               %SKIP(2);04760000
 BUILD_DISPLAY_ASCENDING:                                               04770000
    PROC REORDER;                                                       04780000
                                                               %SKIP(2);04790000
       DSN8_MODULE_NAME.MINOR = 'BUILD_A';     /* GET ROUTINE NAME   */ 04800000
                                                               %SKIP(2);04810000
       EXEC SQL OPEN SLA;                      /* OPEN SLA CURSOR    */ 04820000
                                                                        04830000
                                 /* LEAVE PROJECT LINE AND ONE MORE */  04840000
                                 /* BLANK IN THE DISPLAY AREA       */  04850000
                                                                        04860000
       CURRLINE = TOPLINE+2;                                            04870000
                                   /* WE WILL SELECT DATA AS LONG AS */ 04880000
                                   /* THERE IS ROOM IN DISPLAY AREA  */ 04890000
       DO WHILE( CURRLINE<=BOTLINE & SQLCODE=0 );                       04900000
                                                               %SKIP(2);04910000
          EXEC SQL FETCH SLA                                            04920000
                    INTO :PSTAFACT :NULL_INDICATORS;                    04930000
                                                               %SKIP(2);04940000
          IF SQLCODE=0 THEN                                             04950000
                                   /* WE HAVE FOUND SOME DATA SO WE  */ 04960000
                                   /* ADDRESS CURRENT AND NEXT LINES */ 04970000
                                                                        04980000
             DO;                                                        04990000
                CURRLINE_PTR = ADDR(PCONVSTA.LINE(CURRLINE));           05000000
                                                               %SKIP(2);05010000
                                                                        05020000
     /*************************************************************/    05030000
     /* ** THIS ROUTINE IS ONLY PERFORMED THE FIRST TIME AND IT...*/    05040000
     /* ** CLEARS THE DISPLAY AREA                                */    05050000
     /* ** PUTS LEFT SIDE DEPARTMENT AND MANAGER IN PLACE         */    05060000
     /* ** SAVES DATA FOR FUTURE SCROLLING                        */    05070000
     /*************************************************************/    05080000
                                                                        05090000
                IF CURRLINE=TOPLINE+2 THEN                              05100000
                                                                        05110000
                                           /* CLEAR DISPLAY AREA */     05120000
                                                                        05130000
                   DO I=TOPLINE+1 TO BOTLINE;                           05140000
                      PCONVSTA.LINE(I) = '';                            05150000
                   END;                                                 05160000
                                                               %SKIP(2);05170000
   /*********************************************************/          05180000
   /*     ** IF '1'- DATA IS ESTIMATE                       */          05190000
   /*     ** THERE MAY BE 'NULL'-VALUES,                    */          05200000
   /*     ** SO WE MUST TEST THE INDICATORS                 */          05210000
   /*********************************************************/          05220000
                                                                        05230000
                SELECT( PSTAFACT.TYPE );                                05240000
                   WHEN('1')                                            05250000
                      DO;                                               05260000
                         ESTM_LINE.E1NO = PSTAFACT.ACTNO;               05270000
                         ESTM_LINE.E1NA = PSTAFACT.ACTDESC;             05280000
                         IF NULL_INDICATORS(9)=0 THEN                   05290000
                            ESTM_LINE.E1ST = PSTAFACT.STDATE;           05300000
                         ELSE                                           05310000
                            ESTM_LINE.E1ST = BLKDATE;                   05320000
                         IF NULL_INDICATORS(10)=0 THEN                  05330000
                            ESTM_LINE.E1EN = PSTAFACT.ENDATE;           05340000
                         ELSE                                           05350000
                            ESTM_LINE.E1EN = BLKDATE;                   05360000
                         IF NULL_INDICATORS(8)=0 THEN                   05370000
                            ESTM_LINE.E1ES = PSTAFACT.EMPTIME;          05380000
                         ELSE                                           05390000
                            ESTM_LINE.E1ES = 0;                         05400000
                      END;                                              05410000
                                                               %SKIP(2);05420000
   /*********************************************************/          05430000
   /*     ** IF '2'- DATA IS STAFFING                       */          05440000
   /*     ** THERE MAY BE 'NULL'-VALUES,                    */          05450000
   /*     ** SO WE MUST TEST THE INDICATORS                 */          05460000
   /*********************************************************/          05470000
                   WHEN('2')                                            05480000
                      DO;                                               05490000
                         STAF_LINE.S1NO = PSTAFACT.ACTNO;               05500000
                         STAF_LINE.S1NA = PSTAFACT.ACTDESC;             05510000
                         IF NULL_INDICATORS(9)=0 THEN                   05520000
                            STAF_LINE.S1ST = PSTAFACT.STDATE;           05530000
                         ELSE                                           05540000
                            STAF_LINE.S1ST = '0000-00-00';              05550000
                         IF NULL_INDICATORS(10)=0 THEN                  05560000
                            STAF_LINE.S1EN = PSTAFACT.ENDATE;           05570000
                         ELSE                                           05580000
                            STAF_LINE.S1EN = BLKDATE;                   05590000
                         IF NULL_INDICATORS(8)=0 THEN                   05600000
                            STAF_LINE.S1AL = PSTAFACT.EMPTIME;          05610000
                         ELSE                                           05620000
                            STAF_LINE.S1AL = 0;                         05630000
                         STAF_LINE.S1AL = PSTAFACT.EMPTIME;             05640000
                         STAF_LINE.S1RE = PSTAFACT.LASTNAME||' '||      05650000
                                   SUBSTR(PSTAFACT.FIRSTNME,1,1)||      05660000
                                          PSTAFACT.MIDINIT;             05670000
                      END;                                              05680000
                                                               %SKIP(2);05690000
                                 /* IGNORE IF TYPE IS NOT '1'1 OR '2'*/ 05700000
                   OTHERWISE;                                           05710000
                END;                                                    05720000
                                 /* MOVE CURRENT LINE FOR NEXT TIME  */ 05730000
                CURRLINE = CURRLINE+1;                                  05740000
             END;                                                       05750000
       END;                                                             05760000
                                                               %SKIP(2);05770000
     /****************************************************************/ 05780000
     /*    ** IF '3'- NO DATA FOUND                                  */ 05790000
     /*    ** MOVE CURRENT LINE TO BOTTOM LINE (TERMINATE)           */ 05800000
     /****************************************************************/ 05810000
       IF CURRLINE=TOPLINE+2 THEN                                       05820000
                                 /* NO DATA FOUND, SO SETUP  */         05830000
                                 /* FOR NEXT TIME SCROLLING  */         05840000
                                 /* GO AND GIVE ERROR-MESSAGE*/         05850000
                DO;                                                     05860000
                                                                        05870000
             MPTSAVE.ACTMIN =  32767;                                   05880000
             MPTSAVE.NULMIN =  32767;                                   05890000
             MPTSAVE.STDMIN = '9999-12-31';                             05900000
             MPTSAVE.TYPMIN = HIGH(LENGTH(TYPMIN));                     05910000
             MPTSAVE.EMPMIN = HIGH(LENGTH(EMPMIN));                     05920000
             CALL DSN8MPG (MODULE, '056I', OUTMSG);                     05930000
             CALL ERROR_HANDLER;            /* WITHOUT RETURNING */     05940000
          END;                                                          05950000
                                                               %SKIP(2);05960000
       IF SQLCODE^=0 THEN                                               05970000
                                                                        05980000
                                /* WE HAVE REACHED END OF SEARCH */     05990000
                                /* SAVE FOR NEXT TIME SCROLLING  */     06000000
          DO;                                                           06010000
             MPTSAVE.ACTMIN =  32767;                                   06020000
             MPTSAVE.NULMIN =  32767;                                   06030000
             MPTSAVE.STDMIN = '9999-12-31';                             06040000
             MPTSAVE.TYPMIN = HIGH(LENGTH(TYPMIN));                     06050000
             MPTSAVE.EMPMIN = HIGH(LENGTH(EMPMIN));                     06060000
          END;                                                          06070000
                                                               %SKIP(2);06080000
       ELSE                                                             06090000
                               /* LAST DATA FOUND WILL BE SAVED */      06100000
                               /* FOR NEXT TIME SCROLLING       */      06110000
          DO;                                                           06120000
             MPTSAVE.ACTMIN = PSTAFACT.ACTNO;                           06130000
             MPTSAVE.NULMIN = PSTAFACT.ACTNO;                           06140000
             IF NULL_INDICATORS(9)=0 THEN                               06150000
                MPTSAVE.STDMIN = PSTAFACT.STDATE;                       06160000
             ELSE                                                       06170000
                DO;                                                     06180000
                   MPTSAVE.STDMIN = '9999-12-31';                       06190000
                   MPTSAVE.NULMIN =  32767;                             06200000
                END;                                                    06210000
             MPTSAVE.TYPMIN = PSTAFACT.TYPE;                            06220000
             MPTSAVE.EMPMIN = PSTAFACT.EMPNO;                           06230000
          END;                                                          06240000
                                                               %SKIP(2);06250000
       EXEC SQL CLOSE SLA;                       /*CLOSE SLA CURSOR */  06260000
                                                               %SKIP(2);06270000
                                                                        06280000
                                /* IF WE HAVE THE SAME ACTIVITY ON */   06290000
                                /* TWO CONSECUTIVE LINES WE WILL   */   06300000
                                /* BLANK OUT THE SECOND ONE        */   06310000
       PREV_ACTNO   = 0;                                                06320000
       DO CURRLINE=TOPLINE+2 TO BOTLINE;                                06330000
          CURRLINE_PTR = ADDR(PCONVSTA.LINE(CURRLINE));                 06340000
          IF ESTM_LINE.E1NO=PREV_ACTNO THEN                             06350000
             DO;                                                        06360000
                ESTM_LINE.E1NO = 0;                                     06370000
                ESTM_LINE.E1NA = '';                                    06380000
             END;                                                       06390000
          ELSE                                                          06400000
             PREV_ACTNO = ESTM_LINE.E1NO;                               06410000
       END;                                                             06420000
                                                               %SKIP(2);06430000
    END;                    /* OF PROCEDURE BUILD_DISPLAY_ASCENDING */  06440000
                                                                  %PAGE;06450000
     /**********************************************************/       06460000
     /*    ** GETS ERROR TEXT AND PRINTS ERROR MESSAGES        */       06470000
     /**********************************************************/       06480000
 ERROR_HANDLER: PROC;                                                   06490000
       DSN8_MODULE_NAME.MINOR = 'ERROR_H';       /* GET ROUTINE NAME */ 06500000
                                                                        06510000
                                              /* MESSAGE TEXT FOUND  */ 06520000
                                              /* PRINT MESSAGE       */ 06530000
          PCONVSTA.MSG = OUTMSG;                                        06540000
       GOTO END_OF_DSN8MPT;                                             06550000
    END;                               /* OF PROCEDURE ERROR_HANDLER */ 06560000
                                                               %SKIP(2);06570000
 END_OF_DSN8MPT:;                                                       06580000
                                                               %SKIP(2);06590000
    DSN8_MODULE_NAME.MINOR = 'FINISHED';      /* FINISHED            */ 06600000
                                                               %SKIP(2);06610000
 END DSN8MPT;                                                           06620000