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

Consulta de movimientos secuenciales

Estas en el tema de Consulta de movimientos secuenciales en el foro de Mysql en Foros del Web. Estimados foristas: Necesito vuestra ayuda con este tema. Tengo una tabla que registra movimientos de entrada (01) y salida (02) de articulos, un movimiento a ...

  #1 (permalink)  
Antiguo 27/08/2009, 08:31
Avatar de nonpublic  
Fecha de Ingreso: agosto-2009
Mensajes: 240
Antigüedad: 15 años, 3 meses
Puntos: 4
Pregunta Consulta de movimientos secuenciales

Estimados foristas:
Necesito vuestra ayuda con este tema.
Tengo una tabla que registra movimientos de entrada (01) y salida (02) de articulos,
un movimiento a la vez de manera secuencial.
Estos movimientos tienen un quiebre por dia. No puede darse una salida sin una entrada
y puede que un movimiento solo tenga entrada o solo salida durante el dia.
Código:
Movimientos
-------------------------------------------
cArt | tMov  | Fec        |  Hora
-------------------------------------------
01   | 01    |25/05/2005  | 10:05
02   | 01    |25/05/2005  | 10:30
01   | 02    |25/05/2005  | 10:35
03   | 01    |25/05/2005  | 10:45
02   | 02    |25/05/2005  | 10:50
03   | 02    |25/05/2005  | 11:15
01   | 01    |25/05/2005  | 11:25
y necesito llegar a esto:
Código:
Movimientos x Articulo
------------------------------------------------------
Articulo | Fecha      | Hora Ent     |Hora Sal
------------------------------------------------------
01       |25/05/2005  | 10:05        | 10:35
01       |25/05/2005  | 11:25        | --:--
02       |25/05/2005  | 10:30        | 10:50
03       |25/05/2005  | 10:45        | 11:15
Probre con esto y no me resulta
Cita:
SELECT a.cArt AS "Articulo", a.fec AS "Fecha", a.hora AS "Hora Ent", b.hora AS "Hora Sal"
FROM (
SELECT *
FROM movimientos
WHERE tipo =1
) AS a, (
SELECT *
FROM movimientos
WHERE tipo =2
) AS b
Agradezco vuestra ayuda y atencion.

Última edición por nonpublic; 27/08/2009 a las 11:40
  #2 (permalink)  
Antiguo 27/08/2009, 09:04
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: Consulta de movimientos secuenciales

Prueba esto:

Código sql:
Ver original
  1. SELECT t1.articulo articulo,t1.fecha,t1.hora_entrada hora_entrada,
  2. IF(t1.hora_entrada < t2.hora_salida,t2.hora_salida,'--:--') hora_salida
  3. FROM (SELECT cart articulo,fec fecha,hora hora_entrada FROM movimientos WHERE tmov=01)t1
  4. LEFT JOIN
  5. (SELECT cart articulo,fec fecha,hora hora_salida FROM movimientos WHERE tmov=02)t2
  6. ON t1.articulo=t2.articulo ORDER BY t1.articulo;

Parece funcionar
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 27/08/2009, 09:37
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 7 meses
Puntos: 300
Respuesta: Consulta de movimientos secuenciales

Yo sólo veo un problema, el caso en que la hora de entrada y de salida se den en dias distintos. Imagina que la entrada se produce el 2005/01/01 a las 23:45:00, y la salida el 2005/01/02 a las 00:15:00. No sé si se te dará el caso. Si se diera el caso, puedes utilizar algo parecido a esto, hecho siguiendo la sintaxis empleada por huesos52:
Código sql:
Ver original
  1. SELECT t1.articulo articulo,t1.fech_entrada fecha_entrada,t1.hora_entrada hora_entrada,
  2.  IFNULL(t2.fech_salida,'----/--/--') fecha_salida,
  3.  IFNULL(t2.hora_salida,'--:--:--') hora_salida
  4.  FROM (SELECT cart articulo,fec fech_entrada,hora hora_entrada FROM movimientos WHERE tmov=01)t1
  5.  LEFT JOIN(SELECT cart articulo,fec fech_salida,hora hora_salida FROM movimientos WHERE tmov=02)t2
  6.  ON t1.articulo=t2.articulo ORDER BY t1.articulo
  #4 (permalink)  
Antiguo 27/08/2009, 09:46
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: Consulta de movimientos secuenciales

Yo acabo de ver otro, ya que una entrada debe estar asociada a la salida mas cercana para tratar de hacer pares de datos. Solo si hay imparidad,que muestre los espacios.


non-public... es posible tener muchas entradas y 0 o 1 salida?

Sigo buscando.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #5 (permalink)  
Antiguo 27/08/2009, 10:00
Avatar de nonpublic  
Fecha de Ingreso: agosto-2009
Mensajes: 240
Antigüedad: 15 años, 3 meses
Puntos: 4
Respuesta: Consulta de movimientos secuenciales

