FileMaker ソートボタン

FileMakerでファイルを作るときに使い回す定番の小ネタ・小技があります。今回はリストタイトル仕立てのソートボタンスクリプト。

FileMakerはときどき「えっ。なんでこれができないの?」っていう機能の欠落(と感じること)があります。ソートの関数が用意されていないこともその一つ。

記述でソートを制御することができません。ソート[ mainTable::ID ] みたいに書けませんし、ソート項目を変数で切り替えるスクリプトも作れません。ソートはすべてソートダイアログで個別具体的に指示し保存するしかありません。これが不自由でみんな困ってます。多分困ってますよね?困ってませんか?そうですか。

リストのラベルをクリックしたらソートされるスクリプト

愚痴は置いといて、今回何がしたいかというとリストのタイトル部分をクリックしたらソートされるようにしたいだけです。Finderでもメールソフトでも、大概のリスト表示があるプログラムでよく見かけます。

わざわざムービーにする必要もないけど。クリックでソートするだけでなくトグルで昇順降順が入れ替わります。

このボタンスクリプト自体は汎用的に作れますが、肝心のソート部分はすべてせこせことソートダイアログで作って保存していく必要があります。だから半汎用的です。

動作の流れ

流れというか仕組みというか、必要な手続きは以下です。

  • ソートのスクリプトを個別に必要なだけ作成します。
  • 汎用的なソートスクリプトを作成します。
  • レイアウト上でボタンを作って割り当てます。

★ 個別ソートスクリプトの名前の付け方にルールがあります。

★ 個別ソートスクリプトの作り方にもルールがあります。

★ボタンにルールに則ったスクリプト引数をセットします。

ルール

この仕組みはルールに厳格なので、スクリプト内のコメントにルールを明記しておくことをオススメします。後で確実にルールを忘れてわけわからなくなります。

ルールそのものが重要ってわけではなく、ルールに厳格なことが重要ってだけです。ですので決まり事は自分で好きなように作って良いわけですがそれだと記事にならないので「わたしはこうしたよ」というレベルにてお話を続けます。

個別ソートスクリプトの命名のルール

個別にせこせこと作るソートスクリプトです。スクリプト名の付け方に決まりを設けます。

ラベル+セパレータ+ソート順

ここではこうです。

ラベル

ソートスクリプトを作るときに付けたくなる普通の名前です。これが「ラベル」部分です。ラベルにルールはありません。ただし、次の「セパレータ」を含むことだけは避けます。

セパレータ

セパレータなしでもいいんですがここではセパレータがあるということで話を進めます。セパレータは「 – 」「 : 」「 _ 」「 | 」などです。ラベルに含まれる可能性がある文字は避けます。何にせよ、セパレータを決めてそれを守り抜きます。

ソート順

個別ソートスクリプトは必ず二個セットで作ります。昇順と降順の二つです。命名の最後はソート順がどっちなのかを示す言葉をくっつけます。昇順、降順でもいいしASC、DESCでも↑↓でもいいでしょう。それを決めて、必ず付けます。

てなわけで個別スクリプトの命名ルールでした。例えば こんな感じです。

スクリプト名

複合的なソートを作ったときに「一概に昇順か降順かなんて言えねえよ」という場合もありましょう。複雑なソートが必要な場面では相応の専用スクリプトを作りましょう。

スクリプト引数

ボタンにソートスクリプトを割り当てるとき、スクリプト引数をセットします。そこには「ラベル」を書くのです。IDなら「ID」です。スクリプト名の「ID-ASC」ではありません。セパレータより前の部分です。

ボタン設定 スクリプト引数

個別ソートスクリプト作成のルール

個別のソートスクリプトの内容についてです。これにもルールがあります。

命名でも書いた通り必ず二個セットで作ります。同じソートの昇順と降順を作ります。

個別ソートのスクリプトの中身はスクリプトステップが2行。

1行目はスクリプト名に相応しいソートを「レコードのソート」ステップのダイアログで作って保存します。

2行目はグローバル変数をセットします。ここでは「$$sort」という名前にしておきましょう。$$sort に値をセットしますが、書き方にまたしても厳格なルールがあります。

