Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-03-2016
subzero subzero is offline
No confirmado
 
Registrado: ene 2004
Ubicación: Móntería - Córdoba - Colombia
Posts: 289
Poder: 0
subzero Va por buen camino
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!

Última edición por Casimiro Notevi fecha: 20-03-2016 a las 22:03:13. Razón: ¡¡¡ Poner etiquetas del código !!!
Responder Con Cita
  #2  
Antiguo 20-03-2016
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.264
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por subzero Ver Mensaje
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.
Responder Con Cita
  #3  
Antiguo 21-03-2016
subzero subzero is offline
No confirmado
 
Registrado: ene 2004
Ubicación: Móntería - Córdoba - Colombia
Posts: 289
Poder: 0
subzero Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 21-03-2016
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.264
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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
Responder Con Cita
  #5  
Antiguo 21-03-2016
subzero subzero is offline
No confirmado
 
Registrado: ene 2004
Ubicación: Móntería - Córdoba - Colombia
Posts: 289
Poder: 0
subzero Va por buen camino
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.
Responder Con Cita
  #6  
Antiguo 21-03-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 16
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
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

Última edición por AgustinOrtu fecha: 21-03-2016 a las 23:22:11.
Responder Con Cita
  #7  
Antiguo 22-03-2016
subzero subzero is offline
No confirmado
 
Registrado: ene 2004
Ubicación: Móntería - Córdoba - Colombia
Posts: 289
Poder: 0
subzero Va por buen camino
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.
Responder Con Cita
  #8  
Antiguo 22-03-2016
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.264
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
La pregunta es, para empezar, ¿se produce el insert correctamente?
Responder Con Cita
  #9  
Antiguo 22-03-2016
subzero subzero is offline
No confirmado
 
Registrado: ene 2004
Ubicación: Móntería - Córdoba - Colombia
Posts: 289
Poder: 0
subzero Va por buen camino
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.
Responder Con Cita
  #10  
Antiguo 22-03-2016
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.264
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
No conozco mysql, aunque ¿has probado cambiar al evento afterinsert?
Responder Con Cita
  #11  
Antiguo 22-03-2016
ASAPLTDA ASAPLTDA is offline
Miembro
 
Registrado: jun 2003
Ubicación: COLOMBIA-CALI
Posts: 639
Poder: 22
ASAPLTDA Va por buen camino
Smile 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
Responder Con Cita
  #12  
Antiguo 22-03-2016
subzero subzero is offline
No confirmado
 
Registrado: ene 2004
Ubicación: Móntería - Córdoba - Colombia
Posts: 289
Poder: 0
subzero Va por buen camino
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
Responder Con Cita
  #13  
Antiguo 22-03-2016
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.264
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿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;
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 Update or insert amerika111 MS SQL Server 0 03-08-2011 22:18:52
problema con trigger after insert auribe Conexión con bases de datos 2 18-05-2011 17:51:16
Se ejecuta el insert al cerrar la aplicacion Dens SQL 5 31-08-2010 03:23:30
No ejecuta Trigger en Firebird Coco Firebird e Interbase 5 09-01-2007 18:43:48
Select no se ejecuta sobre el mimos registro... Alfredo Conexión con bases de datos 2 08-03-2005 15:49:42


La franja horaria es GMT +2. Ahora son las 19:50:01.


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