Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Impresión (https://www.clubdelphi.com/foros/forumdisplay.php?f=4)
-   -   Seleccionar datos para imprimir (https://www.clubdelphi.com/foros/showthread.php?t=61666)

Alexandro 17-11-2008 20:07:29

Seleccionar datos para imprimir
 
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:

Código Delphi [-]
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

Cita:

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í:
Código Delphi [-]
  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

Cita:

Empezado por Alexandro (Mensaje 326513)
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.

Código Delphi [-]
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:
Código SQL [-]
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:
Código Delphi [-]
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.

Código Delphi [-]
 
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

Cita:

Empezado por Alexandro (Mensaje 326803)
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.

Código Delphi [-]
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

Cita:

Empezado por Alexandro (Mensaje 327073)
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
Código Delphi [-]
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.
Código Delphi [-]
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:


La franja horaria es GMT +2. Ahora son las 10:06:32.

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