Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

[SOLUCIONADO] Duda/consulta triggers

Estas en el tema de Duda/consulta triggers en el foro de Mysql en Foros del Web. Hola, me estoy complicando un poco trabajando con triggers, necesito saber como puedo comparar un valor de tipo date con la fecha actual dentro de ...
  #1 (permalink)  
Antiguo 06/02/2015, 08:50
 
Fecha de Ingreso: enero-2015
Ubicación: Valparaiso
Mensajes: 88
Antigüedad: 9 años, 3 meses
Puntos: 0
Duda/consulta triggers

Hola, me estoy complicando un poco trabajando con triggers, necesito saber como puedo comparar un valor de tipo date con la fecha actual dentro de un "IF". Después de modificar el trigger un poco logre que phpmyadmin lo aceptara pero ahora no puedo agregar datos a la tabla "cuenta", creo que el problema esta en la comparación del if.

Código MySQL:
Ver original
  1.     IF NEW.fecha <= date_format(curdate(),'%Y%m%d') THEN
  2.         UPDATE cuenta SET
  3.             `saldo_manana_caja`= saldos.saldo_manana_caja + (NEW.ingreso_caja - NEW.egreso_caja),
  4.             `saldo_manana_bci`= saldos.saldo_manana_bci + (NEW.ingreso_bci - NEW.egreso_bci),
  5.             `saldo_manana_chi`= saldos.saldo_manana_chi + (NEW.ingreso_chile - NEW.egreso_chile),
  6.             `saldo_manana_sta1`= saldos.saldo_manana_sta1 + (NEW.ingreso_santa_uno - NEW.egreso_santa_uno),
  7.             `saldo_manana_sta2`= saldos.saldo_manana_sta2 + (NEW.ingreso_santa_dos - NEW.egreso_santa_dos),
  8.             `saldo_manana_prove`= saldos.saldo_manana_prove + (NEW.ingreso_prove - NEW.egreso_prove),
  9.             `saldo_manana_cliente`= saldos.saldo_manana_cliente + (NEW.ingreso_clte - NEW.egreso_clte),
  10.             `saldo_manana_acre`= saldos.saldo_manana_acre + (NEW.ingreso_acre - NEW.egreso_acre),
  11.             `saldo_manana_deud`= saldos.saldo_manana_deud + (NEW.ingreso_deud - NEW.egreso_deud),
  12.             `saldo_manana_edo`= saldos.saldo_manana_edo + (NEW.ingreso_eduardo - NEW.egreso_eduardo),
  13.             `saldo_manana_edu`= saldos.saldo_manana_edu + (NEW.ingreso_eduar - NEW.egreso_eduar),
  14.             `caja_bancos`= saldos.saldo_manana_caja + saldos.saldo_manana_bci + saldos.saldo_manana_chi + saldos.saldo_manana_sta1 + saldos.saldo_manana_sta2,
  15.             `saldo_general`= saldos.caja_bancos + saldos.saldo_manana_acre + saldos.saldo_manana_deud
  16.         WHERE saldos.codigo = NEW.saldos_codigo
  17.     END IF;
  #2 (permalink)  
Antiguo 06/02/2015, 09:42
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Duda/consulta triggers

Si el campo "fecha" de la tabla del trigger es un DATE, ¿para qué usas DATE_FORMAT()?
Y si no es undate, entonces tienes datos basura...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 06/02/2015, 12:04
 
Fecha de Ingreso: enero-2015
Ubicación: Valparaiso
Mensajes: 88
Antigüedad: 9 años, 3 meses
Puntos: 0
Respuesta: Duda/consulta triggers

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Si el campo "fecha" de la tabla del trigger es un DATE, ¿para qué usas DATE_FORMAT()?
Y si no es undate, entonces tienes datos basura...
El date_format se lo estoy dando a la curdate() que segun entiendo viene con horas, minutos y segundos incluidos, no al valor NEW.fecha.
Ademas si es que hago ese cambio, el error aun se presenta:
#1054 - Champ 'saldos.codigo' inconnu dans where clause
Este atributo es la clave primaria de saldos.

PD: no es un Update, es un Insert
  #4 (permalink)  
Antiguo 06/02/2015, 12:09
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Duda/consulta triggers

POr un lado, no, CURDATE() sólo devuelve una fecha, no las horas. El que devuelve todo el DATETIME es NOW().

Cita:
#1054 - Champ 'saldos.codigo' inconnu dans where clause
Eso es otra cosa que no está relacionada con la fecha: Esa tabla no tiene ningún campo denominado "codigo", por lo que o es incorrecto, o no pertenece a la tabla indicada.
En realidad el problema es que estás indicando la tabla SALDOS, pero el UPDATE es para la tabla CUENTA...

¿Lo ves?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 06/02/2015, 12:16
 
Fecha de Ingreso: enero-2015
Ubicación: Valparaiso
Mensajes: 88
Antigüedad: 9 años, 3 meses
Puntos: 0
Respuesta: Duda/consulta triggers

Cita:
Iniciado por gnzsoloyo Ver Mensaje
POr un lado, no, CURDATE() sólo devuelve una fecha, no las horas. El que devuelve todo el DATETIME es NOW().


Eso es otra cosa que no está relacionada con la fecha: Esa tabla no tiene ningún campo denominado "codigo", por lo que o es incorrecto, o no pertenece a la tabla indicada.
En realidad el problema es que estás indicando la tabla SALDOS, pero el UPDATE es para la tabla CUENTA...

¿Lo ves?
si, si entiendo pero si borro el trigger extrañamente no me sale ese error, ademas el trigger esta hecho para cuando se agreguen datos a "cuenta" se actualicen los valores de "saldos"

  #6 (permalink)  
