powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Как Вы решаете проблему "Row changed between retrieve and update"?
21 сообщений из 21, страница 1 из 1
Как Вы решаете проблему "Row changed between retrieve and update"?
    #32507232
Фотография ZiZu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!
Первый раз пишу проект с использованием PFC.
Так вот столкнулся с пресловутой проблемой при Update - "Row changed between retrieve and update". Включена поддрежка отладки PFC setDebug (TRUE), поэтому рисуется окошко, что нет переопределенного сообытия pfc_dwdberror . Вопрос такой: в каком объекте это событие должно быть реализовано (пробовал в DW, в окне parent'e DW, не подхватывается нигде) и как собственно разруливать эту ситацию, т.е. что нужно при этом событии делать. Если есть где почитать про это, ткните носом плиз. :)
...
Рейтинг: 0 / 0
Как Вы решаете проблему "Row changed between retrieve and update"?
    #32507366
Фотография Deosfen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
н-да ... интересно увидеть ответ, может с того раза, что я задавал такой же вопрос, есть другие варианты ответов.
to ZiZu: у меня это ошибка возникает, в случаях, когда я использую stored procedure, для сохранения записи, у тебя в каком случае?
...
Рейтинг: 0 / 0
Как Вы решаете проблему "Row changed between retrieve and update"?
    #32507546
Выбираю в Update propierties - Where clause = "Key columns" при Key Modification = "Use update". Тем самым забиваем на редактирование одной записи с разных клиентов, зато никаких "Row changed.." :-))
...
Рейтинг: 0 / 0
Как Вы решаете проблему "Row changed between retrieve and update"?
    #32507562
Сорри, вопрос плохо прочел... Беру слова взад...
...
Рейтинг: 0 / 0
Как Вы решаете проблему "Row changed between retrieve and update"?
    #32507589
Фотография ZiZu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня сохранение без хранимых процедур, но ошибка возникает только в том случае, когда Update Propierties стоит по всем полям выборки, если оставить только по ключевому полю, то все нормально. Только остается одна проблема, если во время редактирования запись кто-то удалил. Опять та же ошибка, но меня интересует как все таки PFC предлагает решать эту проблему, где нужно создавать event'ы и что в них писать?
...
Рейтинг: 0 / 0
Как Вы решаете проблему "Row changed between retrieve and update"?
    #32507744
guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>ZiZu
Уважаемый/ая ZiZu!
Может быть Вы определитесь с вопросами?
Предположительно, их два:
1. Когда, почему возникает сообщение "Row changed between retrieve and update"
2. Где и как обрабатывать error messages от DBMS в PB с использованием PFC
...
Рейтинг: 0 / 0
Как Вы решаете проблему "Row changed between retrieve and update"?
    #32507845
Фотография ЗоринАндрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zizu. когда пользователи наперегонки не глядя затирают изменения друг друга - это нормально?
ИМХО, есть два метода работы.
Зачитывать запись сразу с блокировкой (всяческие updlock, rowlock для MSSQL). Либо использовать все (или только измененные) поля, либо timastamp.
Все остальное, в том числе и Key Only - поверхностный, небрежный, непрофессиональный подход.
Прежде чем задаваться вопросом "где и что мне вписать", следует почитать про пессимистические и оптимистические блокировки и для себя определить какой именно стратегии придерживаться.

Если вернуться к теме - ошибку "Row changed..." обрабатываем как обычную ошибку БД, т.е. сообщаем пользователю что произошло, но затем перечитываем запись из базы - пусть юзер смотрит на то что действительно теперь есть в БД и решает вводить ему свои изменения заново или что-то еще.
Не думаю что это сложно закодировать или в PFC есть какие-то особенности с этим связанные. Обычная реализация pfc_dberror где-то на уровне ancestor'а для форм.

З.Ы. pfc_dwdberror это не событие, а сообщение которого не может найти PFC.
Обычно оно находится в таблице messages. Судя по всему не настроен нормально Error Service.
...
Рейтинг: 0 / 0
Как Вы решаете проблему "Row changed between retrieve and update"?
    #32508067
