Access (VBA)

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

 
(Windows 8 : Access 2013)
フォームのレコードソース切り替え他がうまくいきません。
投稿日時: 18/02/16 02:26:51
投稿者: きゃさりん

メインフォームから顧客マスター画面を開くロジックを修正しております。
顧客マスター画面は登録、照会、更新、複合検索(今回新規追加)というかたちで開きます。
 
元々顧客マスター画面のレコードソースは、デフォルトが顧客マスターで、
照会と更新の際は、OpenFormメソッドで指定してクエリを参照しておりました。
 
今回複合検索にあたり、
メインフォームからキーワードを設定された場合、
その文字列を含んだ条件に当てはまる顧客を対象として顧客マスターを開きたいのですが、
3つのフィールドに対して設定できるキーワードのうち、
1つしか顧客マスターにフィールドがありませんので、
他テーブルを参照しております。
 
OpenFormメソッドのWhereConditionで検索条件を指定してみたり、
顧客マスター画面の方のFilterに検索条件を指定してみたりしておりますが、
検索結果が全データ対象となってしまいます。
 
条件式の書き方が違うのかも正直わかりません。
 
下記ではうまくいきませんでした。
 
<メインフォームのDoCmd.OpenFormメソッドにて>
DoCmd.OpenForm "顧客マスター画面", , "顧客マスター_照会・更新"(クエリ名),"物件マスター.物件名 Like '**' And 物件マスター.住所 like '**' And 室番号 Like '*11*'" , acFormEdit
 
<顧客マスター画面のForm_Openイベントにて>
顧客マスター画面.Filter = 物件マスター.物件名 Like '**' And 物件マスター.住所 like '**' And 室番号 Like '*11*'
 
どなたかご教授いただけないでしょうか。
よろしくお願いいたしますm(_)m

回答
投稿日時: 18/02/16 09:58:37
投稿者: sk

引用:
元々顧客マスター画面のレコードソースは、デフォルトが顧客マスターで

・テーブル[顧客マスター]の定義内容が不明。
 
引用:
照会と更新の際は、OpenFormメソッドで指定してクエリを参照しておりました。

・上記クエリの定義内容( SQL )が不明。
 
引用:
メインフォームからキーワードを設定された場合、
その文字列を含んだ条件に当てはまる顧客を対象として顧客マスターを開きたいのですが、
3つのフィールドに対して設定できるキーワードのうち、
1つしか顧客マスターにフィールドがありませんので、
他テーブルを参照しております。

・ここでの「他テーブル」とは[物件マスター]という名前の
 テーブルであると推測されるが、フォーム[顧客マスター画面]の
 レコードソースとなる選択クエリにおいて参照されているのか否か、
 具体的にどのような形で参照されているのかが不明瞭。
 
引用:
DoCmd.OpenForm "顧客マスター画面", , "顧客マスター_照会・更新"(クエリ名),"物件マスター.物件名 Like '**' And 物件マスター.住所 like '**' And 室番号 Like '*11*'" , acFormEdit

引用:
顧客マスター画面.Filter = 物件マスター.物件名 Like '**' And 物件マスター.住所 like '**' And 室番号 Like '*11*'

少なくとも上記のコードは、実際にフォームモジュール上に
記述されたものであるとは思えません。

投稿日時: 18/02/16 10:48:43
投稿者: きゃさりん

sk様
 
拙い説明に回答、ご指摘ありがとうございます。
 
まず顧客マスターのテーブル定義は以下のとおりです。
顧客コード(主キー)、顧客名、物件コード、室番号をはじめとして14項目あります。
登録ボタンを押下してOpenFormする際は、
顧客マスター画面で設定している顧客マスターテーブルをレコードソースとしております。
 
照会ボタンと更新ボタンを押下してOpenFormする際に参照しているクエリは、
顧客マスターにもっていない物件名、住所を物件マスターより参照した選択クエリとしています。
 
SQLだと下記のとおりです。
SELECT 顧客マスター.顧客コード, 顧客マスター.顧客名, 顧客マスター.顧客フリガナ, 顧客マスター.物件コード, 顧客マスター.室番号, 顧客マスター.電話番号@, 顧客マスター.FAX番号, 顧客マスター.電話番号A, 顧客マスター.[E-mail], 顧客マスター.備考, 顧客マスター.入力日, 顧客マスター.更新日, 物件マスター.物件名, 物件マスター.住所, 顧客マスター.得意先コード
FROM 顧客マスター LEFT JOIN 物件マスター ON 顧客マスター.物件コード = 物件マスター.物件コード
ORDER BY 顧客マスター.顧客コード, 顧客マスター.入力日, 顧客マスター.更新日;
 
