Access (一般機能)

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

 
(Windows 7 Professional : Access 2016)
メイン、サブ、サブフォームの連動
投稿日時: 17/12/28 14:18:36
投稿者: Masaka

会社ごとの文書管理(履歴管理も含め)を本社で一括管理することになり、
そこで、下記のようなテーブル設計をしました。
 
テーブル設計
 
履歴管理T
・履歴管理No(主キー)
・会社No(外部キー)
・文書番号(外部キー)
・制定日
・改定日
・変更内容
 
文書明細T
・明細No(主キー)
・履歴管理No(外部キー)
・内容
・文書保存URL
 
会社T
・会社No(主キー)
・会社名
 
文書T
・文書No(主キー)
・文書名
 
フォーム設計
 
--------------------------------------------------------
メインフォーム
--------------------------------------------------------
会社ID:会社名(非連結フィールド)
文書ID:文書名(非連結フィールド)
 --------------------------------------------------------
 サブフォーム@
 --------------------------------------------------------
 履歴管理No
 制定日
 改定日
 変更履歴
 --------------------------------------------------------
 --------------------------------------------------------
 サブフォームA
 --------------------------------------------------------
 履歴管理No
 内容
 文書保存URL
 --------------------------------------------------------
----------------------------------------------------------
 
メインフォーム上の会社IDと文書IDを選択すると、サブフォーム@に
複数のレコードを表示し、サブフォーム@の各レコードの履歴管理No
に応じて、サブフォームAが連動する仕組みを検討しています。
 
ここでご相談ですが、メインフォームとサブフォーム@はリンク親フィールド、
リンク子フィールドに会社IDと文書IDを設定することで対応できましたが、
サブフォーム@とAの連動ができていません。
 
リンク親フィールド:親フォームが対応するフィードを持っていない
リンク子フィールド:履歴管理No
※親フォームはサブフォーム@になりますが、Forms![サブフォーム@]![履歴管理No]の指定ができない。
 
本件、どのように対応したらよいのでしょうか?
 
よろしくお願いいたします。

回答
投稿日時: 17/12/28 16:34:20
投稿者: Suzu

テーブル設計
 
文書明細T
・明細No(主キー)
・履歴管理No(外部キー)
・内容
・文書保存URL
    ↓
文書明細T
・明細No(主キー)
・会社No(外部キー)
・文書番号(外部キー)
・履歴管理No(外部キー)
・内容
・文書保存URL
 
では?
 
 
サブフォーム1 と サブフォーム2 は、どの様な関係でしょうか。
 
・メインフォーム上に サブフォーム1、サブフォーム2 並列に配置してある
・サブフォーム2は、サブフォーム1のサブフォームとして配置してあり
  サブフォーム1は、メインフォーム のサブフォームとして配置
 
どちらでしょうか。
 
 

引用:
※親フォームはサブフォーム@になりますが、Forms![サブフォーム@]![履歴管理No]の指定ができない。

 
前者であるなら、
  サブフォーム1とサブフォーム2 は親子関係になっていないので指定できませんよね。
 
後者であるなら、
  データシートビューでないと、親/小/孫は設定できなかった記憶があります。
  (手元ないので確認できません サブデータシートでWEB検索してみましょう)
 
 
 
サブフォーム1 をサブフォームにする意図は何でしょう。
それをメインフォームとして、そのフォームのヘッダー等に
 
--------------------------------------------------------
会社ID:会社名(非連結フィールド)
文書ID:文書名(非連結フィールド)
--------------------------------------------------------
これを配置すれば、サブデータシートで表示は簡単ですよね。
 

投稿日時: 17/12/28 22:23:25
投稿者: Masaka

Suzuさん、ご回答ありがとうございます。
 
これは、履歴管理Tではなく、文書明細Tに置くべきでしたか。
テーブル設計が間違っていたということでしょうか?
この点は、よく考え直してみます。
・会社No(外部キー)
・文書番号(外部キー)
 
サブフォーム@とAの関係は、仰る通り前者です。
やはりできないですよね。
 
サブフォームにせずにメインフォームのヘッダーに置く
という方法がありましたか。思いつきませんでした。
 
ちなみにこんな方法でも実現はできるのかなと、思いつきました。
サブフォーム@のレコード移動時のイベントで、メインフォームの、
非連結の作業フィールド(明細NO)をつくり、明細NOを格納してあげて、
リンクフィールドで関連付けてみました。
一応は動いてくれました。これだと運用上の問題はありますでしょうか?
 
アドバイス通りテーブル設計を見直して、
メインフォームのヘッダーを使う方法を検証してみます。

回答
投稿日時: 17/12/29 10:34:17
投稿者: hatena
投稿者のウェブサイトに移動

メインフォームに、サブフォームが並列で配置してあるのですね。
 
サブフォーム@は下記のように設定されているのかな。
 
リンク親フィールド 会社ID;文書ID   ←非連結コントロール名
リンク子フィールド 会社No;文書番号  ←フィールド名
 
メインフォームにテキストボックを配置して下記のように設定します。
 
名前 履歴管理No
コントロールソース =[サブフォームコントロール名].From![履歴管理No]
 
サブフォームAの設定
 
リンク親フィールド 履歴管理No
リンク子フィールド 履歴管理No
 
 
これでどうでしょう。

投稿日時: 17/12/29 16:37:30
投稿者: Masaka

hatenaさん
 
ご回答ありがとうございます。
 
サブフォームのカレントでデータを貼り付けるのではなく、
直接、コントロールソースで取得できてしまうんですね。
 
