アプリ版:「スタンプのみでお礼する」機能のリリースについて

Access2013です。
レポートにて、最終集計ではなく、8行ごとに(8レコードごと)に集計を出したいのですが、どうしたら実現できますか?
8行ごとに8行分の集計を繰り返し、最後は8行で割り切れない場合は、8行に満たない行数での集計になる事もあります。
実現方法を教えてください。
宜しくお願いします。

質問者からの補足コメント

  • 本当にありがとうございます。
    説明不足ですみません。

    現状の説明です。
    製品情報、加工数等を抜き出している選択クエリから
    さらに抜き出した選択クエリ1を作成してあります。

    エクセルに、製品の加工単価が入力されているので、そのエクセルとの
    リンクテーブル1を作成してあります。

    選択クエリ1とリンクテーブル1で、選択クエリ2を作成し
    レコードごとに単価×数量=金額を計算させて
    選択クエリ2の金額フィールドに表示しています。

    現在、そのクエリの結果をフォームにし印刷しています。
    印刷対象のフィールド数は13あります。
    その中の金額フィールドの8行ごとの集計が対象です。

    私自身がVBAは初心者レベルなので、お答え頂いた
    コードを、何とか利用してみようと試みましたが
    うまくできませんでした。

    ご教授頂いたコードを生かし結果をえるには
    どこをどう変えればいいでしょうか?

    No.1の回答に寄せられた補足コメントです。 補足日時:2015/07/06 11:35
  • SELECT Q_本日出荷.順番, Q_本日出荷.出荷日, Q_本日出荷.[客先], Q_本日出荷.依頼№, Q_本日出荷.品番, Q_本日出荷.製品名, Q_本日出荷.[ロット№], Q_本日出荷.本日出荷数, [客先取扱商品単価表].単価, IIf(Int([計算上金額])=[計算上金額],[計算上金額],Int([計算上金額]+1)) AS 金額, Q_本日出荷.返却・修正, Q_本日出荷.完納, Q_本日出荷.完納時出荷数, [本日出荷数]*[単価] AS 計算上金額
    FROM Q_本日出荷 INNER JOIN 客先取扱商品単価表 ON Q_本日出荷.品番 = [客先取扱商品単価表].品番
    WHERE (((Q_本日出荷.[客先])=True))
    ORDER BY Q_本日出荷.製品名 DESC;

    メーカー名は客先に変更しました
    印刷は、ズラッと行って、8行ごと小計でOKです

      補足日時:2015/07/06 14:03
  • SELECT Q_本日出荷.順番, Q_本日出荷.出荷日, Q_本日出荷.[客先], Q_本日出荷.依頼№, Q_本日出荷.品番, Q_本日出荷.製品名, Q_本日出荷.[ロット№], Q_本日出荷.本日出荷数, [客先取扱商品単価表].単価, IIf(Int([計算上金額])=[計算上金額],[計算上金額],Int([計算上金額]+1)) AS 金額, Q_本日出荷.返却・修正, Q_本日出荷.完納, Q_本日出荷.完納時出荷数, [本日出荷数]*[単価] AS 計算上金額
    FROM Q_本日出荷 INNER JOIN 客先取扱商品単価表 ON Q_本日出荷.品番 = [客先取扱商品単価表].品番
    WHERE (((Q_本日出荷.[客先])=True))
    ORDER BY Q_本日出荷.製品名 DESC;

    メーカー名は客先に変更しました
    印刷は、ズラッと行って、8行ごと小計でOKです

    No.2の回答に寄せられた補足コメントです。 補足日時:2015/07/06 22:15

A 回答 (3件)

下準備。


T1workテーブルを作成します。クエリ2のフィールドにIDフィールドを加えます。
ID   長整数型
順番,
出荷日,
客先,
依頼№,
品番,
製品名,
ロット№,
本日出荷数,
単価,
金額,
返却・修正,
完納,
完納時出荷数,
計算上金額
ID以外のデータ型やフィールドサイズはオリジナルと合わせてください。
主キーの設定やインデックスの設定は不要です。
※返却・修正フィールドの・中黒はAccessが誤動作しますから止めておくべきです。
下記コードではそのままにしています。
また、機種依存文字の№も同様です。

T1workテーブルを元にレポートを作成します。並び順にはIDを指定。

>現在、そのクエリの結果をフォームにし印刷しています。
フォームにコマンドボタンを置いて印刷するようにします。

