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 16-08-2014
Avatar de santiago14
santiago14 santiago14 is offline
Miembro
 
Registrado: sep 2003
Ubicación: Cerrillos, Salta, Argentina
Posts: 583
Poder: 21
santiago14 Va por buen camino
Question Duda con trigger

Buenas, les comento.

Tengo una tabla: Lotes
Código SQL [-]
nro_lote:integer; (PK)
dimension:double precision;
estado_lote:varchar(50)

Un trigger sobre la tabla
Código SQL [-]
CREATE trigger asociar_lote_cliente for lotes
active before update position 0
AS

begin
  /* Solamente podemos asociar un cliente con un lote que esté DISPONIBLE */
  if (new.estado_lote = 'OCUPADO' and old.estado_lote = 'OCUPADO') then
  begin
    exception lote_no_disponible;
    
  end
end

Si queremos asociar un lote con un cliente, el mismo debe estar DISPONIBLE.
Hasta aquí todo bien, el trigger solamente me va a dejar pasar si el lote está disponible.

Resulta que ahora, por otra parte del software, se quiere modificar la dimensión del lote (que está en m2). Claramente eso no tiene nada que ver con el estado del lote.
Hago:
Código SQL [-]
Update lotes set dimension = 350
Where nro_lote = 12

Al hacer esto, el trigger de mas arriba cancela la operación indicándome que el lote no está disponible.
El trigger se ejecuta "before", y en el update no estoy enviado ningún valor para el campo "estado_lote", por lo cual debería dejar que se haga la actualización sin problemas.
Lo que veo es que new y old tienen el mismo valor, sino no habría forma de que el if me de verdadero.
Esto es lo que me confunde... o yo estoy mal con esto o cambiaron las reglas de los triggers sin avisar. Se supone, que en este caso, el valor para new.estado_lote debería ser NULL o algo parecido pues no se actúa sobre él en el Update... Bah, no se.
Uso Firebird 2.5 y Delphi XE5.

Que alguien aclare please....

Gracias.
__________________
Uno es responsable de lo que hace y de lo que omite hacer.

Última edición por santiago14 fecha: 16-08-2014 a las 19:04:21.
Responder Con Cita
  #2  
Antiguo 19-08-2014
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Las reglas no cambiaron, siempre fue así (por lo menos desde que era Interbase/Firebird 1.0.
Si algo no cambia, el new.value y el old.value serán iguales.

De todos modos no entiendo como haces la asociación. Supongo que has omitido el hecho de que la tabla lotes tiene también el cliente...
En ese caso, deberías verificar si esta disponible o no, solamente en el momento de asociar a un cliente. Quedaría algo así:
Código SQL [-]
CREATE trigger asociar_lote_cliente for lotes
active before update position 0
AS
begin
  /* Solamente si estoy modificando el cliente */
  if (new.cliente <> old.cliente) then
  begin
    /* Solamente podemos asociar un cliente con un lote que esté DISPONIBLE */
    if (new.estado_lote = 'OCUPADO' and old.estado_lote = 'OCUPADO') then
    begin
      exception lote_no_disponible;
    end
  end
end
Responder Con Cita
  #3  
Antiguo 19-08-2014
Avatar de santiago14
santiago14 santiago14 is offline
Miembro
 
Registrado: sep 2003
Ubicación: Cerrillos, Salta, Argentina
Posts: 583
Poder: 21
santiago14 Va por buen camino
Exacto, obvié al cliente. Pero creo que ya di en la tecla. Igual les consulto...
__________________
Uno es responsable de lo que hace y de lo que omite hacer.
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
Trigger josi SQL 2 26-03-2008 03:27:57
Un trigger que dispara un procedimiento que dispara un trigger... sitrico Firebird e Interbase 5 04-06-2007 22:05:13
Duda Sobre trigger DANIELMW Firebird e Interbase 3 29-01-2004 23:31:48
trigger acertij022 Firebird e Interbase 6 20-10-2003 19:20:31


La franja horaria es GMT +2. Ahora son las 18:09:30.


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