Можно ли сделать снимок набора данных? - PullRequest
2 голосов
/ 18 октября 2011

В моем приложении я использую исключительно компоненты DBAware (кроме нескольких мест).

У меня есть сценарий, в котором я создаю основной набор данных (например, клиент), набор подробных данных (например, заказы), набор данных субдеталей (например, элементы заказа). Обычно я разрешаю пользователям вносить изменения (набор данных находится в режиме просмотра), а затем я публикую сообщения. Простой.

В любом случае, при редактировании набора данных я хочу добавить некоторую простую функцию отмены: открывается форма для редактирования набора данных (то есть с помощью db componets, поэтому изменения формы изменят набор данных), если пользователь отменяет операция Я хотел бы восстановить набор данных, как это было до открытия формы.

Теперь для реализации этого я могу подумать о создании копии набора данных в TClientDataSet или аналогичном компоненте, но есть ли другие технические приемы? Как и в Delphi, можно легко создать «снимок» данных. С псевдокодом:

MySubDetailDataSet.SaveSnapShot;
SubDetailForm.ShowModal;
if ModalResult = mrCancel then MySubDetailDataSet.RestoreSnapShot;

Возможно ли что-то подобное "с полки" с компонентами Delphi?

Кстати, я использую SDAC из компонентов DevArt, поэтому, если вы знаете методику, которая доступна только для этих компонентов, а не для стандартных Delphi, это приветствуется!

Ответы [ 4 ]

5 голосов
/ 18 октября 2011

В клиентском наборе данных изменения хранятся в дельте - вы можете вызвать CancelUpdates, чтобы очистить дельту и вернуться к исходному набору данных. Есть и другие, более детальные подходы. См. «Отмена изменений» в справке.

Если вы используете СУБД и правильно находитесь внутри транзакции, вы можете откатить транзакцию. Некоторые базы данных предлагают точки сохранения для отката к данной точке сохранения вместо отката всей транзакции, но это зависит от базы данных. Транзакции обычно выполняются за сеанс, а не за одну таблицу или запрос. Вы должны быть уверены, что в данной транзакции выполняются только те изменения, которые могут вам понадобиться для отката.

Набор данных клиента может быть более легким, поскольку он управляет данными только на стороне клиента и не требует ресурсов базы данных. Пока вы находитесь в транзакции внутри базы данных, для ее отслеживания и изменения данных требуются некоторые ресурсы. Транзакция должна быть столько времени, сколько требуется, но не дольше.

Также следует помнить, что транзакции могут подразумевать некоторые блокировки. Управление блокировками может сильно отличаться от базы данных к базе данных, а некоторые могут усиливать блокировки, блокируя больше пользователей, чем необходимо. Всегда проверяйте достаточное количество одновременно работающих пользователей, чтобы убедиться, что транзакции используются правильно.

1 голос
/ 18 октября 2011

В AnyDAC Вы можете сделать:

var
 iPrevSP: Integer;
...
iPrevSP := MySubDetailDataSet.SavePoint; 
SubDetailForm.ShowModal; 
if ModalResult = mrCancel then 
  MySubDetailDataSet.SavePoint := iPrevSP; 

Подобная методика доступна с TClientDataSet, kbmMemTable. Вероятно, не ответ, так как вы используете продукт DevArt.

0 голосов
/ 15 июня 2015

Вы можете использовать TClientDataset и загрузить его из файла или потока и сохранить исходные данные внутри, и каждый раз, когда вы хотите выполнить откат, перезагрузите его из исходных данных.

0 голосов
/ 28 октября 2011

С DevArt мне удалось скопировать данные в TVitualTable (версия DevArt TCLientDataSet), в любом случае функции SavePoint так же просто, как в AnyDAC, нет.

...