Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MySQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=21)
-   -   Insert desde select no ejecuta trigger (https://www.clubdelphi.com/foros/showthread.php?t=90017)

subzero 20-03-2016 04:01:14

Insert desde select no ejecuta trigger
 
Hola.

Bueno estoy trabajando en un proyecto en el cual realizo una consulta y de ella realizo inserción en la tabla correspondiente... hasta ahi todo va bien porque es solo algo como esto..,

Código SQL [-]
INSER INTO mitabla(campo1, campo2, campo3) 
SELECT C1, C2, C3 
FROM tabladereferencia 
WHERE id = id_;
Así de sencillo, sin embargo en la tabla que he denominado "mitabla" existe un trigger que se ejecuta al insertar en el evento after... en él lo que hago es un conjunto de formulas para calcular otros campos que hacen parte de "mitabla" pero nunca se logran ejecutar.

Lo curioso es que cuando hago un insert convencional sin la utilización de select todo va bien.


Les agradezco la ayuda que me puedan otorgar.

Saludos!

Casimiro Notevi 20-03-2016 21:05:35

Cita:

Empezado por subzero (Mensaje 503507)
existe un trigger que se ejecuta al insertar en el evento after...

En el AfterInsert, y no se ejecuta. ¿Cómo sabes que no se ejecuta? lo mismo no cumple con las condiciones que tenga. Muestra el código, no podemos decir mucho si no lo vemos.

subzero 20-03-2016 23:37:53

Gracias, casimiro y si tienes razón olvide algunos detalles.. el trigger se encuentra en el before insert, pués realmente no he podido colocarlo en el after insert, pués me muestra error de que NEW no es permitido... el código es el siguiente.

Código SQL [-]
BEGIN
  IF NEW.UNIDAD = 'UND' THEN  SET NEW.TOTAL_UM = NEW.CONVERSION * NEW.CANTIDAD; END IF;
    IF NEW.UNIDAD = 'UM' THEN  SET NEW.TOTAL_UM = NEW.CANTIDAD; END IF;
  
  SET NEW.COSTO_SUBTOTAL = CAST(ROUND(NEW.COSTO * NEW.CANTIDAD) AS DECIMAL(18,4));
    SET NEW.COSTO_IVA = CAST((ROUND((NEW.COSTO * (NEW.PCJ_IVA/100))) * NEW.CANTIDAD) AS DECIMAL(18,4));
    SET NEW.COSTO_DTO1 = CAST(ROUND(CAST(CAST((NEW.COSTO * (NEW.PCJ_DTO1/100)) AS DECIMAL(18,4)) * NEW.CANTIDAD AS DECIMAL(18,4))  )AS DECIMAL(18,4));  
    SET NEW.COSTO_DTO2 = CAST(ROUND(CAST( CAST(((NEW.COSTO - CAST((NEW.COSTO * (NEW.PCJ_DTO1/100)) AS DECIMAL(18,4)))* CAST((NEW.PCJ_DTO2/100) AS DECIMAL(18,4))) AS DECIMAL(18,4)) * NEW.CANTIDAD AS DECIMAL(18,4))) AS DECIMAL(18,4));
    SET NEW.COSTO_DTO3 = CAST(ROUND(CAST( CAST(((NEW.COSTO - CAST((NEW.COSTO * (NEW.PCJ_DTO1/100)) AS DECIMAL(18,4))-((NEW.COSTO - CAST((NEW.COSTO * (NEW.PCJ_DTO1/100)) AS DECIMAL(18,4)))* CAST((NEW.PCJ_DTO2/100) AS DECIMAL(18,4)))) * CAST((NEW.PCJ_DTO3/100) AS DECIMAL(18,4))) AS DECIMAL(18,4)) * NEW.CANTIDAD AS DECIMAL(18,4))) AS DECIMAL(18,4));
    SET NEW.COSTO_TOTAL = CAST((NEW.COSTO_SUBTOTAL + NEW.COSTO_IVA - NEW.COSTO_DTO1 - NEW.COSTO_DTO2 - NEW.COSTO_DTO3) AS DECIMAL(18,4));
  
  SET NEW.PRECIO_SUBTOTAL = CAST(ROUND(NEW.PRECIO * NEW.CANTIDAD) AS DECIMAL(18,4));
    SET NEW.PRECIO_IVA = CAST((ROUND((NEW.PRECIO * (NEW.PCJ_IVA/100))) * NEW.CANTIDAD) AS DECIMAL(18,4));
    SET NEW.PRECIO_DTO1 = CAST(ROUND(CAST(CAST((NEW.PRECIO * (NEW.PCJ_DTO1/100)) AS DECIMAL(18,4)) * NEW.CANTIDAD AS DECIMAL(18,4))  )AS DECIMAL(18,4));
    SET NEW.PRECIO_DTO2 = CAST(ROUND(CAST( CAST(((NEW.PRECIO - CAST((NEW.PRECIO * (NEW.PCJ_DTO1/100)) AS DECIMAL(18,4)))* CAST((NEW.PCJ_DTO2/100) AS DECIMAL(18,4))) AS DECIMAL(18,4)) * NEW.CANTIDAD AS DECIMAL(18,4))) AS DECIMAL(18,4));
    SET NEW.PRECIO_DTO3 = CAST(ROUND(CAST( CAST(((NEW.PRECIO - CAST((NEW.PRECIO * (NEW.PCJ_DTO1/100)) AS DECIMAL(18,4))-((NEW.PRECIO - CAST((NEW.PRECIO * (NEW.PCJ_DTO1/100)) AS DECIMAL(18,4)))* CAST((NEW.PCJ_DTO2/100) AS DECIMAL(18,4)))) * CAST((NEW.PCJ_DTO3/100) AS DECIMAL(18,4))) AS DECIMAL(18,4)) * NEW.CANTIDAD AS DECIMAL(18,4))) AS DECIMAL(18,4));
    SET NEW.PRECIO_TOTAL = CAST((NEW.PRECIO_SUBTOTAL + NEW.PRECIO_IVA - NEW.PRECIO_DTO1 - NEW.PRECIO_DTO2 - NEW.PRECIO_DTO3) AS DECIMAL(18,4));
END

Como pueden observar se encarga de realizar algunos cálculos e incrustarlo en el campo correspondiente... quizás sea algo que no tengo en cuenta puesto que soy nuevo en MYSQL... Gracias.

Casimiro Notevi 21-03-2016 10:06:25

Entonces me imagino que el insert que has puesto antes también es ficticio, esto me recuerda cuando una madre va al médico y le dice: mire, doctor, es que mi hija dice que le duele por aquí, ¿qué puede ser?
Y el doctor la mira perplejo ;)

