LoginSignup
4
10

More than 5 years have passed since last update.

FileMaker - ExecuteSQLの結果をVirtual Listとして利用する

Last updated at Posted at 2015-07-17

以前よりファイルメーカーのテクニックとして、Virtual Listというものがあります。
これは汎用的なテーブルを用意しておき、必要に応じてデータを動的に設定して表示するというものです。

このテクニックはExecuteSQL関数がファイルメーカーに追加されたことで、今まで以上に利用しやすくなったと思います。今回は簡単な例を元にこの実装方法を説明してみます。

概要

ExecuteSQLの結果リストの形式を以下ようにします。
- レコードの区切りは改行
- 各フィールドの区切りは任意の文字列(今回は"|")とした結果リストを返す

この結果リストをグローバルフィールドに保存し、Virtual List用のテーブルで各レコードのデータとして分解表示するようにテーブル定義すると完了です。

Virtual List用のテーブル定義

最初にテーブルを定義しておきます。
Virtualテーブルの項目定義は以下のように定義します。
※()内はサンプルファイルでのフィールド名
1. ExecuteSQL関数の結果を保持するグローバルフィールド(gALLData)
2. レコード番号のフィールド(ID)
3. SQLの結果リストからレコード番号に一致する行データを切り出したデータの保持フィールド(RowData)
3. 2のデータから各項目に分解したデータ用のフィールドを複数個(F1〜F10)
4. 3が数値の場合に利用するフィールドを3と同数(num_F1〜num_F10)

サンプルファイルでの定義内容

Virtual List用レコードの作成

定義したら、必要数分のレコードを生成しておきます。
サンプルでは100レコード用意しました。
各レコードのIDフィールドに連番が正しく設定されている事を確認します。

ここで定義のテストとして、gALLDataフィールドにフィールド区切り文字を使用して作成したデータを入力してみて各レコードのフィールドに正しく表示されるかを確認しておくと良いかもしれません。

検索用スクリプト

次にExecuteSQLにて取得する検索用スクリプトを作成します。
サンプルでは、ダミーの顧客テーブルを用意し都道府県で検索しています。
実際に作成する場合はエラー処理などを追加しますが、今回は要点だけを説明するために省略しています。
あと、VirtualListテーブルのレコード数以上の結果を受け取っても無駄なので、必要レコード数分だけ受け取るようにしています。

スクリプト名「顧客情報抽出(都道府県)」
1 If [#Assign ( Get(スクリプト引数) )]
2   フィールド設定 [VirtualTable::gALLData; 
     Let ( [   ~query   = 
     "SELECT \"名前\", \"都道府県\", 
       \"アドレス\", \"年齢\", \"誕生日\", \"電話番号\"  
       FROM \"@顧客\"  
       WHERE \"都道府県\" = ?  
       FETCH FIRST 100 ROWS ONLY  " ] ;
       ExecuteSQL ( ~query ; "|" ; "" ; $都道府県)  
     )]
3   レコード/検索条件/ページへ移動 [最初の]
4 End If

検索用スクリプトの呼び出し用ボタン

最後に都道府県を指定してスクリプトを実行するボタンを作成して完成です。
クリック時の定義を以下のようにします。

検索の呼び出し

説明は以上です。
少しでも参考になれば幸いです。

今回のサンプルは以下の場所に置きましたので、詳しくはファイルを参照して下さい。
サンプルファイル

4
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
10