次の例では、コレクションを使用して、ユーザーが複数のレコードを一度に更新する可能性のあるグリッドのエラー・チェックを行う方法を示しています。また、ネストされたBEGINCHECK/ENDCHECKブロックを正しく使用して、妥当性検査に失敗したフィールドに対する視覚的なフィードバックを表示する方法も示します。
ネストされたBEGINCHECK/ENDCHECKブロックを使用する理由は、この方法でグリッドを更新することで、IBM i上でブラウズ・リストを介して複数の詳細入力を検証することと同様になるからです。
* COMPONENT:STD_FORMFunction Options(*DIRECT)Begin_Com Role(*EXTENDS #PRIM_FORM) Clientheight(221) Clientwidth(492) Height(255) Left(335) Top(106)Define_Com Class(#PRIM_GRID) Name(#GRID_1) Captionnoblanklines(True) Columnbuttonheight(29) Columnscroll(False) Componentversion(1) Displayposition(1) Height(193) Left(0) Parent(#COM_OWNER) Showbuttonselection(True) Showselection(True) Showselectionhilight(False) Showsortarrow(True) Tabposition(1) Top(0) Visualstyle(#VS_NORM) Width(401)Define_Com Class(#PRIM_GDCL) Name(#GDCL_1) Caption('Empno') Captiontype(Caption) Displayposition(1) Parent(#GRID_1) Source(#EMPNO) Width(15)Define_Com Class(#PRIM_GDCL) Name(#GDCL_2) Caption('Surname') Captiontype(Caption) Displayposition(2) Parent(#GRID_1) Source(#SURNAME) Width(29)Define_Com Class(#PRIM_GDCL) Name(#GDCL_3) Caption('Zip') Captiontype(Caption) Columnalign(Right) Displayposition(3) Parent(#GRID_1) Readonly(False) Source(#POSTCODE) Width(14)Define_Com Class(#PRIM_GDCL) Name(#GDCL_4) Columnalign(Right) Displayposition(4) Parent(#GRID_1) Source(#SALARY) Widthtype(Remainder)Define_Com Class(#PRIM_PHBN) Name(#PHBN_1) Caption('&Refresh ') Displayposition(2) Left(408) Parent(#COM_OWNER) Tabposition(2) Top(8)Define_Com Class(#PRIM_STBR) Name(#STBR_1) Displayposition(3) Height(24) Left(0) Messageposition(1) Parent(#COM_OWNER) Tabposition(3) Tabstop(False) Top(197) Width(492)Define_Com Class(#PRIM_PHBN) Name(#PHBN_upd) Caption('&Update ') Displayposition(4) Left(408) Parent(#COM_OWNER) Tabposition(4) Top(40)* Define_Com Class(#prim_kcol<#postcode #empno>) Name(#postcodes)Define_Com Class(#prim_kcol<#salary #empno>) Name(#salaries)* Evtroutine Handling(#PHBN_1.Click)* Clear Collections as well as grid#postcodes.RemoveAll#salaries.RemoveAllClr_List Named(#grid_1)Select Fields(#grid_1) From_File(pslmst)#postcodes<#empno> := #postcode#salaries<#empno> := #salaryAdd_Entry To_List(#grid_1)EndselectEndroutine* Evtroutine Handling(#PHBN_upd.Click)* Check the input dataBegincheckSelectlist Named(#GRID_1)Continue If(#Com_owner.HasNotChanged)BegincheckUpdate Fields(#salary #postcode) In_File(pslmst) With_Key(#empno) Io_Error(*NEXT) Val_Error(*NEXT) Check_Only(*yes)If_Status Is_Not(*okay)#grid_1.currentitem.Visualstyle <= #vs_emphElse#grid_1.currentitem.Visualstyle <= #vs_normEndifUpd_Entry In_List(#GRID_1)Endcheck If_Error(*next)EndselectEndcheck* * Now do the updates (now that every field is validated and correct)Selectlist Named(#Grid_1)Continue If(#Com_owner.HasNotChanged)Update Fields(#salary #postcode) In_File(pslmst) With_Key(#empno) Io_Error(*NEXT) Val_Error(*NEXT)EndselectEndroutine* * Method Routine to check for changesMthroutine Name(HasNotChanged)Define_Map For(*result) Class(#prim_boln) Name(#Result)If ((#postcode = #postcodes<#Empno>) And (#salary = #salaries<#Empno>))#Result := TrueEndifEndroutineEnd_Com
「内側」のBEGINCHECK/ENDCHECKループでは、ユーザーが更新した各グリッド行項目が処理されます。また、IF_ERROR(*NEXT) パラメータにより、SELECTLIST ループですべてのグリッド項目の処理が継続され、エラーの初回検出時にこのループが停止しなくなります。
妥当性検査エラーが検出された場合、「外側」の BEGINCHECK/ENDCHECK コマンドでは、デフォルトの IF_ERROR(*LASTDIS) 設定を使用するため、データベースにレコードが書き込まれずに更新イベント・ルーチンが強制終了します。
妥当性検査エラーは、1つ以上のグリッド行でエラーが見つかったときに検出されます。これは、「内側」の妥当性検査ブロックでのエラーにより「外側」の妥当性検査ブロックでエラーがトリガーされるためです。
