Microsoft Access 掲示板

views
4 フォロー
6,283 件中 3,881 から 3,920 までを表示しています。
34
hiroton 2021/03/29 (月) 08:57:21 63296@f966d

お願い①の件

Pyも考え方はPxと同じなので細かいこと省略しましたが、>> 23の「Q出力商品ページグループ」は実際の出力に合わせて調整が必要です

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

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

お願い②の件
=IIf([Px]=0,[合計数量])

例えば1店舗のみのときも空白になるってことでしょうか?

計算式を理解してもらいたいのですが、「Px」が「0」の時だけ[合計数量]を表示する(それ以外の時は何もしない=空白になる)という処理をしています。
『「Px」が「0」』とは列データが「A店~K店」のデータですね。クロス集計クエリで全データ出力したときの左端のページということです。その上で「データがないときはページを印刷しない」という処理を追加しているので『ページのグループ(Px)が「0」の時』と固定すると「Px=0(A店~K店)」のデータがないときは[合計数量]を表示するページが印刷されないということです。

=IIf([Px]=DMin("Px","Qレポート出力データ","Py=" & [Py]),[合計数量])
とても重いです。

そうなるだろうなぁと思っていました。とりあえず、計算式でとんでもない無駄をしていました

=IIf([Px]=DMin("Px","Q出力ページリスト","Py=" & [Py]),[合計数量])

少しは速くなると思います。いずれにせよ、これが必要ならデータベース的な計算をさせるととても苦しいモノなのでVBAで対応する案件かと思っています

'Q出力全ページデータ.f8を有効なフィールド名、または式として認識できません。

クエリの整理が必要かなぁと思っていたので触れていなかったんですが、「Q出力店舗」の問題ですね。これがクロス集計クエリなので、データ数が少ないと列数が足りなくなります。データを変えながら「Q出力店舗」を開いてみてください。このクエリでフィールドが固定であればいいのでクエリ列見出し"f0","f1","f2","f3","f4","f5","f6","f7","f8","f9","f10"と設定すれば良いでしょう

お願い④の件

クエリの問題ですか?レポートデザインの問題ですか?

元データのフィールドはどうなっていますか?(「数量」自体も実際に存在するフィールドなんでしょうか?)

レポートのデザインであれば、「ケースの数量」「バラの数量」「ケースの文字」「バラの文字」の4つのテキストボックスがあることを想定しています

4

現状の運用実態は下記のようでしょうか。

売上データには日々に売り上げが入力されていく。
請求書は前月の売上データをまとめて請求する。

上記であっているとして、一例をあげておきます。

売上テーブル

売上ID
取引先ID
売上日
商品コード
金額
請求ID

請求書テーブル

請求ID
請求日
請求年月
取引先ID

上記以外に 取引先マスター、商品マスター がある。

請求書テーブルをレコードソースにした単票フォーム「請求書フォーム」を作成する。

売上テーブルをレコードソースにした帳票フォーム「請求明細フォーム」を作成する。
「フィルター」プロパティを「False」、「読み込み時にフィルター適用」プロパティを「はい」に設定しておく。

「請求書フォーム」に「請求明細フォーム」をサブフォームとして埋め込む。

メインフォーム「請求書フォーム」でデータを入力する。
「請求年月」を入力したときに、VBAで請求年月を元にサブフォーム「請求明細フォーム」のフィルターに該当年月のデータが表示されるように抽出条件を設定する。
その後、抽出されたレコードの「請求ID」フィールドに、「請求書フォーム」の「請求ID」を入力する。

請求書レポートは、請求書テーブルと売上テーブルを「請求ID」で結合したクエリをレコードソースとする。
これを 請求ID でフィルターをかけて印刷する。

上記のような流れになります。
これは一例ですので、要件によっては別のほうほうの方がいい場合もあります。

3
ふりかね 2021/03/27 (土) 03:32:07 2a30e@d2f94

サブフォームの認識間違っていましたか?

33
もんぞう 2021/03/26 (金) 19:35:43 62ea7@f778d

hirotonさんへ

