Страница 1 из 1

Trigger Update EIP

Добавлено: 13 Май 2015, 13:47
gopstop2007
Добрый день!
В dct прописал в свойствах триггера Before Update

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

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

Trigger Update EIP

Добавлено: 13 Май 2015, 14:25
Shur
Что понимаете под изменением?
По идее этот триггер должен отрабатывать не до изменения (это нонсенс для триггеров), а после изменения, но перед сохранением в таблицу.
Это и нужно бы проверять.

Для вылавливания прежних значений можно воспользоваться сохранением значения в локальную переменную непосредственно перед Edit-in-place. А сохрание в лог сразу после него, если значения [прежнее и текущее] не совпали. Триггер я бы здесь не задействовал.

Trigger Update EIP

Добавлено: 13 Май 2015, 14:46
gopstop2007
Shur писал(а): Для вылавливания прежних значений можно воспользоваться сохранением значения в локальную переменную непосредственно перед Edit-in-place.
Я как раз и пытаюсь это сделать. :) PreUpdate_TriggerCount - это и есть глобальная, которая используется для дальнейшей обработки в другом триггере After Update. Как выловить значение поля перед изменением при EIP по одному файлу используя только триггера?

Trigger Update EIP

Добавлено: 13 Май 2015, 14:56
gopstop2007
Shur писал(а):Что понимаете под изменением?
По идее этот триггер должен отрабатывать не до изменения (это нонсенс для триггеров), а после изменения, но перед сохранением в таблицу.
Есть запись в таблице, которую пытаюсь отредактировать с помощью Edit in place, при редактировании поля необходимо сохранить значение этого поля(например 10), а по завершении редактирования поля значение изменилось и стало (например 12), необходимо произвести действия с двумя значениями сохраненными до редактирования и после.

Trigger Update EIP

Добавлено: 13 Май 2015, 16:14
kreator
Есть в Global Embeds методы для каждой таблицы PreUpdate и Postupdate. Там должен быть Ваш код. Его там нет?

Trigger Update EIP

Добавлено: 13 Май 2015, 16:25
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?

Trigger Update EIP

Добавлено: 13 Май 2015, 16:57
kreator
Ну и хорошо. Что ещё надо?
gopstop2007 писал(а):Триггеры как раз в их и используют , если я не ошибаюсь. Может есть как в SQL аналогично в триггерах значения OLD.myfield и NEW.myfield?
В следующих версиях добавят.
Шутка, естественно. Я не вижу смысла - зачем SV повторять функционал SQL серверов. Я, например, не буду пользоваться этим. Может попробовать использовать SELF.Buffer и SELF.PreviousBuffer?

Trigger Update EIP

Добавлено: 13 Май 2015, 17:11
kreator
Подумал я, подумал. И вопрос. А что нужно сделать? Есть вещи, которые удобнее делать в клиентских приложениях, есть, которые удобнее в триггерах. Например (для триггеров), массовый update другой таблицы, не связанной с этой по форейн ключу.

Trigger Update EIP

Добавлено: 13 Май 2015, 17:39
gopstop2007
kreator писал(а):Подумал я, подумал. И вопрос. А что нужно сделать?
Ведение лога для начала по одному файлу, мне казалось, что с помощью триггера проще некуда :) В триггерах с добавлением, удалением проблем нет, а вот с изменением (Trigger Update) и то только перед изменением получение значений проблема :( И как мне сохранить данные до изменения их в файле? При том, что таблиц в котором используется этот файл более 15? Если есть более простые решения, я буду только рад о них узнать :)

Trigger Update EIP

Добавлено: 13 Май 2015, 17:58
kreator
Во, попробуй через Алиас. Сделай Алиас на эту таблицу. В PreUpdate - Fetch на запись в алиасе с уникальным id. В PostUpdate сравнивай запись своего файла с записью алиаса и пиши лог. Думаю, указатель на запись алиаса не собьётся.
И прямая дорога в SQL. Я на Sybase ASA делал лог. Там есть возможность делать триггера даже на изменение конкретного столбца (поля).

Trigger Update EIP

Добавлено: 13 Май 2015, 18:21
gopstop2007
kreator писал(а):Во, попробуй через Алиас. Сделай Алиас на эту таблицу. В PreUpdate - Fetch на запись в алиасе с уникальным id. В PostUpdate сравнивай запись своего файла с записью алиаса и пиши лог. Думаю, указатель на запись алиаса не собьётся.
Спасибо огромное - получилось :)
kreator писал(а):И прямая дорога в SQL. Я на Sybase ASA делал лог. Там есть возможность делать триггера даже на изменение конкретного столбца (поля).
Это программа локальная, а под SQL, я правда пользуюсь MySQL и триггерами пользуюсь по полной :)

Trigger Update EIP

Добавлено: 13 Май 2015, 23:37
Shur
Пардон, был в оффлайне.

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

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

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