- ベストアンサー
フィールドのデータ型で検索結果に差が出る[2]
- フィールドのデータ型と検索条件の違いで検索結果に差が出ることがあります。
- フィールドのデータ型が「メモ形」かつ検索条件が「And」の場合、正常に検索できないことがあります。
- クエリのパラメータ検索において、フィールドのデータ型が「メモ形」かつ検索条件が「And」の時だけ検索できません。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
> 「検索1の文字列がフィールドに含まれる。検索2の文字列がフィールドに含まれる。検索3の文字列がフィールドに含まれる。上記すべての条件が合致するデータ」となっていました どこかがそのようになっていたのでしょう? No1での確認は検索1と検索2はフィールドの最後にあるのですかです。そうだとした場合、検索1と検索2 が両方存在する意味はないような気がしますが。 Like "*" & [Forms]![情報]![検索1] & "*" And Like "*" & [Forms]![情報]![検索2] & "*" And Like "*" & [Forms]![情報]![検索3] & "*" 上記の式でしたらそれぞれが含まれるという条件になると思います。改行を含んでの文字列は範囲に入りません。「あいう[改行]えお」の「うえ」は駄目ということです。 ちなみに、クエリに最初の抽出条件を-1として式1となる数式が入ったフィールドはないですよね。
その他の回答 (4)
- chayamati
- ベストアンサー率41% (260/624)
回答No.2の続きです 先ず添付図をご覧ください メニューフォームと世界情報フォームの画面を重ねています。 メニューフォームには 世界情報フォームを開くラベルボックス[世界情報] 前回でお知らせした様のタイトルを標題したコンボボックス[標題Key]、[情報Key] この2つのコンボボックスでクエリにフィールド追加しました このレコードソース別にテーブルを作成してあらかじめよく使う文字列を登録をして置くと 良いでしょう、また手入力も可能です メニュー上の[世界情報]のクリックイベントで[世界情報]フォームを開くコードは 前回はそれぞれのKeyのExitイベントで開きましたが、操作性向上の為替えました ------------------------------------------------------ Private Sub 世界情報_Click() DoCmd.OpenForm "世界情報" End Sub ------------------------------------------------------- 最初からの不都合が不明のままで、これが情報の文字数に関わりあると考え クエリのフィールドに「文字数: Len([情報])」と追加しました。 結果が添付画面です。 どうやら2033文字が限界の様です。 短いテキスト形にはフィールドサイズプッロパティーがあるのに 長いテキスト形、メモ形にはありません ご存知とは思いますが Eval(),BuildCriteria()、Len()結果は文字列、数値ですのでクエリー上のフィールド行に配置 Likeは比較演算子なのでクエリー上の抽出条件行以下の行に配置 同じ行ではAnd条件行が違えばOr条件になります 標題の抽出条件行にLike "*" & [Forms]![メニュー]![標題Key] & "*" 情報の抽出条件行にLike "*" & [Forms]![メニュー]![情報Key] & "*" これでよいのですが全てのレコードを上記のAnd条件を無効にするため 標題のまたは行にLike [標題Key] & "*" Or Like "*" 世界情報フォームの情報フィールド文字列が長い(2033以内)ので フォームフッタに移動しました(赤枠内) ここでは広いフィールド枠が確保できます。 添付の左端▶印(フィールドセレクタと呼びます)の情報が表示されています 数名の方と対応大変なところ補足有難うございます。 翌日は予定が詰まっているので明後日以降検討になりますが 検索条件(Like)部分から検討ください
お礼
ありがとうございました。抽出条件欄への記述がシンプルで驚きましたが、複数のフィールドを対象「2個・3個」に試行検証を行いましたが問題なく検索できました。タイトルに分類付して登録することを避けたい情報「ピンポイントで検索」もありますので、設定がシンプル「式が短いなど・・・」であることも良いと感じました。従いまして、データベースの情報内容「文字情報が数千のDBの存在・・・」で使い分けて行きたいと思います。実際には絞り込み検索も併用しておりますが、整理した分類「対象数が増える」では無くて記憶「かすかな・直感」で検索「単語など・・・」するには、フリー検索「パラメーター検索」が最も有効かと改めて実感しました。検索ツールの充実化でデータベースの作り方も再考したく思っています。そうした意味からも気になる点等があれば、今後もアドバイスをお願いしたいと思います。本当に有難うございました。 Like "*" & [Forms]![メニュー]![標題Key] & "*"(問題なく検索) Like "*" & [Forms]![メニュー]![情報Key] & "*"(問題なく検索)
- kkkkkm
- ベストアンサー率66% (1734/2604)
> 現状で完全にパスすると「Or条件(Andは検索結果を返します)」では、全てのデータが表示されます 「*」の効果を理解するとそのようになる原因がわかると思います。 以下説明が下手ですがご容赦ください。 「*」はワイルドカード文字といわれるものですべてのデータを表します。 Like "*" は、すべてのデータと一致という意味になります。 Like "*" & [Forms]![情報]![検索1] & "*" And Like "*" & [Forms]![情報]![検索2] & "*" And Like "*" & [Forms]![情報]![検索3] & "*" では Like "*" & [Forms]![情報]![検索X] & "*" ←上記はこれをAnd(もしくはOr)で繰り返しです は Like *入力された文字列* と展開されます。 なので 検索1のパラメーターに「あいう」を入れた場合 Like "*あいう*" 検索2のパラメーターに何も入れない場合 Like "**" 検索3のパラメーターに何も入れない場合 Like "**" という3個の条件が作成されます。 Like "**"はLike "*"と同じですのですべてのデータと一致です。 なので Andの場合 「あいう」が含まれるデータ かつ すべてのデータ かつ すべてのデータ となり結果「あいう」が含まれたデータが結果として返ります。 Orの場合 「あいう」が含まれるデータ もしくは すべてのデータ もしくは すべてのデータ となり結果すべてのデータが返ります。 ですので、Orでパス(未入力)をして必要なデータだけ返すことはできないと思われます。 検索用のテキストボックスでしたら、既定値に検索文字列としてありえない文字列を入れておくと、検索1だけの入力で必要なデータが返ります。 これからもLike演算子を使う事があると思いますので以下のサイトで WHERE 句とか説明がありますが、無視してもいいですので Likeでワイルドカードを利用するとはどのような事なのかを発見してください。 質問のパターンとNo3のパターンで結果が違うのがなぜなのか、「*」等のある場所で検索結果が違うのがわかると思います。 Like 演算子 https://support.office.com/ja-jp/article/like-%E6%BC%94%E7%AE%97%E5%AD%90-b2f7ef03-9085-4ffb-9829-eef18358e931
お礼
ありがとうございます。ヒント「ありえない文字列を入れておくと、検索1だけの入力で必要なデータが返ります」ありがとうございます。
- chayamati
- ベストアンサー率41% (260/624)
最初のQの報告です。 評価有難うございました。しかし解決には至ていません 再確認よろしくお願いします。 Eval()関数,BuildCriteria()関数初めてです。 おまけにEvalの中にBuildCriteriaが入れ子に成っているとは 入れ子はExcelで使いますが、Accessでも使えるのですね これらの関数を検索しました。 Evalの解説 https://www.accessdbstudy.net/entry/20101022/p1 BuildCriteriaの解説 https://www.accessdbstudy.net/entry/20100924/p1 お陰であなたの質問に取組めるようになりました。 いい勉強をさせて頂きました、有難うございます --------------------------------------------------------------------------------------- あなたの期待はずれかもわかりませんが、情報の文字数が2014超えるとエラーが発生します。 情報の文字数が1024を超えるとエラーになるようです。 ・テーブル:世界情報 ・フォーム:世界情報 ・フィールド名:情報 フィールドサイズ:メモ1024文字を超えても暫く良いですが2048文字にではダメです ・フォールド名:標題 フィールドサイズ:200 タイトルを標題に変更したのは、命令文のチェックの為です。 世界情報のフォーム起動するためのメニューフォームに情報の検索Key,標題Keyのテキストボックスを メニュー上に配置し、 ------------------------------------------------------------------- Private Sub 情報Key_Exit(Cancel As Integer) DoCmd.OpenForm "世界情報" End Sub ----------------------------------------------------------------- 添付は フォームのクエリビルダによるクエリです 標題と情報はテーブルの情報です。また残りの2つは標題と情報より求める式が下記のように入っています 結果は-1と0のYes/No型が返ってきます。 標題Key: Eval(BuildCriteria("'" & [標題] & "'",10,"*" & Replace([Forms]![メニュー]![標題key]," ","* And *") & "*")) 情報Key: Eval(BuildCriteria("'" & [情報] & "'",10,"*" & Replace([Forms]![メニュー]![情報key]," ","* And *") & "*")) ------------------------------------------------------------------------------------ 要約09: Eval(BuildCriteria("'" & [情報] & "'",10,"*" & Replace([forms!メニュー!内容])]," ","* And *") & "*"))要約09: Eeria("'" & [情報] & "'",10,"*" & Replace([内容(一文字可)]," ","* And *") & "*"))
補足
ありがとうございます。取り急ぎご報告致します。 1,下記のアドバイス「設定」ですが対処「分かっていない(すいません)」できていません。 世界情報のフォーム起動するためのメニューフォームに情報の検索Key,標題Keyのテキストボックスをメニュー上に配置し、 ------------------------------------------------------------------- Private Sub 情報Key_Exit(Cancel As Integer) DoCmd.OpenForm "世界情報" End Sub 2,試行検証のご報告 試行検証「ざっくりですが」の結果は以下の通りですが、メモ型テキストが上手く行っていません。「下記の記述をクエリに記載しました」フォームは4つ作りました。世界フォームマスターにコマンドボタンを4個配し、それぞれのフォーム「世界情報フォーム1,2,3,4」を開いています。 ・テーブル:世界情報 ・フォーム:世界情報フォーム1,2,3,4(4フォーム) ・フィールド名:情報 フィールドサイズ:メモ型 ・フォールド名:タイトル フィールドサイズ:200 ・世界情報クエリ1,2,3,4,「パラメーター(複数パラメータ表示)」 [検索結果を返します] 世界情報フォーム1:Eval(BuildCriteria("'" & [タイトル] & "'",10,"*" & Replace([Forms]![メニュー]![タイトルkey]," ","* And *") & "*")) 世界情報フォーム2:Eval(BuildCriteria("'" & [タイトル] & "'",10,"*" & Replace([Forms]![メニュー]![タイトルkey]," ","* Or *") & "*")) 「式が正しく入力されていないか、複雑すぎるため評価できません。たとえば、数式に複雑な要素が多すぎます。変数に式の一部を割り当て、式を簡単にしてください。」と返します。 世界情報フォーム3:Eval(BuildCriteria("'" & [情報] & "'",10,"*" & Replace([Forms]![メニュー]![情報key]," ","* And *") & "*"))「抽出条件」-1 世界情報フォーム4:Eval(BuildCriteria("'" & [情報] & "'",10,"*" & Replace([Forms]![メニュー]![情報key]," ","* Or *") & "*"))「抽出条件」-1 以上ですが、宜しくお願いします。
- kkkkkm
- ベストアンサー率66% (1734/2604)
> Like "*" & [Forms]![情報]![検索1] And Like "*" & [Forms]![情報]![検索2] And Like "*" & [Forms]![情報]![検索3] & "*" 検索1の文字列がフィールドの最後にある 検索2の文字列がフィールドの最後にある 検索3の文字列がフィールドに含まれる 上記すべての条件が合致するデータ でいいのですか。 Like 演算子 https://support.office.com/ja-jp/article/like-%E6%BC%94%E7%AE%97%E5%AD%90-b2f7ef03-9085-4ffb-9829-eef18358e931
補足
ありがとうございます。私が考えていた検索とは以下の通りでした。ただ、メモ形フィールドに記載されたデータが、内容により区別が必要なケースにおいて、その区切りの明確化として空白「余白」行を設けているケースがあります。私の指す検索とはこの余白を含めた全文字「空白は無視されるとものと思っていましたが・・・」からの検索を意味していました。 従いまして、「検索1の文字列がフィールドに含まれる。検索2の文字列がフィールドに含まれる。検索3の文字列がフィールドに含まれる。上記すべての条件が合致するデータ」となっていました。基本的に考え直さないといけないのでしょうか。
お礼
ありがとうございます。ひとつお尋ねしたいことがありますが、検索実行時にパラメータが3個「3回」でる式で試行検証を行いましたが、検索1のパラメータ以降「検索2・検索3」をパス「何かのキーを入力するとか・・」することは可能でしょうか。現状で完全にパスすると「Or条件(Andは検索結果を返します)」では、全てのデータが表示されます。宜しくお願いします。
補足
ありがとうございます。アドバイスの記述にて「ざっくり(レコード数が873と多い為)」ですが、試行検証の結果をご報告させて頂きます。テキストボックス「And・Or = 両方OK」は勿論ですが、メモ型フィールド「And・Or = 両方OK」も検索できました。「メモ型で5856文字数のデータも検索ヒットしました。当たり前かもしれませんが、検索条件に2「一文字」で検索するとデータに年号情報「2○○○、2○○2」があれば検索ヒットしてきます。取り急ぎご報告させて頂きます。ありがとうございました。