クロス表(クロス展開)
行と列のそれぞれのデータを条件として、クロスする箇所に値を出力する表をXCuteではクロス表と呼んでいます。
XCuteでは、リンクとセルの設定を行うだけでクロス表を出力することが可能となります。
横展開で設定したフィールド(条件B)を「Cross」、値に設定したフィールドを「C_val(Cross
Value)」と定義しています。
クロス表を作成するため、まず最初にひな形を用意します。
条件データを出力する領域(条件A)、縦方向でクロスさせるためのデータのCross領域(条件B)、値を出力させるためのC_Val領域(値)で構成した表を作成します。
次に、ひな形の設定を行います。テーブル1レコードの読み書き範囲で注意が必要です。
読み書き範囲の終端には、値領域の最終列までを指定してください。
次に、マッピングとフィールド属性の変更を行います。
Crossフィールドのマッピングには、ひな形のCross表示領域(条件B)の左端列(R11C5)を指定し、リンク設定が「Cross」になっていることを確認してください。
C_Valフィールドのマッピングには、ひな形の値を表示する範囲の最初のセル(R13C5、R13C6)を指定し、リンク設定を「C_Val」に変更してください。
マッピング後、ソートの設定を行います。クロス表においてソート順は非常に重要であり、ソート未設定もしくは誤りがあった場合、意図した表示となりません。
ソートの優先順位は条件A(必須)→条件B(任意)→値(任意)の順で設定してください。
クロス表のWriteReport実行時の内部動作を、上記サンプルデータで説明します。
@ レコードを見て、店舗コードの「1」をR13C2へ、店舗名の「駒込」をR13C3へ、品目名の「イチジク」をR13C4へ貼り付けます。
A フィールドをCrossに設定した月フィールドの「1」とマッチするひな形上のデータを、セル位置で指定されたR11C5セルを始点としてR11C6、R11C7…と右セルに移動しながら「1」が設定されているセルを探します。
B 月フィールドで「1」とマッチする位置を発見したら、フィールドをC_Valで設定した予算「187」と実績「99」を指定したセル位置に貼り付けます。
C 次のレコードの月が「2」や「3」も同様に処理されます。月が「4」や「5」も同様に処理されますが、マッチするセルがCrossの位置に無いので実際には無視されます。
D 7件目のレコードにくると、品目名の「ゴボウ」を読み取り、品目名が変更された(条件が割れた)ことを感知して、値領域の次の読み書き範囲に移動します。
このようなロジックでWriteReportされるため、ソート順は非常に重要です。ソート未設定もしくは誤りがあった場合、意図した表示となりません。
また、CrossやC_Valの出力領域の右にデータをマッピングした場合は、正常な出力を保証できません。
【ソート不正の失敗例】
クロス帳票実装時によく見られる失敗例です。
ソートの設定時にCrossの優先順位を上位に設定した時、下記のような出力結果となります。
【データ不正の失敗例】
Cross表として1行のデータに出力したい時、対象となるデータのCrossとC_Val以外の項目(マッピングしていないフィールドは除く)の値はすべて同一である必要があります。
同一である必要がある店舗コード・店舗名・科目名において、3件目のレコードが他と異なり「巣鴨」だった場合、下記のような出力結果となります。
様々なパターンのクロス表のサンプルを用意しております。ダウンロードはこちら
参照
○親子孫とリンク(グループ化)したクロス表