FileMakerが苦手な"集計"で販売実績などをサクッと見たい時

何にも考えずAdventCalenderの意味も知らずに登録してしまいました。でもこれはいい機会なので日頃活用しているTipsを投稿したいと思います。


#集計結果表示用のレイアウト作るの面倒なのでカスタムダイアログをフル活用
以下は開発時間短縮と集計時間短縮を突き詰めるとこうなった的な方法論で、トリッキーな裏技や高度な内容ではありません。簡単なSQL文をそのまま記述していますが、FileMaker関係者はSQL文に不慣れな方が多いので（私もそうです）、あえて基本的なSQL文をベタで記載しています。

##どういった人向けの内容か
Qiitaを見てるFileMaker使いの方には今更かもしれません。ただ、FileMakerを古くから使っている人と時々話すと、ここ数年で一番エポックメイキングだと思っているExecuteSQL関数を利用していない（あるいは知らない）人が多い気がします。FileMaker自体をヴァージョンアップしてなかったら当然ですが。
ここではExecuteSQL関数を利用して極力工数を減らしてシンプルに速く目的のデータに到達するTipsを書いています。なので、他のデータベース系の経験はなく、FileMakerの基本機能だけで使っている方向けの内容です。それとFileMakerGoでの表示を前提とした話です。


###今日の販売実績とかをiPhoneでサクッと表示させたい。
販売関係の仕事に携わっている人は、今日、今の時点のライブな販売データを見たいですよね。自分は営業マネージャー兼販売システム構築者（メインの仕事は営業で開発はボランティアに近い）なので、リアルタイムな情報をササっと見たいのです。現場は株価ボードのようにダイナミックに動いている数字に一番関心があるものです。その数字だけパッと手元のiPhoneで確認できると本当に便利。FileMakerGoのおかげで特別な仕様変更なくiPhone上でデータを扱えるFileMakerはその点モバイルには最適。

###集計結果を見るのに表示用のレイアウト必要ですか？
開発時間短縮もスピードのうちと考えると、美しいレイアウトは不要だと考えます。しかもiPhoneの小さい画面用のレイアウト作成は、デスクトップ版より時間がかかります。引き算のデザインは難しいので。数字さえわかればいいので1秒でも速ければ速いほどいい。しかも回線は高速なWiFiではなく、ほとんど4GLTEのモバイル回線という条件。

#ExecuteSQL＋仮想リストのコンビよりExecuteSQL＋カスタムダイアログ
仮想リスト（バーチャルリスト）用の汎用レイアウトだけ作って、サーバー上でExecuteSQLで取ってきたデータをそこに放り込み、それをポータル表示でも十分速い。しかもライブ感もある。それはそれで非常に重宝していますが、自分は更に簡潔に最小限の情報だけカスタムダイアログに直接表示させるという方法を多用しています。ゲットしたい内容は人により違い、またしょっちゅう変化するので、その度にTOの新規作成やレイアウト変更していたら大変。欲しい情報の選択はボタンに割り当てたスクリプト引数で切り替えるだけ。レイアウト作成とか変更って億劫で結局実行に移すのが後回しになり、利用者を待たせることになります。
カスタムダイアログへの集計値ダイレクト表示は、開発時間はほとんどかからないし、動作もレイアウト切り替えまたは関連レコードへ移動などのレイアウト推移がなく、グラフィック情報のない単なる文字情報のみなので非常に高速です。

で、二つほど実例を
###Pattern1)カスタムダイアログの中に直接ExecuteSQL文を記述
カスタムダイアログのメッセージ欄の計算式にExecuteSQL関数を直接記述します。

検索範囲が狭く件数が少なければクライアントからホストされているスクリプトを直接実行してもそこそこ速い。今日の売上「店名|金額」の改行区切りのデータを10件サクッと表示という具合に。
スクリプトは
- **[カスタムダイアログを表示]**の1行のみ。
カスタムダイアログのメッセージ欄に例えば次のようなSQL文を直接記述すると

>ExecuteSQL(
"SELECT \"店名\" , \"納品合計金額\"
FROM \"伝票\"
WHERE \"日付\"=? AND \"都市\"=?
FETCH FIRST 10 ROWS ONLY"
;"   ¥"
;""
;Get(日付)
;Get(スクリプト引数)  \\\ある都市の店名リストが欲しかったとして、引数に○○市を指定
)

区切り文字を" (スペース)￥"としているので、

店名　¥10000
店名　¥20000
店名　¥10000
・・・・・・
・・・・・・
店名　¥20000

といった具合に必要最低限の情報が待ち時間なく表示できます。人間がパッと見で確認できるのはせいぜい10件程度の情報なので、カスタムダイアログの小さな小窓で十分。FileMakerGoのカスタムダイアログはデスクトップ版と違い、常にど真ん中にくっきり表示してくれますので。おそらくiPhoneXだと更に綺麗でしょう。縦長ですし。


