Page History
次の例では、コレクションを使用して、ユーザーが複数のレコードを一度に更新する可能性のあるグリッドのエラー・チェックを行う方法を示しています。また、ネストされたBEGINCHECK/ENDCHECKブロックを正しく使用して、妥当性検査に失敗したフィールドに対する視覚的なフィードバックを表示する方法も示します。
ネストされたBEGINCHECK/ENDCHECKブロックを使用する理由は、この方法でグリッドを更新することで、IBM i上でブラウズ・リストを介して複数の詳細入力を検証することと同様になるからです。
...
* COMPONENT: STD_FORM
...
Function 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.RemoveAll
Clr_
...
List Named(#grid_1)
...
Select Fields(#grid_1)
...
From_File(pslmst)
...
#postcodes<#empno> :=
...
#postcode
#salaries<#empno> := #salary
Add_Entry To_List(#grid_1)
Endselect
Endroutine
*
...
Evtroutine Handling
...
(#PHBN_upd.Click)
...
* Check the input data
Begincheck
Selectlist Named(#GRID_1)
...
Continue If(#Com_owner.HasNotChanged)
Begincheck
...
Update 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_emph
Else
#grid_1.currentitem.
...
Visualstyle <= #vs_norm
Endif
Upd_
...
Entry In_List(#GRID_1)
...
Endcheck If_Error(*next)
Endselect
Endcheck
*
...
...
* 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)
Endselect
Endroutine
*
...
...
* Method Routine to check for changes
Mthroutine Name(HasNotChanged)
Define_
...
Map For(*result)
...
Class(#prim_boln)
...
Name(#Result)
...
If ((
...
#postcode =
...
#postcodes<#Empno>) And (#salary = #salaries<#Empno>))
...
#Result :=
...
True
Endif
Endroutine
End_Com
「内側」のBEGINCHECK/ENDCHECKループでは、ユーザーが更新した各グリッド行項目が処理されます。また、IF_ERROR(*NEXT) パラメータにより、SELECTLIST ループですべてのグリッド項目の処理が継続され、エラーの初回検出時にこのループが停止しなくなります。
妥当性検査エラーが検出された場合、「外側」の BEGINCHECK/ENDCHECK コマンドでは、デフォルトの IF_ERROR(*LASTDIS) 設定を使用するため、データベースにレコードが書き込まれずに更新イベント・ルーチンが強制終了します。
妥当性検査エラーは、1つ以上のグリッド行でエラーが見つかったときに検出されます。これは、「内側」の妥当性検査ブロックでのエラーにより「外側」の妥当性検査ブロックでエラーがトリガーされるためです。

