過去の桐井戸端BBS (桐ver.9)
25598 3つの文字のどちらかが入っているものを同時に絞り込んで抽出したい ゆうこ 2004/03/25-09:55
桐のVersion 9 を使用していますが
絞り込み検索で 区分の欄の 「1」と「2」と「新」を同時に抽出したいのですが
そのやり方を 教えて頂けますでしょうか。

1と2だけなら >="1",<="2" という図式で 出せるんですが
>="1",<="2",>="新" では 抽出できません。

どなたか教えて下さいませ。
よろしくお願いいたします。 m(_ _)m


25603 Re:質問:3つの絞り込み検索方法 ONnoji 2004/03/25-13:07
記事番号25598へのコメント
ゆうこさん、こんにちは。

比較式ダイアログのことですよね…

次のように入力したら3つでも4つでも大丈夫だと思います。

#文字位置("12新",[区分])<>0

外していたらスイマセン。
25608 【解説】論理和による検索の基礎知識 佐田 守弘 2004/03/25-21:10
記事番号25598へのコメント
ゆうこさん
答えの1つがONnojiさんから出ておりますが、論理和による検索の基礎について解説いたしします。

●論理和による検索
 >絞り込み検索で 区分の欄の 「1」と「2」と「新」を同時に抽出したい
との表現で書かれていますが、これを論理的(ロジカル)に表現すると、
・「1]であるかまたは「2」であるかまたは「新」であるか
  つまり、「1」 or 「2」 or 「新」 です。
日常語的には、「○○を同時に」という言い方でも間違いではありませんが、
・「1]であると共に同時に「2」であり、更に同時に「新」である
  つまり、「1」 and 「2」 and 「新」 ではありません。
この様に「であるかまたは」というorで繋がれる条件を論理和といいます。

この様に日常的に表現する言葉を、論理的(論理式として)きちんと表現する事がとても大切です。

●桐の検索条件での比較式の記述
少し脇道に逸れます。桐で使う式には、計算式、比較式、論理式の3つがあります。
このうち、検索条件に指定する式は、比較式です。論理式は指定できません。
比較式は、論理式と違って、論理演算子(.and .or .not)が使えません。

そして、複数の比較式を組み合わせて検索を行う場合、それらの論理積(and条件)に限っては、
比較式をコンマで区切って書き並べる事ができます。

質問文に書かれている
 >1と2だけなら >="1",<="2" という図式で
について説明すると、これは「>="1"」でありかつ、「<="2"」であるという論理積の記述です。
不等号を使った比較式であり、かつ、隣り合っている整数である1と2であるため、
たまたま「1または2」を「1より大または等しく、かつ、2より小または小さい」という比較式でも同じ結果になりました。
常にこの様な書き方ができるわけではありません。できない例が、質問にある「新」が入った場合です。

 >="1",<="2",>="新" では 抽出できません。
は、「上記の1を越えてかつ2以下(つまり1か2)であると共に、「新」である事」という意味なので
該当するデータは存在しません。

●桐で論理和の検索の方法
上記のように論理積であれば、比較式をコンマで区切って記述できます。しかしこの方法では論理和での検索はできません。
論理和での検索を行う場合には、検索条件を登録し、検索条件を指定しての検索で行います。
これは一括処理で行う場合でも同じで、検索条件の登録とその検索条件で検索や絞り込みを行います。

検索条件で行う場合には、設定する行が10行あり、同時に10条件までの論理和(or)が行えます。
この例でいえば、3行を使って、それぞれの行に、単に1,2,新 の値を設定すればできると思います。

●アドバンスドテクニック
中にはどうしても検索条件名の登録で行うのではなくて、1つの比較式で論理和での検索を行いたいと考える方もおられます。
そしてあみだされた高等テクニックが、いくつかあります。良く使われる方法は、
論理和による条件式に合致すれば自分自身の値を返す様に、「#条件選択」関数を使う方法です。

それ以外にもいろいろな方法は考えられます。
ONnojiさんが書かれている式も、「成程!」と思いたくなる工夫された式です。
そしてゆうこさん御自身が質問文に書かれた、「1または2」を「1を越えて2以下」という式で書くのも
アドバンスドテクニックの1つです。

佐田守弘(KS-00119)


25612 Re:【解説】論理和による検索の基礎知識 うにん 2004/03/25-23:49
記事番号25608へのコメント

> >1と2だけなら >="1",<="2" という図式で
>について説明すると、これは「>="1"」でありかつ、「<="2"」であるという論理積
>の記述です。
>不等号を使った比較式であり、かつ、隣り合っている整数である1と2であるため、
>たまたま「1または2」を「1より大または等しく、かつ、2より小または小さい」
>という比較式でも同じ結果になりました。

