やっと本題の請求先と得意先のデータの取込>加工>書出しの部分です。
はじめは、月計売上と累計売上(1月度から12月度)を別けて、請求先と得意先のデータを同じファイルで読み込んで作っていました。
しかし、作りこんでいくうちにややこしい問題がでてきました。たとえばどれをキーにして、請求先、得意先それぞれの月計売上と累計売上を結合するかなどの仕組みがかなり煩雑になってきてしまいました。
しばらくお手上げ状態になっていたのですが、家の風呂に入ってるときにふと思いついたのが、「最終的に請求先と得意先のファイルを作るんやったら、初めから別々のファイルにすればうまくいくかも♪」というものでした。さっそく、月曜日出社と同時に、今までやっていたファイルを全部作り直しました。
しかし、問題はこれだけじゃありませんでした。サーバから取り込むときに、GROUP BYで請求先ごと、得意先ごとの商品の集計(同じ商品数、金額の合計)をしてから取込たかったのですが、以下のようなSQLを書いていました。ファイルの意図からすれば明らかに間違ったSQLなのですが、しばらく気が付ずに使っていました。これじゃ思うように、集計結果を出せないわけです。
★間違って使っていたSQL★
SELECT
"販売テーブル"."販売日付",
"販売テーブル"."販売NO",
"販売テーブル"."行NO",
"販売テーブル"."部門コード",
"販売テーブル"."担当者コード"
"販売テーブル"."商品コード",
"販売テーブル"."得意先コード",
"販売テーブル"."請求先コード",
"販売テーブル"."売上数量",
"販売テーブル"."税抜売上金額",
"販売テーブル"."原価単価"
FROM"販売テーブル"
WHERE
("販売テーブル"."伝票区分"='1')
AND("販売テーブル"."販売日付">='20051221'AND"販売テーブル"."販売日付"<='20061220')
GROUPBY
"販売テーブル"."販売NO"+"販売テーブル"."行NO",
"販売テーブル"."販売日付",
"販売テーブル"."販売NO",
"販売テーブル"."行NO",
"販売テーブル"."部門コード",
"販売テーブル"."担当者コード",
"販売テーブル"."商品コード",
"販売テーブル"."得意先コード",
"販売テーブル"."請求先コード",
"販売テーブル"."売上数量",
"販売テーブル"."税抜売上金額",
"販売テーブル"."原価単価"
間違ってるところ
1)販売NOと行NOの組で、グループ化をしてる。(意図を反映していない)
2)不要な項目まで含めている。(いつものです・・・)
3)集計をかけてない。(これが最悪です)
1)では、伝票ごとの集計になってしますね。これではなんのこっちゃらです。
2)SQLの基本ですが、「SELECT句の計算以外のフィールドをGROUP BYにも記述する」というのがあります。GROUP BYに記述されるとAND条件で扱われるようなので、1項目でも違うと別データとして扱われてしますので、意図のとおり集計されません。ですので、最小限の項目で読み込むのがベストです。その他の項目は、FileMaker側で後からリレーションでもって来るようにします。
3)については、もう馬鹿としか良いようがありません。SUMで集計かけもしないの集計できるわけないです。はい。
☆最終的に出来上がったSQL(得意先月計用)☆
(我ながら、こなれたSQLになりました♪)
SELECT
"販売テーブル"."商品コード"+"販売テーブル"."得意先コード",
"販売テーブル"."得意先コード",
"販売テーブル"."商品コード",
SUM("販売テーブル"."売上数量")"売上数量",
SUM("販売テーブル"."税抜売上金額")"売上金額",
SUM("販売テーブル"."原価単価")"原価合計"
FROM"販売テーブル"
WHERE
("販売テーブル"."伝票区分"='1')
AND("販売テーブル"."販売日付">='20050921'AND"販売テーブル"."販売日付"<='20051020')
GROUP BY
"販売テーブル"."商品コード"+"販売テーブル"."得意先コード",
"販売テーブル"."得意先コード",
"販売テーブル"."商品コード"
ORDER BY
"販売テーブル"."得意先コード"
上記と同様に、他のファイルも作り直し、
請求先累計.fp7(月計、累計込み)
得意先累計.fp7(月計、累計込み)
というファイルを作り、そこにデータを読み込むことで、比較的すっきりリレーション等も整理できました。
結局は最初の設計に問題があったということでした。気がつけばなんのことはないなということばかりでしたが、やってみないとわからないということで、遠回りも無駄じゃなかったんだと思います。