Ver Mensaje Individual
  #1  
Antiguo 25-04-2012
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 582
Reputación: 18
jafera Va por buen camino
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
Responder Con Cita