線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:907
推到 Plurk!
推到 Facebook!

請問怎麼比較兩個DBGrid中的值?

尚未結案
diary
一般會員


發表:6
回覆:4
積分:2
註冊:2002-08-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-04-24 16:55:59 IP:61.220.xxx.xxx 未訂閱
我需要用兩個DBGrid讀出兩個不同query中的欄位值 可是卻不知道該怎樣比較兩個不同DBGrid上Column[0]中的值 再寫入一個memo中 例如:DbGrid1中的Columns[0]中列出4個rows值為 (dog,cat,mouse,rabbit) 而 DBGrid2中的Columns[0]中列出5個rows值為 (dog,bird,mouse,cat,rabbit) 判斷出DBGrid2的Columns[0]比DBGrid1的Columns[0]多出一個bird的值,然後再把bird寫到memo中 請問要怎麼比較出DBGrid1跟DBGrid2中的Columns[0]中的值不同再寫入memo中呢? 謝謝各位的幫忙
channel
尊榮會員


發表:67
回覆:707
積分:854
註冊:2002-05-02

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-04-24 18:04:12 IP:211.21.xxx.xxx 未訂閱
引言: 我需要用兩個DBGrid讀出兩個不同query中的欄位值 可是卻不知道該怎樣比較兩個不同DBGrid上Column[0]中的值 再寫入一個memo中 例如:DbGrid1中的Columns[0]中列出4個rows值為 (dog,cat,mouse,rabbit) 而 DBGrid2中的Columns[0]中列出5個rows值為 (dog,bird,mouse,cat,rabbit) 判斷出DBGrid2的Columns[0]比DBGrid1的Columns[0]多出一個bird的值,然後再把bird寫到memo中 請問要怎麼比較出DBGrid1跟DBGrid2中的Columns[0]中的值不同再寫入memo中呢? 謝謝各位的幫忙
先在private宣告: function CompareField(DataSet1, DataSet2: TDataSet): String;//比較兩個Table不同的Field procedure WriteMemo(xStr: String; DataSet: TDataSet);//將不同的Field的值寫入Memo
function TForm1.CompareField(DataSet1, DataSet2: TDataSet): String;
var
  I, J : Integer;
  aStr: String;
  aNotFind: Boolean;
begin
  aStr := '';
  for I := 0 to DataSet1.FieldCount - 1 do
  begin
    aNotFind := True;
    for J := 0 to DataSet2.FieldCount - 1 do
    begin
      if DataSet1.Fields[I].FieldName = DataSet2.Fields[J].FieldName then
      begin
        aNotFind := False;
        Break;
      end;
    end;
    if aNotFind then
      if aStr = '' then
        aStr := DataSet1.Fields[I].FieldName
      else
        aStr := aStr   ','  DataSet1.Fields[I].FieldName;
  end;
  Result := aStr;
end;    procedure TForm1.WriteMemo(xStr: String; DataSet: TDataSet);
var
  I: Integer;
  aSL: TStringList;
begin
  aSL := TStringList.Create;
  try
    aSL.CommaText := xStr;
    for I := 0 to aSL.Count - 1 do
    with DataSet do
      begin
        Close;
        Open;
        First;
        while not Eof do
        begin
          Memo1.Lines.Add(FieldByName(aSL.Strings[I]).AsString);
          Next;
        end;
      end;
  finally
    FreeAndNil(aSL);
  end;
end;    procedure TForm1.Button1Click(Sender: TObject);
var
  aSL: TStringList;
begin
  if Table1.FieldCount > Table2.FieldCount then
    WriteMemo(CompareField(Table1,Table2), Table1)
  else
    WriteMemo(CompareField(Table2,Table1), Table2);
end;
我試過了,沒有問題,您可以試試看… ~小弟淺見,參考看看~
------
~小弟淺見,參考看看~
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-04-24 18:05:47 IP:218.32.xxx.xxx 未訂閱
你應該要用 DataSet 來做比對,如 :
query2.first;
while not query2.eof do begin
  if not query1.locate('[FieldName]',query2,fieldbyname('[FieldName]').asstring,[])
  then memo.lines.add(query2,fieldbyname('[FieldName]').asstring);
  query2.next;
end;
晚了一步, channel 的比較完整, 棒棒 發表人 -
timhuang
尊榮會員


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-04-25 00:30:05 IP:61.221.xxx.xxx 未訂閱
一個比較簡單的想法, 其實這個若是都來自於資料庫的資料的話, 可以用下 query 的方式來找出不同的資料, 當然若只是 UI 上的資料比對, 那就用前兩位前輩的方式來解, 若只是要找出不同的資料並寫回 TMemo 中的話, 建議可以用下 SQL Query 的方式來進行. 如原來的 DBGrid1 的 dataset 中的資料為 select col_1, col_2 ... from table1 DBGrid2 的 dataset 資料為 select col_1, col_2 ... from table2 那就利用 select col_1 from table1 where col_1 not in (select col_1 from table2) 就可以找出所有原來 dbgrid1 中有, 但是 dbgrid2 中沒有的資料了.
diary
一般會員


發表:6
回覆:4
積分:2
註冊:2002-08-05

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-04-25 15:51:37 IP:61.220.xxx.xxx 未訂閱
謝謝各位的回答 透過各位的幫忙,我又學到了很多有關delphi的語法 因為我最後使用的程式寫法是用mickey先生的方法 所以這篇文章的得分者為mickey先生 謝謝channel先生的幫忙 也謝謝timhuang 先生的建議 但是我沒有用sql查詢語法的原因是因為我所列在的兩個GRID中的資料是來自於不同的兩個資料庫,所以才需要用程式判斷。 ~萬分感謝各位~
系統時間:2024-05-13 21:11:17
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!