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;