Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.25;
Скачать: [xml.tar.bz2];




Вниз

Обработка OnUpdateError 


BlankAlex   (2002-03-12 10:43) [0]

Столкнулся со следующей проблемой: Обрабатываю код ошибки в OnUpdateError. Например, при попытке удалить или изменить измененную и незакоммиченную другим юзером запись, выдаю диалог с соответствующим сообщением, предлагающим повторить попытку. Но при этом Grid (использую EhDBGrid) показывает чушь, заключающуюся в том, что он отображает только измененные записи из буфера. Попытался обойти это SendMessage(Grid.Handle,WM_SETREDRAW,0,0), но это не лучший способ, т.к. при передвижении того же окна с сообщением, Grid не перерисовывается.
Посоветуйте, пожалуйста, как обработать эту ситуацию корректно.



BlankAlex   (2002-03-12 11:38) [1]

Уважаемые, неужели никто не сталкивался с данной проблемой, али влом подсказать?



Johnmen   (2002-03-12 11:42) [2]

Именно так и будут отображаться записи в DGrid"е ! И это не чушь, а функциональность живого DataSet"а.
И что же ты хочешь все-таки получить/увидеть ?



BlankAlex   (2002-03-12 11:51) [3]

Не очень красиво выглядит, когда вместо реальных данных, в частности, которые не изменены, показываются пустые строки. Хотелось бы получить что-то а-ля DisableControls.



Johnmen   (2002-03-12 12:03) [4]

Ну так и сделать DisableControls, или я что-то не догоняю ?
Что надо то ?



BlankAlex   (2002-03-12 12:44) [5]

DisableControls не работает в данной ситуации



BlankAlex   (2002-03-12 13:23) [6]

Кто еще подскажет что-нибудь вразумительное? Heeeeelp!!!



Johnmen   (2002-03-12 13:34) [7]

BlankAlex © , задай же вразумительный вопрос !



BlankAlex   (2002-03-12 13:52) [8]

Объясняю еще раз. В теле процедуры обработки OnUpdateError вывожу свое сообщение. При этом DBGridу посылается сообщение о перерисовке, он же судя по всему в данный момент работает не с DataSetом, а с буфером измененных записей и соответственно только их он и отрисовывает, что приводит к тому, что он отображает n-ое количество пустых строк (столько, сколько было видно на экране до ошибки) и реально показывает только те строки, в которые внесены изменения. DisableControls не срабатывает, пытался запретить обработку WM_SETREDRAW, но это, по-моему, некорректно.



Johnmen   (2002-03-12 14:06) [9]

Попробуй обновить НД...



BlankAlex   (2002-03-12 14:29) [10]

Интересно каким образом, если я работаю с IB, обновление подразумевает Close-Open для Query.



Johnmen   (2002-03-12 14:40) [11]

Вот с этого надо было начинать ( IB ! ).
Используй, напр. IBDataSet c соотв.прописанными св-вами...



BlankAlex   (2002-03-12 14:58) [12]

Свойство CachedUpdates = True, UpdateObject установлен, а что еще?



Johnmen   (2002-03-12 15:12) [13]

Я бы сделал так :
1. стартуем транзакцию
2. получаем IBDataSet (причем CachedUpdates = False, никакой UpdateObject не установлен, а прописаны ModifySQL и.д.)
3. делаем с IBDataSet все, что надо и м.б. не надо :)
4. подтверждаем/откатываем транзакцию...



BlankAlex   (2002-03-12 16:28) [14]

Спасибо за совет, но вот еще попутный вопрос.
Беру IBDataSet вместо IBQuery, делаю все как Вы посоветовали, и при попытке изменения удаленной др. юзером записи не получаю никакой ошибки. А если работать с IBQuery с UpdateObject, но CachedUpdates = False, то генерится ошибка, которую я могу обработать. Что Вы можете подсказать по этому поводу и посоветовать, с чем же лучше работать. И еще при таком подходе как у Вас должен ли я коммититься при изменении каждой записи или нет?



BlankAlex   (2002-03-12 16:38) [15]