Private Sub CMDテスト_Click()
  Const rowNum As Long = 8 '←ひと区切りの行(レコード)数をここで指定
  Dim DB As Database
  Dim RsFrom As DAO.Recordset, RsTo As DAO.Recordset
  Dim i As Long, j As Long, smallSum As Double
    
  Set DB = CurrentDb
  DB.Execute "DELETE * FROM T1work" '既存レコード消去
  Set RsFrom = Me.Recordset.Clone
  Set RsTo = DB.OpenRecordset("T1work", dbOpenTable, dbDenyRead, dbPessimistic)
  
  Do Until RsFrom.EOF
    i = i + 1
    j = j + 1
    RsTo.AddNew
    RsTo!ID = j
    RsTo!順番 = RsFrom!順番
    RsTo!出荷日 = RsFrom!出荷日
    RsTo!客先 = RsFrom!客先
    RsTo!依頼№ = RsFrom!依頼№
    RsTo!品番 = RsFrom!品番
    RsTo!製品名 = RsFrom!製品名
    RsTo!ロット№ = RsFrom!ロット№
    RsTo!本日出荷数 = RsFrom!本日出荷数
    RsTo!単価 = RsFrom!単価
    RsTo!金額 = RsFrom!金額
    RsTo![返却・修正] = RsFrom![返却・修正]
    RsTo!完納 = RsFrom!完納
    RsTo!完納時出荷数 = RsFrom!完納時出荷数
    RsTo!計算上金額 = RsFrom!計算上金額
    
    smallSum = smallSum + RsFrom!金額
    RsTo.Update
    RsFrom.MoveNext
    
    If i Mod rowNum = 0 Then '小計行挿入
      RsTo.AddNew
      j = j + 1
      RsTo!ID = j
      RsTo!製品名 = "【 小 計 】"
      RsTo!金額 = smallSum
      RsTo.Update
      smallSum = 0
    End If
  Loop
 
  If i Mod rowNum <> 0 Then
    RsTo.AddNew
    j = j + 1
    RsTo!ID = j
    RsTo!製品名 = "【 小 計 】"
    RsTo!金額 = smallSum
    RsTo.Update
  End If
 
  RsFrom.Close: Set RsFrom = Nothing
  RsTo.Close: Set RsTo = Nothing
  Set DB = Nothing
  
  DoCmd.OpenReport "レポート名", acViewPreview
End Sub

でどうですかね?
    • good
    • 1
この回答へのお礼

nicotinismさん、ありがとうございます。
しっかり表示されました。
私の分かりにくい説明でお手数をおかけしました事を、お詫び申し上げます。
本当にありがとうございました。

お礼日時:2015/07/08 00:10

なにやらややこしそうですね。


フォームのレコードソースに指定してある『選択クエリ2』
(レポートに使用したいクエリ)のSQL文を載せられますか?

特に大事なのは並び替えの指定がどうなっているかです。
前回回答でORDER BY 句の指定をしていませんでしたので
異なる環境で実行した場合に並び順が違ってくる危険性が大でした。
並び順にこだわらなく、とにかく8行ごとなら考える必要はありません。

再確認ですが、レポートの1ページに8行表示し末行に小計・・・ではなく
1ページに2・30行ずらっと印刷し8行ごとに小計行を挟み込む
(前回回答の最後のイメージ)で良いのですよね。
この回答への補足あり
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2015/07/08 00:11

べたな方法ですが出力用のワークテーブルに書き出して


それをレポートのレコードソースにする方が簡単でしたので。

そちらの情報が全くないので適当に
元テーブル名をT1とします。
FF1 | FF2
1  | ABC
2  | BBC
3  | AAA
4  | B
5  | FF
6  | GG
だとしてFF1の小計を出力用に取ることにします
ワークテーブルのフィールドを、FF1|FF2|順番とします。
ワークテーブル名はT1work
標準モジュールに

Sub FillTable()
  Dim DB As Database
  Dim RsFrom As DAO.Recordset
  Dim RsTo As DAO.Recordset
  Dim i As Long, j As Long, smallSum As Double
  Const rowNum As Long = 3 '←ひと区切りの行(レコード)数をここで指定
  
  Set DB = CurrentDb
  DB.Execute "DELETE * FROM T1work" '既存レコード消去
  Set RsFrom = DB.OpenRecordset("SELECT * FROM T1", dbOpenSnapshot)
  Set RsTo = DB.OpenRecordset("T1work", dbOpenDynaset)
  
  Do Until RsFrom.EOF
    i = i + 1
    If i Mod rowNum <> 0 Then
      RsTo.AddNew
      j = j + 1
      RsTo!順番 = j
      RsTo!FF1 = RsFrom!FF1
      RsTo!FF2 = RsFrom!FF2
      smallSum = smallSum + RsFrom!FF1
      RsTo.Update
      RsFrom.MoveNext
    Else
      RsTo.AddNew
      j = j + 1
      RsTo!順番 = j
      RsTo!FF1 = RsFrom!FF1
      RsTo!FF2 = RsFrom!FF2
      smallSum = smallSum + RsFrom!FF1
      RsTo.Update
      
      RsTo.AddNew
      j = j + 1
      RsTo!順番 = j
      RsTo!FF2 = "小計"
      RsTo!FF1 = smallSum
      RsTo.Update
      
      smallSum = 0
      RsFrom.MoveNext
    End If
  Loop
  
  If i Mod rowNum <> 0 Then
    RsTo.AddNew
    j = j + 1
    RsTo!順番 = j
    RsTo!FF2 = "小計"
    RsTo!小計 = smallSum
    RsTo.Update
  End If
  
  RsFrom.Close: Set RsFrom = Nothing
  RsTo.Close: Set RsTo = Nothing
  Set DB = Nothing
End Sub

とすればT1workは
FF1 | FF2| 順番
1  | ABC| 1
2  | BBC| 2
3  | AAA| 3
6  |小計 | 4
4  | B | 5
5  | FF | 6
6  | GG | 7
15  |小計 | 8
となりますので[順番]で並べ替えて出力するように設定すればおしまい。
クエリの場合も考え方は一緒です。
この回答への補足あり
    • good
    • 2
この回答へのお礼

ありがとうございます。

お礼日時:2015/07/08 00:12

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す