Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Consulta SQL modificable (https://www.clubdelphi.com/foros/showthread.php?t=78507)

jafera 25-04-2012 17:07:17

Consulta SQL modificable
 
Hola a todos.

Tengo la siguiente consulta en un formulario de busqueda:

Código SQL [-]
 
SELECT ID, MARCA, MODEL, CARROSSER, TIPUS, MATRICULA, MATRICULA_2, CODI_ACTUAL FROM BOM0001
WHERE ACTUAL = 'S'
ORDER BY MATRICULA

Esta consulta la modifico con el codigo Delphi siguiente:

Código Delphi [-]
 
procedure TF_BuscarCamio.FormActivate(Sender: TObject);
begin
        DBGridBuscar.Setfocus;
        Sw_1:=0;
end;
procedure TF_BuscarCamio.FormShow(Sender: TObject);
begin
        Edit1.Text :='';
end;
procedure TF_BuscarCamio.ComboBox1Select(Sender: TObject);
begin
        Edit1.Text :='';
        OrdenarGrid.Close;
        If CheckBox1.Checked=True then
        begin
                OrdenarGrid.SQL[2] := 'ORDER BY '+ ComboBox1.Text;
        end
        else
        begin
                OrdenarGrid.SQL[2]:='or actual = ''N''';
                OrdenarGrid.SQL[3] := 'ORDER BY '+ ComboBox1.Text;
        end;
        OrdenarGrid.Open;
        OrdenarGrid.FieldByName(ComboBox1.Text).Index := 0;
        DBGridBuscar.SetFocus;
end;
procedure TF_BuscarCamio.Edit1Change(Sender: TObject);
begin
        try
                OrdenarGrid.Close;
                OrdenarGrid.SQL.Clear;
                OrdenarGrid.SQL.Add('select * from BOM0001 where upper('+Combobox1.text+') like ''%'+AnsiUpperCase(Edit1.Text)+'%''');
                OrdenarGrid.SQL.Add('and actual = ''S''');
                If CheckBox1.Checked=False then
                begin
                        OrdenarGrid.SQL.Add('or actual = ''N''');
                end;
                OrdenarGrid.SQL.Add('order by '+Combobox1.text+', MATRICULA');
                OrdenarGrid.Open;
        except
        end;
end;
procedure TF_BuscarCamio.Edit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
        If Key=219 then
        begin
                Edit1.Text:=Edit1.Text+'''';
                Edit1.SelStart := Length(Edit1.Text);
                Edit1.SelLength := 0;
        end;
end;
procedure TF_BuscarCamio.DBGridBuscarTitleBtnClick(Sender: TObject;
  ACol: Integer; Field: TField);
var
c: string;
begin
        Edit1.Text :='';
        c:=Field.FieldName;
        ComboBox1.Text:=c;
        OrdenarGrid.Close;
        OrdenarGrid.SQL.Clear;
        if Sw_1 = 0 then
        begin
                OrdenarGrid.SQL.Add ('SELECT ID, MARCA, MODEL, CARROSSER, TIPUS, MATRICULA, MATRICULA_2, CODI_ACTUAL FROM BOM0001 where actual = ''S''');
                If CheckBox1.Checked=False then
                begin
                        OrdenarGrid.SQL.Add('or actual = ''N''');
                end;
                OrdenarGrid.SQL.Add ('ORDER BY '+ c + ' ASC');
                Sw_1:=1;
        end
        else
        if Sw_1 = 1 then
        begin
                OrdenarGrid.SQL.Add ('SELECT ID, MARCA, MODEL, CARROSSER, TIPUS, MATRICULA, MATRICULA_2, CODI_ACTUAL FROM BOM0001 where actual = ''S''');
                If CheckBox1.Checked=False then
                begin
                        OrdenarGrid.SQL.Add('or actual = ''N''');
                end;
                OrdenarGrid.SQL.Add ('ORDER BY '+ c + ' DESC');
                Sw_1:=0;
        end;
        OrdenarGrid.Open;
        OrdenarGrid.FieldByName(ComboBox1.Text).Index := 0;
        DBGridBuscar.SetFocus;
