Fast Summary

前回の「Fast Summary再考」では、肝心のFast Summaryの解説が過去記事への参照だけで省略されていました。今回はその参照先の6年前の記事をご紹介します。この記事が書かれた後にExecuteSQL関数が導入されたため、この手法の適用範囲は減ってしまったかもしれませんが、その考え方は今でも非常に参考になります。(リンク先のデモファイルはfp7形式のため、最新版のFileMakerで使用するには変換が必要ですので、ご注意ください。)


FileMaker Hacks logo

Fast Summaries

(元記事はこちら)

Kevin Frank
2011/6/23

集計レポートから取り出した値を、スクリプトや計算で使用したいと考えたことはありませんか? FileMaker 6の時代にMikhail Edoshin(訳注: 2017年3月現在、リンク先のページは存在しません)がまさにそのための手法を公開しました。

彼がFast Summaryと名付けたその手法を、私は自分のソリューションで広範囲に使うようになりました。その後、私はデモファイルkf-fast-summaryを作成し、FileMakerの新機能(訳注: FM8で導入された「変数を設定」)を利用してこの手法の適用例を示しました。私はこのFast Summaryという手法はもっと注目されるべきだと思っています。次回の記事では、複雑な手順の中でこの手法を一つの部品として利用する予定なので、今回は古いデモファイルを引っ張り出してきて、そこで使われているこの手法を詳しく見ていきます。

デモの中身は、ただ一つ単純なテーブルだけで、寄付者と金額が入っています。

ここから下の結果を出力するにはどうすればいいでしょうか?

基本的な考え方は、対象レコードをループして、レコードごとにGetSummary関数で集計値(今回の例では、寄付の回数と金額)を取得します。これをすべてのレコードについておこなう必要はなく、ユニークな寄付者の最初のレコードだけを対象にします。対象レコードの中を飛び飛びに移動できることが、この手法が高速であることの理由の一つです。

では、各寄付者の最初のレコードをどうやって特定できるのでしょうか?

対象レコードの1レコード目から始まることが保証されているのであれば、質問を「次の移動先のレコードをどう特定すればいいか」と言い変えることができます。

次にどこに飛ぶかを特定することは、以下の仮定の下では比較的簡単です。a)対象レコードが寄付者でソートされている、b)「現在のレコード」は寄付者の最初のレコードである。この2つの仮定が正しいのであれば、ただ現在のレコード番号を現在の寄付者の寄付の回数に足せばいいことになります。例えば現在のレコードが1件目で、その寄付者の寄付回数が6であれば、次の飛び先は7件目のレコードです。

現在の寄付者のレコード数はどう求めればいいでしょうか? そのためにはまず次のようにレコード件数を取得するための集計フィールドを定義します。

(カウント対象のフィールドは必ず値が入っている必要があります。主キーにしておけば安全でしょう。 あるいは計算フィールドで定数を設定するという手もあります。)

カウントの集計フィールドを作成したら、下の最初の「変数を設定」スクリプトステップにあるように、GetSummary関数で現在のグループのレコード数を取得します。(下はスクリプト“Process Records”の一部です。)

この手法が極めて高速に動作するもうひとつの理由は、変数を使用していることにあります。「フィールドを設定」スクリプトステップが1つしかなく、すべての集計値が変数$reportに集められた後で最後に実行されます。

この手法が高速である3つ目の理由は、スクリプトの最初にある「ウインドウを固定」スクリプトステップです。場合によっては、ループを実行する前に一時的に表示をフォーム形式に切り替えることでさらにパフォーマンスが大きく向上することがありますが、このデモではその効果はありませんでした。

この手法を一度マスターすれば、多くの応用先が見つかるでしょう。そのためにこのデモファイルをじっくり試してみることをお勧めします。その価値は十分にあります。

Leave a Reply