Search code examples
cobolcobol85cobol.netnetcobolprocobol

First calculated records in record-line/output-line becomes BLANK in output in COBOL


My calculations are correct. But the output file's ONLY first calculated record becomes as BLANK and affects all the records.

In the output file [A5-SalaryReport-5A.out], you may see the first record's position comes BLANK.

THIS IS MY INPUT FILE [A5.dat]

030ALLDREN RUTH   21G202000002200000
185DONNEMAN THOMAS06G042300900460000
004ACHER WILLIAM  01N072600500720000
325HATFIELD MARK  01G112200201100000
730REEDE OWEN     09G055501000620000
111CARTOLER VIOLET02G099800701000000
590NEIL CLARENCE  07N006500900100000
801SCHEIBER HARRY 01N100000001000000
956WANGLEY THEO   01N099999101000000
999BAKER RON      03G300001403500000
181DELBERT EDWARD 12G065901300770000
311GROLER GRACE   23N064302000770000
318HANEY CAROL    09G500001405500000
487KING MILDRED   18N091996301000000
834TRAWLEY HARRIS 05N732600507700000
027ALHOUER ELAINE 01G257300202500000
171COSTA NAN      15N035600500400000
317HANBEE ALETA   03G500000305500000
739RIDEL ROBERT   05N019400800200000
806STOCKTON NORMAN06G250700704300000
122CENNA DICK     03N577700406000000
207EBERHARDT RON  05G400700904500000
308GLEASON JAMES  01G500000305000000
568LYNNF GERALD   09N448701304500000
909UDSON DORIS    01N449900304500000
100BATES TONY     08N106602001000000
179DAMSON ERIC    03N250201802500000
292EVERLEY DONNA  03G200001702500000
409ICK MICK       25G999999910500000
607ODELLE NICK    10G250701803000000
825TILLMAN DON    12N044401900500000
214EDMONSON RICK  02N100000001000000
310GORMALLY MARIE 03N302200603000000
332HELD ANNA      02G400000204000000
689OWNEY REED     04N317460303500000
802SHEA MICHAEL   06G203300802300000
102BELLSLEY ART   08G300000903500000
282ESTABAN JUAN   19G405500004500000
322HARLETON JEAN  07N089901201000000
505LAMBERT JERRY  01G400100404000000
921ULL GEORGE     18N229885102500000
105BOYLE RALPH    08N804401407800000
215EDSON WILBUR   06G705000808000000
315HALE ALAN      12N400001604500000

THIS IS MY COBOL PROJECT FILE .cbl [A5-SalaryReport-5A.cbl]

    identification division.
       program-id. A5-SalaryReport-5A.
       author. Nirmal Patel.
       date-written. 11 March 2021.

*      NOTE: I could have finished this, I just had too much for 
*            this week so I couldn not give this enough time. And I 
*            started this assignment on the day it it was due, 5th 
*            March.

       environment division.
       input-output section.
       file-control.
       
                  select input-file
                      assign to "../../../data/A5.dat"
                      organization is line sequential.

                  select output-file
                      assign to "../../../data/A5-SalaryReport-5A.out"
                      organization is line sequential.
      *
                   select outputdat-file
                       assign to 
                       "../../../data/A5-SalaryData-NonGrad.dat"
                       organization is line sequential. 
       data division.
       file section.
              fd input-file
                  data record is input-rec
                  record contains 36 characters.
       01 input-rec.
         05 in-emp-no          pic 9(3).
         05 in-name            pic x(15).
         05 in-yrs-serv        pic 9(2).
         05 in-edu-code        pic x(1).
           88 il-88-type-K value "N".
         05 in-prsnt-sly       pic 9(5)V99.
         05 in-bgt-est         pic 9(6)V99.

       fd output-file
           data record is output-file
           record contains 120 characters.
*     
       01 output-line          pic x(120).

       fd outputdat-file
           data record is outputdat-line
           record contains 55 characters.

       01 outputdat-line       pic x(55).

       working-storage section.

       01 ws-eof-flag          pic x           value 'n'.
*
       01 ws-heading-info-line.
         05 filler             pic x(26)
           value "Nirmal Patel, Assignment 4".