顧客マスター.室番号
物件マスター.物件名
物件マスター.住所
以上3つの項目が今回OpenFormの条件として参照したい項目となります。
 
今現在私の知識で書いたコードが下記のとおりです。
 
<メインフォームのDoCmd.OpenFormメソッドにて>
DoCmd.OpenForm "顧客マスター画面", , "顧客マスター_照会・更新","物件マスター.物件名 Like '**' And 物件マスター.住所 like '**' And 室番号 Like '*11*'" , acFormEdit
<顧客マスター画面のForm_Openイベントにて>
顧客マスター画面.Filter = 物件マスター.物件名 Like '**' And 物件マスター.住所 like '**' And 室番号 Like '*11*'
 
回答を拝見させていただくと、とてつもなく見当はずれなコードを書いているのかと思いますが、
ご指摘、ご教授いただけますと大変助かります。
 
お忙しいところ恐れ入りますがどうぞよろしくお願いします。

回答
投稿日時: 18/02/16 11:34:39
投稿者: sk

引用:
登録ボタンを押下してOpenFormする際は、
顧客マスター画面で設定している顧客マスターテーブルをレコードソースとしております。

引用:
照会ボタンと更新ボタンを押下してOpenFormする際に参照しているクエリは、
顧客マスターにもっていない物件名、住所を物件マスターより参照した選択クエリとしています。

[顧客マスター画面]のレコードソースを変更する処理は
どのフォームのどのコントロールのどのイベントで
実行されているのでしょうか。
 
引用:
顧客マスター.室番号
物件マスター.物件名
物件マスター.住所
以上3つの項目が今回OpenFormの条件として参照したい項目となります。

引用:
メインフォームからキーワードを設定された場合、
その文字列を含んだ条件に当てはまる顧客を対象として顧客マスターを開きたいのですが、
3つのフィールドに対して設定できるキーワードのうち、
1つしか顧客マスターにフィールドがありませんので、
他テーブルを参照しております。

また[メインフォーム]上において、キーワードを入力するための
非連結テキストボックスは 1 つだけなのでしょうか。
それとも各フィールドに対応する 3 つの非連結テキストボックスが
配置されているのでしょうか。
 
また、その(それらの)非連結テキストボックスの
名前は何でしょうか。

投稿日時: 18/02/16 12:12:49
投稿者: きゃさりん

引用:

[顧客マスター画面]のレコードソースを変更する処理は
どのフォームのどのコントロールのどのイベントで
実行されているのでしょうか。

 
上記に関しては以下のとおりメインフォーム内にある
「複合検索」というボタンのクリックイベント内に記述しています。
DoCmd.OpenForm "顧客マスター画面", , "顧客マスター_照会・更新","物件マスター.物件名 Like '**' And 物件マスター.住所 like '**' And 室番号 Like '*11*'" , acFormEdit
「顧客マスター_照会・更新」というのが選択クエリです。
 
引用:

またメインフォーム上において、キーワードを入力するための
非連結テキストボックスは 1 つだけなのでしょうか。
それとも各フィールドに対応する 3 つの非連結テキストボックスが
配置されているのでしょうか。
また、その(それらの)非連結テキストボックスの
名前は何でしょうか。

 
上記に関してですが、非連結のテキストボックス(名前:ダミー2_tbx)は今一つです。
ただ、試行錯誤中でして、
**********
DoCmd.OpenForm "顧客マスター画面", , "顧客マスター_照会・更新","物件マスター.物件名 Like '**' And 物件マスター.住所 like '**' And 室番号 Like '*11*'" , acFormEdit
**********
こういう書き方をすると、非連結のテキストボックス自体いらないのか、と思っていますが違うでしょうか?
 
私の考えの中では、ダミー2_tbxに、
物件マスター.物件名 Like '**' And 物件マスター.住所 like '**' And 室番号 Like '*11*'
このようにセットしておいて、
顧客マスター画面で
Me.FilterOn = True
Me.Filter = Form_メインフォーム.ダミー2_tbx
としてみたのですが、こちらもうまくいきませんでした。
 
わかりづらい質問でお手間とらせまして申し訳ございません。
どうぞよろしくお願いします。

