[delphi-users:0085] Firebird で 「あいまい検索」 をしたい。

309 views
Skip to first unread message

大須賀

unread,
Apr 21, 2009, 8:35:25 AM4/21/09
to DelphiML
大須賀です。

BDE TQuery から TIBQuery の検索に移行を試みています。
BDE TQueryではできていた 「変数 + '%'」 や  Firebird の 「Starting With +変数」 の
先頭一致検索が動作しません。 「 = :変数 」 では動作します。
IBDatabase では Character Set に SJIS_0208 を指定しています。
変数の書き方をお教え願ます。

エラー
//***********************************************************
IBSho_LblQry.Close;
IBSho_LblQry.SQL.Clear;
IBSho_LblQry.SQL.Add('SELECT CODE, HINNMEI From Sho_Lbl ');
IBSho_LblQry.SQL.Add('WHERE Code Like :Code ');
IBSho_LblQry.ParamByName('Code').AsString := Trim(GetCode.Text) +
'%';
IBSho_LblQry.Open;
//*********************************************************
エラー
//***********************************************************
IBSho_LblQry.Close;
IBSho_LblQry.SQL.Clear;
IBSho_LblQry.SQL.Add('SELECT CODE, HINNMEI From Sho_Lbl ');
IBSho_LblQry.SQL.Add('WHERE Code Starting with :Code ');
IBSho_LblQry.ParamByName('Code').AsString := Trim(GetCode.Text);
.IBSho_LblQry.Open;
//*********************************************************

Code Like :Code, Starting with :Code は前方一致で検索出来ません。
Code = :Code の完全一致では動作します。
よろしくご指導をお願いします。

大須賀明美
osuk...@uv.tnc.ne.jp
    

【MLコミュホームページ】http://www.freeml.com/delphi-users

--[PR]------------------------------------------------------------------
◇◆◇◆ 憧れの4LDKや共用施設充実マンション    ◇◆◇◆
◆◇◆◇賃貸じゃ難しい?理想の住まい探しは早めの資料請求で先手!◆◇◆◇
◇◆◇◆  これから販売予定のおNewなマンション、即チェック ◇◆◇◆
http://ad.freeml.com/cgi-bin/sa.cgi?id=dRGsK

------------------------------------------------------------------[PR]--
■GMO INTERNET GROUP■ GMO INTERNET www.gmo.jp

DEKO

unread,
Apr 21, 2009, 10:07:16 AM4/21/09
to delphi...@freeml.com
IBSho_LblQry.SQL.Add(''WHERE Code Like :Code '');
IBSho_LblQry.ParamByName(''Code'').AsString :=
'%' + Trim(GetCode.Text) + '%';

でいかがですか?

Firebird に関する疑問は、

[Firebird SQLリファレンス]
http://firebird.skr.jp/?Firebird%20SQL%A5%EA%A5%D5%A5%A1%A5%EC%A5%F3%A5%B9

で調べるか、

[Firebird-jp-general]
http://groups.yahoo.co.jp/group/Firebird-jp-general/

にて質問すると解決し易いと思いますよ。


【MLコミュホームページ】http://www.freeml.com/delphi-users

--[PR]------------------------------------------------------------------
◇◆◇◆ 憧れの4LDKや共用施設充実マンション    ◇◆◇◆
◆◇◆◇賃貸じゃ難しい?理想の住まい探しは早めの資料請求で先手!◆◇◆◇
◇◆◇◆  これから販売予定のおNewなマンション、即チェック ◇◆◇◆

http://ad.freeml.com/cgi-bin/sa.cgi?id=dRJgK

トム猫

unread,
Apr 21, 2009, 11:27:42 AM4/21/09
to delphi...@freeml.com
林です。

Delphi2009で試したところ、大須賀さんのコードそのままでちゃんと動作しました。

IBXのバージョンに依拠するのかもしれないですね。DelphiとIBXのバージョンはいくつをお使いですか?

僕のは、Delphi2009 Update2+IBX 12.12 です。

2009/04/21 21:35 大須賀 <delphi...@freeml.com>:

