T_VLDZIP - Validate Zipcode


// Example Program: T_VLDZIP // Description: // This is a test program to illustrate how to call the ATI_ValidateStreet() // subproceure to validate the ZIP Code for a United States street address. // // ATI_ValidateStreet() can validate an address when provided with the // following data: // - Street address (and optionally secondary info) and the ZIP Code // - Street address, city, and state (and optionally a ZIP Code) // For Puerto Rican addresses, the Urbanization value may also be required. // // To achieve this, first generate a unique ID with ATI_GetUniqueID(), then // populate and write a record to ATIADRREQ that contains the address data // to be validated. Then, call ATI_ValidateStreet() by passing in your // unique ID and other parameters as shown. // // ATI_ValidateStreet() will return *On if no error occurred, or *Off if // there an error was encountered. If an error occurred, you can review the // fields in the ErrorDS parameter data structure to retrieve information // about the error. Errors are also logged in the file ATIERRLOG. // // Otherwise, you can retrieve the validation response data from the // ATIADRRSP and ATICANDS files. Ctl-Opt ActGrp(*New) BndDir('ATIBND') Text('ATI US ZIP Code Validation Example'); /COPY QRPGLECPY,ATICB Dcl-F ATIADRREQ Usage(*Input:*Output) Qualified Alias Keyed; Dcl-Ds REQ LikeRec(ATIADRREQ.RATIADRREQ:*All); Dcl-F ATIADRRSP Usage(*Input) Qualified Alias Keyed; Dcl-F ATICANDS Usage(*Input) Qualified Alias Keyed; Dcl-Ds RSP LikeRec(ATIADRRSP.RATIADRRSP:*All); Dcl-Ds CAND LikeRec(ATICANDS.RATICANDS:*All); Dcl-Ds CAND_Key LikeRec(ATICANDS.RATICANDS:*Key); // This is included for demo output purposes. Dcl-Pr WriteToJobLog Int(10) Extproc('Qp0zLprintf'); pString Pointer Value Options(*String); End-Pr; Dcl-C NewLine x'15'; // This stores the unique ID for this API call Dcl-S UniqueID Like(ATI_UniqueID_t); // This holds any error information returned by the API call Dcl-Ds ErrorDS LikeDS(ATI_ErrorDS_t); // Modify this field to use your API key ID from the ATICFGKEY table Dcl-S KeyID Like(ATI_ConfigId_t) Inz(ATI_DEFAULT); // Each API call requires a unique ID UniqueID = ATI_GetUniqueID(); // ATIADRREQ needs to be populated with the address data to be validated clear REQ; REQ.AddressID = UniqueID; REQ.Street = '1109 9th'; REQ.City = 'Phoenix'; REQ.State = 'AZ'; // We recommend setting this field to assist with later cleanup of the // transactional files REQ.RequestTimestamp = %Timestamp(); write ATIADRREQ.RATIADRREQ REQ; reset ErrorDS; if not ATI_ValidateStreet( UniqueID : KeyID : ErrorDS ); // If ATI_ValidateStreet() returns *Off then an error occured. // You should check ErrorDS subfields for info: // ErrorDS.Subprocedure = Name of ATI subprocedure that threw error // ErrorDS.MessageCode = Message code or ID of the error message // ErrorDS.Message = Error message description // ErrorDS.LogFile = Path to a log file created in the IFS that can // be used for troubleshooting. Log files are generated automatically // whenever an error occurs. You can also force log files to generate // by modifying the value of the LOGALL field in ATICFGKEY for the // provided Key ID. // ErrorDS.Source = // - ATI_SOURCE_INTERNAL is a general product error. // This could be due to issues with input data, or the // inability to access physical files, etc. // // - ATI_SOURCE_TRANSMIT is a product error that specifically occurred // during HTTPS communication with the address validation webservice. // This could be due to issues with your network configuration, proxy // setup, internet connection, etc. // // - ATI_SOURCE_REMOTE is an error message returned by the address // validation service. WriteToJobLog( 'Error Message Code: ' + ErrorDS.MessageCode + NewLine ); WriteToJobLog( 'Error Message: ' + ErrorDS.Message + NewLine ); WriteToJobLog( 'Error Source: ' + ErrorDS.Source + NewLine ); WriteToJobLog( 'Logfile: ' + ErrorDS.LogFile + NewLine ); // All error information is also written to the file ATIERRLOG else; // If ATI_ValidateStreet() returned *On the request was successful. You can // access the results in the ATIADRRSP file using the same UniqueID that // was used to create the request record in ATIADRREQ. If the submitted // address was able to be validated, one or more candidate address records // will be found in the file ATICANDS. chain UniqueID ATIADRRSP.RATIADRRSP RSP; if %Found(ATIADRRSP); // For this sample program, we're writing the response data to the job // log, but generally you would extract the response data into your // own data tables, or to otherwise use the validated address data. // The validation APIs return a summary of the credits used and // remaining for this request WriteToJobLog( 'Credits used: ' + %Char(RSP.CREDITSUSED) + NewLine ); WriteToJobLog( 'Credits remaining (block): ' + %Char(RSP.CURRENTBLOCKREMAINING) + NewLine ); WriteToJobLog( 'Credits remaining (all): ' + %Char(RSP.ALLBLOCKSREMAINING) + NewLine ); // Checking if any candidate addresses were returned if RSP.CandidatesReturned <= 0; WriteToJobLog( 'No address candidates returned' ); else; // There will be one or more candidate addresses in ATICANDS. We'll // read through the file in a loop to write each candidate to the // job log. CAND_Key.AddressID = UniqueID; setll %Kds( CAND_Key : 1 ) ATICANDS.RATICANDS; if %Equal(ATICANDS); reade %Kds( CAND_Key : 1 ) ATICANDS.RATICANDS CAND; dow not %Eof(ATICANDS); WriteToJobLog( 'Candidate index: ' + %Char(CAND.CandidateIndex) + NewLine ); WriteToJobLog( 'Delivery line 1: ' + CAND.DeliveryLine1 + NewLine ); WriteToJobLog( 'City: ' + CAND.CityName + NewLine ); WriteToJobLog( 'State: ' + CAND.StateAbbreviation + NewLine ); WriteToJobLog( 'ZIP Code: ' + CAND.ZIPCode + NewLine ); WriteToJobLog( 'ZIP+4: ' + CAND.Plus4Code + NewLine ); WriteToJobLog( 'DPV match code: ' + CAND.DPVMatchCode + NewLine ); WriteToJobLog( 'DPV footnotes: ' + CAND.DPVFootnotes + NewLine ); WriteToJobLog( '--------------------' + NewLine ); reade %Kds( CAND_Key : 1 ) ATICANDS.RATICANDS CAND; enddo; endif; endif; endif; endif; // Write unique ID to job log for easy reference WriteToJobLog( 'T_VLDZIP Unique ID: ' + %Char(UniqueId) + NewLine ); *INLR = *On; return;