カスタムダイアログの中への計算値入力はよくあることですが、実はこれSQLデータビューワーとして使えます。ExecuteSQL関数のSQL文記述エラーはFileMakerのAdvanced版でも判定してくれず、構文エラーの場合は?が返ってくるのみ。なのでPro版しか持ってなくてもExecuteSQL関数に関してはこのスクリプト一行でデータビューワー化できます。意外と便利です。

更にこれは良いことではありませんが、SQL文をその場でサクッと書けるようにあえて正規化を崩して同じフィールドデータを複数のテーブルで持たせるケースもあります。JOINとかしなくてもFROMのテーブル名一つだけで済みますし。データ構造自体に影響がなければ正規化に拘る必要はないかと。これも開発時間短縮のためです。


---

###Pattern2)サーバー上で集計させてその結果のみカスタムダイアログで表示
月間データなど数量の多い集計は場合によっては結構な時間を要するので、
例えば今月の合計売上金額とある都市の今日の実績リストという二つの集計値が必要なら、
クライアントのスクリプトは二行のみ
- **サーバー上のスクリプト実行[「当月合計と今日の一覧」; 引数:Get(スクリプト引数)]**
- **カスタムダイアログを表示[メッセージ:Get(スクリプトの結果)]**



でそのサーバーが実行するスクリプト「当月合計と今日の一覧」の中身は
 - **現在のスクリプト終了[結果：ここにExecuteSQLを直接記述]**の一行のみ。

例えば
>"合計　¥" ＆ NumToJText (
ExecuteSQL(
"SELECT SUM(\"納品合計金額\")
FROM \"伝票\"
WHERE \"年月\" =?"
;""
;""
;Get(スクリプト引数)  \\\201712など年月を渡す
)
;1;0)
&¶&¶
以下Pattern1の同一内容を記述

一例ですが、上記のような記述で

合計　￥10,000,000  \\\当月合計売上金額

店名　¥10000
店名　¥20000
店名　¥10000
・・・・・・
・・・・・・
店名　¥20000

といった具合に当月の全売上金額とその下に今日の特定都市の10店舗みたいな表示が瞬時に得られます。

##欲しいのは今動いているライブなデータ、そして速く。


FileMaker標準機能のレポートレイアウトでクライアント側からホストされているファイルに対して直接こういった集計処理をスクリプトで行うと、相当待たされます。あれはWAN上のサーバーークライアント関係では使い物になりません。もちろん途中で計算の連鎖を切って確定値を持たせた中間ファイルや確定値フィールドを利用するのもありですが、それではライブ感がありませんし、いつどこで計算の連鎖を断ち切るかとか決めなければならない事案が多くて開発のスピードも落ちます。
"FileMaker"・ "集計"・ "スピード"とかで情報を探しても、上記のような「中間ファイル」「仮想リスト」といった案しか見つかりません。つまりそのためにわざわざ別テーブルと新しいリレーションを作成する、もしくは集計用のレイアウト・フィールドを作成し、その中にデータを放り込むといった"わざわざ"感が拭えない。また、重い処理はサーバーで夜間に集計させて翌日それを表示させるっていう方法が堂々と正論として語られますが、今のこの時代でそれはない。欲しいのは昨日までのデータではなく、今現在も含めたデータのはず。プログラミングをしない普通の人はそう思うはずです。
それらの方法は確かに現時点でのベストプラクティスかもしれませんが、もっと気軽に、簡単に導入できる表現方法はないものかと、、、。で、気がついたらこのものぐさな手法を多用するようになっていました。
確定前の数字でいいので、今いくら売れたか現場から刻一刻と上がってくるデータのライブな速報値を、ワンタップでポップアップ表示させる手段として、カスタムダイアログに表示させるのが速度的には一番速い。
ExecuteSQLでリレーション不要、カスタムダイアログなのでレイアウト不要・集計用のフィールドも不要。当然レイアウトに依存しないのでどこからでも実行できますし。


##見た目なんの味気もないですが、、、
現場で動いている営業マンにとって本当に必要なのはレイアウトの美しさや華麗なUIではなく、ボタン一つ押せば一瞬で欲しい数字が取れる事です。しかも客や上司の目の前で片手でさりげなく行いたい。スクロールするのさえまどろっこしいものです。自分は信号待ちの時とかにササッと確認することが多いです。売上が好調な時は意味もなく何度も見てニヤニヤできますし(笑)。
何をもって必要最小限のデータとするかは各人それぞれ違いますが、現場に近い人間ならリクエストを吸い上げる（ここが肝）のも容易。それをカスタムダイアログの中でうまく表示させれば、開発者にとってもレイアウトを作成する手間がかからず一石二鳥だと思います。