お願い①の件
素早いアドバイスありがとうございます。
画像付きでとても分かりやすく助かります。

アドバイス通りにしてるつもりなんですが(余計なことをしていたらすみません)
行の表示数が減ってしまいページ数が増えてしまいます。
(例)
変更前 商品17行
変更後 商品5行
のようになってしまします。
お手数おかけします。

お願い②の件
=IIf([Px]=0,[合計数量])
問題なく実行できました。
例えば1店舗のみのときも空白になるってことでしょうか?

=IIf([Px]=DMin("Px","Qレポート出力データ","Py=" & [Py]),[合計数量])
とても重いです。
印刷した場合、1ページごとに15秒ぐらいかかったりします。
(例)
1ページ目印刷→15秒経過→2ページ目印刷→15秒経過→3ページ目印刷・・・

この件で少ない店舗のときを調べようと気づいたのですが、
店舗名、商品名などが少ない時にQレポート出力データを実行したら
'Q出力全ページデータ.f8を有効なフィールド名、または式として認識できません。
というエラーメッセージが出てきます。

早い段階で確認しとくべきこと遅くなってすみません。
よろしくお願いします。

お願い③の件
理想の形になりました。
ありがとうございます。

お願い④の件
現状どこにどう追加すればいいのかよくわかっておりません。
申し訳ありません。

お願い⑤
理想の形になりました。
ありがとうございます。

テーブル作成クエリの件
削除クエリ(全データ削除)と追加クエリを今まで使ったことがありませんでした。
クエリの使い分けがまったく分かってないので勉強します。
アドバイスありがとうございます。

32
名前なし 2021/03/26 (金) 08:20:21 d61b8@f966d >> 31

こんな感じです
画像1

Pyヘッダーで表示するものもないのでグループの追加じゃなくて並べ替えの追加で良かったです

1

一つのテキストボックスでするのは難しいでしょうね。
VBAで空白を挿入して調整するとかすれば可能でしょうが、かなり面倒そうです。

単価 と 数量 をそれぞれテキストボックスとして配置して、その間に"✕"をラベルとして配置すればどうでしょう。
単価✕数量 が必要ない場合は、セクションのフォーマット時で非表示にすればいいでしょう。

1

レポートの詳細セクションにラベルやテキストボックスをそのようなレイアウトになるように配置すればいいでしょう。

画像1

分かりやすいようにラベルは薄いピンク色にしています。

あるいは、ユニオンクエリで縦並びに変換する方法もあります。

31
もんぞう 2021/03/25 (木) 21:16:05 62ea7@f778d

hirotonさん

全ての質問に回答ありがとうございます。

お願い①
印刷ページの順番の変更をお願いします。
レポートのデザインでグループの追加で「Py」を追加して「Px」の上にします

一つ目でつまずいてしましました。
自分なりに試行錯誤しましたができませんでした。

1

[訪問実績]テーブルをもとにクエリを作成して、必要なフィールドを表示させて、
フィールド蘭に下記の式を入力してください。

アクセスログ日時: (SELECT Max(日時) FROM アクセスログ AS T1 WHERE 訪問実績.機器番号=T1.機器番号 AND 訪問実績.日時>=T1.日時 )

30
hiroton 2021/03/25 (木) 09:54:03 9b641@f966d

お願い①

印刷ページの順番の変更をお願いします。

レポートのデザインでグループの追加で「Py」を追加して「Px」の上にします

お願い②

商品の合計数量欄が全ページ数字が入ってますので
2回目以降の同じ商品の合計数量は空白でお願いします。

レポートのデザインで合計数量のコントロールソース=IIf([Px]=0,[合計数量])にします。ただし、「1店~11店」の出力がない商品グループの場合、合計数量が表示されなくなります。これに対応する場合は=IIf([Px]=DMin("Px","Qレポート出力データ","Py=" & [Py]),[合計数量])とします

お願い③
店舗名の順番を固定の方法以外で指定したいです。
具体的には店舗CDのフィールドがあるのでその順番にしたいです。

連番付けのルールを「店舗CD」に対して行えばいいですね
Q出力店舗リスト

