今年、実際に使って便利だったカスタム関数を実例元にご紹介できればと思い、参加しました。
紹介するカスタム関数は今年作られたものでもなく、以前からあるものなんですが...
何卒お手柔らかにお願いします。
###やりたいこと
ある期間の受注データを検索し、以下のような分析結果を出したい。
- 受注の全件数
- 明細の商品点数
- 平均購入点数と最大購入点数
- 購入点数分布 件数と比率
- 平均購入額と最高購入額
- 購入金額分布 件数と比率
今までは検索した受注データをExcel出力し、Excelでフィルターやらピボットやらで、上記のような内容をせっせと毎回分析しておったようでした。
そりゃめんどいわな、さくっと分析したいわなー、と。
じゃあVBAでやりゃーいいじゃん 1というご意見もあるかと思いますが、今回は頑なにFileMakerで。
###やったこと
分析したい受注データを絞り込んだ状態からスタートです。
- 現在絞り込んでいる受注データの注文番号を改行区切りテキストで取得。
- 分析に必要な値を改行区切りテキストで取得。GetNthRecordSet関数
- 取得した値を改行以外の記号 |区切り で連結。ConcateList関数
- 具材は揃った、さあ分析だ。GetKeyLine関数をさらにカスタムしました。
それがこちら↓
GetKeyNumLine ( Data; Key; KeyNum; Cnt; Value )
引数:
Data:改行区切りデータ
Key:キーワード文字
KeyNum:「|」で区切った項目左から何番目か
Cnt:1または""。どちらでも動作する
Data:""
Let ( [
Cnt = If ( Cnt="";1; Cnt );
Data = If ( Right ( Data; 1 ) ≠ "¶"; Data & "¶"; Data );
Max = PatternCount ( Data ; "¶");
Line = MiddleValues ( Data ; Cnt ; 1 )
];
If (
Cnt > Max;
Value;
GetKeyNumLine ( Data; Key; KeyNum; Cnt+1; Value &
If ( PatternCount( GetValue(Substitute(Line;"|";"¶");KeyNum);Key ) = 0;
"";
Line )
)
)
)
GetKeyLine関数は、先頭列の値に指定した引数の値があれば抜き出す、という関数です。
$hogelist
という変数に下記のような値が入っていたとします。
111|aaa|hoge
222|bbb|hooge
333|aaa|hoge
222|ddd|hoge
GetKeyLine( $hogelist: "2"; 1; "" )
の実行結果は以下のようになります。
222|bbb|hooge
222|ddd|hoge
GetKeyNumLine関数は、n番目の列 引数を追加して、先頭以外の|で区切った列の値も使えるように拡張しました。
ちなみにこれらの関数で抜き出される値は前方一致で判断され、数値で「1」で抜き出そうとすると、「10」の位の値まで引き連れてくるのでご注意を。
###問題点
ご覧の通り、再帰しまくりのカスタム関数を使いまくっております。前日の記事にもあるとおり、再帰処理には上限回数があります。
しかも、分析対象のレコード件数が多くなればなるほど、処理が返ってこなくなり、最終的にFileMakerが固まってしまいます。
再帰の上限回数ギリギリで、カスタム関数の呼び出しをLoopで実行などして、現状は凌いでいます。
分析する対象範囲がそこまで膨大ではないため、今のところはこれで必要十分かなとしてます。(言い訳?)
###おまけ
今回使用したカスタム関数を紹介しているサイト
http://www.fmpro.jp/fmi/xsl/plugin/cf_index.xsl
大体そろってるので、ここからさらにカスタム関数をカスタムしたり、
今は標準機能で賄えるものもあったりしますね。
http://www.briandunning.com/filemaker-custom-functions/
英語サイトでいろんな方がいろんな書き方であげてらっしゃるので、
キーワード検索で絞り込んだりして目当てのものを探してます。
カスタム関数Loverとか言っときながら、実はあまりカスタム関数を一から自作したことはありません。
こんなのカスタム関数でできそうだなぁって思った時は、まず探してみる。そして大概見つかります。みんな考えること同じなのねと。
どこかの誰かも同じものを作ってて、親切にもネットにあげてくれてるもんなら、遠慮なく使わせていただこうと。
###もひとつおまけ
SetVariable関数 を最近多用しています。なんでもっと早く知らなかったのか!と過去の己に申したいぐらい。まだ構想段階ですが諦めていたあんなこともこんなこともできそうだなーと。また機会があれば、実用例として記事2にできたらいいなぁと。
今回初めてこういった記事を書きました。やり方に関しては、別のいい方法もあるようにも思いますし、何が最善かは環境やその時々に応じて変わりゆくものですし、そういった変化に柔軟に対応しやすいのはFileMakerの強みかなーと思ったりします。