Gracias por contestar. Probando la sentencia de huesos con la data ingresada todo ok, sinembargo al adicionar data de otros dias no muestra lo requerido.
P.Ej.
Cita:
Movimientos
-------------------------------------------
cArt | tMov | Fec | Hora
-------------------------------------------
01 | 01 | 2009-08-26 | 10:05:00
02 | 01 | 2009-08-26 | 10:30:00
01 | 02 | 2009-08-26 | 10:35:00
03 | 01 | 2009-08-26 | 10:45:00
02 | 02 | 2009-08-26 | 10:50:00
03 | 02 | 2009-08-26 | 11:15:00
01 | 01 | 2009-08-26 | 11:25:00
01 | 02 | 2009-08-27 | 09:05:00
02 | 01 | 2009-08-27 | 09:10:00
La salida es :
Cita:
------------------------------------------------------
Articulo | Fecha | Hora Ent |Hora Sal
------------------------------------------------------
01 |2009-08-26 | 10:05:00 | 10:35:00
01 |2009-08-26 | 10:05:00 |--:--
01 |2009-08-26 | 11:25:00 |--:--
01 |2009-08-26 | 11:25:00 |--:--
02 |2009-08-26 | 10:30:00 |10:50:00
02 |2009-08-27 | 09:10:00 |10:50:00
03 |2009-08-26 | 10:45:00 |11:15:00
Cita:
es posible tener muchas entradas y 0 o 1 salida?
Si, durante el dia se realizan n movimientos, entran y salen , pueden entrar un dia y salir otro. P.Ej. si se requiere el movimiento de aqrticulos entre 2 fechas el quiebre seria Fecha, cArticulo.

jurena, voy a probar tu consulta.
  #6 (permalink)  
Antiguo 27/08/2009, 10:26
Avatar de nonpublic  
Fecha de Ingreso: agosto-2009
Mensajes: 240
Antigüedad: 15 años, 3 meses
Puntos: 4
Respuesta: Consulta de movimientos secuenciales

Probe la consulta de jurena y este es el resultado:

Cita:
----------------------------------------------------
articulo | fecha_entrada | hora_entrada | fecha_salida | hora_salida
----------------------------------------------------
01 | 2009-08-26 | 10:05:00 | 2009-08-26 | 10:35:00
01 | 2009-08-26 | 11:25:00 | 2009-08-26 | 10:35:00
01 | 2009-08-26 | 10:05:00 | 2009-08-27 | 09:05:00
01 | 2009-08-26 | 11:25:00 | 2009-08-27 | 09:05:00
02 | 2009-08-26 | 10:30:00 | 2009-08-26 | 10:50:00
02 | 2009-08-27 | 09:10:00 | 2009-08-26 | 10:50:00
03 | 2009-08-26 | 10:45:00 | 2009-08-26 | 11:15:00
La idea es mostrar el resultado algo asi:

Cita:
------------------------------------------
articulo | fecha | hora_entrada | hora_salida
------------------------------------------
01 | 2009-08-26 | 10:05:00 | 10:35:00
01 | 2009-08-26 | 11:25:00 | --:--:--
01 | 2009-08-27 | --:--:-- | 09:05:00
01 | 2009-08-27 | 11:25:00 | --:--:--
02 | 2009-08-26 | 10:30:00 | 10:50:00
02 | 2009-08-27 | 09:10:00 | 10:50:00
03 | 2009-08-26 | 10:45:00 | 11:15:00
y en el caso que el quiebre sea por dia seria algo asi:

Cita:
------------------------------------------
| fecha | Articulo | hora_entrada | hora_salida
------------------------------------------
| 2009-08-26 | 01 | 10:05:00 | 10:35:00
| 2009-08-26 | 01 | 11:25:00 | --:--:--
| 2009-08-26 | 02 | 10:30:00 | 10:50:00
| 2009-08-26 | 03 | 10:45:00 | 11:15:00
| 2009-08-27 | 01 | --:--:-- | 09:05:00
| 2009-08-27 | 01 | 11:25:00 | --:--:--
| 2009-08-27 | 02 | 09:10:00 | 10:50:00
  #7 (permalink)  
Antiguo 27/08/2009, 10:51
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: Consulta de movimientos secuenciales

Aunque es un buen reto, yo te recomendaría replantear tu modelo de datos y hacer uso de otra tabla u otro campo que le de un poco de orden y sentido a lo que buscas hacer.

La consulta, ademas de compleja sería demasiado engorrosa y poco eficiente

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #8 (permalink)  
Antiguo 27/08/2009, 10:54
Avatar de nonpublic  
Fecha de Ingreso: agosto-2009
Mensajes: 240
Antigüedad: 15 años, 3 meses
Puntos: 4
Respuesta: Consulta de movimientos secuenciales

Acepto sugerencias. Cual seria la manera mas practica y simple de realizar esto sin caer en redundancia de datos? Evitando logicamente el manejo mediante el codigo fuente de la aplicacion.
  #9 (permalink)  
Antiguo 27/08/2009, 10:54
 
Fecha de Ingreso: julio-2009
Ubicación: .mysql_error ( XD )
Mensajes: 554
Antigüedad: 15 años, 4 meses
Puntos: 13
Respuesta: Consulta de movimientos secuenciales

puede que esto sueno tonto, pero yo tengo un sistema muy parecido al tuyo, es uno que hicimos por un proyecto para el control de horario de entradas y salidas de profesores en donde yo estudiaba (aunque otros compañeros fueron los que ganaron XD)