SELECT 店舗名, 店舗CD
FROM テーブルA
GROUP BY 店舗名, 店舗CD;

Q出力店舗リスト_連番付き

SELECT 店舗名, DCount("*","Q出力店舗リスト","店舗CD<'" & [店舗CD] & "'") AS [No], Int([No]/11) AS Px, [No] Mod 11 AS f
FROM Q出力店舗リスト;

お願い④

[数量]のフィールドを値にしてるのですが、
これを[ケース]&[バラ]の値にしようと思ってます。
この場合、[ケース]もしくは[バラ]の値がゼロの場合
どちらか一方を空白にすることは可能でしょうか?

数量のフィールドを表示するために

  , Sum(IIf([店舗名]=[f0],[数量])) AS n0

を作りました。ケースの値も表示したいなら

  , Sum(IIf([店舗名]=[f0],[ケース])) AS nC0

とかでフィールドを増やせばいいかな?(数量用=>n0~n10、ケース用nC0~nC10)
「ケース」「バラ」の表示はそれぞれ

=IIf(IsNull(nC0),,"ケース")
=IIf(IsNull(n0),,"バラ")

お願い⑤

レポートのテキストボックス1に商品名を登録します。
テキストボックス2~4は商品情報を登録します。
例えば、商品名が15文字あったとして、
テキストボックス1(上)に10文字、テキストボックス1(下)に5文字
のように分けて登録することは可能でしょうか?

テキストボックス1(上)
=Left([商品名],10)
テキストボックス1(下)
=Mid([商品名],11)
29

データ量が増えたせいかQレポート出力データ→印刷がより重たくなったので,一度テーブル作成クエリをはさんでテーブル→印刷にしました。
現状この方法で問題なさそうなのですが、このやり方で大丈夫でしょうか?

欲しい結果が得られているのなら問題ないと思いますが、テーブル作成クエリですか?
ことあるごとにテーブルそのものを作ったり消したりするのは負荷がかかるので削除クエリ(全データ削除)と追加クエリを使う形でデータだけを任意に変えられる作りのほうがいいでしょう


高速化自体はいろいろ方法があります。特に、クエリはかなり初心者向けの手順で作成しているので見直ししたいところではあります。SQLの知識が必要になるにも関わらず効果は薄そうなので微妙ですが

VBAを使えば劇的な効果もありそうですが、これはこれでやはりそれなりの知識が必要になります。
ワークテーブルへの書き込みを自動化する(簡単・効果小)
連番作成ルーチンを組む(検索すれば見つかるそれなりの方法・効果大)
レポートに出力した後印刷しない処理を組む(※)
(※)できるかどうかわかりません。できればワークテーブルもPy関係のクエリも不要で夢のようです

ただ、後で見直して「これ何やってるんだっけ?」となるようなものは非常にコストが高いので「運用上十分」で一番「楽な方法」ならそれで完成でいいんじゃないかという感じです

hirotonとしては技術的な話題も嫌いではないので、現状問題はないんだけどどうにかならないか?というのもそれはそれでアリですけどね

28
もんぞう 2021/03/24 (水) 15:59:05 62ea7@f778d

お願い⑤

レポートのテキストボックス1に商品名を登録します。
テキストボックス2~4は商品情報を登録します。
例えば、商品名が15文字あったとして、
テキストボックス1(上)に10文字、テキストボックス1(下)に5文字
のように分けて登録することは可能でしょうか?

画像1

フィールドを[商品名前半10文字][商品名後半5文字]と分けて
テキストボックスにそれぞれ登録すればできるとおもいますが、
[商品名]のみのフィールドでできますでしょうか?

連続投稿申し訳ありません。
回答できる方よろしくお願いします。

27
もんぞう 2021/03/24 (水) 15:32:25 62ea7@f778d

お願い④

[数量]のフィールドを値にしてるのですが、
これを[ケース]&[バラ]の値にしようと思ってます。
この場合、[ケース]もしくは[バラ]の値がゼロの場合
どちらか一方を空白にすることは可能でしょうか?

