売上データの集計 (階層化された部門別) についてテーブル設計を考える

Claris FileMaker で販売管理など売上を管理するカスタム App を作成して、年月単位で各部署の売上を集計していくことは多くの企業で行われています。

販売管理系のカスタム App では、売上データには担当したスタッフの所属部署を登録しておき、その所属部署を単位として集計するケースが多いです。ところが企業の規模が大きくなると、組織は階層化していきます。単に所属部署の集計値ではなく、部署を統括する部門単位での集計値も必要になってきます。また、企業によってはプロジェクトごとに担当部署がまとめられ、通常の部門とは異なる単位での集計も必要になるケースもあります。

カスタム App で部署マスタテーブルを作成するとき、階層化された部署をどのように設計するかは悩まされるところです。企業によっては階層が部門によって深かったり浅かったりなどすることも多く、単に何階層分用意すれば良いというものでもありません。そこで部署マスタを自己リレーションで関連付け、階層化された組織に対応できるようにします。自己リレーションで関連付けることで実質何階層にも対応できるようになる方法を紹介します。

簡単な例としてテーブルは以下のように設定します。

■M部署マスタ
・部署コード
・部署名
・部署階層
・上位部署コード

データは以下のように登録していきます。

それぞれの部署が自身の上位部署を指定していくことで階層化された構造になります。

売上を計上するスタッフは以下のような構成にしておきます。
■Mスタッフマスタ
・スタッフコード
・スタッフ名
・所属部署コード

リレーションシップは以下のように設定します。これで「マスタM部署マスタ」TO からみて「マスタ_M部署マスタ上位」TO が上位の部署、「マスタM部署マスタ下位」TO が下位の部署になります。

売上対象のテーブルは仮に以下のようにします。
■J売上伝票
・売上No
・売上日
・顧客名
・スタッフコード
・計上部署コード
・内容
・売上額
・c売上年[ = year( 売上日) ]
・c売上月[ = month ( 売上日 ) ]

計上部署コードにはスタッフマスタから所属部署コードをルックアップするようにしておきます。以下のようにデータが登録されていくような感じです。

最下層の部署に所属するスタッフが売上を計上している感じです。

そして、本題である部門ごとの集計ですがレイアウトの基点となるTOを部署マスタにして集計値を計算するようにします。部署マスタに集計基準用の年月を指定するグローバルフィールドを追加します。

以下のようなリレーションシップを設定します。まず指定年月の部署ごとの売上額を算出するために、部署マスタに追加したグローバルフィールドのg集計年、g集計月と売上伝票の部署コードとc売上年、c売上月をリレーションします(TO名:集計_J売上伝票)。さらに下位階層の部署の売上額を集計するためのリレーションシップも追加します。部署マスタに設定している上位部署コードとのリレーションで設定されている下位階層の部署マスタの売上額(TO名:集計_M部署マスタ_下位)を集計します。

部署マスタに上記リレーションで設定したTOから売上を集計するための計算フィールドを追加します。以下の式で、指定した年月の部署の合計とさらに下位層の部署の売上の合計が計算されます。

「c売上計」[ Sum ( 集計J売上伝票::売上額 )) + Sum ( 集計_M部署マスタ下位::c売上計 ]

集計用の画面に、TO「集計_M部署マスタ」を基点としたレイアウトを作成します。ヘッダ部に集計用の年と月のグローバルフィールドを配置して指定年月ごとの集計ができるようにします。そして実際に集計するときは、部署が組織順に見やすくなるようにソートして、グローバルフィールドの年月を入力すれば自動的に計算されます。下位階層からの売上が上位に積み上がって集計された値になります。

上の画面では、各部署の階層がわかりやすいように階層に応じてインデントがセットされるようにしています。工夫することで部署の正式名称(最上位の部署からつなげた名称など)も表示させることができます。

最後に

なお、ここで紹介した方法は年月を指定するたびに常に再計算されるため、件数が多くなると表示に時間がかかるようになります。別途集計値を保存するテーブルを用意し、初回計算時のみに上記計算値を転記するようにするなど、工夫次第で参照するだけならストレスなく集計値を表示させることもできるようになります。

このような自己リレーションによる階層化対応の部署マスタは、単に売上の集計だけでなく所属スタッフの管理など、全体的な組織の把握においても役立ちます。ご参考下さい。