Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-02-2007
jevo19100 jevo19100 is offline
Miembro
 
Registrado: ene 2006
Posts: 18
Poder: 0
jevo19100 Va por buen camino
Trigger se dispara sin Commit

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 .

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
Responder Con Cita
  #2  
Antiguo 04-02-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
El MDODataset, tiene varias propiedades para indicar el Generador a usar y cuando aplicar los cambios:
Código:
    GeneratorLink.Field = 'IDCLIENTE'
    GeneratorLink.Generator = 'GEN_CLIENTE_ID'
    GeneratorLink.WhereApply = waPost
tienes waserver, waPost, waNewRecord. Con waPost debería funcionar bien.

saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #3  
Antiguo 04-02-2007
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile

¡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.
Responder Con Cita
  #4  
Antiguo 12-02-2007
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 927
Poder: 21
rastafarey Va por buen camino
Resp

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.
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa.
Responder Con Cita
  #5  
Antiguo 13-03-2007
Avatar de sitrico
[sitrico] sitrico is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Caracas, Venezuela
Posts: 295
Poder: 21
sitrico Va por buen camino
Yo no pregunte pero gracias por responder

Ahora una duda uso para en Insert:

IDDieta un campo clave de autoincremento.

Código Delphi [-]
      
//      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.
__________________
Sitrico
Responder Con Cita
  #6  
Antiguo 13-03-2007
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 927
Poder: 21
rastafarey Va por buen camino
Resp

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.
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Ejecutar Trigger desde de Commit Capo Conexión con bases de datos 2 30-10-2008 17:55:56
Evento que se dispara al dar foco nuevamente al 1er form RJF Varios 2 07-12-2005 14:17:52
Commit micayael PHP 4 21-09-2005 19:34:50
como sincronizo el Commit de mi api con un trigger en Firebird cesar_picazo Conexión con bases de datos 1 11-10-2004 18:31:31
Commit en Trigger ó Proc. Almacenado???? AGAG4 SQL 2 06-10-2004 20:45:48


La franja horaria es GMT +2. Ahora son las 19:16:22.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi