Microsoft Access 掲示板

レポート作成、定価の表示

9 コメント
views
4 フォロー

先日より相談させていただいていた、見積書レポートを作成しはじめて、なかなか苦戦しております。

①枠線がきれいにいかない
⇒通常の線を透明に設定し、「枠線」で対応していたら、線の太さにばらつきがあったり、いまいちきれいにしあがらないため、「直線」で対応したところ、行が2行になった時自動で対応してくれません…何か良い方法はありませんでしょうか。
(17:34追記)横は直線、縦は枠線で対応しました。枠線がイマイチきれいにいったりいかなかったり…私だけでしょうか。

②グループが2重にあり、小計を出しています。(Aレベルグループ、Bレベルグループとする)
Aレベルのグループの中にBレベルが複数ある場合は両方の小計を出したいですが、Aレベルの中にBレベルが1個しかないときは小計が同じになってしまうので、Aレベルだけの小計で良いと思っています。Bレベルの小計の表示の場合分けは可能でしょうか…。

ポンタ
作成: 2020/11/03 (火) 17:07:04
最終更新: 2020/11/03 (火) 17:35:29
通報 ...
1
hiroton 2020/11/04 (水) 12:34:29 73b0a@f966d

②グループが2重にあり、小計を出しています。

Bレベルグループの数を事前に数えておいてAレベルグループのヘッダーで表示の切り替えをすればよさげ

Private Sub Aグループヘッダー_Format(Cancel As Integer, FormatCount As Integer)
    Me.Bグループフッター.Visible = Me!グループカウント <> 1
End Sub
2

①枠線がきれいにいかない

枠線に関しては、私は使ってないので分かりません。
枠線が実装される前から、直線コントロールかLineメソッドで罫線は引いていたので、ずっとその方法を使ってます。
境界線で罫線を引くと横罫線の太さが違ったりしたことがあったので上記の方法をとってます。

私もhirotonさんの回答の方法にすると思いますが、Bレベルグループの数を事前に数えておくというのがちょっと難しいですね。

Aグループ、Bグループでグループ化した集計クエリ、あるいは固有の値をはいにしたクエリを作成。
そのクエリからさらにAグループでグループ化、Bグループをカウントする集計クエリを作成。
このクエリをレポートのレコードソースのクエリに追加して、Aグループのキーフィールドで結合することになりますね。

3
hiroton 2020/11/04 (水) 14:05:23 73b0a@f966d >> 2

グループのカウントはそんな感じですね。SQLの知識的なのは人に寄りけりってことでとりあえず回答に含めない感じでした

別案としては[page]使って事前にformat走らせて自前でカウントするなんてのも考えたんですが、レポートの印刷の都合考える必要ないんでクエリで事前に計算させとくのが楽だろうなとも

4
hatena 2020/11/04 (水) 14:47:46 修正

簡単に実現できる方法を思いつきました。

各グループの小計はグループフッターセクションで表示しているとします。
それぞれのグループの小計を表示しているテキストボックス名を、
A小計、B小計 とします。

Bグループのフッターセクションのフォーマット時に下記のように記述します。

Private Sub グループフッター3_Format(Cancel As Integer, FormatCount As Integer)
    Cancel = (Me.A小計 = Me.B小計)
End Sub

要は、Aグループ内のBグループ数が1件ならA小計とB小計は同じになります。同じものを表示するのは無駄だということですよね。
同じなら、Cancel を True にしてそのセクションの出力をキャンセルしてます。

グループ内で集計テキストボックスを参照するとそのグループ内での集計値が取得できますので上記のコードでうまくいきます。

もし、マイナスの集計があり、たまたまA小計とB小計が同じになる可能性かあるなら、=Count(*) で件数を表示させるテキストボックスを配置しておいてそれを比較するようにすればいいでしょう。

6
hiroton 2020/11/05 (木) 08:27:04 修正 b95b2@f966d >> 4

これすごいですねぇ。試してみたら確かにBグループのフッターのformatイベントでAグループのフッターの小計が取れました。Aグループのフッターのformatイベント入る前なのでどうかと思ってたんですが計算自体は終わってる上にちゃんと自分のグループの数値が取れるんですね

テストデータ

IDABn
1A1
2A10
3B1
4B10
5C100
6D1000
7D10000
8E1
9E10

レポートのグループ化の設定
グループ化:A、フッターにテキストボックス[A小計](=Sum([n]))
└グループ化:B、フッターにテキストボックス[B小計](=Sum([n]))

テストコード

Private Sub Aグループフッター_Format(Cancel As Integer, FormatCount As Integer)
    Debug.Print "AFooter", Me!A小計
End Sub

Private Sub Bグループフッター_Format(Cancel As Integer, FormatCount As Integer)
    Debug.Print Me!ID, Me!A小計, Me!B小計
End Sub

出力結果

 1             11            11 
AFooter        11 
 3             11111         11 
 5             11111         100 
 6             11111         11000 
AFooter        11111 
 8             11            11 
AFooter        11 

※未出力のフッターの集計がきちんととれてる(Me!A小計)
※レコードの参照はグループの最後のレコードっぽい(並び順指定してなかったらIDはなぜか降順に・・・)

7
hatena 2020/11/05 (木) 09:54:12 修正 >> 6

グループヘッダーに集計用テキストボックス=Sum()=Count()を置いた場合でもちゃんとグループ内の集計が取得できますので、formatイベントに関係なくグループ全体の集計をしているみたいですね。

ちなみに詳細セクションに集計関数を置くと全体の修正をするようです。一番目のレコードでも全体集計になります。

8
ポンタ 2020/11/05 (木) 16:45:35 0029a@1c915 >> 6

こちらの方法で1回うまくいったと思っていたのですが、「nullの値が不正です」との警告が出て、固まるようになりました。なにか間違っているのでしょうか…

9
ポンタ 2020/11/05 (木) 20:23:38 0029a@1c915 >> 6

ケアレスミスしてました…うまくいきました。

Private Sub グループフッター3_Format(Cancel As Integer, FormatCount As Integer)


If IsNull(Me.グループA) Or IsNull(Me.グループB) Then
Else
Cancel = (Me.グループA = Me.グループB)
End If
End Sub
5
ポンタ 2020/11/04 (水) 15:46:28 0029a@1c915

おっしゃるとおり、「Bレベルグループの数を事前に数えておく」ところでひっかかってしまい、後回しにしていました。
いずれも教えていただき助かりました。
hiroton様、hatena様、ありがとうございました!