BeginListUpdateメソッドでは、特殊パラメータ・モード(DYNAMIC)を使用できます。
通常、インスタンスリストの処理はおおまかに次の2つの処理モードに分類されます。
- 検索と更新:通常、検索ボタンがクリックされると、まずインスタンスリストがクリアされ、ユーザーが起動した検索によってインスタンスリストが完全に埋められます。これは、インスタンスリスト全体が更新されるためモード(REFRESH)処理と呼ばれます。場合によって、リストはクリアされず、エンドユーザーが「AND」形式の検索を簡単に実行できるよう、徐々に追加されることがあります。
- 個別エントリーの更新と削除:一般的に、コマンド・ハンドラーは、インスタント・リスト内にすでに存在する少数のエントリーに反映すべきだということを認識しているいくつかの処理を実行していました。これは、インスタンスリスト内の少数のエントリーのみがそのビジュアル・コンテンツを動的に更新または削除する必要があるため、モード(DYNAMIC)処理と呼ばれます。
モード(REFRESH)がリスト処理の省略値スタイルです。
フレームワークがモード(REFRESH)要求を処理する方法とモード(DYNAMIC)要求を処理する方法には、いくつか異なる点があります。
- 省略値のモード(REFRESH)メソッドを使用する場合、インスタンスリストのビジュアライゼーションはEndListUpdateメソッドが実行されるときに実行されます。この処理は、既存のビジュアライゼーション全体をクリアし、ゼロから再構築します。つまり、リストを完全に同じコンテンツで置き換えても、選択とフォーカスは失われツリーは縮小されます。
- モード(REFRESH)を使用する場合、デフォルト・コマンドを実行して、インスタンスの選択を設定できます。
- モード(DYNAMIC)を使用する場合、インスタンスリストへの変更に対するビジュアライゼーションが直ちに実行されます。意図するすべての処理はビジュアライゼーションの変更または削除であるため、省略値コマンドを実行してインスタンスの選択を設定または変更することはできませんが、既存の選択とフォーカスが失われることはなく、ツリーも縮小されません。
- モード(DYNAMIC)更新を使用する場合、#ListManager.ClearListは使用できません。これを行うとエラーメッセージが表示されます。
最終的に、インスタンスリスト・エントリーを更新する方法は2種類になります: #ListManager.AddtoList または #ListManager.UpdateListEntryData が使用できます。この 2 つともが既存のエントリーを更新しますが、AddtoList のみ指定されたエントリーが存在しない場合に新しいエントリーを作成します。
この2つの主な違いは次のとおりです。
- UpdateListEntryDataは、パラメータとして指定されたリスト・エントリーの値のみを更新します。たとえば、追加列3のみを更新できます。
- AddtoListは、パラメータとして渡された値を使用するかデフォルト値を使用して、インスタンスリスト・エントリーのすべての値を更新します。したがって、追加列3を更新するには追加列1、2の値を渡す必要があり、また場合によっては追加列4、5、6の値も渡す必要があります。
- 上記のポイントは、MODE(REFRESH)更新でUpdateListEntryDataを使用するべきではないということを意味します。
警告:
UpdateListEntryData または RemoveFromList を使用した後に AddtoList を使用して、インスタンスリスト・エントリーの識別キーを更新しないでください。識別キー(Akey、Nkey)は、いかなるコマンド・ハンドラーからも変更されない値とする必要があります。変更可能な、インスタンスリストの追加列の値を使用してください。
リレーション・ハンドラーを使用して、ツリーとして表示されているインスタンスリスト内のノードを動的に展開する場合、#avListManager.RefreshRelationshipメソッドを使用して、ツリー内の1つのレベルをプログラムで完全に更新することができます。
たとえば、組み込みのデモンストレーション・フィルターDF_FILT30には、イベントDEM_EMP_UPDATEDをリッスンする以下のロジックが含まれています。
* 社員更新のトリガー時
When (= DEM_EMP_UPDATED)
* インスタンスリストに追加された時のこの社員が属する部門と課を取得
Invoke #avListManager.GetCurrentInstance AKey1(#Original_Deptment) AKey2(#Original_Section) AKey3(#Empno)
* この社員が元々いたツリー・ノードをリフレッシュ (これにより、この社員がノードから削除されることもある)
* この方法により、リレーション・ハンドターのファンクション DFREL01 が再び呼び出され、ツリー・ノード全体がリフレッシュされる。
Invoke #avListmanager.RefreshRelationship BusinessObjectType(DEM_ORG_SEC_EMP) AKey1(#Original_Deptment) Akey2(#Original_Section)
* 社員の今の部門と課を確認両方とも変更された場合は、ツリーノードを
* 新しい部門/課で更新する。このノードが展開されたことがなければ、この要求は無視される。
* これは、ユーザーがこのノードの展開を決めた時に表示されるため。
Fetch Fields(#Deptment #Section) from_file(PslMst) with_key(#Empno)
If ((#Deptment *ne #Original_Deptment) or (#Section *ne #Original_Section))
Invoke #avListmanager.RefreshRelationship BusinessObjectType(DEM_ORG_SEC_EMP) AKey1(#Deptment) Akey2(#Section)
Endif