Trigger Update EIP

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
gopstop2007
Полимат
Сообщения: 1810
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 24 раза
Поблагодарили: 10 раз

Trigger Update EIP

Сообщение gopstop2007 »

Добрый день!
В dct прописал в свойствах триггера Before Update

Код: Выделить всё

IF ~ERRORCODE()
     PreUpdate_TriggerCount = MyCount
     Message(PreUpdate_TriggerCount) ! увидеть когда отрабатывает
END
В Browse при использовании Edit in place при изменении записи не могу выловить значение до изменения записи, чтобы записать в лог.
Сообщение отрабатывает после сделанных изменений в поле таблицы, а не ДО ИЗМЕНЕНИЙ?!
Я дурак или ... :)
Clarion 9.1 ABC
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Shur
Ветеран
Сообщения: 384
Зарегистрирован: 02 Июль 2011, 18:49

Trigger Update EIP

Сообщение Shur »

Что понимаете под изменением?
По идее этот триггер должен отрабатывать не до изменения (это нонсенс для триггеров), а после изменения, но перед сохранением в таблицу.
Это и нужно бы проверять.

Для вылавливания прежних значений можно воспользоваться сохранением значения в локальную переменную непосредственно перед Edit-in-place. А сохрание в лог сразу после него, если значения [прежнее и текущее] не совпали. Триггер я бы здесь не задействовал.
gopstop2007
Полимат
Сообщения: 1810
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 24 раза
Поблагодарили: 10 раз

Trigger Update EIP

Сообщение gopstop2007 »

Shur писал(а): Для вылавливания прежних значений можно воспользоваться сохранением значения в локальную переменную непосредственно перед Edit-in-place.
Я как раз и пытаюсь это сделать. :) PreUpdate_TriggerCount - это и есть глобальная, которая используется для дальнейшей обработки в другом триггере After Update. Как выловить значение поля перед изменением при EIP по одному файлу используя только триггера?
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
gopstop2007
Полимат
Сообщения: 1810
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 24 раза
Поблагодарили: 10 раз

Trigger Update EIP

Сообщение gopstop2007 »

Shur писал(а):Что понимаете под изменением?
По идее этот триггер должен отрабатывать не до изменения (это нонсенс для триггеров), а после изменения, но перед сохранением в таблицу.
Есть запись в таблице, которую пытаюсь отредактировать с помощью Edit in place, при редактировании поля необходимо сохранить значение этого поля(например 10), а по завершении редактирования поля значение изменилось и стало (например 12), необходимо произвести действия с двумя значениями сохраненными до редактирования и после.
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
kreator
✯ Ветеран ✯
Сообщения: 5161
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Trigger Update EIP

Сообщение kreator »

Есть в Global Embeds методы для каждой таблицы PreUpdate и Postupdate. Там должен быть Ваш код. Его там нет?
We are hard at work… for you. :)
gopstop2007
Полимат
Сообщения: 1810
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 24 раза
Поблагодарили: 10 раз

Trigger Update EIP

Сообщение gopstop2007 »

kreator писал(а):Есть в Global Embeds методы для каждой таблицы PreUpdate и Postupdate. Там должен быть Ваш код. Его там нет?

Код: Выделить всё

Hide:Access:Expenses.PreUpdate PROCEDURE(LONG Pntr,UNSIGNED PutLen,*CSTRING ErrCode,*CSTRING ErrMsg)
ReturnValue          BYTE,AUTO
Buffer LIKE(Expenses:RECORD)
  CODE
  PUSHERRORS()
  IF SELF.SavePreviousBuffer AND NOT(SELF.PreviousBuffer &= NULL)
     Buffer = SELF.PreviousBuffer
  END
  ReturnValue = PARENT.PreUpdate(Pntr,PutLen,ErrCode,ErrMsg)
  IF ~ERRORCODE()
      PreUpdate_TriggerCount = MyCount
     Message(PreUpdate_TriggerCount) ! увидеть когда отрабатывает
  END
  POPERRORS()
  RETURN ReturnValue
