ソートボタンFileMakerでファイルを作るときに使い回す定番の小ネタ・小技があります。今回はソートボタンのスクリプト。FileMakerはときどき「えっ。なんでこれができないの?」っていう機能の欠落を感じることがあります。ソートの関数が用意されていないこともその一つ。計算式でソートを制御することができません。ソート関数はありませんし、ソート項目を名前で指定できるスクリプトステップもありません。ソートはすべてソートダイアログで個別具体的に指示し保存するしかありません。これが不自由でみんな困ってます。困ってますよね?困ってませんか?そうですか。何がしたいかというとリストのタイトル部分をクリックしたらソートされるようにしたいだけです。大概のリスト表示があるプログラムでよく見かけます。クリックでソートするだけでなくトグルで昇順降順が入れ替わります。https://www.digitalboo.net/main/wp-content/uploads/2021/06/FM-sortClick.m4vわざわざムービーにする必要もないけど。ポイントは二点あります。ソートを実行するスクリプトボタンクリックごとに昇順・降順を切り替える仕組みということでソートのスクリプトについてです。個別にソートのスクリプトを作りまくる方法、その2はスクリプト一個(か2個)のみで済む代わりにフィールドを2個追加する二つの方法を記しました。個別にソートスクリプトを作りまくる方法その1は、汎用的なソートスクリプトを一個作り、さらに個別ソートのスクリプトを作りまくる方法です。以前この方法を好んで使っていましたが今は使わなくなりました。動作の流れ流れというか仕組みというか、必要な手続きは以下です。汎用的なソートスクリプトを一個作成します。個別に、ソートのスクリプトを昇順降順セットでガシガシ作成します。個別ソートのスクリプトの命名にルールを設け、汎用スクリプトが判断する仕組みです。レイアウト上でボタンを作って割り当てます。ボタンにスクリプト引数を与えます。個別のソートスクリプト個別にソートスクリプトを昇順降順2個セットで作ります。中身はコピペの書き換えで良いのですが、スクリプトの名前にルールがあります。ルールそのものが重要ってわけではなく、ルールに厳格なことが重要ってだけです。個別ソートスクリプトの命名のルール個別にせこせこと作るソートスクリプトです。スクリプト名の付け方に決まりを設けます。ラベル+セパレータ+ソート順ここではこうします。ラベルソートスクリプトを作るときに付けたくなる普通の名前です。これが「ラベル」部分です。ラベルにルールはありません。次の「セパレータ」を含むことだけは避けます。セパレータセパレータなしでもいいんですがここではセパレータがあるということで話を進めます。ラベルに含まれる可能性がある文字は避けます。何にせよ、セパレータを決めてそれを守り抜きます。個別ソートスクリプトは二個セットで作ります。昇順と降順の二つです。命名の最後はソート順がどっちなのかを示す言葉をくっつけます。昇順、降順でもいいしASC、DESCでも↑↓でもいいでしょう。それを決めて、必ず付けます。スクリプト作りまくりで鬱陶しいですが一個作ればコピペ改編で済むのでさほどの手間ではないです。わけで個別スクリプトの命名ルールでした。ボタンにスクリプト引数レイアウト上でボタンにソートスクリプトを割り当てるとき、スクリプト引数をセットします。そこには「ラベル」を書書きます。上図のIDなら「ID」、ファイル名なら「ファイル名」です。スクリプト名の、セパレータより前の部分をセットします。スクリプト引数に「ラベル」を書く個別ソートスクリプト作成のルールスクリプトの中身はスクリプトステップが2行。1行目はスクリプト名に相応しいソートを「レコードのソート」スクリプトステップのダイアログで作って保存します。2行目はグローバル変数をセットします。ここでは「$$sort」という名前にしておきましょう。値をセットしますが、書き方にまたしてもルールがあります。ルールというか、これは決め打ちなので個別に改編もせずこのまま全部同じです。ソートしたらスクリプト名がそのまま入るだけです。そのままグローバル変数になって、現在のソート状況が保存されるという案配です。「ファイル名-ASC」という名前のスクリプトを実行させると、ファイル名で昇順ソートして、グローバル変数$$sortに「ファイル名-ASC」と記録します。これが個別ソートスクリプトの全貌です。利用して2個セットのスクリプトを1個にすることができました。こんな記事を鵜呑みにせず、各々、知恵と工夫で良い正解を見つけてくださいませ。ソートボタンスクリプトさて肝心のソートスクリプト行きます。ソートボタンスクリプトはすべてのソートボタンにセットする汎用的なソートスクリプトです。このスクリプトに書くステップを順に書きます。]命名ルールで定めたセパレータを変数に保存しました。]次にスクリプト引数を取得しました。ルール上、それは必ずラベルになっているはずですね。値の中に、ラベルがあるかどうかを調べて処理を分けます。自分と同じラベルが含まれていれば、次はソート順を見ます。逆であるASCスクリプトを発動させます。if個別ソートのスクリプトを名前で実行することで、全てのソートボタン対応の汎用性を手に入れています。自分と同じラベルがないときは未ソートであるからして、ASCかDESCのどちらか好きなほうをデフォルトとして発動させます。いうことで汎用ソートスクリプトは以上です。一応まとめときますか。ifたったこれだけのシンプルな話でした。レイアウトでボタンを使うソートボタンスクリプトは書いた。個別ソートのスクリプトも作った。あとはレイアウトで実装するだけ。ボタンにソートボタンスクリプトの実行をセットして引数を書きます。リスト的な表示(リストやポータル)のヘッダにタイトルのラベルを置きたくなります。このラベルをボタンにするんです。ボタンバーボタンバーを使うと計算でボタンラベルを変更できるから昇順降順を示せます($$sortに応じてテキストを変える)図は↑ですが下の説明では▲になってますね。すいません💦ボタンラベルの計算式はこんな感じです。表示上の項目名とラベル(スクリプト名のラベル)を分けたいときは、表示用ラベルを追加しておくとより良いですね。その場合こうなりますか。ラベルと表示ラベルだけ、ボタンごとに書き換えます。専用フィールドを作成する方法その2のやり方は、個別ソートのスクリプトを作りまくったりしません。スクリプトは1個または2個で済みます。こっちのやりかたはファイルメーカーのヘルプにも載っているやり方で、専用フィールドを作成して利用する方法です。個別ソートのスクリプトを作らなくても良い代わりに、ソート専用のフィールドを作っておく必要があります。ヘルプに載ってるまともで簡素なやり方ですが、そのままではちょっと実用に耐えないので、少し工夫が必要な部分もあります。材料グローバルフィールドを一つ、計算フィールドを一つ追加します。例としてグローバルフィールドを「GLBfieldName」、計算フィールドを「sortContent」と名付けてみます。あとはソートのスクリプトが一つあれば良いです。実際の運用では、このソートスクリプトを発動させるための「ソートボタンのスクリプト」をもう一つ追加すれば良いでしょう。ソートする「フィールド名」を記入する入れ物です。ここにフィールド名を入れることで「おいお前、このフィールド名の内容でソートするんだぞ」と命じることになります。「あいよ、おまいさん。こうかい?」と、グローバルフィールドで指定したフィールド名の「フィールド内容」をそっくりそのまま転記してクローンと化します。グローバルフィールドに「氏名フィールド」と書いたら、計算フィールドは実際の「氏名フィールド」の内容をレコード分転記して「氏名フォールド」と同じになります。ソートするように仕込みます。個別にソートスクリプトなど作る必要ありません。sortContentのソート指定一個ですみます。中身がその都度変わるのだという仕組みです。この簡単な1行でフィールド内容は転記されますが、このままではソートに問題があって駄目ですので改良します。いう問題か、どういう改良か、それは以下です。結果のタイプ計算式では、計算結果のタイプを「テキスト」や「数字」など事前に指定しなければなりません。実際にソートしたいフィールドの内容はテキストだったり数字だったりします。計算フィールドの計算式の結果を「テキスト」にすると、数字のソートが上手くいきません。「数字」にすると、当然ながらテキストが返りません。FieldType取りあえず計算結果は「テキスト」にしておきます。その上で、ソートフィールドが数字や日付の場合に備えましょう。備えるのは良いのですが、その前にソートする指定フィールドのタイプをまず調査しなければなりません。