Конференция "Базы" » редактировалось ли поле в ClientDataset ? [D7]
 
  • Чемпаркароке © (19.07.17 20:44) [0]
    есть некое поле в TClientDataset.
    в обработчике BeforeUpdateRecord провайдера нужно выяснить, редактировалось ли поле или нет, если OldValue содержит данные, а NewValue у него IsNull.
    Ведь этот null мог появиться как результат очистки поля, а может просто показывать, что поле не трогали.
    Как узнать, что все-таки там происходило?
  • sniknik © (19.07.17 21:56) [1]
    если NewValue <> OldValue то поле редактировалось, если = не редактировалось, и неважно что там делали с новым значением, чистили снова вводили и опять чистили... раз привели к равенству со старым считай не редактировалось.
  • Чемпаркароке © (19.07.17 22:13) [2]
    не совсем так
    если поле не редактировали, то его NewValue будет null
    т.е. NewValue<>OldValue для случая, если OldValue не null

    отсюда и затык
  • rrrrrr © (19.07.17 23:12) [3]
    ну добавь в иф сравнение с нулом.
    если не равны, но один из них (или оба) нул значит не редактировалось.
  • Чемпаркароке © (19.07.17 23:20) [4]

    > если не равны, но один из них (или оба) нул значит не редактировалось.

    не значит
    может быть ситуация, что непустое вначале поле при редактировании обнулили
  • rrrrrr © (19.07.17 23:27) [5]
    и чо?

    нулл != нулл or isnull(нулл)
  • rrrrrr © (19.07.17 23:29) [6]
    или ты хочешь доказать, что погромист имея два значения неизбежно заблудится в них если  там где-то нулл?
  • Чемпаркароке © (19.07.17 23:34) [7]
    я хочу сказать, что 2 ситуации пока для меня неотличимы:
    1) OldValue <> null, NewValue = null (в результате редактирования)
    2) OldValue <> null, NewValue = null (если редактирования не было в принципе)
  • rrrrrr © (19.07.17 23:48) [8]
    у тэфилда кроме нью и олд валуев есть еще просто валуе.
    кроме того, в обработчик прилетает сорс датасет и дельта датасет

    если олдвалуе не нулл, нью валуе нулл и поле не редактировалось, то угадай что лежит в валуе.
  • sniknik © (19.07.17 23:49) [9]
    > если поле не редактировали, то его NewValue будет null
    сравнивай не с new тогда, а c CurrentValue.
  • sniknik © (20.07.17 00:53) [10]
    и вообще, есть же UpdateStatus, где все сравнения за тебя делаются.
  • Чемпаркароке © (26.07.17 12:20) [11]

    > rrrrrr ©   (19.07.17 23:48) [8]
    > sniknik ©   (19.07.17 23:49) [9]

    зачем вы играете в угадайку? в нее я и сам умею играть
    мне был интересен совет того, кто ЗНАЕТ
  • sniknik © (26.07.17 12:28) [12]
    > кто ЗНАЕТ
    таких нет, совсем нет..., и вообще тайных знаний типа функций "сделатькакнадо" не бывает.
  • Чемпаркароке © (26.07.17 12:29) [13]
    теперь докладываю результаты своих экспериментов в обработчике 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, строковые ""
    но по-любому, к правкам на моем клиенте они отношения не имеют
  • Чемпаркароке © (26.07.17 12:31) [14]
    делу же помогла функция VarIsEmpty, для нее пустые значения все-таки отличаются

    надеюсь, это кому-то поможет
  • Xackad © (13.08.17 22:21) [15]
    не совсем так
    если поле не редактировали, то его NewValue будет null
    т.е. NewValue<>OldValue для случая, если OldValue не null
  • Чемпаркароке © (15.08.17 14:07) [16]

    > Xackad ©   (13.08.17 22:21) [15]

    почитай разницу между функциями VarIsEmpty и VarIsNull
    null - это тоже присвоенное значение
    а если поле не редактировалось, то там просто пусто, т.е. даже не null, а "ничто"
 
Конференция "Базы" » редактировалось ли поле в ClientDataset ? [D7]
Есть новые Нет новых   [118230   +20][b:0][p:0]