Forguncyの内部データベース、SQL Server、およびOracle Databaseの場合、レコードの更新時に楽観的同時実行制御(楽観的ロック)を行うようにすることが可能です。ODBCデータソースの場合、同時実行制御は行われません。
この同時実行制御が行われるのは以下の場合のみとなり、それ以外の場合には同時実行制御は行われません。
「テーブルデータの更新」コマンドでデータを更新する際に[更新対象コード]が「カレントレコード」に設定されているコマンドを使用して更新を行ったとき([更新対象コード]の設定は詳細設定を表示すると確認できます)
リストビューの[編集を許可]オプションを使用してレコードの更新を行ったとき
上記の場合において同時実行制御が働いた場合、以下のようなメッセージが表示され、更新処理はキャンセルされます。
Forguncyの内部データベースを使用している場合、同時実行制御は行われます。
更新対象のテーブルにrowversionデータ型の列が含まれている場合、同時実行制御が行われます。
同時実行制御を有効化するためには、いくつかの条件と設定が必要です。
以下のようなトリガーを作成し、更新対象のテーブルに最終の更新日時が格納されるDATE型の列を用意します。
CREATE OR REPLACE TRIGGER trigger_testRowversion BEFORE UPDATE ON TABLE1 FOREACH ROW BEGIN :new.rowversion := current_timestamp; ENDtrigger_testRowversion;
作成した列(上記の場合「ROWVERSION」)を[行のバージョン管理フィールド]として設定します。
同時実行制御は行われません。以下の方法を用いて、手動で同時実行制御を実装することを検討してください。なお、この手動による同時実行制御は「テーブルデータの更新」コマンドを使用してレコードの更新を行う場合にのみ有効です。リストビューの[編集を許可]オプションを使用してレコードの更新を行う場合には、同時実行制御は行われませんので、注意してください。
同時実行制御を行いたいテーブルに任意の名称の文字データ型の列を1つ追加します。格納するデータは36桁の英数字(ハイフン含む)となりますので、このデータが格納できるサイズで作成してください。ここでは列名を「行バージョン」とします。
レコードの更新を行うページの任意のセルに、「行バージョン」とデータ連結を設定します。通常、この「行バージョン」のデータはページに表示する必要がないため、列の非表示か行の非表示の機能を使用して、表示されないように設定します。
レコードの更新を行う部分で、「条件分岐」コマンドを1つ追加し、以下のような条件を設定します。
3の条件が合致した場合に実行するコマンドとして、以下のような設定の「テーブルデータの更新」コマンドを設定します。「%GUID%」キーワードは、GUIDを返すForguncyが持つ特別なキーワードです。GUIDは128ビットの整数値からなる、データを一意に識別するために用いられる識別子です。
3の条件が合致しなかった場合に実行するコマンドとして、以下のような設定の「メッセージの表示」コマンドを設定します。メッセージ内容は任意のもので構いません。