Access (一般機能)

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

 
(Windows 7 Professional : Access 2010)
複数のフォームで同じ値を参照するにはどうすれば
投稿日時: 17/12/26 23:00:03
投稿者: 馬車道停留所

こんにちは
 
掲題に関する質問です。
 
フォームA、B、Cがあります。
それぞれのフォームが、異なるテーブル、または、選択クエリを基に作成されていますが、
それぞれのフォームに、社員コードというフィールドがあります。
 
フォームAで、社員コードを検索して参照した後に、
それぞれ、フォームB、フォームCで、同様に、同じ社員コードで検索して値を参照しています。
 
この過程で、3回、同じ社員コードを打ち込むのではなく、
フォームAで検索した社員コードを、フォームB、フォームCに引き継ぐ方法はないでしょうか。
 
ちなみに、フォームA、B、C、いずれも値参照用のフォームで、データの入力フォームではありません。
 
ご教授お願いします。

回答
投稿日時: 17/12/27 09:38:39
投稿者: Suzu

こんにちは。
  
どの様に「検索」を実現しているのでしょうか。
  
その方法により採るべき方法が変わってくると思います。
  
  
一般的な方法として、
 ある非連結のテキストボックスに値を入れ
 クエリの抽出条件としてそのテキストボックスを参照する
と言う方法があります。
  
その方法を採っているなら
単票フォームに 非連結テキストボックスを配置
  サブフォームコントロールを三つ配し
  それぞれのソースオブジェクトに、その非連結テキストボックスを参照し抽出するフォームを配しては?
  

 
+--------------------------------------------------------------------------------+ 
| +----------------+                                                             | 
| | 非連結テキスト |                                                             |
| +----------------+                                                             | 
|                                                                                | 
| +---------------------+ +---------------------+ +---------------------+        | 
| |                     | |                     | |                     |        | 
| |                     | |                     | |                     |        | 
| | フォームAに似た形   | | フォームBに似た形   | | フォームCに似た形   |        | 
| |                     | |                     | |                     |        | 
| +---------------------+ +---------------------+ +---------------------+        | 
+--------------------------------------------------------------------------------+ 

フォームA〜Cのレコードソースであるクエリのの抽出条件を変える必要があります。
  
即効テクニック集
【フォームのテキストボックスに入力された値をクエリの抽出条件に設定する(Access 97)】
http://www.moug.net/tech/acopr/0040014.html
を参考にどうぞ。
 

回答
投稿日時: 17/12/27 09:40:51
投稿者: sk

sk さんの引用:
引用:
フォームA、B、Cがあります。
それぞれのフォームが、異なるテーブル、または、選択クエリを基に作成されていますが、
それぞれのフォームに、社員コードというフィールドがあります。

・[フォームA], [フォームB], [フォームC]はそれぞれ
 どのようにして(どのオブジェクト/コントロールのどのイベントで)
 開かれるのか。
 
フォームAで、社員コードを検索して参照した後に
それぞれ、フォームB、フォームCで、同様に、
同じ社員コードで検索して値を参照しています。

・その時点において、[フォームB], [フォームC]は既に開かれているのか
 ( 3 つのフォームが同時に開かれている状態なのか)。
 それとも[フォームA]だけが開かれており、[フォームA]に対する何らかの
 操作によって[フォームB]や[フォームC]が開かれることになるのか。
 
引用:
フォームA、B、C、いずれも値参照用のフォームで、
データの入力フォームではありません。

引用:
この過程で、3回、同じ社員コードを打ち込むのではなく、
フォームAで検索した社員コードを、フォームB、フォームCに
引き継ぐ方法はないでしょうか。

例えば[フォームA]に配置されているコマンドボタンの
[クリック時]イベントの発生時に[フォームB]または
[フォームC]を開く命令( DoCmd.OpenForm メソッド)を
実行するような仕組みになっているのであれば、
OpenForm メソッドの第 4 引数 WhereCondition に
[社員コード]の抽出条件を指定する式を渡せばよいでしょう。
 
