アクセスクエリの検索で表示されない情報について

このQ&Aのポイント
  • アクセスクエリの検索結果が表示されない問題に困っています。具体的には、特定のキーワードより前の情報が表示されなくなる現象が発生しています。
  • 検索フォームを使用してクエリを入力すると、特定のキーワードより前の情報が表示されなくなります。例えば、あるキーワードで検索した場合、そのキーワードよりも前のキーワードに関する情報が表示されません。
  • この問題はクエリの特性によるものであり、特定のキーワードより前の情報を表示させる方法はありません。ご迷惑をおかけして申し訳ありませんが、ご理解いただければ幸いです。
回答を見る
  • ベストアンサー

アクセスのクエリについて質問です!困っています。

お世話になってます。 アクセス2000のことで質問です。 簡単なことかも知れませんが、教えてください。 フォームにクエリで検索フォームを作成しました。 テキストボックスに記入して、コマンドボタンを押したら検索し、 帳票で表示されるようになってます。 元になったテーブルにはあいうえお順で名前が入っています。 以下困っている内容です。 1回目検索する [佐々木]を検索。[佐々木]に含まれる情報が表示されます。 2回目検索する [足立]を検索。表示されない。 サ行以前のものは検索できないようになっている。 3回目検索する [田中]を検索。[田中]に含まれる情報が表示される。 ただし、4回目以後はタ行より先(チツテト~)しか表示されない。 というふうに、検索した言葉より前の言葉が表示されなくなってしまいます。 いったいどうしてこうなってしまうのでしょうか? これはクエリの特徴なのでしょうか? それとも解決する方法があるのでしょうか? わかりづらい説明で大変申し訳ないのですが、ご回答いただけないでしょうか。 どうかよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.2

