前の記事はこちら
前回は、重複を防ぐ方法を見ていきました。その中で、「同じ商品が同じ日に同じ個数入力した場合に警告を出す」という方法を具体的にファイルメーカーでどのようにしたらいいかを見ていきます。
論理関数「ExecuteSQL」を使った方法を紹介します。ExecuteSQL関数を使って、今入力しているレコードのデータがほかにないかをチェックし、あれば警告を出すというものです。スクリプトを作成し、スクリプトトリガを設定していきます。
このようなスクリプトをまず作成します。変数を設定のスクリプトステップの計算式の内容は下記のExecuteSQL関数が入ります。この関数を実行した結果を変数に格納し、次のステップIfでこの変数の値が1より大きい場合(2以上になる場合)に警告を出します。※同じテーブルであれば、対象レコードかそうではないかは関係ありません。
ExecuteSQL ( "SELECT count(\"入庫日\") FROM \"入庫\" WHERE \"入庫日\" = ? AND \"商品名\" = ? AND \"数量\" = ?" ; "" ; "" ; 入庫::入庫日 ; 入庫::商品名 ; 入庫::数量 )
上記関数では、入庫日が同じで、かつ同じ商品名が登録されている件数を調べます。この値が2以上になると他にレコードがあることになりますので、警告を出すようにしています。
次に重複をしてしまった場合はどうするか。すでに重複しているものの場合はどうするか、という点です。
まず、重複している場合、どのデータを生かすかを決めましょう。
・先に作られたレコードを優先
・後で作られたレコードを優先
大体、このどちらかではないかと思います。先に作られた場合は、レコードのソートを解除した場合に上に来るレコードということになります。後で作られた場合ですが、下にくるレコードなわけなのですが、ここではリレーションのソート機能を使って判別していきますが、下に来るというだけを見極めるのが非常に難しいのです。そこで、下記の図のように「作成タイムスタンプ」、つまり作成された日時を記録しておけるレコードを事前に作成する必要があります。
重複をまとめるための新しいテーブルを作成します。このテーブルと元のテーブルを下の図のようにリレーションしていきます。「このリレーションシップによるレコードの作成を許可する」にチェックを入れておきます。
上記は、先に作られたレコードを優先する場合です。リレーション設定にてソートをしていません。また、下記は後で作られたレコードを優先する場合です。
このように、元のテーブル側のソートとして設定をします。
新しく作ったテーブルにルックアップの設定をしていきます。
ルックアップの設定をすることで、元のテーブルからデータを自動的にコピーすることができるようになります。コピーされるデータは、先ほどのリレーションのソートがある場合は、もっとも後にできたレコード、ない場合は最初にできたレコードのデータが有効とされます。
元のテーブルのレイアウトに、新しく作ったテーブルの「レコード作成用」というフィールドを追加します。このフィールドにデータを入力すると、新しく作ったテーブルにレコードを「このリレーションシップによるレコードの作成を許可する」の機能によって作成することができます。
このスクリプトを使用して、レコード作成用のフィールドに値を入れると新しいテーブルでレコードが作成されます。元のテーブルでデータが重複していても、新しいテーブルで作成されるのは1レコードのみになります。