Ver Mensaje Individual
  #2  
Antiguo 12-08-2003
andres1569 andres1569 is offline
Miembro
 
Registrado: may 2003
Posts: 908
Reputación: 22
andres1569 Va por buen camino
Hola:

Si a la hora de hacer el registro de cierre, éste debe totalizar todos los registros desde una fecha/Hora hasta el actual, no es complicado de implementar:

SELECT SUM(Valor) as TOTAL
FROM MOVIMIENTOS
WHERE FECHA > :FechaIni OR
(FECHA = :FechaIni AND HORA >= :HoraIni)

donde le pasas la fecha y hora inicial en los parámetros :FechaIni y :HoraIni. Todo esto suponiendo que sepas la fecha y hora desde la que quieras totalizar y suponiendo que todos los registros introducidos desde esa Fecha/Hora pertenezcan a la misma operación Apertura/Cierre.

Otra cosa, si no sabes de antemano la Fecha y Hora inicial, yo haría en primer lugar la subconsulta que me devolviera la última apertura, almacenaría en sendas variables los valores de Fecha y Hora, y luego lanzaría la consulta que te he puesto al principio. Hacer esto mediante una consulta anidada (que repetiría para cada tupla la misma subconsulta, es bastante más lento, salvo que no tengas más remedio que hacerlo así). Si usas tablas planas, puedes lanzar desde Delphi las dos consultas, una detrás de otra. Y si usas motores SQL, lo puedes meter todo dentro de un procedimiento almacenado que se lance a la hora de grabar el cierre, por ejemplo.

La siguiente consulta presupone que los registros guardan un orden correlativo (de menor a mayor) en el campo IdMovimiento; si es el campo Registro, lo cambias y ya está. Si ninguno de los dos está en ese orden, habría que buscar la fecha/Hora más reciente (mayor) pero, es algo más complicado porque puede haber dos aperturas el mismo día y habría que emplear algún truco para obtener la mayor (quizás sumando fecha y hora, o bien ordenando el resultado por hora y cogiendo el último registro obtenido)

SELECT MAX(IDMOVIMIENTO) as MovIni, FECHA, HORA
FROM MOVIMIENTOS
WHERE IDTIPOMOV = 5
GROUP BY FECHA, HORA

Con esto tenemos la fecha y hora de la última apertura, basta con pasarle ambos parámetros a la consulta inicial; aunque ahora me doy cuenta de que si tenemos ordenada la tabla por idmovimiento, el WHERE de la primera consulta podría basarse en este campo:

SELECT SUM(Valor) as TOTAL
FROM MOVIMIENTOS
WHERE IDMOVIMIENTO >= :MovIni

¿Es esto lo que deseas? Espero no haberte liado con este rollo.

Saludos
__________________
Guía de Estilo
Responder Con Cita