> Johnmen ©
Подскажите еще, пожалуйста, а что делать при Вашем подходе, если я не хочу использовать стандартные ModifySQL, InsertSQL, а хочу при изменении или вставке записи вызывать свои хранимые процедуры с сервера. Как поступить в этом случае.



Johnmen   (2002-03-12 16:43) [16]

BlankAlex © , предлагаю все-таки быть попроще и обращаться на "ты"

1. Ошибка обязательно выскочит - если не при выполнении Post,
то при выполнении подтверждения транзакции (IBTransaction.CommitRetaining или Commit)
2. Коммититься предпочтительней после всех изменений в НД
3. Я предпочитаю использовать IBDataSet (если разговор идет о IBX компонентах)



BlankAlex   (2002-03-12 16:48) [17]

Евгений, в том-то и дело, что в конкретном случае я даю CommitRetaining сразу для каждого изменения AfterPost. И ошибка не возникает.

> BlankAlex © (12.03.02 16:38) ??? А что по этому вопросу?



Johnmen   (2002-03-12 16:53) [18]

BlankAlex © (12.03.02 16:38)

В событиях IBDataSet : AfterInsert и т.д. вызывать выполнение хр.проц.



BlankAlex   (2002-03-12 16:59) [19]

Тогда я не пойму. Я изменил запись, сделал Post, Commit, она проапдейтилась в соответствии с ModifySQL, а мне этого не надо, мне нужно вместо этого вызвать свою хранимую процедуру. А если она сидит в AfterInsert, то ???



Johnmen   (2002-03-12 17:01) [20]

BlankAlex © (12.03.02 16:48)

вариант 1 : ошибки и не должно быть !
вариант 2 : а др.пользователь сделал Commit ? и если да, то посмотри, что в таблице реально лежит...



BlankAlex   (2002-03-12 17:23) [21]

> Johnmen ©
Подскажите по поводу: BlankAlex © (12.03.02 16:59)



Johnmen   (2002-03-12 17:41) [22]

Что-то я опять перестал догонять....

Если не надо отображать изменения в НД на реальную таблицу, то и не надо Commit, а надо Rollback...

>А если она сидит в AfterInsert, то ???
Здесь сидит вызов х.п., если это необходимо...

Вообще что-то общая картина того, в чем проблема, ускользает...
Пожалуйста, поподробнее...



BlankAlex   (2002-03-12 17:55) [23]

>Johnmen ©

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

Теперь по второму вопросу. Мне необходимо добавлять записи и изменять их не через InsertSQL или UpdateSQL , а посредством вызова своих х.п. Когда у меня было CachedUpdates = True, в OnUpdateRecord я анализировал UpdateKind и вызывал соответствующую х.п. Теперь ты предлагаешь мне делать это в AfterInsert и AfterPost соответственно. У меня возникает вопрос, не сработает ли ранее при этом InsertSQL или UpdateSQL с генерацией соответствующей ошибки. Ведь мне нужно подменить вызов этих SQL своим кодом, так как это корректно сделать?



Scalia   (2002-03-12 18:15) [24]

Попробую уточнить : необходимо при изменении записей в НД делать некоторые модифицирующие изменения в др.таблицах ?

Если да - то я бы сделал эти модифицирующие изменения не через х.п., а через триггеры ведущей таблицы.

Если нет - то зачем вообще нужен НД ? Просто вызывай свои х.п. по каким-то условиям и с какими-то параметрами...


PS
На связь выйду только послезавтра... :(



Johnmen   (2002-03-12 18:17) [25]

Виноват : Scalia - это мой Alias для Malder"a....




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.25;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.76 MB
Время: 0.03 c
7-80709           Kirill                2001-12-21 20:26  2002.03.25  
Format Date


14-80667          Dima Kopachev         2002-02-09 18:09  2002.03.25  
ReportBuilder


14-80654          |\/\/ \/\/ \/\/|      2002-02-03 05:34  2002.03.25  
Два вопроса!


1-80463           Vince                 2002-03-05 22:03  2002.03.25  
Генерация собственных событий


1-80592           Hermit                2002-03-06 10:04  2002.03.25  
Ищется дискета к книге