PDA

Ver la Versión Completa : Seleccionar datos para imprimir


Alexandro
17-11-2008, 20:07:29
Hola a todos amigos:
Bueno, me explicaré para que entiendan mi pregunta. Yo tengo un formulario en el que hay un DBGrid que me muestra los resultados de una consulta, un boton en este formulario indica imprimir y me da un reporte que contiene el resultado de la consulta. Ahora bien:
Yo quiero que cuando el usuario de clic en el boton Imprimir se muestre otro formulario con 2 listbox, en el 1ro estarán todos los numeros de identificación(son unicos) y el 2do en blanco, que quiero con esto, que el usuario escoja los registros que el quiera imprimir, los pase al 2 listbox(por medio de otro boton) y luego de en otro boton que diga "Reporte" y se muestren los reportes de los registros que el seleccionó.
Como puedo realizar esto? Espero que me ayuden en esto.
Muhcas gracias y suerte.

coso
17-11-2008, 20:26:24
Hola, puedes recorrer las lineas seleccionadas del dbgrid, añadir en un listbox temporal el campo identificador y lo que necesites, y luego filtrar tu tabla o query segun estos campos en el listbox. Para recorrer el multiselect:


ListBox1.Clear;
for i := 0 to DBGrid1.SelectedRows - 1 do
begin
DBGrid1.datasource.dataset.GotoBookmark(Pointer(DBGrid1.SelectedRows.Items[i]));
ListBox1.Add(DBGrid1.DataSource.DataSet.FieldByName('id').Asstring);
end;

Alexandro
17-11-2008, 21:16:18
Gracias por contestar coso, ya he resuelto lo del multiselect como me digiste, aunque tienes algunos errores. Ahora bien, ya selecionados los que quiero imprimir comp puedo hacer un filtrado a mi tabla? Es paradox7.
Gracias otra vez

coso
17-11-2008, 21:30:59
Gracias por contestar coso, ya he resuelto lo del multiselect como me digiste, aunque tienes algunos errores.


vaya, pues dimelos, pq esto lo saque de un componente dbgrid que uso mucho...mmm ya se, listbox1.items

Si usas alguna query, por ejemplo haciendo 'select * from tabla where id in (' y aqui los ids que previamente has grabado en el listbox, por ejemplo. Si usas filtros tipo bde, entonces, tabla.filter := 'id = ' + listbox1.Items[0] + ' and id = ' + ListBox1.Items[1] + etc... o bien haciendolo de manera automatica dentro de un bucle for. saludos.

Alexandro
17-11-2008, 22:15:00
Hola de nuevo coso:
veras he decidido hacerlo de manera automatica con un bucle For lo ago así:

for I:=0 to LBox_DatosImprimir.Count-1 do
begin
FrmPrincipal.TProveedores.Filter:='No = '+LBox_DatosImprimir.Items[i];
end;
FrmProveedorInforme.Reporte1.DataSet:=FrmPrincipal.TProveedores;
FrmProveedorInforme.Reporte1.Preview;

Sucede que cuando hago el preview me muetra el ultimo registro varias veces aunque yo no lo haya selecionado para imprimir. Este error a que se debe?

Caro
18-11-2008, 00:19:17
Sucede que cuando hago el preview me muetra el ultimo registro varias veces aunque yo no lo haya selecionado para imprimir. Este error a que se debe?

Supongo porque no estas haciendo Filtered := True, ademas aunque lo hicieras solo te va ha filtrar por el ultimo que has seleccionado, ya que no concatenas lo que tienes.


for I:=0 to LBox_DatosImprimir.Count-1 do
begin
if i=0 then
Filtro := '(No = '+LBox_DatosImprimir.Items[i]+')'
else
Filtro :=Filtro + ' AND (No = '+LBox_DatosImprimir.Items[i]+')';
end;
FrmPrincipal.TProveedores.Filter := Filtro;
FrmPrincipal.TProveedores.Filtered := True;
FrmProveedorInforme.Reporte1.DataSet:=FrmPrincipal.TProveedores;
FrmProveedorInforme.Reporte1.Preview;


Aunque lo podías haber hecho con una consulta como te dice coso Select...Where nro in (.....)

Saluditos

Alexandro
19-11-2008, 17:05:15
Hola de nuevo:
MIren, creo que prefiero hacerlo con con Query pero como le digo a la consulta que me devuelva los valores que quiero? Digamos:
SELECT * FROM Proveedores.DB WHERE No IN(:valor1,AND :valor2)
Como le paso los parametros si yo no se la cantidad de parametros que voy a necesitar?

Alexandro
19-11-2008, 17:36:58
Miren este es el codigo que he puesto:

