いままで選択クエリの「抽出条件」に
[Forms]![フォーム名]![テキストボックスの名前]
を書いて実行していましたが、
複数のフォームからクエリを呼び出す必要がでてきました。
「抽出条件」の記述はどうすればよいでしょうか?
他の方法が必要なのでしょうか?
他の方法が必要、ということでしたら、
実現方法を教えてください。
なるべく手間がかからずに簡単にできる方法をさがしてます。
いまいち把握しきれてませんが、一つのテーブルから複数の条件(複数のフォームからのクエリ複数の条件でクエリする)でクエリすると考えて、
クエリの抽出条件をANDなら、同じ横並びのところに条件を[Forms]![フォームの名前]![テキストボックスの名前]を複数書く、OR条件なら横並びにならないように条件に[Forms]![フォームの名前]![テキストボックスの名前]を書くでいいのかな?
的はずれでしたらごめんなさい。
複数の抽出条件で選択クエリを実行するケースですが、
この条件が「and」の場合と「or」があると思います。
下記のように、
「and」の場合は同じ抽出条件列の複数のフィールドに条件を挿入し、
「or」の場合は異なる抽出条件列の複数のフィールドに条件を挿入するとよいでしょう。
http://www.seta.media.ryukoku.ac.jp/manual/office/access/query/s...
husigiさん,ご回答ありがとうございます。
状況はfreemannさんへの返信にて
ご説明させていただきました。
要は、呼出し元画面によって、
クエリの抽出条件の値(SQLの右辺)を変えたい
場合、どうすればよいかっていうことになります。
[Forms]![フォームの名前]![テキストボックス]
の記述が呼出し元によって変わりますので。
画面Aからは画面Cのテキストボックスに顧客noをコピーし、画面Cを開く。
画面Bからも画面Cのテキストボックスに顧客noをコピーし、画面Cを開く。
クエリの「抽出条件」では、
[Forms]![画面C]![テキストボックス]
のように、画面Cのテキストボックスを参照するようにしてはいかがでしょうか?
zaki-kさん、ご回答ありがとうございます。
zaki-kさんのご回答で解決しそうです。
私はAccess初心者なので、画面Cへのコピーの仕方がわかりませんでした。(試しては見たのですが。。)
画面Cを開いていなくても、画面A,Bから
画面Cにコピーできるのでしょうか?
プログラミングが必要でしたら、
お手本を教えていただければ幸いです。
よろしくおねがいします!
フォームAとBからフォームCへ顧客noを伝えるということだけなら、以下の方法があります。
<<<標準モジュール内>>>
'モジュールレベルでの宣言
Private 顧客No As Integer
Sub setNo(ByVal i As Integer)
顧客No = i
End Sub
Function getNo() As Integer
getNo = 顧客No
End Function
<<<フォームA>>>
'テキストオブジェクトはフォームAの顧客noを入力するテキストボックス
'フォームAでのモジュールレベルでの宣言
Private No As Integer
Private Sub コマンド_Click()
Call setNo(No)
DoCmd.OpenForm ("フォームC")
'フォームCでは、テキストボックスがフォーカスを取るとフォームCのテキストボックスに顧客noをコピーするので一応やっておく(もしかしたらいらないかも・・)
Call Form_フォームC.テキスト.SetFocus
End Sub
Private Sub テキスト_Change()
No = Val(テキスト.Text)
End Sub
<<<フォームC>>>
'モジュールレベルで宣言する
Private No As Integer
Private Sub Form_Activate()
No = getNo
テキスト.SetFocus
End Sub
Private Sub テキスト_GotFocus()
'ここで顧客noを更新する
テキスト.Text = Str(No)
End Sub
フォームBのコードはフォームAと同じなので割愛します。
ただ、フォームA&Bの顧客noをフォームCにコピーしても、一番欲しい履歴情報がどうやったら取れるかまではわかりませんでした・・・
フォームCのクエリの条件に書き込むことにこだわらず、フォームを開くときの条件を設定することとすれば簡単では無いでしょうか?
フォームAまたはBからフォームCを開くボタンのサンプルコードです。
Private Sub Btn開く_Click()
Dim stLinkCriteria As String
stLinkCriteria = "[顧客No]=" & "'" & Me![顧客No条件] & "'"
DoCmd.OpenForm "フォームC", , , stLinkCriteria
End Sub
ここでフォームCのレコードソースは、フィールド「顧客No」が含まれるクエリであることとします。
フォームA,B,Cの3つだけでは難しそうなので、以下のようなフォーム4つでやってみてはどうでしょうか?
[フォームAorB]→[フォームX]→[フォームC]
フォームXとは何かというと、フォームA or Bから顧客Noをコピーして一時的にデータを預かるのです。なぜ、こういうことをするかというと、フォームCのデータを抽出するクエリはフォームCが更新されるときに先に顧客Noが決まっていないといけないようです。なので、フォームCのテキストボックスとかに顧客Noが表示されていても、フォームCがロードされるより先に決まってないのでダメのようです。
ということで話を進めますと、フォームCで使うクエリの顧客Noには
[Forms]![フォームX]![テキストボックス0]
を設定してください。
次にフォームA,B,XにVBAのコードを書くのですが、Visual Basic Editorでフォームのコードの部分を表示するためにフォームAのデザインビューで[コマンドボタン0]で右クリックして、イベントのビルドを選んでください。すると、フォームAのコードが表示されると思います。これをフォームB,Cについても同じことをしてください。
これで準備ができたので、コードを書いていきたいと思います。
<<<標準モジュール>>>
Private frmNo As Integer
Sub txtNo(ByVal i As Integer)
frmNo = i
End Sub
Function getNo() As Integer
getNo = frmNo
End Function
<<<フォームA>>>
Private No As Integer
Private Sub コマンド2_Click()
Call txtNo(No)
DoCmd.OpenForm ("フォームX")
Call Form_フォームX.テキストボックス3.SetFocus
End Sub
Private Sub テキスト0_Change()
No = Val(テキストボックス0.Text)
End Sub
<<<フォームX>>>
Private No As Integer
Private Sub Form_Activate()
No = getNo
テキストボックス3.SetFocus
End Sub
Private Sub コマンド2_Click()
DoCmd.OpenForm ("フォームC")
End Sub
Private Sub テキスト3_GotFocus()
テキストボックス3.Text = Str(No)
End Sub
フォームBについては割愛します。
もし、動かないときはレスください。3回目なので新しいスレッドをたててもらえれば、返事したいと思います。
freemannさん、ご回答ありがとうございます。
知りたいのは、以下のような状況です。
画面Aからクエリ1を呼出し、結果を画面Cに表示。
画面Bからもクエリ1を呼出し、結果を画面Cに表示。
具体的に言うと、画面A,Bとも顧客noのテキストボックスがあり、画面Cでその顧客noに対する履歴を
表示させたいのです。
お知恵をお貸しください。