![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Update/Insert/Delete data of a View [D7, MSSQL]
Empleado © (2007-05-15 13:34:00)Други мои, вот тут задачка в голову пришла. Хочу поделиться мыслею шаловливой, а покуда нет у меня опыта в подобном, может рассуждений толковых услышать от людей с экспириенсом.
Суть:
На MS SQL'е есть база данных;
по определенным причинам необходимо дать возможность разрабатывать приложения вытаскивая информацию из уже построенных Views (включающие в среднем от 2 до 5 таблиц) в ClientDataSet'ы;
показывать ее (инфу) пользователю, который может добавлять/удалять/редактировать.
Соответственно, надо корректно обрабатывать намерения пользователя и отправлять на сервер его изменения.
Хотелось бы:
автоматизировать/оптимизировать этот процесс.
Где проблема:
Невозможно отправлять на сервер изменения данных из View напрямую.
Сначала их надо разделить на блоки данных для каждой таблицы соответственно, затем определить порядок изменений и, например, засунуть все в одну транзакцию.
Вопрос:
Как вы решаете подобные задачи?
Заранее благодарю,
Empleado
******************************
PS. Мои мысли по этому поводу. Читать необязательно, ибо bla-bla-bla...
Почитал тут книжек толковых, да артиклей заморских, и пока вот такую думку надумал:
После того, как пользователь изменил данные и делает ApplyUpdates
I) Либо самому парсировать все вручную и строить sql queries, а затем отправлять на сервер и ждать ответ;
II) Либо попробовать использовать механизмы Client DataSet'ов и Provider'ов;
III) Либо еще что-то ...
Рассмотрю II).
Рассмотрим простой случай, без учета сложных View, с частичными выборками и другими ограничениями. Рассмотрим принцип.
Шаг 1- получаем данные из View, например в SimpleDataSet (TSimpleDataSet).
Шаг 2- пользователь закончил работу с данными, сделал изменения/добавления/удаления и нажимает ApplyUpdates.
Шаг 3- Берем Delta (от View) и преобразуем его в несколько Delta (что есть по сути dataset'ы), в количестве соответствующим числу таблиц, в которые надо внести изменения, и с количеством столбцов, соответствующим количеству столбцов каждой из таблиц.
Естественно, здесь без определенной ручной работы, задания правил, и др. не обойтись.
Т.е. имеем, например, View, состоящий из join'а таблиц Пользователь, Адрес, Телефон, который показывает данные пользователя.
После изменения одного record'а этого View, имеем Delta, состоящий из столбцов, которые фактически принадлежат различным таблицам.
Теперь надо получить Delta1 для Пользователь, Delta2 для Адрес, Delta3 для Телефон, с соответствующим количеством столбцов и с данными из первоисточника Delta и с соответствующими состояниями UpdateStatus.
Шаг 4- имеем ADODataSet'ы (TADODataSet) с простым запросом "select * from [tablename]" (closed) и привязанными к ним DataSetProvider'ы (TDataSetProvider).
Шаг 5- В рамках единой транзакции (по возможности), отправляем новые полученные Delta через каждого провайдера каждой таблицы соответственно, в определенном порядке.
zdm (2007-05-15 14:06:00) [21]
> Empleado © (15.05.07 13:51) [2]
> > Jan1 (15.05.07 13:47) [1] Триггеры использовать - религия
> не позволяет ;)
а вот это жесть :)
Empleado (2007-05-15 13:51:00) [22]
> Jan1 (15.05.07 13:47) [1]
Триггеры использовать - религия не позволяет ;)
Jan1 (2007-05-15 13:47:00) [23]
> Невозможно отправлять на сервер изменения данных из View
> напрямую.
это ты тоже в книгах прочитал? А там небыло написано про INSTEAD OF триггера? Выбрось каку тогда...