For i:=0 to LBox_DatosImprimir.Count-1 do
if i=0 then
begin
Filtro:=LBox_DatosImprimir.Items.Strings[i];
end
else
begin
Filtro:=Filtro+' AND '+LBox_DatosImprimir.Items.Strings[i];
end;
QConsulta.Close;
QConsulta.SQL.Text:='SELECT * FROM Proveedores.db WHERE Proveedor IN(:valor)';
QConsulta.Params[0].AsString:=Filtro;
QConsulta.Open;
FrmProveedorInforme.Reporte1.DataSet:=QConsulta;
FrmProveedorInforme.Reporte1.Preview;

El reporte se muestra pero solo con el ultimo registro que introduje en la tabla, ni siquiera toma los valores de la consulta. Que pasa aki? Les ruego me respondan, lo estoy necesitando.
Suerte

Caro
19-11-2008, 17:39:22
Hola de nuevo, si no sabes la cantidad de parametros entonces no te conviene utilizar parametros, es mejor que armes la cadena.



Consulta := 'SELECT * FROM Proveedores.DB WHERE No IN(';

Valores := '';
for i:=0 to LBox_DatosImprimir.Count-1 do
begin
if i=LBox_DatosImprimir.Count-1 then
Valores := Valores+LBox_DatosImprimir.Items[i]
else
Valores := Valores+LBox_DatosImprimir.Items[i]+',';
end;

Consulta := Consulta+Valores+')';

Query.Active := False;
Query.Sql.Text := Consulta;
Query.Active := True;


Mas o menos así sería.

Saluditos

Caro
19-11-2008, 17:44:49
El reporte se muestra pero solo con el ultimo registro que introduje en la tabla, ni siquiera toma los valores de la consulta. Que pasa aki? Les ruego me respondan, lo estoy necesitando.
Suerte

Has la prueba con lo ultimo que te pase, el In no necesita And, se debe separar cada valor con una coma "," , ahora también sería bueno que hagas un showmessage de la consulta que se esta armando y pones aquí el resultado que te da ese Showmessage.


Query.Sql.Text := Consulta;
showmessage(Query.Sql.Text);


Saluditos

Alexandro
19-11-2008, 19:47:13
Hola Caro: He hecho cada cosa de la que me digiste y ahora resulta que me da un error que dice:
Invalid use of keyword TOKEN ALE
Ale es un proveedor, no se que puede ser ese error, el parametro text del Query esta bien, lo comprobé con el showmessage.
Sabes que sucede?

Alexandro
20-11-2008, 17:27:01
Caro:
Ya he dado con el problema anterior y era la falta de las comillas dobles("") al yo pasarle el valor a la consulta, ya no me da el error solo que ahora cuando muestra el reporte sale el ultimo registro aunque yo no lo haya seleccionado. Solo se muestra ese registro y los otros no. Porque?

Caro
20-11-2008, 18:47:32
Hola de nuevo, ¿como esta estructurado tu reporte?, lo que también quiero que veas es, si el resultado de tu consulta es correcto, puedes enlazarlo a parte del reporte a un DBGrid y ves si son los registros que has seleccionado, son los que deben salir.

Saluditos

Alexandro
20-11-2008, 21:40:50
Hola Caro:
Bien, ya he puesto un DbGrid y la consulta me la devuelve nula o sea vacia. No se por que hace esto ya que me da los nombres existentes en la tabla.

Caro
21-11-2008, 05:04:37
Hola Caro:
Bien, ya he puesto un DbGrid y la consulta me la devuelve nula o sea vacia. No se por que hace esto ya que me da los nombres existentes en la tabla.

Es porque no esta enconttrando esos registros, revisa bien tu consulta y que los registros con el campo que estas haciendo la busqueda existan en tu tabla.

Saluditos

Alexandro
21-11-2008, 17:59:29
Hola Caro!!!!
Ya he resuelto el problema!!!:)
El Probema estaba en que cuando esto pasa
Consulta:='SELECT * FROM Proveedores.Db WHERE Proveedor IN("';

ahí que ponerle comillas dobles a cada valor y separarlos por comas, entonces quedó así y funciona.

i:integer;
Consulta, Filtro: String;
begin
Consulta:='SELECT * FROM Proveedores.Db WHERE Proveedor IN("';
Filtro:='';
For i:=0 to LBox_DatosImprimir.Count-1 do
if i=LBox_DatosImprimir.Count-1 then
begin
Filtro:=Filtro+LBox_DatosImprimir.Items.Strings[i];
end
else
begin
Filtro:=Filtro+LBox_DatosImprimir.Items.Strings[i]+'","';
end;
Consulta:=Consulta+Filtro+'")';
QConsulta.Close;
QConsulta.SQL.Clear;
QConsulta.SQL.Text:=Consulta;
QConsulta.Open;
FrmProveedorInforme.QuickRep1.DataSet:=QConsulta;
FrmProveedorInforme.QuickRep1.Preview;

Gracias por contestar, me han sido de muchisima ayuda
Suerte y continuen así.:cool: