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