FileMakerでポータルを使っていると、「列ごとにクリックで並べ替えできたら便利なのに…」と感じる場面が多いと思います。たとえば、請求一覧を日付順に並べ替えたり、顧客名の五十音順に並べ替えたりしたいのに、毎回スクリプトメニューから実行したり、ボタンを別に用意したりするのは少し面倒です。
この記事では、「ポータルのヘッダ部分をクリックすると、その列で並べ替えができる」仕組みを、できるだけわかりやすく紹介します。専門用語は最小限にして、ステップごとに整理しながら解説していきます。
ポータルヘッダで並べ替えたい理由
ポータルは関連レコードを一覧で表示するのにとても便利ですが、標準のままだと並べ替え方が固定されていることが多く、次のような不便が出やすくなります。
- ユーザーが自分で並べ替えの条件を変えられない
- 「昇順」「降順」を切り替えるのに、別のボタンやスクリプトを用意しないといけない
- Excelなどのように「列の見出しをクリックして並べ替え」という直感的な操作ができない
そこで、ポータルの列見出し(ヘッダ)をクリックすると、対象の列で昇順/降順の並べ替えが切り替わるようにしておくと、操作がかなりスムーズになります。
全体の仕組みをシンプルにイメージする
実装のイメージは次の3ステップです。
- 「どの項目で並べ替えるか」「昇順か降順か」を保持するフィールドを用意する
- その情報を元に、関連レコードを並べ替えるスクリプトを作る
- ポータルヘッダの文字を「ボタン」にして、クリックでスクリプトを呼び出す
この流れさえ押さえておけば、項目を増やしたいときも応用が効きます。
並べ替え条件を保持するフィールドを作る
まずは「どの列で」「どの向きに」並べ替えるかを記憶しておくフィールドを用意します。一般的には、ポータルを表示している「親テーブル」に設定するのが分かりやすいです。
- フィールド1:ソートキー(テキスト)
例)「請求日」「顧客名」などの名前を入れる - フィールド2:ソート順(数値またはテキスト)
例)1=昇順、-1=降順 など
ソートキーには、「どの項目を並べ替え対象にするか」をわかる名前を入れておきます。実際のフィールド名そのものでも良いですし、「date」「name」などのコードっぽい短い文字列でも構いません。
並べ替えスクリプトを作る
次に、ポータルの並べ替えを実行するスクリプトを準備します。ポイントは、引数で「どの列か」が渡され、その情報と現在のソート状態を見ながら「昇順/降順」を切り替えることです。
1. スクリプト引数で列名を受け取る
スクリプトは 1 本にまとめておくと、あとで列を増やすときも楽です。スクリプトの流れの例は以下のようになります。
- スクリプト引数で「クリックされた列の名前」を受け取る
(スクリプトステップ例:「変数を設定 [ $sortKey ; Get ( スクリプト引数 ) ]」) - もし現在のソートキーと同じ列なら、昇順・降順を反転する
(例:「If [ $$sortKey = $sortKey ]」の中で「$$sortOrder」を 1 <-> -1 で切り替える) - 違う列なら、その列を新しいソートキーにして、昇順にリセットする
(例:「Set Variable [ $$sortKey ; $sortKey ]」「Set Variable [ $$sortOrder ; 1 ]」) - 関連テーブルに対して並べ替え実行(並べ替えレコード)
このとき、「どのフィールドを昇順/降順で並べ替えるか」は、If 文などで分岐させて書いておくとわかりやすくなります。
2. 実際の並べ替え処理
スクリプト内では「関連テーブル(ポータルに表示しているテーブル)」を対象にして Sort を行います。ここで注意が必要なのは、ポータルの並べ替えは、レイアウトで指定したポータルの「並べ替え条件」に依存する点です。
実務で確実に動かすには、次のような手順にしておくと安全です。
- 並べ替え対象の「関連テーブル」をベーステーブルにしたレイアウトを 1 つ用意しておく(ユーザーに見せないユーティリティ用レイアウトでOK)
- スクリプト内で「新規ウインドウ」または「ウインドウを選択」でそのレイアウトに移動
- そこで「並べ替えレコード」ステップを実行して、グローバルフィールドや変数($$sortKey, $$sortOrder など)を条件に If で分岐させる
- 並べ替え後、「元のレイアウトに戻る」か「ウインドウを閉じる」
たとえば、ソートキーが「請求日」でソート順が1(昇順)のときだけは「請求日 昇順」で並べ替え、それ以外は「請求日 降順」で並べ替えるように、If ステップで分岐させて並べ替えステップを 2 パターン用意しても構いません。多少ステップ数は増えますが、処理の中身が目で追いやすくなります。
なお、ポータルの「並べ替え」オプションにグローバルフィールドを指定しておき、そのグローバルフィールドに計算結果(例:請求日を元にした数値)を書き込む方式で実装することもできます。この場合は「並べ替えレコード」ステップではなく、グローバルフィールドの中身を更新して「ウインドウを再描画」させるだけで、ポータルの順序が切り替わります。
ポータルヘッダにボタンを設定する
肝心なのは、ユーザーが自然にクリックできる場所にスクリプトを割り当てることです。ポータルヘッダのラベル(「請求日」や「顧客名」と書いてある部分)をボタンにしてしまいましょう。
- レイアウトモードに切り替える
- ポータルヘッダのテキスト(例:「請求日」)を選択
- 「ボタン設定」から、先ほど作った並べ替えスクリプトを指定
- スクリプト引数に、その列を示す文字(例:「請求日」や「date」など)をセット
これで、ユーザーが「請求日」というヘッダをクリックするたびに、同じスクリプトが呼び出され、ソートキーが「請求日」に切り替わり、昇順/降順もトグルするようになります。
昇順・降順をアイコンで見せる工夫
操作性をさらに高めるために、「今どの列で、どちら向きに並んでいるか」がひと目でわかるようにすると便利です。簡単な方法は、ヘッダの横に「▲」「▼」などの記号を条件付きで表示することです。
- ソートキーが「請求日」かどうかを条件にして表示/非表示を切り替える(条件付き書式や「隠す条件」を利用)
- ソート順が1なら「▲」、-1なら「▼」とテキストを切り替える(計算フィールドやマージ変数で「If ( $$sortOrder = 1 ; "▲" ; "▼" )」のように表示)
これを列ごとに設定しておけば、「あ、今は顧客名で昇順だな」といった状態がユーザーにもわかりやすくなります。
実装時の注意点と応用
いくつか注意しておくとよいポイントと、応用のヒントを挙げておきます。
- 集計フィールドの並べ替え
集計フィールドはそのままでは柔軟にソートしづらい場合があります。必要に応じて、数値や日付などソートしやすい「元データ」のフィールドを使って並べ替え条件を作ると安定します。 - 複数条件での並べ替え
たとえば「顧客名 → 請求日」のように、2段階の並べ替えも可能です。この場合は、スクリプト内の並べ替え指定で2つ以上のフィールドを登録しておき、条件によってどのフィールドを優先するかを切り替えます。 - レイアウトの複製時
同じポータルを別レイアウトに複製するときは、ボタンのスクリプト設定や引数も一緒にコピーされますが、フィールド名の変化などで動かなくなる場合があります。複製後はテストを忘れないようにしましょう。
一度仕組みを作ってしまえば、新しい列を追加するときも、ヘッダにボタン設定とスクリプト内の条件分岐を少し足すだけで応用できます。ユーザーからの「ここも並べ替えたい」という要望にも、比較的簡単に応えられるようになります。
まとめ
ポータルヘッダクリックで並べ替えを実装するポイントをあらためて整理すると、次の3つです。
- 並べ替えの状態(キーと昇順/降順)を保持するフィールドを用意する
- 1本のスクリプトで、ソートキーの切り替えと昇順/降順のトグルを行う
- ポータルヘッダのラベルをボタンにして、スクリプト引数で「どの列か」を渡す
これだけで、普段使っているポータルがぐっと使いやすくなります。FileMakerの標準機能だけで実現できるため、プラグイン不要で実装できるのもメリットです。自分のファイルに少しずつ取り入れて、操作性の高いレイアウト作りに役立ててみてください。