変数を設定 [ $$sort = Get ( スクリプト名 ) ]

こうです。これ以外不可。コピペ推奨。

個別ソートスクリプト

「ファイル名-ASC」という名前のスクリプトを実行させると、ファイル名で昇順ソートして、グローバル変数$$sortに「ファイル名-ASC」と記録します。これが個別ソートスクリプトの全貌です。

実際に作成していくには、スクリプトを複製して名前とソート設定だけ変えてやるというルーティンになりますね。

ソートボタンスクリプト

さて肝心のやつ行きます。ソートボタンスクリプトはすべてのソートボタンにセットする汎用的なソートスクリプトです。このスクリプトに書くステップを順に書きます。

まず変数を設定します。

変数を設定 [ $sep ; 値: "-" ]

命名ルールで定めたセパレータを変数に保存しました。

変数を設定 [ $label ; Get(スクリプト引数) ]

次にスクリプト引数を取得しました。ルール上、それは必ずラベルになっているはずですね。

次は条件分岐です。グローバル変数 $$sort の値の中に、ラベルがあるかどうかを調べて処理を分けます。

if ( PatternCount ( $$sort ; $label ) )
  #あるとき〜
else
  #ないとき〜
end if

「あるとき〜」はもちろんなるみちゃん風に読みます。ところで関西人には吉本のネタは染みついていて人間形成の重要事項ですが、ここ10年ほどで大阪は地獄の使者竹中平蔵とその傀儡の維新に完全に掌握され吉本は太鼓持ちの御用広報に堕落しました。おかげで吉本芸人が虫唾が走るほど嫌いになり、染みついた人間形成も全否定したくなるほどで、この悲しみと恨みは並みじゃないです。

関係ない話はさておき、$$sort に自分と同じラベルが含まれていれば、次はソート順を見ます。

あるとき〜

$$sortには必ず ASC か DESC が入っているので、ASCなら逆であるDESCスクリプトを、DESC なら逆であるASCスクリプトを発動させます。

if [ patternCount ( $$sort ; "ASC" ) ]
   スクリプト実行 [名前で ; $label & $sep & "DESC" ]
else
   スクリプト実行 [名前で ; $label & $sep & "ASC" ]
end if

個別ソートのスクリプトを名前で実行することで、全てのソートボタン対応の汎用性を手に入れています。

ないとき〜

$$sort に自分と同じラベルがないときは未ソートであるからして、ASCかDESCのどちらか好きなほうをデフォルトとして発動させます。

ということで汎用ソートスクリプトは以上です。一応まとめときますか。

if ( PatternCount ( $$sort ; $label ) )
   #あるとき〜
   if [ patternCount ( $$sort ; "ASC" ) ]
      スクリプト実行 [名前で ; $label & $sep & "DESC" ]
   else
      スクリプト実行 [名前で ; $label & $sep & "ASC" ]
   end if 
else
   #ないとき〜
   スクリプト実行 [名前で ; $label & $sep & "ASC" ]
end if

たったこれだけのシンプルな話でした。

レイアウトでボタンを使う

ソートボタンスクリプトは書いた。はい。個別ソートのスクリプトも作った。はい。あとはレイアウトで実装するだけ。ボタンにソートボタンスクリプトの実行をセットして引数を書きます。

リスト的な表示(リストやポータル)のヘッダにタイトルのラベルを置きたくなります。このラベルをボタンにするんです。

ボタンバーにすると計算でボタンラベルを変更できるから昇順降順を示せます($$sortに応じてテキストを変える)

普通のボタンでラベルを変えようと思ったらテキストを別途用意して「隠す」を駆使して切り替えます。やや手間。あと条件付き書式を使って$$sortを元にいろいろ仕込んでアクティブなソートを表現できます。

なにしろグローバル変数 $$sort がありますから、ラベルの表示やオブジェクトを隠す際に盛大に利用しましょう。

Penguin icon はい。ということで、よく使う半汎用的ソートボタンのスクリプトでした。

(この投稿はFileMakerメディア管理 実作編 Ver.0 基本に関連しています)