普通にやれば
[ケース]0 [バラ]1の場合
0  1
[ケース]1 [バラ]0の場合
1  0
[ケース]0 [バラ]0の場合
空白 空白

理想
[ケース]0 [バラ]1の場合
空白  1
[ケース]1 [バラ]0の場合
1  空白
[ケース]0 [バラ]0の場合
空白 空白

もし理想の形になるのであればの話ですが、
値の下にテキストボックスでケース、バラ表記を付けた場合

[ケース]1 [バラ]1の場合
1    1
ケース バラ
[ケース]0 [バラ]1の場合
空白  1
空白  バラ
[ケース]1 [バラ]0の場合
1    空白
ケース 空白

値があるときだけケース、バラ表記をつけて
空白のときは空白にできますでしょうか?

26
もんぞう 2021/03/24 (水) 12:45:58 62ea7@f778d

hirotonさんへ

フィールドを追加して再度試しました。
データ量が増えたせいかQレポート出力データ→印刷がより重たくなったので,一度テーブル作成クエリをはさんでテーブル→印刷にしました。
現状この方法で問題なさそうなのですが、このやり方で大丈夫でしょうか?

すごく簡単なことなのかも知れませんが、
いくつか困ったことがあるのでアドバイスお願いします。

お願い①

印刷ページの順番の変更をお願いします。

現在
1ページ目 1店~11店 商品1~商品17
2ページ目 1店~11店 商品18~商品34
3ページ目 1店~11店 商品35~商品51

理想
1ページ目 1店~11店 商品1~商品17
2ページ目 12店~22店 商品1~商品17
3ページ目 23店~33店 商品1~商品17

お願い②

商品の合計数量欄が全ページ数字が入ってますので
2回目以降の同じ商品の合計数量は空白でお願いします。

合計数量あり 1店~11店 商品1~商品17 
合計数量なし 12店~22店 商品1~商品17
合計数量なし 23店~33店 商品1~商品17

お願い③
店舗名の順番を固定の方法以外で指定したいです。
具体的には店舗CDのフィールドがあるのでその順番にしたいです。
[店舗CD]&[店舗名]にすれば順番になるのですが、
見た目が店舗名だけの情報のほうが分かりやすいので。
良い方法があればアドバイスお願いします。

細かなチェックはまだしてませんが、ほぼ理想の形になりました。
ありがとうございます。

25

Q出力商品ページグループとQ出力商品リストに[棚番号]がなかったので追加しました。

あー、hirotonのミスです。直してOKです

Qレポート出力データまで試してみました。
Qレポート出力データが少し重い感じで、レポート表示したときはかなり重い感じでした。

処理内容からすれば想定通りです。そのほかの表記したい項目も含めて「ワンクリックぐらいで印刷できる」が達成できていればとりあえず完成かなと思っています。何か問題があれば教えてください

処理速度の問題についてはクエリの見直しで高速化できるか、どうしてもならVBAでどうにかするかとなると思いますが、気になるようなら実際に運用するときのデータ数とその時の処理時間を合わせて出してもらえるといいと思います。

2
ふりかね 2021/03/24 (水) 04:52:42 2a30e@86936

趣味の映画鑑賞データをいれるものを作った程度です
そのときにいろいろなサイトをみたりして、ある程度の機能には触れてみました

ファイルメーカーにはサブフォームに似たポータルというものがありました
一応それらの近いは理解したつもりです
本来は1対多で入力するときに使うものですが、
フォームに検索用の窓をつくり、あるテーブルからその条件で検索した結果をサブフォームに表示させる、ということもできますよね?(ポータル機能もそのようなものでした)

24
もんぞう 2021/03/23 (火) 18:26:06 62ea7@f778d

hirotonさんへ

追加情報ありがとうございます。

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

Qレポート出力データまで試してみました。
Qレポート出力データが少し重い感じで、レポート表示したときはかなり重い感じでした。

Q出力商品ページグループとQ出力商品リストに[棚番号]がなかったので追加しました。
間違ってたらすいません。

1

ファイルメーカーからの移行ということですが、Accessはすこしは使ったことがありますか。それとも、まったくないのでしょうか。

