Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
IF ~ERRORCODE()
PreUpdate_TriggerCount = MyCount
Message(PreUpdate_TriggerCount) ! увидеть когда отрабатывает
END
В Browse при использовании Edit in place при изменении записи не могу выловить значение до изменения записи, чтобы записать в лог.
Сообщение отрабатывает после сделанных изменений в поле таблицы, а не ДО ИЗМЕНЕНИЙ?!
Я дурак или ...
Clarion 9.1 ABC
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Что понимаете под изменением?
По идее этот триггер должен отрабатывать не до изменения (это нонсенс для триггеров), а после изменения, но перед сохранением в таблицу.
Это и нужно бы проверять.
Для вылавливания прежних значений можно воспользоваться сохранением значения в локальную переменную непосредственно перед Edit-in-place. А сохрание в лог сразу после него, если значения [прежнее и текущее] не совпали. Триггер я бы здесь не задействовал.
Shur писал(а):
Для вылавливания прежних значений можно воспользоваться сохранением значения в локальную переменную непосредственно перед Edit-in-place.
Я как раз и пытаюсь это сделать. PreUpdate_TriggerCount - это и есть глобальная, которая используется для дальнейшей обработки в другом триггере After Update. Как выловить значение поля перед изменением при EIP по одному файлу используя только триггера?
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Shur писал(а):Что понимаете под изменением?
По идее этот триггер должен отрабатывать не до изменения (это нонсенс для триггеров), а после изменения, но перед сохранением в таблицу.
Есть запись в таблице, которую пытаюсь отредактировать с помощью Edit in place, при редактировании поля необходимо сохранить значение этого поля(например 10), а по завершении редактирования поля значение изменилось и стало (например 12), необходимо произвести действия с двумя значениями сохраненными до редактирования и после.
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
gopstop2007 писал(а):Триггеры как раз в их и используют , если я не ошибаюсь. Может есть как в SQL аналогично в триггерах значения OLD.myfield и NEW.myfield?
В следующих версиях добавят.
Шутка, естественно. Я не вижу смысла - зачем SV повторять функционал SQL серверов. Я, например, не буду пользоваться этим. Может попробовать использовать SELF.Buffer и SELF.PreviousBuffer?
Подумал я, подумал. И вопрос. А что нужно сделать? Есть вещи, которые удобнее делать в клиентских приложениях, есть, которые удобнее в триггерах. Например (для триггеров), массовый update другой таблицы, не связанной с этой по форейн ключу.
kreator писал(а):Подумал я, подумал. И вопрос. А что нужно сделать?
Ведение лога для начала по одному файлу, мне казалось, что с помощью триггера проще некуда В триггерах с добавлением, удалением проблем нет, а вот с изменением (Trigger Update) и то только перед изменением получение значений проблема И как мне сохранить данные до изменения их в файле? При том, что таблиц в котором используется этот файл более 15? Если есть более простые решения, я буду только рад о них узнать
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Во, попробуй через Алиас. Сделай Алиас на эту таблицу. В PreUpdate - Fetch на запись в алиасе с уникальным id. В PostUpdate сравнивай запись своего файла с записью алиаса и пиши лог. Думаю, указатель на запись алиаса не собьётся.
И прямая дорога в SQL. Я на Sybase ASA делал лог. Там есть возможность делать триггера даже на изменение конкретного столбца (поля).
kreator писал(а):Во, попробуй через Алиас. Сделай Алиас на эту таблицу. В PreUpdate - Fetch на запись в алиасе с уникальным id. В PostUpdate сравнивай запись своего файла с записью алиаса и пиши лог. Думаю, указатель на запись алиаса не собьётся.
Спасибо огромное - получилось
kreator писал(а):И прямая дорога в SQL. Я на Sybase ASA делал лог. Там есть возможность делать триггера даже на изменение конкретного столбца (поля).
Это программа локальная, а под SQL, я правда пользуюсь MySQL и триггерами пользуюсь по полной
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Да, действительно в кларионовских триггерах основной способ работы -- через алиасы таблиц, не использованные в схемах.
Почему я не советовал использовать триггер для логирования? В отличие от предложенного мной в начале, этот вариант предполагает иметь глобальные переменные вместо локальных, что довольно затратно по времени при перекомпиляции в том случае, если вы имеете довольно большой проект, тем более, если он multi-dll. Плюс лично мне было неудобно закрывать app, открывать dct и делать правку кода там (да ещё там это запрятано так, что мама не горюй!).
Так чего же нужны эти триггеры? С их помощью хорошо, хотя и, на мой взгляд, не вполне тривиально, реализуются каскадные операции (каскадные удаления записей, а также изменения калькулируемых полей в родительских таблицах или изменения в дочерних таблицах, если происходит изменение полей в родительской записи, участвующих в foreign-ключе).