Antiguo 06/02/2015, 12:18
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Duda/consulta triggers

Creo que no me estás entendiendo...
Mira:
Código MySQL:
Ver original
  1. UPDATE cuenta SET
  2.             ...
  3. WHERE saldos.codigo = NEW.saldos_codigo
¿Ves la última línea?
El WHERE debe aplicar sobre la tabla CUENTA. No sobre SALDOS.
Lo que debe existir es una cuenta cuyo ID se corresponda con alguno de los campos que entran como NEW. DE lo contrario, ¿a que cuenta le haces el UPDATE? ¿Cómo la relacionas con la tabla que posee el trigger?

¿Se entiende mejor?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 06/02/2015, 12:21
 
Fecha de Ingreso: enero-2015
Ubicación: Valparaiso
Mensajes: 88
Antigüedad: 9 años, 3 meses
Puntos: 0
Respuesta: Duda/consulta triggers

acabo de probar y solo sale ese error cuando cumple la condición del "IF" del trigger, si no entra a la condición no hay ningún error
  #8 (permalink)  
Antiguo 06/02/2015, 12:33
 
Fecha de Ingreso: enero-2015
Ubicación: Valparaiso
Mensajes: 88
Antigüedad: 9 años, 3 meses
Puntos: 0
Respuesta: Duda/consulta triggers

Fue un fail gigante mio, el update iba a la tabla "saldos", no a "cuenta" ademas algunas variables estaban mal escritas, disculpa por las molestias pero es mi primer proyecto real de informática y me tiene bastante estresado.

Codigo Correcto:
Código MySQL:
Ver original
  1. CREATE TRIGGER `actualizarSaldo` AFTER INSERT ON `cuenta`
  2.  FOR EACH ROW IF NEW.fecha <= date_format(curdate(),'%Y%m%d') THEN
  3.         UPDATE saldos SET
  4.             `saldo_manana_caja`= saldos.saldo_manana_caja + (NEW.ingreso_caja - NEW.egreso_caja),
  5.             `saldo_manana_bci`= saldos.saldo_manana_bci + (NEW.ingreso_bci - NEW.egreso_bci),
  6.             `saldo_manana_chi`= saldos.saldo_manana_chi + (NEW.ingreso_chile - NEW.egreso_chile),
  7.             `saldo_manana_sta1`= saldos.saldo_manana_sta1 + (NEW.ingreso_santa_uno - NEW.egreso_santa_uno),
  8.             `saldo_manana_sta2`= saldos.saldo_manana_sta2 + (NEW.ingreso_santa_dos - NEW.egreso_santa_dos),
  9.             `saldo_manana_prove`= saldos.saldo_manana_prove + (NEW.ingreso_prove - NEW.egreso_prove),
  10.             `saldo_manana_clte`= saldos.saldo_manana_clte + (NEW.ingreso_cliente - NEW.egreso_cliente),
  11.             `saldo_manana_acre`= saldos.saldo_manana_acre + (NEW.ingreso_acre - NEW.egreso_acre),
  12.             `saldo_manana_deud`= saldos.saldo_manana_deud + (NEW.ingreso_deud - NEW.egreso_deud),
  13.             `saldo_manana_edo`= saldos.saldo_manana_edo + (NEW.ingreso_eduardo - NEW.egreso_eduardo),
  14.             `saldo_manana_edu`= saldos.saldo_manana_edu + (NEW.ingreso_eduar - NEW.egreso_eduar),
  15.             `caja_bancos`= saldos.saldo_manana_caja + saldos.saldo_manana_bci + saldos.saldo_manana_chi + saldos.saldo_manana_sta1 + saldos.saldo_manana_sta2,
  16.             `saldo_general`= saldos.caja_bancos + saldos.saldo_manana_acre + saldos.saldo_manana_deud
  17.         WHERE saldos.codigo = NEW.saldos_codigo;
  18.     END IF
  #9 (permalink)  
Antiguo 06/02/2015, 12:38
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Duda/consulta triggers

Insisto en que le quites esto:
Código MySQL:
Ver original
  1. NEW.fecha <= date_format(curdate(),'%Y%m%d') THEN
Si el campo "fecha" de SALDOS es un DATE o DATETIME, debería ser así:

Código SQL:
Ver original
  1. IF DATE(NEW.fecha) <= CURDATE() THEN
No es buena práctica realizar conversiones de datos innecesarias, y en ese caso lo estás obligando a MySQL a realizar una doble conversión, primero a caracteres (DATE_FORMAT()), y luego a DATE, por comparar la cadena de texto contra una fecha.
No lo hagas. Reduce performance.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 06/02/2015 a las 12:46
  #10 (permalink)  
Antiguo 06/02/2015, 12:43
 
Fecha de Ingreso: enero-2015
Ubicación: Valparaiso
Mensajes: 88
Antigüedad: 9 años, 3 meses
Puntos: 0
Respuesta: Duda/consulta triggers

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Insisto en que le quites esto:
Código MySQL:
Ver original
  1. NEW.fecha <= date_format(curdate(),'%Y%m%d') THEN
Si el campo "fecha" de SALDOS es un DATE o ATETIME, debería ser así:

Código SQL:
Ver original
  1. IF DATE(NEW.fecha) <= CURDATE() THEN
No es buena práctica realizar conversiones de datos innecesarias, y en ese caso lo estás obligando a MySQL a realizar una doble conversión, primero a caracteres (DATE_FORMAT()), y luego a DATE, por comparar la cadena de texto contra una fecha.
No lo hagas. Reduce performance.
dicho y hecho, muchas gracias por la ayuda
  #11 (permalink)  
Antiguo 06/02/2015, 12:46
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Duda/consulta triggers

__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: fecha, php, tabla, update
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:10.