**free // Sample Skeleton SQL RPG program. This is a linear main program // so there is no RPG cycle logic included. There is no RPG file // IO. Data is read with SQL. It uses an SQL Cursor, but this is // just one way to retrieve data with SQL. // // After *executable* SQL statements I check for the SQL States // that I expect. Any unexpected state causes the program to dump // and crash, because this requires investigation. // Common states are defined below in SQL State Constants. // // Your shop error handling standards may be different and you // may want to rewrite the SQLProblem procedure. // Program reads table QIWS/QCUSTCDT which is on all(?) machines. // Pass a two character State parameter, e.g. PARM('NY'). //----------------------------------------------------------------- // 10/--/2021 Lennon. This is a revised version of the original // SQL_SKEL program. // I trimmed down the code by moving the SQLProblem // logic into the SRV_SQL service program. The SQLProblem // messaging is also improved. ctl-opt option(*nodebugio:*srcstmt) dftactgrp(*no) actgrp(*caller) bnddir('SQL_BND') main(SQL_SKEL); //=== Prototypes ====================================== /include ../Copy_Mbrs/SRV_SQL_P.RPGLE //=== SQL State Constants ============================= dcl-c SQLSUCCESS '00000'; dcl-c SQLNODATA '02000'; dcl-c SQLNOMOREDATA '02000'; dcl-c SQLDUPRECD '23505'; dcl-c SQLROWLOCKED '57033'; //=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+= // Main Program = //=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+= dcl-proc SQL_SKEL; dcl-pi *n; piState char(2); end-pi; //=== Program (Global) Variables ====================== dcl-ds InTbl extname('QIWS/QCUSTCDT') template end-ds; dcl-s MyCusNum like(cusnum); dcl-s MyLstNam like(lstnam); dcl-s MyInit like(init); dcl-s MyState like(state); dcl-s MyBalDue like(baldue); dcl-s RecordsRead packed(7) inz(0); //=== Set SQL Options =============================== // Note: Compile time only. Not executable. exec sql set option datfmt=*iso, closqlcsr=*endmod, commit=*none; //=== Cursor ======================================== exec sql declare DemoCursor cursor for select CUSNUM, LSTNAM, INIT, STATE, BALDUE from QIWS/QCUSTCDT where STATE = :piState order by BALDUE desc ; //=== Initialization ================================ exec sql open DemoCursor; if SQLSTT <> SQLSUCCESS; SQLProblem('open DemoCursor'); endif; //=== Main Logic ==================================== exsr FetchCur; dow SQLSTT = SQLSUCCESS; RecordsRead += 1; // Real program logic goes here <<<<<<<<<< exsr FetchCur; enddo; //=== Termination =================================== dsply ('Records read: ' + %char(RecordsRead) ); exec sql close DemoCursor; // ---- Deliberate bug to exercise SQLProblem ----- exec sql close DemoCursor; // ------------------------------------------------ if SQLSTT <> SQLSUCCESS; SQLProblem('close DemoCursor'); endif; *inlr = *on; //=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+= // End of Main Program = //=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+= //=== Subroutines =================================== //--- FetchCur -------------------------------------- // Get the next row from the cursor // Returns: SQLSUCCESS, with data // SQLNoMoreData, no data returned begsr FetchCur; exec sql fetch DemoCursor into :MyCusNum, :MyLstNam, :MyInit, :MyState, :MyBalDue ; if SQLSTT <> SQLSUCCESS and SQLSTT <> SQLNOMOREDATA; SQLProblem('fetch DemoCursor'); endif; endsr; end-proc;