フォームの構成/操作等イメージできていないので、的外れかもしれません。 (親フォームのレコードソースがどうなっているかわからないので) サブフォームの表示部分だけで良いですか。 (サブフォームから入力する場合は、入力チェック等々組み込む必要があります) ※ 下記は今回の動き(ご質問内容)についてのものではありません。   前のご質問をベースに記述したものになります。   今回の動きの原因はわかりません。(後述の余談部分が影響?) 仮定条件) コンボボックス「cbx1」で、テーブル「T01」を参照し顧客を選択、 日付の検索用テキストボックスが「txt1」になっていたとします。 (親側の表示状態がわからないので、検索に必要と思われるものに限定) 帳票フォームとして表示しているサブフォームのレコードソースは、 テーブル「T03」そのままのものとします。(抽出条件なし) サブフォームコントロール名を「FSUB」と仮定します。 また、リンク親/子フィールドは設定しません。 指定された検索条件で、サブフォームに Filter を設定します。 実行ボタン「btn1」で設定し、クリアボタン「btn2」で解除します。 親フォームへ記述:一例) Private Sub SetFilter(sS As String)   With Me.FSUB.Form     If (Len(sS) = 0) Then       .FilterOn = False       .Filter = ""     Else       .Filter = sS       .FilterOn = True     End If   End With End Sub Private Sub btn1_Click()   Dim sS As String   Const sAndOr As String = " AND "   sS = ""   If (Not IsNull(Me.cbx1)) Then     sS = sS & sAndOr & "顧客ID = " & Me.cbx1   End If   If (Not IsNull(Me.txt1)) Then     sS = sS & sAndOr & "日付 = #" & Me.txt1 & "#"   End If   If (Len(sS) > 0) Then     sS = "売上ID IN (SELECT 売上ID FROM T02 WHERE " _         & Mid(sS, Len(sAndOr) + 1) & ")"   End If   Call SetFilter(sS) End Sub Private Sub btn2_Click()   Me.cbx1 = Null   Me.txt1 = Null   Call SetFilter("") End Sub ※ 条件はテーブル「T02」に対して作成します。   その条件に合う「売上ID」で Filter を設定します。   ( IN句 を使うのがミソ?) ※ 条件により1つだけを指定するのであれば、     sS = "売上ID = " & Me.売上ID   のように "=" にしてみたり・・・いろいろと変形できると思います。 ※ 会社名の部分一致用にテキストボックス「txt2」を新設したとすると、  (コンボボックスの設定を優先してみると)  SetFilter 部分はそのまま流用し、「btn1」「btn2」部分を変更します。 Private Sub btn1_Click()   Dim sS As String   Const sAndOr As String = " AND "   sS = ""   If (Not IsNull(Me.cbx1)) Then     Me.txt2 = Null     sS = sS & sAndOr & "T02.顧客ID = " & Me.cbx1   ElseIf (Not IsNull(Me.txt2)) Then     sS = sS & sAndOr & "T01.会社名 Like '*" & Me.txt2 & "*'"   End If   If (Not IsNull(Me.txt1)) Then     sS = sS & sAndOr & "T02.日付 = #" & Me.txt1 & "#"   End If   If (Len(sS) > 0) Then     sS = "売上ID IN (SELECT 売上ID FROM T02 INNER JOIN T01 ON T02.顧客ID = T01.顧客ID WHERE " _         & Mid(sS, Len(sAndOr) + 1) & ")"   End If   Call SetFilter(sS) End Sub Private Sub btn2_Click()   Me.cbx1 = Null   Me.txt1 = Null   Me.txt2 = Null   Call SetFilter("") End Sub ※ Filter を使いたくない場合には、   事前にサブフォームのレコードソースに指定するクエリに記述しておけば   それなりに動くと思います。   その場合は、必要に応じてサブフォームを Requery します。 余談) LinkChildFields および LinkMasterFields プロパティについて、裏付けを取られたらと思います。 途中で設定を変えてもそこそこ動くようですが、ヘルプの中に気になる記述があります。 Access 2007 開発者用リファレンス > Access VBA リファレンス > SubForm オブジェクト > プロパティ Access 開発者用リファレンス SubForm."LinkChildFields/リンク子フィールド" プロパティ の真ん中あたりに ------------------- これらのプロパティは、デザイン ビュー (デザイン ビュー : データベース オブジェクト (テーブル、クエリ、フォーム、レポート、マクロ、およびデータ アクセス ページ) のデザインを表示するウィンドウ。デザイン ビューでは、新しいデータベース オブジェクトの作成と既存のデータベース オブジェクトの変更ができます。)、またはフォームやレポートの Open イベントの中で設定します。 ------------------- これに似た記述は、Access2000 のヘルプにもあります。 確認してみてください。 Open イベント以外での設定はできるし、エラーにもならない。 でも、このプロパティをいじったり、Filter も組み合わせたり・・・してみたり、 このような操作を繰り返していると動きがおかしくなってきたことがありました。 動的に変更するのではなく、固定して使われた方が良いような気がします。

nmt3942
質問者

お礼

お返事が大変遅くなってしまってすみません。 詳しい説明ありがとうございます。 30246kikuさんの説明に、従いやってみたのですがやはりできません…。 私のやり方が悪かったのだと思うのですが、検索ボタン(実行ボタン?)が反応しません。 やはり、最後のところでおっしゃってる通り、 結局アクセス2000の仕様なのだと思い、あっさり諦め、固定して使おうかと思います…。 わかりにくい状況の中、丁寧に説明してくださりありがとうございました。

その他の回答 (2)

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.3

