Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Orden by con items de un Listbox!! (https://www.clubdelphi.com/foros/showthread.php?t=37424)

magnu9 13-11-2006 15:42:05

Orden by con items de un Listbox!!
 
Saludo a todos, espero que se sientan todos bien, observen este caso...
tengo en mi form de reporte de clientes, dos listbox, uno en el cual guardo los items por el cual voy a reportar, el otro listbox,
el cual me resibe los items del listbox1, bueno eso de los botones para hacer ese traspaso lo he logrado hacer. Pero mi duda es
como pasar los items del listbox2 al sql para poder ordenar el reporte como lo indique el listbox2.
Este pequeño codigo es solo una muestra de como lo he intentado. Pero me ha sido en vano.
Fuera de lo que es lo del listbox, osea si utilizar los listbox, al qryCliente.Sql.Add, cuando les digo que me ordenes por codcli,
me lo ordena muy bien, pero si coloco nomcli para el orden no hace nada de orde.
Código Delphi [-]
procedure TrpCliente.btnAceptarClick(Sender: TObject);
begin
  
ListBox1.Items[0]:= 'cliente.codcli';
   
   try
   FreportCliente:=TFreportCliente.Create(self);
      if Ordenar.ItemIndex = 0 then begin
         FreportCliente.qryCliente.SQL.Add(' Select  codcli,nomcli,apelcli, dircli, telcli,cedcli, fecha, estado, codzon, facturacredito, balcli, direc_envio From cliente ');
         FreportCliente.qryCliente.SQL.Add(' WHERE cliente.codcli >='''+(edCodigo1.Text)+''' AND cliente.codcli <= '''+(edCodigo2.Text)+'''');
         FreportCliente.qryCliente.SQL.Add('OR (cliente.nomcli LIKE ''%'+edNombre1.Text+''' and cliente.nomcli LIKE ''%'+edNombre2.Text+''')');
         FreportCliente.qryCliente.SQL.Add(' ORDER BY '''+ListBox1.Items[0]+''' deSC');
      
      end
      else  begin
         FreportCliente.qryCliente.SQL.Add(' Select  codcli,nomcli,apelcli, dircli, telcli,cedcli, fecha, estado, codzon, facturacredito, balcli, direc_envio From cliente ');
         FreportCliente.qryCliente.SQL.Add(' WHERE cliente.codcli >='''+(edCodigo1.Text)+''' AND cliente.codcli <= '''+(edCodigo2.Text)+'''');
         FreportCliente.qryCliente.SQL.Add('OR cliente.nomcli='''+edNombre1.Text+''' and cliente.nomcli='''+edNombre2.Text+'''');
         FreportCliente.qryCliente.SQL.Add(' ORDER BY cliente.codcli desc');
      end;
         FreportCliente.qryCliente.Open;
    FreportCliente.Titulo.text := 'Reporte de Cliente';
    
          If Salida.ItemIndex = 0 then FreportCliente.QuickRep1.Preview
           else if Salida.ItemIndex= 1 then FreportCliente.QuickRep1.Print;
      finally
         FreportCliente.Free;
      end;
Espero me entiendan, de lo contrario si lo desean un poco mas detallado solo me escriben. Gracias de Antemano.

oscarnoe 13-11-2006 16:11:42

Hola magnu9,

Cita:

Código Delphi [-]
 FreportCliente.qryCliente.SQL.Add(' ORDER BY '''+ListBox1.Items[0]+''' deSC');

creo que ese entrecomillado puede tener algo de culpa, no estas asignando un valor de texto, estas asignando un nombre de campo, no?

Espero que te sea de ayuda.

Oscar Noe.

Caral 13-11-2006 18:25:18

Hola magnu9
Creo que es asi::rolleyes:
Código Delphi [-]
FreportCliente.qryCliente.SQL.Add(' ORDER BY DESC'''+ListBox1.Items[0]+''');
Por otro lado no entiendo muy bien lo que quieres hacer con los listbox.:confused:
Saludos

magnu9 13-11-2006 18:32:03

Caral dejame explicarte un poquito
 
Es algo que quiere mi tutor de Proyecto III, es que los reportes lleve consigo dos listbox en medio de ellos estos botones" >, <, >>, <<" los cuales me serviran para mudar los campos de un listbox a otro. Y que el contenido del Listbox2 sea por lo que se guie el reporte para ordenarse. Ahora experimentare lo que me dijeron.

Caral 13-11-2006 18:40:06

Hola magnu9
La verdad no trabajo con listbox, ni nada parecido pero tengo entendido que los listbox tienen una propiedad que es copy, asi que puedes copiar de uno a otro, hay varias formas:
1- Puedes crear variables para los items que vas copiando de uno a otro, esto los mantiene en memoria hasta que se impriman.
2- Puedes crear una tabla temporal, pasar los items del listbox1 al 2 grabarlos en la tabla nueva y luego hacer lo que quieras con los datos, imprimirlos para luego borrarlos o mantenerlos con un numero o no se algo asi.
Saludos

magnu9 13-11-2006 18:43:16

Observa esto caral
 
Este codigo es lo que estoy utilizando para copiar de un listbox a otro...

Código Delphi [-]
procedure TrpCliente.btnEnviarClick(Sender: TObject);
begin
    if listbox1.ItemIndex>=0 then
  begin
    listbox2.Items.Add(listbox1.Items[listbox1.ItemIndex]);
    listbox1.Items.Delete(listbox1.ItemIndex);
  end;
END;
procedure TrpCliente.btnTraerClick(Sender: TObject);
begin
   if listbox2.ItemIndex>=0 then
   begin
    listbox1.Items.Add(listbox2.Items[listbox2.ItemIndex]);
    listbox2.Items.Delete(listbox2.ItemIndex);
   end;
end;
procedure TrpCliente.btnEnvTodClick(Sender: TObject);
var m:integer;
begin
   m:=listbox1.Items.Count;
 while m>=1 do
   begin
    listbox1.ItemIndex:=0;
    listbox2.Items.Add(listbox1.Items[listbox1.ItemIndex]);
    listbox1.Items.Delete(listbox1.ItemIndex);
    m:=m-1;
   end;
end;
procedure TrpCliente.btnTraerTodoClick(Sender: TObject);
var n:integer;
begin
  n:=listbox2.Items.Count;
 while n>=1 do
   begin
    listbox2.ItemIndex:=0;
    listbox1.Items.Add(listbox2.Items[listbox2.ItemIndex]);
    listbox2.Items.Delete(listbox2.ItemIndex);
    n:=n-1;
   end;
end;procedure TrpCliente.btnEnviarClick(Sender: TObject);
begin
    if listbox1.ItemIndex>=0 then
  begin
    listbox2.Items.Add(listbox1.Items[listbox1.ItemIndex]);
    listbox1.Items.Delete(listbox1.ItemIndex);
  end;
END;
procedure TrpCliente.btnTraerClick(Sender: TObject);
begin
   if listbox2.ItemIndex>=0 then
   begin
    listbox1.Items.Add(listbox2.Items[listbox2.ItemIndex]);
    listbox2.Items.Delete(listbox2.ItemIndex);
   end;
end;
procedure TrpCliente.btnEnvTodClick(Sender: TObject);
var m:integer;
begin
   m:=listbox1.Items.Count;
 while m>=1 do
   begin
    listbox1.ItemIndex:=0;
    listbox2.Items.Add(listbox1.Items[listbox1.ItemIndex]);
    listbox1.Items.Delete(listbox1.ItemIndex);
    m:=m-1;
   end;
end;
procedure TrpCliente.btnTraerTodoClick(Sender: TObject);
var n:integer;
begin
  n:=listbox2.Items.Count;
 while n>=1 do
   begin
    listbox2.ItemIndex:=0;
    listbox1.Items.Add(listbox2.Items[listbox2.ItemIndex]);
    listbox2.Items.Delete(listbox2.ItemIndex);
    n:=n-1;
   end;
end;

magnu9 13-11-2006 18:45:21

Perdon se copio dos veces el codigo..
 
Ahora si... observa.


Código Delphi [-]procedure TrpCliente.btnEnviarClick(Sender: TObject);
begin
if listbox1.ItemIndex>=0 then
begin
listbox2.Items.Add(listbox1.Items[listbox1.ItemIndex]);
listbox1.Items.Delete(listbox1.ItemIndex);
end;
END;
procedure TrpCliente.btnTraerClick(Sender: TObject);
begin
if listbox2.ItemIndex>=0 then
begin
listbox1.Items.Add(listbox2.Items[listbox2.ItemIndex]);
listbox2.Items.Delete(listbox2.ItemIndex);
end;
end;
procedure TrpCliente.btnEnvTodClick(Sender: TObject);
var m:integer;
begin
m:=listbox1.Items.Count;
while m>=1 do
begin
listbox1.ItemIndex:=0;
listbox2.Items.Add(listbox1.Items[listbox1.ItemIndex]);
listbox1.Items.Delete(listbox1.ItemIndex);
m:=m-1;
end;
end;
procedure TrpCliente.btnTraerTodoClick(Sender: TObject);
var n:integer;
begin
n:=listbox2.Items.Count;
while n>=1 do
begin
listbox2.ItemIndex:=0;
listbox1.Items.Add(listbox2.Items[listbox2.ItemIndex]);
listbox2.Items.Delete(listbox2.ItemIndex);
n:=n-1;
end;
end;

Caral 13-11-2006 18:50:25

No se me parece bien, cual es el problema.?
Saludos

magnu9 13-11-2006 18:58:19

No tengo problema en lo anterior...
 
Solo que me gustaria conocer esto,

1- Puedes crear variables para los items que vas copiando de uno a otro, esto los mantiene en memoria hasta que se impriman.
2- Puedes crear una tabla temporal, pasar los items del listbox1 al 2 grabarlos en la tabla nueva y luego hacer lo que quieras con los datos, imprimirlos para luego borrarlos o mantenerlos con un numero o no se algo asi.

bueno eso lo averiguare..

Y gracias pues ya pude conseguir que en de un campo ya estoy pasandoles un texto. Bueno ahora a intentar conseguir lo que quiero...
Asi lo consegui.

Código Delphi [-]
 if Ordenar.ItemIndex = 0 then begin
         FreportCliente.qryCliente.SQL.Add(' Select  codcli,nomcli,apelcli, dircli, telcli,cedcli, fecha, estado, codzon, facturacredito, balcli, direc_envio From cliente ');
         FreportCliente.qryCliente.SQL.Add(' WHERE cliente.codcli >='''+(edCodigo1.Text)+''' AND cliente.codcli <= '''+(edCodigo2.Text)+'''');
        // FreportCliente.qryCliente.SQL.Add('OR (cliente.nomcli LIKE ''%'+edNombre1.Text+''' and cliente.nomcli LIKE ''%'+edNombre2.Text+''')');
         FreportCliente.qryCliente.SQL.Add(' ORDER BY '+ListBox1.Items[0]+' deSC');

luisgutierrezb 13-11-2006 19:17:22

a ver si entendi bien, quieres ordenar la consulta por los campos que vas a seleccionar o a tener en el listbox2, yo usaria algo asi como:

Código Delphi [-]
Var
  Orden:String;
  I:Integer;
Begin
  // instrucciones
  For I:=0 To Listbox2.Items.Count -1 Do
  Begin
    Orden := Orden + ListBox2.Items[i]
    If I < Listbox2.Items.Count -1 then
      Orden := Orden + ','
  End;
  //Instrucciones
  FreportCliente.qryCliente.SQL.Add(' ORDER BY '+Orden+' deSC');

magnu9 14-11-2006 15:54:22

Observen esto... a ver si me ayuda
 
Observen esto..
Código Delphi [-]
 FreportCliente.qryCliente.SQL.Add(' Select codcli,nomcli,apelcli, dircli, telcli,cedcli, fecha, estado, codzon, facturacredito, balcli, direc_envio From cliente ');


FreportCliente.qryCliente.SQL.Add(' WHERE cliente.codcli >='''+(edCodigo1.Text)+''' AND cliente.codcli <= '''+(edCodigo2.Text)+'''');


Osea si cambio a este codigo..... codcli es el codigo del cliente, nombre_cli nombre del cliente..

Código Delphi [-]
 FreportCliente.qryCliente.SQL.Add(' Select codcli,nomcli,apelcli, dircli, telcli,cedcli, fecha, estado, codzon, facturacredito, balcli, direc_envio From cliente ');
FreportCliente.qryCliente.SQL.Add(' WHERE cliente.NOMCLI >='''+(edNombre1.Text)+''' AND cliente.nombre_CLI <= '''+(edNombre2.Text)+'''');

con codcli todo bien, en cambio con nomcli nada.....

Nota: Con igual nombre si me hace el reporte.

magnu9 18-11-2006 00:04:14

Luego de afanar mucho... Pero con exito..
 
Solo me falta lo que son las fechas... ahhh y trato de buscarlos por sus balance pero me devuelve el error de "imposible conversion de tipo varchar a numerico"

Código Delphi [-]
procedure TrpCliente.btnAceptarClick(Sender: TObject);
//var orden: string;
 var m: integer;
begin
 m:= ListBox2.Items.Count;
  try
   FreportCliente:=TFreportCliente.Create(self);
      if Ordenar.ItemIndex = 0 then begin
         FreportCliente.qryCliente.SQL.Add(' Select  codcli,nomcli,apelcli, dircli, telcli,cedcli, fecha, estado, codzon, facturacredito, balcli, direc_envio From cliente ');
         FreportCliente.qryCliente.SQL.Add(' WHERE cliente.codcli >='''+(edCodigo1.Text)+''' AND cliente.codcli <= '''+(edCodigo2.Text)+'''');
       FreportCliente.qryCliente.SQL.Add('or (cliente.nomcli >='''+edNombre1.text+'%'' AND cliente.nomcli <= '''+edNombre2.text+'%'')');
      // FreportCliente.qryCliente.SQL.Add('or (cliente.balcli >='''+(edBalance1.Text)+'%'' AND cliente.balcli <='''+edBalance2.Text+'%'')');
 
         IF m=0 THEN
         FreportCliente.qryCliente.SQL.Add(' ORDER BY CODCLI DESC');
         IF m=1 THEN
         FreportCliente.qryCliente.SQL.Add(' ORDER BY '+ListBox2.Items[0]+'');
         IF m=2 THEN
         FreportCliente.qryCliente.SQL.Add(' ORDER BY '+ListBox2.Items[0]+','+ListBox2.Items[1]+'');
         IF m=3 THEN
         FreportCliente.qryCliente.SQL.Add(' ORDER BY '+ListBox2.Items[0]+','+ListBox2.Items[1]+','+ListBox2.Items[2]+'');
         IF m=4 THEN
         FreportCliente.qryCliente.SQL.Add(' ORDER BY '+ListBox2.Items[0]+','+ListBox2.Items[1]+','+ListBox2.Items[2]+','+ListBox2.Items[3]+'');
      end

Lepe 18-11-2006 12:24:31

Sugerencia: añadir los "else" en las comparaciones if m=0 then ... else if m=1 then ..

Si m es igual a cero, después debe comprobar que m es distinto de 1,2,3 y 4 ya que no están anidados los "if". Si añades los "else", solo realizará una comprobación (m igual a cero) y después se salta los demás "else".

Saludos

Guti13 20-11-2006 12:08:05

Sugerencia
 
Magnu9 yo te recomendaría que hiciese lo siquiente que creo es mas claro y limpio en cuanto al código:

If listBox2.Items.Count>0 Then
Begin
Consulta.SQL.Add('Order by '+ListBox2.Items.CommaText)
End

fedelphi 20-11-2006 13:37:32

hola magnu9, con que DB estas trabajando?

magnu9 20-11-2006 18:55:35

Saludo...
 
Bueno agregare los Else, me parece averlo intentado pero se me erreda un poquito, Guti lo tuyo tambien no cuesta nada inetentarlo, disculpa que en otras ocasiones tambien me lo recomendaron, lo q no intente porque estaba ensima de la entrega de una parte del sistema.gracias por sus sugerencias..
Ahora tengo un poquito de tiempo.

La base de datos por el momento es Sql Server 2000, pero me gustaria mas que nada Postgres. No es que no lo he intentado, solo que al principiono entendia bien ese tipo de base, pero a medida que estoy trabajando con sql server me doy cuenta que no es nada complicado.

A una pregunta porque Sql server no tiene tipo Boolean...

Gracias por sus ayuda.


La franja horaria es GMT +2. Ahora son las 12:47:44.

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