PDA

Ver la Versión Completa : Ordenar por un campo de una tabla que es de tipo date


mancurnino
20-04-2008, 15:50:48
Hola amigos, tengo una tabla la cual tiene una ID q es la clave, q es autoincrementable, y luego varios campos mas, entre ellos FechaIni y FechaFin, por ejemplo:

ID FechaIni FechaFin

1 02/04/2008 05/04/2008
2 08/04/2008 14/04/2008
3 06/04/2008 07/04/2008

Los campos de fechas son de tipo Date, no de tipo String, y bueno, mi problema viene al querer mostrar estos datos por pantalla, ya que los muestro en un TListBox y me salen en el orden en que fueron creados, que viene determinado por la ID, pero si veis, no está ordenado por la fecha inicio que es lo que quiero (fechaIni no es campo clave y no puede serlo), ya que la tercera linea (ID 3), deberia ir en la segunda linea, vamos que quiero que esté ordenado por la fecha ini cuando lo muestre en pantalla (me da = como este en la base de datos). pero me los ordena segun se crearon, y quiero saber si hay alguna forma de ordenar estas tablas que están en el Database Desktop.

Y no me vale la propiedad del listbox que pone sorted, ya que esto m los ordena mirandolos como String una vez ya están dentro del list box, por ejemplo:

02/04/2008 05/04/2008
06/03/2008 07/04/2008
08/03/2008 14/04/2008

y claro, las 2 ultimas fechas de inicio m las pone debajo pq son los dias 6 y 8, pero deberían ir arriba pq son del mes 3, pero me las ordena por string no porque sean Date que es lo q tengo puesto en la base de datos del Database Desktop, y quiero que me las ordene por DATE.

hasta ahora las habia agregado sin mas asi:

ModuloDatos.T_Reserva.Open;
ListBox_Reservas.Items.Clear;
while not ModuloDatos.T_Reserva.Eof do begin
ListBox_Reservas.Items.Add(
DateToStr(ModuloDatos.T_ReservaFechaIni.AsDateTime) + ' '
+ DateToStr(ModuloDatos.T_ReservaFechaFin.AsDateTime))

ModuloDatos.T_Reserva.Next;
end;
ModuloDatos.T_Reserva.Close;

y como veis me las coje de la base de datos segun se hayan creado, y quiero que me las coja, las ordene por la fecha de inicio (ordenadas por date, no por string) y entoncs las agrego al list box y me las muestre ordenadas por date. Nose si se puede utilizar un Query y hacer un order by o algo de esto.

haber si pueden ayudarme, gracias¡

eduarcol
20-04-2008, 16:00:10
pues si puedes utilizar esto:

Select * from reserva order by FechaIni

mancurnino
20-04-2008, 16:13:11
he puesto esto:

ModuloDatos.Query_OrdenarReservas.SQL.Add('Select * ');
ModuloDatos.Query_OrdenarReservas.SQL.Add('From ' + ModuloDatos.T_Reserva.TableName);

ModuloDatos.Query_OrdenarReservas.SQL.Add('Order By ' + ModuloDatos.T_ReservaFechaIni.FieldName);

y debajo de esto tengo el codigo de antes:

