重複インスタンス・リスト・コードの回避

Visual LANSA

重複インスタンス・リスト・コードの回避


多くの異なるフィルターがある場合、重複したインスタンス・リスト・コードがあるかもしれません。このとき、設計者がインスタンス・リストで使用されるキー構造の変更や列の追加を決定した場合、面倒なことになる場合があります。新しいインスタンス・リスト・フォーマットを使用するようすべてのフィルターを変更する必要があるためです。

これを回避するには、いつものとおりに処理を行い、インスタンス・リストの操作コードを、すべてのフィルターが共有する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の変更と再コンパイルのみが必要です。