Access (一般機能)

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

 
(Windows 10 Home : Microsoft 365)
サブフォームのデータ表示
投稿日時: 23/05/13 23:56:27
投稿者: Watanabe-45

メインフォームとサブフォームをリンク親子フィールドでつなげています。
メインフォームを単票フォーム、サブフォームをデータシートフォームとしています。
 
現状はメインフォームのレコードを移動させるとデータシートのレコードもあわせて同じレコードのみが表示されています。
 
やりたかったことは、サブフォーム(データシートフォーム)はすべてのテーブルのレコードを表示させてメインフォーム(単票フォーム)のレコード移動にあわせてサブフォームのレコードを移動させてたいです。
 
分割フォームサブフォームでなく、分割フォームにすればよいのですが、サブフォームに書式設定を使用しているため、このような形で作成したいです。
 
 

回答
投稿日時: 23/05/14 17:34:42
投稿者: hatena
投稿者のウェブサイトに移動

メインフォームとサブフォームのレコードソースは同じテーブル(クエリ)ということですか。
 
だとしたら、まずは、リンク親子フィールドの設定は削除してください。(これは一対多関係のテーブルの場合に設定するものです。)
 
そのうえでメインフォームの読み込み時のイベントプロシージャを下記のように記述すれば、メインフォームとサブフォームのレコードは同期します。
 

Private Sub Form_Load()
    Set Me.サブフォームコントロール名.Form.Recordset = Me.Recordset
End Sub

 
「サブフォームコントロール名」の部分は実際のコントロール名にしてください。
 

投稿日時: 23/05/14 20:17:11
投稿者: Watanabe-45

hatenaさん
 
コメントありがとうございます。
同じレコード表示を表示することができました。
ありがとうございました。
 

投稿日時: 23/05/14 21:36:39
投稿者: Watanabe-45

hatenaさん
 
度々申し訳ございません。
メインフォームとサブフォームの同期をすることはできたのですが、サブフォームにてデータ修正やデータを追加するとエラーメッセージがでてしまい修正等をするととができません。
 
Update または CancelUpdate メソッドには、対応する AddNew または Edit メソッドが必要です。 (エラー 3020)
 
回避する方法があれば教えてください。
 

回答
投稿日時: 23/05/15 10:43:07
投稿者: hatena
投稿者のウェブサイトに移動

サブフォームでも更新したい場合は、読み込み時のイベントプロシージャは削除して下記のように各フォームのレコード移動時のイベントプロシージャを設定してください。
 
メインフォームのレコード移動時

Private Sub Form_Current()
    If Me.NewRecord Then
        Me.FSub.Form.Recordset.AddNew
    Else
        Me.FSub.Form.Recordset.AbsolutePosition = Me.CurrentRecord - 1
    End If
End Sub

 
サブフォームのレコード移動時
Private Sub Form_Current()
    On Error Resume Next
    If Me.NewRecord Then
        Me.Parent.Recordset.AddNew
    Else
        Me.Parent.Recordset.AbsolutePosition = Me.CurrentRecord - 1
    End If
End Sub

投稿日時: 23/05/15 23:21:48
投稿者: Watanabe-45

hatena さん
 
早速のアドバイスありがとうございます。
教えていただいたコード記述しました。
サブフォームでも書き込み可能になりました。
しかし、サブフォームで新規追加などすると、メインフォームとのずれが生じてしまったり、メインフォームとサブフォームのずれが生じてきます。
メインとサブフォームで同じクエリを使用しており、昇順にしていることが原因かもしれません。
誤った項目を削除してしまっても問題なので、最初におしえていただいたSet Me.サブフォームコントロール名.Form.Recordset = Me.Recordsetで、登録や修正はメインフォーム限定で使用したほうがよいようです。
いろいろとご教授いただきありがとうございました。

回答
投稿日時: 23/05/18 09:57:37
投稿者: hatena
投稿者のウェブサイトに移動

引用:
しかし、サブフォームで新規追加などすると、メインフォームとのずれが生じてしまったり、メインフォームとサブフォームのずれが生じてきます。

サブフォームでレコード削除や新規追加した場合、それがメインフォームには反映さませんね。
「挿入後処理」、「削除後確認」の各イベントプロシージャで、メインフォームを再クエリする処理をすればどうでしょう。
 
再クエリすると先頭レコードへ移動してしまうので、元のレコード位置へ戻す処理も必要になります。
 
Private Sub Form_AfterDelConfirm(Status As Integer)
    Dim cr As Long
    cr = Me.CurrentRecord
    Me.Parent.Requery
    Me.Recordset.AbsolutePosition = cr - 1
End Sub

Private Sub Form_AfterInsert()
    Dim cr As Long
    cr = Me.CurrentRecord
    Me.Parent.Requery
    Me.Recordset.AbsolutePosition = cr - 1
End Sub

メインフォーム側にも同様の処理は必要になると思います。
 
引用:
誤った項目を削除してしまっても問題なので、最初におしえていただいたSet Me.サブフォームコントロール名.Form.Recordset = Me.Recordsetで、登録や修正はメインフォーム限定で使用したほうがよいようです。

上記の手間と、メリット、デメリットを考慮して、運用に適切な方を選択すればいいでしょう。

投稿日時: 23/05/21 11:36:34
投稿者: Watanabe-45

hatena さん
  
度々のアドバイスありがとうございます。
教えていただいたコード記述しました。
 
>>Me.Parent.Requery
上記のところでデバックしてしまって、うまく動作ができませんでした。
フォーム名を入れるなどして再トライしましたが、知識不足でうまく活用することができませんでした。
 
しばらくは一番最初に教えていただいたコードで運用したいと思います。
 
 
勉強になります。本当にいろいろありがとうございました。