在Delphi中使用Paradox数据库中的表时遇到问题。
我需要比较两个表并验证哪些字段相同,哪些字段不同。最后,两个表必须在字段上包含相同的值。
但是,一切都必须在不使用SQL的情况下完成,只有纯Delphi。
到目前为止,这是代码,但我没有得到预期的结果:
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;
答案 0 :(得分:0)
您需要进行两次传递才能将缺失的数据从一个表复制到另一个表中。最简单的方法是创建一个程序来为您完成,然后调用它两次:
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;
如果数据库不是很大,这可以正常工作。如果是,则可以通过在要比较的字段上添加索引来提高性能。请参阅TDataSet.Locate
的Delphi帮助,其中包含更多信息和一些可能有用的其他主题的链接。 (链接是当前的Delphi帮助,但这些信息在大多数情况下也适用于Delphi 7.)
答案 1 :(得分:-1)
仔细阅读Table2
的所有记录,并将Table2.FieldByName('Campo').AsString
值放入已排序的TStringList
中。然后遍历Table1
的记录,并检查所有stringList.IndexOf
的{{1}}。当Table1.FieldByName('Campo').AsString
返回-1时,将记录追加到IndexOf
。切换Table2
和Table1
并重复。