Фотография ZiZu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Зорин Андрей
>> когда пользователи наперегонки не глядя затирают изменения друг друга - это нормально?
по-моему это не нормально, вот я и пытаюсь сделать по нормальному перекрыть событие pfc_dbdwerror и спросить у пользователя, что делать дальше. Теперь про блокировки, я читал/знаю, что такое уровни изоляции данных и блокировки (надеюсь, что знаю неплохо, только у меня не MSSQL, а ASA, что в нашем случае почти одно и тоже), так вот подход, когда пользователь нажимает кнопку "Сохранить" и ждет когда же заблокированную другим запись (даже row-level) кто-нибудь освободит тоже считаю непрофессиональным, поверхностным подходом.
По сути Ваш З.Ы. и оказался самым полезным, спасибо
>> Обычно оно находится в таблице messages. Судя по всему не настроен нормально Error Service.
Попробую найти что-нибудь про это...
...
Рейтинг: 0 / 0
Как Вы решаете проблему "Row changed between retrieve and update"?
    #32508100
Фотография ZiZu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Guest
1. Когда возникает ошибка "Row changed between retrieve and update" я знаю и не спрашивал.
2. "Где и как обрабатывать error messages от DBMS в PB с использованием PFC"
Ну насколько я понимаю, эта ошибка не приходит от DBMS, ее генерирует сам PB, когда не может найти при Update запись которую он Retrieve'ил.

P.S. Что бы с этим "Уважаемый/ая ZiZu!" не было непоняток вклеил в профайл фотку
...
Рейтинг: 0 / 0
Как Вы решаете проблему "Row changed between retrieve and update"?
    #32508109
Фотография ZiZu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2ЗоринАндрей
Андрей, почему Вы считаете, что pfc_dwdberror это сообщение, а не событие. У меня в PB все функции которые начинаются с pfc_ находятся на вкладке "Event List". Event, насколько я понимаю английский - событие.
Хотя когда делается вызов object. EVENT EventName , то действительно получается посылаем сообщение (message). Меня-то интересует именно реализация события. Но это так - мелочи, спасибо еще раз, буду искать как настраивать Error Service
...
Рейтинг: 0 / 0
Как Вы решаете проблему "Row changed between retrieve and update"?
    #32508924
guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2ZiZu

class: pfc_u_dw
event: pfc_u_dw.dberror
....
// Display the message immediately.
...
else
of_MessageBox (" pfc_dberror ",
gnv_app.iapp_object.DisplayName, ls_message, StopSign!, Ok!, 1)
end if
...

следовательно "pfc_dwdberror" это ID сообщения а не имя события.
...
Рейтинг: 0 / 0
Как Вы решаете проблему "Row changed between retrieve and update"?
    #32509027
Фотография ZiZu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Guest
Хорошо, понятно
Спасибо, я понял где это происходит
...
Рейтинг: 0 / 0
Как Вы решаете проблему "Row changed between retrieve and update"?
    #32518681
Такая ошибка возникает в следующем случае ( Pb8.0.4 + WinXP + OLE DB на MSSql2000 ):
УДАЛЯЮ запись из таблицы, на которую повешен триггер на удаление записей из связанных таблиц. В триггере писано просто
delete from <table> where <sid> in (select <nid> from deleted)
и еще на пару таблиц.
Так вот, PB даёт эту ошибку, если в одной из связанных таблиц не оказалось удаляемых строк. И всё откатывает. Проверка, например:
if exists ( select from <table> where <sid> in (select <nid> from deleted) )
delete from <table> where <sid> in (select <nid> from deleted)
это сообщение ликвидирует.
Может, просто OLE драйвер настроить как-то надо (всё по умолчанию)?
При нативском драйвере MSS всё Ok - никаких проверок не надо.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Как Вы решаете проблему "Row changed between retrieve and update"?
    #33228104