#2です > やはり、最後のところでおっしゃってる通り、 ということは、今回のご質問でも クエリだけではなくリンク親/子フィールドも動的に変更していたという事でしょうか (前回のご質問を参考にされた記述があったので、もしかしてと・・・・) > 結局アクセス2000の仕様なのだと思い、・・・・ Access2007 のヘルプにも記述があるので、2000 限定ではないように思います。 この記述を仕様とみるのか・・・・でも、仕様なんですかね ただ、そこそこ動くんですよね・・・ でも、変な動きをする時があるので、固定しておいた方が良さそう・・・と思います。 > 私のやり方が悪かったのだと思うのですが、検索ボタン(実行ボタン?)が反応しません。 という事ですが、#2で記述していなかった前提があります。 (VBA読むとわかるかな・・・で忘れてました) テーブル「T01」「T02」にある「顧客ID」は数値型、 テーブル「T02」にある「日付」は日付/時刻型、 テーブル「T02」「T03」にある「売上ID」も数値型 (でも、これが違えばエラーは出たような) #2は、 ・リンク親/子フィールドは何も設定しない(で、固定して使う) ・それにより、サブフォームからの入力は処理が増える ・サブフォーム(T03の帳票表示フォーム)の Filter 指定で IN 句を使う  (時には "=" でも) 会社名の部分一致であれば、(例では「商事」) SELECT 売上ID FROM T02 INNER JOIN T01 ON T02.顧客ID=T01.顧客ID WHERE T01.会社名 Like '*商事*' とすると、会社名に "商事" が含まれる「T02」での 売上ID が求まるので それを IN 句で指定した以下 "売上ID IN (・・・・前述の内容・・・・・・)" の様に Filter 設定します。(#2の2つ目のパターン) (IN の前にある「売上ID」は、サブフォームの「T03」でのものになります) 親フォームのレコードソースがテーブル「T02」をベースにしたものであったのなら、 サブフォームへの指定だけではなく、親の Filter へも共通に利用できると思います。 WEBを探すと、同じ様なテーブル/フォーム構成でのサンプルがあったように思います。 以下も参考程度で) #2での動きを確認してみます(最低限の確認用です) ・新規 mdb を作成し、テーブル「T01」「T02」「T03」をインポートしておきます ・テーブル「T01」「T02」にある「顧客ID」は数値型、  テーブル「T02」にある「日付」は日付/時刻型、  テーブル「T02」「T03」にある「売上ID」も数値型を確認します ・テーブル「T03」を元にフォームウィザードで、表形式としてフォームを作成します  フォーム名を「FSUB」とし、閉じておきます ・新規フォームをデザインで作成していきます ・コンボボックス「cbx1」を配置します  値集合ソース:テーブル「T01」  列数:2  連結列:1 ・テキストボックス「txt1」を配置し、書式を「日付(S)」 ・テキストボックス「txt2」を配置します ・コマンドボタン、実行用「btn1」クリア用「btn2」を配置します ・作ってあったフォーム「FSUB」を上記配置した下側にドラッグ&ドロップします ・コマンドボタン「btn1」のプロパティで「クリック時」を「イベントプロシージャ」にし、  右横の「・・・」をクリックします Private Sub btn1_Click() End Sub の表示になるので、以下と置き換えます。 Private Sub SetFilter(sS As String)   With Me.FSUB.Form     If (Len(sS) = 0) Then       .FilterOn = False       .Filter = ""     Else       .Filter = sS       .FilterOn = True     End If   End With End Sub Private Sub btn1_Click()   Dim sS As String   Const sAndOr As String = " AND "   sS = ""   If (Not IsNull(Me.cbx1)) Then     Me.txt2 = Null     sS = sS & sAndOr & "T02.顧客ID = " & Me.cbx1 ' ★   ElseIf (Not IsNull(Me.txt2)) Then     sS = sS & sAndOr & "T01.会社名 Like '*" & Me.txt2 & "*'"   End If   If (Not IsNull(Me.txt1)) Then     sS = sS & sAndOr & "T02.日付 = #" & Me.txt1 & "#"   End If   If (Len(sS) > 0) Then     sS = "売上ID IN (SELECT 売上ID FROM T02 INNER JOIN T01 ON T02.顧客ID = T01.顧客ID WHERE " _         & Mid(sS, Len(sAndOr) + 1) & ")"   End If   Call SetFilter(sS) End Sub Private Sub btn2_Click()   Me.cbx1 = Null   Me.txt1 = Null   Me.txt2 = Null   Call SetFilter("") End Sub ※ 「顧客ID」がテキスト型であったのなら、★部分は     sS = sS & sAndOr & "T02.顧客ID = '" & Me.cbx1 & "'"   のように ' ' で値を囲みます 一通り完成したので、フォームビューで動きを確かめてみます。 コンボボックスで選んで、実行「btn1」を押してみる、とか テキストボックス「txt2」に 「商事」と入れて、実行を押してみる・・・とか この確認では、親フォームのレコードソースは設定していませんでしたが、 テーブル「T02」をベースにしたものが指定され、 「売上ID」名のテキストボックスがあったとした場合(連結状態とした場合)、 サブフォームから入力するには、サブフォーム内の「挿入前処理」で Private Sub Form_BeforeInsert(Cancel As Integer)   If (IsNull(Me.Parent.売上ID)) Then     Cancel = True   Else     Me.売上ID = Me.Parent.売上ID   End If End Sub のように、 ・親の「売上ID」が設定されていなかったら編集状態にしない ・テーブル「T03」登録に必要な「売上ID」を親から持ってくる 処理が最低限必要になると思います。 また、同一売上IDを登録できないようにするとか・・・・ (重複を許可する?とか・・・・) ※ リンク親/子フィールドに「売上ID」が設定されていた場合、 上記での親から「売上ID」を持ってくる処理は Access さんがやってくれてました。 リンク親/子フィールドを設定していないので、自分で処理する必要があります。 また、リンク親/子フィールドに「売上ID」が設定されていたら、 サブフォームへ複数の「売上ID」を表示することはできません。 (これに対して複数表示したい・・・が、前回ご質問の趣旨だったのかと思います) なお、テーブル「T03」に日付がないもので確認していました。 (Filter を作成する時点でテーブル「T03」は使っていないので) 今回のご質問への回答になっていたでしょうか・・・・ 前回のものについてばかりで・・・ 失礼しました。

