![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обработка OnUpdateError [D6]
BlankAlex © (2002-03-12 10:43:00)Столкнулся со следующей проблемой: Обрабатываю код ошибки в OnUpdateError. Например, при попытке удалить или изменить измененную и незакоммиченную другим юзером запись, выдаю диалог с соответствующим сообщением, предлагающим повторить попытку. Но при этом Grid (использую EhDBGrid) показывает чушь, заключающуюся в том, что он отображает только измененные записи из буфера. Попытался обойти это SendMessage(Grid.Handle,WM_SETREDRAW,0,0), но это не лучший способ, т.к. при передвижении того же окна с сообщением, Grid не перерисовывается.
Посоветуйте, пожалуйста, как обработать эту ситуацию корректно.
Johnmen (2002-03-12 18:17:00) [1]Виноват : Scalia- это мой Alias для Malder"a....
Scalia (2002-03-12 18:15:00) [2]Попробую уточнить : необходимо при изменении записей в НД делать некоторые модифицирующие изменения в др.таблицах ?
Если да - то я бы сделал эти модифицирующие изменения не через х.п., а через триггеры ведущей таблицы.
Если нет - то зачем вообще нужен НД ? Просто вызывай свои х.п. по каким-то условиям и с какими-то параметрами...
PS
На связь выйду только послезавтра... :(
BlankAlex (2002-03-12 17:55:00) [3]>Johnmen ©
Разъясню на конкретном примере. У меня есть таблица. Я пытаюсь изменить запись, которая удалена другим пользователем. В соответствии с тем закоммичено это или нет я перехватываю ошибку и прекрасно оповещаю юзера об этом. Т.е. первая проблема решена.
Теперь по второму вопросу. Мне необходимо добавлять записи и изменять их не через InsertSQL или UpdateSQL , а посредством вызова своих х.п. Когда у меня было CachedUpdates = True, в OnUpdateRecord я анализировал UpdateKind и вызывал соответствующую х.п. Теперь ты предлагаешь мне делать это в AfterInsert и AfterPost соответственно. У меня возникает вопрос, не сработает ли ранее при этом InsertSQL или UpdateSQL с генерацией соответствующей ошибки. Ведь мне нужно подменить вызов этих SQL своим кодом, так как это корректно сделать?
Johnmen (2002-03-12 17:41:00) [4]Что-то я опять перестал догонять....
Если не надо отображать изменения в НД на реальную таблицу, то и не надо Commit, а надо Rollback...
>А если она сидит в AfterInsert, то ???
Здесь сидит вызов х.п., если это необходимо...
Вообще что-то общая картина того, в чем проблема, ускользает...
Пожалуйста, поподробнее...
BlankAlex (2002-03-12 17:23:00) [5]> Johnmen ©
Подскажите по поводу: BlankAlex © (12.03.02 16:59)
Johnmen (2002-03-12 17:01:00) [6]BlankAlex © (12.03.02 16:48)
вариант 1 : ошибки и не должно быть !
вариант 2 : а др.пользователь сделал Commit ? и если да, то посмотри, что в таблице реальнолежит...
BlankAlex (2002-03-12 16:59:00) [7]Тогда я не пойму. Я изменил запись, сделал Post, Commit, она проапдейтилась в соответствии с ModifySQL, а мне этого не надо, мне нужно вместо этоговызвать свою хранимую процедуру. А если она сидит в AfterInsert, то ???
Johnmen (2002-03-12 16:53:00) [8]BlankAlex © (12.03.02 16:38)
В событиях IBDataSet : AfterInsert и т.д. вызывать выполнение хр.проц.
BlankAlex (2002-03-12 16:48:00) [9]Евгений, в том-то и дело, что в конкретном случае я даю CommitRetaining сразу для каждого изменения AfterPost. И ошибка не возникает.
> BlankAlex © (12.03.02 16:38) ??? А что по этому вопросу?
Johnmen (2002-03-12 16:43:00) [10]BlankAlex © , предлагаю все-таки быть попроще и обращаться на "ты"
1. Ошибка обязательно выскочит - если не при выполнении Post,
то при выполнении подтверждения транзакции (IBTransaction.CommitRetaining или Commit)
2. Коммититься предпочтительней после всех изменений в НД
3. Я предпочитаю использовать IBDataSet (если разговор идет о IBX компонентах)
BlankAlex (2002-03-12 16:38:00) [11]> Johnmen ©
Подскажите еще, пожалуйста, а что делать при Вашем подходе, если я не хочу использовать стандартные ModifySQL, InsertSQL, а хочу при изменении или вставке записи вызывать свои хранимые процедуры с сервера. Как поступить в этом случае.
BlankAlex (2002-03-12 16:28:00) [12]Спасибо за совет, но вот еще попутный вопрос.
Беру IBDataSet вместо IBQuery, делаю все как Вы посоветовали, и при попытке изменения удаленной др. юзером записи не получаю никакой ошибки. А если работать с IBQuery с UpdateObject, но CachedUpdates = False, то генерится ошибка, которую я могу обработать. Что Вы можете подсказать по этому поводу и посоветовать, с чем же лучше работать. И еще при таком подходе как у Вас должен ли я коммититься при изменении каждой записи или нет?
Johnmen (2002-03-12 15:12:00) [13]Я бы сделал так :
1. стартуем транзакцию
2. получаем IBDataSet (причем CachedUpdates = False, никакой UpdateObject не установлен, а прописаны ModifySQL и.д.)
3. делаем с IBDataSet все, что надо и м.б. не надо :)
4. подтверждаем/откатываем транзакцию...
BlankAlex (2002-03-12 14:58:00) [14]Свойство CachedUpdates = True, UpdateObject установлен, а что еще?
Johnmen (2002-03-12 14:40:00) [15]Вот с этого надо было начинать ( IB ! ).
Используй, напр. IBDataSet c соотв.прописанными св-вами...
BlankAlex (2002-03-12 14:29:00) [16]Интересно каким образом, если я работаю с IB, обновление подразумевает Close-Open для Query.
Johnmen (2002-03-12 14:06:00) [17]Попробуй обновить НД...
BlankAlex (2002-03-12 13:52:00) [18]Объясняю еще раз. В теле процедуры обработки OnUpdateError вывожу свое сообщение. При этом DBGridу посылается сообщение о перерисовке, он же судя по всему в данный момент работает не с DataSetом, а с буфером измененных записей и соответственно только их он и отрисовывает, что приводит к тому, что он отображает n-ое количество пустых строк (столько, сколько было видно на экране до ошибки) и реально показывает только те строки, в которые внесены изменения. DisableControls не срабатывает, пытался запретить обработку WM_SETREDRAW, но это, по-моему, некорректно.
Johnmen (2002-03-12 13:34:00) [19]BlankAlex © , задай же вразумительный вопрос !
BlankAlex (2002-03-12 13:23:00) [20]Кто еще подскажет что-нибудь вразумительное? Heeeeelp!!!