>>SOURCE FORMAT IS 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.