--
『オープンソースパワーを全ての人に』
+++++++++++++++++++++++++++++++

アナハイムテクノロジー株式会社
代表取締役 林 務
Mobile:090-4171-3946
tsutomu...@anaheim-tech.com

〒157-0072
東京都世田谷区祖師谷1-22-26-S-208
TEL:03-5787-7791 FAX:03-5787-7792

+++++++++++++++++++++++++++++++


【MLコミュホームページ】http://www.freeml.com/delphi-users

--[PR]------------------------------------------------------------------
〓〓〓〓〓皆さんは生命保険にどれくらいのお金をかけてますか?〓〓〓〓〓
案外、商品内容をよく理解せずに多額のお金を支払っている人が多いのでは。
なぜ?そういことになるかと言うと“生命保険の仕組み”が複雑すぎるから。
▼▽▼そんな日本の生命保険に「風穴」を開けようとする会社が登場した!!
http://ad.freeml.com/cgi-bin/sa.cgi?id=dRLfg

DEKO

unread,
Apr 21, 2009, 12:10:54 PM4/21/09
to delphi...@freeml.com
ごめんなさい、"前方一致" ですね。
大須賀さんのコードでいいはずです。

クォーテーションがシングルクォーテーション×2で記述されていますが、実際のコードではシングルクォーテーション×1ですよね?


【MLコミュホームページ】http://www.freeml.com/delphi-users

--[PR]------------------------------------------------------------------
◇◆◇◆ 憧れの4LDKや共用施設充実マンション    ◇◆◇◆
◆◇◆◇賃貸じゃ難しい?理想の住まい探しは早めの資料請求で先手!◆◇◆◇
◇◆◇◆  これから販売予定のおNewなマンション、即チェック ◇◆◇◆

http://ad.freeml.com/cgi-bin/sa.cgi?id=dRLA8

大須賀

unread,
Apr 22, 2009, 8:34:24 AM4/22/09
to delphi...@freeml.com
大須賀です。
皆様のご支援有りがたく存じます。
私の開発環境は Xp SP3 、 Delphi7。0、 Firebird 1.5.5 です。

//***********************************************************
IBSho_LblQry.Close;
IBSho_LblQry.SQL.Clear;
IBSho_LblQry.SQL.Add('SELECT CODE, HINNMEI ');
IBSho_LblQry.SQL.Add('From Sho_Lbl ');


IBSho_LblQry.SQL.Add('WHERE Code Like :Code ');
IBSho_LblQry.ParamByName('Code').AsString :=
Trim(GetCode.Text)+'%';
IBSho_LblQry.Open;
//*********************************************************

if IBSho_LblQry.RecordCount = 1 then
ShowMessage('RecCount = 1')
else if IBSho_LblQry.RecordCount > 1 then
ShowMessage('RecCount > 1')
else
ShowMessage('RecCount = 0');
//endif

    以下のTableがあります。

    Code Hinnmei
****** *****************
1Z001200 AAA
1Z001201 BBB
1Z001202 CCC
1Z001203 DDD

GetCode.Text = '1Z001200' で上記 program 実行すると
    'RecCount = 1'  で検索成功します。 

GetCode.Text = '1Z001999' で上記 program 実行すると
    'RecCount = 0'  で検索成功します。 しかし

GetCode.Text = '1Z0012' で上記 program 実行すると
    'RecCount = 1'  で 期待する 'RecCount > 1' ではありません。 
 

ISQL で以下を試しました。
Select * From Sho_Lbl Where Code Like '1Z0012%';
Select * From Sho_Lbl Where Code Like '1Z0012'||'%';
Select * From Sho_Lbl Where Code Starting '1Z0012';
いずれも4行標示されて検索成功します。しかし

Select * From Sho_Lbl Where Code Like '1Z0012'+'%';
isc error code; 335544569
Dynamic SQL error
expression evaluation not supported
+'%' を使用すると 検索できません。
BDE + TQuery で使用した文法ではあいまい検索が出来ません。