*                 ----+----1----+----2----+-
         05 filler             pic x(15)       value spaces.
         05 filler             pic x(8)        value "20210411".
         05 filler             pic x(23)       value spaces.
         05 filler             pic x(7)        value "1951043".

       01 ws-heading-line-1.
         05 filler             pic x(30)       value spaces.
         05 filler             pic x(22)
           value "EMPLOYEE SALARY REPORT".
         05 filler             pic x(14)       value spaces.
         05 filler             pic x(6)        value "PAGE  ".
         05 page-num           pic 9           value 1.

       01 ws-heading-line-2.
         05 filler             pic x(3)        value "EMP".
         05 filler             pic x(2)        value spaces.
         05 filler             pic x(3)        value "EMP".
         05 filler             pic x(32)       value spaces.
         05 filler             pic x(7)        value "PRESENT".
         05 filler             pic x(2)        value spaces.
         05 filler             pic x(8)        value "INCREASE".
         05 filler             pic x(5)        value spaces.
         05 filler             pic x(3)        value "PAY".
         05 filler             pic x(11)       value spaces.
         05 filler             pic x(3)        value "NEW".

       01 ws-heading-line-3.
         05 filler             pic x(3)        value "NUM".
         05 filler             pic x(2)        value spaces.
         05 filler             pic x(4)        value "NAME".
         05 filler             pic x(10)       value spaces.
         05 filler             pic x(5)        value "YEARS".
         05 filler             pic x(1)        value spaces.
         05 filler             pic x(8)        value "POSITION".
         05 filler             pic x(8)        value spaces.
         05 filler             pic x(6)        value "SALARY".
         05 filler             pic x(5)        value spaces.
         05 filler             pic x(1)        value "%".
         05 filler             pic x(7)        value spaces.
         05 filler             pic x(8)        value "INCREASE".
         05 filler             pic x(7)        value spaces.
         05 filler             pic x(6)        value "SALARY".

       01 ws-record-line.
         05 ws-emp-num         pic 9(3).
         05 filler             pic x(1)        value spaces.
         05 ws-emp-name        pic 9(15).
         05 filler             pic x(2)        value spaces.
         05 ws-years           pic Z9.
         05 filler             pic x(2)        value spaces.
         05 ws-position        pic x(12).
         05 filler             pic x(2)        value spaces.
         05 ws-salary          pic ZZ,ZZ9.99.
         05 filler             pic x(2)        value spaces.
         05 ws-inc-per         pic 9(2).9.
         05 filler             pic x(1)        value "%".
         05 filler             pic x(3)        value spaces.
         05 ws-pay-inc         pic $ZZ,ZZ9.99.
         05 filler             pic x(1)        value "+".
         05 filler             pic x(1)        value spaces.
         05 filler             pic x(1)        value "$".
         05 filler             pic x(1)        value spaces.
         05 ws-new-salary      pic ZZ,ZZZ,ZZ9.99.

       01 ws-blank-line.
         05 ws-blank-position  pic x(12).

       01 ws-totals-line-1.
         05 filler             pic x(15)       value "EMPLOYEE CLASS:".
         05 filler             pic x(8)        value spaces.
         05 filler             pic x(7)        value "Analyst".
         05 filler             pic x(4)        value spaces.
         05 filler             pic x(8)        value "Sen Prog".
         05 filler             pic x(4)        value spaces.
         05 filler             pic x(4)        value "Prog".
         05 filler             pic x(4)        value spaces.
         05 filler             pic x(7)        value "Jr Prog".
         05 filler             pic x(4)        value spaces.
         05 filler             pic x(12)       value "Unclassified".

       01 ws-totals-line-2.
         05 filler             pic x(15)       value "# ON THIS PAGE:".
         05 filler             pic x(14)       value spaces.
         05 ws-no-of-analyst   pic 9.
         05 filler             pic x(11)       value spaces.
         05 ws-no-of-sen-prog  pic 9.
         05 filler             pic x(7)        value spaces.
         05 ws-no-of-prog      pic 9.
         05 filler             pic x(10)       value spaces.
         05 ws-no-of-jr-prog   pic 9.
         05 filler             pic x(15)       value spaces.
         05 ws-no-of-unclassified
                               pic 9.

       01 ws-sub-total-line-1.
         05 filler             pic x(18)
           value "AVERAGE INCREASES:".
         05 filler             pic x(3)        value spaces.
         05 filler             pic x(8)        value "ANALYST=".
         05 filler             pic x(5)        value spaces.
         05 ws-analyst-avg-inc pic Z,ZZ9.99.
         05 filler             pic x(5)        value spaces.
         05 filler             pic x(9)        value "SEN PROG=".
         05 filler             pic x(3)        value spaces.
         05 ws-sen-prog-avg-inc pic Z,ZZ9.99.

       01 ws-sub-total-line-2.
         05 filler             pic x(21)       value spaces.
         05 filler             pic x(5)        value "PROG=".
         05 filler             pic x(8)        value spaces.
         05 ws-prog-avg-inc    pic Z,ZZ9.99.
         05 filler             pic x(5)        value spaces.
         05 filler             pic x(8)        value "JR PROG=".
         05 filler             pic x(4)        value spaces.
         05 ws-jr-prog-avg-inc pic Z,ZZ9.99.

       01 ws-oth-line.
           05 filler                     pic x(25)
               value "  Type NON-GRADS count = ".
           05 ws-oth-staff-count         pic zz9.
           05 filler                     pic x(7)
               value spaces.           
           05 filler                     pic x(26)
               value "  Type NON-GRADA Salary = ".
           05 ws-oth-salary              pic $$$,$$$,$$9.
           05 filler                     pic x(38)
               value spaces.
           05 ws-calc-position           pic x(12).

       01 ws-const-calc.
         05 ws-page-count      pic 99          value 0.
         05 ws-edu-code        pic x(1).
         05 ws-o-staff-count   pic 999         value 0.
         05 ws-o-salary        pic 9(10)       value 0.
         05 ws-s-staff-count   pic 999         value 0.
         05 ws-s-salary        pic 9(10)       value 0.

       77 ws-lines-per-page    pic 99          value 20.
       77 ws-line-count        pic 99          value 0.

       procedure division.

       000-main.

           open input  input-file.
           open output output-file
                       outputdat-file.
       
           write output-line               from ws-heading-info-line
