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

Cosulta a multiples tablas por fecha maxima Access

Estas en el tema de Cosulta a multiples tablas por fecha maxima Access en el foro de Bases de Datos General en Foros del Web. Hola, Últimamente he estado trabajando en una consulta que utilizo en un programa, pero no he podido hacer que me funcione correctamente(no me saca ningún ...
  #1 (permalink)  
Antiguo 18/01/2012, 15:24
Avatar de wingsmarcus  
Fecha de Ingreso: julio-2011
Ubicación: en mi casa
Mensajes: 7
Antigüedad: 13 años, 4 meses
Puntos: 0
Exclamación Cosulta a multiples tablas por fecha maxima Access

Hola,

Últimamente he estado trabajando en una consulta que utilizo en un programa, pero no he podido hacer que me funcione correctamente(no me saca ningún registro), quisiera su ayuda es muy urgente.

Aquí les dejo una imagen con las tablas de mi base de datos:



Lo que quiero prácticamente es hacer esta consulta:

SELECT m.codigo AS Codigo, m.nombre AS Nombre, p.proveedor AS Proveedor, u.unidad_medida AS Unidad, m.existencia AS Existencia, e.ingreso AS Ingreso, s.egreso AS Egreso
FROM materia AS m, proveedores AS p, unidades AS u, mov_entrada AS e, mov_salida AS s
WHERE m.id_proveedores = p.id_proveedor and m.id_unidad = u.id_unidad and m.id_materia = e.id_materia and s.id_materia = m.id_materia and e.fecha = 15/01/2012 and s.fecha = 15/01/2012


Pero no se como mostrar la fecha máxima de las tablas mov_entrada y mov_salida. donde las ultimas fechas las ingreso con un DTPicker de visual basic 6.0... en resumen me tendría que salir algo así:

Codigo | Nombre | Proveedor | Unidad | Existencia | Ingreso | Egreso |
5940 chocolate Willy W. onza/s 90 10 20
5940 Glucosa Mercado onza/s 120 80 30

Así sucesivamente, pero las columnas 'ingreso' y 'egreso' deben dar el valor correspondiente a la ultima fecha en que fueron insertadas. es decir en este ejemplo '15/01/2012'.

Todo esto al final se mostrará en un DataGrid de VB6.0
  #2 (permalink)  
Antiguo 23/01/2012, 07:27
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 8 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
  #3 (permalink)  
Antiguo 31/01/2012, 17:45
Avatar de wingsmarcus  
Fecha de Ingreso: julio-2011
Ubicación: en mi casa
Mensajes: 7
Antigüedad: 13 años, 4 meses
Puntos: 0
Respuesta: Cosulta a multiples tablas por fecha maxima Access

Muchas gracias, me ha funcionado la consulta a la perfeccion, te debo una

Etiquetas: 6.0, access, datagrid, sql, vb
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 09:15.