「前方一致検索」がうまく動作しません。 
:Code の文法が 悪いのでしょうか。
+’%’ の文法が悪いのでしょうか。

なにとぞ再度ご支援の程お願いします。

大須賀明美
osuk...@uv.tnc.ne.jp

【MLコミュホームページ】http://www.freeml.com/delphi-users

--[PR]------------------------------------------------------------------
◇◆◇◆ 憧れの4LDKや共用施設充実マンション    ◇◆◇◆
◆◇◆◇賃貸じゃ難しい?理想の住まい探しは早めの資料請求で先手!◆◇◆◇
◇◆◇◆  これから販売予定のおNewなマンション、即チェック ◇◆◇◆

http://ad.freeml.com/cgi-bin/sa.cgi?id=dSfKi

yokoi

unread,
Apr 22, 2009, 9:04:26 AM4/22/09
to delphi...@freeml.com
大須賀さま

横井です。

TIBQueryは、BDEと違って、Openしても全件読み込むわけではありません。

> IBSho_LblQry.Open;
のあとに
IBSho_LblQry.FetchALL;
を追加して、全件読み込んだらどうなるでしょうか。

> Select * From Sho_Lbl Where Code Like '1Z0012'+'%';

SQLの文法からいうと、「+」で文字の連結はできないのではないでしょうか。
Delphiで「+」が使えるのは、pascalの文法上正しいからだと思います。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
E-Mail: yo...@wise.bz ///// 横 井 嘉 邦 /////

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


【MLコミュホームページ】http://www.freeml.com/delphi-users

--[PR]------------------------------------------------------------------
◇◆◇◆ 憧れの4LDKや共用施設充実マンション    ◇◆◇◆
◆◇◆◇賃貸じゃ難しい?理想の住まい探しは早めの資料請求で先手!◆◇◆◇
◇◆◇◆  これから販売予定のおNewなマンション、即チェック ◇◆◇◆

http://ad.freeml.com/cgi-bin/sa.cgi?id=dSg8R

Fukushi

unread,
Apr 22, 2009, 9:11:26 AM4/22/09
to delphi...@freeml.com
大須賀さん、こんばんは。福士です。

> if IBSho_LblQry.RecordCount = 1 then
> ShowMessage('RecCount = 1')
> else if IBSho_LblQry.RecordCount > 1 then
> ShowMessage('RecCount > 1')
> else
> ShowMessage('RecCount = 0');
> //endif

RDBではRecordCountは必ずしも正しい件数を返すとは限りません。
該当件数が必要なのであれば"SELECT COUNT(*) FROM Sho_Lbl
WHERE Code Like :Code"というようなクエリで件数を取得しましょう
(件数はTIBQueryのFields[0].AsIntegerで取り出せます)。また
件数が必要なのではなく実際に何件取得できたのかを調べたいと
いうことであればTIBQueryのEOFがTrueになるまでNextするように
ループしてみてください。

---
東洋テクニカルシステム株式会社 システム開発部 福士 光
Hikaru Fukushi (Toyo Technical System Inc.)
mailto:fuk...@tts-inc.co.jp


【MLコミュホームページ】http://www.freeml.com/delphi-users

--[PR]------------------------------------------------------------------
◇◆◇◆ 憧れの4LDKや共用施設充実マンション    ◇◆◇◆
◆◇◆◇賃貸じゃ難しい?理想の住まい探しは早めの資料請求で先手!◆◇◆◇
◇◆◇◆  これから販売予定のおNewなマンション、即チェック ◇◆◇◆

http://ad.freeml.com/cgi-bin/sa.cgi?id=dSgKG

トム猫

unread,
Apr 22, 2009, 9:21:24 AM4/22/09
to delphi...@freeml.com
林です。

> Select * From Sho_Lbl Where Code Like '1Z0012'+'%';
> isc error code; 335544569
> Dynamic SQL error
> expression evaluation not supported
> +'%' を使用すると 検索できません。
> BDE + TQuery で使用した文法ではあいまい検索が出来ません。

yokoiさんも書かれてますが、SQLでは||(縦棒二本)を使います。

