TFDQuery更新失败?

问题描述 投票:0回答:1

我在同步问题上有问题...我有一个源表(mtAllowanceCategory),我想将其更新为它的副本(qryAllowanceCategory)。为了确保如果副本中的记录不再存在于源中,则副本中的记录将被删除,该副本具有一个“ StillHere”布尔字段,该字段在添加或更新记录时设置为on,否则保持关闭状态。之后,将删除所有StillHere = false的记录。

就是这个主意,实际上...在发布更新时,不会打开标志字段。当我跟踪代码时,该语句被执行;当我查看Access时,它保持关闭状态。因此,删除SQL之后将清除整个表。

以前试图弄清楚几个小时;我想念什么?

mtAllowanceCategory:TFDMemTable (filled from an API call, this works fine)
qryAllowanceCategory:TFDQuery
conn:TFDConnection to a local Access database (also used for qryAllowanceCategory)

  conn.ExecSQL('UPDATE AllowanceCategory SET StillHere=false;');

  while not mtAllowanceCategory.eof do
  begin
    if qryAllowanceCategory.locate('WLPid',mtAllowanceCategory.FieldByName('Id').AsString,[loCaseInsensitive]) then
    begin
      Updating:=true;
      qryAllowanceCategory.Edit;
    end
    else
    begin
      Updating:=false;
      qryAllowanceCategory.Insert;
    end;
    qryAllowanceCategory.fieldbyname('createdBy').AsString:=mtAllowanceCategory.FieldByName('createdBy').AsString;
    qryAllowanceCategory.fieldbyname('createdOn').AsString:=mtAllowanceCategory.FieldByName('createdOn').AsString;
    qryAllowanceCategory.fieldbyname('description').AsString:=mtAllowanceCategory.FieldByName('description').AsString;
    qryAllowanceCategory.fieldbyname('WLPid').AsString:=mtAllowanceCategory.FieldByName('id').AsString;
    qryAllowanceCategory.fieldbyname('isDeleted').Asboolean:=mtAllowanceCategory.FieldByName('isDeleted').Asboolean;
    qryAllowanceCategory.fieldbyname('isInUse').Asboolean:=mtAllowanceCategory.FieldByName('isInUse').Asboolean;
    qryAllowanceCategory.fieldbyname('modifiedBy').AsString:=mtAllowanceCategory.FieldByName('modifiedBy').AsString;
    qryAllowanceCategory.fieldbyname('modifiedOn').AsString:=mtAllowanceCategory.FieldByName('modifiedOn').AsString;
    qryAllowanceCategory.fieldbyname('WLPname').AsString:=mtAllowanceCategory.FieldByName('name').AsString;
    qryAllowanceCategory.fieldbyname('number').AsInteger:=mtAllowanceCategory.FieldByName('number').AsInteger;
    qryAllowanceCategory.fieldbyname('percentage').AsFloat:=mtAllowanceCategory.FieldByName('number').AsFloat;
    qryAllowanceCategory.fieldbyname('remark').AsString:=mtAllowanceCategory.FieldByName('remark').AsString;
    qryAllowanceCategory.fieldbyname('LocalEdited').AsBoolean:=false;
    qryAllowanceCategory.fieldbyname('LocalInserted').AsBoolean:=false;
    qryAllowanceCategory.fieldbyname('LocalDeleted').AsBoolean:=false;
    qryAllowanceCategory.fieldbyname('StillHere').AsBoolean:=true;
    qryAllowanceCategory.Post;
    mtAllowanceCategory.next;
  end;
  conn.commit;
  conn.ExecSQL('DELETE FROM AllowanceCategory WHERE StillHere=false;');
delphi firedac
1个回答
0
投票

[如果有人感兴趣:问题在于初始SQL设置StillHere为false后没有刷新qryAllowanceCategory。记录的内存版本(qryAllowanceCategory)没有得到该更新,因此,根据他的说法,该标记仍处于打开状态;字段更新后,它似乎没有变化(所有其他字段也保持不变),因此该帖子被忽略了。但是在实际表中它是关闭的,因此最终的删除SQL删除了它。

通过在第一个UPDATE SQL语句之后添加刷新来解决此问题。

© www.soinside.com 2019 - 2024. All rights reserved.