Ver Mensaje Individual
  #4 (permalink)  
Antiguo 02/08/2012, 04:30
pcid
Usuario no validado
 
Fecha de Ingreso: abril-2008
Mensajes: 50
Antigüedad: 16 años
Puntos: 16
Respuesta: listado segun determinadas fechas

Talvez esta vista te pueda ayudar:

Código SQL:
Ver original
  1. CREATE TABLE  fdw_example4_alumno_altasbajas (  
  2.   DNI VARCHAR(20) NOT NULL,
  3.   FechaEst DATE NOT NULL,
  4.   TipoEstado VARCHAR(10) NOT NULL,
  5.   PRIMARY KEY (DNI, FechaEst)
  6. ) ENGINE=InnoDB  DEFAULT CHARSET=latin1;
  7.  
  8. CREATE TABLE fdw_example4_alumno_pago(
  9.   DNI VARCHAR(20) NOT NULL,
  10.   MesPagado VARCHAR(20) NOT NULL,
  11.   Importe DECIMAL(16,2) NOT NULL,
  12.   FechaPago DATE NOT NULL,
  13.   Comentario VARCHAR(100) NOT NULL,  
  14.   PRIMARY KEY (DNI, MesPagado)
  15. ) ENGINE=InnoDB  DEFAULT CHARSET=latin1;
  16.  
  17.  
  18. CREATE VIEW v_fdw_example4_alumno_altasbajas_aux AS
  19. SELECT a.DNI, a.FechaEst, a.TipoEstado, MIN(b.FechaEst) AS Siguiente
  20.         FROM fdw_example4_alumno_altasbajas a LEFT OUTER JOIN fdw_example4_alumno_altasbajas b ON b.DNI = a.DNI AND b.FechaEst > a.FechaEst
  21.         WHERE a.TipoEstado = 'ALTA'
  22.         GROUP BY a.DNI, a.FechaEst;
  23.  
  24. CREATE VIEW v_fdw_example4_alumno_altasbajas AS
  25. SELECT x.DNI, x.FechaEst, x.TipoEstado,
  26.     CASE isnull(x.Siguiente) WHEN 1 THEN date_format(now(), '%Y-%m-%d') ELSE x.Siguiente END AS FechaSiguiente,
  27.     CASE isnull(x.Siguiente) WHEN 1 THEN 'SIGUE DE ALTA' ELSE y.TipoEstado END AS EstadoSiguiente
  28. FROM v_fdw_example4_alumno_altasbajas_aux x
  29.  LEFT OUTER JOIN fdw_example4_alumno_altasbajas y  ON y.DNI = x.DNI AND y.FechaEst = x.Siguiente;
  30.  
  31.  
  32. INSERT INTO fdw_example4_alumno_altasbajas (DNI, FechaEst, TipoEstado) VALUES
  33. ('12345678Y', '2011-05-02', 'ALTA'),
  34. ('87654321B', '2011-06-01', 'ALTA'),
  35. ('12345678Y', '2011-08-01', 'BAJA'),
  36. ('87654321B', '2011-07-01', 'BAJA'),
  37. ('12345678Y', '2012-05-07', 'ALTA');
  38.  
  39.  
  40. INSERT INTO fdw_example4_alumno_pago (DNI, MesPagado, Importe, FechaPago, Comentario) VALUES
  41. ('12345678Y', 'MAYO11', 999, '2011-05-03', 'PAGO MES MAYO'),
  42. ('12345678Y', 'JUNIO11', 999, '2011-06-05', 'PAGO MES JUNIO'),
  43. ('87654321B', 'JUNIO11', 999, '2011-06-02', 'PAGO MES JUNIO'),
  44. ('12345678Y', 'MAYO12', 999, '2012-05-10', 'PAGO MES MAYO');
  45. commit;
  46.  
  47. SELECT * FROM v_fdw_example4_alumno_altasbajas;

Lo que hace es mostrarte en una "tabla" las altas con su correspondiente baja. Si "sigue de alta", en la columna FechaSiguiente aparecerá la fecha actual y en EstadoSiguiente aparecerá "SIGUE DE ALTA".

Entonces, tu listado de "pendientes de pago" tendrá como filtrarse por los períodos en los que el alumno ha estado de alta con un join a esta vista.

Lo que no veo claro es como sabes que meses son los que deberían ser pagados. Es decir, si la alta es el 30 de Julio, ¿se cobra Julio?; si la baja es el 1/Agosto, ¿Agosto también se paga? ¿y si fuese el 5? ¿Todos los meses existentes entre una fecha de alta y una de baja son cobrables? ¿No tienen vacaciones o todos los alumnos los ponen de baja ese período de tiempo?

Te sugiero que tu tabla de pagos la conviertas en una simple cuenta corriente con registros a favor y en contra del alumno. Una vez cada mes generas todos los cargos que correspondan a los alumnos que están de alta. En caso de que exista un cargo que no es correcto (por ejemplo, que la baja la hace el 5 de Agosto y se genero cargo el día 1 y la entidad para la que trabajas no quiere cobrarle Agosto a ese alumno), el sistema puede dar la opción a aplicar un "abono" a favor del alumno.

Para automatizar el proceso de generación de cargos, lo puedes poner en una tarea en el servidor que se ejecute una vez al mes y listo. O bien, condenas a la secretaria a hacer click en un botón cada mes. ;)