*
           read input-file
               at end
                   move "y"                to ws-eof-flag.
*
*      Process each input record and read in next record
*     
           perform 100-process-pages
             until ws-eof-flag equals "y".

           write output-line               from ws-sub-total-line-1
               after advancing 1 line.
           write output-line               from ws-sub-total-line-2.

           close input-file
                 output-file
                 outputdat-file.

           goback.

       100-process-pages.
      *
      *  Initialize detail calculation variables for page
      *
           move 0                          to ws-s-staff-count
                                              ws-s-salary
                                              ws-line-count.


           perform 110-print-headings.
*     
*       process input and output results until
*         current page has been filled
*         OR EOF has been encountered
*     
           perform 120-process-lines
             varying ws-line-count from 1 by 1
             until (ws-line-count > ws-lines-per-page
                                 OR ws-eof-flag = "y").
           perform 150-print-page-totals.
*


       110-print-headings.

*          Increase page count by 1
           add 1                           to ws-page-count.
           move ws-page-count              to page-num.
*
*       Write the report heading with a blank line before heading
*       and blank line after heading
*
           if (ws-page-count > 1) then
               write output-line
                 after advancing page
               write output-line           from ws-heading-line-1
                 after advancing 1 line
               write output-line           from ws-heading-line-2
                 after advancing 2 line
               write output-line           from ws-heading-line-3

           else
               write output-line           from ws-heading-line-1
                 after advancing 1 line
               write output-line           from ws-heading-line-2
                 after advancing 2 line
               write output-line           from ws-heading-line-3
           end-if.



       120-process-lines.
      * Decide whether to output to report or data file
      *
           if il-88-type-K
               perform 210-process-data-lines
           else
               add 1                       to ws-line-count
*              if ws-line-count = 1
*                  perform 120-print-headings
*              end-if
               perform 220-process-rpt-lines
               if   ws-line-count > ws-lines-per-page
                 or ws-eof-flag   = "y"
                   perform 230-print-page-totals 
               end-if
           end-if. 
