データ型は厳密にして、余計な情報はもたない
データモデルで定義する各フィールドのデータ型は、できるだけ目的にあったデータ型を選びましょう。例えば、数値を表すデータはintなど数値を表す型を使い、文字や文を表現するデータ型はstring型を使います。日付や時刻を表すデータはDatetime型で定義します。特に金額を扱う帳票の場合は、数値型であってもfloatやdoubleのような浮動小数型を避け、桁落ちの発生しないdecimal型を使いましょう。
データの取得元がCSVファイルや、ネットワーク経由で取得するXMLであることがわかっている場合、すべて文字型でデータモデルを定義してしまうことがありますが、設計判断としてはあまり好ましいものではありません。
たしかに、フィールドに設定された値をそのまま表示するだけなら、文字型と数値型のどちらを使ってもよいかもしれません。しかし、グループヘッダ・フッタを用いて集計値を計算する場合は、文字型を数値型に変換する必要があります。ActiveReportsではデータが文字列であったとしても(気を利かせて)自動的に型変換してくれますが、データソースの各フィールドが型を持つことができるのであれば、数値型のデータをDataFieldプロパティに指定すべきです。
また、数値や日付については「"10000"→10,000円」や「"2008-08-01 00:00:00"→2008年8月1日」などのように、データに対して書式付けをしたいという理由で文字列型が選ばれることもあります。しかし、これもあまり良い方法ではありません。データそのものが書式情報を持ってしまうと、書式を変えるためにはデータそのものを変更しなければならず、データ変換用のプログラムを作成するか、元データを生成するプログラムの方で書式を変更する必要があります。データモデルはあくまで「値」を正しく保持することに徹し、書式付けのような「データをどう見せるか」の機能は帳票レイアウトに任せるべきです。
このほか、データ型を指定するときは、読み込んだデータの値がnull(空文字)であったときの対処についても考えておく必要があります。文字列型であれば、ほとんどの場合「null=空白」としておけば間違いないですが、数値型の場合は空欄にするのか、ゼロにするのかなど、場合によって最適な値は異なるでしょう。
データの順序が決まっていないと、データの集計結果が変わってしまう
抽出条件、データ型の設計が終わったら、次は帳票を出力するためのデータ出力順序を指定するのですが、ActiveReportsの帳票出力において、データソースから取得されるデータがどのような順序で並んでいるかはとても重要な要素です。
データモデルを設計するときは必ず、データの並び順を明示的に指定しましょう。ActiveReportsでは、データソースから取得した値を読み取った順番に処理していくため、データの並び順が決まっていないと予期せぬ集計結果を出力することがあります。
例えば、あるフィールドのデータが「A→A→B→A」のような順序で読み込まれると、このフィールドは「A(2件)」「B(1件)」「A(1件)」のようにグループ分けされ、最初に出てきたAと後に出てきたAが別なグループとして扱われてしまいます。
特にレポートデータソースとしてRDBMSを使う場合、SQL文のORDER BY句で順序を指定していないために結果セットの順番が変わってしまい、上記のような問題が起こってしまうことがあります。レポートデータソースとしてSQLを記述する場合は、必ずORDER BY句を明示的に指定するようにしましょう。
おわりに
前回、今回の2回にわたって、帳票アプリケーション設計で押さえておきたい2つのポイントについて解説しました。
これまで前半5回、後半5回の計10回にわたりActiveReportsの機能を紹介してきましたが、本連載は今回でひと区切りとなりますが、ActiveReportsにはこれまでに紹介したもの以外にも、多くの便利な機能があります。グレープシティ社のActiveReports 3.0J FAQページには有益なTipsが多数紹介されているので、開発中に困ったことがあれば、まずここで調べてみるのがよいでしょう。