|
Thanks for all your help with figuring out how to Range Canadian Zip Codes.
A few of you mentioned using a file containing all possible zip codes.
That method appealed to me more than others, so that is the one I used.
Below is the RPG program and some of the input and output of the
program.(Dan, now I'm laughing at the 32,000+ line program)
Frank
*****************************************************************
*
* PROGRAM - ZP47R004
* Description - Range Canadian Zip Codes
* Date - October 21, 2004
* Programmer - Frank Kany
*
*****************************************************************
*
* Zip Code file Containing City, State, Service Days, etc...
FZP47P001 IF E DISK PREFIX(X)
*
* Contains all Possible Canadian Zip Codes
FCANADAZIP1IF E K DISK
*
* Output File that will contain all the ranged zips
FZP47P002 UF A E K DISK
*
D IN_SEQUENCE S 1
*
D COUNTER S LIKE(XS19)
*
D STARTRANGE S LIKE(XN14)
D ENDRANGE S LIKE(XP16)
*
D SV_CITY S LIKE(XCITY)
D SV_STATE S LIKE(XSTATE)
D SV_SZIP S LIKE(XN14)
D SV_SVCCTR S LIKE(XSVCCTR)
D SV_DIRECTION S LIKE(XDIRECTION)
D SV_ADDSVC S LIKE(XADDSVCDAY)
*
* ---------------------
* Start Main Processing
* ---------------------
C EXSR MAINPRCS
*
* -------------------
* End Main Processing
* -------------------
C EVAL *INLR = *ON
C RETURN
*
**********************************************************************
* Main Processing Subroutine
**********************************************************************
C MAINPRCS BEGSR
*
* Reset Record Counter
C EVAL COUNTER = *ZEROS
*
* ----------------------------------------
* DO Loop to Read all Records in ZP47P001:
* ----------------------------------------
C DOU %EOF(ZP47P001)
C READ ZP47P001
*
* End of File(EOF):
* Leave this routine
C IF %EOF(ZP47P001)
C LEAVE
C ENDIF
*
* Another Record Found:
* Increase Record Counter
C EVAL COUNTER = COUNTER + 1
*
* (IF) routine Only processes the first record in the file
C IF COUNTER = 1
C EVAL SV_CITY = XCITY
C EVAL SV_STATE = XSTATE
C EVAL SV_SZIP = XN14
C EVAL STARTRANGE = XN14
C EVAL SV_SVCCTR = XSVCCTR
C EVAL SV_DIRECTION = XDIRECTION
C EVAL SV_ADDSVC = XADDSVCDAY
C ITER
C ENDIF
*
* Check Sequence of Zip Codes
C EXSR CHECK_SEQ
*
* Zip Codes are In-Sequence:
* Set End Range
* Get Next Record
C IF IN_SEQUENCE = 'Y'
C EVAL ENDRANGE = XN14
C EXSR SAVE_PREVIOUS
C ITER
C ENDIF
*
* Zip Codes are NOT In Sequence:
* Write current range
* Save Incoming Zip Code Information
* Get Next Record
C IF IN_SEQUENCE = 'N'
C EXSR WRITE_RECORD
C EXSR SAVE_NEWINFO
C ITER
C ENDIF
*
C ENDDO
* DOU %EOF(ZP47P001)
*
C ENDSR
*
**********************************************************************
* WRITE_RECORD - S/R to Fill File Fields and Zip Code Range Record
**********************************************************************
C WRITE_RECORD BEGSR
*
C EVAL N14 = STARTRANGE
C EVAL P16 = ENDRANGE
C EVAL CITY = SV_CITY
C EVAL STATE = SV_STATE
C EVAL SVCCTR = SV_SVCCTR
C EVAL DIRECTION = SV_DIRECTION
C EVAL ADDSVCDAY = SV_ADDSVC
C WRITE ZP47REC2
C CLEAR ENDRANGE
*
C ENDSR
*
**********************************************************************
* SAVE_NEWINFO - S/R to Save New Record Information
**********************************************************************
C SAVE_NEWINFO BEGSR
*
C EVAL SV_CITY = XCITY
C EVAL SV_STATE = XSTATE
C EVAL SV_SZIP = XN14
C EVAL STARTRANGE = XN14
C EVAL SV_SVCCTR = XSVCCTR
C EVAL SV_DIRECTION = XDIRECTION
C EVAL SV_ADDSVC = XADDSVCDAY
*
C ENDSR
*
**********************************************************************
* SAVE_PREVIOUS - S/R to Save Previously Read Record Information
**********************************************************************
C SAVE_PREVIOUS BEGSR
*
C EVAL SV_CITY = XCITY
C EVAL SV_STATE = XSTATE
C EVAL SV_SZIP = XN14
C EVAL SV_SVCCTR = XSVCCTR
C EVAL SV_DIRECTION = XDIRECTION
C EVAL SV_ADDSVC = XADDSVCDAY
*
C ENDSR
*
**********************************************************************
* CHECK_SEQ - S/R to Check Sequence of Incoming Zip to Previous
* Zip
**********************************************************************
C CHECK_SEQ BEGSR
*
* Set In Sequence Flag
C EVAL IN_SEQUENCE = 'N'
*
* Position Canadian Zip Code File to Incoming Zip Code Record:
* Read Previous Record in Canadian Zip Code File
C XN14 SETLL CANADAZIP1
C READP CANADAZIP1
*
* Previous Record is Equal to Saved Zip Code
C IF CZIP = SV_SZIP
C EVAL IN_SEQUENCE = 'Y'
C ENDIF
*
C ENDSR
Input File:
T0B0Z0
T0A0A0
T0A0C0
T0L0X0
T0J0A0
T0J0A0
T0E2N0
T0M0A0
T0H1R0
T0K0A0
T0K1Y0
T0J2N0
T0G1E0
T4A1A1
T4A1A2
T4A1A3
T4A1A4
T4A1A5
T4A1A6
T4A1A7
T4A1A8
T4A1A9
T4A1B0
T4A1B1
T4A1B2
T4A1B3
T4A1B4
T4A1B5
T4A1B6
T4A1B7
T4A1B8
T4A1B9
T4A1C0
T4A1C1
T4A1C2
T4A1C3
T4A1C4
T4A1C5
T4A1C6
T4A1C7
T4A1C8
T4A1C9
T4A1E0
T4A1E1
T4A1E2
Output File:(ignore middle column)
T0B0Z0 0000000
T0A0A0 0000000
T0A0C0 0000000
T0L0X0 0000000
T0J0A0 0000000
T0J0A0 0000000
T0E2N0 0000000
T0M0A0 0000000
T0H1R0 0000000
T0K0A0 0000000
T0K1Y0 0000000
T0J2N0 0000000
T0G1E0 0000000
T0B0Z0 0000000
T0A0A0 0000000
T0A0C0 0000000
T0L0X0 0000000
T0J0A0 0000000
T0J0A0 0000000
T0E2N0 0000000
T0M0A0 0000000
T0H1R0 0000000
T0K0A0 0000000
T0K1Y0 0000000
T0J2N0 0000000
T0G1E0 0000000
T4A1A1 0000000 T4A1C9
T4A1E0 0000000 T4A1E9
T4A1G0 0000000 T4A1H9
T4A1J0 0000000 T4A1N9
T4A1P0 0000000 T4A1P9
T4A1R0 0000000 T4A1T9
T4A1V0 0000000 T4A2C9
T4A2E0 0000000 T4A2E9
T4A2G0 0000000 T4A2H9
T4A2J0 0000000 T4A2N9
T4A2P0 0000000 T4A2P9
T4A2R0 0000000 T4A2T9
T4A2V0 0000000 T4A3C9
T4A3E0 0000000 T4A3E9
T4A3G0 0000000 T4A3H9
T4A3J0 0000000 T4A3N9
T4A3P0 0000000 T4A3P9
T4A3R0 0000000 T4A3T9
T4A3V0 0000000 T4A4C9
As an Amazon Associate we earn from qualifying purchases.
This mailing list archive is Copyright 1997-2025 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].
Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.