, ケース入数
, Sum(数量) AS 合計数量
, Int([合計数量]/[ケース入数]) AS 合計ケース数
, [合計数量] Mod [ケース入数] AS 合計バラ数
, f0
, Sum(IIf([店舗名]=[f0],[数量])) AS n0
, Int([n0]/[ケース入数] ) AS n0ケース数
, [n0] Mod [ケース入数] AS n0バラ数
, ケース入数
, Sum(数量) AS 合計数量
, Sum(Int([数量]/[ケース入数])) AS 合計ケース数
, Sum([数量] Mod [ケース入数]) AS 合計バラ数
, f0
, Sum(IIf([店舗名]=[f0],Int([数量]/[ケース入数]))) AS n0ケース数
, Sum(IIf([店舗名]=[f0],[数量] Mod [ケース入数])) AS n0バラ数
Int([数量]/[ケース入数]と[数量] Mod [ケース入数])が複数回でてきますが、レポート出力用クエリ「Qレポート出力データ」は集計を使ったクエリなので、これを個別のフィールドに置くことはできません。わかりやすく処理するなら事前にフィールドを作っておく必要があります。ちょうど前段階として「Q出力全ページデータ」があるので
Q出力全ページデータ
SELECT Py, テーブルA.*, Q出力店舗.*, Int([数量]/[ケース入数]) AS ケース数, [数量] Mod [ケース入数] AS バラ数
FROM Q出力店舗, テーブルA INNER JOIN Q出力商品ページグループ ON テーブルA.棚番号 = Q出力商品ページグループ.棚番号;
とすれば
Qレポート出力データ
, Sum([数量]) AS 合計数量
, Sum([ケース数]) AS 合計ケース数
, Sum([バラ数]) AS 合計バラ数
, f0
, Sum(IIf([店舗名]=[f0],[ケース数])) AS n0ケース数
, Sum(IIf([店舗名]=[f0],[バラ数])) AS n0バラ数
, Sum(数量) AS 合計数量
, f0
, Sum(IIf([店舗名]=[f0],[数量])) AS n0
, Int([n0] / [ケース入数] ) AS n0ケース数
, [n0] Mod [ケース入数] AS n0バラ数
GROUP BY
, Q出力全ページデータ.Py
, Q出力全ページデータ.Px
0の場合、レポートに表示するときは空白でお願いします。
数値をチェックして必要な時(0より大きいとき)だけ出力すればいいですね
, IIf([n0ケース数]>0,[n0ケース数]) AS n0ケース数表示
, IIf([n0ケース数]>0,"ケース") AS n0ケース文字
, IIf([n0バラ数]>0,[n0バラ数]) AS n0バラ数表示
, IIf([n0バラ数]>0,"バラ") AS n0バラ文字
早速のご返事誠にありがとうございます。
試してみたいと思います。
コードの記述はちょっと気に掛けてあげると問題にも気づきやすくなります
問題のあるコードそのまま書き換え
INSERT INTO ステートメント
外部ファイルに接続する場合の記述は
VALUESを使った記述の場合「外部ファイルに接続する方法」の記述がありませんね・・・
まぁ、Microsoftの公式資料なんてそんなもんです。きっと似たような記述をすればなんとかなるはず
お試しを
変更後のVBA(下の方)のDim strSQL行の最後に select * from を加筆し、
と書き直した所、CurrentDb.Execute行に 最後の;が足りないエラーが出てしまいました。
strSQLの内容がまずい気がするんですが、いかがでしょうか…。
解決しました!!
リレーション先登録されている社員番号と一致しないせいでエラーが出ていました・・・
同じように登録するとエラーなしで表示されました!
お手数をお掛けし申し訳ありません。
レコードソースのパラメータはそのまま参照できます。
テキストボックスを2つ配置して、コントロールソースにそれぞれ下記のように設定すればOKです。
=[はじまりの日付【例:2021/3/1】]
=[終わりの日付【例:2021/4/2】]
このクエリを実行するとエラーは表示されますか?または、レコードが表示されませんか?
素人がググっただけですが、社員番号がnullになるものが無くても、LEFT JOINの結果、組み合わせでnullになっているせいとか?
hiroton様
回答いただき誠にありがとうございます。
私も原因がそれだと思い探したのですが社員番号がnullになるのはありませんでした。。。
SELECT 社員マスタ.社員番号, 社員マスタ.氏名, 社員マスタ.入社年月日, 社員マスタ.生年月日, 全社員住所歴マスタ.郵便番号,
全社員住所歴マスタ.都道府県, 全社員住所歴マスタ.市区町村, 全社員住所歴マスタ.番地,
全社員住所歴マスタ.[マンション等], ([全社員住所歴マスタ].[都道府県] & ([全社員住所歴マスタ].[市区町村]) & [全社員住所歴マスタ].[番地] & ([全社員住所歴マスタ].[マンション等])) AS 全住所,
DateDiff("yyyy",[生年月日],Date())+(Format([生年月日],"mmdd")>Format(Date(),"mmdd")) & "歳" AS 年齢, 全社員住所歴マスタ.登録日
FROM 社員マスタ LEFT JOIN 全社員住所歴マスタ ON 社員マスタ.社員番号 = 全社員住所歴マスタ.社員番号
WHERE (((全社員住所歴マスタ.登録日)=DMax("登録日","全社員住所歴マスタ","社員番号 =" & [全社員住所歴マスタ].[社員番号])) AND ((社員マスタ.退職の有無)=False));
[全社員住所歴マスタ].[社員番号]がnullになるレコードがあるのでは?高さに応じて上位置を少し小さくすることになるかと。その辺はトライ&チェックが微調整するしかないかなと思います。
例えばヘッダーや詳細の一番下におきたいときにはどうすればいいのでしょうか?
数値指摘での位置合わせは、どうもその要素の真ん中が基準になっているような、気がします
おー!気が付きませんでした
線に見えるけど細い四角なんですね
調整もしやすそうです!
大変参考になりました!
Accessのレポートで罫線はなかなか難しいですね。
細線とか1ポイントとか設定しても、プリンターによって太さが異なったりします。
直線コントロールの代わりに四角形コントロールで、境界線は透明、背景色を黒にして、高さをいろいろ変更すると細かく調整できます。
下記は、直線コントロールの幅、四角形コントロールの高さを変更したものをプレビューで500%ズームしたもののキャプチャーです。
設計する手間やコード量が増えるという意味です。
再請求や修正・削除が無制限にできるという自由度と引き換えに、作成する時間がかかるし、メンテナンスも大変そうです。
一度、作成してしまえばいいですが。
インボイス制度がもうすぐ始まるそうですが、請求書の発行者もなんからの形で控えを保存しておく必要があるそうです。
下記で議論してますのでご参考に。
請求書をPDFで保存するかどうか Microsoft Access 掲示板 - zawazawa
hirotonさんへ
「クロス集計クエリからレポート印刷」に関して最初の設計図と現状は大幅に変わってしまいました。
アクセスでクロス集計表を作る場合は列と値は1つしか設定できないという認識がありました。
現状は最終的にクロス集計表としての複数の列と値を設定できるようになり求める設計図が大幅に広がってしまいました。
「クロス集計クエリからレポート印刷」というトピックへの書き込みはこれで最後にします。
一か月近い期間のアドバイスありがとうございました。
また機会がありましたらよろしくお願いします。
頭で考えれば単純な処理なんですが体系立てるのはなかなかむずかしいみたいですね
削除請求書番号に記載するにしても、用意したフィールドよりも削除が発生するかもしれない(常識的に考えれば2つも用意すれば十分でしょうけど)といった不安もありますね
履歴テーブルをつくるとそれなりのコストがかかるというのはどういった意味でしょうか?
保存容量や動作の軽さに影響するという意味ですか?
いっそ削除したものは、データベースには残さずに請求書発行時にPDFとして写しを作成し、確認用としてとっておく、とかが楽なのかもしれないと思ってきました
起こる確率の低いイレギュラーなことばかり考えてしまい、全然進まなくなるのが悪い癖ですね
その要件は、昔からなかなか難しい要件の一つです。
いろいろな方法があると思います。
請求した通りに間違いなく、遅れもなく入金してくれれば問題はないのですが、いろいろイレギュラーなことがありますからね。
期限までに入金してくれなかったり、
一部だけ入金してきたり、
まとめて入金してきたり、
たまに、余分に入金してきたり、
・・・
こちら側にも、入力間違いとか、ありますしね。
これらのイレギュラーにも柔軟に対応できるようにするには、ある程度データに冗長性を持たせることになりますね。
自分もそのような設計にすると思います。
あと、入金日も持たせるかな。
期限をすぎても、入金されない場合は、再請求する必要がありますので、
再請求時の請求書番号も必要になりますね。
品番に再請求が発生するなら、別テーブルに履歴として保存しておく必要があるかも知れません。
これは、当然そうすべきでしょうね。
売上テーブルに、請求書番号、削除請求書番号、というフィールドを持たせるか、
別テーブルにして履歴をすべて残すか、ですね。
履歴には上記の再請求も含めて残すといいでしょう。
再請求や修正/削除がどの程度発生するかによってどちらかに決めることになると思います。
別テーブルで履歴を残すというのはそれなりにコストがかかりますので、それに見合うかどうか、検討してください。
区切りをどこで付けるかというのは悩みどころですが、そろそろ質問を分けたほうがよさそうです
当初の質問として
とあり、それに対してデータベース的なアプローチ(クエリ・SQLを駆使してデータ整形)で回答を付けました。ACCESS的なアプローチで連番を振ったり、処理速度的に厳しいところをVBAで対応したりもしましたが、元データに依存するような部分はなかったと思います。
言葉にすると「大きなデータをページ毎のデータに整形する方法」ですね
追加の質問は元データから項目が追加されてきているし、「各ページのデータができた後のレポート表示のしかた」といった感じで最初の質問からは内容が離れてきているので、改めて必要な内容(データ構造、レポートの表示イメージ等)を整理した上で新たな質問にしてください
[テキスト122]~[テキスト125]は適切な名前で運用するか、
[テキスト122]→n0ケース数表示
等、注釈を追記するようにしてください(質問者以外中身のわからないモノでは回答しにくいです)
それと、コードはなるべくコピペで提示するようにしましょう。いろいろ捗ります
コードブロック
下記の MessageBoxTimeoutA を使う方法はどうでしょうか。
自動的にメッセージボックスを閉じるならWSHは使わない!messageboxtimeoutAを使う | タケイチの備忘録
Accessに関する情報交換の掲示板ですが、どの辺がAccessと関係ありますか。
AccessのVBAで実現したいという話ですか。
AccessからWSHを呼び出すという話ですか。
標準モジュールのプロシージャをFunctionにしておけば、
「クリック時」プロパティに
=プロシージャ名()
と設定すれば呼び出せます。
hirotonさんへ
上の書き込みの追加です。
テーブルAにテキスト型の[入荷引当]というフィールドがあります。