end;
procedure TF_BuscarCamio.CheckBox1Click(Sender: TObject);
begin
        try
                OrdenarGrid.Close;
                OrdenarGrid.SQL.Clear;
                OrdenarGrid.SQL.Add('SELECT ID, MARCA, MODEL, CARROSSER, TIPUS, MATRICULA, MATRICULA_2, CODI_ACTUAL FROM BOM0001 where actual = ''S''');
                If CheckBox1.Checked=False then
                begin
                        OrdenarGrid.SQL.Add('or actual = ''N''');
                end;
                OrdenarGrid.SQL.Add('order by '+Combobox1.text+', MATRICULA');
                OrdenarGrid.Open;
        except
        end;
        Edit1.Clear;
end;

procedure TF_BuscarCamio.DBGridBuscarKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
        if Key = VK_BACK then
        begin
                If length(Edit1.Text)> 0 then
                Edit1.Text:=Copy(Edit1.Text,1,length(Edit1.Text)-1);
        end;
        If Key = VK_Escape then
        Close;
        If Key = VK_RETURN then
        BitBtn1.Click;
end;
procedure TF_BuscarCamio.DBGridBuscarKeyPress(Sender: TObject; var Key: Char);
begin
        if Key >= ' ' then
                Edit1.Text:=Edit1.Text+Key;
end;

Recientemente he añadido un CheckBox el cual al enseñar el formulario esta en posición Cheked:=True para que solo filtre por los valores actuales.

Aquí todo funciona perfectamente, cambio los campos de busqueda mediante el ComboBox o el Click en el título y al escribir algo en el edit me muestra que registros contienen ese caracter ej. si escribo 01 me muestra 0001-ABC, B-2011-P, GI-9001-W, y a medida que le voy colocando más carácteres, solo el registro que cumpla la condición.

Cuando cambio el CheckBox a False, no me filtra lo que escribo en el edit de búsqueda, si que me encuentra el registro pero no me muestra solo uno sino que envia el foco a este pero viendo muchos más ej. si escribo 01, veo lo siguiente

0001-ABC
0402-HGH
0514-JJJ

pero con el foco en el 0001-ABC, cuando en el caso anterior si no modifico el CheckBox, acabo viendo solo el registro 0001-ABC

Si alguien tiene alguna sugerencia, pues me haría un gran favor.

Gracias por adelantado.

Saludos

Josep

MartinS 25-04-2012 17:22:53

hola: Antes que nada, actual , creo que debes incluirlo en el SELECT que indicas los campos

jafera 25-04-2012 17:41:58

Gracias

ACTUAL incluido y sigue igual.

Cuando modifico la consulta, si uso las flechas para moverme dentro del grid, se mueven dentro el edit.

Saludos

Josep

MartinS 25-04-2012 23:51:45

Muy bien no entiendo lo que hace el programa como asi tampoco que es lo que necesitas. Solo puedo sugerirte que muestres el texto SQL antes de ejecutarlo para ver si la consulta esta orientada a lo que necesitas.

Código Delphi [-]
ShowModal(OrdenarGrid.SQL.Text)

antes del open (Seguro que ya lo sabes :p)

Saludos

jafera 26-04-2012 09:50:34

Buenos dias.

Problema solucionado, a veces los arboles no nos dejan ver el bosque.

El fallo estaba en la evaluación and-or ya que el or prevalece sobre el and.

Código Delphi [-]
OrdenarGrid.SQL.Add('and actual = ''S''');
                If CheckBox1.Checked=False then
                begin
                        OrdenarGrid.SQL.Add('or actual = ''N''');
                end;
                OrdenarGrid.SQL.Add('order by '+Combobox1.text+', MATRICULA');

La solución ha sido ponerlo así:

Código Delphi [-]
 
procedure TF_BuscarCamio.Edit1Change(Sender: TObject);
begin
        try
                OrdenarGrid.Close;
                OrdenarGrid.SQL.Clear;
                OrdenarGrid.SQL.Add('select * from BOM0001 where upper('+Combobox1.text+') like ''%'+AnsiUpperCase(Edit1.Text)+'%''');
                If CheckBox1.Checked=True then
                begin
                        OrdenarGrid.SQL.Add('and actual = ''S''');
                end
                else
                        OrdenarGrid.SQL.Add('and (actual = ''S'' or actual = ''N'')');
                OrdenarGrid.SQL.Add('order by '+Combobox1.text+', MATRICULA');
                OrdenarGrid.Open;
                DBGridBuscar.SetFocus;
        except
        end;
end;

Funciona al 100%.

Gracias por vuestro interés.

Josep


La franja horaria es GMT +2. Ahora son las 13:48:58.

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