Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-80509
В.К.
2002-03-13 07:05
2002.03.25
Подсказка в опциях


3-80417
Malder
2002-02-25 22:13
2002.03.25
Раздача привелегий юзерам


14-80692
McSimm
2002-02-10 17:41
2002.03.25
А пирушка уже удалена?


1-80475
kronos
2002-03-12 13:44
2002.03.25
Как получить текущую дату???


7-80695
ValeryM
2001-12-19 17:48
2002.03.25
Медиаплейер, ошибка mmsystem





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский