Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   sacar filas y columnas desde base de datos (Profgrid) (https://www.clubdelphi.com/foros/showthread.php?t=41984)

robertillo 30-03-2007 19:37:13

sacar filas y columnas desde base de datos (Profgrid)
 
hola.
Me estado rompiendo la cabeza para pintar los datos de una tabla en un profgrid. Basicamente lo que quiero hacer es sacar la información de un autobus (id, placa, fecha) y los montos diarios que recaudan
quedando los datos asi:
id placa1--id placa2--id placa3
Fecha
xxx monto1 monto2 monto3
xxx monto1 monto2 monto3
xxx monto1 monto2 monto3

ya la información me la saca pero solo del ultimo día, asi que ocuparía (creo yo) comparar cada fila con la info del SQL para poder pintar en cada fila la información del dia correspondiente hasta la 30, pero no me da la cabeza en este momento. Alguien me puede ayudar, ah, utilizo: TQUERY y el componente Profgrid.

Este el procedimiento que pongo en el botón:
Código Delphi [-]
 
procedure TfrmPruebaProfGrid.Button1Click(Sender: TObject);
var i,f: integer;
begin
pgDatos.RowCount:= Round(Fecha2.Date-Fecha1.Date)+2;
for f:= 0 to Round(Fecha2.Date-Fecha1.Date) do
begin
Fecha1.Time:= strtoTime('00:00:00');
Query1.ParamByName('FechaInicio').AsDateTime:= Fecha1.DateTime;
Fecha1.Time:= strtoTime('23:59:59');
Query1.ParamByName('FechaFinal').AsDateTime:= Fecha1.DateTime;
Query1.Open;
if not(Query1.IsEmpty) then
begin
if pgDatos.ColCount < Query1.RecordCount+1 then
pgDatos.ColCount:= Query1.RecordCount+1;
pgDatos.Cells[0,f+1].Value:= Query1.FieldByName('fecha').AsString;
for i:= 0 to Query1.RecordCount-1 do
begin
pgDatos.Cells[i+1,0].Value:= Query1.FieldByName('cod_vehiculo').AsString+' '+Query1.FieldByName('placa').AsString;
pgDatos.Cells[i+1,f+1].Value:= Query1.FieldByName('recaudacion').AsString;
Query1.Next;
end;
end
else
ShowMessage('La consulta no devolvio datos!!!! ...');
Query1.Close;
Fecha1.Date:= Fecha1.Date+1;
end;
end;

Lepe 01-04-2007 14:20:09

Por favor, lee la guía de estilo de los foros, tienes el enlace arriba.

- No dices qué Base de datos usas.
- No indicas la SQL que usas ni lo que quieres obtener.
- ¿Cual es el problema o el error que da?

PD: usa las etiquetas delphi para mostrar el código, así es muy dificil seguirlo y pocos foristas leeran tu código por no estar bien presentado.

[ delphi ]
tu codigo fuente aqui
[ / delphi ]

sin espacios dentro de los corchetes.

Saludos

robertillo 09-04-2007 18:33:17

Muchas gracias por la respuesta Lepe, tenés toda la razón, indico como lo estoy trabajando con las sugerencias tuyas:

-utilizo INTERBASE como motor de BD
-El error es que me saca solo los datos de la última fecha y no día por día (esto es básicamente lo que quiero sacar)

-La SQL que utilizo es:
Código SQL [-]
 
select extract(month from CURRENT_DATE) as mes, hr.fecha,r.cod_ruta, v.placa, v.cod_vehiculo, sum(hr.monto) as recaudacion
from ruta r, vehiculo v, historico_recaudacion hr
where
(hr.id_ruta = r.id_ruta) and
(hr.id_vehiculo = v.id_vehiculo) and
(r.cod_ruta) = 'A- SANTA ROSA' and
(hr.fecha_hora_inicio >= :FechaInicio) and
(hr.fecha_hora_fin <= :FechaFinal)
group by v.cod_vehiculo,hr.fecha,r.cod_ruta, v.placa
order by v.cod_vehiculo,hr.fecha,r.cod_ruta, v.placa
-el còdigo que pongo en el botón es:
Código Delphi [-]
procedure TfrmPruebaProfGrid.Button1Click(Sender: TObject);
var i,f: integer;
begin
pgDatos.RowCount:= Round(Fecha2.Date-Fecha1.Date)+2;
for f:= 0 to Round(Fecha2.Date-Fecha1.Date) do
begin
Fecha1.Time:= strtoTime('00:00:00');
Query1.ParamByName('FechaInicio').AsDateTime:= Fecha1.DateTime;
Fecha1.Time:= strtoTime('23:59:59');
Query1.ParamByName('FechaFinal').AsDateTime:= Fecha1.DateTime;
Query1.Open;
if not(Query1.IsEmpty) then
begin
if pgDatos.ColCount < Query1.RecordCount+1 then
pgDatos.ColCount:= Query1.RecordCount+1;
pgDatos.Cells[0,f+1].Value:= Query1.FieldByName('fecha').AsString;
for i:= 0 to Query1.RecordCount-1 do
begin
pgDatos.Cells[i+1,0].Value:= Query1.FieldByName('cod_vehiculo').AsString+' '+Query1.FieldByName('placa').AsString;
pgDatos.Cells[i+1,f+1].Value:= Query1.FieldByName('recaudacion').AsString;
Query1.Next;
end;
end
else
ShowMessage('La consulta no devolvio datos!!!! ...');
Query1.Close;
Fecha1.Date:= Fecha1.Date+1;
end;
end;

robertillo 09-04-2007 19:29:29

sacar filas y columnas desde base de datos (Profgrid)
 
Hola, a consideración de Lepe pongo de nuevo este hilo para ver quièn me puede ayudar.

-utilizo INTERBASE como motor de BD
-utilizo un componente profGrid
-El error es que me saca solo los datos de la última fecha y no día por día (esto es básicamente lo que quiero sacar), si me presenta los dias del 1 al 30 pero con los datos del ultimo día.

-La SQL que utilizo es:
Código SQL [-]
select extract(month from CURRENT_DATE) as mes, hr.fecha,r.cod_ruta, v.placa, v.cod_vehiculo, sum(hr.monto) as recaudacion
from ruta r, vehiculo v, historico_recaudacion hr
where
(hr.id_ruta = r.id_ruta) and
(hr.id_vehiculo = v.id_vehiculo) and
(r.cod_ruta) = 'A- SANTA ROSA' and
(hr.fecha_hora_inicio >= :FechaInicio) and
(hr.fecha_hora_fin <= :FechaFinal)
group by v.cod_vehiculo,hr.fecha,r.cod_ruta, v.placa
order by v.cod_vehiculo,hr.fecha,r.cod_ruta, v.placa


-el código que pongo en el botón es:
Código Delphi [-]
procedure TfrmPruebaProfGrid.Button1Click(Sender: TObject);
var i,f: integer;
begin
pgDatos.RowCount:= Round(Fecha2.Date-Fecha1.Date)+2;
for f:= 0 to Round(Fecha2.Date-Fecha1.Date) do
begin
Fecha1.Time:= strtoTime('00:00:00');
Query1.ParamByName('FechaInicio').AsDateTime:= Fecha1.DateTime;
Fecha1.Time:= strtoTime('23:59:59');
Query1.ParamByName('FechaFinal').AsDateTime:= Fecha1.DateTime;
Query1.Open;
if not(Query1.IsEmpty) then
begin
if pgDatos.ColCount < Query1.RecordCount+1 then
pgDatos.ColCount:= Query1.RecordCount+1;
pgDatos.Cells[0,f+1].Value:= Query1.FieldByName('fecha').AsString;
for i:= 0 to Query1.RecordCount-1 do
begin
pgDatos.Cells[i+1,0].Value:= Query1.FieldByName('cod_vehiculo').AsString+' '+Query1.FieldByName('placa').AsString;
pgDatos.Cells[i+1,f+1].Value:= Query1.FieldByName('recaudacion').AsString;
Query1.Next;
end;
end
else
ShowMessage('La consulta no devolvio datos!!!! ...');
Query1.Close;
Fecha1.Date:= Fecha1.Date+1;
end;
end;

A ver si se entiende...

Lepe 09-04-2007 21:17:31

RecordCount que yo sepa, solo funciona en Bases como paradox, en Interbase no devuelve el valor correcto (por temas de eficiencias).

el bucle:
Código Delphi [-]
for i:= 0 to Query1.RecordCount-1 do

Puede ser sustituido perfectamente por:
Código Delphi [-]
 
query1.Open;
while not query1.eof do
....

end;

Creo que por ahí viene el error, si no es eso, tendrías que añadir en la cláusula "group by mes"... (de esto último no estoy seguro, solo lo intuyo, prueba antes lo del bucle).

Saludos.

robertillo 09-04-2007 23:05:56

gracias Lepe por tu respuesta y perdona tanta idiotez que hice con tanto mensaje duplicado...perdón :eek:

ya probe con el bucle pero me da un error de "gridindex out of range" o algo asi.

Asumo que hay que hacer puros IF para validar cada fila de acuerdo a los datos que se van sacanndo de la base de datos (comparar filas contra info de BD), pero no se como hacerlo, o sea, serían 30 (días del mes) clausulas IF o me estaré volviendo loco?

Saludos.

Lepe 09-04-2007 23:35:07

Pues no sé bien.

Creo que quieres hacer esto:
Código:

      id placa1                id placa2        id placa3
Fecha1 monto1                monto2                  monto3
Fecha2 monto1                monto2                  monto3
Fecha3 monto1                monto2                  monto3

No hace falta "if" de ninguna clase.

Primero, no te guíes de lo que hay en la base de datos para pintar las fechas, Haz una rutina que modifique el Grid y añada tantas filas como días tenga el mes en curso (que puede ser 28 o 29 para febrero, y 30 y 31 para el resto de meses).

para situar un registro en la fila que le corresponde, usa la función DayOf(date:TDatetime) para saber el día, que lo usarás como fila (ya que la fila cero será la fila de los títulos del Grid).

Pide la consulta ordenada por "placa" que supongo será la matrícula del autobús, y entonces puedes guiarte para rellenar toda la columna de datos.

Saludos y espero que sea lo que necesitas.

Lepe 09-04-2007 23:38:13

Cita:

Empezado por robertillo
ya probe con el bucle pero me da un error de "gridindex out of range" o algo asi.

Eso significa que el grid tiene 4 columnas (o filas) y tú intentas escribir en la 5
Usa ColCount y/o RowCount para que no ocurra.

Saludos

robertillo 10-04-2007 03:36:01

Gracias Lepe, te agradezco mucho, me sirvio de mucho tu ayuda, ya me carga el grid bien y los datos de cada dia estan bien.

Ahora nada mas presento eso con un boton que genera un reporte y listo.

GRACIAS.


La franja horaria es GMT +2. Ahora son las 08:44:57.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi