Ver Mensaje Individual
  #2 (permalink)  
Antiguo 23/01/2012, 07:27
quimfv
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 2 meses
Puntos: 574
Respuesta: Cosulta a multiples tablas por fecha maxima Access

Código SQL:
Ver original
  1. SELECT m.codigo AS Codigo,
  2.              m.nombre AS Nombre,
  3.              p.proveedor AS Proveedor,
  4.              u.unidad_medida AS Unidad,
  5.              MAX(e.fecha) AS MaxEntrada,
  6.              MAX(s.fecha) AS MaxSalida,
  7.              SUM(e.ingreso) AS TotalIngreso,
  8.              SUM(s.egreso) AS TotalEgreso,
  9.              m.existencia AS Existencia
  10. FROM (((materia AS m INNER JOIN proveedores AS p
  11.                  ON m.id_proveedores = p.id_proveedor)
  12.             INNER JOIN unidades AS u ON m.id_unidad = u.id_unidad)
  13.             INNER JOIN mov_entrada ON m.id_materia = me.id_materia)
  14.             INNER JOIN mov_salida AS s ON s.id_materia = m.id_materia
  15. GROUP BY m.codigo,
  16.              m.nombre,
  17.              p.proveedor,
  18.              u.unidad_medida,
  19.              m.existencia;

Esto te da la suma de lo ingresado, la suma de egresado, y la ultima fecha de ingreso y egreso para cada materia, proveedor y unidad de medida...

Era esto?

En mi opinion tienes un error de diseño, puesto que existencia deberia ser el resultado de SUM(e.ingreso)-SUM(s.egreso) AS Existencia y eliminar ese campo de la tabla materias....

Código SQL:
Ver original
  1. SELECT m.codigo AS Codigo,
  2.              m.nombre AS Nombre,
  3.              p.proveedor AS Proveedor,
  4.              u.unidad_medida AS Unidad,
  5.              m.existencia AS Existencia,
  6.              MAX(e.fecha) AS MaxEntrada,
  7.              MAX(s.fecha) AS MaxSalida,
  8.              SUM(e.ingreso) AS TotalIngreso,
  9.              SUM(s.egreso) AS TotalEgreso,
  10.              SUM(e.ingreso) - SUM(s.egreso) AS Existencia
  11. FROM (((materia AS m INNER JOIN proveedores AS p
  12.                  ON m.id_proveedores = p.id_proveedor)
  13.             INNER JOIN unidades AS u ON m.id_unidad = u.id_unidad)
  14.             INNER JOIN mov_entrada AS e  ON m.id_materia = e.id_materia)
  15.             INNER JOIN mov_salida AS s ON s.id_materia = m.id_materia
  16. GROUP BY m.codigo,
  17.              m.nombre,
  18.              p.proveedor,
  19.              u.unidad_medida,
  20.              m.existencia;


Ultima entrada de cada materia
Código SQL:
Ver original
  1. SELECT * FROM mov_entrada AS e1
  2. INNER JOIN (SELECT e2.id_materia, MAX(e2.fecha) AS MAXEntrada FROM mov_entrada AS e2 GROUP BY e2.id_materia)
  3. ON e1.id_materia=e2.id_materia AND e1.fecha=e2.MaxEntrada;

idem salidas
Código SQL:
Ver original
  1. SELECT * FROM mov_salida AS s1
  2. INNER JOIN (SELECT s2.id_materia, MAX(s2.fecha) AS MAXSalida FROM mov_salida AS s2 GROUP BY s2.id_materia)
  3. ON s1.id_materia=s2.id_materia AND s1.fecha=s2.MaxSalida;

luego

Código SQL:
Ver original
  1. SELECT m.codigo AS Codigo,
  2.              m.nombre AS Nombre,
  3.              p.proveedor AS Proveedor,
  4.              u.unidad_medida AS Unidad,
  5.              m.existencia AS Existencia,
  6.              e.ingreso AS Ingreso,
  7.              s.egreso AS Egreso
  8. FROM (((materia AS m INNER JOIN proveedores AS p
  9.                  ON m.id_proveedores = p.id_proveedor)
  10.             INNER JOIN unidades AS u
  11.                         ON m.id_unidad = u.id_unidad)
  12.             INNER JOIN (SELECT * FROM mov_entrada AS e1
  13.                                     INNER JOIN (SELECT e2.id_materia, MAX(e2.fecha) AS MAXEntrada
  14.                                                FROM mov_entrada AS e2 GROUP BY e2.id_materia)
  15.                                        ON e1.id_materia=e2.id_materia AND e1.fecha=e2.MaxEntrada) AS e  
  16.                         ON m.id_materia = e.id_materia)
  17.             INNER JOIN (SELECT * FROM mov_salida AS s1
  18.                                     INNER JOIN (SELECT s2.id_materia, MAX(s2.fecha) AS MAXSalida
  19.                                                FROM mov_salida AS s2 GROUP BY s2.id_materia)
  20.                                         ON s1.id_materia=s2.id_materia AND s1.fecha=s2.MaxSalida) AS s
  21.                         ON s.id_materia = m.id_materia;

ahora ... creo...

Pero insisto el campo existencia te taerá problemas, es un error que incumple las leyes basicas de normalizacion de una base de datos.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 23/01/2012 a las 08:09