acá una imagen del como presentaba los datos
(no hay datos, porque no tengo la BD acá, estoy en el trabajo)
los campos Entrada Contrato es la hora a la que debe llegar el profesor
y Entrada Registro la hora a la que realmente llego...
con salida es lo mismo

pero es básicamente eso
lo que digo que podria ser tonto es que yo levantaba todos esos datos desde una base de datos, porque ya estaba todo con previo registro. esto es solo un informe!

por lo cual lo unico que hacia era:

Código php:
Ver original
  1. $sqlbusca = "SELECT * FROM informe WHERE dia='$dia' and rut='$rut'";
  2. $res = mysql_query("mi_base");
  3.  
  4. while($fila=mysql_fetch_array($res))
  5. {

quizas no sea lo que buscas, pero si puede ser una alternativa en caso que no des solucion a lo que quieres ahora!

saludos!
  #10 (permalink)  
Antiguo 27/08/2009, 11:03
Avatar de nonpublic  
Fecha de Ingreso: agosto-2009
Mensajes: 240
Antigüedad: 15 años, 3 meses
Puntos: 4
Respuesta: Consulta de movimientos secuenciales

Twonex, realmente lo que deseo es manejar la consulta desde mi codigo de una manera simple como la que muestras, colocando la consulta en una vista para llamarla asi.

Select Fecha,Articulo,HEntrada,HSalida from vMiVista
Alguna sugerencia?
  #11 (permalink)  
Antiguo 27/08/2009, 11:09
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 7 meses
Puntos: 300
Respuesta: Consulta de movimientos secuenciales

A mí me falta algo para entenderlo todo; si el código de un artículo no es único, es decir, el mismo artículo 01 tiene dos entradas y salidas en el mismo día, cómo sabemos el par que corresponde, es decir, la relación entrada, salida. Tal vez me digas que van seguidas, es ese el criterio, o quizás sería mejor que hubiera un número de operación idéntico para la entrada y salida correspondientes de ese mismo producto. Esto último lo resolvería todo, pero no creo que se dé. Si no puedes o pueden añadirte ese dato, tal vez sería mejor hacerlo con programación y hacer las correspondencias según el orden en que se almacenan. Pero todavía nos debes decir cómo asignas la salida a una entrada. Un ejemplo:
Si tienes una entrada para el artículo 01 a las 10:05:00
y otra entrada a las 10:15:00, y sólo una salida para ese artículo 01 a las 10:45:00, ¿a cuál operación corresponde la salida, a la de 10:05:00 o a la de las 10:15:00?, ¿de qué depende, de la hora, del orden en el que se carga en la base...?
  #12 (permalink)  
Antiguo 27/08/2009, 11:15
 
Fecha de Ingreso: julio-2009
Ubicación: .mysql_error ( XD )
Mensajes: 554
Antigüedad: 15 años, 4 meses
Puntos: 13
Respuesta: Consulta de movimientos secuenciales

mmm... y por qué no guardas esos datos en una tabla y levantas de ahi.

ahora me calza una duda...
cómo es que tienes 3 entradas seguidas para un mismo articulo si haber salidas
osea, yo no puedo entrar a un lugar 3 veces si nunca me fui...

debes validar eso
  #13 (permalink)  
Antiguo 27/08/2009, 11:28
Avatar de nonpublic  
Fecha de Ingreso: agosto-2009
Mensajes: 240
Antigüedad: 15 años, 3 meses
Puntos: 4
Respuesta: Consulta de movimientos secuenciales

Cita:
Iniciado por jurena Ver Mensaje
A mí me falta algo para entenderlo todo; si el código de un artículo no es único, es decir, el mismo artículo 01 tiene dos entradas y salidas en el mismo día, cómo sabemos el par que corresponde, es decir, la relación entrada, salida. Tal vez me digas que van seguidas, es ese el criterio, o quizás sería mejor que hubiera un número de operación idéntico para la entrada y salida correspondientes de ese mismo producto. Esto último lo resolvería todo, pero no creo que se dé. Si no puedes o pueden añadirte ese dato, tal vez sería mejor hacerlo con programación y hacer las correspondencias según el orden en que se almacenan. Pero todavía nos debes decir cómo asignas la salida a una entrada. Un ejemplo:
Si tienes una entrada para el artículo 01 a las 10:05:00
y otra entrada a las 10:15:00, y sólo una salida para ese artículo 01 a las 10:45:00, ¿a cuál operación corresponde la salida, a la de 10:05:00 o a la de las 10:15:00?, ¿de qué depende, de la hora, del orden en el que se carga en la base...?
Al inicio mencione:
Cita:
No puede darse una salida sin una entrada
y puede que un movimiento solo tenga entrada o solo salida durante el dia.
eso es controlado desde el codigo en funcion al ultimo movimiento registrado por el producto. Ej. Si el ultimo movimiento que registro el producto fue una salida solo deberia registrar una entrada como movimiento. Tienes razon deberia usar un identificador de movimiento que quiza obvie al inicio pero puedo generar uno. En general este proceso deberia funcionar tanto para articulos, gestiones financieras o personas. Todas las sugerencias son bienvenidas.

Última edición por nonpublic; 27/08/2009 a las 11:35
  #14 (permalink)  
Antiguo 27/08/2009, 11:33
Avatar de nonpublic  
Fecha de Ingreso: agosto-2009
Mensajes: 240
Antigüedad: 15 años, 3 meses
Puntos: 4
Respuesta: Consulta de movimientos secuenciales

Cita:
Iniciado por Twonex Ver Mensaje
mmm... y por qué no guardas esos datos en una tabla y levantas de ahi.

ahora me calza una duda...
cómo es que tienes 3 entradas seguidas para un mismo articulo si haber salidas
osea, yo no puedo entrar a un lugar 3 veces si nunca me fui...

debes validar eso
Si esta validado man. Las entradas se producen luego de una salida como comente anteriormente y pueden haber muchos movimientos en el dia. Deberia funcionar algo asi como el sistema bancario. Si pides un listado de movimientos te muestra todos los movimientos de manera secuencial y tambien mostrar los datos tabulados de la manera que necesito.
  #15 (permalink)  
Antiguo 27/08/2009, 12:23
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 7 meses
Puntos: 300
Respuesta: Consulta de movimientos secuenciales

El número de operación podría servir, pero también podrías usar la fecha y hora de entrada; me explicaré. Si existiera un campo datetime añadido en el que pudieras introducir fecha y hora de entrada (son datos que ya tienes y cargas, pero que cargarías juntos en ese campo), y cuando guardes el 02, es decir la salida de ese producto (por ej. el producto 01) añades la fecha y hora de entrada anterior (la última) de ese producto. Si se trata de 01, es decir, entrada, sólo guardas la fecha y hora en que se produce. Naturalmente, te tocará hacer algún concat con cast a fecha de la fecha y hora de entrada y salida en la consulta de comparación. A ver si me explico bien, buscas el registro de ese producto 01 y concretamente su 01, es decir, entrada más alta hasta ese momento, y cargas el dato de ese campo datetime en el campo datetime de 02 de ese producto 01. Y ya puedes agrupar por ese campo datetime y tener hora de entrada y salida, agrupando por producto y campo datetime, a la vez.
Se me ocurre.
Otra opción sería numerar los registros, pero haría la consulta algo más engorrosa.

Última edición por jurena; 27/08/2009 a las 12:29
  #16 (permalink)  
Antiguo 27/08/2009, 12:30
Avatar de nonpublic  
Fecha de Ingreso: agosto-2009
Mensajes: 240
Antigüedad: 15 años, 3 meses
Puntos: 4
Respuesta: Consulta de movimientos secuenciales

Cita:
Iniciado por jurena Ver Mensaje
El número de operación podría servir, pero también podrías usar la fecha y hora de entrada; me explicaré. Si existiera un campo datetime añadido en el que pudieras introducir fecha y hora de entrada (son datos que ya tienes y cargas, pero que cargarías juntos en ese campo), y cuando guardes el 02, es decir la salida de ese producto (por ej. el producto 01) añades la fecha y hora de entrada de ese producto anterior. Si se trata de 01 sólo guardas la fecha y hora en que se produce. Naturalmente, te tocará hacer algún concat con cast a fecha de la fecha y hora de entrada y salida en la consulta de comparación. A ver si me explico bien, buscas el registro de ese producto 01 y concretamente su 01, es decir, entrada más alta hasta ese momento, y cargas el dato de ese campo datetime en el campo datetime de 02 de ese producto. Y ya puedes agrupar por ese campo datetime y tener hora de entrada y salida, agrupando por producto y campo datetime, a la vez.
Se me ocurre.
Otra opción sería numerar los registros, pero haría la consulta algo más engorrosa.
El ingreso de informacion lo podria solucionar con un distinct(producto) where tmov=01 o 02 group by fecha, hora.
Sinembargo, lo que necesito es mostrar los datos de la forma que plantee anteriormente, si es que se puede, o hya alguna otra forma de realizarlo y mantener los controles mas simples?

P.D. Vas ganando karma x tu apoyo
  #17 (permalink)  
Antiguo 27/08/2009, 12:39
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 7 meses
Puntos: 300
Respuesta: Consulta de movimientos secuenciales

nonpublic,
una pregunta más:
¿no tendrás un id int, auto_increment generado, pues eso te evitaría tener que poner un número de orden?
Piensa que estas son soluciones con la base; seguro que con programación también podrías resolverlo...
  #18 (permalink)  
Antiguo 27/08/2009, 12:47
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: Consulta de movimientos secuenciales

Mi propuesta:

crea dos tablas que te maneje el problema de forma sencilla. haz uso de campos datetime y no por separado. Según entiendo, la salida de una entrada puede ser al otro día.

Código mysql:
Ver original
  1. mysql> select *from entradas;
  2. +----+----------+---------------------+
  3. | id | articulo | fecha_hora          |
  4. +----+----------+---------------------+
  5. | 10 |        1 | 2009-08-27 10:05:00 |
  6. | 11 |        2 | 2009-08-27 10:30:00 |
  7. | 12 |        3 | 2009-08-27 10:45:00 |
  8. | 13 |        1 | 2009-08-27 11:25:00 |
  9. | 14 |        1 | 2009-08-27 11:45:00 |
  10. +----+----------+---------------------+
  11. 5 rows in set (0.00 sec)
  12.  
  13. mysql> select *from salidas;
  14. +----+---------------------+------------+
  15. | id | fecha_hora          | id_entrada |
  16. +----+---------------------+------------+
  17. |  1 | 2009-08-27 13:51:20 |         10 |
  18. |  2 | 2009-08-27 14:26:59 |         11 |
  19. |  3 | 2009-08-27 17:57:19 |         13 |
  20. |  4 | 2009-08-27 17:37:40 |         14 |
  21. +----+---------------------+------------+
  22. 4 rows in set (0.00 sec)
  23.  
  24. mysql> select e.articulo articulo, e.fecha_hora entradas,ifnull(s.fecha_hora,'--:--') salidas from entradas e left join salidas s on e.id=s.id_entrada order by e.articulo;
  25. +----------+---------------------+---------------------+
  26. | articulo | entradas            | salidas             |
  27. +----------+---------------------+---------------------+
  28. |        1 | 2009-08-27 10:05:00 | 2009-08-27 13:51:20 |
  29. |        1 | 2009-08-27 11:25:00 | 2009-08-27 17:57:19 |
  30. |        1 | 2009-08-27 11:45:00 | 2009-08-27 17:37:40 |
  31. |        2 | 2009-08-27 10:30:00 | 2009-08-27 14:26:59 |
  32. |        3 | 2009-08-27 10:45:00 | --:--               |
  33. +----------+---------------------+---------------------+
  34. 5 rows in set (0.03 sec)
  35.  
  36. mysql>

De esta forma, cada entrada se toma como una orden y se evita la confusión si dos entradas de un articulo cual suple la salida siguiente.

Como lo tienes, tienes una tabla carente de sentido. Es mejor que desde el principio tengas en cuenta un buen modelo relacional para evitar este tipo de tareas.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #19 (permalink)  
Antiguo 27/08/2009, 12:57
Avatar de nonpublic  
Fecha de Ingreso: agosto-2009
Mensajes: 240
Antigüedad: 15 años, 3 meses
Puntos: 4
Respuesta: Consulta de movimientos secuenciales

huesos52, voy a tomar en cuenta tu propuesta.
jurena, aun cuando no me gusta usar campos autoincrementales, puedo ponerle uno. Cual seria tu propuesta?
Acepto propuestas para ver si puedo utilizar una mixtura de ellas. Gracias por su apoyo.
  #20 (permalink)  
Antiguo 27/08/2009, 13:02
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 7 meses
Puntos: 300
Respuesta: Consulta de movimientos secuenciales

Si te soy sincero, a mí la que me gusta es la última propuesta de huesos52. Pero antes deberías comprobar que te sirve para todas las operaciones que sueles hacer con esos datos.
Fíjate que podrás relacionar la salida con la entrada por ese id de entradas e id_entrada de salidas. El programa cuando genera una salida, busca la entrada anterior en la otra tabla y añade el id al id_entrada de la tabla salidas. En lugar de agrupar haces el LEFT JOIN y los datos de fecha y hora están guardados como datetime. Me gusta todo, pero antes deberías comprobar que todas tus consultas puedes hacerlas con esa estructura.
  #21 (permalink)  
Antiguo 27/08/2009, 13:53
Avatar de nonpublic  
Fecha de Ingreso: agosto-2009
Mensajes: 240
Antigüedad: 15 años, 3 meses
Puntos: 4
Respuesta: Consulta de movimientos secuenciales

Me permiti acomodar los datos a la salida que requiero y me quedo algo asi la consulta:
Cita:
SELECT e.articulo articulo, DATE_FORMAT( e.fecha_hora, "%d-%m-%y" ) fecha, DATE_FORMAT( e.fecha_hora, "%H:%s" ) hora_entrada, ifnull( DATE_FORMAT( s.fecha_hora, "%H:%s" ) , '--:--' ) hora_salida
FROM entradas e
LEFT JOIN salidas s ON e.id = s.id_entrada
ORDER BY e.articulo
El resultado fue algo como esto:
Cita:
-------------------------------------
| articulo | fecha | hora_entrada | hora_salida
-------------------------------------
|01 | 27-08-09 | 13:14 | 13:32
|01 | 27-08-09 | 13:03 | 13:11
|01 | 27-08-09 | 14:00 | --:--
|02 | 27-08-09 | 13:25 | 13:32
|03 | 27-08-09 | 13:07 | --:--
Bajo este esquema me pregunto, como seria la consulta para
ordenar los movimientos por secuencia(tiempo de registro de movimiento)?
*Asi lo tenia almacenado anteriormente.
EJ.
----------------------------------
Fecha | articulo | hora-mov | tipo_mov
-----------------------------------
27-08-09 | 01 | 13:03 | E
27-08-09 | 03 | 13:07 | E
27-08-09 | 01 | 13:11 | S
27-08-09 | 01 | 13:14 | E
27-08-09 | 02 | 13:25 | E
27-08-09 | 01 | 13:32 | S
27-08-09 | 02 | 13:32 | S
27-08-09 | 01 | 14:00 | E

P.D. Y para asignarle un correlativo al movimiento?

En este link plantean una estructura similar a la que tengo para los movimientos pero no se como obtener el listado que requiero :(
http://www.php-hispano.net/foros/PHP...on-php5-mysql5

Última edición por nonpublic; 27/08/2009 a las 14:30 Razón: Navegando encontre un tema parecido
  #22 (permalink)  
Antiguo 27/08/2009, 14:27
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 7 meses
Puntos: 300
Respuesta: Consulta de movimientos secuenciales

Haces una consulta con union all a las dos tablas y ordenas por fecha_hora, incluso puedes añadir E y S como cadena en la consulta para tener ese tipo_mov escrito.
SELECT e.articulo articulo, fecha_hora, DATE_FORMAT( e.fecha_hora, "%d-%m-%y" ) fecha, DATE_FORMAT( e.fecha_hora, "%H:%s" ) fechahora, 'E' tipo_mov FROM entradas e
UNION ALL
SELECT s.articulo articulo, fecha_hora, DATE_FORMAT( s.fecha_hora, "%d-%m-%y" ) fecha, DATE_FORMAT( s.fecha_hora, "%H:%s" ) fechahora, 'S' tipo_mov
FROM salidas s
order by fecha_hora

o algo así (no lo he probado)

Última edición por jurena; 27/08/2009 a las 14:34
  #23 (permalink)  
Antiguo 27/08/2009, 15:21
Avatar de nonpublic  
Fecha de Ingreso: agosto-2009
Mensajes: 240
Antigüedad: 15 años, 3 meses
Puntos: 4
Respuesta: Consulta de movimientos secuenciales

no funca :(
  #24 (permalink)  
Antiguo 28/08/2009, 00:48
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 7 meses
Puntos: 300
Respuesta: Consulta de movimientos secuenciales

A mí me funciona perfectamente. He corregido alguna cosilla. Observa que en tu primera consulta muestras los segundos en lugar de los minutos (me refiero a la sintaxis: escribes %s en lugar de %i en dos ocasiones)
Pero veamos el problema:
He creado una base con tu nick y he introducido los datos que presentas:
-- phpMyAdmin SQL Dump
-- version 2.9.2
-- http://www.phpmyadmin.net
--
-- Servidor: localhost
-- Tiempo de generación: 28-08-2009 a las 08:44:55
-- Versión del servidor: 5.0.27
-- Versión de PHP: 5.2.1
--
-- Base de datos: `nonpublic`
--
CREATE DATABASE `nonpublic` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
USE `nonpublic`;

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `entradas`
--

CREATE TABLE `entradas` (
`id` int(11) NOT NULL auto_increment,
`articulo` varchar(10) NOT NULL,
`fecha_hora` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;

--
-- Volcar la base de datos para la tabla `entradas`
--

INSERT INTO `entradas` (`id`, `articulo`, `fecha_hora`) VALUES
(1, '01', '2009-09-27 13:14:00'),
(2, '01', '2009-09-27 13:03:00'),
(3, '01', '2009-09-27 14:00:00'),
(4, '02', '2009-09-27 13:25:00'),
(5, '03', '2009-09-27 13:07:00');

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `salidas`
--

CREATE TABLE `salidas` (
`id` int(11) NOT NULL auto_increment,
`articulo` varchar(10) NOT NULL,
`fecha_hora` datetime NOT NULL,
`id_entrada` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

--
-- Volcar la base de datos para la tabla `salidas`
--

INSERT INTO `salidas` (`id`, `articulo`, `fecha_hora`, `id_entrada`) VALUES
(1, '01', '2009-09-27 13:32:00', 1),
(2, '01', '2009-09-27 13:11:00', 2),
(3, '02', '2009-09-27 13:32:00', 4);

Luego he lanzado esta consulta.
Código sql:
Ver original
  1. SELECT e.articulo articulo, fecha_hora, DATE_FORMAT( e.fecha_hora, "%d-%m-%y" ) fecha, DATE_FORMAT( e.fecha_hora, "%H:%i" ) fechahora, 'E' tipo_mov FROM entradas e
  2. UNION ALL
  3. SELECT s.articulo articulo, fecha_hora, DATE_FORMAT( s.fecha_hora, "%d-%m-%y" ) fecha, DATE_FORMAT( s.fecha_hora, "%H:%i" ) fechahora, 'S' tipo_mov
  4. FROM salidas s
  5. ORDER BY fecha_hora, articulo, tipo_mov

La he probado y funciona bien.
  #25 (permalink)  
Antiguo 28/08/2009, 10:10
Avatar de nonpublic  
Fecha de Ingreso: agosto-2009
Mensajes: 240
Antigüedad: 15 años, 3 meses
Puntos: 4
Respuesta: Consulta de movimientos secuenciales

Gracias por responder. Acabo de hacer las pruebas.
Los movimientos luego de un pequeño ajuste me quedaron asi:

Cita:
// Muestra Movimientos secuenciales

SELECT e.articulo articulo, DATE_FORMAT( e.fecha_hora, "%d-%m-%y" ) fecha, DATE_FORMAT(

e.fecha_hora, "%H:%i" ) fechahora, 'E'tipo_mov
FROM entradas e
UNION ALL
SELECT s.articulo articulo, DATE_FORMAT( s.fecha_hora, "%d-%m-%y" ) fecha, DATE_FORMAT(

s.fecha_hora, "%H:%i" ) fechahora, 'S'tipo_mov
FROM salidas s
ORDER BY fecha, fechahora, articulo, tipo_mov
Hasta aqui todo OK.
Asi que decidi probar ingresando una salida de los productos al dia siguiente.
Aqui tuve un percance.
La consulta mostro lo siguiente:
Cita:
------------------------------
|articulo |fecha |hora_entrada |hora_salida
------------------------------
01 27-09-09 13:14 13:32
01 27-09-09 13:03 13:11
01 27-09-09 14:00 03:45 //*
02 27-09-09 13:25 13:32
03 27-09-09 13:07 03:40 //*
Dato que es erroneo porque las ultimas salidas de los productos 01 y 03 se produjeron al dia siguiente, por que la consulta deberia retornar:
Cita:
------------------------------
|articulo |fecha |hora_entrada |hora_salida
------------------------------
01 27-09-09 13:14 13:32
01 27-09-09 13:03 13:11
01 27-09-09 14:00 --:--
02 27-09-09 13:25 13:32
03 27-09-09 13:07 --:--
03 28-09-09 --:-- 03:40
01 28-09-09 --:-- 03:45
Alguna sugerencia?
  #26 (permalink)  
Antiguo 28/08/2009, 11:02
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 7 meses
Puntos: 300
Respuesta: Consulta de movimientos secuenciales

Creo que confundes dos cosas: la primera consulta, que ya funcionaba (es la de huesos52), te permitía mostrarlo con hora de entrada y salida de cada producto:
Código sql:
Ver original
  1. SELECT e.articulo articulo, e.fecha_hora entradas,ifnull(s.fecha_hora,'--:--') salidas FROM entradas e LEFT JOIN salidas s ON e.id=s.id_entrada ORDER BY e.articulo;
Luego has pedido que se mostraran entradas y salidas ordenadas secuencialmente según la fecha_hora, y en eso estamos. Para esto te propuse una consulta con union all, pero tienes que ordenar por el campo fecha_hora, y para eso debes traértelo en la consulta. No puedes ordenar por fechahora, que en tu caso es un alias de un dato de cadena generado a partir del campo fecha_hora. Tienes que ordenar por el verdadero campo datetime, que es fecha_hora, pero para eso debes traértelo (son inconvenientes de las consultas con Union all)
sería esta:
Código sql:
Ver original
  1. SELECT e.articulo articulo, fecha_hora, DATE_FORMAT( e.fecha_hora, "%d-%m-%y" ) fecha, DATE_FORMAT( e.fecha_hora, "%H:%i" ) fechahora, 'E' tipo_mov FROM entradas e
  2. UNION ALL
  3. SELECT s.articulo articulo, fecha_hora, DATE_FORMAT( s.fecha_hora, "%d-%m-%y" ) fecha, DATE_FORMAT( s.fecha_hora, "%H:%i" ) fechahora, 'S' tipo_mov
  4. FROM salidas s
  5. ORDER BY fecha_hora, articulo, tipo_mov
Necesitas, pues, ese campo fecha_hora en el select para poder ordenar por él.

Aunque podrías no traerte ese campo, pero deberías ordenar reconstruyendo a partir de tus alias y convirtiendo a tiempo, con algo como esto:
Código sql:
Ver original
  1. SELECT e.articulo articulo, DATE_FORMAT( e.fecha_hora, "%d-%m-%y" ) fecha, DATE_FORMAT( e.fecha_hora, "%H:%i" ) fechahora, 'E' tipo_mov FROM entradas e
  2. UNION ALL
  3. SELECT s.articulo articulo, DATE_FORMAT( s.fecha_hora, "%d-%m-%y" ) fecha, DATE_FORMAT( s.fecha_hora, "%H:%i" ) fechahora, 'S' tipo_mov
  4. FROM salidas s
  5. ORDER BY str_to_date (concat(fecha,fechahora),"%d-%m-%y%H:%i"), articulo, tipo_mov

Última edición por jurena; 28/08/2009 a las 11:20
  #27 (permalink)  
Antiguo 28/08/2009, 12:47
Avatar de nonpublic  
Fecha de Ingreso: agosto-2009
Mensajes: 240
Antigüedad: 15 años, 3 meses
Puntos: 4
Respuesta: Consulta de movimientos secuenciales

Lo que mencionas esta perfecto jurena y te lo agradezco. Por eso mencione
Cita:
Hasta aqui todo OK.
Sinembargo, realice las pruebas desde cero con ambas consultas ya que como mencione al inicio yo tenia estructurada la tabla de una manera distinta, por lo cual al cambiar los esquemas, necesitaba ahora las 2 visualizaciones, 1ero el listado de movimientos de manera secuencial que es el que me respondes. Y el listado de la manera que solicite al inicio de este tema, el cual respondio huesos52:

Producto Fecha Hora_entrada Hora_Salida

Esto es lo que no funciona correctamente ya que muestra la informacion correcta solo si los movimientos se presentan durante un dia, pero, al insertar un movimiento correspondiente al siguiente dia falla.

Incluso tu lo notaste al inicio
Cita:
Yo sólo veo un problema, el caso en que la hora de entrada y de salida se den en dias distintos. Imagina que la entrada se produce el 2005/01/01 a las 23:45:00, y la salida el 2005/01/02 a las 00:15:00.

Última edición por nonpublic; 28/08/2009 a las 12:52
  #28 (permalink)  
Antiguo 28/08/2009, 12:58
Avatar de nonpublic  
Fecha de Ingreso: agosto-2009
Mensajes: 240
Antigüedad: 15 años, 3 meses
Puntos: 4
Respuesta: Consulta de movimientos secuenciales

Diganme testarudo pero, trato de darle vueltas a esto de cualquier manera, y me sugirieron usar esta consulta manteniendo el esquema original de mi tabla:
Código:
 SELECT cArt, DATE( Entrada ) AS FIngreso, TIME( Entrada ) AS hIngreso,
CASE WHEN Salida IS NULL
THEN '____.__.__'
ELSE DATE( Salida )
END AS FSalida,
CASE WHEN Salida IS NULL
THEN '__:__'
ELSE TIME( Salida )
END AS hSalida
FROM (

SELECT T1.cArt, T1.Fecha AS Entrada, (
SELECT Fecha
FROM movimientos
WHERE cArt = T1.cArt
AND tipo = '02'
AND Fecha > T1.Fecha
LIMIT 0,1 ) as Salida
FROM movimientos T1
WHERE MTipo = '01'
)TFinal
ORDER BY cArt, Fecha
Sinembargo no logro que funcione. Quiza uds. me puedan ayudar a encontrar el error o en su defecto este esquema le sirva a alguien.

Última edición por nonpublic; 28/08/2009 a las 13:16 Razón: Ahora funciona pero no muestra el reslutado
  #29 (permalink)  
Antiguo 28/08/2009, 14:45
Avatar de nonpublic  
Fecha de Ingreso: agosto-2009
Mensajes: 240
Antigüedad: 15 años, 3 meses
Puntos: 4
Respuesta: Consulta de movimientos secuenciales

Hice una prueba con esto y aparentemente resulta manteniendo el esquema inicial con un pequeño cambio bajo sugerencia vuestra, los campos fecha y hora los converti en mFecha del tipo DateTime:
Código:
-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `movimientos`
--

CREATE TABLE IF NOT EXISTS `movimientos` (
  `cArt` int(2) NOT NULL,
  `mFecha` datetime NOT NULL,
  `mTipo` int(1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Volcar la base de datos para la tabla `movimientos`
--

INSERT INTO `movimientos` (`cArt`, `mFecha`, `mTipo`) VALUES
(1, '2009-08-26 10:05:00', 1),
(2, '2009-08-26 10:30:00', 1),
(1, '2009-08-26 10:35:00', 2),
(3, '2009-08-26 10:45:00', 1),
(2, '2009-08-26 10:50:00', 2),
(3, '2009-08-26 11:15:00', 2),
(1, '2009-08-26 11:25:00', 1),
(1, '2009-08-27 09:05:00', 2),
(2, '2009-08-27 09:10:00', 1),
(2, '2009-08-28 14:57:50', 2);
Y he aqui la dichosa consulta para devolver los datos de la manera solicitada incialmente

Cita:

SELECT cArt, DATE(Entrada) As FIngreso,
TIME(Entrada) AS hIngreso,
CASE WHEN Salida IS NULL THEN '____.__.__'
ELSE DATE(Salida)
END As FSalida,
CASE WHEN Salida IS NULL THEN '__:__'
ELSE TIME(Salida)
END AS hSalida
FROM (
SELECT T1.cArt, T1.mFecha As Entrada,
(SELECT Min(mFecha) AS mFecha
FROM movimientos
WHERE cArt = T1.cArt AND mTipo = 'S' AND mFecha > T1.mFecha) AS Salida
FROM movimientos T1
WHERE MTipo = 'E'
) TFinal

ORDER BY cArt, Entrada, Salida
Por favor ayudenme a probarla para saber si es definitivo o encuentran alguna inconsistencia
  #30 (permalink)  
Antiguo 28/08/2009, 15:54
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 7 meses
Puntos: 300
Respuesta: Consulta de movimientos secuenciales

nonpublic,
las consultas que te propusimos huesos52 y yo, las últimas, fueron pensadas para dos tablas, una de entradas y otra de salidas; de ahí que no funcionen, claro. Creo que debes seguir el consejo de huesos52 y cambiar a esa estructura. Esta otra que tienes no es tan efeciente para manejar los datos como quieres, y, como ya hablamos, necesitarías marcar las operaciones de pares con un número o una fechahora, por ej. la misma fechahora que guardas para una entrada, que se guardara para una salida. Yo sigo prefiriendo la estructura de huesos52, que es la que creé en las tablas que te puse en el post 24. No es que seas testarudo, sino que no hablábamos el mismo idioma, y ciertamente los datos eran los testarudos: seguían si salirte.
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 13:41.