例えば、サブフォームというのは、Accessの場合、メインフォームの中にコントロールとしてフォームを埋めこんであるものさしますが、その認識は持ってますでしょうか。

その辺をはっきりしておかないと、やりとりでお互いの認識に齟齬が生じますに確認させてください。

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」等変更になってるのでレポートのデザインも合わせて修正してください

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

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」なら出力しないページということですね

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

9
hhmmj553 2021/03/21 (日) 17:18:40 19f3a@6b5ef

お騒がせしました。
あれから、勝手な再起動は起きていません。

テクニカル分析をしてみようと、
大量のデータをダウンロードしていました。
そして、分析にはエクセル関数が必要だろうと、
参照設定に入れていましたが、どうもこれが原因のようです。
関数は自作すればすみますので困ったことは起こりません。

私にとっては、困ったときのHatenaさんなので、
今後ともよろしくお願いします。

21
もんぞう 2021/03/20 (土) 20:37:28 62ea7@f778d

hirotonさん

「Q出力店舗」のレポート表示まで試してみました。
試したパソコンと実際に使うパソコンは違うのですが試したパソコンではまったく問題ありませんでした。

20
もんぞう 2021/03/20 (土) 18:46:02 62ea7@f778d

情報がごちゃごちゃしてしまいましたので画像貼ります。
画像1
画像2
画像3
画像4
画像5
画像6
画像7
画像8

19
もんぞう 2021/03/20 (土) 16:17:06

hirotonさん

「ページごとに不要な列は出力しない」部分には対応してません。

私の勘違いでした。
出力して大丈夫です、申し訳ありません。

ただ全く値が無いページは無しでお願いします。

18
もんぞう 2021/03/19 (金) 20:20:04 62ea7@f778d

hirotonさん新しい案ありがとうございます。
まだ試せてませんので少しお時間をください。

「ページごとに不要な列は出力しない」部分には対応してません。
とのことですがわがままを言って申し訳ありませんが、この部分はぜひよろしくお願いします。

hatenaさんとhirotonさんお二人ともアイデアを出していただき感謝してます。
現状私のスキルでは何がいいかもよくわからずにいます。

情報後出しで申し訳ありませんが、理想のレイアウトの画像を貼り付けます(上の画像と同じです)。
画像1

17
もんぞう 2021/03/19 (金) 20:03:43 62ea7@f778d

hatenaさん、手順までありがとうございます。
わかりやすくすぐできました。

実際にしてみてやはりレイアウト的に厳しい感じです。

情報後出しで申し訳ありませんが、
エクセルでの現状のレイアウトと理想のレイアウトの画像貼り付けます。

やり方がよくわかってなく、私の勘違いでしたらすみません。

画像1
画像2

16
hiroton 2021/03/19 (金) 10:39:18 19984@f966d

ワークテーブル(T_出力店舗)を入力すればレポート表示できることは見てもらえたと思います。これを「VBAで」と言っていたんですが、実はクエリで作成できます

元になる店舗名のリストクエリ
Q出力店舗リスト

SELECT 店舗名
FROM テーブルA
GROUP BY 店舗名;

これで

店舗名
店舗A店
店舗B店
店舗N店

のデータが取れます。これを、

店舗名No:連番G:Int([No]/11)f:[No] Mod 11
店舗A店000
店舗B店101
店舗C店202
店舗D店303
店舗E店404
店舗F店505
店舗G店606
店舗H店707
店舗I店808
店舗J店909
店舗K店10010
店舗L店1110
店舗M店1211
店舗N店1312

のように連番をつけて計算フィールドを増やしてやれば、Gを行見出し、fを列見出し、店舗名を値にしてクロス集計クエリをつくることで、ワークテーブルの形のデータを得ることができます

Q出力店舗リスト_連番付き

SELECT 店舗名, DCount("*","Q出力店舗リスト","店舗名<'" & [店舗名] & "'") AS [No], Int([No]/11) AS G, [No] Mod 11 AS f
FROM Q出力店舗リスト;

Q出力店舗

