MS Access Tips/Sample and VBA and Blog customize etc...

レポートでガントチャート 名前固定版

レポートでガントチャートのレポートで、名簿の名前は常に表示させておいて、予定がある人だけ時間を表示させることはできますでしょうか?

というようなコメントが付きました。この希望に対応したサンプルを作成しましたので解説を含めて紹介します。

RptGanttChart2.png

ガントチャートだけでなく、日付と名前、支店と商品、など2つのマスターデータの組み合わせで固定表示したい場合のクエリ作成のテクニックの参考にもなると思います。

難易度:

テーブル構成は前回と同じもの(名簿、勤務予定)ですので、上記のURL先を参照ください。

まず、レコードソースとなる日付毎に名前を固定出力するクエリを作成します。

クエリを新規作成して、テーブルの追加で、名簿、勤務予定 のテーブルを追加します。結合はしません。クエリプロパティの「固有の値」を「はい」に設定します。名前は、「Q_日付_名前」とします。

RptGanttChart2_Qry1.png

SQLは下記のようになります。

このように複数のテーブルを結合せずにクエリに含めることを、直積 といい、2つのテーブルのすべての組み合わせが出力されます。例えば、それぞれのテーブルの件数が 5件と4件ならすべての組み合わせの 5×4=20件のデータが出力されます。

さらにクエリを新規作成して、このクエリと「勤務予定」を外部結合させます。下図を参考に2つの結合線で結びます。結合線をダブルクリックして 結合プロパティ を表示させて、「'Q_日付_勤務予定'の全レコードと・・・・・」というオプションを選択します。名前は「Q_勤務予定_名前固定」とします。

RptGanttChart2_Qry2.png

SQLは下記のようになります。

このクエリで勤務予定のデータがあってもなくても、日付毎に名簿の名前が全て表示されます。前回のレポートのレコードソースをこのクエリに変更します。

詳細セクションの印刷時のイベントプロシージャに下記のようにコードを1行追加します。(ハイライト行が追加した行です。)

サンプルMDB が下記からダウンロードできます。
RptGanttChart_07.zip (Access 2007 形式 - 23kb)
RptGanttChart.zip (Access 2002-2003 形式 - 25kb)
RptGanttChart_2k.zip (Access 2000 形式 - 26kb)

拍手する

5 Comments

せと says..."質問です"

いつも参考にさせていただいております。

印刷プレビューのサンプル画像「加藤 泰江」さんの様に、同日に複数のバーがある場合、最後のバー以外は後ろが透過して、時間の点線が見えてしまうのですが、透過しないようにできるのでしょうか。

お時間のある時に回答いただければ、幸いです。

2015.02.18 16:23 | URL | #- [edit]
hatena says..."re: 質問です"

下記のように対処してください。

レポートのデザインビューで、「名簿ID」グループのグループヘッダーを表示させる。
高さは詳細セクションと同じにする。

時刻罫線を引くコードをグループヘッダーの印刷時に移動する。
グループヘッダーのフォーマット時で、Me.MoveLayout = False として印字位置を移動させない。

これでOKです。
レポートのコード全体は下記のようになります。

Option Compare Database
Option Explicit
Const L = 567 * 2 'グラフの左位置 2cm
Const Rng = 567 * 0.95  '1時間の幅 0.95cm

Private Sub グループヘッダー0_Format(Cancel As Integer, FormatCount As Integer)
  Me.MoveLayout = False
End Sub

Private Sub グループヘッダー0_Print(Cancel As Integer, PrintCount As Integer)
Dim i As Long
  Me.DrawStyle = 2
   
  For i = 0 To 24
    Me.Line (L + i * Rng, 0)-(L + i * Rng, 1000)
  Next
End Sub

Private Sub グループヘッダー1_Print(Cancel As Integer, PrintCount As Integer)
Dim i As Long
  '時刻ラベル表示
  For i = 0 To 24
    Me.CurrentY = Me.日付.Top
    Me.CurrentX = L + i * Rng
    Me.Print i
  Next
End Sub

Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
  Me.MoveLayout = False
End Sub

Private Sub 詳細_Print(Cancel As Integer, PrintCount As Integer)
  Me.DrawWidth = 1
  Me.DrawStyle = 6
  Me.FillColor = Me.色
  Me.FillStyle = 0
  Me.Line (L + (Me.開始時刻) * 24 * Rng, 50)-(L + (Me.終了時刻) * 24 * Rng, 330), 0, B

End Sub

2015.02.18 17:34 | URL | #5uE6dEgY [edit]
せと says..."re:re: 質問です"

お礼が遅くなり申し訳ありません。

作業番号を追加し、バー上に表示させていたので大変見やすくなりました。

ありがとうございました。

2015.02.20 13:16 | URL | #- [edit]
はるこ says...""

いつも参考にさせていただいています。
複数のバーがあるなかで、予定の件名表示させたいのですがどうしたらいいでしょうか?

2015.08.02 11:13 | URL | #SQwZReTU [edit]
hatena says..."re:"

> 複数のバーがあるなかで、予定の件名表示させたいのですがどうしたらいいでしょうか?

Lineメソッドでバーを表示していますが、テキストはPrintメソッドで表示できます。

2015.08.04 00:46 | URL | #5uE6dEgY [edit]

Leave a reply






Trackbacks

trackback URL
http://hatenachips.blog34.fc2.com/tb.php/261-14297cbf
該当の記事は見つかりませんでした。