Select * From Sho_Lbl Where Code Like '1Z0012' || '%';

では、大丈夫だと思いますよ。

2009/04/22 21:34 大須賀 <delphi...@freeml.com>:

--
『オープンソースパワーを全ての人に』
+++++++++++++++++++++++++++++++

アナハイムテクノロジー株式会社
代表取締役 林 務
Mobile:090-4171-3946
tsutomu...@anaheim-tech.com

〒157-0072
東京都世田谷区祖師谷1-22-26-S-208
TEL:03-5787-7791 FAX:03-5787-7792

+++++++++++++++++++++++++++++++


【MLコミュホームページ】http://www.freeml.com/delphi-users

--[PR]------------------------------------------------------------------


〓〓〓〓〓皆さんは生命保険にどれくらいのお金をかけてますか?〓〓〓〓〓
案外、商品内容をよく理解せずに多額のお金を支払っている人が多いのでは。
なぜ?そういことになるかと言うと“生命保険の仕組み”が複雑すぎるから。
▼▽▼そんな日本の生命保険に「風穴」を開けようとする会社が登場した!!

http://ad.freeml.com/cgi-bin/sa.cgi?id=dShdF

大須賀

unread,
Apr 22, 2009, 10:26:19 AM4/22/09
to delphi...@freeml.com
大須賀です。
早速の皆様のお助け有りがたいです。

横井様  ご提案の 「FetchAll」 をためしました。


IBSho_LblQry.ParamByName('Code').AsString := Trim(GetCode.Text)+'%';
IBSho_LblQry.Open;

IBSho_LblQry.FetchAll;

・・大成功でした。・・ 抽出結果も 以前のBDE+TQueryと同じです。

林様  
Firebirdの Quick Start には 文字の連結は ||で行うと書いてありました。
しかし ISQL では動作するのですが program上では  
IBSho_LblQry.ParamByName('Code').AsString := Trim(GetCode.Text)||'%';
[エラー] 不正な文字が入力ファイルにあります : '|' ($7C)
で実行できません。 よかったらもう少しお教え願ます。
あいまい検索使用は私には「最重要」課題です。

福士さま 
正確な計数 Count() も使えました。 RecordCountはやめます。

今後ともよろしくお願いいたします。

大須賀明美
osuk...@uv.tnc.ne.jp

【MLコミュホームページ】http://www.freeml.com/delphi-users

--[PR]------------------------------------------------------------------
◇◆◇◆ 憧れの4LDKや共用施設充実マンション    ◇◆◇◆
◆◇◆◇賃貸じゃ難しい?理想の住まい探しは早めの資料請求で先手!◆◇◆◇
◇◆◇◆  これから販売予定のおNewなマンション、即チェック ◇◆◇◆

http://ad.freeml.com/cgi-bin/sa.cgi?id=dSjd1

トム猫

unread,
Apr 22, 2009, 9:26:11 PM4/22/09
to delphi...@freeml.com
林です。

> Firebirdの Quick Start には 文字の連結は ||で行うと書いてありました。
> しかし ISQL では動作するのですが program上では
> IBSho_LblQry.ParamByName('Code').AsString := Trim(GetCode.Text)||'%';
> [エラー] 不正な文字が入力ファイルにあります : '|' ($7C)

Pascalでの文字列の連結は + 演算子を使うので、そのまま||を書いたらエラーになります。また、パラメータの中に ||
を入れることは出来ないと思うので、Delphiで書く場合には Trim(GetCode.Text) + '%' が正解です。

ISQLで実行するときは、|| でないといけないということです。

また、もしパラメータではないSQL中でフィールドの結合をしたい場合などは、

hogehoge.SQL := 'SELECT A || B FROM TBL';

などのように || で文字列(あるいはフィールド)を結合しないといけません。

--
『オープンソースパワーを全ての人に』
+++++++++++++++++++++++++++++++

アナハイムテクノロジー株式会社
代表取締役 林 務
Mobile:090-4171-3946
tsutomu...@anaheim-tech.com