TRANSFORM Max(店舗名) AS 店舗名の最大
SELECT G
FROM Q出力店舗リスト_連番付き
GROUP BY G
PIVOT "f" & [f];

この「Q出力店舗」をレポート出力用クエリで指定している「T_出力店舗」と入れ替えれば完成です


クエリで連番を振る方法は遅い処理です。実用に耐えられるか試してみてください。「Q出力店舗」の表示までなら耐えられるけど、レポート表示の段階だと遅すぎるなんて場合もあるかもしれません。そもそも「Q出力店舗」の表示すら遅いということもあるかもしれません。状況に応じて「じゃあその部分はVBAで」となると思います

順序だてて説明するために複数のクエリを作ることにしました。この辺もクエリの作り方によっては整理できるので、「考え方」としてうまくいくようであれば整理したクエリに変更したいと思います

>> 11の、特に「ページごとに不要な列は出力しない」部分には対応してません。>> 14で回答した通りVBAで商品グループごとn回処理するか、何か別案を思いつくか、hatenaさんがExcel出力の方法を提示していますし、もんぞうさんが進められる方法で、として進むようであればまた続きを考えたいと思います

15
hiroton 2021/03/19 (金) 09:37:55 19984@f966d

追加の仕様については>> 11で返信しました。続きはVBA・・・なんて言っておきながらですがちょっと進んだ案を思いついたので半歩だけ進めます


ワークテーブルを次のように変更します
T_出力店舗

Gf0f1f2
0店舗A店店舗B店店舗C店
1店舗D店店舗E店店舗F店

Gのデータは0から始まる連番です
(名前に特に意味はありません。列Groupの番号くらいの意味です)
出力する店舗数で行も増減します

レポート出力用にクエリを作成します

SELECT
  棚番号
  , Sum(数量) AS 合計数量
  , G
  , f0
  , f1
  , f2
  , Sum(IIf([店舗名]=[f0],[数量])) AS n0
  , Sum(IIf([店舗名]=[f1],[数量])) AS n1
  , Sum(IIf([店舗名]=[f2],[数量])) AS n2
FROM
  テーブルA
  , T_出力店舗
GROUP BY
  棚番号
  , G
  , f0
  , f1
  , f2
;

上記クエリをレコードソースにしてレポートを次のようにします

ページヘッダー
Gヘッダー
棚番号合計数量f0f1f2
詳細
棚番号合計数量n0n1n2

グループの追加:G(改ページ:カレントセクションの前)
並べ替えの追加:棚番号

これで全データの出力をレポート出力1回でできます。データ量(処理時間)的に問題なければこの方法で進めたいと思います

14

2ページ目の合計数量は空白で

把握しました。

商品CD・JANCD・容量・入数などの行フィールドが他にあります。

表示の仕方自体は商品名と同じような感じでしょうか?場合によっては1ページ名用レポートと2ページ目以降用レポートで2つ作ってしまったほうがいいかもしれませんね。

画像①画像②のあ~ちの商品の数量がない店舗A店と店舗B店の
表示は無しでお願いします。
画像③と画像④は店舗A店と店舗B店の数量がありますので
表示はありでお願いします。

サンプルで言うと
商品あ~商品ち=>店舗C店~店舗M店、店舗N店
商品つ~商品と=>店舗A店~店舗K店、店舗L店~店舗N店
という形で、一ページに含まれる商品のパターンで列が変わるということですね

データベース的な考え方をすると、列と言ったらその対象は常に同じでないといけない(「商品あ」の1列目が「A店」なら「商品い」の1列目も「A店」、「商品と」の1列目も「A店」)のですが、求めるレポートはこれではないということですね

「一ページに含まれる商品の組み合わせ」が決まって初めて出力すべき列(店舗)が決まるということになるので、さらに処理を追加してあげないといけませんね

今度こそ、大元のデータを商品のグループで17行項目(出力する行数)ずつ区切って処理するような方法が必要になりそうです

13
hatena 2021/03/19 (金) 03:37:59 修正

