Как в SaveChanges, а точнее BaseDBEdit.Dataset.Post() определяется набор полей которые надо обновить?
Добрый день!
Подскажите, пожалуйста, как в функции SaveChanges, а точнее в BaseDBEdit.Dataset.Post() определяется набор полей которые надо обновить? Почему-то измененное поле сохраняется не всегда...
Заранее благодарен.
Нравится
"AlexLS" написал:как...определяется набор полей которые надо обновить
никак. Поля, которые Enabled в датасете, сохраняются в БД. Конечно, если поля корректно настроены и для них нормально формируется элемент в selectQuery. Например, если поле получается подзапросом, его изменения просто так не сохранятся.
см также http://www.community.terrasoft.ru/blogs/8933
ПС.
"AlexLS" написал:Почему-то измененное поле сохраняется не всегда...
когда сохраняется, а когда - нет?
А другие поля сохраняются, когда это не сохраняется?
Проверьте профайлером, идет ли у вас апдейт таблицы в тех случаях, когда не сохраняется.
"AlexLS" написал:Почему-то измененное поле сохраняется не всегда...
Александр, это же подход менеджера, но не разработчика :)
Профайлер в руки и упорным анализом логов познаем закономерность.
Кстати эффект "не сохраняется" может быть из-за криво написанных обработчиков событий на датасете или карточке - типа смены значений полей при изменении других... смены не видно глазами, а она фоном происходит в датасете, ну и при сохранении уже в таблицы попадает
"Андросов Дмитрий" написал:когда сохраняется, а когда - нет?
Дмитрий, спасибо за ответ! Пытаюсь сообразить, но пока понял что при инсерте сохраняется, а пр апдейте нет. Непосредственно перед постом, в
function SaveChanges(BaseDBEdit, Window) { ... var PostResult = BaseDBEdit.Dataset.Post(); ...
, значения следующие:
Dataset.DataFields('PhoneNumber').IsReadOnly = false; Dataset.DataFields('PhoneNumber').ValueIsChanged = true; Dataset.DataFields('PhoneNumber').IsEnabled = true; Dataset.SelectQuery.Columns.ItemsByAlias('PhoneNumber').IsEnabled = true;
Что-то еще забыл указать? (да, сразу после поста значения НЕ изменились!)
Проверьте в датасете - быть может у вас Updatequery не генерируется автоматом?
Добрый день!
Прошу уточнить, какое у Вас состояние датасета перед "постом":
BaseDBEdit.Dataset.State
Также, посмотрите, какой UpdateQuery у Вас генерируется перед изменением значения, а какой - после.
Также, посмотрите запрос в профайлере SQL.
"Безродный Андрей" написал:Прошу уточнить, какое у Вас состояние датасета перед "постом":BaseDBEdit.Dataset.State
В ProcessBaseDBEditOKOnClick -> SaveChangesWithCheck -> SaveChanges
var PostResult = BaseDBEdit.Dataset.Post();
смотрю:
перед: BaseDBEdit.Dataset.State 2 Number
после: BaseDBEdit.Dataset.State 1 Number
Запрос:
exec sp_executesql N'UPDATE [dbo].[vw_SCall] SET [ModifiedOn] = getdate(), [ModifiedByID] = ''{9149E4AB-B8E2-491A-A2B1-AA344021DAF8}'', [Description] = @P1 WHERE([vw_SCall].[ID] = @P2)',N'@P1 varbinary(8000),@P2 uniqueidentifier',NULL,'835BBD40-EAE4-4139-8466-93A00156C624'
"Безродный Андрей" написал:какой UpdateQuery у Вас генерируется перед изменением значения
BaseDBEdit.Dataset.UpdateQuery.SQLText
UPDATE [dbo].[vw_SCall] SET [ModifiedOn] = NULL, [ModifiedByID] = NULL WHERE([vw_SCall].[ID] = :ID)
не смотря на то что:
Dataset.DataFields('PhoneNumber').ValueIsChanged = true
BaseDBEdit.Dataset.DataFields('PhoneNumber').ValueIsChanged = true
Под пользователем ограниченным выполняем изменение? Судя по wv_SCall
Советую посмотреть триггер tr_vw_SCall_IU (где-то так должен называться) на этой вьюшке, который отвечает за update непосредственно таблицы, по результату update вьюхи. Там с этим полем PhoneNumber все в порядке - может пропущено оно где в запросах?
"Александр Кудряшов" написал:посмотреть триггер tr_vw_SCall_IU
посмотрел
[dbo].[tr_vw_SCall_IU]
есть строка
[P].[PhoneNumber] = [I].[PhoneNumber],
у меня мысли были что из-за того что поле где-то принимает
IsReadOnly = true
(а я меняю это значение если вставка необходима), может как-то влияет на строящийся запрос вставки, но как это подтвердить не знаю и как поправить тоже не понимаю...
а галочка в selectQuery под названием "Всегда выбирать в запросе" стоит? :cool:
Если она не стоит и поле нигде не отображается, оно не попадает в запрос. По аналогии можно предположить (я не знаю как на самом деле), что если поле при создании экземпляра датасета имеет свойство Только на чтение, оно не попадает в автоматически формируемый UpdateQuery. Т.к. UpdateQuery формируется на основе SelectQuery, можно предположить, что эта галочка добавит поле в апдейт, игнорируя признак Только на чтение. Попробуйте)
Правильно ли я понял, что в самом датасете (сервисе) у вас стоит свойство Только на чтение для этого поля, а потом в скрипте вы его меняете? Если так, то попробуйте установить его в False, а потом в скрипте менять по необходимости.
А я бы предложил вообще без всяких хитрых изменений попробовать в совершенно отвлеченном месте получить экземпляр этого датасета, отключить ему эвенты и попробовать сделать Open(), Edit(), потом поменять значение поля нужного и Post(). Потом посмотреть все ли поменялось. Если ок, искать причины в том месте, где возникает проблема - карточка, события на датасете и т.д
"Андросов Дмитрий" написал:Правильно ли я понял, что в самом датасете (сервисе) у вас стоит свойство Только на чтение для этого поля, а потом в скрипте вы его меняете?
Дмитрий, спасибо! В датасете галка не стоит, а устанавливается в true на OnPrepare, затем на кнопке OK на всякий случай меняю это свойство на false.
"Александр Кудряшов" написал:Потом посмотреть все ли поменялось
Александр, спасибо! Видимо так и придется пробовать!
"AlexLS" написал:на OnDatasetBeforeEdit нельзя вешать обновление данных
конечно, т.к. это событие которое срабатывает перед переводом датасета в состояние редактирования (Dataset.Edit())
"AlexLS" написал:если б
если б вы о OnDatasetBeforeEdit сказали бы раньше, чем тут было бы тоже весьма кстати