Hola amigos.
El siguiente código lo utilizo para seleccionar registros dentro de una tabla contenida en una TDBGrid y situarnos en la primera coincidencia.
Dos controles: edt_TablaBuscar (TEdit) y box_TablaBuscar (TComboBox). Este último con ITems = '','Empieza', 'Contiene', 'Termina'.
A medida que se escribe en edt_TablaBusca se ejecuta edt_TablaBuscarChange y si se cambia la propiedad Item de box_TablaBuscar se ejecuta box_TablaBuscarChage. La variable UltimoCampo contiene el campo por el que se busca. Se asigna a partir del TDBGrid cuando se pincha en titulo.
Código Delphi
[-]procedure edt_TablaBuscarChange(Sender: TObject);
var
f : TDate;
s : String;
begin
inherited;
s := edt_TablaBuscar.Text;
try
tbl_Tabla.Locate( UltimoCampo,
VarArrayOf([ UpperCase(s) ]),
[loCaseInsensitive, loPartialKey] );
box_TablaBuscarChange(Sender);
except
try
f := StrToDate(s); tbl_Tabla.Locate( UltimoCampo,
f,
[loCaseInsensitive, loPartialKey] );
except
end;
end;
end;
procedure TfP__BaseAC_Tabla_B.box_TablaBuscarChange(Sender: TObject);
var
s: string;
begin
inherited;
case box_TablaBuscar.ItemIndex of
0: s := '';
1: s := edt_TablaBuscar.Text + '%';
2: s := '%' + edt_TablaBuscar.Text + '%';
3: s := '%' + edt_TablaBuscar.Text;
end;
s := UpperCase(s);
if box_TablaBuscar.ItemIndex > 0 then
s := '(' + UltimoCampo + ' IS NOT NULL) ' +
'AND ' +
'(UPPER (' + UltimoCampo + ') LIKE ''' + s + ''')';
try
tbl_Tabla.Filter := s;
tbl_Tabla.Filtered := (box_TablaBuscar.ItemIndex > 0);
except
end;
ActiveControl := grd_Tabla;
end;
Hasta aqui todo bien. El código funciona y, aunque estoy pensado en algunas mejoras, no me ha dado problemas a lo largo del tiempo.
Sin embargo adolece de un defecto y es que la tabla debe estar cargada en memoria, lo cual es un proble cuando hay decenas o centenares de miles de registros. Y aquí va la pregunta, ¿cómo prodría hacerse algo parecido pero tirando de la BD directamente?. Es decir, pidiéndole a Firebird que devuelva las fihas que cumplan las condiciones indicadas en cada caso, teniendo en cuenta que debe valer para cualquier tabla y para cualquier campo de ella.
Gracias anticipadas.