〒157-0072
東京都世田谷区祖師谷1-22-26-S-208
TEL:03-5787-7791 FAX:03-5787-7792

+++++++++++++++++++++++++++++++


【MLコミュホームページ】http://www.freeml.com/delphi-users

--[PR]------------------------------------------------------------------
◇◆◇◆ 憧れの4LDKや共用施設充実マンション    ◇◆◇◆
◆◇◆◇賃貸じゃ難しい?理想の住まい探しは早めの資料請求で先手!◆◇◆◇
◇◆◇◆  これから販売予定のおNewなマンション、即チェック ◇◆◇◆

http://ad.freeml.com/cgi-bin/sa.cgi?id=dSq3W

大須賀

unread,
Apr 23, 2009, 7:42:37 AM4/23/09
to delphi...@freeml.com
大須賀です。


林様。

Firebird SQL文中で使う || は Delphi文中 Parameter では 使用できない事が理解出来ました。
初心者の私にご親切に有り難うございます。
BDE + TQuery → IBDatabase + TIBQuery (急いで)移行を試みる私には大きな手助けです。

大須賀明美

osuk...@uv.tnc.ne.jp

【MLコミュホームページ】http://www.freeml.com/delphi-users

--[PR]------------------------------------------------------------------
◇◆◇◆ 憧れの4LDKや共用施設充実マンション    ◇◆◇◆
◆◇◆◇賃貸じゃ難しい?理想の住まい探しは早めの資料請求で先手!◆◇◆◇
◇◆◇◆  これから販売予定のおNewなマンション、即チェック ◇◆◇◆

http://ad.freeml.com/cgi-bin/sa.cgi?id=dS4vJ

Shuichi

unread,
Apr 24, 2009, 8:57:31 AM4/24/09
to delphi...@freeml.com
大津です。

久しぶりにECOを提供しているCapableObject社のサイトにアクセスしてみたとこ
ろ、RadStudio2007向けにバージョンアップが行われていました。バージョンは、
4.0.0.3583です。

http://capableobjects.com/Downloads_Updates.aspx

ところでCapableObject社は、VisualStudio向けにECOバージョン5ベータを公開し
ています。こちらはC#版ですが、かなり大幅に機能アップされたようです。見た
目のクラス図もきれいです。

試用版はクラス数が12までと限定されていますが、試用期限がないようなので
パッケージを分ければ試用版でもかなり使えるのではないかと期待しています。

C#におけるUMLないしMDA(Model Driven Architecture)にご関心がある方にはお
勧めです。以下のアドレスからダウンロードできます。

http://capableobjects.com/Downloads_Eco5Beta.aspx

いままでのところ快適に動いています。

*************************************
(株)デジパブ・ジャパン
  大津 修一
Shuichi Ohtsu
HP : http://www.digipub-net.com/
*************************************

PS.
データベースでホームページを作成するCMSソフトWebPageMaker
現在好評販売中です。
http://www.digipub.biz/20Wpm/

数十台のパソコンの同時制御を可能にしたソフトGrape Education
現在好評販売中です。
http://www.jnc.ne.jp/grape/

Delphiに関するドキュメント補完サイト:
http://www.digipub.biz/11/ap/Book/DelphiSpace/pDelphiSpace.aspx

ECO(Enterprise Core Object)に関するドキュメント補完サイト:
http://www.digipub.biz/11/ap/Book/Eco/pEcoSpace.aspx


【MLコミュホームページ】http://www.freeml.com/delphi-users

--[PR]------------------------------------------------------------------


〓〓〓〓〓皆さんは生命保険にどれくらいのお金をかけてますか?〓〓〓〓〓
案外、商品内容をよく理解せずに多額のお金を支払っている人が多いのでは。
なぜ?そういことになるかと言うと“生命保険の仕組み”が複雑すぎるから。
▼▽▼そんな日本の生命保険に「風穴」を開けようとする会社が登場した!!

http://ad.freeml.com/cgi-bin/sa.cgi?id=dSXRQ

Reply all
Reply to author
Forward
0 new messages