nmt3942
質問者

補足

お返事ありがとうございます。 このコメントを見て、最初から作り直そうと初期の状態を一応作動させたら正常に動きました…。 質問していたような現象にはならず、きちんと後方検索も行えました。 最初からと言っても、 http://oshiete.goo.ne.jp/qa/7043481.html ここで作成したデータを元にコピーしたものです。 以前の検索が行えなかった段階から、いじったり何も変更した点はないのですが…。 なぜ正常?に動くようになったのか理解もできず、もやもやした状態です。 しかし、動くようになったものを動かなくすることもできないので、 こちらのコメントで教えていただいた方法は補完として使用させていただきます! いつまた検索できなくなるかわからないので…笑 残念ながらこちらのコメントを私が理解するまで今しばらく時間がかかります。 ベストアンサーに選ばせていただきたいのですが、また質問がでるかもしれないので、 しばらくの間、この状態のままにさせておいてください。 大変申し訳ないのですが、よろしくお願いします。

  • ShowMeHow
  • ベストアンサー率28% (1424/5027)
回答No.1

普通はそういう風にはならないと思います。 (クエリの表示で)SQL文を出していただけたら、何かわかるかも知れません。 誰かほかの人が作ったものなら、 レコードソースのデータが検索することによって書き換えられているかどうかご確認ください。 (わざとそういう仕組みにしてある可能性もなきにしもあらず) あとは、ほかの端末で動きを試してみるとか、最適化・修復をやってみるとか、くらいしか思いつきません。

nmt3942
質問者

補足

そういう仕様ではないのですね。 先日こちらで質問して回答していただいたクエリを参考にし作成しました。 http://oshiete.goo.ne.jp/qa/7043481.html これを見ただけでは私には何がその仕組みにしているのか ということをわかりかねます。 すみませんが、ご回答いただけるようであれば、よろしくお願いします。