Фотография savosin_sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
действительно, если добавить проверку в триггер на наличие строк в detail-таблице, то всё заработало (пропала эта ошибка -- "Row changed between retrieve and update")
...
Рейтинг: 0 / 0
Как Вы решаете проблему "Row changed between retrieve and update"?
    #33229288
Andrew Nagorny
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>( Pb8.0.4 + WinXP + OLE DB на MSSql2000 ):

в начале триггера нужно поставить
set nocount on

Билдер проверяет @@rowcount,а триггер сбивает его.
...
Рейтинг: 0 / 0
Как Вы решаете проблему "Row changed between retrieve and update"?
    #33229499
Фотография savosin_sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Andrew Nagorny: спасибо, что-то я не знаю, что set nocount on|off влияет на @@rowcount !

не хочется "слазить" с oledb-провайдера. хотя подмечены ещё пара глюков:
1. не подключаются справочники, у которых первичный ключ имеет тип данных, отличный от внешнего ключа в "главной" таблице ("главная"=к которой подключён справочник). например, numeric(19) и bigint -- приводят к ошибке. В mssql-провайдере такой ошибки нет, эти же справочники нормально подключаются

2. разное поведение (для oledb и mssql - провайдеров) хранимых поцедур при выполнении отчётов (т.е. в теле отчёта вызывается ХП со временной таблицей, потом всякие select'ы с ней работают)

3. пошёл слух ;-) , что несколько одновременных соединений с БД приводят к "вылету" приложения. Чего нет в mssql-провайдере
...
Рейтинг: 0 / 0
Как Вы решаете проблему "Row changed between retrieve and update"?
    #33289796
Tea-pot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maybe this can help

http://www.sybase.com/detail?id=1036938


"
5.1.2 Update fails with Rows to Disk retrieve option
On the Specify Update Properties dialog box for a DataWindow object, if the Key and Updateable Columns radio button is selected in the Where Clause for Update/Delete group box, DataWindow update fails when the retrieve option is set to Rows to Disk. The error returned is Row changed between retrieve and update. To work around this issue, change the setting in the Where Clause for Update/Delete group box to Key Columns . [CR 341514]

"
...
Рейтинг: 0 / 0
Как Вы решаете проблему "Row changed between retrieve and update"?
    #33290236
Фотография savosin_sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не, никаких "Rows to Disk retrieve option" не было включено. всё дело в set nocount on + oledb provider. Кстати, выяснилось, что если на msSql2000 поставить, например, service pack 3, то и с провайдером "MSS Microsoft SQL Server" работает быстро (а без SP3, почему-то, загрузка данных в DW происходит медленно на этом провайдере)
...
Рейтинг: 0 / 0
Как Вы решаете проблему "Row changed between retrieve and update"?
    #33290653
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати маленькое замечание на счет "забития" на изолированность при update по ключу. Если стоит любое другое условие, например key and upadtetable columns ни одно из значений не должно содержать null иначе данное сообщение неизбежно
...
Рейтинг: 0 / 0
Как Вы решаете проблему "Row changed between retrieve and update"?
    #33291435
Фотография ЗоринАндрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не знаю что Вы делаете неправильно, но это очевидная чушь.
PB нормально генерирует для NULL значений операторы вида
UPDATE <table> value = 1 WHERE key_id = 1 AND value IS NULL
и
UPDATE <table> value = NULL WHERE key_id = 1 AND value = 1
которые выполняются без ошибок.
...
Рейтинг: 0 / 0
Как Вы решаете проблему "Row changed between retrieve and update"?
    #33293357
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UPDATE <table> value = 1 WHERE key_id = 1 AND value IS NULL

Каюсь, в 9-ке не проверял но затыки были уже не раз в предыдущих версиях.
Так что верю на слово...
Хотя для снятия проблем и ускорения проще все-таки использовать мое предложение
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Как Вы решаете проблему "Row changed between retrieve and update"?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]