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 19-08-2003
mosorio mosorio is offline
Miembro
 
Registrado: may 2003
Posts: 159
Poder: 22
mosorio Va por buen camino
Caso Trigger y orden de campos

Hola compañeros!

He detectado el siguiente caso curioso en Firbird, no se si es lo mismo en Interbase.
He creado una tabla con la siguiente estructura:
Cita:
ARTICULOPROVEEDOR
CREATE TABLE "ARTPROVEE"
(
"IDPROVEEDOR" INTEGER NOT NULL,
"IDARTICULO" VARCHAR(18) CHARACTER SET ISO8859_1 NOT NULL,
"EXISTENCIAS" INT64,
"PCOSTO" INT64,
"PVENTA" INT64,
"IDFAMILIA" INTEGER NOT NULL,
"IDTIPOIVA" INTEGER NOT NULL,
"DCTO" NUMERIC(9, 2),
"GANANCIA" INTEGER NOT NULL,
"PVENTAIVA" INT64 NOT NULL,
CONSTRAINT "PKARTPROVEE" PRIMARY KEY ("IDPROVEEDOR", "IDARTICULO")
);
Esta es la tabla correcta con el orden de los campos, pero si el orden de los campos es diferente en cuanto a GANANCIA, TIPOIVA, PCOSTE, es decir si ganancia esta después de pventa, no actualiza el dato o valor.

Y un trigger para cuando se efectue su actualización
Cita:
CREATE TRIGGER ACTUALIZA FOR ARTICULOPROVEEDOR AFTER UPDATE AS
BEGIN
SELECT 1 + (SUM(I.PJEIVA + I.PJERECEQ) /100)
FROM TIPOIVA I
WHERE I.IDTIPOIVA = NEW.IDTIPOIVA INTO :IVA;

IF (OLD.PCOSTO <> NEW.PCOSTO) THEN
BEGIN
UPDATE ARTICULOPROVEEDOR
SET PVENTA = (NEW.PCOSTO * (1 + (OLD.GANANCIA / 100))),
PVENTAIVA = NEW.PCOSTO * (1 + (OLD.GANANCIA / 100)) * :IVA
WHERE IDARTICULO = OLD.IDARTICULO AND
IDPROVEEDOR = OLD.IDPROVEEDOR;
END
END;
Quiero o mejor dicho si alguno de Uds. puede dar una explicación de esto, agradecería, ya que esta nueva tabla la he creado temporalmente para verificar lo sucedido y en efecto lo he encontrado, pero no encuentro explicación si el orden afecte, ya que las reglas matemáticas, una de ellas dice SUMA ó MULTI "El orden de los factores no afecta el producto", claro esta hablando de los factores que tengo y como se ven agrupados, ya que si alteramos las operaciones del porcentaje de ganancia sin los paréntesis dará otro valor.

Bueno espero que me aclaren esto, no solo ami sino a todos, ya que al hacer un procedure o un trigger donde se implemente alguna de estas operaciones.

PD: Espero que no me digan que por qué me complico que hay maneras más faciles; lo que necesito es aclarar esto ya que esta es la forma como quiero hacerlo y no implementarlo en el código del Front-End. Sin ofender a nadie, OK.

Gracias de antemano
Responder Con Cita
  #2  
Antiguo 20-08-2003
Avatar de SCORDOBA
SCORDOBA SCORDOBA is offline
Miembro
 
Registrado: ago 2003
Ubicación: Llano de Brujas. Murcia
Posts: 37
Poder: 0
SCORDOBA Va por buen camino
Hola:

El orden de creacion de las columnas de una tabla no afectan en nada a los calculos posteriroes que se hagan sobre la tabla.

Cuando se hacen expresiones que incluyen sumas y multiplicaiones si que afacta el orden. Los operadores se ejecutan por un orden de prioridad (Parantesis, multiplicaciones, sumas).

Por ultimo he visto que actualizas la tabla en un afterupdate de la misma tabla. Esto no esta recomendado ya que se puede lanzar de manera recursiva. (Asigna los nuevos valores en un trigger creado en before update)

Saludos
__________________
Ven a Murcia y no solo pasaras calor.
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


La franja horaria es GMT +2. Ahora son las 14:07:53.


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