subzero 21-03-2016 20:56:27

Casimiro tienes toda la razón incluire el insert real:

Código SQL [-]
INSERT INTO movimientos_detalles_t(  MOVIMIENTO_ID,
                                BODEGA_ID,
                                SW,
                                ARTICULO_ID,
                                COSTO,
                                PRECIO,
                                CANTIDAD_PEDIDA,
                                UNIDAD_PEDIDA,
                                CANTIDAD,
                                UNIDAD,
                                CONVERSION,
                                PCJ_IVA,
                                PCJ_DTO1,
                                PCJ_DTO2,
                                PCJ_DTO3,
                                PCJ_DTO4,
                                FECHA_VCTO,
                                LOTE_SERIAL,
                                NOTA_DETALLE,
                                USUARIO_ID/*,                                
                                TOTAL_UM,
                                COSTO_SUBTOTAL,
                                COSTO_IVA,
                                COSTO_DTO1,
                                COSTO_DTO2,
                                COSTO_DTO3,
                                COSTO_TOTAL,
                                PRECIO_SUBTOTAL,
                                PRECIO_IVA,
                                PRECIO_DTO1,
                                PRECIO_DTO2,
                                PRECIO_DTO3,
                                PRECIO_TOTAL,
                                 CREACION,
                                MODIFICACION*/
                                )
SELECT  77,
        PD.BODEGA_ID,
            3,
            PD.ARTICULO_ID,
            PD.COSTO,
            PD.PRECIO,
            PD.CANTIDAD,
            PD.UNIDAD,
            0,
            PD.UNIDAD,
            PD.CONVERSION,
            PD.PCJ_IVA,
            PD.PCJ_DTO1,
            PD.PCJ_DTO2,
            PD.PCJ_DTO3,
            PD.PCJ_DTO4,
            PD.FECHA_VCTO,
            PD.LOTE_SERIAL,
            PD.NOTA_DETALLE,
            1/*,           
      PD.TOTAL_UM,
            PD.COSTO_SUBTOTAL,
            PD.COSTO_IVA,
            PD.COSTO_DTO1,
            PD.COSTO_DTO2,
            PD.COSTO_DTO3,
            PD.COSTO_TOTAL,
            PD.PRECIO_SUBTOTAL,
            PD.PRECIO_IVA,
            PD.PRECIO_DTO1,
            PD.PRECIO_DTO2,
            PD.PRECIO_DTO3,
            PD.PRECIO_TOTAL,
            NOW(),
            NOW()*/
    FROM pedidos_detalles PD
    WHERE PD.PEDIDO_ID = 56
    AND PD.ARTICULO_ID = 1

