Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

[ Image Removed |../../index.htm#lansa/lansa048_3150.htm]
Visual LANSA フレームワーク ガイド > フレームワーク・プログラミング > インスタンスリストとインスタンスリスト・マネージャー > 高度なインスタンスリスト処理 > 独自のインスタンスリスト・コントローラーへの共通タスクの委託

...

Image RemovedImage Added


ここまでは、インスタンスリスト・エントリーの追加、更新、削除処理を、どのようにして共通の共有インスタンスリスト・コントローラーに代行させることができるかを見てきました。 

通常、フィルターやコマンド・ハンドラー内に繰り返されるコードを含む可能性のあるその他の処理は、同じ方法で代行させることができます。   

たとえば、前のセクションの RAMP スクリプトは、リッスンしているフィルター経由でイベントを通知することで、インスタンスリスト・コントローラーにアクセスできます。ただし、リッスンしているフィルターを必ずしも認識しているとは限らないため、リッスンのためのコードをすべてのフィルターで繰り返す必要があるでしょう。   

このリッスン・タスク (および実質的にすべてのリッスン・タスク) を共通の共有インスタンスリスト・コントローラーに代行させる1つの方法を次に示します。 を共通の共有インスタンスリスト・コントローラーに代行させる1つの方法を次に示します。 

インスタンスリスト・コントローラーで、次のような 2 つのコレクションを定義します。
 

...

* すべての登録されたアクティブなフィルターとコマンド・ハンドラーの履歴を管理

...

DEFINE_COM CLASS(#Prim_Acol<#VF_ac007O >) NAME(#ActiveFilters) /* VF_AC007 for WIN */
DEFINE_COM CLASS(#Prim_Acol<#VF_ac010O>) NAME(#ActiveHandlers) /* VF_AC010 for WIN */

...


次に、以下の 2 つのメソッドを追加します。
 

MthRoutine RegisterInitialize
Define_map *input #VF_AC007O #Filter Pass(*By_Reference) Mandatory(null)
Define_map *input #VF_AC010O #Handler Pass(*By_Reference) Mandatory(null)

...

* 登録され、アクティブなフィルターの履歴管理  

...

If_ref #Filter is_not(*null)
Invoke #ActiveFilters.Insert Item(#Filter)
Endif

...

*登録され、アクティブなコマンド・ハンドラーすべての履歴管理

...

If_ref #Handler is_not(*null)
Invoke #ActiveHandlers.Insert Item(#Handler)
Endif

...

Endroutine

...

MthRoutine RegisterTerminate
Define_map *input #VF_AC007O #Filter Pass(*By_Reference) Mandatory(null)
Define_map *input #VF_AC010O #Handler Pass(*By_Reference) Mandatory(null)

...

*アクティブ・コレクションから指定のフィルターを削除

...

If_ref #Filter is_not(*null)
Invoke #ActiveFilters.Remove Object(#Filter)
Endif

...

*アクティブ・コレクションから指定のコマンド・ハンドラーを削除。

...

If_ref #Handler is_not(*null)
Invoke #ActiveHandlers.Remove Object(#Handler)
Endif

...


Endroutine
 


次に、各フィルターまたはコマンド・ハンドラーで次の3つの処理を行う必要があります。
 

  • インスタンスリスト・コントローラーを定義

...

    DEFINE_COM CLASS(#EMPMNGR) NAME(#EmployeeController) scope(*Application)

...

  • 起動時にインスタンスリスト・コントローラーに登録。フィルターで次の処理を行います。

...

    MthRoutine uInitialize Options(*Redefine)
    Invoke # EmployeeController.RegisterInitialize Filter(#Com_Owner) 
    Endroutine

 
      コマンド・ハンドラーで次の処理を行います。
     コマンド・ハンドラーで次の処理を行います。        MthRoutine

    MthRoutine uInitialize Options(*Redefine)

...

    Invoke #EmployeeController.RegisterInitialize Handler(#Com_Owner) 

...

    Endroutine

...

  • 終了時にインスタンスリスト・コントローラーに登録(登録削除)。フィルターで次の処理を行います。

...

    MthRoutine uTerminate Options(*Redefine)

...

    Invoke #EmployeeController.RegisterTerminate Filter(#Com_Owner) 

...

    Endroutine

 
      コマンド・ハンドラーで次の処理を行います。
     コマンド・ハンドラーで次の処理を行います。       MthRoutine

    MthRoutine uTerminate Options(*Redefine)

...

    Invoke #EmployeeController.RegisterTerminate Handler(#Com_Owner) 
   Endroutine

...


Note

...

注意:使用したロジックを uTerminate で終了することが非常に大切です。

これでインスタンスリスト・コントローラーは、このビジネス・オブジェクト (Employees) に関する処理を実行しているすべてのフィルターとコマンド・ハンドラーを認識します。 に関する処理を実行しているすべてのフィルターとコマンド・ハンドラーを認識します。 

インスタンスリスト・マネージャーは共通の共有操作の代行を開始できます。 

たとえば、インスタンスリスト・コントローラーに次のようなイベント・ルーチンが含まれている場合を考えます。
 

Evtroutine Handling(#ActiveFilters<>.avEvent) WithId(#EventId) WithAInfo1(#AInfo1) WithAInfo2(#AInfo2) WithAInfo3(#AInfo3) COM_Sender(#SendingFilter) Options(*NOCLEARMESSAGES *NOCLEARERRORS)
 
Case #EventId.

...

Value 
When (= UPDATE_EMPLOYEE_5250)

...


#Com_Owner.UpdateListDetails ListManager(#SendingFilter.avListManager) ForEmpno(#AInfo1)

...

 
When (= DELETE_EMPLOYEE_5250)

...

#Com_Owner.DeleteListDetails ListManager(#SendingFilter.avListManager) ForEmpno(#AInfo1) inDepartment(#AInfo2) InSection(#AInfo3)

...

EndCase
 
Endroutine


 インスタンスリスト・コントローラーは、すべてのフィルターの、RAMPスクリプトのイベントをリッスンするジョブを引き継ぎます。 インスタンスリスト・コントローラーは、すべてのフィルターの、RAMPスクリプトのイベントをリッスンするジョブを引き継ぎます。 

これで、特定のフィルターにこのリッスン・コードを追加する必要はなくなります。 

#ActiveFilters<>.avEventの使用は特殊です。 avEventの使用は特殊です。 

このインスタンスリスト・コントローラーのイベント・ルーチンは、そのインスタンスリスト・マネージャーに登録されているすべてのフィルターをリッスン (つまり傍受) しています。

もちろん、#ActiveHandlers<>を使用しても同じ処理を行えます。

その一方で、インスタンスリスト・コントローラーはイベントをすべてのアクティブなフィルターとコマンド・ハンドラーに通知することができます。通常以下のように処理します。
まず、インスタンスリスト・マネージャーに通知するイベントとメソッドを次のように定義します。
 


Define_Evt

...

 EmployeeUpdate 
Define_map *input #Empno #EmployeeNumber
 
Define_Evt EmployeeDelete
Define_map *input #Empno #EmployeeNumber
 
Mthroutine Signal_EmployeeUpdate
Define_map *input #Empno #EmployeeNumber
Signal EmployeeUpdate EmployeeNumber(#EmployeeNumber) 
Endroutine
 
Mthroutine Signal_EmployeeDelete
Define_map *input #Empno #EmployeeNumber
Signal EmployeeDelete EmployeeNumber(#EmployeeNumber)
Endroutine


 次に、これらのイベントが発生した時に通知を受けるすべてのフィルターまたはコマンド・ハンドラーに、次のようなイベント処理ルーチンを組み込みリッスンを行います。
 次に、これらのイベントが発生した時に通知を受けるすべてのフィルターまたはコマンド・ハンドラーに、次のようなイベント処理ルーチンを組み込みリッスンを行います。


Evtroutine Handling(#EmployeeController.EmployeeUpdate)

...

 EmployeeNumber(#EmployeeNumber) 

...

  
Use Message_box_show (ok ok info *Component ("I have just been notified that employee number " + #EmployeeNumber + " has been updated"))

...

Endroutine
 
Evtroutine Handling(#EmployeeController.EmployeeDelete)

...

 EmployeeNumber(#EmployeeNUmber)

...

Use Message_box_show (ok ok info *Component ("I have just been notified that employee number " + #EmployeeNumber + " has been deleted"))

...

 
Endroutine


最後に、他のものにイベントを伝える(または起動する、通知する)フィルターまたはコマンド・ハンドラーで、次のような処理を行う必要があります。  

#EmployeeController.Signal_EmployeeUpdate EmployeeNumber(#Empno)

または、

#EmployeeController.Signal_EmployeeDelete EmployeeNumber(#Empno)

...