Ver Mensaje Individual
  #8 (permalink)  
Antiguo 13/11/2009, 08:27
Avatar de gnzsoloyo
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, 5 meses
Puntos: 2658
Respuesta: Trigger para controlar edad

Un store procedure que realice la inserción si y sólo si la edad supera la mínima, es relativamente sencillo; y si además se quiere un mensaje de salida, también.
Un modelo esquemático sería:
Código sql:
Ver original
  1. DELIMITER $$
  2. DROP PROCEDURE IF EXISTS `IngresarPersona` $$
  3. CREATE PROCEDURE `IngresarPersona` (
  4.   IN VNOMBRE VARCHAR(50),
  5.   IN VAPELLIDO VARCHAR(50),
  6.   IN VFECHA_NAC DATE,
  7.   OUT RESPONSE VARCHAR(50))
  8. BEGIN
  9.  
  10.   IF TIMESTAMPDIFF(YEAR, FECHA_NAC, DATE(NOW()))<18 THEN
  11.     SET RESPONSE = 'EDAD MENOR A LA MINIMA';
  12.   ELSE
  13.     INSERT INTO PERSONA(NOMBRE, APELLIDO, FECHA_NAC)
  14.       VALUES(VNOMBRE, VAPELLIDO, VFECHA_NAC);
  15.     SET RESPONSE = 'OK';
  16.   END IF;
  17.  
  18. END $$
  19.  
  20. DELIMITER ;
En la aplicación (dependiendo del lenguaje), se debe recuperar el parámetro de salida o bien, poner como sentencia final un select, para de esa forma recueprar el valor en la misma ejecución:
Código SQL:
Ver original
  1. DELIMITER $$
  2. DROP PROCEDURE IF EXISTS `IngresarPersona` $$
  3. CREATE PROCEDURE `IngresarPersona` (
  4.   IN VNOMBRE VARCHAR(50),
  5.   IN VAPELLIDO VARCHAR(50),
  6.   IN VFECHA_NAC DATE)
  7. BEGIN
  8.   DECLARE RESPONSE VARCHAR(50);
  9.   IF TIMESTAMPDIFF(YEAR, FECHA_NAC, DATE(NOW()))<18 THEN
  10.     SET RESPONSE = 'EDAD MENOR A LA MINIMA';
  11.   ELSE
  12.     INSERT INTO PERSONA(NOMBRE, APELLIDO, FECHA_NAC)
  13.       VALUES(VNOMBRE, VAPELLIDO, VFECHA_NAC);
  14.     SET RESPONSE = 'OK';
  15.   END IF;
  16.   SELECT RESPONSE;
  17. END $$
La función TIMESTAMPDIFF es muy eficiente para esto, ya que no tenemos que corroborar nada, solamente indicarle cuál unidad usaremos (YEAR en este caso), y sólo cuando supere valores enteros de un año, sumará uno. Hay que recordar que TIMESTAMPDIFF trabaja con valore DAATETIME, por lo que para evitar problemas de interpretación es conveiente convertir a DATE los valores usados, ya que de esa forma las fechas se recortan a la hora 00:00:00.
Mira esto:
Código SQL:
Ver original
  1. mysql> SELECT
  2.     ->   TIMESTAMPDIFF(YEAR, '2009-11-11', '2010-11-11') FECHA_1,
  3.     ->   TIMESTAMPDIFF(YEAR, '2009-11-11 10:00:00', '2010-11-11 09:59:59') FECHA_2,
  4.     ->   TIMESTAMPDIFF(YEAR, '2009-11-11 10:00:00', '2010-11-11 10:00:01') FECHA_3;
  5. +---------+---------+---------+
  6. | FECHA_1 | FECHA_2 | FECHA_3 |
  7. +---------+---------+---------+
  8. |       1 |       0 |       1 |
  9. +---------+---------+---------+
  10. 1 ROW IN SET (0.00 sec)
  11.  
  12. mysql>
__________________
¿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; 13/11/2009 a las 08:36