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

如何針對某特定欄位的相對的橫排的欄位做擷取??

尚未結案
windshiuan
一般會員


發表:22
回覆:11
積分:6
註冊:2003-11-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-03 12:51:46 IP:218.170.xxx.xxx 未訂閱
假設我今天有5個欄位由左到又是0.1.2.3.4 然後假設我有N筆資料.... 然後我對0那欄做一筆一筆的資料比對 假設我比對到第10筆時找到資料 那我要如何去取得同樣是第十筆.但是是4那欄資料?? 簡單說就是我假設我找到在0欄第十筆的資料相對的也要 將同一筆但是是在4欄的資料一起取出.. 麻煩知道的大大幫我解一下...感謝 PS.我是用ADOConnection跟ADOTable跟DataSource還有DBGrid做的 煩請幫一下忙...感恩
folkchen
高階會員


發表:9
回覆:232
積分:173
註冊:2003-10-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-08-03 16:59:59 IP:211.20.xxx.xxx 未訂閱
若你是用 movenext 來移動目前所在的筆數而去取資料做比對 那你只要依你取資料比對的方式就可以取出其他欄位了 不是嗎
windshiuan
一般會員


發表:22
回覆:11
積分:6
註冊:2003-11-17

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-08-03 17:47:36 IP:218.162.xxx.xxx 未訂閱
引言: 若你是用 movenext 來移動目前所在的筆數而去取資料做比對 那你只要依你取資料比對的方式就可以取出其他欄位了 不是嗎
我是用下面這段程式做的 void __fastcall TForm1::Button1Click(TObject *Sender) { TLocateOptions Opts; Opts << loPartialKey; if (ADOTable1->Locate("ID",Edit1->Text,Opts)) { ShowMessage("找到資料"); } else { ShowMessage("找不到資料"); } } 因為只針對特定欄位由上往下的找到一筆資料 但是我除了要比對資料找到特定欄位上的那一筆資料外 還要依照之前找到的那一筆資料去找同一橫排但不同欄位的資料 不知道大大們有沒有什麼好方法?? 拜託幫忙一下...感恩~~
folkchen
高階會員


發表:9
回覆:232
積分:173
註冊:2003-10-09

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-08-04 08:18:14 IP:211.20.xxx.xxx 未訂閱
我用的是Query基本上和你用的Table是差不多的 你試試看 while (!dmQry->Eof) { if (dmDsr->DataSet->FieldValues["Code"] == "123") xxx = dmDsr->DataSet->FieldValues["name"]; BCBSYSDMF->dmQry->Next(); } 你也可以搜尋 "->Next();" 會找到不少文章可以參考 發表人 - folkchen 於 2004/08/04 08:20:56
bigdogchina
版主


發表:238
回覆:523
積分:312
註冊:2003-04-28

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-08-04 13:11:54 IP:211.162.xxx.xxx 未訂閱
不好意思,插個花: 利用ADOTable也可很方便的查找特定欄位的內容,主要的思路是利用ADOTable提供的屬性或方法實現特定欄位的訪問(同樣也可移植到Table中去),有以下3種方法:    1.Fields Fields屬性是TFields類型,可以將其看成容納TField物件的陣列,該屬性的類型爲TFields。因此我們可以通過下標訪問Fields陣列中的元素,既TField物件,下面的code是演示查找第1欄位中數值爲3的記錄:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
        while(!ADOTable1->Eof)
        {
            if(ADOTable1->Fields->Fields[1]->AsInteger == 3)
            {
            ......
            }
            ADOTable1->Next();
        }
}
Delphi則爲:

procedure TForm1.Button1Click(Sender: TObject);
begin
  with ADOTable1 do
  begin
    while not eof do
    begin
      if(Fields[1].AsInteger = 3) then
      begin
      ......
      end;
      next;
    end;
  end;
