uQueryCanDeactivate/avNotifyDeactivationを使用した未保存の変更の保存

Visual LANSA

uQueryCanDeactivate/avNotifyDeactivationを使用した未保存の変更の保存


フレームワークのバージョンepc831以上では、uQueryCanDeActivateという再定義したメソッドをコマンド・ハンドラーに追加できます。

エンド・ユーザーがコマンド・ハンドラーからフレームワーク内の別の場所に移動したり、フレームワークを終了しようとすると、このメソッドが起動されます。ユーザーが別のコマンド・タブ、ビジネス・オブジェクトの新しいインスタンス、または他のビジネス・オブジェクトやアプリケーションをクリックすると、実行されます。

保存されていない変更を保存する場合に、このメソッドは特に役に立ちます。ルーチンは変更を保存する必要があるかどうかを確認します。保存する必要がある場合は、ユーザーに"Do you want to save your changes before continuing?"という質問が表示されます[はい(Y)]または[いいえ(N)]で回答します。[はい]と答えると、変更を保存できます。 (※質問のメッセージはプログラムソース上で変更することができます。)

ルーチンの実行時でも、コマンド・ハンドラーには、ユーザーが移動を試みる前の値がすべて保持されています。したがって、保存されていない変更がないか確認して保存するのは簡単です。

このメソッドを使用するには、avNotifyDeActivationプロパティをコマンド・ハンドラーの初期化ルーチンに設定する必要があります。

* Handle Initialization

 

Mthroutine Name(uInitialize) Options(*REDEFINE)

 

* Do any initialization defined in the ancestor

 

Invoke #Com_Ancestor.uInitialize

 

* Activate Check for unsaved changes (Unsaved changes logic)

set #Com_Owner avNotifyDeactivation(TRUE)

 

Endroutine

 

次に、再定義したuQueryCanDeActivateルーチンをコマンド・ハンドラーに追加します。

* The Framework initiates this when the user moves to another command tab, or business object instance, or business object, or application, or closes the framework.

* (The framework may initiate this method multiple times)

 

MTHROUTINE NAME(uQueryCanDeactivate) OPTIONS(*REDEFINE)

* Define_Map For(*Result) Class(#vf_elBool) Name(#Allow)

 

#Allow := True

 

if '(#pty_NeedsSaving *eq TRUE)'

 

* If something needs saving, ask the user if they want to save it

 

USE BUILTIN(MESSAGE_BOX_SHOW) WITH_ARGS('YESNO' 'YES' *Default *Default 'The notes have been changed.Would you like to save your changes before continuing?')TO_GET(#MSG_RET)

 

if '#MSG_RET *eq YES'

 

* Save everything

<< my save logic>>

 

endif

 

#pty_NeedsSaving := False

 

endif

 

endroutine

 

さらに複雑なバージョンでは、保存中にエラーが発生した場合に#Allowをfalseに設定できます。また、そのような場合は、ユーザーはクリックした場所に移動しません(または、フレームワークを終了しようとしていた場合は、フレームワークが開いたままになります)。