FileMakerでレコードをリストやポータルで表示しているとき、一般的なアプリに倣って複数行(複数レコード)をまとめて選択したくなります。選択できるようにしましょう。
FileMakerでよく使う小ネタのベーシック部分だけを単独で記していく小さなシリーズ。今回はレコードを複数選択する機能です。単独の小ネタと言いながら、若干複雑な話になりまして、以前の投稿の内容を前提とします。
これらの合わせ技で、複数レコードの選択を実装します。
複数レコードを選択すること
一般的なアプリやFinderと同じように、リスト状に並んだレコードを複数選択したい。そんな普通の願望から生まれた「FileMakerで複数レコードを選択する」です。
シフトキーを押しながらクリックしたら連続して選択、コマンドキー押しながらだと行毎に飛び飛びに選択/解除、何もキーを押さず普通にクリックしたら選択していたレコードが解除される、そんな感じの普通の操作です。これを作りましょう。簡素に。
選択とは
その前にまず「選択」を定義します。選択とはなんぞや。ここではそれはズバリ
select フィールドに 1 を入れること
とします。
「select」という名前の数字フィールドをメインデータテーブルに追加します。selectフィールドが 1 なら選択状態、0 なら未選択、ということにします。
つまり選択したいときはselect に 1 を入れ、選択解除したいときは 0 を入れます。はい。ではその操作をどう実現させましょう。
複数行を選択する操作
リストされた複数の行を選択するとき、一般的なアプリではシフトキーを押しながらクリックしたり、Macではコマンドキーを使います。そういう操作に準じましょう。
修飾キー + クリックによる複数選択
シフト+クリックで連続した選択、コマンド+クリックで個別に選択と解除のトグル、そのようにします。
この操作を実現するため、以前の投稿「クリックのスクリプト」で示した方法をそのまま使います。
件の投稿の中で「シフトクリック」や「コマンドクリック」を使い分けるスクリプトを作成しましたが、実際のところそれを何に使うのかについては踏み込みませんでした。今回の「レコードを複数選択」が答えの1つです。
レコードをクリック、より正確にはレコードをアクティブ化したときに、どの修飾キーが押されているか、あるいは押されていないのか、そういうことを「クリックスクリプト」を使って判定、振り分けます。
必要なフィールドや判定
クリックスクリプトの応用により修飾キー + クリック(アクティブ)の操作で select フィールドに 1 を入れたり 0 にしたりするわけですが、それを実現するための必須フィールドや事前処理などがあります。
GLBフィールド theRn と prevRn
例えば シフトキー押しながらレコードクリックで、前のクリックから今のクリックまでを連続して選択させます。「前のクリック」の情報が常に必要と判りますね。
そのためグローバルなフィールドをいくつか使います。
- theRn … 現在アクティブなレコードのRN
- theId … 現在アクティブなレコードのID
- prevRn … 直前にアクティブだったレコードのRN
- selectRns … select = 1 のレコードのRNをリスト
- selectIds … select = 1 のレコードのIDをリスト
最後二つのフィールドはオマケの便利フィールド的な扱いですが、上三つはシステムの根幹に関わる重要フィールドです。レコードがアクティブになる毎にこれらフィールドに値を自動入力します。
- theRn の値を prevRn に転記する
- 現在のRN を theRn に、ID を theId に転記
これを必ず行います。常に「一個前のRN」を記録し続けますね。これにより、シフトキーを押しながらレコードをクリックしたら
prevRn から theRn までの連番レコードの select フィールドに 1 を入れる
というスクリプトで連続選択を実現することができます。
そんな感じで、コマンド+クリックのスクリプトを定義したり、何もないクリックで「選択が解除される」スクリプトを走らせたり、わりと面倒ですが細かく制御します。
くどくど説明しませんが、こうした実務上有効な手立てはサンプルファイルのスクリプトワークスペースで確認できます。

レコードがアクティブになったとき
レコードがアクティブになったときに、RNチェックしたりアクティブ処理したりselectクリアしたりいろいろするわけですが、「レコードがアクティブになったとき」そのものにパターンがいくつかあります。
- レコードの表示領域をクリックしたとき
- ポータルの行をクリックしたとき
- 矢印キーでレコード移動してきたとき
それぞれ、レイアウトに表示しているテーブルの違いやどうやってそのレコードに移動してきたかによって「アクティブになった」状態が異なり、アクティブ後の処理も異なります。

透明なボタンを配置する
リスト表示のレコード表示部分やポータル行を覆い尽くす透明ボタンに「アクティブ処理」を割り当てたりします。クリックによってレコードを選択する場合に有効です。特にポータルの行では必須のボタン配置となります。
矢印キーでレコード移動のスクリプトに記述する
矢印キーでポータル行を移動した場合はボタン関係ないので、矢印キーによる移動スクリプトの最後に直接アクティブ処理を含ませます。データテーブルを表示しているレイアウトでは次の OnRecordLoadを使うので矢印キーのスクリプトに何かを追加する必要はありません。
OnRecordLoad を使う
メインデータのテーブルを直接表示しているレイアウトでは、アクティブの判断をFMに任せ、OnRecordLoad トリガにアクティブ処理を受け持たせたりします。透明ボタンも併用し「ダブルクリックした場合」のスクリプトを担当させたりもします。
データテーブルを表示するレイアウトの意味
というように、細かくパターンに応じた処理を設定しており、ちょっと面倒ではあります。実はすべてを「透明ボタン」と「矢印キースクリプト」に集約させることもできます。
が、それをせず、データテーブルを表示しているレイアウトではあえてFM仕様に身を任せ、スクリプトトリガを利用しています。細かな操作(ソート、対象外にする、対象外入れ替え、削除、新規、検索など)を普通に行ってもRNがすぐに修復され問題が起きないというメリットがあるからです。
このように、データテーブルを表示しているレイアウトは「メインで操作を受け付ける」レイアウトと位置づけられます。
サンプルファイル
今回は説明を大幅に端折った投稿となりました。アクティブについて、そのときの処理について、パターンによる処理の違い、アクティブフィールド、セレクトフィールド、グローバルなフィールドと値の生成、いろいろ複雑な仕組みで理解が必要なんですが、説明がくどくなり投稿も長くなるのでほぼすっ飛ばしました。
自分のためにもサンプルファイルを添付しておくのでして、基本の事柄はサンプルファイルを確認することで事足ります。
Select multiple records.fmp12.zip今回のテーマは次の投稿と関連しています。








