Delphi Master Detail каскадный идентификатор для новой записи не работает в сочетании с AutoGenerateValue - PullRequest
0 голосов
/ 30 сентября 2019

Я использую RadStudio 10.3.2: В моем приложении VCL Windows Forms я использую компоненты базы данных Firedac для подключения к базе данных Firebird.

У меня есть 1 компонент основного запроса и 1 компонент запроса Detail, которые оба имеютстолбец идентификатора, который использует автоматически сгенерированные значения с помощью Firebird Generator. Оба компонента запроса имеют cashedUpdates для упрощения / улучшения обработки транзакций. Опция «Подробное каскадное обновление» включена для обоих компонентов запроса, а также для компонента соединения.

Когда я добавляю / редактирую подробные записи существующей основной записи, все работает правильно, потому что идентификатор основной записи неизменить больше. Но когда я создаю новую основную запись в сочетании с 1 или более подробными записями, DetailField не обновляется.

Попробовал следующие 2 примера:

Example1:

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;

Пример 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.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 больше не будет счетчика записей. Есть ли решение этой проблемы? Единственное, о чем я могу думать, это не использовать автоматическую генерацию значения идентификатора, а вручную исправлять его при фиксации, а у меня все автоматически генерируется.

Между прочим, у формы frmnewedit есть средства управления данными, которые обрабатывают все данныеосновной записи и подробных записей.

ОБНОВЛЕНИЕ

Я также включил опцию "DetailServerCascade" и добавил TFDSchemaAdapter к компонентам запроса, но при этом я получаю ошибку«Невозможно обработать - нет родительской строки»

...