Pregunta
· 1 mar, 2024

RestForms2 con triggers

Estoy utilizando RestForms2 para disponer de una API Rest sobre unas tablas de forma rápida.

El caso es que he añadido un trigger a las tablas para que, cada vez que se inserte/actualice/borre un registro, registre en una tabla de históricos los cambios, pudiendo ver el valor original y el nuevo de cada propiedad.

Pero el trigger solamente salta si la inserción se realiza mediante SQL. No salta creando un nuevo objeto.

Quería cambiar la definición del trigger, pero no se me ocurre cómo. Hay alguna forma de saber, antes de guardar un objeto, si existía previamente, y cuales eran los valores de sus propiedades antes y cuáles van a ser los nuevos?

Esta es la definición de la tabla y el trigger:

Class test.Usuario Extends (%Persistent, Form.Adaptor) [ DdlAllowed ]
{

Parameter FORMNAME = "Usuario";

Parameter OBJPERMISSIONS As %String = "CRUD";

Parameter DISPLAYPROPERTY As %String = "CODUSER";

Parameter FORMORDERBY As %String = "FECADD";

Property CODUSER As %String(DISPLAYNAME = "CODUSER", MAXLEN = 6);

Property NOM As %String(DISPLAYNAME = "NOM", MAXLEN = 30);

Property APE1 As %String(DISPLAYNAME = "APE1", MAXLEN = 30);

Property APE2 As %String(DISPLAYNAME = "APE2", MAXLEN = 30);

Property EMAIL As %String(DISPLAYNAME = "EMAIL", MAXLEN = 50);

Property FECADD As %TimeStamp [ InitialExpression = {$ZDT($H,3)} ];

Property FECUPD As %TimeStamp;

Index CODUSERIDX On CODUSER [ PrimaryKey ];

Trigger RegisterChange [ Event = INSERT/UPDATE/DELETE, Time = AFTER ]
{
	#dim TIPO As %String = "I"
	#dim DATA As %String = ""

	if ({%%OPERATION} = "INSERT") {
		set TIPO = "I"
	} elseif ({%%OPERATION} = "UPDATE") {
		set TIPO = "U"
	} elseif ({%%OPERATION} = "DELETE") {
		set TIPO = "D"
	} else {
		set TIPO = "I"
	}
	
	set DATA = "date: "_$ZDT($H,3)_", table: Usuario, fields:"_$Char(10)_$Char(13)
	set DATA = DATA_"CODUSER: old: "_{CODUSER*O}_", new: "_{CODUSER*N}_","_$Char(10)_$Char(13)
	set DATA = DATA_"NOM: old: "_{NOM*O}_", new: "_{NOM*N}_","_$Char(10)_$Char(13)
	set DATA = DATA_"APE1: old: "_{APE1*O}_", new: "_{APE1*N}_","_$Char(10)_$Char(13)
	set DATA = DATA_"APE2: old: "_{APE2*O}_", new: "_{APE2*N}_","_$Char(10)_$Char(13)
	set DATA = DATA_"EMAIL: old: "_{EMAIL*O}_", new: "_{EMAIL*N}_","_$Char(10)_$Char(13)
	set DATA = DATA_"FECADD: old: "_{FECADD*O}_", new: "_{FECADD*N}_","_$Char(10)_$Char(13)
	set DATA = DATA_"FECUPD: old: "_{FECUPD*O}_", new: "_{FECUPD*N}
	
	&sql(INSERT INTO test.Audit (TABLA, TIPO, DATA)
	VALUES ('Usuario', :TIPO, :DATA))
}

}
Comentarios (2)1
Inicie sesión o regístrese para continuar

Gracias por la respuesta Luis Ángel. Lo probaré, aunque creo que para poder detectar los updates/deletes tendré que implementar también el %OnBeforeSave.

-------------------------------------------------------------------

Acabo de probar otra cosa. Buscando en la comunidad he encontrado este comentario: https://community.intersystems.com/post/trigger-or-callback#comment-99361

He probado a ponerle al trigger "Foreach = row/object" y ahora ya salta cuando se hacen acciones sobre los objetos 🎉