PDA

Ver la Versión Completa : Moverse entre Reg. como First,Next,Last...


cacuna
19-09-2003, 19:18:51
Saludos...

Mi duda es precisamente esa.

Como puedo hacer para posicionarme al primero, al siguiente o al ultimo registro de una Consulta, es decir, moverme entre los registros de una consulta sin necedad de hacer un ciclo.

Saludos...y gracias de antemano.

delphi.com.ar
19-09-2003, 19:51:11
Utilizando todos los métodos que has nombrado, pero no dentro de un ciclo!
La pregunta es para que necesitas esto, si quieres que el usuario decida, pondrás un botón por cada metodo y/o un navegador.

cacuna
19-09-2003, 20:02:51
Perdon....he cometido al error de muchos de no explicarme bien y detalar el problema.
Dejenme intentarlo nuevamente.

Tengo un Store Procedure, dentro del cual, realizo un a consulta la cual me retorno un listado de varios registros, de los, cuales el que me sirve y lo que deseo hacer es posicionarme sobre el ultimo registro, sin necesidad de realizar un barrido en un ciclo y llegar hasta el ultimo.

No lo puedo hacer tomando el Max() del campo por que no siempre es el maximo.

De igual manera provecho para preguntar como moverme al anterior o al siguiente.

Espero haberme explicado un poco mejor en esta ocasion.

Saludos.....y gracias again.

delphi.com.ar
19-09-2003, 20:34:36
Ahora si!... me parecía demaciado rara la pregunta anterior! :D

Los registros... ¿Tiene un ID ordinal?... alguna fecha... algo con lo que puedas delucidar cual es el último registro...
Si es así, puedes hacer algo como esto:

SELECT ID, NOMBRE
FROM USUARIOS
WHERE ID = (SELECT MAX(D.ID) FROM USUARIOS D)


Saludos!

cacuna
19-09-2003, 21:09:50
Deja poner un ejemplo que lo explique mejor.

La consulta dentro del SP me devuelve algo asi:

ID EMP FECHA HORA TIPO
===============================
10 393 1/SEP/03 6:00 ENTRADA
25 393 1/SEP/03 16:00 SALIDA
32 393 2/SEP/03 5:58 ENTRADA
73 393 2/SEP/03 16:06 SALIDA
58 393 3/SEP/03 5:55 ENTRADA
67 393 3/SEP/03 16:15 SALIDA

Por cuestiones del cliente, requiero posicionarme en el ultimo registro que me arroja esta consulta,es decir, en este caso, seria el registro ID: 67, pero no puedo hacer tomando el Max(ID) ya que este es un Campo Autoincrementable, donde no siempre el MAX(ID) es el registro que necesito o que ando buscando.
Ej. Busco el ultimo registro que seria el ID: 67, y con el MAX(ID) me regresaria el registro ID: 73, que no es el que deseo.

Utilizo Firebird 1.0.397
Gracias por su ayuda.

delphi.com.ar
19-09-2003, 21:20:27
Primero quisiera que me digas cual es tu criterio para saber cual es el último registro, luego quiero comentarte que por convensión ANSI los registrso en motores ANSI SQL no necesariamente tienen que estar guardados en la base de datos en orden de "ingreso"... digamos que si no tienes ningún campo que los ordene nadie te garantiza que el último registro tenga un criterio lógico..

Viet
19-09-2003, 21:22:05
Porque no haces un "Order by fecha asc" en tu consulta y luego utilizas last con el objeto que contenga el resultado de la consulta?

Sino puedes poner el la consulta "select TOP 1 ..... order by fecha desc"

Entendi bien el problema ?:confused:

delphi.com.ar
19-09-2003, 21:24:58
Si fuera por fecha, podrías usar el mismo query que te pasé al comienzo, pero con el campo fecha en lugar de ID:

SELECT ID, NOMBRE
FROM USUARIOS
WHERE FECHA = (SELECT MAX(D.FECHA) FROM USUARIOS D)

guillotmarc
19-09-2003, 21:33:09
Hola.

¿ Porqué no quieres utilizar comandos Last ?. ¿ Que problema hay en abrir el TStoredProc, posicionarte en el ultimo registro con un Last, y averiguar el código ?.

Saludos.

__cadetill
20-09-2003, 11:11:43
Bueno, no se si hemos entendido el problema o no, pero para moverte por un Dataset tienes que utilizar las propiedades First (primero), Prior (anterior), Next (siguiente) y Last (último)

Pero soy de la opinión de Delphi.com.ar. Si puedes, intenta hacer que el SP te devuelva sólo el registro que quieres o nocesites

cacuna
23-09-2003, 21:42:41
Muchas gracias a todos por contestar.
Dejen ampliar el problema.

Al igual que uds soy de la idea de-en este caso- de que el SP me retorne un solo registro, que es precisamente lo que deseo hacer.
Ahora bien , el criterio que se utiliza para saber cual es el ultimo registro es el siguiente:

En base al ejemplo que expuse, el ultimo registro del empleado 393 seria el la ultima checada registrada ya fuera entrada o salida, con su respectiva hora y fecha del momento en que se registro dicha checada.
El ID es olo un autoincrementable.
Todo el calculo lo realizo en el SP que me regresa solo un registro, por eso mismo, no puedo utilizar un last, next u lo que sea desde el objeto que manda llamar mi SP.


Gracias nuevamente por su ayuda.

guillotmarc
24-09-2003, 11:27:12
Hola

La ultima entrada de un usuario, la puedes sacar con una consulta como esta (tiene una subconsulta) :

select *
from ENTRADAS
where ID = (select max(ID) from ENTRADAS where USUARIO = :USUARIO)

Lo puedes lanzar con un Query, o bien crear un procedimiento almacenado y ejecutarlo en el procedimiento almacenado.

Saludos.

Aprendiz
25-09-2003, 17:55:06
Hola

Sería algo así:


select *
from ENTRADAS
where ID = (select ID from ENTRADAS where USUARIO = :USUARIO group by ID having MAX(FECHA+HORA))


Y dicho esto viene otra pregunta aclaratoria, la fecha y la hora las tienes en campos separados o es uno solo.

En el caso de que sean en campo separados, tendrias que sumarlos dentro del MAX para obtener el máximo adecuado que buscas.

Saludos

delphi.com.ar
25-09-2003, 18:11:35
No se en que motor estas trabajando, pero no veo válido el "having MAX(FECHA+HORA)"

PD: en unos cuantos post anteriores yo he puesto el query SELECT ID, NOMBRE
FROM USUARIOS
WHERE FECHA = (SELECT MAX(D.FECHA) FROM USUARIOS D)

que toma solamente la fecha, habría que adaptarlo para que tome la fecha+hora, y creo sería la solución

SELECT ID, NOMBRE
FROM USUARIOS
WHERE FECHA = (SELECT MAX(D.FECHA+D.HORA) FROM USUARIOS D)


y si quiere filtrarlo por usuario

SELECT ID, NOMBRE
FROM USUARIOS O
WHERE FECHA = (SELECT MAX(D.FECHA+D.HORA) FROM USUARIOS D WHERE O.EMP = D.EMP)
AND EMP = :USUARIO


Perosnalmente prefiero trabajar Fecha y Hora en un mismo campo.

Saludos!