*
*          Logic to calculate the POSITION based on years of xp..
*      
           if in-yrs-serv > 15
               then
               move "ANALYST"              to ws-calc-position
           else
**
               if in-yrs-serv > 7 and in-yrs-serv < 15
                 then
                   move "SEN PROG"         to ws-calc-position
               else
***
                   if in-yrs-serv > 2 and in-yrs-serv < 7
                     then
                       move "PROG"         to ws-calc-position
                   else
****
                       if in-yrs-serv < 2
                         then
                           move "UNCLASSIFIED"
                                           to ws-calc-position
*                                ----+----1--
                       end-if
****
                   end-if
***
               end-if
**
           end-if
*
*         Read next input record for the next iteration of perform loop
*     
           read input-file
               at end
                   move "y"                to ws-eof-flag.
*
*
       

       150-print-page-totals.
      *
*          PRINT TOTAL LINES
           write output-line               from ws-totals-line-1
              after advancing 2 line.
           write output-line               from ws-totals-line-2.
      *
*
 
       210-process-data-lines.
*
           add 1                           to ws-o-staff-count.
           add in-prsnt-sly                to ws-o-salary.
           move ws-position                to ws-blank-position.
      *
           write outputdat-line            from input-rec.

       220-process-rpt-lines.
*
*
      *  Count staff and accumulate salary for page subtotals
      *
           add 1                           to ws-s-staff-count.
           add in-prsnt-sly                to ws-s-salary.
*
*
*        Output Salesperson Detail Line
*
*         Clear the detail line
           move spaces                     to ws-record-line.
*
*
*         Move input lines(sales-file) to output lines(report-line)
*
           move in-emp-no                  to ws-emp-num.
           move in-name                    to ws-emp-name.
           move in-yrs-serv                to ws-years.
           move in-prsnt-sly               to ws-salary.
           move ws-page-count              to page-num.
           move ws-o-staff-count           to ws-oth-staff-count.
           move ws-calc-position           to ws-position.
*
           write output-line               from ws-record-line.

       230-print-page-totals.
      *  Move subtotals to subtotal line and write to output file
      *  with blank line after subtotal line
      *
      *
           write outputdat-line            from ws-record-line.
      *
      *
           move 0                          to   ws-s-staff-count
                                                ws-s-salary. 
      *  
*
       end program A5-SalaryReport-5A.

THIS IS MY OUTPUT FILE [A5-SalaryReport-5A.out]

Nirmal Patel, Assignment 4               20210411                       1951043

                              EMPLOYEE SALARY REPORT              PAGE  1

EMP  EMP                                PRESENT  INCREASE     PAY           NEW
NUM  NAME          YEARS POSITION        SALARY     %       INCREASE       SALARY
030 ALLDREN RUTH     21                20,200.00
185 DONNEMAN THOMAS   6  ANALYST        4,230.09
325 HATFIELD MARK     1  UNCLASSIFIED  11,220.02
730 REEDE OWEN        9  UNCLASSIFIED   5,550.10
111 CARTOLER VIOLET   2  SEN PROG       9,980.07
999 BAKER RON         3  UNCLASSIFIED  30,000.14
181 DELBERT EDWARD   12  PROG           6,590.13
318 HANEY CAROL       9  ANALYST       50,000.14


EMPLOYEE CLASS:        Analyst    Sen Prog    Prog    Jr Prog    Unclassified
# ON THIS PAGE:
# ON THIS PAGE:
                              EMPLOYEE SALARY REPORT              PAGE  2

EMP  EMP                                PRESENT  INCREASE     PAY           NEW
NUM  NAME          YEARS POSITION        SALARY     %       INCREASE       SALARY
027 ALHOUER ELAINE    1  PROG          25,730.02
317 HANBEE ALETA      3  UNCLASSIFIED  50,000.03
806 STOCKTON NORMAN   6  PROG          25,070.07
207 EBERHARDT RON     5  PROG          40,070.09
308 GLEASON JAMES     1  PROG          50,000.03
292 EVERLEY DONNA     3  PROG          20,000.17


EMPLOYEE CLASS:        Analyst    Sen Prog    Prog    Jr Prog    Unclassified
# ON THIS PAGE:
# ON THIS PAGE:
                              EMPLOYEE SALARY REPORT              PAGE  3

