[FileMaker] 無作為にレコードを1つ選択する

FileMaker で無作為にレコードを1つ選択したい状況になった。

FileMaker 公式サイトには 10 個のレコードを無作為に選択する(=ランダムセットを選択する)方法が紹介されている。

レコードのランダム選択
https://support.claris.com/s/article/%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E3%83%A9%E3%83%B3%E3%83%80%E3%83%A0%E9%81%B8%E6%8A%9E-1503692917745?language=ja

同じ方法でレコードを1つ選択することはできるだろう。

でもこの方法では、乱数を格納する数字フィールドが必要となるので、数字フィールドを作成せずにやる方法を考えてみた。

なお、全レコードではなく対象レコードを絞った状態でレコードを選択するものとする。

環境:macOS Catalina Version 10.15.6(英語環境)、FileMaker Pro 18 Advanced

まず手元の 2900 件のレコードで、公式の方法で1つのレコードをランダム抽出してみた。これは1秒掛からなかった。

次に私が考えた方法は、対象レコード総数に乱数を掛け、それを整数で四捨五入。1を加えることで、1以上対象レコード総数以下のランダム数が得られる。これを変数に格納する。

次にループで、現在のレコード番号が変数の数字と一致すればスクリプトを終了、一致しなければ次のフィールドへ移動する。

具体的には以下のようなスクリプトだ。

Go to Record/Request/Page [ First ]

Set Variable [ $RandomFieldNumber ; Value: Round ( Random * Get ( FoundCount ) ; 0 ) + 1 ] 

Loop
	Exit Loop If [ Get ( RecordNumber ) = $RandomFieldNumber ] 
	Go to Record/Request/Page [ Next ; Exit after last: On ]
End 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