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に設定できます。また、そのような場合は、ユーザーはクリックした場所に移動しません(または、フレームワークを終了しようとしていた場合は、フレームワークが開いたままになります)。