Trigger con campo dinámico

Trigger con campo dinámico

Postby leandro » Thu Oct 29, 2020 2:31 pm

Hola buenos días para todos,

Como dice el encabezado, en este momento me surge la necesidad de actualizar datos desde un TRIGGER pero usando un nombre del campo dinámico, Me explico

Tengo una tabla con los siguientes campos:
Tabla pedidos

Code: Select all  Expand view  RUN

id_pedido INT auto_increment
id_cliente INT
fecha_pedido DATE
id_ciudad INT
 


y otra tabla en donde se van sumando los pedidos del mes
Tabla resumen_pedidos_mes

Code: Select all  Expand view  RUN

consecutivo INT auto_increment
id_cliente INT
mes1 INT
mes2 INT
mes3 INT
mes4 INT
.....
mes12 INT
 


Necesito crear un TRIGGER que al momento de insertar un registro en la tabla de resumen pedidos me sume 1 en el campo del mes correspondiente de la tabla resumen_pedidos_mes.
Lo que quiere decir que si agrego un pedido que tenga la fecha '2020-10-01' se debe sumar +1 en el mes Octubre de tabla de resumen_pedidos_mes.

Lo intento de la siguiente manera pero hasta ahora sin éxito

Code: Select all  Expand view  RUN

delimiter //
CREATE TRIGGER suma_pedido AFTER INSERT ON pedidos
    FOR EACH ROW
    BEGIN
      DECLARE mesdb CHAR(5);
      SELECT CONCAT("mes",month(NEW.fecha_pedido)) INTO mesdb;
 
      UPDATE resumen_pedidos_mes SET mesdb=mesdb+1 WHERE id_cliente=NEW.id_cliente
 
      END IF;
    END;//
delimiter;
 


Me devuelve error de sintaxis
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1676
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: Trigger con campo dinámico

Postby cmsoft » Mon Nov 02, 2020 1:47 pm

Hola Leandro:
Una forma sencilla sería con un IF (En este caso porque tus casos estan acotados a 12)
Code: Select all  Expand view  RUN

DELIMITER //
CREATE TRIGGER suma_pedido AFTER INSERT ON pedidos
    FOR EACH ROW
    BEGIN
      IF MONTH(NEW.fecha_pedido) = 1 THEN      
    UPDATE resumen_pedidos_mes SET mes1=mes1+1 WHERE id_cliente=NEW.id_cliente
      END IF;
      IF MONTH(NEW.fecha_pedido) = 2 THEN      
    UPDATE resumen_pedidos_mes SET mes2=mes2+1 WHERE id_cliente=NEW.id_cliente
      END IF;
      IF MONTH(NEW.fecha_pedido) = 3 THEN      
    UPDATE resumen_pedidos_mes SET mes3=mes3+1 WHERE id_cliente=NEW.id_cliente
      END IF;
      ....
    END;//
DELIMITER;
 
User avatar
cmsoft
 
Posts: 1293
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina

Re: Trigger con campo dinámico

Postby leandro » Tue Nov 03, 2020 11:24 am

Cesar, gracias por responder

En algún momento lo pensé de esa manera, el problema es que en ese caso me queda muchísimo mas fácil, hacer un script en fw que se encargue de hacer lo que quiero.

Lo que pasa es que me gusta la idea que la base de datos se encargue de esa actualización de información, para de esta manera evitarme el cruce de saldos.

De nuevo gracias,
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1676
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: Trigger con campo dinámico

Postby artu01 » Wed Nov 11, 2020 1:36 am

leandro wrote:
Code: Select all  Expand view  RUN

delimiter //
CREATE TRIGGER suma_pedido AFTER INSERT ON pedidos
    FOR EACH ROW
    BEGIN
      DECLARE mesdb CHAR(5);
      SELECT CONCAT("mes",month(NEW.fecha_pedido)) INTO mesdb;
 
      UPDATE resumen_pedidos_mes SET mesdb=mesdb+1 WHERE id_cliente=NEW.id_cliente
 
      END IF;
    END;//
delimiter;
 


Me devuelve error de sintaxis

Leandro no lo he probado pero quizas resulte
Code: Select all  Expand view  RUN

delimiter //
CREATE TRIGGER suma_pedido AFTER INSERT ON pedidos
    FOR EACH ROW
    BEGIN
      DECLARE mesdb CHAR(5);
      SET @mesdb = CONCAT("mes",month(NEW.fecha_pedido)) ;
 
      UPDATE resumen_pedidos_mes SET @mesdb=@mesdb+1 WHERE id_cliente=NEW.id_cliente
    END;
delimiter;
 
fwh 17.12, harbour 3.2.0, pelles C, bcc7, Ms-Sql
artu01
 
Posts: 400
Joined: Fri May 11, 2007 8:20 pm
Location: Lima

Re: Trigger con campo dinámico

Postby leandro » Mon Nov 16, 2020 2:16 pm

Artu, gracias por responder

Revise lo que me enviaste, pero me devuelve error de sintaxis

Code: Select all  Expand view  RUN

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '@mesdb=@mesdb+1 WHERE articulo=NEW.mm_articu
    END;
delimiter'
at line 7
 
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1676
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: Trigger con campo dinámico

Postby artu01 » Mon Nov 16, 2020 5:39 pm

Leandro que usas MySql o Ms sql ?
Esta sintaxis es para ms sql
leandro wrote:Artu, gracias por responder

Revise lo que me enviaste, pero me devuelve error de sintaxis

Code: Select all  Expand view  RUN

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '@mesdb=@mesdb+1 WHERE articulo=NEW.mm_articu
    END;
delimiter'
at line 7
 
fwh 17.12, harbour 3.2.0, pelles C, bcc7, Ms-Sql
artu01
 
Posts: 400
Joined: Fri May 11, 2007 8:20 pm
Location: Lima

Re: Trigger con campo dinámico

Postby leandro » Mon Nov 16, 2020 6:48 pm

Muchísimas gracias por responder, uso mysql.
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1676
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 67 guests