([フォームA]のフォームモジュール)
------------------------------------------------------------
Private Sub コマンドボタン名_Click()
 
    Dim strCriteria As String
     
    '[社員コード]のデータ型がテキスト型である場合
    strCriteria = "[社員コード]='" & Me![社員コード] & "'"
 
    DoCmd.OpenForm FormName:="フォームB", _
                   WhereCondition:=strCriteria
 
End Sub
------------------------------------------------------------
 
あるいは、フォームのレイアウト的に問題がなければ、
[フォームB]と[フォームC]を[フォームA]のサブフォームとして
埋め込み、[社員コード]同士でリンクさせる、という形にする
ことも挙げられます。

投稿日時: 17/12/27 13:20:52
投稿者: 馬車道停留所

ご回答いただきありがとうございます。
 
Suzuさん
検索は、各フォームに検索ボタンを付けて、フィールドの値を検索する方法です。
 
sk さん
 
・[フォームA], [フォームB], [フォームC]はそれぞれどのようにして(どのオブジェクト/コントロールのどのイベントで) 開かれるのか。 
 
メインフォームにそれぞれフォームA、B、Cを開くボタンがあります。
 
・その時点において、[フォームB], [フォームC]は既に開かれているのか ( 3 つのフォームが同時に開かれている状態なのか)。 
 
最初は、開いていないですが、
1回目の検索が終わると、閉じない限り、全て開いた状態になります。
 
それとも[フォームA]だけが開かれており、[フォームA]に対する何らかの 操作によって[フォームB]や[フォームC]が開かれることになるのか。 
 
全て、メインフォームのボタン操作で開きます。

回答
投稿日時: 17/12/27 14:17:40
投稿者: hatena
投稿者のウェブサイトに移動

馬車道停留所 さんの引用:

メインフォームにそれぞれフォームA、B、Cを開くボタンがあります。
 
最初は、開いていないですが、
1回目の検索が終わると、閉じない限り、全て開いた状態になります。
 
全て、メインフォームのボタン操作で開きます。

 
つまり、フォームA、B、C はユーザーが自由に開いたり閉じたりできるということですね。
 
ということは、
馬車道停留所 さんの引用:

フォームAで検索した社員コードを、フォームB、フォームCに引き継ぐ方法はないでしょうか。

フォームAが常に開いている保証はないですね。
フォームAが閉じている時に、フォームB、フォームCを開いたときはどうしますか。
 
メインフォームがあるなら、メインフォームに検索条件を入力するテキストボックスを配置して、それを参照するようにしてはどうですか。
現状、どのように検索しているのかについての、返答がないですが、各フォームのレコードソースのクエリに抽出条件を設定しているなら、その抽出条件でメインフォームの条件テキストボックスを参照するようにするのが一番簡単でしょう。

回答
投稿日時: 17/12/27 16:37:35
投稿者: sk

引用:
メインフォームにそれぞれフォームA、B、Cを開くボタンがあります。

引用:
全て、メインフォームのボタン操作で開きます。

ここでの「メインフォーム」というのは
(サブフォームに対するメインフォームではなく)
いわゆるスイッチボードとなる非連結フォームのことでしょうか。
 
引用:
それぞれのフォームが、異なるテーブル、または、選択クエリを基に作成されていますが、
それぞれのフォームに、社員コードというフィールドがあります。

[社員コード]という名前のフィールドが共通して定義されていると言っても、
それぞれのレコードソースはあくまで「異なるテーブル、または、選択クエリ」であり、
それぞれの連結フォームの本来の用途は異なるということですよね。
 
引用:
検索は、各フォームに検索ボタンを付けて、フィールドの値を検索する方法です。

ならば、それぞれのフォームに同種の検索機能が実装されていること、そして
その機能が他のフォームの状態に依存せずに(一個の機能として)独立している
というのは、フォームの構成上において妥当と言えるのではないかと思います。
 
その上で、改めてご質問の主旨を確認しますが、
 
