READ ONLY およびREAD WRITE コマンドを使って、テーブル状態を変更することができます。あるレコードを読み込みのみ状態または読み書き状態にするために任意テーブルの状態を変更したい場合は、そのレコードをロードする前にコマンドを実行する必要があります。既にロードされたレコードは、READ ONLY およびREAD WRITEによって影響を受けることはありません。
NEXT RECORD, QUERY, ORDER BY, RELATE ONE等 のカレントレコードをロードするコマンドは、そのレコードの状態をロックまたはロック解除状態にします。レコードは、テーブルのその時の状態 (読み込みのみまたは読み書き) とそのレコードの状態に応じてロードされます。自動リレートを使用するコマンドを使用した場合、リレート先テーブルからもレコードがロードされます。
Repeat READ ONLY([Commands]) ` 今は読み書きである必要はない QUERY([Commands]) ` 検索が終了すると、いくつかのレコードが返される If((OK=1) & (Records in selection([Commands])>0)) READ WRITE([Commands]) ` テーブルを読み書きにする LOAD RECORD([Commands]) While(Locked([Commands]) & (OK=1)) `レコードがロックされていたら ` レコードがアンロックされるまでループ ` ロックしているのは誰か? LOCKED BY([Commands];$Process;$User;$SessionUser;$Name) If($Process=-1) ` レコードは削除済み? ALERT("The record has been deleted in the meantime.") OK:=0 Else If($User="") ` シングルユーザモード $User:="you" End if CONFIRM("The record is already used by "+$User+" in the "+$Name+" Process.") If(OK=1) ` If you want to wait for a few seconds DELAY PROCESS(Current process;60) ` 1秒待つ LOAD RECORD([Commands]) ` レコードのロードを試行 End if End if End while If(OK=1) ` レコードがアンロックされている MODIFY RECORD([Commands]) ` レコードを更新 UNLOAD RECORD([Commands]) End if READ ONLY([Commands]) ` 読み込みのみに戻す OK:=1 End if Until(OK=0)
APPLY TO SELECTION: ロックされたレコードをロードしますが、そのレコードを更新しません。APPLY TO SELECTION は、特別な処置を行わずにテーブルからレコードを読み取ります。ロックされたレコードを検知すると、コマンドはそのレコードをLockedSet システムセットに格納します。
SAVE RECORD: レコードがロックされている場合、このコマンドは何も行いません。エラーも返しません。このコマンドを実行する前にレコードがアンロックされていることを確認する必要があります。
ARRAY TO SELECTION: ロックされたレコードは保存しません。ロックされたレコードを検知すると、コマンドはそのレコードをLockedSetシステムセットに格納します。
GOTO RECORD: マルチユーザ/マルチプロセスデータベース上では、他のユーザがレコードを削除、または追加することができます。したがって、レコード番号が変更される場 合があるため、マルチユーザデータベース上でレコード番号を使用して直接レコードを参照する場合には、十分注意してください。GOTO RECORD