1

Delphi の Paradox データベースでテーブルを使用中に問題が発生しました。

2 つのテーブルを比較して、同一のフィールドと異なるフィールドを確認する必要があります。最後に、両方のテーブルのフィールドに同じ値が含まれている必要があります。

ただし、純粋な Delphi だけで、SQL を使用せずにすべてを行う必要があります。

これまでのコードは次のとおりですが、期待した結果が得られません。

procedure TForm1.Button3Click(Sender: TObject); 
  var  
  s1,s2:string;  
begin  
  Table1.First;  
  while not (Table1.Eof) do  
  Begin 
      s1 := Table1.FieldByName('Campo').AsString; 
      Table2.First; 
      while not (Table2.Eof) do 
      Begin 
          s2 := Table2.FieldByName('Campo').AsString; 

          if (s1 <> s2) then 
          begin 
            Table2.Append; 
            Table2.FieldByName('Campo').AsString := 
                Table1.FieldByName('Campo').AsString; 
          end 
          else if (s1 = s2) then 
          begin 
            Table2.Next; 
          end; 

          Table2.Next; 
      End; 
      Table1.Next;  
  End;
End;
4

2 に答える 2

0

欠落しているデータを 1 つのテーブルから別のテーブルにコピーするには、2 つのパスを作成する必要があります。最も簡単な方法は、それを行うためのプロシージャを作成し、それを 2 回呼び出すことです。

procedure TForm1.CopyData(const Src, Dest: TTable);
var
  CompareVal: string;
begin
  Src.First;
  while not Src.Eof do
  begin
    CompareVal := Src.FieldByName('Campo').AsString;
    if not Dest.Locate('Campo', CompareVal, []) then
    begin
      Dest.Insert;     // Or Dest.Append;
      Dest.FieldByName('Campo').AsString := CopmareVale;
      Dest.Post;
    end;
    Src.Next;
  end;
end;

次のように呼び出します。

procedure TForm1.Button3Click(Sender: TObject);
begin
  CopyData(Table1, Table2);
  CopyData(Table2, Table1);
end;

データベースがそれほど大きくない場合、これはうまく機能します。そうである場合は、比較するフィールドにインデックスを追加することでパフォーマンスを向上させることができます。の Delphi ヘルプを参照してください。TDataSet.Locate詳細情報と、役立つ可能性のある他のトピックへのリンクが含まれています。(リンクは現在の Delphi ヘルプへのリンクですが、情報はほとんどの場合、Delphi 7 にも適用できます。)

于 2013-04-30T02:42:07.180 に答える