引用:
この過程で、3回、同じ社員コードを打ち込むのではなく、
フォームAで検索した社員コードを、フォームB、フォームCに引き継ぐ方法はないでしょうか。

1. [メインフォーム]から[フォームA]を開く。
 
2. [フォームA]で任意の[社員コード]を入力し、該当するレコードを表示させる。
 
3. [フォームA]を閉じる。
 
4. [メインフォーム]から[フォームB]を開く。
 
--------------------------------------------------------------------------
 
という操作を行なった時、
 
--------------------------------------------------------------------------
 
4-1: [フォームB]が開かれた時点で、[フォームB]の[社員コード]の値が
     [フォームA]の[社員コード]に対して最後に入力されたのと同じ値になるようにする。
     ([社員コード]の既定値、検索条件の継承)
 
--------------------------------------------------------------------------
 

 
--------------------------------------------------------------------------
 
4-2: [フォームB]が開かれた時点で、[社員コード]の値が
     [フォームA]の[社員コード]に対して最後に入力された値と
     一致するレコードを表示させるようにする。
     (検索条件を継承した上で、[フォームB]を開くと同時にレコード検索を実行)
      
--------------------------------------------------------------------------
 
のどちらの操作を要求されているのでしょうか。
 
仮に後者の方だとして、もし[フォームB]のレコードソースに
該当するレコードが含まれていなかった場合はどのように
なさりたいのでしょうか。
(異なるテーブルならば、そういう事態もあり得るはず)
 
また、その後で
 
--------------------------------------------------------------------------
 
5. [フォームB]で異なる[社員コード]を入力し、
   該当するレコードを表示させる。
 
6. [フォームB]を閉じる。
 
7. [メインフォーム]から[フォームA]を開く
 
--------------------------------------------------------------------------
 
という操作が行なわれた時、[フォームA]の[社員コード]の値、
もしくは[フォームA]に表示されるレコードに関しては
何の操作も行なわなくてよいのでしょうか。

投稿日時: 17/12/27 18:38:39
投稿者: 馬車道停留所

hatenaさん
 
フォームAが閉じている時に、フォームB、フォームCを開いたときはどうしますか。
 
>特に、フォームAの社員コードを引き継ぐことはしなくても大丈夫です。
 それぞれフォームB、フォームCで必要なレコードを検索するだけです。
 
 フォームAで、社員コードを検索する場合は、
 フォームB、フォームCに社員コードの値が引き継がれると
 同じ社員コードを検索をする手間がはぶけていいなと思っています。
 
メインフォームがあるなら、メインフォームに検索条件を入力するテキストボックスを配置して、それを参照するようにしてはどうですか。
 
>それがよさそうです。
 
現状、どのように検索しているのかについての、返答がないですが、
各フォームのレコードソースのクエリに抽出条件を設定しているなら、
その抽出条件でメインフォームの条件テキストボックスを参照するようにするのが一番簡単でしょう。
 
>Suzuさんに回答を差し上げた通り、フォームA、フォームB、フォームCに、
 検索ボタン(双眼鏡のアイコン)をつけて、レコードの検索をしているだけです。
 
SKさん
 
ここでの「メインフォーム」というのは(サブフォームに対するメインフォームではなく)
いわゆるスイッチボードとなる非連結フォームのことでしょうか。
 
>はい。ただのフォームを開く(マクロ操作)というボタンを、
 メインフォームに3つ横並びに付けているです。
 
[社員コード]という名前のフィールドが共通して定義されていると言っても、
それぞれのレコードソースはあくまで「異なるテーブル、または、選択クエリ」であり、
それぞれの連結フォームの本来の用途は異なるということですよね。
 
>ご認識の通りです。
 
ならば、それぞれのフォームに同種の検索機能が実装されていること、そして
その機能が他のフォームの状態に依存せずに(一個の機能として)独立している、
というのは、フォームの構成上において妥当と言えるのではないかと思います。
 
>ご認識の通りです。
 
4−1、4−2のどちらの操作を要求されているのでしょうか。
 
