$ SET SOURCEFORMAT"FREE" IDENTIFICATION DIVISION. PROGRAM-ID. DueSubsRpt. AUTHOR. Michael Coughlan. *CS4321-96-COBOL-EXAM. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT DueSubsFile ASSIGN TO "DUESUBS.DAT" ORGANIZATION IS LINE SEQUENTIAL. SELECT WorkFile ASSIGN TO "SORT.TMP". SELECT DueSubsReport ASSIGN TO "DUESUBS.RPT" ORGANIZATION IS LINE SEQUENTIAL. SELECT SortedSubsFile ASSIGN TO "SORTSUBS.DAT" ORGANIZATION IS LINE SEQUENTIAL. SELECT CountryFile ASSIGN TO "COUNTRY.DAT" ORGANIZATION IS LINE SEQUENTIAL. DATA DIVISION. FILE SECTION. FD DueSubsFile. 01 DueSubsRec. 88 EndOfDueSubsFile VALUE HIGH-VALUES. 02 CustomerNameDS PIC X(22). 02 PayMethodDS PIC 9. 02 PayFreqDS PIC 9. 02 FILLER PIC X(24). 02 CountryCodeDS PIC XX. SD WorkFile. 01 WorkRec. 88 EndOfWorkFile VALUE HIGH-VALUES. 02 CustomerNameWF PIC X(22). 02 PayMethodWF PIC 9. 02 PayFreqWF PIC 9. 02 CountryNameWF PIC X(25). 02 CountryCodeWF PIC XX. FD DueSubsReport. 01 PrintLine PIC X(77). FD SortedSubsFile. 01 SortedSubsRec. 88 EndOfSortedSubs VALUE HIGH-VALUES. 02 CustomerNameSS PIC X(22). 02 PayMethodSS PIC 9. 88 ByVisa VALUE 1. 88 ByAccess VALUE 2. 88 ByExpress VALUE 3. 88 ByCheque VALUE 4. 02 PayFreqSS PIC 9. 02 CountryNameSS PIC X(25). 02 CountryCodeSS PIC XX. FD CountryFile. 01 CountryRec. 88 EndOfCountryFile VALUE HIGH-VALUES. 02 CountryCodeCF PIC XX. 02 CountryNameCF PIC X(25). 02 ExchangeRateCF PIC 9(5)V9(5). WORKING-STORAGE SECTION. 01 MethodTable VALUE "VISA Access AmExpressCheque ". 02 PayMethodMT OCCURS 4 TIMES PIC X(9). 01 FreqTable VALUE "020100180". 02 SubsFT OCCURS 3 TIMES PIC 9(3). 01 CountryTable. 02 Country OCCURS 242 TIMES ASCENDING KEY IS CountryCodeCT INDEXED BY CIDX. 03 CountryCodeCT PIC XX. 03 CountryNameCT PIC X(25). 03 ExchangeRateCT PIC 9(5)V9(5). 01 ReportHeadingLine. 02 FILLER PIC X(18) VALUE SPACES. 02 FILLER PIC X(35) VALUE "NETNEWS DUE SUBSCRIPTIONS REPORT". 01 ReportUnderline. 02 FILLER PIC X(17) VALUE SPACES. 02 FILLER PIC X(37) VALUE ALL "-". 01 TopicHeadingLine. 02 FILLER PIC X(5) VALUE SPACES. 02 FILLER PIC X(12) VALUE "COUNTRY NAME". 02 FILLER PIC X(11) VALUE SPACES. 02 FILLER PIC X(13) VALUE "CUSTOMER NAME". 02 FILLER PIC X(8) VALUE SPACES. 02 FILLER PIC X(12) VALUE "PAY METHOD ". 02 FILLER PIC X(8) VALUE "SUBS ". 02 FILLER PIC X(7) VALUE "LC SUBS". 01 CustLine. 02 PrnCountryName PIC X(25). 02 PrnCustName PIC BX(22). 02 PrnPayMethod PIC BX(9). 02 PrnSubs PIC BBB$$$9. 02 PrnLCSubs PIC BBZZ,ZZZ,ZZ9. 01 VisaLine. 02 FILLER PIC X(41) VALUE SPACES. 02 FILLER PIC X(17) VALUE "VISA TOTAL ". 02 PrnVisaTotal PIC $$$,$$9. 01 AccessLine. 02 FILLER PIC X(41) VALUE SPACES. 02 FILLER PIC X(17) VALUE "ACCESS TOTAL ". 02 PrnAccessTotal PIC $$$,$$9. 01 AmExLine. 02 FILLER PIC X(41) VALUE SPACES. 02 FILLER PIC X(17) VALUE "AMEXPRESS TOTAL ". 02 PrnAmExTotal PIC $$$,$$9. 01 ChequeLine. 02 FILLER PIC X(41) VALUE SPACES. 02 FILLER PIC X(17) VALUE "CHEQUE TOTAL ". 02 PrnChequeTotal PIC $$$,$$9. 01 VisaTotalLine. 02 FILLER PIC X(35) VALUE SPACES. 02 FILLER PIC X(23) VALUE "FINAL VISA TOTAL ". 02 PrnVisaFinalTotal PIC $$,$$$,$$9. 01 AccessTotalLine. 02 FILLER PIC X(35) VALUE SPACES. 02 FILLER PIC X(23) VALUE "FINAL ACCESS TOTAL ". 02 PrnAccessFinalTotal PIC $$,$$$,$$9. 01 AmExTotalLine. 02 FILLER PIC X(35) VALUE SPACES. 02 FILLER PIC X(23) VALUE "FINAL AMEXPRESS TOTAL ". 02 PrnAMExFinalTotal PIC $$,$$$,$$9. 01 ChequeTotalLine. 02 FILLER PIC X(35) VALUE SPACES. 02 FILLER PIC X(23) VALUE "FINAL CHEQUE TOTAL ". 02 PrnChequeFinalTotal PIC $$,$$$,$$9. 01 SubTotals. 02 VisaTotal PIC 9(5). 02 AccessTotal PIC 9(5). 02 AmExTotal PIC 9(5). 02 ChequeTotal PIC 9(5). 01 FinalTotals. 02 VisaFinalTotal PIC 9(7) VALUE ZEROS. 02 AccessFinalTotal PIC 9(7) VALUE ZEROS. 02 AmExFinalTotal PIC 9(7) VALUE ZEROS. 02 ChequeFinalTotal PIC 9(7) VALUE ZEROS. 01 PrevCountryCode PIC XX. 01 ExchangeRate PIC 99999V99999. 01 LCSubs PIC 9(5). PROCEDURE DIVISION. ProduceSubscriptionsReport. PERFORM LoadCountryTable SORT WorkFile ON ASCENDING CountryNameWF, CustomerNameWF INPUT PROCEDURE IS RestructureRecords GIVING SortedSubsFile OPEN INPUT SortedSubsFile OPEN OUTPUT DueSubsReport WRITE PrintLine FROM ReportHeadingLine AFTER ADVANCING PAGE WRITE PrintLine FROM ReportUnderline AFTER ADVANCING 1 LINE WRITE PrintLine FROM TopicHeadingLine AFTER ADVANCING 3 LINES WRITE PrintLine FROM SPACES AFTER ADVANCING 1 LINE READ SortedSubsFile AT END SET EndOfSortedSubs TO TRUE END-READ PERFORM PrintReportBody UNTIL EndOfSortedSubs PERFORM PrintFinalTotals CLOSE SortedSubsFile, DueSubsReport. STOP RUN. LoadCountryTable. MOVE HIGH-VALUES TO CountryTable OPEN INPUT CountryFile READ CountryFile AT END SET EndOfCountryFile TO TRUE END-READ PERFORM VARYING CIDX FROM 1 BY 1 UNTIL EndOfCountryFile MOVE CountryRec TO Country(CIDX) READ CountryFile AT END SET EndOfCountryFile TO TRUE END-READ END-PERFORM CLOSE CountryFile. RestructureRecords. OPEN INPUT DueSubsFile READ DueSubsFile AT END SET EndOfDueSubsFile TO TRUE END-READ PERFORM UNTIL EndOfDueSubsFile MOVE CustomerNameDS TO CustomerNameWF MOVE PayMethodDS TO PayMethodWF MOVE PayFreqDS TO PayFreqWF MOVE CountryCodeDS To CountryCodeWF SEARCH ALL Country AT END DISPLAY "Name for " CountryCodeDS " not found." WHEN CountryCodeCT(CIDX) = CountryCodeDS MOVE CountryNameCT(CIDX) TO CountryNameWF END-SEARCH RELEASE WorkRec READ DueSubsFile AT END SET EndOfDueSubsFile TO TRUE END-READ END-PERFORM CLOSE DueSubsFile. PrintReportBody. MOVE CountryNameSS TO PrnCountryName MOVE CountryCodeSS TO PrevCountryCode SEARCH ALL Country AT END DISPLAY "Name for " CountryCodeSS " not found." WHEN CountryCodeCT(CIDX) = CountryCodeSS MOVE ExchangeRateCT(CIDX) TO ExchangeRate END-SEARCH MOVE ZEROS TO SubTotals PERFORM PrintCountryLines UNTIL CountryCodeSS NOT EQUAL TO PrevCountryCode OR EndOfSortedSubs MOVE VisaTotal TO PrnVisaTotal MOVE AccessTotal TO PrnAccessTotal MOVE AmExTotal TO PrnAmExTotal MOVE ChequeTotal TO PrnChequeTotal WRITE PrintLine FROM VisaLine AFTER ADVANCING 4 LINES WRITE PrintLine FROM AccessLine AFTER ADVANCING 1 LINE WRITE PrintLine FROM AmExLine AFTER ADVANCING 1 LINE WRITE PrintLine FROM ChequeLine AFTER ADVANCING 1 LINE WRITE PrintLine FROM SPACES AFTER ADVANCING 3 LINES. PrintCountryLines. MOVE CustomerNameSS TO PrnCustName MOVE PayMethodMT(PayMethodSS) TO PrnPayMethod MOVE SubsFT(PayFreqSS) TO PrnSubs COMPUTE PrnLCSubs ROUNDED = SubsFT(PayFreqSS) * ExchangeRate EVALUATE TRUE WHEN ByVisa ADD SubsFT(PayFreqSS) TO VisaTotal, VisaFinalTotal WHEN ByAccess ADD SubsFT(PayFreqSS) TO AccessTotal, AccessFinalTotal WHEN ByExpress ADD SubsFT(PayFreqSS) TO AmExTotal, AmExFinalTotal WHEN ByCheque ADD SubsFT(PayFreqSS) TO ChequeTotal, ChequeFinalTotal END-EVALUATE WRITE PrintLine FROM CustLine AFTER ADVANCING 1 LINE MOVE SPACES TO PrnCountryName READ SortedSubsFile AT END SET EndOfSortedSubs TO TRUE END-READ. PrintFinalTotals. MOVE VisaFinalTotal TO PrnVisaFinalTotal MOVE AccessFinalTotal TO PrnAccessFinalTotal MOVE AmExFinalTotal TO PrnAmExFinalTotal MOVE ChequeFinalTotal TO PrnChequeFinalTotal WRITE PrintLine FROM VisaTotalLine AFTER ADVANCING 1 LINE WRITE PrintLine FROM AccessTotalLine AFTER ADVANCING 1 LINE WRITE PrintLine FROM AmExTotalLine AFTER ADVANCING 1 LINE WRITE PrintLine FROM ChequeTotalLine AFTER ADVANCING 1 LINE.