これでできます。
 
ただ、サブフォームにフォーカスを移すと、
なぜか二つのサブフォーム内で無限ルーフのような、
データが回り出してしまいます。高速でフィールドの文字列などが
反転を繰り返します。変なイベントプロシージャも設定していないのですか。
 
原因不明で調査中です。

回答
投稿日時: 17/12/29 22:15:09
投稿者: hatena
投稿者のウェブサイトに移動

Masaka さんの引用:
ただ、サブフォームにフォーカスを移すと、
なぜか二つのサブフォーム内で無限ルーフのような、
データが回り出してしまいます。高速でフィールドの文字列などが
反転を繰り返します。変なイベントプロシージャも設定していないのですか。

簡単なサンプルを作成して試してみましたが、症状は再現できませんでしたか。
当方では正常に動いています。
 
なるべくシンプルな形で一から作成してみて、症状が出るか確認してもらえますか。

投稿日時: 17/12/30 08:12:17
投稿者: Masaka

hatenaさん
 
ご回答ありがとうございます。
 
この↓コントロールを置くか置かないかで無限ループのような症状が発生することがわかりました。
コントロールソース=[サブフォームコントロール名].From![履歴管理No]
 
サブフォームのレコード移動時のイベントで、履歴管理Noを代入する方法でも同じ症状が発生します。
 
サブフォームのレコードセレクタをクリックしたり、コントロールを一瞬クリックしただけでは
再現せず、コントロールを何度もクリックすると再現する症状のようで、なかなか気付けませんでした。
 
環境がないので年明けになってしまいますが、もう一度、問題を切り分けて解決策を検討してみます。
ひとまずご報告まで。
 
どうぞよろしくお願いいたします。
 

回答
投稿日時: 17/12/30 10:44:34
投稿者: hatena
投稿者のウェブサイトに移動

Masaka さんの引用:

この↓コントロールを置くか置かないかで無限ループのような症状が発生することがわかりました。
コントロールソース=[サブフォームコントロール名].From![履歴管理No]
 
サブフォームのレコード移動時のイベントで、履歴管理Noを代入する方法でも同じ症状が発生します。
 
サブフォームのレコードセレクタをクリックしたり、コントロールを一瞬クリックしただけでは
再現せず、コントロールを何度もクリックすると再現する症状のようで、なかなか気付けませんでした。

当方のサンプルでいろいろ試してみましたが、症状を再現させることはできませんでした。
「コントロールを何度もクリックする」とのことですが、どのコントロールでしょうか。

投稿日時: 17/12/30 13:10:41
投稿者: Masaka

hatenaさん
 
ご回答ありがとうございます。
 
サブフォーム上の、下記のどこかのフィールドのデータを編集などするために、
ダブルクリックなどした場合にこの現象が現れます。
こうなると何をしても止まらなくなりますが、
メインフォーム上の非連結フィールドにフォーカスを移すと止まります。
また、サブフォーム上にフォーカスを移すと同じ現象が再現されます。
 
履歴管理Sub Form@
・履歴管理No(主キー)
・会社No(外部キー)
・文書番号(外部キー)
・制定日
・改定日
・変更内容
  
文書明細Sub FormA
・明細No(主キー)
・履歴管理No(外部キー)
・内容
・文書保存URL

回答
投稿日時: 18/01/01 12:25:16
投稿者: hatena
投稿者のウェブサイトに移動

当方のサンプルでは症状が再現できないので、確認はできませんが、
リンクフィールドが設定してあるのが原因なら、
リンクフィールドの設定は削除して、VBAで抽出と規定値の設定をすればどうでしょうか。
 
サブフォーム@ のレコード移動時のイベントプロシージャ
 

Private Sub Form_Current()
    On Error GoTo exitSub
    With Parent!履歴管理Sub.Form
        .Filter = "履歴管理No=" & Me.履歴管理No
        .FilterOn = True
        !履歴管理No.DefaultValue = Me.履歴管理No
    End With
exitSub:
End Sub

 
On Error・・・は、サブフォームが開いて、レコード移動が発生してから、メインフォームが開かれるので、開いた直後は、メインフォームが参照できないエラーになるので、その対策のためです。

投稿日時: 18/01/12 20:15:53
投稿者: Masaka

hatenaさん、
 
どうもありがとうございます。
その方法でも解消しませんでした。
 
サブフォーム@のカレントのイベントに、
debug.printを仕掛けて再現してみたところ、
無限ループに陥っているようでした。

回答
投稿日時: 18/01/13 07:37:36
投稿者: hatena
投稿者のウェブサイトに移動

当方のサンプルでは、どの方法でも、問題なく動作してます。
 
なるべくシンプルなメインフォーム、サブフォームで試しても再現しますか。
 
それでも、再現するようなら、下記の掲示板で症状の出るファイルをアップロードしてもらえますか。
 
hatena の Microsoft Access 掲示板
http://hatena-access.progoo.com/bbs/

投稿日時: 18/01/13 10:22:28
投稿者: Masaka

hatenaさん
 
ご回答ありがとうございます。
 
おっしゃる通り、最小限の構成にまで絞り込みんでみても再現していました。
どうもありがとうございます。
データが自宅にありませんので、週明けにファイルをアップさせていただきます。
 
どうぞよろしくお願いいたします。
 
 

投稿日時: 18/01/15 20:34:16
投稿者: Masaka

本件、解決です。
 
hatenaさん、どうもありがとうございました。