全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1470
推到 Plurk!
推到 Facebook!

利用adotable的搜尋問題

尚未結案
odyaho
初階會員


發表:60
回覆:104
積分:42
註冊:2005-02-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-07-01 14:38:29 IP:202.181.xxx.xxx 未訂閱
請問各位先進 小弟是用adotable做查詢  有兩個方法 1. 用Locate
   TLocateOptions Opts;
   Opts<ADOTable1->Locate(Form10->ComboBox1->Text,
                               Form10->MaskEdit1->Text,Opts))
     ShowMessage("Find..");
   else
     ShowMessage("Sorry..  No Data..");
用此方法時 假設某欄位值為"恨天高" 當MaskEdit1->Text = "恨"時, 搜尋的到 當MaskEdit1->Text = "天" 或 "高"時, 搜尋不到 這要怎麼解決呢?? 2.用OnFilterRecord
void __fastcall TForm2::ADOTable1FilterRecord(TDataSet *DataSet,
      bool &Accept)
{
  Accept = Form2->ADOTable1->FieldByName(Form10->ComboBox1->Text)
           ->AsString == Form10->MaskEdit1->Text;
}
上面程式碼要完全符合Form10->MaskEdit1->Text的內容才找的到 可以做成以"關鍵字"查詢的功能嗎?? 自己是有利用Pos()這個函式來判斷 可是還是錯誤 程式觀念如下:
int n = Form2->ADOTable1->FieldByName(Form10->ComboBox1->Text)->AsString.Pos(Form10->MaskEdit1->Text);
if (n == 0)
  ShowMessage("No Data...");
else
  Accept = true;
期待各位的回覆
wyndog
資深會員


發表:7
回覆:362
積分:348
註冊:2004-10-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-07-01 16:38:28 IP:60.248.xxx.xxx 未訂閱
loPartialKey 的意思 其實是指開頭符合 所以,你用「恨」可以找到「恨天高」 當然,「天」跟「高」都找不到「恨天高」 因為不是開頭 如果是用「恨」、「恨天」、「恨天高」則都可以找得到 若是要用部份符合的話,就用 Filter Filter 裡就打 Like '%天%' or Like '%高%' 這裡要注意一個地方,Filter 裡的字串一定要用 ' 不能用 " 所以,在 Delphi 裡寫起來會有點小麻煩
supman
尊榮會員


發表:29
回覆:770
積分:924
註冊:2002-04-22

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-07-01 18:55:58 IP:61.70.xxx.xxx 未訂閱
您好: 我使用Pos做了以下測試,是沒問題的
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString S;
int i;
S="供大家參考";
i=S.Pos("流");//找不到
if (i==0)  ShowMessage("Can't Find Data!");
else ShowMessage("Find Data!");
i=S.Pos("大");//找的到
if (i==0)  ShowMessage("Can't Find Data!");
else ShowMessage("Find Data!");
i=S.Pos("大家");//找的到
if (i==0)  ShowMessage("Can't Find Data!");
else ShowMessage("Find Data!");
}
我的猜想是會不會您用MaskEdit所以存在著一些空白字元在裡面,也許您也為輸入的是"大家",但事實上是"    大家   ",您查看看.
發表人 - supman 於 2005/07/01 19:18:29
odyaho
初階會員


發表:60
回覆:104
積分:42
註冊:2005-02-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-07-02 01:32:23 IP:219.86.xxx.xxx 未訂閱
多謝各位先進的回覆 我先po上程式碼先...
//--------------------------------------------------------------------
#include 
#pragma hdrstop
#include "Unit1.h"
//--------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//--------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//--------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{ 
 for (int i=0;i<=(Form1->ADOTable1->Fields->Count-1);i++)
 {
     Form1->ComboBox1->Items->Add(Form1->ADOTable1->Fields->
     Fields[i]->FieldName);
 }
}
//--------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)  //Exit Form1
{
Form1->Close();
}
//--------------------------------------------------------------------
void __fastcall TForm1::ADOTable1FilterRecord(TDataSet *DataSet,
      bool &Accept)
{
 int n = Form1->ADOTable1->FieldByName(Form1->ComboBox1->Text)->AsString.Pos(Form1->MaskEdit1->Text);   //利用pos()來判斷     Form1->Label1->Caption = Form1->Label1->Caption + n; //n左邊為"加"號(顯示不出來)
//秀出使用pos後的數值, 用來判別字串中是否有所須之字元
 if (n!=0)  // 如有字元 則n不等於0 問題應該在這一行
    Accept = true;
}
//--------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)  
{  
 Form1->ADOTable1->Filtered = false;  // Show All Data
 Form1->Label1->Caption = "";         // Clear Label's Caption
}
//--------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender) // Search Button
{
 Form1->ADOTable1->Filtered=false;
 Form1->ADOTable1->Filtered=true;
}
//--------------------------------------------------------------------
下面是畫面: 中間"200022222"為 n 值... 表示只有第2 3 4筆資料沒有21這個字串 問題是: 怎麼只顯示出搜尋到的資料呢??(第1,5,6,7,8,9 筆資料) 發表人 - odyaho 於 2005/07/02 01:34:16
supman
尊榮會員


發表:29
回覆:770
積分:924
註冊:2002-04-22

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-07-02 01:51:34 IP:219.68.xxx.xxx 未訂閱
懂你的意思了,程式沒問題.  if (n!=0)       Accept = true;
 eles Accept=false;
加上紅色那行就ok了 另外在跟您說一下 void __fastcall TForm1::Button1Click(TObject *Sender) // Search Button { Form1->ADOTable1->Filtered=false; Form1->ADOTable1->Filtered=true; } ButtonClick是Form的成員不需要額外加上From->去做存取的動作,所以紅色您可去掉。 發表人 - supman 於 2005/07/02 01:53:21
odyaho
初階會員


發表:60
回覆:104
積分:42
註冊:2005-02-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-07-02 14:10:45 IP:61.31.xxx.xxx 未訂閱
對喔    沒有加上else 多謝提醒囉   已解決  
系統時間:2024-04-26 22:37:19
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!