手順

  1. クロス集計クエリをデータシートビュー表示して全選択してコピー、エクセルのシートのA1に貼り付け
    画像1

  2. [ページレイアウト]-[ページ設定]-[サイズ]で「A3」 を選択、[印刷の向き]で「横」を選択。[印刷タイトル]をクリック。
    画像1

  3. [ページ設定]ダイアログが開くので、[タイトル行]、[タイトル列]を指定する。(マウスドラッグで指定できます。)
    画像1

  4. 1ページ分の範囲が点線で表示されているので、希望の行数、列数になるように行幅、列幅を変更する。

  5. [ファイル]-[印刷]でプレビューを確認。
    1ページ目
    画像1
    2ページ目
    画像1
    3ページ目
    画像1
    4ページ目
    画像1

  6. 印刷設定が済んだブックをデータを削除してからテンプレートとして保存する。

  7. ■T'sWare Access Tips #686 ~レコードセットの内容をそのままExcelのシートに出力する方法~の方法で、上記のテンプレートブックにクロス集計クエリのデータを出力する。印刷する。(「Microsoft ActiveX Data Objects * Library」に参照設定必要)

  Dim cnn As ADODB.Connection
  Dim rst As ADODB.Recordset
  Set cnn = CurrentProject.Connection
  Set rst = New ADODB.Recordset
  rst.Open "クロス集計クエリ", cnn, adOpenKeyset, adLockOptimistic
  'Excelオブジェクトを生成
  Dim xls As Object
  Set xls = CreateObject("Excel.Application")
  With xls
    'テンプレートブックを開く
    Dim wb As Object
    Set wb = .objExcel.Workbooks.Open("C:\TEST\テンプレート.xlsx")

    '最初のシートにデータ出力
    wb.WorkSheets(1).Cells(1, 1).CopyFromRecordset rst

    'Excelを可視状態にする
    .Visible = True
    ’印刷する。
    wb.WorkSheets(1).PrintOut
  End With
  Set xls = Nothing
  rst.Close: Set rst = Nothing: Set cnn = Nothing

2ページ目、3ページ目に空欄の合計列が必要な場合は、対応がちょっと難しそう。
空欄の合計列は必要ないとは個人的には思います。

12
もんぞう 2021/03/18 (木) 21:05:44 62ea7@f778d

hatenaさん

自分の投稿を見直してみて書いてなかったことに今気づいたのですが印刷は1ページにA3横に収めたいです。
この件と関係なかったらすみません。

レイアウト的に厳しそうでしたので、
教えてもらったやり方は実際には試してませんでした。

明日時間があれば試したいと思います。
いろいろありがとうございます。

11
もんぞう 2021/03/18 (木) 21:04:13 62ea7@f778d

hirotonさん代案ありがとうございます。

試しに作ってみましたが2ページ目の合計数量は空白でお願いします。
棚番号・商品名の順番はページがまたいでも固定ですが、合計数量は
最初のページのみの表示でお願いします。
他はとりあえず問題なさそうですが
商品CD・JANCD・容量・入数などの行フィールドが他にあります。

あと言い忘れてたことで問題になりそうなことが一つありまして
画像①画像②のあ~ちの商品の数量がない店舗A店と店舗B店の
表示は無しでお願いします。
画像③と画像④は店舗A店と店舗B店の数量がありますので
表示はありでお願いします。
自分で作ってましたらそこでまた引っ掛かりました。
説明が分かりにくかったらすみません。

※印刷は1ページにA3横でお願いします。

画像1
画像2
画像3
画像4

10

棚番号・商品名だけの情報しかあげてませんでしたが、他に商品CD・JANCD・容量・入数などがあります。
これらの情報をエクセルで作ろうとすると行が横長になってしまい列がほとんど入りません。

ちょっと意味が分かりません。
エクセルは列は最大 16,384列まであります。Accessのクエリは最大255列までですので、列が入らないということはないです。
とりあえず、現状のクロス集計クエリをコピーしてシートに貼り付けてみてください。
そのうえで下記の方法で、行見出し、列見出しを固定すれば簡単に希望の印刷ができるはずです。
Excelで見出しを固定して全ページに印刷!印刷タイトル
それができるのが確認出来たら、VBAでCopyFromRecordsetでエクセルシートに出力するようにして自動化すればいいでしょう。