Y si existen datos en la tabla original que referencian a los campos que deben ser calculados pero e intentado también enviándolos y aun así no funcionan, no se que otra información requieres para que me puedas dar una mano si es así coméntame.

AgustinOrtu 21-03-2016 22:17:39

Definitivamente no es mi fuerte, pero primero mejor obviar algunas cosas

Cuando ejecutas la sentencia INSERT con el SELECT incluido, en la tabla movimientos_detalles_t se genera una nuevo registro? Es decir, la insercion es exitosa? O fracasa?

Podrias buscar herramientas de depuracion para MySQL, por ejemlo esta o esta

subzero 22-03-2016 00:34:04

Agustin, gracias por tu aporte estuve revisando pero al parecer le utilidad es solo para procedimiento y funciones y no logré que mostrará algo referente a los datos que deben llegar al trigger.

Casimiro Notevi 22-03-2016 00:35:22

La pregunta es, para empezar, ¿se produce el insert correctamente?

subzero 22-03-2016 01:02:58

El insert se ejecuta de manera correcta, solo como explicaba los datos que van en los campos

Código SQL [-]
TOTAL_UM,
                                COSTO_SUBTOTAL,
                                COSTO_IVA,
                                COSTO_DTO1,
                                COSTO_DTO2,
                                COSTO_DTO3,
                                COSTO_TOTAL,
                                PRECIO_SUBTOTAL,
                                PRECIO_IVA,
                                PRECIO_DTO1,
                                PRECIO_DTO2,
                                PRECIO_DTO3,
                                PRECIO_TOTAL,
                                 CREACION,
                                MODIFICACION

Que son los que se deberían calcularse con el trigger nunca lo hacen a través de la inserción utilizando el select... lo curioso es que cuando lo hago registro por registro con la estructura:

Código SQL [-]
 insert into movimientos_detalles_t(MOVIMIENTO_ID,
                                BODEGA_ID,
                                SW,
                                ARTICULO_ID,
                                COSTO,
                                PRECIO,
                                CANTIDAD_PEDIDA,
                                UNIDAD_PEDIDA,
                                CANTIDAD,
                                UNIDAD,
                                CONVERSION,
                                PCJ_IVA,
                                PCJ_DTO1,
                                PCJ_DTO2,
                                PCJ_DTO3,
                                PCJ_DTO4,
                                FECHA_VCTO,
                                LOTE_SERIAL,
                                NOTA_DETALLE,
                                USUARIO_ID)
VALUES(77,
                                1,
                                3,
                                1,
                                1200,
                                1200,
                                1,
                                'UND',
                                0,
                                'UND',
                                10,
                                0,
                                0,
                                0,
                                0,
                                0,
                                '03/06/2016',
                                '',
                                '',
                                1)

teniendo en cuenta que el trigger se ejecuta en el evento before insert.

Casimiro Notevi 22-03-2016 10:55:31

No conozco mysql, aunque ¿has probado cambiar al evento afterinsert?

ASAPLTDA 22-03-2016 16:22:51

Trigger Verificacion
 
Hola, no conosco mysql pero:
1. Prueba si el trigger se ejecuta : crea una excepcion , si la excepcion se efecuta se que el trigger se ejecuta, ahi voy bien
2. cambia uno de los valores calculados por el trigger colocando una constante por ejemplo 1 nigun otro calculo si lo hace esto bien
3. haga calculo por calculo porque es posible que al calcular se exceda un limite o venga un nulo
saludes

subzero 22-03-2016 18:36:44

Bueno, ya he probado enviando valores fijos... y sigue igual, deshabilite el trigger y funciona definitivamente el problema es con el trigger... Cree un procedimiento almacenado que luego de insertar recorriera y calcular y sigue sin funcionar

Casimiro Notevi 22-03-2016 19:16:16

¿La sintaxis del código del trigger está bien, no da ningún error al compilarlo?. Desconozco cómo es en mysql.

Crea un trigger simple para probar, algo así como:
Código SQL [-]
begin
  set new.costo_iva=12345678;
end;


La franja horaria es GMT +2. Ahora son las 11:42:42.

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