-
есть некое поле в TClientDataset.
в обработчике BeforeUpdateRecord провайдера нужно выяснить, редактировалось ли поле или нет, если OldValue содержит данные, а NewValue у него IsNull.
Ведь этот null мог появиться как результат очистки поля, а может просто показывать, что поле не трогали.
Как узнать, что все-таки там происходило?
-
если NewValue <> OldValue то поле редактировалось, если = не редактировалось, и неважно что там делали с новым значением, чистили снова вводили и опять чистили... раз привели к равенству со старым считай не редактировалось.
-
не совсем так
если поле не редактировали, то его NewValue будет null
т.е. NewValue<>OldValue для случая, если OldValue не null
отсюда и затык
-
ну добавь в иф сравнение с нулом.
если не равны, но один из них (или оба) нул значит не редактировалось.
-
> если не равны, но один из них (или оба) нул значит не редактировалось.
не значит
может быть ситуация, что непустое вначале поле при редактировании обнулили
-
и чо?
нулл != нулл or isnull(нулл)
-
или ты хочешь доказать, что погромист имея два значения неизбежно заблудится в них если там где-то нулл?
-
я хочу сказать, что 2 ситуации пока для меня неотличимы:
1) OldValue <> null, NewValue = null (в результате редактирования)
2) OldValue <> null, NewValue = null (если редактирования не было в принципе)
-
у тэфилда кроме нью и олд валуев есть еще просто валуе.
кроме того, в обработчик прилетает сорс датасет и дельта датасет
если олдвалуе не нулл, нью валуе нулл и поле не редактировалось, то угадай что лежит в валуе.
-
> если поле не редактировали, то его NewValue будет null
сравнивай не с new тогда, а c CurrentValue.
-
и вообще, есть же UpdateStatus, где все сравнения за тебя делаются.
-
> rrrrrr © (19.07.17 23:48) [8]
> sniknik © (19.07.17 23:49) [9]
зачем вы играете в угадайку? в нее я и сам умею играть
мне был интересен совет того, кто ЗНАЕТ
-
> кто ЗНАЕТ
таких нет, совсем нет..., и вообще тайных знаний типа функций "сделатькакнадо" не бывает.
-
теперь докладываю результаты своих экспериментов в обработчике BeforeUpdateRecord провайдера:
> у тэфилда кроме нью и олд валуев есть еще просто валуе.
Value всегда равен NewValue
> в обработчик прилетает сорс датасет и дельта датасет
SourceDS в этом обработчике ЗАКРЫТ, поскольку он однонаправленный и уже был прочитан в ClientDadaset
DeltaDS и так анализируется - OldValue и NewValue из него
> сравнивай не с new тогда, а c CurrentValue.
CurrValue в справке описан так: CurValue may differ from OldValue if another user changed the value of the field after OldValue was read, т.е. это обновленные данные с сервера, если кто-то что-то там с ними сделал
в моем случае почему-то числовые поля всегда равны 0, строковые ""
но по-любому, к правкам на моем клиенте они отношения не имеют
-
делу же помогла функция VarIsEmpty, для нее пустые значения все-таки отличаются
надеюсь, это кому-то поможет
-
не совсем так
если поле не редактировали, то его NewValue будет null
т.е. NewValue<>OldValue для случая, если OldValue не null
-
> Xackad © (13.08.17 22:21) [15]
почитай разницу между функциями VarIsEmpty и VarIsNull
null - это тоже присвоенное значение
а если поле не редактировалось, то там просто пусто, т.е. даже не null, а "ничто"