Подскажите, пожалуйста, как в функции SaveChanges, а точнее в BaseDBEdit.Dataset.Post() определяется набор полей которые надо обновить? Почему-то измененное поле сохраняется не всегда...
"AlexLS" написал:как...определяется набор полей которые надо обновить
никак. Поля, которые Enabled в датасете, сохраняются в БД. Конечно, если поля корректно настроены и для них нормально формируется элемент в selectQuery. Например, если поле получается подзапросом, его изменения просто так не сохранятся.
"AlexLS" написал:Почему-то измененное поле сохраняется не всегда...
когда сохраняется, а когда - нет?
А другие поля сохраняются, когда это не сохраняется?
Проверьте профайлером, идет ли у вас апдейт таблицы в тех случаях, когда не сохраняется.
"AlexLS" написал:Почему-то измененное поле сохраняется не всегда...
Александр, это же подход менеджера, но не разработчика :)
Профайлер в руки и упорным анализом логов познаем закономерность.
Кстати эффект "не сохраняется" может быть из-за криво написанных обработчиков событий на датасете или карточке - типа смены значений полей при изменении других... смены не видно глазами, а она фоном происходит в датасете, ну и при сохранении уже в таблицы попадает
"Безродный Андрей" написал:Прошу уточнить, какое у Вас состояние датасета перед "постом":
Состояние где "надёжнее" проверить? В "OnDatasetBeforePost" датасета или в скрипте карточки в "dlDataOnDatasetBeforePost" (аналогичный вопрос с after)?
Под пользователем ограниченным выполняем изменение? Судя по wv_SCall
Советую посмотреть триггер tr_vw_SCall_IU (где-то так должен называться) на этой вьюшке, который отвечает за update непосредственно таблицы, по результату update вьюхи. Там с этим полем PhoneNumber все в порядке - может пропущено оно где в запросах?
посмотрел[dbo].[tr_vw_SCall_IU]
есть строка [P].[PhoneNumber]=[I].[PhoneNumber],
у меня мысли были что из-за того что поле где-то принимает IsReadOnly =true (а я меняю это значение если вставка необходима), может как-то влияет на строящийся запрос вставки, но как это подтвердить не знаю и как поправить тоже не понимаю...
Если она не стоит и поле нигде не отображается, оно не попадает в запрос. По аналогии можно предположить (я не знаю как на самом деле), что если поле при создании экземпляра датасета имеет свойство Только на чтение, оно не попадает в автоматически формируемый UpdateQuery. Т.к. UpdateQuery формируется на основе SelectQuery, можно предположить, что эта галочка добавит поле в апдейт, игнорируя признак Только на чтение. Попробуйте)
Правильно ли я понял, что в самом датасете (сервисе) у вас стоит свойство Только на чтение для этого поля, а потом в скрипте вы его меняете? Если так, то попробуйте установить его в False, а потом в скрипте менять по необходимости.
А я бы предложил вообще без всяких хитрых изменений попробовать в совершенно отвлеченном месте получить экземпляр этого датасета, отключить ему эвенты и попробовать сделать Open(), Edit(), потом поменять значение поля нужного и Post(). Потом посмотреть все ли поменялось. Если ок, искать причины в том месте, где возникает проблема - карточка, события на датасете и т.д
"Андросов Дмитрий" написал:Правильно ли я понял, что в самом датасете (сервисе) у вас стоит свойство Только на чтение для этого поля, а потом в скрипте вы его меняете?
Дмитрий, спасибо! В датасете галка не стоит, а устанавливается в true на OnPrepare, затем на кнопке OK на всякий случай меняю это свойство на false.
"Александр Кудряшов" написал:Потом посмотреть все ли поменялось
Александр, спасибо! Видимо так и придется пробовать!