【问题标题】:Copy record from one Table to another not working将记录从一个表复制到另一个不起作用
【发布时间】:2013-03-17 21:03:07
【问题描述】:

我正在使用 BDE 和平面表。 我有两个相同的表,tblOnetblTwo 我正在尝试将数据从一个表复制到另一个表。不是整个数据库,只是一个使用这个的特定记录:

function Tdm.CopyRecord(var tblFrom,tblTo : TTable) : Boolean;
var
  i : Integer;
begin
  Result:=False;
  try
    tblTo.Insert;
    for i:=1 to tblFrom.FieldCount-1 do
    begin
      if tblFrom.Fields[i].FieldName = tblTo.Fields[i].FieldName then
        tblTo.Fields[i].Value:=tblFrom.Fields[i].Value;
    end;
    tblTo.Post;
    Result:=True;
  finally
  end;
end;

if CopyRecord(tblOne,tblTwo) then...

单步执行所有的值对于 From Table 来说都是“Null”。

发布后,我在tblTo 中添加了一条空白记录。所有的值都是空的,这并不奇怪。 :)

我在复制数据时哪里出错了?它没有进入复制功能。

我已经为此工作了几个小时,但无法使其正常工作。可能我忽略了一些简单的事情。我添加了“var”参数以查看是否有任何区别,但没有。

哦,顺便说一句,我从“1”而不是“0”开始循环,因为两个文件中的第一个字段都是AutoInc

【问题讨论】:

  • 您有什么理由不使用 TDataSet.CopyFields? (例如使用旧的 [pre D2006] 版本的 Delphi)docwiki.embarcadero.com/Libraries/XE3/en/…
  • if tblTo.FindField(tblFrom.Fields[i].FieldName) <> nil then tblTo.FieldByName(tblFrom.Fields[i].FieldName).Value := tblFrom.Fields[i].Value; - 会更准确。
  • 您确定您的 tblFrom 没有问题吗?确保它是打开的,并且实际上至少有一条记录要复制。

标签: delphi delphi-5 bde tdataset


【解决方案1】:

我会这样做:

function CopyRecord(tblFrom, tblTo: TTable; const StartIndex: Integer=0): Boolean;
var
  i: Integer;
  FieldFrom, FieldTo: TField;
begin
  Result := False;
  for i := StartIndex to tblFrom.FieldCount - 1 do
  begin
    FieldFrom := tblFrom.Fields[i];
    FieldTo := tblTo.FindField(FieldFrom.FieldName);
    if Assigned(FieldTo) then
    begin
      FieldTo.Value := FieldFrom.Value;
      Result := True;
    end;
  end;
end;

我不会使用tblTo.Insert/tblTo.Post inside CopyRecord 方法。而是在外面使用它,例如:

tblTwo.Append;
if CopyRecord(tblOne, tblTwo, 1) then
  tblTwo.Post
else
  tblTwo.Cancel;

这也可以在Edit 模式下重复使用。

【讨论】:

  • 谢谢建议,我用的是D5,不好意思,应该提一下的。
  • 谢谢建议,我用的是D5,不好意思,应该提一下的。 Kobik 的代码仍然是相同的结果。目标文件中的空白行。一步一步,他们都没有进入“如果分配(FieldTo)那么”我在里面设置了一个断点,它从来没有到达那里。它显示了要迭代的正确字段数 (15),但所有“From”值仍然为 Null。这里的愚蠢事情不允许我完成编辑。五分钟太短了,因为很容易按 Enter 并终止评论——无数次。
  • @snowfrog 发现的小错误,在 NAA 中提到:It has to be: FieldTo := tblTo.FindField(FieldFrom.FieldName);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-24
  • 2018-08-27
相关资源
最近更新 更多