重複インスタンス・リスト・コードの回避
多くの異なるフィルターがある場合、重複したインスタンス・リスト・コードがあるかもしれません。このとき、設計者がインスタンス・リストで使用されるキー構造の変更や列の追加を決定した場合、面倒なことになる場合があります。新しいインスタンス・リスト・フォーマットを使用するようすべてのフィルターを変更する必要があるためです。
これを回避するには、いつものとおりに処理を行い、インスタンス・リストの操作コードを、すべてのフィルターが共有するVisual LANSAの1つの再利用可能パーツに含めて集中管理を行います。
従業員を3つの異なる方法でインスタンス・リストに追加するEMPMNGRという名前のVisual LANSA再利用可能パーツを考えます。
BEGIN_COM ROLE(*EXTENDS #PRIM_OBJT)
* Perform employee searches and add to the instance list
MthRoutine PerformSearch
Define_Map *Input #vf_lm002 #ListManager Pass(*By_Reference)
Define_Map *Input #std_num #SearchType
Define_Map *Input #EmpNo #UseEmpNo Mandatory(' ')
Define_Map *Input #SurName #UseSurName Mandatory(' ')
Define_Map *Input #PostCode #UsePostCode Mandatory(0)
Define_Map *input #Prim_Boln #Clear mandatory(true)
Invoke #ListManager.BeginListUpdate
If (#Clear)
Invoke #ListManager.ClearList
Endif
Case #SearchType
when (= 1)
Select fields(*all) from_file(pslmst) with_key(#UseEmpno) Generic(*Yes)
#Com_Owner.AddEmployeetoList ListManager(#ListManager)
Endselect
when (= 2)
Select fields(*all) from_file(pslmst2) with_key(#UseSurName) Generic(*Yes)
#Com_Owner.AddEmployeetoList ListManager(#ListManager)
Endselect
when (= 3)
Select fields(*all) from_file(pslmst) where(#PostCode = #UsePostCode)
#Com_Owner.AddEmployeetoList ListManager(#ListManager)
Endselect
EndCase
Invoke #ListManager.EndListUpdate
Endroutine
* Add an employee to the instance list
MthRoutine AddEmployeetoList Access(*Private)
Define_Map *Input #vf_lm002 #ListManager Pass(*By_Reference)
#FullName := #GiveName + " " + #SurName
Invoke Method(#ListManager.AddtoList) Visualid1(#Empno) Visualid2(#FullName) Akey1(#Deptment) Akey2(#Section) Akey3(#Empno) AColumn1(#Phonehme) AColumn2(#Address1) nColumn1(#PostCode)
Endroutine
END_COM
ここで次のような5つの従業員フィルターがあると仮定します。
これらの各フィルターが共有VL再利用可能パーツを次のように宣言した場合。
DEFINE_COM CLASS(#EMPMNGR) NAME(#EmployeeManager) scope(*Application)
各フィルターはそれぞれの検索を次の1つのコマンドで実行できます。
Invoke #EmployeeManager.PerformSearch ListManager(#avListManager)
SearchType(1) UseEmpNo(#EmpNo) Clear(true)
または、以下のようになります。
Invoke #EmployeeManager.PerformSearch ListManager(#avListManager)
SearchType(2) UseSurName(#SurName) Clear(false)
ここで重要な点は次のとおりです。
· 従業員マネージャーの#EMPMNGRオブジェクトがEXTENDS(#PRIM_OBJT)を使用している。これにより、ビジュアル・コンテキストを持たないprimitiveオブジェクトとして定義されます。
· #EMPMNGRの宣言でScope(*Application)が使用されている。これにより、#EMPMGRオブジェクトは確実に1つしか作成されず、そのオブジェクトはすべてのフィルターまたはコマンド・ハンドラーにより共有されるようになります。
· フィルターに検索ロジックを持たせる必要はありません。またフィルターがデータベースに直接アクセスする必要もありません。すべての検索処理とデータベース処理は、共通の共有#EMPMNGRオブジェクトを使用して処理できます。
· 従業員インスタンス・リストのキーを変更したり列を追加する必要がある場合は、#EMPMNGRの変更と再コンパイルのみが必要です。