Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Tablas planas (https://www.clubdelphi.com/foros/forumdisplay.php?f=20)
-   -   reporte desde un DBGrid (https://www.clubdelphi.com/foros/showthread.php?t=58001)

Alexandro 04-07-2008 13:53:22

reporte desde un DBGrid
 
Hola de nuevo:
Me salta una duda en mi programa y es que:
Yo tengo un query que me hace una consulta y me muestra los resultados en un DBGrid, en el formulario donde esta el DBGrid hay 2 botones, uno que dice "mostrar informe de todo" y el otro "mostrar informe de selección". Con el primero no tengo ningún problema, pero con el segungo si.
Lo que quiero es que cuando el usuario haga la consulta y muestre + de 1 resultado el pueda mostrar el informe del que el mismo haya selecionado en el DBGrid. Espero me entiendan bien.
Uso delphi 7 y tabla paradox 7.
Espero que me ayuden.
Gracias y suerte.

Caro 04-07-2008 14:19:59

Hola Alexandro, nose si te he entendido, solo quieres mostrar el reporte cuando haya mas de un registro seleccionado?, si es asi puedes utilizar RecordCount.

Código Delphi [-]
 if Query1.RecordCount>0 then
  mostrarReporte;

Saluditos

coso 04-07-2008 14:55:04

Hola, creo que lo unico que debes hacer es pasarle la query tal cual al reporte (QuickRep1.DataSet := query_filtrada)

Alexandro 04-07-2008 18:38:41

reporte desde un DBGrid
 
Gracias por responder:
Me explico mejor a ver si me entienden. En el formulario hay un DBGrid, 2 botones (Informe todo e Informe selecion), un Query y un DataSource.
Con el boton "Informe todo" no hay problema, yo doy clic ahí y el reporte asume el query y me muestra todos los resultados del query, Eso esta genial. :)Pero donde me trabo es cuando el usuario, de ese resultado que arrojó el query, quiera ver el informe de uno solo, lo selecione y de clic en el boton "Informe selecion":(.
Que debo hacer para hacer eso?
Espero sus respuestas.
Muchas por su atencion y ayuda.
Suerte

juanelo 04-07-2008 18:53:46

Hola Alexandro,
Lo que se podría hacer es que ligues tu query a un ClientDataSet y este a su vez sea el que alimente de datos a tiu grid y a tu reporte. Cuando el usuario seleccione un registro y quieras que el reporte nuestre solamente este, puedes usar la propiedad FilterText para filtrar la el CDS por el campo seleccionado y posteriormente aplicar el filtro con Filtered. De esa manera tu reporte solo mostrará el resultado del filtro.
Saludos

Alexandro 04-07-2008 20:06:17

reporte desde un DBGrid
 
juanelo:
Me gustaría que me explicaras mejor como puedo hacer lo que dices. Es que soy un poco nuevo en esto.
Gracias.

coso 04-07-2008 21:48:18

hola alexandro, como accedes a la base de datos ? con ADO, BDE? con tablas? queries SQL?

saludos

Alexandro 07-07-2008 14:29:42

Hola coso:
Yo acceso a ella por tablas con TTables y TQuerys. Les piedom que me ayuden en esto por favor. Es una de las pocas cosas que me faltan para terminar mi programa.
Gracias.

coso 07-07-2008 14:54:50

Código Delphi [-]
// todos los registros
query1.Active := false;
query1.SQL.Text := 'select * from tabla';
query1.Active := true;

Código Delphi [-]
//los registros con una condicion
query2.Active := false;
query2.SQL.Text := 'select * from tabla where cliente = ''%MI%''';
query2.Active := true;

antes de llamar al preview del quickreport, pones su propiedad dataset a la query q quieras sacar

Código Delphi [-]
 
QuickRep1.DataSet := Query2; // caso filtrado
QuickRep1.Preview;
...
QuickRep1.DataSet := Query1; // caso sin filtrar
QuickRep1.Preview;
...
...
por lo que veo ahora estas hablando de registros seleccionados, supongo que con el multiselect. Entonces debes usar la propiedad SelectedRows para, con sus items, saber que registros se han marcado y construir asi tu query2
Código Delphi [-]
Query2.Active := false;
Query2.sql.text := 'select * from tablas where id = -1 and' 
for i := 0 to DBGrid1.SelectedRows.Count do
Query2.sql.text := ' id = ' + DBGrid1.SelectedRows.Items[i] + ' and';
 
Query2.Active := true;

PD: lo de arriba es pseudocodigo. deberas investigar en el foro o en la ayuda el correcto uso de Selectedrows.

Garry 04-08-2008 07:25:23

También, aunque no lo he examinado detenidamente, veo que esto falla:
[quote=coso;298671]
Código Delphi [-]
Query2.Active := false;
Query2.sql.text := 'select * from tablas where id = -1 and' 
for i := 0 to DBGrid1.SelectedRows.Count do
Query2.sql.text := ' id = ' + DBGrid1.SelectedRows.Items[i] + ' and'; 
Query2.Active := true;

... habiendo que eliminar un AND sobrante:
Código Delphi [-]
Query2.Active := false;
Query2.sql.text := 'select * from tablas where id = -1' 
for i := 0 to DBGrid1.SelectedRows.Count do
Query2.sql.text :=  ' and id = ' + DBGrid1.SelectedRows.Items[i]; 
Query2.Active := true;


No he examinado más. Saludos...

coso 04-08-2008 09:46:08

fe de erratas, faltaba colocar lo anterior

Código Delphi [-]

Query2.sql.text := Query2.sql.Text + ' and id = ' + DBGrid1.SelectedRows.Items[i];

Lepe 04-08-2008 10:28:23

Un detallito: No puedes usar el operador "and" al unir los where, porque ningún registro cumple todas las condiciones.

Te aconsejo recorrer selected rows y que el sql quede así:

Código SQL [-]
select * from mi tabla 
where idCliente in (1, 22, 3, 44, 55)

La forma de obtenerlo desde el grid es muy parecido a lo dicho por coso:
Código Delphi [-]
var ids:string;
begin
ids := EmptyStr;
for i := 0 to DBGrid1.SelectedRows.Count -1 do
begin
  GotoBookmark(pointer(DBGrid1.SelectedRows.Items[i]));
  ids := ids + dbgrid.datasource.dataset.Fieldbyname('idCliente').AsString + ', ';
end;
 delete(ids, length(ids)-1, 1); // borrar ultima coma
 query2.sql.text := 'select * from mi tabla where idCliente in (' + ids + ')';
QuickRep1.DataSet := Query2;

Estoy suponiendo que tu campo clave se llama idCliente y está declarado en la base de datos como entero. Si es un string, debe quedar el sql así:
Código SQL [-]
select * from mi tabla 
where idfactura in ('c00001', 'c00002', 'c00007')
Tip: usa la rutina QuotedStr para entrecomillar cada número de factura.


SAludos


La franja horaria es GMT +2. Ahora son las 23:26:21.

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