0か1の判定があり、0のときは空白で1のときは「予」という文字を合計数量と各店舗の数量の左にいれたいと思っております。
1店舗でも「予」があれば合計数量にも「予」を入れて、1店舗も「予」がなければ合計数量も無しでお願いします。
よろしくお願いします。
もう一度、私の回答をよく読んでください。
とか、
それを理解したうえでどの点に疑問をお持ちですか。
私の場合は、主キーは数値型(あるいはオートナンバー型)以外(テキスト型とか)にしたことはないです。
決めたことがないということは1 10と増えていくということですか?
ソートするとき、も数値系ならご指摘のようにはなりませんか?
私は決めたことがないです。
データ型を数値型にしておいて、
桁数をそれえたいときは、書式プロパティに 0000000 とすれば見た目上そろいますので。
なにかの都合でテキスト型にする必要があるとき(そうすべき合理的な都合は思いつきませんが)、
桁数を揃えておかないと、並び替えのときに想定通りにならないことになります。
例えば1~12までを昇順にすると下記のようになっちゃいます。(それが想定通りならいいですが)
1
10
11
12
2
3
4
5
6
7
8
9
hirotonさんへ
追加アドバイスありがとうございます。
「ケース、バラの算出は[数量]を合計してから機械的にという方法です。」
こちらのやり方で大丈夫です。
無事できましたありがとうございます。
「合計数量の表示をVBAで対応する場合」がおかしくなってしまいました。
2ページ目以降に数量は空白なのですが単位が表示されてしまいます。
レポートは上記のやり方でしてます。



