2016年3月31日木曜日

売上集計(ExecuteSQL)・その4

ExecuteSQLで売上集計は、たぶんこれで最後です。
はじめに少しだけ、FileMakerとデータベースの関係について……

FileMakerはデータベースを使って何かを実現したい場合、とても便利なソフトです。

ふつう、データベース自体を作るにしても、データベースを利用するもの(アプリケーション)を作るにしても、専門的な知識がいります。
また、データベースとアプリケーションは別々に作らないといけないことが多く、とても時間がかかります。

FileMakerを使えば、データベースを直感的な操作で作ることができます。
まず、データベース自体を作るのが、FileMakerを使わない場合に比べて簡単だと思います。

また、FileMakerはデータベースだけでなく、データベースを利用する部分(使う人が直接触る部分)も、簡単に作ることができます。
たとえば請求書を発行するシステムを作ろうとすると、ふつうは請求データを管理するデータベースを作って、それとは別に、入力フォームや請求書のフォーマットなどを作る必要があります。
FileMakerなら全部まとめて、しかも短期間でできます。

データベースは勉強すると結構難しいし、入力フォームを作ったりするのにも、データベースとはまた別の知識が必要になり、すごく大変です。
このように本来は敷居の高いはずの何かが、手軽に作れてしまう。
ここに、FileMakerの凄さがあると思います。


本題に戻ります。
前回までの流れは、実は、集計をちょっとずつ動的にしていくという試みになっています。
最初はただどこそこにあるデータを集計するだけでした。
その後、期間を選べるようにしたことで、使う人の自由度を少しだけ高くしました。

仕事の内容は動的に変化しますから、仕事で使うシステムも、それに応じることができる柔軟性を備えているべきだと思います。

というわけで、今回は、さらに自由度を高くしてみたいと思います。
集計する商品を選べるようにしたサンプルファイルがありますので、参考にしてください。

デモ用ファイル

FileMaker Pro 14が使える環境で、mainとdataを同じフォルダに置いて、mainのほうを開いてください。

商品指定で、集計したい商品を選ぶことができます。



商品を3つだけ選んで、集計ボタンを押すと……



こんなふうに、全商品ではなく、選んだ商品だけの集計結果が出てきます。

現実的には、集計したい商品は、常に固定というわけではないはずです。
ケーキどうしの売上を比べたいときもあれば、カテゴリの違う主力商品どうしを比べたいときもあると思います。
それなら、集計したり分析したりする人が、自由に集計パターンを変えられるようにしなければ、使えないですよね。


実はこの集計用ファイルは、最初にFileMakerとデータベースについて言ったことと関係しています。
「集計したい商品を選ぶ」という部分(使う人に見える部分)と、「売上データを検索・抽出して集計する」という部分(見えない部分)。
これらをまとめて作ってしまえるので、FileMakerは便利ですね、と言いたかったのでした。

2016年3月5日土曜日

売上集計(ExecuteSQL)・その3

商品ごとで売上個数を計算しました、の続きをやります。
使用するファイルは、同じです。

デモ用ファイル

レイアウトは、Demo3です。
Demo2と何が違うかというと、期間指定ができるようになったことです。

前回は、売上データがたくさんあって、そこから、商品ごとに個数と金額を合計しました。
ですが、売上げた日付というのは、考慮されていませんでした。
とりあえず、今までの売上全部を対象にして、商品ごとに集計しよ、というものでした。

正直、実際には、このように、過去の売上全てを集計対象にするということは、あまりないんじゃないかと思います。
そこからわかることは、あぁ、これまでこんなに売ったのか。がんばったな。
という程度のものでしょう。
それよりも、1週間だけの売上とか、1日だけとか。
そのほうが、実用的だし、この日とこの日の比較をしたい、という場合など、比較対象としても優秀ですよね。
統計分析の基本は、適切な比較対象、らしいです。
今やってることは、統計と言えるほど、大それたものではないですが・・・


では、どうやってこの「期間指定の集計」をしているのでしょうか。
その前に、SQLのWHERE句というものについて、やっておきます。

下のような、売上データがあったとします。数字は個数とします。

-------------------------------
苺のショートケーキ 2 2016-02-17
苺のショートケーキ 2 2016-02-17
苺のショートケーキ 3 2016-02-18
苺のショートケーキ 1 2016-02-19
苺のショートケーキ 2 2016-02-19
-------------------------------

このテーブルから、2016-02-18のものだけを取って来たいと思ったとします。
その場合、SQLはこうなります。

SELECT 商品名, 数量, 日付 FROM 売上明細
WHERE 日付 = "2016-02-18"

翻訳すると。
売上明細テーブルから、商品名と数量と日付のレコード(行)を持ってきて~
でも全部はいらなくて、日付が2016-02-18のやつだけね。
という意味です。


このWHERE句というやつを、ExecuteSQL関数のSQLを書く部分で、使っています。

ExecuteSQL (
 "SELECT 商品ID, 商品名, 商品分類ID, 商品分類名, SUM(数量), SUM(金額)
  FROM 売上明細
  WHERE 日付 BETWEEN ? AND ?
  GROUP BY 商品ID, 商品名, 商品分類ID, 商品分類名"
 ; ", " ; "" ; Demo3::g_開始日付; Demo3::g_終了日付
)

WHEREの後で、「日付が、ある日付からある日付の間にある場合」、という条件を指定しています。
WHEREには、このように、~と等しい(=)という単純な条件だけではなく、二つの数値の間にある(BETWEEN)とか、商品名がチーズケーキまたはモンブランである(OR)とか、さまざまなタイプの条件を指定できます。
そうして、その条件に合致するレコードだけを絞り込んで取ってくるのがWHEREです。
SELECTでデータの抽出をするときは、全部欲しい場合というのは、あまりないでしょう。
ですので、SELECTとWHEREは大体、お友達です。

ところで、WHEREの条件に ? というのがありますね。
これは何なのかというと、? にはExecuteSQLの最後に指定した値が入ります。

たとえば、

ExecuteSQL (
 "SELECT 商品ID, 商品名, 商品分類ID, 商品分類名, SUM(数量), SUM(金額)
  FROM 売上明細
  WHERE 日付 BETWEEN ? AND ?
  GROUP BY 商品ID, 商品名, 商品分類ID, 商品分類名"
 ; ", " ; "" ; "2016-02-16"; "2016-02-17"
)

とすれば、2016-02-16と2016-02-17の売上だけを対象とします。
ただここには操作する人が決めた日付を入れたいので、FileMakerのフィールドの値が入るようになっています。
期間指定のボタンを押すと出てくる、「開始日付」と「終了日付」というフィールドがそれです。
こうすることで、日付を変えれば集計結果も変わる、ということができます。
ExequteSQL関数のこの ? の機能は、いろいろできるので面白いですよ。


次は、集計したい商品をリストから1つ、または複数選ぶ → 選らんだ商品だけ集計する
をやりたいと思います。
FileMakerのリレーションとExecuteSQL関数、両方を組み合わせて使います。