EMP  EMP                                PRESENT  INCREASE     PAY           NEW
NUM  NAME          YEARS POSITION        SALARY     %       INCREASE       SALARY
409 ICK MICK         25  PROG          99,999.99
607 ODELLE NICK      10  ANALYST       25,070.18
332 HELD ANNA         2  PROG          40,000.02
802 SHEA MICHAEL      6  PROG          20,330.08
102 BELLSLEY ART      8  PROG          30,000.09
282 ESTABAN JUAN     19  SEN PROG      40,550.00
505 LAMBERT JERRY     1  ANALYST       40,010.04


EMPLOYEE CLASS:        Analyst    Sen Prog    Prog    Jr Prog    Unclassified
# ON THIS PAGE:
# ON THIS PAGE:
                              EMPLOYEE SALARY REPORT              PAGE  4

EMP  EMP                                PRESENT  INCREASE     PAY           NEW
NUM  NAME          YEARS POSITION        SALARY     %       INCREASE       SALARY
215 EDSON WILBUR      6  SEN PROG      70,500.08


EMPLOYEE CLASS:        Analyst    Sen Prog    Prog    Jr Prog    Unclassified
# ON THIS PAGE:

AVERAGE INCREASES:   ANALYST=                  SEN PROG=
                     PROG=                     JR PROG=

I know it is not an ez thing to figure out and I appreciate whatever answer you provide.

Cheers!


Solution

  • The problem I see is that the correct value for ws-position shows on the next record; this happens because ws-calc-position is determined after the line is printed. This caused a blank on the first record and an incorrect value on the following print lines.

    I suggest moving the code for determining ws-calc-position to just before it is needed. 120-process-lines and 220-process-rpt-lines incorporates those suggestions.

    The IF code should not include AND, as expressed originally. It causes some values to be missed, where in-yrs-serv is 15, 07, or 02. Those particular values caused (or would cause) the previously determined position to appear in the output. That change has be made below.

    Also, this line

             05 ws-emp-name        pic 9(15).
    

    should be

             05 ws-emp-name        pic x(15).
    

           120-process-lines.
          * Decide whether to output to report or data file
          *
               if il-88-type-K
                   perform 210-process-data-lines
               else
                   add 1                       to ws-line-count
    *              if ws-line-count = 1
    *                  perform 120-print-headings
    *              end-if
                   perform 220-process-rpt-lines
                   if   ws-line-count > ws-lines-per-page
                     or ws-eof-flag   = "y"
                       perform 230-print-page-totals 
                   end-if
               end-if. 
    
    *  NOTE: Moved code to determine position to 225-determine-position
    
    *
    *         Read next input record for the next iteration of perform loop
    *     
               read input-file
                   at end
                       move "y"                to ws-eof-flag.
    
           220-process-rpt-lines.
    *
    *
          *  Count staff and accumulate salary for page subtotals
          *
               add 1                           to ws-s-staff-count.
               add in-prsnt-sly                to ws-s-salary.
    *
    *
    *        Output Salesperson Detail Line
    *
    *         Clear the detail line
               move spaces                     to ws-record-line.
    *
    *
    *         Move input lines(sales-file) to output lines(report-line)
    *
               move in-emp-no                  to ws-emp-num.
               move in-name                    to ws-emp-name.
               move in-yrs-serv                to ws-years.
               move in-prsnt-sly               to ws-salary.
               move ws-page-count              to page-num.
               move ws-o-staff-count           to ws-oth-staff-count.
               perform 225-determine-position.
               move ws-calc-position           to ws-position.
    *
               write output-line               from ws-record-line.
    
    
           225-determine-position. 
    *
    *          Logic to calculate the POSITION based on years of xp..
    *      
               if in-yrs-serv > 15
                   then
                   move "ANALYST"              to ws-calc-position
               else
    **
                   if in-yrs-serv > 7
                     then
                       move "SEN PROG"         to ws-calc-position
                   else
    ***
                       if in-yrs-serv > 2
                         then
                           move "PROG"         to ws-calc-position
                       else
    ****
                           move "UNCLASSIFIED" to ws-calc-position
    ****
                       end-if
    ***
                   end-if
    **
               end-if.