AnyDAC - Обновить запись перед редактированием

в настоящее время мы переносим компонент базы данных нашего приложения Delphi7 с компонентов BDE на компоненты AnyDAC версии 8.0.5.

TTable (BDE) ведет себя следующим образом перед редактированием записи из другого экземпляра приложения (сеанса):

  1. Запись обновляется, и изменения видны из других экземпляров. Запись будет обновлена ​​в методе TBDEDataSet.InternalEdit.
  2. Набор данных установлен в режим редактирования (DataSet.State = dsEdit)

При использовании соответствующих компонентов AnyDAC (TADTable) записи не отражают изменения, сделанные другими экземплярами. Никаких особых изменений в TADConnection и TADTable не вносится.

Любая помощь приветствуется.


person Mr.Darcy    schedule 28.02.2018    source источник
comment
Что по этому поводу говорят издатели AnyDAC?   -  person MartynA    schedule 28.02.2018
comment
@MartynA, DA-SOFT больше нет, но, возможно, они оставили поддержку. AnyDAC стал FireDAC.   -  person Victoria    schedule 01.03.2018
comment
Спасибо @Victoria. Я забыл, какая из различных библиотек *DAC стала FireDAC.   -  person MartynA    schedule 01.03.2018


Ответы (1)


Я не могу говорить за BDE, так как не хочу больше связываться с ним, но то, что вы описали, я могу прочитать так:

Почему AnyDAC не обновляет кортеж перед началом редактирования?

Если это так, и поправьте меня, если я ошибаюсь, это было бы совершенно против UX. Представьте, что вы являетесь пользователем своего собственного приложения и хотите отредактировать определенный кортеж в представлении сетки данных. Вы нажмете какую-нибудь кнопку редактирования, чтобы войти в режим редактирования, и вся строка внезапно изменится перед вашими глазами (или редактор будет заполнен другими данными, чем вы видели). Хотели бы вы, чтобы это произошло?

Если это так, то, боюсь, вам придется выполнить такое обновление вручную с помощью AnyDAC (или FireDAC). Дело в том, что движок либо блокирует кортеж по транзакции, либо отслеживает изменения во внутреннем хранилище, пока вы находитесь в режиме редактирования.

Ни в том, ни в другом случае кортеж не обновляется перед началом редактирования (независимо от того, какие параметры блокировки вы используете). И меня лично это поведение устраивает, поскольку оно может привести к тому, что я описал выше.

Итак, как я могу обновить активный кортеж перед началом редактирования?

Чтобы обновить конкретный кортеж, на который указывает курсор набора данных, до начала редактирования набора данных, вы можете вызвать, например, RefreshRecord из Например, событие BeforeEdit :

procedure TForm1.ADTable1BeforeEdit(DataSet: TDataSet);
begin
  TADTable(DataSet).RefreshRecord;
end;

Но тогда ваши возможности редактирования базы данных становятся движущейся мишенью (ну, может быть, это уже так).

person Victoria    schedule 01.03.2018
comment
Спасибо за подробное объяснение... К сожалению, наши пользователи уже привыкли к поведению BDE. Вот и приходится думать, как решить эту проблему... - person Mr.Darcy; 02.03.2018
comment
Я выполнил весь процесс редактирования, и повторная загрузка не реализована. Таким образом, ваши варианты сужаются до такого метода, как RefreshRecord. Что ж, и я бы сказал, что предлагаемое мероприятие BeforeEdit — подходящее место для этого. Ну, может быть, но это было бы ужасно, вы могли бы попытаться сломать кортеж в хранилище и позволить движку снова получить его из источника. Но это так уродливо, что я не исследовал это. - person Victoria; 02.03.2018