PDA

Ver la Versión Completa : Trigger se dispara sin Commit


jevo19100
04-02-2007, 00:48:19
Hola,

Estoy usando D7, FB2 y IBExpert.

Tengo un Generador para autoincrementar un campo, todo esto lo hice mediante IBExpert, el cual crea el generador y el trigger. Bueno, el asunto es que cuando aplico un sentencia para insertar cualquier cosa y doy Rollback para cancelar la operacion, el generador ya ha incrementado su valor :confused:.

Esto me resulta confuso, pues si aun no he hecho el Commit correspondiente para que aplique los cambios al servidor, por que se incrementa? Esto me causa problema en la secuencia, pues si sucede esto, podría saltarse numeros.

He revisado el componetne MDOTrans en su propiedad AutoCommit y esta false, no he modificado en casi nada el MDODataset, solo SelectSQL para insertar la sentencia.

Por que sucede?

Gracias

Lepe
04-02-2007, 03:13:40
El MDODataset, tiene varias propiedades para indicar el Generador a usar y cuando aplicar los cambios:

GeneratorLink.Field = 'IDCLIENTE'
GeneratorLink.Generator = 'GEN_CLIENTE_ID'
GeneratorLink.WhereApply = waPost

tienes waserver, waPost, waNewRecord. Con waPost debería funcionar bien.

saludos

Al González
04-02-2007, 07:06:44
¡Hola a todos!

Jevo:

Esto se debe a que el incremento en los generadores es irreversible. No importa si reviertes (rollback) la transacción, el generador se quedará como lo dejaste. Es un comportamiento normal de los generadores ser independientes de las transacciones.

Un abrazo generado.

Al González. :)

rastafarey
12-02-2007, 18:18:51
Los generadores son arina de otro costal y se escapan del control de
transacional asi asi que si usas un generar para leevar un numero inportante como un numero de facturas asegurate que el momento que se llame es por que todo va bien.

Si le buscan un poco d elogica esto esta pefecto por imaginense se los geradores no furan asi como contraolas un proceso de facturacion con multiples cajas.

sitrico
13-03-2007, 17:40:48
Yo no pregunte pero gracias por responder :D

Ahora una duda uso para en Insert:

IDDieta un campo clave de autoincremento.


// SQL.Add('Insert.....
//
GeneratorLink.Field := 'IdDieta';
GeneratorLink.Generator := 'GEN_NU_DIETA_ID';
GeneratorLink.WhereApply := waPost;
// Aqui llamo al generador/disparador
IdDieta := -GeneratorLink.GetGenValue; // Negativo = es nuevo
ParamByName('IdDieta').AsInteger := ABS(IdDieta); // siempre valor
positivo
// ExecSQL


Cuando asigno el valor del campo clave (llamando a GetGenValue)

¿ Se ejecuta el disparador 2 veces al hacer el post ó commit ?

- aparentemente no -

PD Uso un componente TMDOQuery.

rastafarey
13-03-2007, 18:00:09
En un disparador.
1. Al ser campo unico debe posser valor unico.
2. Si no es unico le asignas el valor actual del generador y luego despues de insertar le asignas el valor proximo del genrrador.

En el sistema (en el caso de una factura) puedes mostrar el numero que podria tener no el que en realidad va a tener. Por que si es el caso que hay varios clientes(termonales, pc) facturando cada quien debe octner el numero una vez guardado. En este caso el el segundo punto no es valido aqui debes asignar el valro en un before insert.