こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

access2003 レポートの表示について教えて下さい

初心者なのですが どうぞ宜しくお願い致します。
accessに挑戦しているのですが判らないことが沢山あるので
お手すきの方 助言お願いいたします。

まず、やりたい事をのべます。
歯科医院での使用目的です。
1.カルテ番号を入力すると患者情報が出てきて
2.各歯科衛生士が毎日の作業(処置内容)を入力していきます。
 (内容は衛生士ID、処置ID、処置日)
3.患者は月に2回来る事もあるのでデータの上書きではなく蓄積させ
4.毎月締め日に各衛生士ごとの処置一覧をレポートで出したい。

それにあたり今現在進めている作業は以下です。
[テーブル]
「患者情報」
 カルテ番号、患者氏名、フリガナ、生年月日、性別
 データはすべてインポート済みです。レコードは5000程です。
「衛生士マスタ」
 衛生士ID、衛生士名前
 3人いるので 3レコード作ってあります。
「処置内容マスタ」
 処置ID、処置内容
 3種あるので 3レコード作ってあります。
「処置履歴」
 処置履歴ID(オートナンバー)、カルテ番号、衛生士ID、処置ID、処置日
 データを蓄積させる為のテーブル

[クエリ]
 カルテ番号で患者情報を呼び出すための「患者情報クエリ」作成
SELECT 患者情報.患者番号, 患者情報.患者氏名, 患者情報.フリガナ, 患者情報.生年月日, 患者情報.性別
FROM 患者情報
WHERE (((患者情報.患者番号)=[カルテ番号を入力して下さい]));

期間抽出のための「処置履歴 期間抽出」作成
SELECT 処置履歴.処置日, 処置履歴.処置ID, 処置履歴.衛生士ID
FROM 処置履歴
WHERE (((処置履歴.処置日) Between [forms]![期間抽出フォーム]![期間自] And [forms]![期間抽出フォーム]![期間至]));

 レポートで表示させるカウントのための「処置履歴クロス集計」作成
TRANSFORM Count(処置履歴.処置履歴ID) AS 処置履歴IDのカウント
SELECT 処置履歴.衛生士ID, Count(処置履歴.処置履歴ID) AS [合計 処置履歴ID]
FROM 処置履歴
GROUP BY 処置履歴.衛生士ID
PIVOT 処置履歴.処置ID;



と、長くなりましたが ここまで完成しています。

先にも記述しました
4.毎月締め日に各衛生士ごとの処置一覧をレポートで出したい。
で悩んでいます。

最終的には↓の様に出力したいのです。

 処置レポート   2009/01/21~2009/02/20
---------------------------------------------------------
 衛生士ID     処置A    処置B    処置C
---------------------------------------------------------
 1.山田       5      5      6

 2.鈴木       8      10      4

 3.田中       0      3      20

           ↑      ↑     ↑は合計数です。



[レポート]
1.ウィザードを使って「クロス集計クエリ」を元に作成しました。
(現在のところ)衛生士3人、処置内容3つですが
試しに 衛生士、処置内容とも 1つ増やしてみました。
もちろん「クロス集計クエリ」には新しいナンバーが反映されてましたが
レポートには最初に作ったままの3人、3項目しか表示されず
悩んでいます。

2.レポート表示の際に 衛生士の名前、処置の名前を自動的に
反映させたいのですが(今は各ID番号のみ表示されてます)
どうすればいいでしょうか?

追加:
3.今気づいたのですが、期間抽出のフォームがうまく作動していません。データに無い日付を入れても全データを集計して出してきています。
Between~ が間違っているのでしょうか?

大変長くなり、説明もわかりにくいと思いますが
どなたか 超初心者の私に 噛み砕いて助言いただけたら幸いです。
どうぞ 宜しくお願い致します。

投稿日時 - 2009-09-07 19:29:18

QNo.5270781

困ってます

質問者が選んだベストアンサー

(1)>レポートには最初に作ったままの3人、3項目しか表示されず
レポート作り直していなければ当然、そうなります。
ウィザード実行時点で、項目が3個しかないなら、レポートも
コントロールが3個しか出来ません。これは静的に確定するので、
元のクエリのフィールド数が増えようが、減ろうが関係ありません。

(2)>衛生士の名前、処置の名前を自動的に反映させたい
クロス集計クエリに次の操作を行う。
I.衛生士マスタ、処置内容マスタを追加する。
II.処置履歴の衛生士IDと衛生士マスタの衛生士IDを結合する。
  ドラッグ&ドロップでやる方法を知ってますよね。
III.同じく、処置履歴の処置IDと処置内容マスタの処置IDを結合する。
IV.クロス集計クエリの変更
処置履歴.衛生士ID→衛生士マスタ.衛生士名前
処置履歴.処置ID→処置内容マスタ.処置内容

(3)>期間抽出のフォームがうまく作動していません
よく分からないが、日付が未入力だった場合とかの処理はどのように
なっていますか?掲題のSQLでは未入力には対応できませんね。
WHERE 処置履歴.処置日 BETWEEN
Format(IIf(IsNull([forms]![期間抽出フォーム]![期間自])
,Now,[forms]![期間抽出フォーム]![期間自]),"\#YYYY/MM/DD\#")
AND
Format(IIf(IsNull([forms]![期間抽出フォーム]![期間至])
,Now,[forms]![期間抽出フォーム]![期間至]),"\#YYYY/MM/DD\#")
こんな感じかな?

投稿日時 - 2009-09-08 13:45:29

補足

大変丁寧なご教授、ありがとうございます。

早速やってみました。
そこで2点程質問なのです。

(1)>これは静的に確定するので、
元のクエリのフィールド数が増えようが、減ろうが関係ありません。
ですが、ではレポートは毎度作り変えないといけないのでしょうか?
それとも自動的に反映させるにはクエリの作り方が違うのでしょうか?

(3)掲載いただいたままコピペしてみたのですが

式が正しく入力されていないか、複雑すぎるために評価できません。たとえば、数式に複雑な要素が多すぎます。変数に式の一部を割り当て、式を簡単にしてください。

と出てきました。
カンマやスペースで、ひっかかっているのでしょうか?
構文の意味を理解出来てない上に間違い探しみたいで白旗です。
何度も申し訳ありませんが
時間がありましたら 回答の程 宜しくお願い致します。

投稿日時 - 2009-09-08 19:18:32

ANo.1

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

>レポートは毎度作り変えないといけないのでしょうか?
そうです。
我々ですと、印刷せずにExcelなどにExportします。Accessは無理
でもExcelは使えるという人は多いし、ExcelプレインストールPCも
多いですからね。「あとは勝手に」という感じです。

>掲載いただいたままコピペしてみたのですが
ちょっと参考に書いただけです。本当はレポートを開く時の処理で、
レポートのRecordSourceを動的に書き換えるのが本当の方法です。

Private Sub Report_Open(Cancel As Integer)
Dim 画, 自 As String, 至 As String, SQL As String

On Error Resume Next
Set 画 = Forms("期間抽出フォーム")
SQL = Err.Description
On Error GoTo 0
If SQL <> "" Then
  MsgBox "期間抽出フォームが開いていません", vbCritical, "エラー"
  Cancel = True
  Exit Sub
End If

自 = Trim(Format(画.期間自, "@"))
If 自 <> "" Then
  If Not IsDate(自 & " 00:00:00") Then
    MsgBox "期間自が不正です。", vbCritical, "エラー"
    Cancel = True
    Exit Sub
  End If
End If
至 = Trim(Format(画.期間至, "@"))
If 至 <> "" Then
  If Not IsDate(至 & " 00:00:00") Then
    MsgBox "期間至が不正です。", vbCritical, "エラー"
    Cancel = True
    Exit Sub
  End If
  If 自 <> "" Then
    If CDate(自) > CDate(至) Then
      MsgBox "期間自>期間至です。", vbCritical, "エラー"
      Cancel = True
      Exit Sub
    End If
  End If
End If
SQL = "TRANSFORM Count(A.処置履歴ID)"
SQL = SQL & " SELECT B.衛生士名前"
SQL = SQL & ",Count(A.処置履歴ID) AS 件数"
SQL = SQL & " FROM (処置履歴 AS A"
SQL = SQL & " INNER JOIN 衛生士マスタ AS B"
SQL = SQL & " ON A.衛生士ID=B.衛生士ID)"
SQL = SQL & " INNER JOIN 処置内容マスタ AS C"
SQL = SQL & " ON A.処置ID=C.処置ID"
If 自 <> "" Or 至 <> "" Then
  SQL = SQL & " WHERE A.処置日"
  If 自 <> "" Then
    If 至 <> "" Then
      SQL = SQL & " BETWEEN "
      SQL = SQL & Format(CDate(自), "\#YYYY/MM/DD\#")
      SQL = SQL & " AND "
      SQL = SQL & Format(CDate(至), "\#YYYY/MM/DD\#")
    Else
      SQL = SQL & ">="
      SQL = SQL & Format(CDate(自), "\#YYYY/MM/DD\#")
    End If
  Else
    SQL = SQL & "<="
    SQL = SQL & Format(CDate(至), "\#YYYY/MM/DD\#")
  End If
End If
SQL = SQL & " GROUP BY A.衛生士ID"
SQL = SQL & " PIVOT C.処置内容"
Me.RecordSource = SQL
End Sub

但し、SQLの項目名とレポートのコントロールソースが合っていない
ので、一度、上記クエリ(RecordSourceに代入直前のSQL)を元に
レポートを作り直してください。

投稿日時 - 2009-09-08 23:36:22

お礼

回答ありがとうございます。
大変丁寧にかつ詳細に記載頂きましたが
何が何だか全く判らない始末です。
申し訳ありません。

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

投稿日時 - 2009-09-09 15:10:45

あなたにオススメの質問