while not ModuloDatos.T_Reserva.Eof do begin
ListBox_Reservas.Items.Add(
....
....

nose si sería este el proceso, el query se supone q te modifica la base de datos? pq al añadir elementos al listbox los cojo de ModuloDatos, y el query es una consulta, y el resultao se warda en el query no? no tendria q añadir en el listbox dsd el query en vez desde modulodatos? es que no se como iria esto.

Caro
21-04-2008, 04:20:47
Hola mancurnino, sería mejor que hicieras la consulta directamente sin tener que sacar el nombre de la tabla y el campo desde tu Table T_Reserva y tienes que recorrer tu Query y no tu Table. Mientras no hagas un insert, update... tu query no te modificara tu Base de Datos, solo recuperaras los registros que tu le indiques en tu consulta.


ModuloDatos.Query_OrdenarReservas.SQL.Add('Select * ');
ModuloDatos.Query_OrdenarReservas.SQL.Add('From NombreTabla');
ModuloDatos.Query_OrdenarReservas.SQL.Add('Order By FechaIni');

while not ModuloDatos.Query_OrdenarReservas.Eof do
begin
ListBox_Reservas.Items.Add(DateToStr(ModuloDatos.Query_OrdenarReservas.AsDateTime) + ' '
+ DateToStr(ModuloDatos.Query_OrdenarReservas.AsDateTime));
....



Saluditos

mancurnino
21-04-2008, 17:53:32
es que cuando añado al list box no me sale nada de eso que me pones de:

ModuloDatos.Query_OrdenarReservas.AsDateTime

Solo puedo acceder al codigo que le he metido (selex * from...) pero no al resultado, nose, lo que quiero sería algo asi como

ModuloDatos.Query_OrdenarReservas.FechaIni.AsString + ModuloDatos.Query_OrdenarReservas.FechaFin.AsString

que son las fechas que he obtenido y como ya estan ordenadas, las pongo como string y las añado al listbox, pero digamos que no puedo acceder a el resultado del query, o nose como se hace bien

eduarcol
21-04-2008, 17:59:19
es que debes colocar el nombre de tus objetos, pero asi como lo tiene Caro deberia funcionar

Ojo solo debes cambiar el nombre de los objetos

mancurnino
21-04-2008, 19:15:22
he puesto:


ModuloDatos.Query_OrdenarReservas.SQL.Add('Select ' + ModuloDatos.T_ReservaFechaIni.FieldName + ', ' + ModuloDatos.T_ReservaFechaFin.FieldName);
ModuloDatos.Query_OrdenarReservas.SQL.Add('From ' + ModuloDatos.T_Reserva.DatabaseName);
ModuloDatos.Query_OrdenarReservas.SQL.Add('Order By ' + ModuloDatos.T_ReservaFechaIni.FieldName);
while not ModuloDatos.Query_OrdenarReservas.Eof do begin
ListBox_Reservas.Items.Add(DateToStr(ModuloDatos.Query_OrdenarReservas));
ModuloDatos.Query_OrdenarReservas.Next;
end;


pero en ListBox_Reservas.Items.Add(DateToStr(ModuloDatos.Query_OrdenarReservas)) no puedo poner .AsDateTime

eduarcol
21-04-2008, 19:53:12
ModuloDatos.Query_OrdenarReservas

Y tu tienes los campos persistentes, porq ese es el nombre del query no veo el campo por ningun lado.

seria

ModuloDatos.Query_OrdenarReservas.FieldbyName('Campo').AsDateTime

mancurnino
21-04-2008, 23:16:41
vale, ya está, gracias a todos jejeje.me quedo así:


ModuloDatos.Query_OrdenarReservas.SQL.Clear;
ModuloDatos.Query_OrdenarReservas.SQL.Add('Select ' + ModuloDatos.T_ReservaFechaIni.FieldName + ', ' + ModuloDatos.T_ReservaFechaFin.FieldName);
ModuloDatos.Query_OrdenarReservas.SQL.Add('From ' + ModuloDatos.T_Reserva.TableName);
ModuloDatos.Query_OrdenarReservas.SQL.Add('Order By ' + ModuloDatos.T_ReservaFechaIni.FieldName);



ModuloDatos.Query_OrdenarReservas.Open;
while not ModuloDatos.Query_OrdenarReservas.Eof do begin
ListBox_Reservas.Items.Add(DateToStr(ModuloDatos.Query_OrdenarReservas.FieldByName('FechaIni').AsDat eTime) + ' - '
+ DateToStr(ModuloDatos.Query_OrdenarReservas.FieldByName('FechaFin').AsDateTime));
ModuloDatos.Query_OrdenarReservas.Next;
end;