9
hiroton 2021/03/18 (木) 09:25:06 修正 ce119@f966d

hirotonがワークテーブルを挙げているのは、処理の流れが分かりやすくなるのとクエリのデザインビューが活用しやすいという点からですね。データベース的な目線からは無駄が多いような気もしますが、理解しやすいんじゃないかと


さて、改めて画像を眺めていたんですが、1ページ目と2ページ目は書式は同じですが合計数量のデータが違っていますね。2ページ目以降は空白になったほうがいいんでしょうか?

それと、hirotonの見落としですが、合計数量はデータ全体の合計になっているようので、11店舗ずつ区切るとちょっと手間が出そうです(合計数量を表示するクエリと11店舗分のクエリを別々に作って後で繋げる)

ACCESSでやる方法ならhatenaさん提示のクロス集計クエリで列見出しを固定する方法のほうがよさそうです


クロス集計クエリの列を固定する方法がよさそうではありますが、せっかくなので代案(訂正案)を出します

表示列数分のワークテーブルを用意します(サンプルのため3店舗に簡略)

T_出力店舗

f0f1f2
店舗A店店舗B店店舗C店

レポート出力用にクエリを作成します

SELECT
  棚番号
  , Sum(数量) AS 合計数量
  , f0
  , f1
  , f2
  , Sum(IIf([店舗名]=[f0],[数量])) AS n0
  , Sum(IIf([店舗名]=[f1],[数量])) AS n1
  , Sum(IIf([店舗名]=[f2],[数量])) AS n2
FROM
  テーブルA
  , T_出力店舗
GROUP BY
  棚番号
  , f0
  , f1
  , f2
;

上記クエリをレコードソースにしてレポートを次のようにします

ページヘッダー
棚番号合計数量f0f1f2
詳細
棚番号合計数量n0n1n2

ページヘッダー内の「棚番号」と「合計数量」はラベル、その他はテキストボックス(表示内容はコントロールソース)です

このレポートをプレビュー表示すると望みの1ページ目になりますか?
うまくいくようだったらT_出力店舗の各フィールド(f0,f1,f2)を「店舗D店」「店舗E店」「店舗F店」に書き換えて再度レポートをプレビュー表示してください。望みの2ページ目になりますか?

これでうまくいくようであれば続き(VBAで店舗を書き換えてレポートを表示する部分)に進みます

7

はい、そうです。

方法はいろいろありますが、DAOのRecordsetを使う方法がいいでしょう。
新規レコードの追加なら AddNewメソッド、
既存レコードの更新なら、主キーで該当レコードを探して、Editメソッドで、
ということになります。

レコードの更新・追加・削除(DAO編)

6

従業員は固定です

たとえば0なら転記しないように記述して、転記ボタンで別テーブルに、書き出すということでしょうか?

別テーブルには
aaa  りんご 10
aaa  みかん 5

となるように転記するんですよね?

5

要件次第です。
従業員がその時、その時で異なるなら、全レコード削除。
入力するときに必要な従業員を追加するということになります。

従業員が固定なら、従業員以外のフィールドの値を0にする、ということになります。

4
やま 2021/03/17 (水) 21:03:05 58219@86936

転記するのはVBAでかき、上記のテーブルは毎回クリアされ0レコードにするということですか?

8
hhmmj553 2021/03/17 (水) 11:51:03 19f3a@6b5ef

エクセル関数を利用しようと参照設定に入れていましたが
どうも、これがいけなかったようです。
いまのところ、勝手な再起動は起きていません。
もし、また勝手な再起動が起きたら報告します。

7
hhmmj553 2021/03/17 (水) 10:04:59 19f3a@6b5ef

エラーがでるフォームは、自動的にインポート対象から外れてインポートされていませんでした。

現在のところ、勝手な再起動は起きていません。

もしかしたら、エクセルの参照設定が干渉していたのかも?
引き続き、報告します。