投稿日時: 18/02/16 14:20:01
投稿者: きゃさりん

今試してみているのですが、
OpenFormメソッドで顧客マスター_照会・更新クエリをfilternameで設定しても、
クエリ内で設定しているフィールド名は認識されませんでした。
 
今回顧客マスターテーブルにフィールドがない
物件名
住所
が認識されておらず、検索結果に反映されていないかたちです。
 
顧客マスター画面のレコードソースを今は顧客マスターテーブルとしていますが、
これを顧客マスター_照会・更新クエリにしてしまうと
また別の不具合が出てしまうのは確認しております。
 
そもそもマスターテーブルの登録更新画面のレコードソースを
クエリにしてしまうことがおかしいと思っていましたので
顧客マスターテーブルにしていますが、
全て情報をもっているクエリにしてしまうというのが一番てっとり早い方法でしょうか。
 
何度もすみませんがよろしくお願いします。

回答
投稿日時: 18/02/16 14:53:05
投稿者: sk

引用:
上記に関しては以下のとおりメインフォーム内にある
「複合検索」というボタンのクリックイベント内に記述しています。
DoCmd.OpenForm "顧客マスター画面", , "顧客マスター_照会・更新","物件マスター.物件名 Like '**' And 物件マスター.住所 like '**' And 室番号 Like '*11*'" , acFormEdit
「顧客マスター_照会・更新」というのが選択クエリです。

OpenForm メソッドの引数 FilterName に
任意の選択クエリの名前を渡しても、
開かれるフォームのレコードソースが
そのクエリに変更されるわけではありません。

 
そのクエリに設定されているのと同じ抽出条件を、
フォームが開かれる際のフィルター条件として適用するのが
引数 FilterName の役割です。
 
[顧客マスター画面]のレコードソースが
[顧客マスター]であることに変わりはありませんし、
フォームのレコードソースに存在しないフィールド
(この場合は[顧客マスター]に存在しない[物件名]や[住所])
に対する抽出条件式も当然無効です。
 
引用:
SELECT 顧客マスター.顧客コード, 顧客マスター.顧客名, 顧客マスター.顧客フリガナ, 顧客マスター.物件コード, 顧客マスター.室番号, 顧客マスター.電話番号@, 顧客マスター.FAX番号, 顧客マスター.電話番号A, 顧客マスター.[E-mail], 顧客マスター.備考, 顧客マスター.入力日, 顧客マスター.更新日, 物件マスター.物件名, 物件マスター.住所, 顧客マスター.得意先コード
FROM 顧客マスター LEFT JOIN 物件マスター ON 顧客マスター.物件コード = 物件マスター.物件コード
ORDER BY 顧客マスター.顧客コード, 顧客マスター.入力日, 顧客マスター.更新日;

また、クエリ[顧客マスター_照会・更新]には抽出条件が全く設定されていない
( WHERE 句がない)ので、実際には何のフィルターも適用されません。
 
まずやるべきことは、フォーム[顧客マスター画面]のレコードソースを
[顧客マスター]ではなく[顧客マスター_照会・更新]に変更することです。
 
引用:
上記に関してですが、非連結のテキストボックス(名前:ダミー2_tbx)は今一つです。

その上で、[ダミー2_tbx]に入力された文字列が
[物件名], [住所], [室番号]のいずれかに含まれている
レコードを抽出したい場合は、以下のようなコードが
実行されるようになさればよろしいでしょう。
 
-------------------------------------------------------------------------
 
Dim strCriteria As String
 
strCriteria = ""
 
If Nz(Me![ダミー2_tbx], "") <> "" Then
    strCriteria = "([物件名] Like '*" & Me![ダミー2_tbx] & "*')" & _
                  " Or ([住所] Like '*" & Me![ダミー2_tbx] & "*')" & _
                  " Or ([室番号] Like '*" & Me![ダミー2_tbx] & "*')"
End If
 
DoCmd.OpenForm FormName:="顧客マスター画面", _
               WhereCondition:=strCriteria
 
-------------------------------------------------------------------------

投稿日時: 18/02/16 15:35:45
投稿者: きゃさりん

ご丁寧にわかりやすいレクチャーをありがとうございます!
 
やはりレコードソースが肝だったんですね。
全然見当違いな質問で大変失礼いたしました。
 
ダミー2_tbx内の条件は教えていただいたかたちでやってみます!
また何かありましたら質問させていただきます。
 
大変助かりました。
ありがとうございました!!

トピックに返信