end;
需要注意的一點是:必須使用TFiel物件的As系列方法將欄位內容轉換爲需要的資料類型,如果轉化失敗將抛出異常! 2.FieldValues 資料集的FieldValues屬性不能用來獲得特定欄位物件,但是可以返回一個Variant類型的欄位內容。如果只是訪問特定欄位的值,而無需訪問欄位物件的其他特徵,那麽使用這一個屬性就非常方便,看看Help中它的定義: Delphi syntax: property FieldValues[const FieldName: string]: Variant; default; C syntax: __property System::Variant FieldValues[AnsiString FieldName] = {read=GetFieldValue, write =SetFieldValue}; 從該屬性的定義形式我們可以看出,FieldValues屬性適用於確切知道資料表中某個欄位名稱的情況。下面的code實現同樣的功能,但是不同的是,我們這時已知第1欄位名稱爲Number:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
        int temp;
        while(!ADOTable1->Eof)
        {
            temp = ADOTable1->FieldValues["Number"];
            if(temp == 3)
            {
            ......
            }
            ADOTable1->Next();
        }    }
Delphi則爲:

procedure TForm1.Button1Click(Sender: TObject);
begin
  with ADOTable1 do
  begin
    while not eof do
    begin
      if(FieldValues['Number'].AsInteger = 3) then
      begin
      ......
      end;
      next;
    end;
  end;
end;
嘿嘿,可見使用FieldValues屬性訪問欄位訪問特定欄位可以提高程式的可讀性 3.FieldByName 還是先看Help吧: Delphi syntax: function FieldByName(const FieldName: String): TField; C syntax: TField* __fastcall FieldByName(const AnsiString FieldName); 同理我們從屬性中得知,FieldByName方法返回的是TField類型的物件,而FieldValues屬性返回的是Variant類型的值,因此使用FieldByName方法還可以訪問特定欄位物件的其他特徵。同樣的效果,請對比上面的code:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
        while(!ADOTable1->Eof)
        {
            if(ADOTable1->FieldByName("Number")->AsInteger == 3)
            {
            ......
            }
            ADOTable1->Next();
        }    } 
Delphi則爲:

procedure TForm1.Button1Click(Sender: TObject);
begin
  with ADOTable1 do
  begin
    while not eof do
    begin
      if(FieldByName[‘Number’].AsInteger = 3) then
      begin
      ......
      end;
      next;
    end;
  end;
end;
相關的內容還可以參考小弟在第067的Ktop電子報中的討論: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=53412 小弟初通皮毛,如有謬誤,還請各位先進多多指教!謝謝 ================================= <>人生在勤,不索何獲 <>業精於勤荒於嬉,行成於思毀於隨 <>臨淵羡魚不如退而結網 發表人 -
------
人生在勤,不索何获?
windshiuan
一般會員


發表:22
回覆:11
積分:6
註冊:2003-11-17

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-08-04 17:09:26 IP:218.169.xxx.xxx 未訂閱
引言: 不好意思,插個花: 利用ADOTable也可很方便的查找特定欄位的內容,主要的思路是利用ADOTable提供的屬性或方法實現特定欄位的訪問(同樣也可移植到Table中去),有以下3種方法: 1.Fields Fields屬性是TFields類型,可以將其看成容納TField物件的陣列,該屬性的類型爲TFields。因此我們可以通過下標訪問Fields陣列中的元素,既TField物件,下面的code是演示查找第1欄位中數值爲3的記錄:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
        while(!ADOTable1->Eof)
        {
            if(ADOTable1->Fields->Fields[1]->AsInteger == 3)
            {
            ......
            }
            ADOTable1->Next();
        }
}
Delphi則爲:

procedure TForm1.Button1Click(Sender: TObject);
begin
  with ADOTable1 do
  begin
    while not eof do
    begin
      if(Fields[1].AsInteger = 3) then
      begin
      ......
      end;
      next;
    end;
  end;
