DB-контролы. Список изменений.
От: R.O. Prokopiev Россия http://127.0.0.1/
Дата: 28.01.16 18:32
Оценка:
Привет.

Между делом занимаюсь латанием одной древней клиент-серверной системы, написаной на Delphi 7.
Перевожу с Cache на Oracle. Выяснилось, что у Oracle очень строгие правила по части updatability и insertability.
Попадётся скажем distinct или неудачный join — и курсор становится read-only.
Частично проблему решил обоработкой событий TAdoQuery. Before/After Post/Insert и т.д.
В обработчиках посылаю нужный запрос, дальше Requery, Bookmark/Locate, Dataset.Cancel, Abort.
В тестах с малым количеством полей всё работает, и довольно гладко.
Не понятно, только как получить список измененных полей для формирования запроса.
Гуглится только способ "в лоб": пробежаться по всем полям и сравнить старое значение с новым.
Не нравится мне такой способ, ведь NULL <> NULL...
Может есть способ проще?

Более общий вопрос. А можно ли вообще обойтись без жутких костылей с BeforePost?
Посмотрел сегодня ADO dynamic properties. Вроде того, что можно управлять, какие запросы шлются серверу при операциях с данными.
Можно например подставить SELECT для выдачи текущей записи. Но конкретно где прописать мои UPDATE и INSERT не нашел.
Не понятно вообще, на каком уровне (Delphi или ADO) и как данные защищаются от посылки настоящего Post().
То есть, с дефолтным поведением, Post посылает данные вникуда...

Подскажите, кто в теме. Важнее первый вопрос о списке изменений.

ЗЫ. Про SELECT FOR UPDATE знаю — не работает.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.