000010 IDENTIFICATION DIVISION. 000020 PROGRAM-ID. VALCARS8. 000030 AUTHOR. J.P.E. Hodgson. 000031 DATE-WRITTEN. 2000/03/14. 000032 000033* This is a sketch. It does not compile 000034* because not all the data items are defined. 000035 000040 000050 ENVIRONMENT DIVISION. 000060 INPUT-OUTPUT SECTION. 000070 FILE-CONTROL. 000080 SELECT STOCK-FILE ASSIGN TO SYSIN 000090 ORGANIZATION IS LINE SEQUENTIAL. 000100 SELECT VALID-STOCK-FILE ASSIGN TO SYSOUT 000110 ORGANIZATION IS LINE SEQUENTIAL. 000120 SELECT ERROR-FILE ASSIGN TO SYSPRINT 000130 ORGANIZATION IS LINE SEQUENTIAL. 000140 000150 DATA DIVISION. 000160 FILE SECTION. 000170 FD STOCK-FILE 000180 RECORD CONTAINS 47 CHARACTERS. 000190 01 STOCK-RECORD. 000200* As in the example for levels 05 AND 10. 000210* check the character counts 000220 FD VALID-STOCK-FILE 000230 RECORD CONTAINS 47 CHARACTERS. 000240 01 VALID-STOCK-RECORD PIC X(47). 000250 000260 FD ERROR-FILE 000270 RECORD CONTAINS 80 CHARACTERS. 000280 01 ERROR-RECORD PIC X(80). 000290 000300 000310 WORKING-STORAGE SECTION. 000320 01 PROGRAM-SWITCHES. 000330 05 NO-DATA-REMAINS-SWITCH PIC XXX VALUE SPACES. 000340 88 NO-DATA-REMAINS VALUE 'NO'. 000350 05 VALID-RECORD-SWITCH PIC X(3). 000360 88 VALID-RECORD VALUE 'YES'. 000361 05 VALID-DATE-SWITCH PIC X(3). 000362 88 VALID-DATE VALUE 'YES'. 000363 88 INVALID-DATE VALUE 'NO'. 000364 05 VALID-PURCH-DATE-SWITCH PIC X(3). 000365 88 VALID-PURCHASE-DATE VALUE 'YES'. 000366 88 INVALID-PURCHASE-DATE VALUE 'NO'. 000368 05 VALID-SALE-DATE-SWITCH PIC X(3). 000369 88 VALID-SALE-DATE VALUE 'YES'. 000370 88 INVALID-SALE-DATE VALUE 'NO'. 000371 000372 000373 01 DATE-FIELD. 000374 05 YEAR PIC 9999. 000375 88 VALID-YEAR VALUES 1901 THRU 2025. 000376 05 MONTH PIC 99. 000377 88 VALID-MONTHS VALUES 1 THRU 12. 000378 88 FEBRUARY VALUE 2. 000379 88 30-DAY-MONTH VALUES 4 6 9 11. 000380 88 31-DAY-MONTH VALUES 1 3 5 7 8 10 12. 000381 05 DAY-NUMBER PIC 99. 000382 000383 01 ERROR-REASONS. 000384* YOUR choice. One for each error. 000385 000386 01 HEADING-ERROR-LINE-ONE. 000387* Fill in here. 000397 01 HEADING-ERROR-LINE-TWO. 000398* Fill in. 000399 000400 01 ERROR-LINE. 000407* Fill in. 000417 000427 01 ERROR-DETAILS. 000437* Fill in. 000447 000457 PROCEDURE DIVISION. 000467 000-CREATE-VALID-STOCK-FILE. 000477 OPEN INPUT STOCK-FILE 000487 OUTPUT VALID-STOCK-FILE 000497 ERROR-FILE. 000507* PERFORM 100-GET-TODAYS-DATE. 000517 PERFORM 200-WRITE-ERROR-HEADINGS. 000527 PERFORM 300-READ-STOCK-RECORD. 000537 PERFORM 400-PROCESS-STOCK-RECORDS 000547 UNTIL NO-DATA-REMAINS. 000557 CLOSE STOCK-FILE 000567 VALID-STOCK-FILE 000577 ERROR-FILE 000587 STOP RUN. 000588 000597 300-READ-STOCK-RECORD. 000598 READ STOCK-FILE 000599 AT END MOVE 'NO' TO NO-DATA-REMAINS-SWITCH 000600 END-READ. 000601 000602 000603 400-PROCESS-STOCK-RECORDS. 000607 PERFORM 450-RESET-SWITCHES. 000617 PERFORM 500-VALIDATE-STOCK-RECORD. 000627 PERFORM 600-WRITE-VALID-RECORD. 000637 PERFORM 300-READ-STOCK-RECORD. 000647 000657 450-RESET-SWITCHES. 000667 MOVE 'YES' TO 000668 VALID-RECORD-SWITCH 000669 VALID-DATE-SWITCH 000670 VALID-SALES-DATE-SWITCH 000671 VALID-PURCH-DATE-SWITCH. 000672 000677 500-VALIDATE-STOCK-RECORD. 000687 PERFORM 510-VALIDATE-DATES-NUMERIC. 000697 PERFORM 520-VALIDATE-PURCHASE-DATE. 000707 PERFORM 530-VALIDATE-SALES-DATE. 000717 PERFORM 540-VALIDATE-PURCH-BEFORE-SALE. 000727 PERFORM 550-VALIDATE-AMOUNTS. 000737 000747 510-VALIDATE-DATES-NUMERIC. 000757* If NOT NUMERIC set VALID-PURCH-DATE-SWITCH or 000767* VALID-SALES-DATE-SWITCH to 'NO' else 'YES'. 000777 000787 520-VALIDATE-PURCHASE-DATE 000797* Only do this if date is numeric. 000798* Next line is 'belt and suspenders'. 000799 MOVE 'YES' TO VALID-DATE-SWITCH 000807 IF VALID-PURCH-DATE 000808 MOVE ST-PURCHASE-DATE TO DATE-FIELD. 000827 PERFORM 575-VALIDATE-DATE. 000837 IF INVALID-DATE 000838 MOVE 'NO' TO VALID-PURCH-DATE-SWITCH 000839 ELSE 000840 MOVE 'YES' TO VALID-PURCH-DATE-SWITCH 000841 END-IF 000842 END-IF. 000843 IF INVALID-PURCH-DATE 000844* Move error message 000845* Move data to ERR-CONTENTS 000846 PERFORM 599-WRITE-ERROR-LINE 000847 END-IF. 000848 530-VALIDATE-SALES-DATE 000849* Only do this if date is NUMERIC. 000850* Next line is NEEDED not 'belt and suspenders'. 000851 MOVE 'YES' TO VALID-DATE-SWITCH 000852 IF VALID-SALES-DATE 000853 MOVE ST-SALES-DATE TO DATE-FIELD. 000854 PERFORM 575-VALIDATE-DATE. 000855 IF INVALID-DATE 000856 MOVE 'NO' TO VALID-SALES-DATE-SWITCH 000857 ELSE 000858 MOVE 'YES' TO VALID-SALES-DATE-SWITCH 000859 END-IF 000860 END-IF. 000861 IF INVALID-SALES-DATE 000862* Move error message 000863* Move data to ERR-CONTENTS 000864 PERFORM 599-WRITE-ERROR-LINE 000865 END-IF. 000866 000876 540-VALIDATE-PURCH-BEFORE-SALE. 000886 IF VALID-PURCH-DATE AND VALID-SALES-DATE 000896* Then do the test and write error 000906 END-IF. 000916 000926 550-VALIDATE-AMOUNTS. 000936* Simple numeric checks. 000946 000947* This next allows us to test any date. 000956 575-VALIDATE-DATE. 000966 IF VALID-YEAR 000976 IF VALID-MONTHS 000986* As for the sample program in the book 000996 ELSE 001006 MOVE 'NO' TO VALID-DATE-SWITCH 001016 END-IF 001026* At the end of this paragraph VALID-DATE-SWITCH is 'NO' 001036* whenever the date is bad, otherwise it is 'YES'. 001046 001056 599-WITE-ERROR-LINE. 001066 001076 600-WRITE-VALID-RECORD.