Delphi: Поля TADOQuery, вызванные в другом модуле, неожиданно имеют значения по умолчанию

У меня есть два модуля данных в приложении: TPAymentDataModule и TJobEditDataModule. В одном DataModule я должен вызвать определенный TADOQuery из другого модуля для обновления базы данных: (этот фрагмент кода находится в TPaymentDataModule):

procedure TPaymentDataModule.ForceOrdersToComplete;
begin
  With PaymentGroupContentQuery do
  begin
    if IsEmpty then exit;
    First;
    JobEditDataModule.OrderEditQuery.Active:=true;
    JobEditDataModule.JobEditQuery.Active := true;

    while not eof do
    begin

      // get all orders that refer to this payment group 
      JobEditDataModule.OrderEditQuery.Parameters.ParamValues['orderId'] :=
      PaymentGroupContentQueryorder_Id.Value;
      JobEditDataModule.OrderEditQuery.Active:=true;
      JobEditDataModule.OrderEditQuery.Edit;

      // and try to modify their status
      JobEditDataModule.OrderEditQueryorder_status_id.AsInteger := 2;
     Next;
   end;
 end;
end;

OrderEditQuery"s Order_status_id поле имеет OnValidate обработчик события:

(Этот фрагмент кода находится в другом модуле: TJobEditDataModule):

procedure TJobEditDataModule.OrderEditQueryorder_status_idValidate(Sender: TField);
begin
  if (not Self.IsNewJobStatusPermissible(OrderEditQueryorder_status_id.OldValue,
   OrderEditQueryorder_status_id.NewValue)) then
   begin
     raise Exception.CreateFmt('Cannot modify status of order %s.', [            OrderEditQueryOrder_Name.AsString ]);
     Abort;
 end;
end;

Кажется, все работает правильно, но когда OnValidate обработчик ударил, все поля внезапно имеют значения по умолчанию и вызывают сбой кода. Я не Create запросы и использовать их в качестве одиночных, так что я ожидаю, что Sender в обработчике событий должен указывать на один и тот же экземпляр запроса, поскольку доступен только один одноэлементный запрос.

Но я новичок в Delphi и продолжаю задаваться вопросом, что здесь не так?

1 ответ

Если я не ошибаюсь, вам нужно Post Ваше редактирование в БД:

procedure TPaymentDataModule.ForceOrdersToComplete;
begin
  ..
  while not eof do
    begin
      // get all orders that refer to this payment group 
      JobEditDataModule.OrderEditQuery.Parameters.ParamValues['orderId'] :=
      PaymentGroupContentQueryorder_Id.Value;
      JobEditDataModule.OrderEditQuery.Active:=true;
      JobEditDataModule.OrderEditQuery.Edit;

      // and try to modify their status
      JobEditDataModule.OrderEditQueryorder_status_id.AsInteger := 2;

      // Commit the changes to the DB here
      JobEditDataModule.OrderEditQuery.Post;

      Next;
   end;
end;
Другие вопросы по тегам