この場合の1と2は数値でなく文字列ですから、「"1"と"2"のJISコードが隣り合っていたから検索できた」というべきでしょう。

>常にこの様な書き方ができるわけではありません。できない例が、質問にある「新」
>が入った場合です。

もちろんそれも一例ですが、"1"と"3"を選択しようとして"2"の代りに"3"と書くと
1と3だけでなく"2"も選択されてしまいます。
あるいは、データが1文字だけでない場合、最初の式では"12"等も選択されます。

25616 Re:質問:3つの絞り込み検索方法 ONnoji 2004/03/26-10:28
記事番号25603へのコメント
>次のように入力したら3つでも4つでも大丈夫だと思います。
>
>#文字位置("12新",[区分])<>0

一つ前のリプライは、あえてアバウトに書いてあります。
理由は、試してみればご自身で気が付くだろうと思ったからですが…

他の皆様と同じように、
より精密にご説明した方がいいかなぁ〜?と思いまして…(^^ゞ

[区分]という項目に漢字の "新" が入力されていることから、
[区分]は文字列型項目と断定させていただきました。

数字の "1" や "2" は全角文字だろうと推定いたしました。

もしも、"0"〜"9" までの数字以外の数字が使われていたならば、
※この場合の数字は文字で数値ではありません。

例えば、"11" や "12" や "99" という数字が使われている場合、

[区分]に入力されていない文字で分かち書きをすればよさそうですが…

例えば、全角の空白文字が入力されていないことが保証できるのであれば、

#文字位置("1□2□新□11□12□99",[区分])<>0
※□は全角の空白文字を表す

という方法が考えられますが、やはり完全ではありません。

というのは、"99" の他に "9" も見付けてしまうからです。

理由としては、"9" が "99" の中に見つかるからです。
※もしも文字数を揃えて、"9" を "09" と入力しておくけばこういう問題は起きません。
※注意深く観察すれば、"1" が "11" や "12" の中に見つかることに気が付くでしょう。
※同じように、"2" が "12" の中に見つかります。

という具合に、「入力されていない文字で分かち書きする方法」は完全ではありません。

<#対応番号( )関数を利用する>

面倒ですが、より完全にするには半角コンマ( , )で分かち書きして、
#対応番号( )関数を利用する方法があります。

#対応番号("1,2,新,11,12,99",[区分])<>0

この場合には、"99" の他に "9" も見付けてしまうことはありません。

注意しなければならいの所は、コンマは必ず半角の文字を使わなければならないことです。
うっかり、全角のコンマを使うと失敗します。

このように半角コンマをたくさん入力しなければならないので、
ミスも起こりやすく、入力も面倒なので、前回はご紹介しなかった次第です。

しかし、[区分]に半角のコンマを含む文字が入力されていた場合には困ります。
そういう意味では完全ではありません。
※[区分]に文字を入力するとき、常にコンマを全角文字で入力していれば大丈夫です。

他にもいろいろな方法が山ほど考えられます。
そして、もっともっともっと複雑な絞込みも可能です。
しかし、首記のように「3つの絞り込み」くらいならば、これくらいで充分だろうと思います。

25617 蛇足 ONnoji 2004/03/26-11:20
記事番号25616へのコメント
これは蛇足です。(^^ゞ

>>#文字位置("12新",[区分])<>0
>#対応番号("1,2,新,11,12,99",[区分])<>0

このような式を一括処理( .cmd )やイベント( .kev )の[絞り込み]コマンドで利用することも可能です。

<条件式(論理式)による絞り込み>

しかし、以下の例のような条件式(論理式)による絞り込みの場合には、
桐ver.8 sp5 以前の桐で実行するとエラーになると思います。桐ver.8 sp6 以降ならOK
※この場合、会話処理ではエラーになりません。

(例)

絞り込み [退職年月日]{(&syuryo>=[退職年月日] .and [退職年月日]>=&syuryo-14 .and [形態]="アルバイト")=1}

解説すると…

絞り込み [ダミー項目]{ ( 条件式 ) = 1}

という具合です。
条件式は[条件]コマンドや[if]コマンドで使うものと同じです。だから論理演算子もOK。(^^v
ダミー項目はお飾りなのでどんな項目でもOKではなかったかと思います。


25662 御礼 ゆうこ 2004/03/29-12:31
記事番号25603へのコメント
ONnojiさんの最初に書かれた方法
#文字位置("12新",[区分])<>0

↑ これで 抽出することができました。

ありがとうございました。
他の方々もいろいろ説明して頂き、すみませんでした。

戻る