![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
CashedUpdates на результат SP [D6, IB6.x]
koks © (2003-04-01 14:08:00)Уважаемые мастера !
Подскажите, как грамотно наложить на результат SELECT-а из Suspend-процедуры кэшированные изменения...
SUSPEND - процедура производит объединение 5-ти таблиц. Че-то я совсем запутался - что надо обновлять - то ли пять таблиц через IBUdateSQL для каждой, то ли через вызовы отдельных SP (для обновления, удаления, вставки), которые уже будут разносить данные по таблицам.
zacho (2003-04-02 12:00:00) [1]
> koks © (02.04.03 11:55)
Можно, можно ...
А не быстрее ли попробовать, чем ждать ответа ?
koks (2003-04-02 11:55:00) [2]Хорошо - если я ВАС правильно понял, то в IBDataSet в свойствах ******SQL можно свободно использовать, например:
EXECUTE PROCEDURE Modify_SP
:param1
:param2
:param3
или как...
Johnmen (2003-04-02 11:27:00) [3]Не надо тебе ничего анализировать !
см.
>zacho © (01.04.03 16:46)
>>И вообще, для подобных целей советую использовать TIBDataSet.
zacho (2003-04-02 11:27:00) [4]Проще всего плюнуть на IBQuery и использовать IBDataSet - в нем все нормально работает.
koks (2003-04-02 11:05:00) [5]Zacho - так-так, уже теплее... Можно маленькое уточнение - в каком событии мне надо анализировать этот RowsAffected..
Заранее большое спасибо...
zacho (2003-04-02 09:44:00) [6]
> при вызове ApplyUpdates вылетало исключение Update failed.
Так происходит потому, что ожидается RowsAffected=1, а при вызове SP RowsAffected возвращает 0. Т.ч. тебе просто надо обработать эту ошибку.
> 3. Интересный вариант кроме одного - читаю этот форум регулярно
> - многие не советуют использовать Veiews, тем более обновляемые.
С чего бы это ? Я проблем не замечал.
koks (2003-04-02 09:35:00) [7]2 zacho . Во-первых, большое спасибо за подробный ответ.
Во-вторых - по порядку:
1. 5 таблиц менять - уверен. Там у меня справочников нет вообще. Все справочники я использую только через lookup-поля ... принципиально.
2. Я так и сделал - создал 3 SP: SP_MODIFY, SP_DELETE, SP_INSERT
(c рефрешем понятно). с соответствующими параметрами. Только в Firebird EXECUTE PROCEDURE MY_SP :param <- запускается без скобок. Так вот в IBUpdateSQL в соответствующем ******SQL вызывал соответствующую SP. - Delphi ругался... В ран-тайме при вызове ApplyUpdates вылетало исключение Update failed. Мне показалось (чисто интуитивно :)) что ошибка идеологическая - т.е. типа свойства IBUpdateSQL.*****SQL не понимают вызов EXECUTE PROCEDURE
3. Интересный вариант кроме одного - читаю этот форум регулярно - многие не советуют использовать Veiews, тем более обновляемые.
zacho (2003-04-01 16:46:00) [8]Кэшированные или нет, здесь роли не играет.
И вообще, для подобных целей советую использовать TIBDataSet.
Теперь конкретнее :)
1. А ты уверен, что тебе надо вносить изменения во все 5 таблиц ? Просто наиболее типичная ситуация, когда объединение нескольких таблиц делается для того, чтобы вытащить данные из "справочников" на которые ссылается "основная" таблица. В этом случае, как правило, редактировать "справочники" не надо, достаточно вносить изменения в "основную" таблицу. Т.е. в SelectSQL пусть будет что-то типа SELECT ID,FILED_1,FIELD_2,..,FIELD_N FROM MY_SP(:PARAM_1,..), в ModifySQL - UPDATE MY_TABLE SET FIELD_1=:FIELD1, ... WHERE ID=:ID и т.п.
2. Действительно, надо вносить изменения во все связанные таблицы. Сделать это можно несколькими способами, один из самых простых - создать SP для вставки и модификации данных. Тогда в ModifySQL - EXECUTE PROCEDURE MY_UPDATE_PROC(:ID,FIELD_1,...) и т.д.
3. Если в SP у тебя только простой SELECT с объединением таблиц без каких-либо вычислений и т.п. то можно сделать аналогичный VIEW с триггерами BEFORE UPDATE, BEFORE INSERT, BEFORE DELETE и из приложения работать с ним как с обычной таблицей.
koks (2003-04-01 15:45:00) [9]ПАМАГИТЕ !!!