MS Access パラメータクエリについての質問です。


いままで選択クエリの「抽出条件」に
[Forms]![フォーム名]![テキストボックスの名前]
を書いて実行していましたが、
複数のフォームからクエリを呼び出す必要がでてきました。

「抽出条件」の記述はどうすればよいでしょうか?
他の方法が必要なのでしょうか?

他の方法が必要、ということでしたら、
実現方法を教えてください。


なるべく手間がかからずに簡単にできる方法をさがしてます。

回答の条件
  • 1人3回まで
  • 登録:2006/07/22 15:13:49
  • 終了:2006/07/29 15:15:03

回答(6件)

id:freemann No.1

freemann回答回数316ベストアンサー獲得回数502006/07/22 15:58:36

ポイント19pt

いまいち把握しきれてませんが、一つのテーブルから複数の条件(複数のフォームからのクエリ複数の条件でクエリする)でクエリすると考えて、

クエリの抽出条件をANDなら、同じ横並びのところに条件を[Forms]![フォームの名前]![テキストボックスの名前]を複数書く、OR条件なら横並びにならないように条件に[Forms]![フォームの名前]![テキストボックスの名前]を書くでいいのかな?

的はずれでしたらごめんなさい。

id:ever_blue

freemannさん、ご回答ありがとうございます。

知りたいのは、以下のような状況です。

画面Aからクエリ1を呼出し、結果を画面Cに表示。

画面Bからもクエリ1を呼出し、結果を画面Cに表示。

具体的に言うと、画面A,Bとも顧客noのテキストボックスがあり、画面Cでその顧客noに対する履歴を

表示させたいのです。

お知恵をお貸しください。

2006/07/22 16:33:03
id:husigi No.2

husigi回答回数107ベストアンサー獲得回数62006/07/22 16:00:46

ポイント19pt

複数の抽出条件で選択クエリを実行するケースですが、

この条件が「and」の場合と「or」があると思います。

下記のように、

「and」の場合は同じ抽出条件列の複数のフィールドに条件を挿入し、

「or」の場合は異なる抽出条件列の複数のフィールドに条件を挿入するとよいでしょう。


http://www.seta.media.ryukoku.ac.jp/manual/office/access/query/s...

id:ever_blue

husigiさん,ご回答ありがとうございます。

状況はfreemannさんへの返信にて

ご説明させていただきました。

要は、呼出し元画面によって、

クエリの抽出条件の値(SQLの右辺)を変えたい

場合、どうすればよいかっていうことになります。

[Forms]![フォームの名前]![テキストボックス]

の記述が呼出し元によって変わりますので。

2006/07/22 16:38:14
id:zaikk No.3

zaikk回答回数192ベストアンサー獲得回数22006/07/22 17:18:55

ポイント18pt

画面Aからは画面Cのテキストボックスに顧客noをコピーし、画面Cを開く。

画面Bからも画面Cのテキストボックスに顧客noをコピーし、画面Cを開く。

クエリの「抽出条件」では、

[Forms]![画面C]![テキストボックス]

のように、画面Cのテキストボックスを参照するようにしてはいかがでしょうか?

id:ever_blue

zaki-kさん、ご回答ありがとうございます。

zaki-kさんのご回答で解決しそうです。

私はAccess初心者なので、画面Cへのコピーの仕方がわかりませんでした。(試しては見たのですが。。)

画面Cを開いていなくても、画面A,Bから

画面Cにコピーできるのでしょうか?

プログラミングが必要でしたら、

お手本を教えていただければ幸いです。

よろしくおねがいします!

2006/07/23 23:56:27
id:freemann No.4

freemann回答回数316ベストアンサー獲得回数502006/07/24 17:39:33

ポイント18pt

フォーム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にコピーしても、一番欲しい履歴情報がどうやったら取れるかまではわかりませんでした・・・

id:zaikk No.5

zaikk回答回数192ベストアンサー獲得回数22006/07/25 10:08:31

ポイント18pt

フォームCのクエリの条件に書き込むことにこだわらず、フォームを開くときの条件を設定することとすれば簡単では無いでしょうか?

フォームAまたはBからフォームCを開くボタンのサンプルコードです。

Private Sub Btn開く_Click()

Dim stLinkCriteria As String

stLinkCriteria = "[顧客No]=" & "'" & Me![顧客No条件] & "'"

DoCmd.OpenForm "フォームC", , , stLinkCriteria

End Sub


ここでフォームCのレコードソースは、フィールド「顧客No」が含まれるクエリであることとします。

id:freemann No.6

freemann回答回数316ベストアンサー獲得回数502006/07/25 22:17:19

ポイント18pt

フォーム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回目なので新しいスレッドをたててもらえれば、返事したいと思います。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません