Access (一般機能)

Accessの一般機能に関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 10 Pro : Access 2007)
新規登録時のサブフォームの連動について
投稿日時: 18/07/12 11:17:40
投稿者: dmso0307

お世話になります。
現在、新規レコード入力時のメインフォームとサブフォーム連動に苦労しています。
問題のフォーム「詳細情報フォーム」に5ページ使用しています。
1〜2ページがメインフォーム(利用者(クエリ)をソース)で、3〜5ページがサブフォーム(それぞれAサブフォーム、Bサブフォーム、Cサブフォーム)で構成しています。
新規データ入力時1〜2ページの入力後、3〜5ページの入力に入る際にメインフォームで入力した利用者名でなく、以前に入力した利用者名(クエリで昇順でソートされています)に変わるため、3ページ以降のサブフォームを入力するにはレコードを一端、先ほど新規入力した「利用者」を探し、再度3〜5ページのサブフォームを入力しなければならない状態です。
この状態を回避するため、メインフォームのホームヘッダーに「保存ボタン」を作り、1〜2ページのメインフォームでの入力が終わった時点で「保存ボタン」を押してRequeryを
実行しようとしました。
 
対策1
メインフォームの「更新後処理」イベントに
Private Sub Form_AfterUpdate()
    Dim rst As Recordset
    Dim varBookMark As Variant
     'フォームのレコードセットを変数にセットします
    Set rst = Me.Recordset
    'レコードセットのブックマークを取得します
    'これが再クエリ前のカレントレコードを表します
    varBookMark = rst.Bookmark
    'フォームを再クエリします
    Me.Requery
    'カレントレコードを保存されているブックマークに設定します
    rst.Bookmark = varBookMark
    End Sub
を書き込んで見ましたが、効果がありません。
念のためにWebで調べた
  Private Sub Form_AfterUpdate()
Dim CR As Long
'再クエリの様子を画面に表示させないようにする
Me.Painting = False
'レコード番号を格納する
CR = Me.CurrentRecord
'再クエリ
Me.Requery
'格納したレコード盤後の所へ移動する
DoCmd.GoToRecord , , acGoTo, CR
'画面の表示を元に戻す
Me.Painting = True
End Sub
に変えてみましたが同様に効果がありません。
コードを書き込む所が悪いと考え「保存」ボタンにも同じコードを書き込んで見ましたが効果が無く、「利用者(クエリ)の「利用者名」のソート」も「無し」にして見ましたがダメでした。
一端入力が終わればメインホームとサブホームは連動して表示されているので「親リンクと子リンク」は正常に働いていると思います。
 
どのようにすれば、サブページを新規入力時に新利用者と同期できるのでしょうか?
対応策をお教え頂きたく、よろしくお願いします。
 

回答
投稿日時: 18/07/12 12:02:53
投稿者: sk

引用:
1〜2ページがメインフォーム(利用者(クエリ)をソース)で、
3〜5ページがサブフォーム(それぞれAサブフォーム、
Bサブフォーム、Cサブフォーム)で構成しています。

メインフォームのレコードソースにおいて
主キーに当たるフィールドはどれなのでしょうか。
 
引用:
新規データ入力時1〜2ページの入力後、3〜5ページの入力に入る際に
メインフォームで入力した利用者名でなく、以前に入力した利用者名
(クエリで昇順でソートされています)に変わる

また、各サブフォームコントロールの[リンク親フィールド]プロパティ
及び[リンク子フィールド]プロパティの設定は適切に行なわれている
のでしょうか。

投稿日時: 18/07/12 20:21:47
投稿者: dmso0307

ありがとうございます。
お世話になります、お問い合わせの件以下に書きました。
初心者のため説明がまずいですがよろしくお願いします。
メインフォームの主キーはIDです。
Aサブフォームの「リンク親フィールド=ID リンク子フィールド=利用者」、
注:利用者テーブルを元に利用者クリエの中で、姓と名および姓(フリガナ)& 名(フリガナ)のフィールドを設けています。利用者クエリを作り利用者名、フリガナ名と利用者は姓名を合成して作っています。
 
Bサブフォームの「リンク親フィールド=フリガナ名 リンク子フィールド=フリガナ名」、
Cサブフォームの「リンク親フィールド=利用者ID リンク子フィールド=利用者ID」の様に設定しています。
 
新規登録後、1〜2のメインフォームに入力後、Aサブフォームに移ったときにメインフォームの登録内容が保存され利用者名が前に入力したものに変わりますが、フォームから先ほど新規登録された利用者名で検索して表示させるとA〜Cサブフォームは新規登録状態になりますので「リンク親フィールドおよび リンク子フィールド」の設定は合っていると考えています。
 
以上、ご報告いたします。

回答
投稿日時: 18/07/13 11:46:44
投稿者: sk

引用:
1〜2ページがメインフォーム(利用者(クエリ)をソース)で、
3〜5ページがサブフォーム(それぞれAサブフォーム、
Bサブフォーム、Cサブフォーム)で構成しています。

引用:
利用者テーブルを元に利用者クエリ

引用:
メインフォームの主キーはIDです。

引用:
Aサブフォームの「リンク親フィールド=ID リンク子フィールド=利用者

引用:
Cサブフォームの「リンク親フィールド=利用者ID リンク子フィールド=利用者ID

・[利用者テーブル]において、[ID]とは別に[利用者ID]というフィールドが
 定義されているとして、そのフィールドを定義した意図や、そのフィールドの
 役割とは何なのか。
 
・[Aサブフォーム]のレコードソースは、[利用者テーブル]や[利用者クエリ]とは
 別のテーブル/クエリなのか。それとも、メインフォームと同じく
 [利用者テーブル](を元にしたクエリ)なのか。
 また、そのテーブル/クエリと[利用者テーブル]とはどのような関係にあるのか。
 ([Aサブフォーム]は何のために配置されているのか)
 
・[Aサブフォーム]のレコードソースであるテーブル/クエリにおいて、
 フィールド[利用者]([ID]でも[利用者ID]でもない)とは、
 [利用者テーブル]と 1対1 または 1対多のリレーションで結合するために
 設けられた外部キーに当たるのか。
 
引用:
Bサブフォームの「リンク親フィールド=フリガナ名 リンク子フィールド=フリガナ名

・[Bサブフォーム]のレコードソースは、[利用者テーブル]や[利用者クエリ]とは
 別のテーブル/クエリなのか。それとも、メインフォームと同じく
 [利用者テーブル](を元にしたクエリ)なのか。
 
・メインフォームと[Bサブフォーム]とを、[ID]や[利用者ID]ではなく
 [フリガナ名]同士でリンクさせている理由とは何なのか。
 (この場合、[フリガナ名]の値が同じ別人の情報を示すレコードが
 [Bサブフォーム]上に表示されてもおかしくない)

トピックに返信