インスタンス・リスト・エントリーの更新と削除

Visual LANSA

インスタンス・リスト・エントリーの更新と削除


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をリッスンする以下のロジックが含まれています。

 

* If an employee update has been triggered

 

When (= DEM_EMP_UPDATED)

 

* Get the department and section this employee belonged to at the time they were added to the instance list

 

Invoke #avListManager.GetCurrentInstance AKey1(#Original_Deptment) AKey2(#Original_Section) AKey3(#Empno)  

 

* Refresh the tree node that the employee was in originally (this might cause the employee to be removed from the node).

* This method causes the relationship handler function DFREL01 to be called again to refresh the whole tree node.

 

Invoke #avListmanager.RefreshRelationship BusinessObjectType(DEM_ORG_SEC_EMP) AKey1(#Original_Deptment) Akey2(#Original_Section)

 

* Now see what department and section the employee is in now.If either has changed, update the tree node for the

* the new department/section.If this node has never been expanded this request will be ignored, because the employee

* will be shown later if / when the user decides to expand this node.

 

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