1. FM Paradise
  2. 基本編
  3. 重複するレコードはありませんか? Part2

重複するレコードはありませんか? Part2

前の記事はこちら

重複を防ぐ方法

前回は、重複を防ぐ方法を見ていきました。その中で、「同じ商品が同じ日に同じ個数入力した場合に警告を出す」という方法を具体的にファイルメーカーでどのようにしたらいいかを見ていきます。

ExecuteSQL関数を使って

論理関数「ExecuteSQL」を使った方法を紹介します。ExecuteSQL関数を使って、今入力しているレコードのデータがほかにないかをチェックし、あれば警告を出すというものです。スクリプトを作成し、スクリプトトリガを設定していきます。

ExecuteSQL関数を使用して、重複チェックを行う

このようなスクリプトをまず作成します。変数を設定のスクリプトステップの計算式の内容は下記のExecuteSQL関数が入ります。この関数を実行した結果を変数に格納し、次のステップIfでこの変数の値が1より大きい場合(2以上になる場合)に警告を出します。※同じテーブルであれば、対象レコードかそうではないかは関係ありません。

ExecuteSQL ( "SELECT count(\"入庫日\") FROM \"入庫\" WHERE \"入庫日\" = ? AND \"商品名\" = ? AND \"数量\" = ?" ; "" ; "" ; 入庫::入庫日 ; 入庫::商品名 ; 入庫::数量 )

上記関数では、入庫日が同じで、かつ同じ商品名が登録されている件数を調べます。この値が2以上になると他にレコードがあることになりますので、警告を出すようにしています。

チェックの結果、カスタムダイアログのスクリプトステップを使う 重複するデータの例

重複をしてしまった場合どうするか

次に重複をしてしまった場合はどうするか。すでに重複しているものの場合はどうするか、という点です。

まず、重複している場合、どのデータを生かすかを決めましょう。

・先に作られたレコードを優先

・後で作られたレコードを優先

大体、このどちらかではないかと思います。先に作られた場合は、レコードのソートを解除した場合に上に来るレコードということになります。後で作られた場合ですが、下にくるレコードなわけなのですが、ここではリレーションのソート機能を使って判別していきますが、下に来るというだけを見極めるのが非常に難しいのです。そこで、下記の図のように「作成タイムスタンプ」、つまり作成された日時を記録しておけるレコードを事前に作成する必要があります。

作成タイムスタンプを作成しておきましょう

テーブルを作成し、元のテーブルとリレーション

重複をまとめるための新しいテーブルを作成します。このテーブルと元のテーブルを下の図のようにリレーションしていきます。「このリレーションシップによるレコードの作成を許可する」にチェックを入れておきます。

テーブルの作成と、フィールドの作成 重複をチェックし、まとめるためのリレーションシップ設定

上記は、先に作られたレコードを優先する場合です。リレーション設定にてソートをしていません。また、下記は後で作られたレコードを優先する場合です。

リレーションの設定画面において、ソートを設定

このように、元のテーブル側のソートとして設定をします。

新しいテーブルにルックアップの設定

新しく作ったテーブルにルックアップの設定をしていきます。

ルックアップの設定 ルックアップの設定をして、自動的にデータを入力

ルックアップの設定をすることで、元のテーブルからデータを自動的にコピーすることができるようになります。コピーされるデータは、先ほどのリレーションのソートがある場合は、もっとも後にできたレコード、ない場合は最初にできたレコードのデータが有効とされます。

重複をまとめるためのスクリプト

元のテーブルのレイアウトに、新しく作ったテーブルの「レコード作成用」というフィールドを追加します。このフィールドにデータを入力すると、新しく作ったテーブルにレコードを「このリレーションシップによるレコードの作成を許可する」の機能によって作成することができます。

レコードを作成するためのフィールドを追加 重複をまとめるスクリプト

このスクリプトを使用して、レコード作成用のフィールドに値を入れると新しいテーブルでレコードが作成されます。元のテーブルでデータが重複していても、新しいテーブルで作成されるのは1レコードのみになります。

スクリプトを実行して重複したレコードをまとめた後