[FileMaker] 無作為にレコードを1つ選択する
FileMaker で無作為にレコードを1つ選択したい状況になった。
FileMaker 公式サイトには 10 個のレコードを無作為に選択する(=ランダムセットを選択する)方法が紹介されている。
同じ方法でレコードを1つ選択することはできるだろう。
でもこの方法では、乱数を格納する数字フィールドが必要となるので、数字フィールドを作成せずにやる方法を考えてみた。
なお、全レコードではなく対象レコードを絞った状態でレコードを選択するものとする。
環境:macOS Catalina Version 10.15.6(英語環境)、FileMaker Pro 18 Advanced
まず手元の 2900 件のレコードで、公式の方法で1つのレコードをランダム抽出してみた。これは1秒掛からなかった。
次に私が考えた方法は、対象レコード総数に乱数を掛け、それを整数で四捨五入。1を加えることで、1以上対象レコード総数以下のランダム数が得られる。これを変数に格納する。
次にループで、現在のレコード番号が変数の数字と一致すればスクリプトを終了、一致しなければ次のフィールドへ移動する。
具体的には以下のようなスクリプトだ。
1Go to Record/Request/Page [ First ]
2
3Set Variable [ $RandomFieldNumber ; Value: Round ( Random * Get ( FoundCount ) ; 0 ) + 1 ]
4
5Loop
6 Exit Loop If [ Get ( RecordNumber ) = $RandomFieldNumber ]
7 Go to Record/Request/Page [ Next ; Exit after last: On ]
8End Loop
この方法だと 2900 件のレコードで2〜3秒掛かる。あれれ、余計なフィールドを作らないから速いと思ったのに・・・。
どうやらループ処理というのは時間が掛かるようだ。
ということで、別解を思い付いた。Go to Record というステップステップは、レコード番号を指定すれば一気にそのレコードへ行ける。計算式で指定すればいい!
つまり、以下のようになる。
Go to Record/Request/Page [ With dialog: Off ; Round ( Random * Get ( FoundCount ) ; 0 ) + 1 ]
我ながらシンプルで美しいスクリプトだ。そしてこの方法だと1秒以下だった。余計なフィールドを作らないし、変数さえも使わない。ひょっとしたら、公式の方法より速いかもしれない。
参考:
Random Set of Records (optimized) | 24U Software
https://24usoftware.com/news/random-set-of-records-optimized
Get (レコード番号)
https://fmhelp.filemaker.com/help/18/fmp/ja/index.html#page/FMP_Help/get-recordnumber.html
FileMaker Proであたるクンつくってみた
https://yscube.com/filemaker-456.html
Round
https://fmhelp.filemaker.com/help/18/fmp/ja/index.html#page/FMP_Help/round.html