- ベストアンサー
DAOでテーブルの内容を検索する方法
- DAOを使用してテーブルの内容を検索する方法について説明します。
- フォームで取得した値をテーブルで検索し、条件に応じて命令を実行します。
- コマンドボタンのイベントプロシージャからテストテーブルを作成し、条件に基づいてクエリやフォームを操作します。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
F_テストではテキストボックスなどの名前は あらかじめ設定してあるものとして、以下のように 変更してみてください。 >Forms(F_テスト).RecordSource = "Q_TSテストA" >Forms(F_テスト).Visible = True を Forms!F_テスト.RecordSource = "Q_TSテストA" Forms!F_テスト.Visible = True >Forms(F_テスト).RecordSource = "TS_テスト" >Forms(F_テスト).Visible = True を Forms!F_テスト.RecordSource = "TS_テスト" Forms!F_テスト.Visible = True
その他の回答 (7)
- layy
- ベストアンサー率23% (292/1222)
ELSE時のみで実行したいクエリは※箇所で記述というのでなく、フォームの閉じるときのアクションにて状態判断し実行、でできるのでは?、と思ってます。 構造ややこしくさせていれば逆効果なので、まず2フォームで作って動作確認し確実なものにしてから、レコードソース切替たりした1フォーム化での合併を考える方が修正作業が少ないように思います。
お礼
ありがとうございます。その通りだと思います。その方向で考えてみます。
- piroin654
- ベストアンサー率75% (692/917)
質問を良く見たら、 >また,ELSEのときだけ,F_テストの閉じるときに, >クエリを入れたいのですが… は、 >elseのときだけF_テストのフォームを閉じるときに >追加クエリを実行させたい ということなのですね。 では閉じるときにRecordsourceにクエリを入れる という解釈は読み間違いだということならば、 方法はやはり#6での回答のように閉じるボタンを 設定し、ElseのときのRecordsourceがTS_テスト であることを確認して追加クエリを実行する、という タイミングが一番わかりやすい、と思われます。 少し、確認してみます。
お礼
いろいろありがとうございました。 わかりにくいと思いますが,以下のようにしたことで解決しました。 本当にありがとうございました。 If myRS.NoMatch = False Then DoCmd.OpenForm "F_テスト" Else DoCmd.OpenQuery "Q_TSテストB" '生徒全員が入った空のテーブルをつくる(学期ID,生徒ID,テストID入り) DoCmd.OpenQuery "Q_テストadd" '空のテーブルをデーターテーブルに連結する DoCmd.OpenForm "F_テスト" 'データテーブルからデータを読み込む End If
補足
ありがとうございます。 自分としてはNo.2の補足に書いたプログラムの … Else DoCmd.OpenQuery "Q_TSテストB" DoCmd.OpenQuery "Q_テスト" DoCmd.OpenForm "F_テスト", , , , , acHidden Forms(F_テスト).Visible = True Else DoCmd.OpenQuery "Q_TSテストB" DoCmd.OpenQuery "Q_テスト" DoCmd.OpenForm "F_テスト", , , , , acHidden Forms(F_テスト).RecordSource = "TS_テスト" ※ Forms(F_テスト).Visible = True End If … の※のところに「F_テストを閉じるときのイベントプロシージャに,Q_テストadd(追加クエリ)を行う」という命令をいれなさい。 というプログラムを入れればいいと思っていますが,どう書けばいいのかわかりません…
- piroin654
- ベストアンサー率75% (692/917)
もし、一連の処理が Private Sub テストテーブル作成_Click() Dim gakki As Integer Dim test As Integer Me.学期 = gakki Me.テスト = test Call testテーブル作成 End Sub を設定しているフォームを開いたままならば、 このフォームにF_テストを閉じるボタンを くっつけてF_テストのレコードソースが Elseの場合のTS_テストであるかを取り出して コードを実行できるかもしれませんが。 まだ、確認していないので結論は後ほど、 というところです。
- piroin654
- ベストアンサー率75% (692/917)
質問の積み残しがありました。 >また,ELSEのときだけ,F_テストの閉じるときに, >クエリを入れたいのですが… どこかで、以下のコードを入れればいいのですが、 DoCmd.OpenForm "F_テスト", acDesign, , , , acHidden Forms!F_テスト.RecordSource = "Qaaa" DoCmd.Close acForm, "F_テスト", acSaveYes フォームにボタンをくっつけてそのイベントで 試してみてください。 Private Sub ボタン_Click() DoCmd.OpenForm "F_テスト", acDesign, , , , acHidden Forms!F_テスト.RecordSource = "Qaaa" DoCmd.Close acForm, "F_テスト", acSaveYes End Sub このような感じ。 ただ、これを入れると、F_テストのRecordsourceは クエリ"Qaaa"で確定することになります。 もちろん、コードで必要に応じて実行時の Recordsourceは変更できますから問題では ないのですが。どうしても確定させておくことが 必要ですか。 ただ、これをどこで入れるかが問題のような感じです。 要望では「ELSEのときだけ,F_テストの閉じるときに」 の閉じる時の場合を設定しなければなりません。 Elseのときに閉じる場合にF_テストに引導を渡す タイミングをどのように取り出すかが問題です。 つまり、いったんF_テストをデザインビューで 開く必要があるからです。こうしないといくら ノーマルの状態でRecordsourceを設定しても 閉じてしまうとRecordsourceは元に戻ってしまうからです。 このあたりを検討してみてください。 変更はどこかで可能だと思いますが。
- layy
- ベストアンサー率23% (292/1222)
似たような存在チェック質問がありますので、今後の参考 http://okwave.jp/qa/q2061114.html Accessでのレコード存在チェック >ただ,フォームのレコードソースが変わりません… レコードソースを変えたのに表示内容が変わらない、でしょうか。 記述省略しているのかどうだかわかりませんが、 レコードソースを変えたあとには再クエリを実行してみてください。 >また,ELSEのときだけ,F_テストの閉じるときに,クエリを入れたいのですが… 同じフォームを開くけども条件が異なる。 ELSEのときだけの処理を追加したい、でしょうか。 F_テストの閉じるときに「If myRS.NoMatch = True 」と同意のIF条件を追加し判定できれば THENのときは偽なのでスルーし、 ELSEのとき真なので処理されるかと思います。 件数カウント=0時 "Q_TSテストA"のレコードソースで "F_テスト"を開く 閉じるときで、「件数カウント>0時クエリ実行」としても何もしない 件数カウント>0時 "TS_テスト"のレコードソースで "F_テスト"を開く 閉じるときで、「件数カウント>0時クエリ実行」としたらクエリは実行される ※ 実際にシュミレーション、確認まではしていませんので 参考レベルです。
補足
いつもありがとうございます。elseのときだけF_テストのフォームを閉じるときに追加クエリを実行させたいのですが,どうやって書けばよいのかわからないため,質問させていただきました。自分でも勉強しますので,時間があればよろしくお願いします。
- piroin654
- ベストアンサー率75% (692/917)
Set myRS = myDB.OpenRecordset("T_生徒テスト") を Set myRS = myDB.OpenRecordset("T_生徒テスト", dbOpenDynaset) にしてみてください。
補足
ありがとうございます。 修正して以下のようにすればエラーはなくなりました。 ただ,フォームのレコードソースが変わりません… また,ELSEのときだけ,F_テストの閉じるときに,クエリを入れたいのですが… もしお時間があればご指導お願いします。 Sub testテーブル作成() Dim myDB As DAO.Database Dim myRS As DAO.Recordset Dim gakki As Integer Dim test As Integer gakki = Forms![F_test]![学期] test = Forms![F_test]![テスト] Set myDB = CurrentDb Set myRS = myDB.OpenRecordset("T_生徒テスト", dbOpenDynaset) myRS.FindFirst "学期ID=" & "" & gakki & "" & "AND テストID =" & "" & test & "" If myRS.NoMatch = False Then DoCmd.OpenForm "F_テスト", , , , , acHidden Forms(F_テスト).RecordSource = "Q_TSテストA" Forms(F_テスト).Visible = True Else DoCmd.OpenQuery "Q_TSテストB" DoCmd.OpenQuery "Q_テスト" DoCmd.OpenForm "F_テスト", , , , , acHidden Forms(F_テスト).RecordSource = "TS_テスト" Forms(F_テスト).Visible = True End If myRS.Close: Set myRS = Nothing myDB.Close: Set myDB = Nothing End Sub
- layy
- ベストアンサー率23% (292/1222)
クエリの妥当性はわかりませんが OpenRecordSetでテーブル指定でなく求めたい条件のSQLを指定してはどうですか?。 SELECT * FROM 生徒テスト WHERE 学期ID~ それが1件でもあれば、ならDCOUNTで求めるだけでもよさそうです。
お礼
毎回いろいろと教えていただいてありがとうございます。勉強になります。
お礼
ありがとうございます。うごきました。