ブログの更新が開いてしまいましたが、重要な事柄である複数の列(フィールド)でプライマリーキーを設定する方法について検証してみたいと思います。
ここでのプライマリーキーは、当然ですがユニークな値として重複を許可しない制約となります。
最重点としてはスクリプトステップにて、レコードを確定した際に、Get ( 最終エラー ) = 504としてエラーイベントを取得させることにあります。
例として以下の2つのテーブルを検証してみます。
1)銀行マスタ
・銀行コード (ユニークな値を指定)
・銀行名
2)銀行支店マスタ
・銀行コード
・支店コード
・主キー (ユニークな値を指定)
・支店名
1.テーブル定義での「入力値の自動化」を設定
上記の銀行支店マスタの列である「主キー」に対して、例えば「計算値」に以下のような式を設定する方法があります。
「計算値」 銀行コード & ”,” & 支店コード
一見、この方法でもユニークな値としてレコードが挿入された際、重複エラーが発生しますが、タイミングがそのレコードから、カーソルが離れた時にしか発生しません。
以下のようなスクリプトステップで、エラーを取得しようとしてもできません。
2.解決策(代替案)
FileMakerの仕様は、「新規レコードを挿入した後に、レイアウトに表示されている項目(銀行コード、支店コード)をフィールドに挿入した後に、レコード確定を行う。」
ここでのレイアウトに表示されている項目が「ユニークな値」として設定されているならば、重複エラーを取得することができます。
ゆえに、「ユニークな値」として設定している列である「主キー」に対しても以下を行うことで重複エラーを取得することができます。
①テーブル定義
・「入力値の自動化」で、計算式の設定は行わない。
・テキストとして、「ユニークな値」を設定する。
②レイアウトに設定しておく。
フィールド入力
□ ブラウズモード :チェックを外しておきます。(オブジェクトを隠しておいても良いです。)
③計算結果を挿入する。(以下参照)
3.画面遷移
3.1.銀行支店マスタ保守が起動された状態です。
3.2.新規作成ボタンを押下し、銀行コードと支店コードの入力を行います。
銀行コード(ドロップダウンリスト)を指定した結果、既に登録されている支店が表示されます。
新規作成を取りやめ、登録済の支店を修正するため、明細のボタンを押下します。
3.3.他の端末で編集中の場合、メッセージを表示し処理継続を不可としています。
補足
一般のRDBMSでは、複数の指定した列に対し、CONSTRAINT UNIQUEとして一意制約を作成することができます。
今回は、「入力値の自動化」で計算式を設定した列は、スクリプトステップでは使えない(または使い難い)ことを書きました。(他の方法で対応することもできると思います。)
計算式で設定した列に対する評価(値の編集、空欄不可、重複の判定等々のタイミングなど)の仕様がFileMakerのある意味での難しさになっているのかもしれません。(因みに、私はフィールド毎に設定するスクリプトトリガーをほとんど使用しません。)
Claris社の今後に期待したいところです。
以上です。