Форум: "Основная";
Текущий архив: 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....
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.03.25;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.005 c