Триггеры как раз в их и используют , если я не ошибаюсь. Может есть как в SQL аналогично в триггерах значения OLD.myfield и NEW.myfield?
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
kreator
✯ Ветеран ✯
Сообщения: 5161
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Trigger Update EIP

Сообщение kreator »

Ну и хорошо. Что ещё надо?
gopstop2007 писал(а):Триггеры как раз в их и используют , если я не ошибаюсь. Может есть как в SQL аналогично в триггерах значения OLD.myfield и NEW.myfield?
В следующих версиях добавят.
Шутка, естественно. Я не вижу смысла - зачем SV повторять функционал SQL серверов. Я, например, не буду пользоваться этим. Может попробовать использовать SELF.Buffer и SELF.PreviousBuffer?
We are hard at work… for you. :)
kreator
✯ Ветеран ✯
Сообщения: 5161
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Trigger Update EIP

Сообщение kreator »

Подумал я, подумал. И вопрос. А что нужно сделать? Есть вещи, которые удобнее делать в клиентских приложениях, есть, которые удобнее в триггерах. Например (для триггеров), массовый update другой таблицы, не связанной с этой по форейн ключу.
We are hard at work… for you. :)
gopstop2007
Полимат
Сообщения: 1810
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 24 раза
Поблагодарили: 10 раз

Trigger Update EIP

Сообщение gopstop2007 »

kreator писал(а):Подумал я, подумал. И вопрос. А что нужно сделать?
Ведение лога для начала по одному файлу, мне казалось, что с помощью триггера проще некуда :) В триггерах с добавлением, удалением проблем нет, а вот с изменением (Trigger Update) и то только перед изменением получение значений проблема :( И как мне сохранить данные до изменения их в файле? При том, что таблиц в котором используется этот файл более 15? Если есть более простые решения, я буду только рад о них узнать :)
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
kreator
✯ Ветеран ✯
Сообщения: 5161
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Trigger Update EIP

Сообщение kreator »

Во, попробуй через Алиас. Сделай Алиас на эту таблицу. В PreUpdate - Fetch на запись в алиасе с уникальным id. В PostUpdate сравнивай запись своего файла с записью алиаса и пиши лог. Думаю, указатель на запись алиаса не собьётся.
И прямая дорога в SQL. Я на Sybase ASA делал лог. Там есть возможность делать триггера даже на изменение конкретного столбца (поля).
We are hard at work… for you. :)
gopstop2007
Полимат
Сообщения: 1810
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 24 раза
Поблагодарили: 10 раз

Trigger Update EIP

Сообщение gopstop2007 »

kreator писал(а):Во, попробуй через Алиас. Сделай Алиас на эту таблицу. В PreUpdate - Fetch на запись в алиасе с уникальным id. В PostUpdate сравнивай запись своего файла с записью алиаса и пиши лог. Думаю, указатель на запись алиаса не собьётся.
Спасибо огромное - получилось :)
kreator писал(а):И прямая дорога в SQL. Я на Sybase ASA делал лог. Там есть возможность делать триггера даже на изменение конкретного столбца (поля).
Это программа локальная, а под SQL, я правда пользуюсь MySQL и триггерами пользуюсь по полной :)
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Shur
Ветеран
Сообщения: 384
Зарегистрирован: 02 Июль 2011, 18:49

Trigger Update EIP

Сообщение Shur »

Пардон, был в оффлайне.

Да, действительно в кларионовских триггерах основной способ работы -- через алиасы таблиц, не использованные в схемах.

Почему я не советовал использовать триггер для логирования? В отличие от предложенного мной в начале, этот вариант предполагает иметь глобальные переменные вместо локальных, что довольно затратно по времени при перекомпиляции в том случае, если вы имеете довольно большой проект, тем более, если он multi-dll. Плюс лично мне было неудобно закрывать app, открывать dct и делать правку кода там (да ещё там это запрятано так, что мама не горюй!).

Так чего же нужны эти триггеры? С их помощью хорошо, хотя и, на мой взгляд, не вполне тривиально, реализуются каскадные операции (каскадные удаления записей, а также изменения калькулируемых полей в родительских таблицах или изменения в дочерних таблицах, если происходит изменение полей в родительской записи, участвующих в foreign-ключе).
Ответить