Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Agregar Varios campos en la sentencia SELECT (https://www.clubdelphi.com/foros/showthread.php?t=39530)

m.ruiz 23-01-2007 11:05:55

Agregar Varios campos en la sentencia SELECT
 
Hola a Todos. Tengo un pequeño problema al hacer una consulta. Os comento:
Tengo una aplicación en la cual el cliente va a poder sacar un informe personalizado con rave. Esto consiste en que tengo un formulario con 10 CheckBoxs. Cada uno de ellos corresponde a los 10 campos que tiene mi tabla. Lo que necesito hacer es que se cree un formulario de impresion con esos campos. Es decir que si el cliente marca 5 campos, el select de mi consulta coja solo esos 5 para mostrarlos.
El problema es que no se como hacer para que en la sentencia select aparezcan esos 5 campos. ya que las combinaciones pueden ser de muy diverso tipo. Por ejemplo:
Si tengo marcado el primero (campo1) y el tercero (campo3), necesito que la consulta sea:
SELECT campo1, Campo3
FROM tabla;
Pero claro, tambien puedo coger el cuarto(campo4), el sexto (campo6) Y el noveno (campo9) y entonces seria:
SELECT Campo4, campo6, campo9
FROM Tabla;
Creo qeu no es muy complicado lo que pretendo, pero no consigo solucionarlo. a ver si alguien me puede echar una mano.
Muchas gracias con antelación. Saludos.

Lepe 23-01-2007 11:35:53

Pues no, lo que si será complejo es crear las cajas en el rave ;)

Código Delphi [-]

var strSelect : TstringList;
begin
 if checkbox1.checked then
    strselect.add('campo1');
 if checkbox2.checked then
    strselect.add('campo2');
 if checkbox3.checked then
    strselect.add('campo3');

query1.sql.text := ' select ' + strselect.commatext + ' from tabla';
query1.open;

Saludos

dec 23-01-2007 11:35:58

Hola,

El asunto puede enfocarse y solucionarse de diversos modos. Así a bote pronto se me ocurre utilizar un "CheckListBox" o "CheckBox", como dices, pero agrupados en un "TGroupBox".

El siguiente código podría darte una idea de cómo iterar por un "CheckListBox", buscar los "Items marcados" e ir conformando la cadena "de los campos" que luego se incluirá en la cadena que contenga la consulta SQL en cuestión:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
  c,s: string;
begin
  c := '';
  for i := 0 to CheckListBox1.Count - 1 do
  begin
    if(CheckListBox1.Checked[i])then
    begin
      if c = '' then
        c := CheckListBox1.Items[i]
      else
        c := c +','+ CheckListBox1.Items[i];
    end;
  end;
  s := Format('SELECT %s FROM tabla', [c]);

  ShowMessage(s);
end;

Y este otro código es similar al anterior, salvo que se utiliza un "GroupBox" y distintos "CheckBox" dentro del mismo, como queda dicho:

Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
var
  i: integer;
  c,s: string;
begin
  for i := 0 to GroupBox1.ControlCount-1 do
  begin
    if(TCheckBox(GroupBox1.Controls[i]).Checked)then
    begin
      if c ='' then
        c := TCheckBox(GroupBox1.Controls[i]).Caption
      else
        c := c +','+ TCheckBox(GroupBox1.Controls[i]).Caption;
    end;
  end;
  s := Format('SELECT %s FROM tabla', [c]);

  ShowMessage(s);
end;

Disclaimer: Fíjate que en este segundo código fuente se asume que en el "GroupBox" sólo habrá "CheckBox"; que no se comprueba si nos topamos con otro tipo de controles, etc. En fin, es sólo para que te hagas una idea de una posible solución para el caso.

richi 23-01-2007 11:41:11

Prueba a ver si te vale lo que pongo a continuacion:
Código Delphi [-]
filtro:= 'SELECT ';

if CheckBox1.Checked then
  filtro:= filtro + 'campo1,';
if CheckBox2.Checked then
   filtro:= filtro + 'campo2,';
if CheckBox3.Checked then
   filtro:= filtro + 'campo3,';
        ......
filtro := Copy(filtro, 1, (length(filtro) - 1));

siendo filtro una variable de tipo string.

A lo mejor hay alguna manera de hacerlo mejor.
Espero que te sirva.

m.ruiz 23-01-2007 12:20:04

Solucionado
 
Muchas gracias!! Esto es exactamente lo que quería hacer.
Como aún me considero principiante, me atasco en cosas como esta, de tan fácil solución. Ahiiii tendré que estudiar más!!!
Un saludo a todos!!!

ContraVeneno 23-01-2007 17:42:09

Que bueno ya lo has solucionado. Sin embargo me gustaría agregar mi comentario.

Para mi sería mucho más sencillo utilizar una TListCheckBox en lugar de CheckBoxes individuales para cada campo. Utilizando un Listcheckbox (como ya recomendó Dec) puedes tener una lista de 10, 30, o 50 campos, sin necesidad de tanto espacio en tu diseño, ni de escribir un If por cada checkbox que quieras comprobar, además, puedes utilizar un StringList para generar la lista de campos automáticamente:

Código Delphi [-]
var i: integer;
Campos: TStringList;

begin; //del método que más te convenga
 Campos:= TStringList.Create;
 for i:=0 to Lista.Items.Count-1 do begin
  if Lista.Checked [i] then begin
   Campos.Add(Lista.items.strings[i]);
  end;
 end;
 showmessage(Campos.CommaText);
 Campos.Free;
end;

Esto lo puedes utilizar para el número de campos que quieras.


La franja horaria es GMT +2. Ahora son las 00:59:17.

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