新记录的Delphi主详细信息级联ID与AutoGenerateValue不结合使用

新记录的Delphi主详细信息级联ID与AutoGenerateValue不结合使用,delphi,caching,firebird,master-detail,firedac,Delphi,Caching,Firebird,Master Detail,Firedac,Im使用RadStudio 10.3.2: 在我的VCL Windows窗体应用程序中,我使用Firedac数据库组件与Firebird数据库建立连接 我有一个主查询组件和一个详细查询组件,它们都有一个ID列,使用Firebird生成器自动生成值。 这两个查询组件都启用了cashedupdate,以便于/更好地处理事务。 在两个查询组件和连接组件上都设置了选项“详细级联更新” 当我添加/编辑现有主记录的详细记录时,一切正常,因为主记录的ID不再更改。 但是,当我结合一个或多个详细记录创建一个新的

Im使用RadStudio 10.3.2: 在我的VCL Windows窗体应用程序中,我使用Firedac数据库组件与Firebird数据库建立连接

我有一个主查询组件和一个详细查询组件,它们都有一个ID列,使用Firebird生成器自动生成值。 这两个查询组件都启用了cashedupdate,以便于/更好地处理事务。 在两个查询组件和连接组件上都设置了选项“详细级联更新”

当我添加/编辑现有主记录的详细记录时,一切正常,因为主记录的ID不再更改。 但是,当我结合一个或多个详细记录创建一个新的主记录时,则不会更新DetailField

尝试了以下两个示例:

示例1:

procedure TfrmMasterdetail.btnNewClick(Sender: TObject);
var
  frmnewedit: Tfrmnewedit;
begin
  dmMasterdetail.qryMaster.Insert;
  frmnewedit := Tfrmnewedit.Create(nil);
  try
    if frmnewedit.ShowModal = mrOk then
    begin
      dmMasterdetail.FDConnection1.StartTransaction;
      try
        dmMasterdetail.qryMaster.ApplyUpdates;
        dmMasterdetail.qryMaster.CommitUpdates;
        dmMasterdetail.qryDetail.ApplyUpdates;
        dmMasterdetail.qryDetail.CommitUpdates;
        dmMasterdetail.FDConnection1.Commit;
      except
        on E: Exception do
        begin
          dmMasterdetail.FDConnection1.Rollback;
          raise;
        end;
      end;
    end else
    begin
      dmMasterdetail.qryDetail.CancelUpdates;
      dmMasterdetail.qryMaster.CancelUpdates;
    end;
  finally
    frmnewedit.Free;
  end;
end;
procedure TfrmMasterdetail.btnNewClick(Sender: TObject);
var
  frmnewedit: Tfrmnewedit;
begin
  dmMasterdetail.qryMaster.Insert;
  frmnewedit := Tfrmnewedit.Create(nil);
  try
    if frmnewedit.ShowModal = mrOk then
    begin
      dmMasterdetail.FDConnection1.StartTransaction;
      try
        dmMasterdetail.qryMaster.ApplyUpdates;
        dmMasterdetail.qryDetail.ApplyUpdates;
        dmMasterdetail.qryMaster.CommitUpdates;
        dmMasterdetail.qryDetail.CommitUpdates;
        dmMasterdetail.FDConnection1.Commit;
      except
        on E: Exception do
        begin
          dmMasterdetail.FDConnection1.Rollback;
          raise;
        end;
      end;
    end else
    begin
      dmMasterdetail.qryDetail.CancelUpdates;
      dmMasterdetail.qryMaster.CancelUpdates;
    end;
  finally
    frmnewedit.Free;
  end;
end;
示例2:

procedure TfrmMasterdetail.btnNewClick(Sender: TObject);
var
  frmnewedit: Tfrmnewedit;
begin
  dmMasterdetail.qryMaster.Insert;
  frmnewedit := Tfrmnewedit.Create(nil);
  try
    if frmnewedit.ShowModal = mrOk then
    begin
      dmMasterdetail.FDConnection1.StartTransaction;
      try
        dmMasterdetail.qryMaster.ApplyUpdates;
        dmMasterdetail.qryMaster.CommitUpdates;
        dmMasterdetail.qryDetail.ApplyUpdates;
        dmMasterdetail.qryDetail.CommitUpdates;
        dmMasterdetail.FDConnection1.Commit;
      except
        on E: Exception do
        begin
          dmMasterdetail.FDConnection1.Rollback;
          raise;
        end;
      end;
    end else
    begin
      dmMasterdetail.qryDetail.CancelUpdates;
      dmMasterdetail.qryMaster.CancelUpdates;
    end;
  finally
    frmnewedit.Free;
  end;
end;
procedure TfrmMasterdetail.btnNewClick(Sender: TObject);
var
  frmnewedit: Tfrmnewedit;
begin
  dmMasterdetail.qryMaster.Insert;
  frmnewedit := Tfrmnewedit.Create(nil);
  try
    if frmnewedit.ShowModal = mrOk then
    begin
      dmMasterdetail.FDConnection1.StartTransaction;
      try
        dmMasterdetail.qryMaster.ApplyUpdates;
        dmMasterdetail.qryDetail.ApplyUpdates;
        dmMasterdetail.qryMaster.CommitUpdates;
        dmMasterdetail.qryDetail.CommitUpdates;
        dmMasterdetail.FDConnection1.Commit;
      except
        on E: Exception do
        begin
          dmMasterdetail.FDConnection1.Rollback;
          raise;
        end;
      end;
    end else
    begin
      dmMasterdetail.qryDetail.CancelUpdates;
      dmMasterdetail.qryMaster.CancelUpdates;
    end;
  finally
    frmnewedit.Free;
  end;
end;
我注意到,一旦我提交了qryMaster,那么qryDetail就不再有记录计数了。这个问题有解决办法吗? 我唯一能想到的不是使用自动生成ID值,而是在提交时手动修复它,而是自动生成所有内容

顺便说一句,frmnewedit具有数据感知控件,可处理主记录和详细记录的所有数据

更新


我还启用了选项“DetailServerCascade”,并在查询组件中添加了一个TFDSchemaAdapter,但使用该选项,我得到了错误“无法处理-没有父行”

a)您应该从主数据集和详细数据集的
OnNewRecord
事件中的db中检索ID值,并在继续之前检查是否已获取这些值。b) “…DetailField未更新”是什么意思?@MartynA with DetailField我是指详细信息查询中链接到主查询主键的外键您是否使用集中缓存更新@Uwerabe不,我不是atm。链接中的文档暗示您应该这样做:集中式缓存更新在主-细节关系中很有用,主数据集将更改传播到级联细节数据集,包括自动递增的字段值。”