4D v13.4On Exitデータベースメソッド |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
4D v13.4
On Exitデータベースメソッド
|
On Exitデータベースメソッド | ||||||||
このコマンドは引数を必要としません | ||||||||
On Exitデータベースメソッドは、データベースを終了すると一回呼び出されます。
このメソッドは、以下の4D環境で使用されます:
Note: On Exitデータベースメソッドは、4D Serverでは起動されません。
On Exitデータベースメソッドは4Dによって自動的に起動されます。プロジェクトメソッドとは異なり、プログラムからデータベースメソッドを呼び出すことはできません。しかしメソッドエディタから実行することはできます。またサブルーチンを使用できます。
データベースは、以下のうちいずれかが発生すると終了します:
データベースの終了がどのような方法で行われたかに関わらず、4Dは以下のような処理を実行します:
On Exitデータベースメソッドは、以下のような処理を実行するには最適です:
Note: On Exitデータベースメソッドがローカル/クライアントプロセスであり、データファイルにアクセスできないことを覚えておいてください。つまり、リモートモードで4Dを使用している時、On Exitデータベースメソッドで検索やソートを実行すると、4Dは "フリーズ" し、実際には終了しません。アプリケーションを終了するとき、リモートモードの4Dからデータにアクセスする必要があるならば、On Exitデータベースメソッド内から、新しいグローバルプロセスを作成してください。このグローバルプロセスはデータファイルにアクセスできます。この場合On Exitデータベースメソッドの終了前に、新しいプロセスが正しく終了されたことを (インタープロセス変数を使用するなどして) 確認してください。
以下の例では、作業セッション中に発生する重要なイベントを追跡し、その説明を“Journal”という名前のテキストドキュメントに書き込むすべてのメソッドをカバーします。
- On Startupデータベースメソッドは、インタープロセス変数vbQuit4Dを初期化します。この変数は、すべての使用プロセスに、データベースが終了中であるか通知するために使用されます。またこのメソッドは、ジャーナルファイルが存在しない場合にはそれを作成します。
` On Startup データベースメソッド
C_TEXT(<>vtIPMessage)
C_BOOLEAN(<>vbQuit4D)
<>vbQuit4D:=False
If(Test path name("Journal")#Is a document)
$vhDocRef:=Create document("Journal")
If(OK=1)
CLOSE DOCUMENT($vhDocRef)
End if
End if
WRITE JOURNAL("セッションが開始されました")
- WRITE JOURNALプロジェクトメソッドは、他のメソッドからサブルーチンとして使用され、ジャーナルファイルに受け取った情報を書き込みます:
` WRITE JOURNAL プロジェクトメソッド
` WRITE JOURNAL ( Text )
` WRITE JOURNAL ( Event description )
C_TEXT($1)
C_TIME($vhDocRef)
While(Semaphore("$Journal"))
DELAY PROCESS(Current process;1)
End while
$vhDocRef:=Append document("Journal")
If(OK=1)
PROCESS PROPERTIES(Current process;$vsProcessName;$vlState;$vlElapsedTime;$vbVisible)
SEND PACKET($vhDocRef;String(Current date)+Char(9)+String(Current time)+Char(9)
+String(Current process)+Char(9)+$vsProcessName+Char(9)+$1+Char(13))
CLOSE DOCUMENT($vhDocRef)
End if
CLEAR SEMAPHORE("$Journal")
ドキュメントが毎回開かれ閉じられることに注目してください。さらにドキュメントへのアクセス保護としてセマフォを利用していることにも注目してください。2つのプロセスがジャーナルファイルに同時にアクセスすることを防ぐためです。
- M_ADD_RECORDSプロジェクトメソッドは、アプリケーションモードでレコード追加メニュー項目が選択されると実行されます:
` M_ADD_RECORDS プロジェクトメソッド
MENU BAR(1)
REPEAT
ADD RECORD([Table1];*)
If(OK=1)
WRITE JOURNAL("Table1へのレコード追加 #"+String(Record number([Table1])))
End if
Until((OK=0)|<>vbQuit4D)
このメソッドは、ユーザが最後のデータ入力をキャンセルするか、またはデータベースを終了するまでループします。
- [Table 1]の入力フォームには、On Outside Callイベントの処理手順も含まれています。したがって、プロセスがデータ入力中であっても、ユーザは現在のデータ入力を保存するかまたは保存しないで、スムーズに終了できます:
` [Table1];"Input" フォームメソッド
Case of
:(Form event=On Outside Call)
If(<>vtIPMessage="QUIT")
CONFIRM("このレコードに対する変更を保存しますか?")
If(OK=1)
ACCEPT
Else
CANCEL
End if
End if
End case
- M_QUITプロジェクトメソッドは、アプリケーションモードでファイルメニューから終了が選択されると実行されます:
` M_QUIT プロジェクトメソッド
$vlProcessID:=New process("DO_QUIT";32*1024;"$DO_QUIT")
このメソッドには、ある仕掛けがあります。QUIT 4Dが呼び出されると、コマンドは即座に効果があります。したがって、呼び出しが発行されたプロセスは、データベースが実際に終了されるまでの間は“停止モード”になります。このプロセスは、データ入力が行われているプロセスの可能性があるため、QUIT 4Dの呼び出しは、この目的にだけ開始されるローカルプロセス内で実行されます。DO_QUITメソッドは、以下のようになります:
` DO_QUIT プロジェクトメソッド
CONFIRM("本当に終了しますか?")
If(OK=1)
WRITE JOURNAL("データベース終了中")
QUIT 4D
` QUIT 4Dは即座に効果があります。以下の行が実行されることはありません。
` ...
End if
- 最後に、すべての開いているユーザプロセスに対して“ただちに終了するよう”通知するOn Exitデータベースメソッドは、以下のようになります。このメソッドは、vbQuit4DをTrueに設定し、データ入力を実行しているユーザプロセスに、プロセス間メッセージを送信します:
` On Exit データベースメソッド
<>vbQuit4D:=True
REPEAT
$vbDone:=True
For($vlProcess;1;Count tasks)
PROCESS PROPERTIES($vlProcess;$vsProcessName;$vlState;$vlElapsedTime;$vbVisible)
If(((($vsProcessName="ML_@")|($vsProcessName="M_@"))) & ($vlState>=0))
$vbDone:=False
<>vtIPMessage:="QUIT"
BRING TO FRONT($vlProcess)
CALL PROCESS($vlProcess)
$vhStart:=Current time
REPEAT
DELAY PROCESS(Current process;60)
Until((Process state($vlProcess)<0)|((Current time-$vhStart)>=?00:01:00?))
End if
End for
Until($vbDone)
WRITE JOURNAL("セッション終了中")
Note: "ML_..."または"M_..."で始まる名前を持つプロセスは、新規プロセス開始プロパティを選択したメニューによって開始されます。この例では、そのようなプロセスは、レコード追加メニューが選択された時に開始されたプロセスです。
(Current time-$vhStart)>=?00:01:00?という判定式により、データベースメソッドは“他のプロセスを待っている”状態を終了します。他のプロセスがただちに反応しない場合には、ループを繰り返します。
・次に示しているのは、データベースによって作成されたジャーナルファイルの代表的な例です:
2/6/03 | 15:47:25 | 1 | Main process | セッションが開始されました |
2/6/03 | 15:55:43 | 5 | ML_1 | Table1へのレコード追加 #23 |
2/6/03 | 15:55:46 | 5 | ML_1 | Table1へのレコード追加 #24 |
2/6/03 | 15:55:54 | 6 | $DO_QUIT | データベース終了中 |
2/6/03 | 15:55:58 | 7 | $xx | セッション終了中 |
Note: $xxという名前は、On Exitデータベースメソッドを実行するために4Dが開始したローカルプロセスの名前です。
プロダクト: 4D
テーマ: データベースメソッド
初出: