Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Access 2016)
条件に一致したレコードの移動
投稿日時: 19/09/18 12:22:16
投稿者: Manabukunn

いつもお世話になっております。
レコードの移動に関する質問をさせていただきます。
 
 
レコード名      受診日           検査結果
        ________      _________
フィールド名    受診日ID------------------受診日ID
          患者ID          日付
          受診日           結果@
                        結果A
という感じの二つのレコードが受診日IDでリレーションが設定されている状況です。
こちらに関して、この受診日フォーム上のボタンから受診日IDに対応する検査結果を
フォームとして開くように設定されております。
やりたいこととしてはこの検査結果フォームを前後ろに移動する際に
最初に開いた受診日IDに対応する患者IDのものだけで移動(同じ患者の異なる日付)
させてたいと思っておりますがスキル不足でなかなかできません。
解決法よろしくお願いいたします。
 

回答
投稿日時: 19/09/18 15:54:27
投稿者: sk

引用:
レコード名      受診日           検査結果
        ________      _________
フィールド名    受診日ID------------------受診日ID
          患者ID          日付
          受診日           結果@
                        結果A
という感じの二つのレコードが受診日IDでリレーションが設定されている状況です。

テーブル[受診日]とテーブル[検査結果]は共にフィールド[受診日ID]を主キーとし、
[受診日]を主テーブル、[検査結果]を従属テーブルとして 1対1 の関係にある、
ということでしょうか。
 
引用:
こちらに関して、この受診日フォーム上のボタンから受診日IDに対応する
検査結果をフォームとして開くように設定されております。

テーブル[受診日]をレコードソースとする連結フォーム[受診日フォーム]と
テーブル[検査結果]をレコードソースとする連結フォーム[検査結果フォーム]がある、
ということでしょうか。
 
それとも、[検査結果フォーム]のレコードソースはテーブル[検査結果]ではなく、
[受診日]と[検査結果]を[受診日ID]同士で内部結合した選択クエリなのでしょうか。
 
引用:
やりたいこととしてはこの検査結果フォームを前後ろに移動する際に
最初に開いた受診日IDに対応する患者IDのものだけで移動(同じ患者の異なる日付
させてたいと思っておりますがスキル不足でなかなかできません。

[患者ID]を主キーとする[患者名簿]に相当するテーブルは
定義されていないのでしょうか。

投稿日時: 19/09/18 21:11:06
投稿者: Manabukunn

説明が悪くてすみません;;

引用:
テーブル[受診日]とテーブル[検査結果]は共にフィールド[受診日ID]を主キーとし、
[受診日]を主テーブル、[検査結果]を従属テーブルとして 1対1 の関係にある、
ということでしょうか。

 
その通りで1対1の関係にあります。
一つのテーブルにしようかとも思ったのですが1つの受診日IDに対する入力項目が多いので
グループごと(身体所見、検査結果など)に分類しました。
 
引用:
テーブル[受診日]をレコードソースとする連結フォーム[受診日フォーム]と
テーブル[検査結果]をレコードソースとする連結フォーム[検査結果フォーム]がある、
ということでしょうか。
  
それとも、[検査結果フォーム]のレコードソースはテーブル[検査結果]ではなく、
[受診日]と[検査結果]を[受診日ID]同士で内部結合した選択クエリなのでしょうか。

 
こちらに関して選択クエリではなくてただ単に同じ受診日IDのものを開く
 
Private Sub Form_Load()
dateID = Forms!受診日!受診日ID
Me.Recordset.FindFirst "受診日ID = " & dateID
end sub
 
のような感じで開いています。
 
 
 
引用:
[患者ID]を主キーとする[患者名簿]に相当するテーブルは
定義されていないのでしょうか。

 
おっしゃる通り患者名簿に相当する患者IDを主キーとする大本のテーブルが存在しており
1対多の関係で受診日テーブルとリレーションが組んであります。
 
説明不足で申し訳ございませんでした。
宜しくお願い致します。

回答
投稿日時: 19/09/19 10:10:40
投稿者: sk

引用:
その通りで1対1の関係にあります。
一つのテーブルにしようかとも思ったのですが1つの受診日IDに対する入力項目が多いので
グループごと(身体所見、検査結果など)に分類しました。

ではまず、次のような選択クエリを新規作成して下さい。
 
( SQL ビュー)
--------------------------------------------------------------------
SELECT [検査結果].[受診日ID], 
       [検査結果].[日付], 
       [受診日].[患者ID], 
       [検査結果].[結果@], 
       [検査結果].[結果A] 
FROM [受診日] 
INNER JOIN [検査結果] 
ON [受診日].[受診日ID] = [検査結果].[受診日ID] 
ORDER BY [検査結果].[受診日ID];
--------------------------------------------------------------------
 
引用:
おっしゃる通り患者名簿に相当する患者IDを主キーとする大本のテーブルが存在しており
1対多の関係で受診日テーブルとリレーションが組んであります

必要に応じて、そのテーブルと[受診日]を[患者ID]同士で結合し、
前者から任意のフィールド(患者の氏名など)を参照するように
してもよいでしょう。
 
引用:
こちらに関して選択クエリではなくてただ単に同じ受診日IDのものを開く

作成した選択クエリが正常に実行されることを確認したら、
[検査結果フォーム]のレコードソースをテーブル[検査結果]ではなく、
その選択クエリに変更して下さい。
 
引用:
この受診日フォーム上のボタンから受診日IDに対応する検査結果を
フォームとして開くように設定されております。

引用:
Private Sub Form_Load()
dateID = Forms!受診日!受診日ID
Me.Recordset.FindFirst "受診日ID = " & dateID
end sub

更に、フォーム[受診日]上に配置されている、[検索結果フォーム]を開くための
コマンドボタンの Click イベントで実行されるイベントプロシージャを
次のようなコードに書き換えてみて下さい。
 
(フォーム[受診日]のフォームモジュール)
--------------------------------------------------------------------
Private Sub コマンドボタン名_Click()
     
    Dim strWhere As String
     
    If Nz(Me![受診日ID], "") = "" Then
        MsgBox "受診日IDが入力されていません。", _
               vbExclamation, _
               "入力エラー"
        Exit Sub
    End If
     
    If DCount("*", "検査結果", "[受診日ID]=" & Me![受診日ID]) = 0 Then
        MsgBox "受診日ID " & Me![受診日ID] & " に該当する検査結果の記録がありません。", _
               vbInformation, _
               "該当データなし"
        Exit Sub
    End If
     
    If Nz(Me![患者ID], "") <> "" Then
        '[患者ID]のデータ型が数値型である場合
        strWhere = "[患者ID]=" & Me![患者ID]
     
        '[患者ID]のデータ型がテキスト型である場合
        'strWhere = "[患者ID]='" & Me![患者ID] & "'"
    End If
     
    DoCmd.OpenForm "検索結果フォーム", acNormal, , strWhere
 
End Sub
--------------------------------------------------------------------
(オブジェクト/フィールド/コントロールの名前は適宜修正すること)
 
要点は次の 2 つです。
 
・[検索結果フォーム]のレコードソースに[患者ID]が含まれるようにする。
 
・その上で、OpenForm メソッドによって[検索結果フォーム]を開く際に、
 第 4 引数 WhereCondition に、[患者ID]に対する抽出条件式を渡すようにする。
 (これにより、フォームが開かれる際にフォームフィルターが適用される)

投稿日時: 19/09/20 18:01:25
投稿者: Manabukunn

わかりやすい回答ありがとうございました。
 

引用:
[検索結果フォーム]のレコードソースに[患者ID]が含まれるようにする。

 
確かにこれで解決できることを学びました有難うございました。
 
今回は実は、受診日のテーブルをもとにした帳票フォーム選択されている受診日の検査結果テーブルを
開くという感じで作成しておりました。この検査結果テーブルをもとにして検査結果フォームは
入力用と閲覧用(データの修正も行う)の両方を兼ねて作成しておりました。
このため、内部結合すると修正したデータが元のテーブルに反映されないとすると
もともとのテーブルに患者IDも含めてしまう他ないのでしょうか・・・
何度も申し訳ありませんがよろしくお願いいたします。

回答
投稿日時: 19/09/24 09:18:33
投稿者: sk

引用:
今回は実は、受診日のテーブルをもとにした帳票フォーム選択されている
受診日の検査結果テーブルを開くという感じで作成しておりました。
この検査結果テーブルをもとにして検査結果フォームは
入力用と閲覧用(データの修正も行う)の両方を兼ねて作成しておりました。
このため、内部結合すると修正したデータが元のテーブルに反映されないとすると
もともとのテーブルに患者IDも含めてしまう他ないのでしょうか・・・

前述した選択クエリのレコードに対する編集結果は
[検査結果](や[受診日])にも反映されますが、
具体的に何を問題視されているのでしょうか。

投稿日時: 19/09/27 18:44:18
投稿者: Manabukunn

skさんいろいろとありがとうございました。
クエリの結果が元のテーブルに反映されることを
お恥ずかしながら知りませんでした^^;
内部結合のクエリを作成して
やってみます。
ありがとうございました。
今後ともよろしくお願いいたします。