>4−1、4−2どちらでも構いません。
(フォームA、B、Cを開いた状態で、フォームAで検索した
 社員コードの値に連動すると更に便利ですが、
 4−1、4−2どちらかができれば、それで十分です。)
 
仮に後者の方だとして、もし[フォームB]のレコードソースに
該当するレコードが含まれていなかった場合はどのようになさりたいのでしょうか。
  
>他のテーブルに該当するレコードがない場合は、通常の表示でかまいません。
 稀に消し忘れで残っている場合もあると思いますが、フォームAに社員コードがなければ、
 大抵、他のフォームB、Cには、同じ社員コードはないです。
 
5−7という操作が行なわれた時、[フォームA]の[社員コード]の値、
もしくは[フォームA]に表示されるレコードに関しては何の操作も行なわなくてよいのでしょうか。
 
>はい。特に考えていませんでした。
 メインフォームに、非連結テキストボックスを表示させて、そこに社員コードを入力して、
 各フォームを開いた時、または、開いている状態で、そのレコードが参照されるのであれば、
 それが便利かと思います。
(該当するレコードがない場合は、または、何も入力しない場合は、通常の表示のまま)
 
 

投稿日時: 17/12/28 13:34:05
投稿者: 馬車道停留所

skさん
 
いろいろご考慮いただきありがとうございます。
 
教えていただいた、フォームAのクリック時イベントについて、また、フォームB、CをフォームAのサブフォームとして、社員コードでリンクする方法について、検討してみたのですが、別々のフォームのままの方が見やすかったので、今回は、Suzuさん、hatenaさんにご教示いただいた方法を使おうかと思います。
 
なお、個人的にも、マクロのアクション(値の代入)についてなど、いろいろ検討してみました。
 
余計なお手間をとらせてしまっていたらと思い、取り急ぎご連絡をさせていただきました。

投稿日時: 17/12/28 20:41:04
投稿者: 馬車道停留所

その後、メインフォームに非連結テキストボックスを設定し、各フォームA、B、Cのクエリの対象フィールドのプロパティを設定し、うまく、レコードが表示されました。
ありがとうございました。
 
1つ、教えていただきたいのですが、
 
デザイングリッドに設定した[社員コード]のフィールドで右クリックすると表示される[フィールドプロパティ]の[ルックアップ]タブをクリックし、[表示コントロール]プロパティに「テキストボックス」を指定しますが、これは、必須でしょうか。
 
質問の理由ですが、他のフィールドにも応用しようと思ったのですが、あるフィールドは、フォーマット(例、部署コード: Format....)されているので、[ルックアップ]タブをクリックし、[表示コントロール]プロパティに「テキストボックス」を指定することができないようです。
 
ご教示い願いします。

投稿日時: 17/12/29 11:54:39
投稿者: 馬車道停留所

先日の質問は、Suzuさんに教えていただいた箇所の質問だったのですが、[ルックアップ]タブをクリックし、[表示コントロール]プロパティに「テキストボックス」を指定しなくても、式を入れるだけで出来ました。
 
ありがとうございました。
 
即効テクニック集
【フォームのテキストボックスに入力された値をクエリの抽出条件に設定する(Access 97)】
http://www.moug.net/tech/acopr/0040014.html
を参考にどうぞ。

投稿日時: 17/12/29 15:19:41
投稿者: 馬車道停留所

度々の質問で恐縮です。
 
もう1つお伺いしたいのですが、メニューフォームの非連結テキストボックスに社員コードを入れると、フォームA、B、Cを、都度、開閉せずに、開いたままの状態で、各フォームで同じ社員コードに該当するレコードが選択される方法はないでしょうか。

投稿日時: 17/12/31 20:53:22
投稿者: 馬車道停留所

フォームA、B、Cを、メインフォームのサブフォームとしないと、非連結テキストボックスの値とそれぞれのフォームのレコードの値を連動させるのは難しそうなので、将来的に、その方向で考えようと思います。ご回答いただいた皆さんありがとうございました。良いお年を!