関連するQ&A

  • アクセス2000でクエリを組んだのですが。。。

    こんにちわ。アクセス初心者です。まず順に追って説明します。 (1)15000件ある顧客名簿と1500件ある担当会社のテーブルをリレーションで結び、クエリを組みました。「Q_顧客名簿」と名づけました。その時点で15000件データが存在します。 (2)フォーム「Q_顧客名簿」を元にフォームを作成しました。そして氏名の曖昧検索をしたいのでまずフォームのテキストボックスに「氏名検索」と名づけて、クエリの画面に戻り「Q_顧客名簿」を元に新たなクエリを組み、「氏名」のフィールドの抽出方法に以下のような文を入れました。 『Like "*" & [forms]![集合フォーム_1]![氏名検索] & "*"』 このクエリを「Q_氏名検索」と名づけました。 (3)フォームの左端をに「Q_氏名検索」が生きるよう設定をし、「氏名検索」のテキストボックスに「再クエリ」を組んだのですが、顧客データ数が15000あるはずなのが11000まで減ってしまいました。 おそらく検索式に何かが足りないのだと思うのですが、SQLやVBAがわからないのでどうすればいいかわかりません。 アクセスの詳しい方、教えていただけませんでしょうか?よろしくお願いいたします。

  • ACCESS2003でクエリを使った検索フォームを作っています。

    ACCESS2003でクエリを使った検索フォームを作っています。 クエリは以下の様になっています。 ----------  番号   タイプ   品名  1111   AA     商品1  2222   AA     しょうひん2  3333   BB     商品しょうひん3 ---------- 品名のフィールドの抽出条件に ---------- Like "*" & [Forms]![品名検索フォーム]![品名検索] & "*" ---------- と入れています。 品名検索フォームは帳票タイプで、フォームヘッダーにテキストボックスを設け 「品名検索」と名前をつけています。 テキストボックスに【商品】と入力すれば番号1111と3333が、【しょうひん】と入力すれば 番号2222と3333が抽出されるように設定し、ここはうまく動きました。 ただ、このフォームを開いた際、テキストボックスは空欄になっているため、全レコードが 表示されてしまいます。テキストボックスが空欄の際は、何も表示したくないのですが どこを触ればいいのでしょうか? どうかよろしくお願いいたします。

  • Access97でのフォームのカウント

    Access97で帳票フォームを使用したとき そのフォーム内にカウンタを付けることはできるでしょうか? クエリーなどで抽出し一覧表示させたときに一から順にカウントアップしていく欄を作りたいのですが。 レポートでは同様のことができました。

  • アクセスの削除クエリでいいのでしょうか?

     データベースで検索できるようにしたいのですが・・・・。クエリの検索結果をフォームに反映させています。  検索結果表示後、もう一度検索フォームに戻り、検索をかけたときヒットするデータがないにも関わらず前回の検索結果が表示されたままになってしまいます。 削除クエリを使用すればいいのでしょうか?  また削除クエリをどのように設定したらいいのでしょうか?(たとえば抽出条件が必要なのでしょうか?)  この場合、マクロはいったん削除クエリを開き、もう一度クエリを開く設定でいいのでしょうか?分かりにくい質問ですいませんが教えてください

  • 【ACCESS】フォームのレコードソースのクエリを動的に書き直したときの、フォームの再描画

    ACCESS2002 帳票フォームのレコードソースにクエリを指定しています。 フォーム上のコマンドボタンを押したイベントで、その レコードソースとしているクエリのSQLを書き直しています。 問題は、その書き直したクエリをもとにして画面をもう一度 表示させなおしたい(リフレッシュさせたい)ということです。   docmd.close acForm,"フォーム名"   docmd.open "フォーム名" とすると、書き直したクエリの内容でフォームが表示されます。 フォームを閉じる→フォームを開くとしないで、フォームを リフレッシュさせる方法はないのでしょうか?

  • Accessのクエリ

    初めまして。Accessのクエリについての質問です。 Access2003を使っています。 検索フォームを作り、その検索フォームにテキストボックスを2つ作り、そのテキストボックスに検索したい言葉を入力し、コマンドボタンで作った検索ボタンを押すとマクロでフィルタの実行がされデータを抽出できるというものを作りました。フィルタには選択クエリを使用しています。抽出したい2つのフィールドの抽出条件にあいまい条件のLike "*" & [Forms]![フォーム名]![テキストボックス名] & "*"を入れています。 今はテキストボックスが2つですが、もっと増やしていろんな条件で検索出来るようにしたいので、3つ目のテキストボックスを作り、抽出条件も同じように入れました。ですが、そうすると今までちゃんとできていた最初の2つのテキストボックスによる抽出が違った結果となりでてきました。このとき、新しく作った3つ目のテキストボックスは空欄なので最初と同じ結果が出ると思ったのですが、これは抽出条件が3つはできないということでしょうか?どなたか教えてください。

  • Access クエリについて

    初めまして。Accessのクエリについての質問です。 Access2003です。 検索フォームを作り、その検索フォームにテキストボックスを2つ作り、そのテキストボックスに検索したい言葉を入力し、コマンドボタンで作った検索ボタンを押すとマクロでフィルタの実行がされデータを抽出できるというものを作りました。フィルタには選択クエリを使用しています。抽出したい2つのフィールドの抽出条件に[forms]![フォーム名]![テキストボックス名]を入れています。 今は2つのテキストボックス両方に言葉を入力するとデータが抽出されますが、これを1つのテキストボックスだけ入力でもデータが抽出されるようにしたいのですが可能ですか?今は一つのテキストボックスに言葉を入力しもう一つを空欄にすると何もデータが出てこない状態です。 2つのテキストボックスをテキスト(1)とテキスト(2)とすると 以下のようにデータを抽出したいです。 ・テキスト(1)とテキスト(2)に入力 →両方の言葉が一致したデータ ・テキスト(1)だけに入力  →テキスト(1)の言葉だけ一致したデータ ・テキスト(2)だけに入力  →テキスト(2)の言葉だけ一致したデータ 初歩的な質問でしたら申し訳ないです。どうかお願いします。

  • ユニオンクエリについて質問です

    ユニオンクエリで表示したデータを元に表示されている日付を検索するようなフォームを作成したいのです。 テキストBOXに入力した日付と同じ日付のデータを持っているものを検索する時、再クエリをする必要があるとおもうのですが、ユニオンクエリをSQLで作成したので、再クエリの仕方が分かりません。 教えてください。よろしくお願いします

  • クエリ「パラメータ」検索結果を単票と一覧で表示II

    [使用ツール]ACCESS2007 [データベースの構成] テーブル名:情報データベース 単票フォーム名:情報フォーム 一覧フォーム名:情報一覧フォーム クエリ名:情報クエリ=「抽出条件」欄のパラメーター「Like "*" & [情報検索] & "*"」 [やりたいこと] 情報クエリ「パラメーター」の検索結果を単票「単票フォーム」と「一覧フォーム」を使い分けて閲覧効率を上げたい。 [考えたこと、やってみたこと] ケース1:検索結果5レコード以下「単票フォーム」、5レコード以上「一覧フォーム」で開く。 ケース2:埋め込みマクロで「単票フォーム」「一覧フォーム」の両方同時に開き「一覧フォーム」は最小化させる。「単票フォーム」を閉じると「一覧フォーム」が開く。 [確認できた課題] ケース1:多少の理解が可能な「埋め込みマクロ」で考えたが、スキル不足で試作にも入れず。 ケース2:「単票フォーム」「帳票フォーム」を同時に開いた時点で、両方の「パラメータダイアログ」が表示され、入力しないと「帳票フォーム」は最小化されない問題を解決できない。 (現状のスキルでは「単票フォーム」にコマンドボタンを配し、コマンドボタンで「帳票フォーム」を開いて検索を行う方法になり、操作「手間」を考えると結果的に非効率である。) [わかったこと] ケース1の方が設定後に「レコード数」の希望数値に変更することで調整が可能であり、設定全体を大きく変更することもないのでスキルが低くても使い続けられる。 【追 伸】 アドバイスをお願いするに当たり、スキル(質問者として)を知って頂くことが必要だと改めて感じて居ります。その為には情報をお伝えする以外にないと思いました「面倒だから聞いて居ると思われない為にも!」。今回、以下の内容で最初に質問させていただきましたが、「実現の可否も想像すらできておりませんでしたので、一旦、実現に向けて再度考えてみて質問IIとしました。(短絡的に取り下げたのではなく、実現の可否判断ができない為)」 [やりたいこと] 情報クエリ「パラメーター」の検索結果を単票「情報フォーム」で表示させていますが、レコード数が多い場合に一覧表示「情報一覧フォーム」させたいと考えています。 [希望の動作] 検索結果を単票「情報フォーム」で表示の後、レコード数の多い場合に情報フォームに配した「コマンドボタン」をクリックすることで、単票での検索済結果を「情報一覧フォーム」へ一覧表示させたい。 宜しく、お願いします。

  • 【Access2003】

    お世話になります。 検索フォーム(帳票フォーム)にて各レコードにチェックボックスを設けています。 クエリにて抽出した全レコードのチェックボックスを選択(Yes)したいのですが うまくいません。 宜しくお願い致します。

専門家に質問してみよう