画像貼り付けますのでよろしくお願いします。
情報不足でしたら申し訳ありません。
あ、見落としてました。[合計数量]もケース、バラに分解するんですね。やろうとした感じで出来るはずですがうまくいかないですか?
それと、上記の方法はケース、バラの算出は[数量]を合計してから機械的にという方法です。そうではなく、
例えば
なんてデータの場合、現実に即して数字を出すと
となることが考えられます(バラ数合計がケース入数を超える)。こういう計算をしたいのであれば合計する前の[数量]からケース数、バラ数を算出する必要があります
Int([数量]/[ケース入数]と[数量] Mod [ケース入数])が複数回でてきますが、レポート出力用クエリ「Qレポート出力データ」は集計を使ったクエリなので、これを個別のフィールドに置くことはできません。わかりやすく処理するなら事前にフィールドを作っておく必要があります。ちょうど前段階として「Q出力全ページデータ」があるのでQ出力全ページデータ
とすれば
Qレポート出力データ
と作ることができます
なので、こっちのほうがやりたいことだったかな?
下記はどうでしょうか。
リストボックスで選択された項目を別のリストボックスへ移動する - Accessコントロール
FileCopyステートメントだと、開いているファイルをコピーしようとするとエラーになるようです。
FileSystemObjectを使うとエラーにならずコピーできます。
そうです。Application.CurrentProject.FullNameなどを使ったり、FileCopyステートメントでやってましたがエラーになって四苦八苦しておりました
リンク先をみてもう一度やってみようと思います
ひょっとして、現在開いてるAccessファイル(自分自身のファイル)のバックアップを取りたいということでしょうか。
だとしたら、下記辺りをご参考に。
データベースを開いている状態で自分自身をバックアップする 《FileSystemObject》|Access|ヘルプの森
ファイルコピーは FileCopyステートメントで。
タイムスタンプ文字列はFormat関数とDate関数またはNow関数で生成できます。
上記ヒントでチャレンジしてみてください。簡単ですよ。
hirotonさんへ
素早いアドバイスいつもありがとうございます。
まだ試せていませんので、できましたらまた書き込みさせていただきます。
仰る通りです…(><)
うっかりして見落としてお手を煩わせて申し訳ありません。助かりました!ありがとうございました。
コード全体を提示してもらわないと適切な回答は難しいですが、
提示されている部分だけで推測すると、下記のような感じでしょうか。
レコードは1件のみで、検索終了後はデータはクリアすればいいでしょう。
過去の抽出条件を再利用する可能性があるなら、レコードを追加して利用するのもありです。
開いたときは新規レコードにしておいて、コンボボックスで過去の条件データを選択することも可能にするという設計にしてもいいでしょう。
この計算自体はレポート出力の直前でやればいいですね
レポート出力用のクエリは次のような形になっていると思います
[合計数量]は各商品の全店舗の合計ですね。店舗ごとの数量としては、「(Px,Py)ページの1列目の店舗はf0フィールドの値、その時の数量はn0」のように作っているので、この「n0」に対して計算式を当ててあげればいいです
数値をチェックして必要な時(0より大きいとき)だけ出力すればいいですね
または、レポートに配置したあと書式を設定するでもいいかもしれません
数値フィールドまたは通貨フィールドの書式を設定する
表示できないですが、「
;;」の後に「半角スペース」が入っています。レポートのデザインビューで入力するときは自動整形が働くので、例えば、「
0;;" "」と入力する必要があります。または「0;;」(最後の文字は全角スペース)でもいいでしょうありがとうございます
検索条件用入力用のテーブルのレコードは常に一つということですか?検索のたびに増えていきませんか?
それらのフィールドを元に検索をかけるのですよね?
VBAを使えば可能ですよ。
ラベルとチェックボックスを並べて作成すればできます。
ただ、面倒ですよね。
検索条件用入力用のテーブルを作成して、各フィールドは「複数値フィールド」にすれば、リストからチェックボックスで選択できるUIになります。これを使えば楽できそうですね。
複数値を持つフィールドの作成または削除 - Access