end;
需要注意的一點是:必須使用TFiel物件的As系列方法將欄位內容轉換爲需要的資料類型,如果轉化失敗將抛出異常! 2.FieldValues 資料集的FieldValues屬性不能用來獲得特定欄位物件,但是可以返回一個Variant類型的欄位內容。如果只是訪問特定欄位的值,而無需訪問欄位物件的其他特徵,那麽使用這一個屬性就非常方便,看看Help中它的定義: Delphi syntax: property FieldValues[const FieldName: string]: Variant; default; C syntax: __property System::Variant FieldValues[AnsiString FieldName] = {read=GetFieldValue, write =SetFieldValue}; 從該屬性的定義形式我們可以看出,FieldValues屬性適用於確切知道資料表中某個欄位名稱的情況。下面的code實現同樣的功能,但是不同的是,我們這時已知第1欄位名稱爲Number:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
        int temp;
        while(!ADOTable1->Eof)
        {
            temp = ADOTable1->FieldValues["Number"];
            if(temp == 3)
            {
            ......
            }
            ADOTable1->Next();
        }    }
Delphi則爲:

procedure TForm1.Button1Click(Sender: TObject);
begin
  with ADOTable1 do
  begin
    while not eof do
    begin
      if(FieldValues['Number'].AsInteger = 3) then
      begin
      ......
      end;
      next;
    end;
  end;
end;
嘿嘿,可見使用FieldValues屬性訪問欄位訪問特定欄位可以提高程式的可讀性 3.FieldByName 還是先看Help吧: Delphi syntax: function FieldByName(const FieldName: String): TField; C syntax: TField* __fastcall FieldByName(const AnsiString FieldName); 同理我們從屬性中得知,FieldByName方法返回的是TField類型的物件,而FieldValues屬性返回的是Variant類型的值,因此使用FieldByName方法還可以訪問特定欄位物件的其他特徵。同樣的效果,請對比上面的code:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
        while(!ADOTable1->Eof)
        {
            if(ADOTable1->FieldByName("Number")->AsInteger == 3)
            {
            ......
            }
            ADOTable1->Next();
        }    } 
Delphi則爲:

procedure TForm1.Button1Click(Sender: TObject);
begin
  with ADOTable1 do
  begin
    while not eof do
    begin
      if(FieldByName[‘Number’].AsInteger = 3) then
      begin
      ......
      end;
      next;
    end;
  end;
end;
相關的內容還可以參考小弟在第067的Ktop電子報中的討論: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=53412 小弟初通皮毛,如有謬誤,還請各位先進多多指教!謝謝 ================================= <>人生在勤,不索何獲 <>業精於勤荒於嬉,行成於思毀於隨 <>臨淵羡魚不如退而結網 發表人 - >< face="Verdana, Arial, Helvetica"> 關於大大建議的方法我有實際寫過試過了 不過我還有一個問題.如下圖 [ 0 1 2 3 4 ] -- 0 1 12 2 4 5 1 20 17 30 6 9 2 5 7 26 17 19 3 34 8 21 23 11 4 36 40 39 37 27 -- 假設[0 1 2 3 4]是ADOTable的欄位 而垂直的 |0 1 2 3 4|是列 如果我針對"欄位0"做資料比對.假設我比對到了"5"是我要找的正確資料 但是我同時還要取出"欄位4"上也是列2的"19"那個資料 我應該要怎麼取ㄋ?? 煩請指點一二....感謝~~
bigdogchina
版主


發表:238
回覆:523
積分:312
註冊:2003-04-28

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-08-04 19:01:47 IP:211.162.xxx.xxx 未訂閱
Hi,windshiuan,您好! 不知道小弟有沒有理解錯,您是要對比兩個欄位元的資料,找出同時符合這兩個值的資料嗎?如果是的話,不妨看看下面的code:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
        TLocateOptions Opts;
        bool flag;
        Opts.Clear();
        Opts << loPartialKey;
        Variant locvalues[2];
        locvalues[0] = Variant("3");
        locvalues[1] = Variant("bigdogchina");
        flag = ADOTable1->Locate("User_ID;User_Name", VarArrayOf(locvalues, 1), Opts);
        if(flag)
            ShowMessage("找到bigdogchina啦");
        else
            ShowMessage("沒找到!");
}
該code的功能是找出User_ID=123而且User_Name=bigdogchina的這筆資料. 如果是小弟來做,更多的會考慮使用ADOQuery來,因爲使用SQL語句自由度要大得多,一條SQL就可以啦:SQL="select User_ID,User_Name from Table1 where User_ID=123 or User_Name='bigdogchina'",相關討論已經很多啦,不妨看看 >人生在勤,不索何獲 <>業精於勤荒於嬉,行成於思毀於隨 <>臨淵羡魚不如退而結網
------
人生在勤,不索何获?
windshiuan
一般會員


