Files
2025-11-15 12:58:14 -05:00

81 lines
2.4 KiB
RPGLE

**free
// StateVAL - Validates a 2-character USA State Code
// Returns * ON if the passed code is valid, otherwise *OFF
// Optionally returns the 30 character state name
// Note: Modifies data in the caller:
// 1) Ensures the state code is upper case.
// 2) If optional state name parameter is passed it is modified.
// CRTBNDDIR BNDDIR(LENNONS1/STATE_BND) TEXT('For STATEVAL')
// ADDBNDDIRE BNDDIR(STATE_BND) OBJ((SRV_STE *SRVPGM *DEFER))
// CRTSRVPGM SRVPGM(SRV_STE) MODULE(STATEVAL) EXPORT(*ALL)
ctl-opt nomain option(*nodebugio:*srcstmt)
bnddir('SQL_BND' : 'UTIL_BND');
dcl-proc StateVal export;
dcl-pi StateVal ind;
p_code like(States_T.code);
p_name like(States_T.name) options(*nopass);
end-pi;
/include ../Copy_Mbrs/SRV_SQL_P.RPGLE
/include ../Copy_Mbrs/SRV_MSG_P.RPGLE
dcl-c SQLSUCCESS '00000';
dcl-ds States_T template qualified;
code char(2);
name char(30);
end-ds;
dcl-s ix int(10);
// === Static variables ===
// Array of State info loaded once first time.
dcl-ds States_A likeds(States_T) dim(*auto :100) static;
dcl-s StatesLoaded ind static;
// === One time load of State info ===================================
if (StatesLoaded = *off);
// Job log message to confirm load occurs only once.
JobLogMsg('StateVal: Loading States');
EXEC SQL
DECLARE states_cursor CURSOR FOR select state, name from states
order by state;
EXEC SQL
OPEN states_cursor;
if sqlstate <> SQLSUCCESS;
SQLProblem('Open of states_cursor failed');
endif;
// Loading all in one fetch since we know there are alway fewer
// than 100 USA states and territories.
EXEC SQL
FETCH from states_cursor for 100 rows into :States_A;
if sqlstate <> SQLSUCCESS;
SQLProblem('Fetch from states_cursor failed');
endif;
EXEC SQL
CLOSE states_cursor ;
if sqlstate <> SQLSUCCESS;
SQLProblem('Close of states_cursor failed');
endif;
StatesLoaded = *on;
endif;
// === Lookup the provided state code ================================
p_code = %upper(p_code); // Ensure it is upper case
ix=%lookup(p_code : States_A(*).code);
// === State code found ===
if ix <> 0;
if %passed(p_name);
p_name = States_A(ix).name;
endif;
return *on;
else;
// === State not found ===
if %passed(p_name);
p_name = *blanks;
endif;
return *off;
endif;
end-proc;