Microsoft Access 掲示板

クロス集計クエリからレポート印刷 / 22

50 コメント
views
4 フォロー
22
hiroton 2021/03/22 (月) 11:29:18 4c4b9@f966d

例えば次のようなデータ(1ページ=>5行3列)を考えます

Px 0 1
Py 商品名 合計 A店 B店 C店 D店 E店
0 5 1 1 1 1 1
1 1
2 1 1
3 1 1 1
2 1 1
1 1 1
1 1
2 1 1
2 1 1
2 1 1
2 1 1
1 1

「全く値が無いページ」は色を染めた部分で2ページになります。この考え方で合っていますか?

案件では、列も行も固定ではなく出力してみないとわからないという状態で、「ページ単位で見て」合計が0ならページを出力しないということですが、例えば

「商品お」の2ページ目のデータは「D店、E店」でデータはなし→ページ出力あり
「商品か」の2ページ目のデータは「D店、E店」でデータはなし→ページ出力なし

となっていて、レコード単位で出力の有無が決められません。なかなか難しくなってきました

サンプルデータのテーブルにすでに情報を追加していますが、ページ単位で考えるということで、ページの位置情報を追加して出力有無のデータを作ります

PyPxデータの合計
009
014
108
110
200
212

「データの合計」が「0」なら出力しないページということですね

長くなるのでいったん切ります

通報 ...
  • 23
    hiroton 2021/03/22 (月) 11:35:45 修正 4c4b9@f966d >> 22

    続き

    現在のレポート出力用のクエリにこの情報を追加してやれば不要なページを出力しないようにできます

    商品名 f0 f1 f2 n0 n1 n2 G 商品名 f0 f1 f2 n0 n1 n2 Py Px P合計
    A店 B店 C店 1 1 1 0 A店 B店 C店 1 1 1 0 0 9
    A店 B店 C店 1 0 A店 B店 C店 1 0 0 9
    A店 B店 C店 1 0 A店 B店 C店 1 0 0 9
    A店 B店 C店 1 1 0 A店 B店 C店 1 1 0 0 9
    A店 B店 C店 1 1 0 A店 B店 C店 1 1 0 0 9
    A店 B店 C店 1 0 A店 B店 C店 1 1 0 8
    A店 B店 C店 1 0 A店 B店 C店 1 1 0 8
    A店 B店 C店 1 1 0 A店 B店 C店 1 1 1 0 8
    A店 B店 C店 1 1 0 A店 B店 C店 1 1 1 0 8
    A店 B店 C店 1 1 0 A店 B店 C店 1 1 1 0 8
    A店 B店 C店 0 A店 B店 C店 2 0 0
    A店 B店 C店 0 A店 B店 C店 2 0 0
    D店 E店 1 1 1 D店 E店 1 1 0 1 4
    D店 E店 1 D店 E店 0 1 4
    D店 E店 1 1 D店 E店 1 0 1 4
    D店 E店 1 1 D店 E店 1 0 1 4
    D店 E店 1 D店 E店 0 1 4
    D店 E店 1 D店 E店 1 1 0
    D店 E店 1 D店 E店 1 1 0
    D店 E店 1 D店 E店 1 1 0
    D店 E店 1 D店 E店 1 1 0
    D店 E店 1 D店 E店 1 1 0
    D店 E店 1 1 D店 E店 1 2 1 2
    D店 E店 1 1 D店 E店 1 2 1 2

    「Px(各ページの列のまとまり)」はすでに求めていますね。「Q出力店舗のG」です。Q出力店舗の「G」は「Px」に変更します
    「Py」も同様に求められます

    Q出力商品リスト

    SELECT 商品名
    FROM テーブルA
    GROUP BY 商品名;
    

    Q出力商品ページグループ

    SELECT 商品名, DCount("*","Q出力商品リスト","商品名<'" & [商品名] & "'") AS [No], Int([No]/5) AS Py
    FROM Q出力商品リスト;
    

    これで、商品ほにゃららの店舗foo店はページ(Py,Px)に出力されるという情報ができました。これを組み合わせてページごとの数量の合計を算出します
    Q出力ページリスト

    SELECT Py, Px, Sum(数量) AS 数量の合計
    FROM (テーブルA INNER JOIN Q出力商品ページグループ ON テーブルA.棚番号 = Q出力商品ページグループ.棚番号) INNER JOIN Q出力店舗リスト_連番付き ON テーブルA.店舗名 = Q出力店舗リスト_連番付き.店舗名
    GROUP BY Py, Px;
    

    サンプルの場合に実際に得られる結果は

    PyPx数量の合計
    009
    014
    108
    212

    です。合計が「0」は実際には「データがない」なので出力されません。「数量」が「0」で実際に登録されているだとか、マイナス数量が許容されてて合計「0」がありうるとかだとまた変わってくるのでこの方法は使えないかもしれません

    必要な情報がそろったのでレポート出力用のクエリを作成します
    元データにはページの情報が含まれていないのでワンステップ挟んで最終的なクエリを作成します

    Q出力全ページデータ

    SELECT Py, テーブルA.*, Q出力店舗.*
    FROM Q出力店舗, テーブルA INNER JOIN Q出力商品ページグループ ON テーブルA.棚番号 = Q出力商品ページグループ.棚番号;
    

    Qレポート出力データ

    SELECT
      棚番号
      , Sum(数量) AS 合計数量
      , Q出力全ページデータ.Py
      , Q出力全ページデータ.Px
      , f0
      , f1
      , f2
      , Sum(IIf([店舗名]=[f0],[数量])) AS n0
      , Sum(IIf([店舗名]=[f1],[数量])) AS n1
      , Sum(IIf([店舗名]=[f2],[数量])) AS n2
    FROM
      Q出力ページリスト
        INNER JOIN
          Q出力全ページデータ
        ON
          Q出力ページリスト.Px = Q出力全ページデータ.Px
        AND
          Q出力ページリスト.Py = Q出力全ページデータ.Py
    GROUP BY
      棚番号
      , Q出力全ページデータ.Py
      , Q出力全ページデータ.Px
      , f0
      , f1
      , f2
    ;
    

    これで、ページ単位でデータがないデータは取り除いたデータが取得できます。「G」→「Px」等変更になってるのでレポートのデザインも合わせて修正してください

    計算がかなり増えているのでレポート表示にもそれなりに時間がかかりそうな気がします。出力時間が気になる場合は、クエリを細かく分けて作成しているので「ここで遅くなる」等チェックしてみてください