發表:22
回覆:11
積分:6
註冊:2003-11-17

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-08-04 21:21:13 IP:218.169.xxx.xxx 未訂閱
引言: Hi,windshiuan,您好! 不知道小弟有沒有理解錯,您是要對比兩個欄位元的資料,找出同時符合這兩個值的資料嗎?如果是的話,不妨看看下面的code:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
        TLocateOptions Opts;
        bool flag;
        Opts.Clear();
        Opts << loPartialKey;
        Variant locvalues[2];
        locvalues[0] = Variant("3");
        locvalues[1] = Variant("bigdogchina");
        flag = ADOTable1->Locate("User_ID;User_Name", VarArrayOf(locvalues, 1), Opts);
        if(flag)
            ShowMessage("找到bigdogchina啦");
        else
            ShowMessage("沒找到!");
}
該code的功能是找出User_ID=123而且User_Name=bigdogchina的這筆資料. 如果是小弟來做,更多的會考慮使用ADOQuery來,因爲使用SQL語句自由度要大得多,一條SQL就可以啦:SQL="select User_ID,User_Name from Table1 where User_ID=123 or User_Name='bigdogchina'",相關討論已經很多啦,不妨看看 >人生在勤,不索何獲 <>業精於勤荒於嬉,行成於思毀於隨 <>臨淵羡魚不如退而結網 < face="Verdana, Arial, Helvetica"> 您好~~ 我是要比對一個欄位元的資料 透過比對那個欄位元的資料去抓出同一列但是是其他的欄位元的資料 能幫忙解惑一下嗎...感謝~~~
bigdogchina
版主


發表:238
回覆:523
積分:312
註冊:2003-04-28

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-08-04 21:40:59 IP:211.162.xxx.xxx 未訂閱
Sorry,小弟才疏學淺,仔細閱讀後仍然無法理解您的要求,非常抱歉和遺憾。期待真正的高手出現,來答疑解惑! ================================= <>人生在勤,不索何獲 <>業精於勤荒於嬉,行成於思毀於隨 <>臨淵羡魚不如退而結網
------
人生在勤,不索何获?
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-08-04 23:58:55 IP:61.62.xxx.xxx 未訂閱
Hi, 不就是 ADOTable1->Fields->Fields[4]->AsString; 這樣子嗎? 還是有什麼困難呢? bigdogchina 兄舉的例子相當詳細了啊!
folkchen
高階會員


發表:9
回覆:232
積分:173
註冊:2003-10-09

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-08-05 09:14:43 IP:211.20.xxx.xxx 未訂閱
bigdogchina 兄舉的例子真的相當詳細 以經把常用的做法都寫出了,還寫了2種語言 基本上 ADOTable1->Next(); 就是把指標移到下一列,讓你比對是否要顯示或做你要做的動作 你只要用 ADOTable1->Fields->Fields[4]->AsString; 就可以取出你要的值了 你可以想成 Next() 是下移 Fields[x] 是左右移動 就會比較容易理解了
windshiuan
一般會員


發表:22
回覆:11
積分:6
註冊:2003-11-17

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-08-05 12:01:15 IP:218.162.xxx.xxx 未訂閱
引言: bigdogchina 兄舉的例子真的相當詳細 以經把常用的做法都寫出了,還寫了2種語言 基本上 ADOTable1->Next(); 就是把指標移到下一列,讓你比對是否要顯示或做你要做的動作 你只要用 ADOTable1->Fields->Fields[4]->AsString; 就可以取出你要的值了 你可以想成 Next() 是下移 Fields[x] 是左右移動 就會比較容易理解了
經過幾位大大回應bigdogchina 兄所指教的方法後... 小弟我終於懂了..也透過程式嘗試過.終於做出來了 感謝各位大大的指教 尤其是bigdogchina 兄仔細的講解 謝謝~~~
系統時間:2024-04-28 18:31:05
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!