Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 25-04-2012
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 582
Poder: 17
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
  #2  
Antiguo 25-04-2012
MartinS MartinS is offline
Miembro
NULL
 
Registrado: nov 2011
Ubicación: Villa Cacique - Argentina
Posts: 283
Poder: 13
MartinS Va por buen camino
hola: Antes que nada, actual , creo que debes incluirlo en el SELECT que indicas los campos
Responder Con Cita
  #3  
Antiguo 25-04-2012
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 582
Poder: 17
jafera Va por buen camino
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
Responder Con Cita
  #4  
Antiguo 25-04-2012
MartinS MartinS is offline
Miembro
NULL
 
Registrado: nov 2011
Ubicación: Villa Cacique - Argentina
Posts: 283
Poder: 13
MartinS Va por buen camino
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 )

Saludos
Responder Con Cita
  #5  
Antiguo 26-04-2012
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 582
Poder: 17
jafera Va por buen camino
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
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
DbGrid Modificable Alexita22 OOP 13 28-12-2007 16:15:19
Realizar una consulta sobre los registros que devuelve otra consulta Borjaserrano Firebird e Interbase 12 01-10-2007 23:19:44
Consulta dentro de otra consulta judit25 Conexión con bases de datos 1 25-06-2007 15:52:15
Alguien sabe como hacer que una query sea modificable pjmedina Varios 20 12-04-2007 11:17:27
Como exportar informes Rave a Word "modificable" zerelho Impresión 0 11-01-2006 13:59:11


La franja horaria es GMT +2. Ahora son las 02:29:34.


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
Copyright 1996-2007 Club Delphi