Добрый день!

Подскажите, пожалуйста, как в функции SaveChanges, а точнее в BaseDBEdit.Dataset.Post() определяется набор полей которые надо обновить? Почему-то измененное поле сохраняется не всегда...

Заранее благодарен.

Нравится

22 комментария

"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 не генерируется автоматом?

"Олейник Дмитрий" написал:Проверьте в датасете - быть может у вас Updatequery не генерируется автоматом?

Наверно тогда бы другие поля не сохранялись? А так обновляются все поля кроме указанного текстового поля. Ну в датасете все прописано нормально.

Добрый день!

Прошу уточнить, какое у Вас состояние датасета перед "постом":

BaseDBEdit.Dataset.State

Также, посмотрите, какой UpdateQuery у Вас генерируется перед изменением значения, а какой - после.
Также, посмотрите запрос в профайлере SQL.

"Безродный Андрей" написал:Прошу уточнить, какое у Вас состояние датасета перед "постом":

Состояние где "надёжнее" проверить? В "OnDatasetBeforePost" датасета или в скрипте карточки в "dlDataOnDatasetBeforePost" (аналогичный вопрос с after)?

"Безродный Андрей" написал:Прошу уточнить, какое у Вас состояние датасета перед "постом":

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:

"Андросов Дмитрий" написал:

а галочка в selectQuery под названием "Всегда выбирать в запросе" стоит? :cool:


А зачем она, если поле в SELECT'е выбрано? Или тут тоже есть "секрет"?

Если она не стоит и поле нигде не отображается, оно не попадает в запрос. По аналогии можно предположить (я не знаю как на самом деле), что если поле при создании экземпляра датасета имеет свойство Только на чтение, оно не попадает в автоматически формируемый UpdateQuery. Т.к. UpdateQuery формируется на основе SelectQuery, можно предположить, что эта галочка добавит поле в апдейт, игнорируя признак Только на чтение. Попробуйте)
Правильно ли я понял, что в самом датасете (сервисе) у вас стоит свойство Только на чтение для этого поля, а потом в скрипте вы его меняете? Если так, то попробуйте установить его в False, а потом в скрипте менять по необходимости.

А я бы предложил вообще без всяких хитрых изменений попробовать в совершенно отвлеченном месте получить экземпляр этого датасета, отключить ему эвенты и попробовать сделать Open(), Edit(), потом поменять значение поля нужного и Post(). Потом посмотреть все ли поменялось. Если ок, искать причины в том месте, где возникает проблема - карточка, события на датасете и т.д

"Андросов Дмитрий" написал:Правильно ли я понял, что в самом датасете (сервисе) у вас стоит свойство Только на чтение для этого поля, а потом в скрипте вы его меняете?

Дмитрий, спасибо! В датасете галка не стоит, а устанавливается в true на OnPrepare, затем на кнопке OK на всякий случай меняю это свойство на false.

"Александр Кудряшов" написал:Потом посмотреть все ли поменялось

Александр, спасибо! Видимо так и придется пробовать!

Итак, если кому-то интересно: :biggrin:

на  OnDatasetBeforeEdit нельзя вешать обновление данных

"AlexLS" написал:на  OnDatasetBeforeEdit нельзя вешать обновление данных

конечно, т.к. это событие которое срабатывает перед переводом датасета в состояние редактирования (Dataset.Edit())

"Андросов Дмитрий" написал:конечно, т.к. это событие которое срабатывает перед переводом датасета в состояние редактирования (Dataset.Edit())

Дмитрий, если б Вы это "конечно" сказали тут было бы круто!!!

"AlexLS" написал:если б

если б вы о OnDatasetBeforeEdit сказали бы раньше, чем тут было бы тоже весьма кстати

Показать все комментарии