Cita:
Empezado por cubanbaker
Hola a todos.
Tengo un DBgrid asociado a un ADOTable. Cuando filtro la tabla por sexo y uso Locate o Lookup, aunque solo muestre los del sexo masculino (porque los he filtrado) el locate o el lookup me sigue encontrando el articulo aunque no se muestra en el DBgrid pq esta filtrado (en este caso Femenino) y el puntero se mueve a la fila mas cercana.
Deberia no encontrar el articulo que estoy buscando si el sexo es Femenino, porque tengo la tabla filtrada a sexo Masculino, pero me dice que lo encuentra a pesar de ser femenino y se cambia la fila activa al mas cercano.
Mas claro, el locate o el Lookup no respeta el filtro que le he puesto a la base de datos.
Que pudiera estar sucediendo?
Muchas gracias
|
No uso los componentes ADO y lo que leía arriba me parecía ilógico hasta que hice la prueba y obtuve los mismos resultados que vos.
No encontré documentación que explique o documente este problema, según mis pruebas, el
TADOTable filtrado no funciona bién con
Locate. Pareciera que para realizar la búsqueda ignora el filtrado y lo hace sobre la tabla completa.
El resultado que obtuve es que: Si el dato enviado no existe en la tabla devuelve falso sin realizar acción alguna como corresponde. Pero si el dato pertenece a la tabla y no al conjunto filtrado, devuelve verdadero y se posiciona en el próximo registro.
Ese es un comportamiento que no he detectado antes con otros componentes como
TIBTable,
TSQLTable o
TTable. Por lo que pareciera ser un bug. (al menos con Delphi 7)
Una posible solución es hacerte una función donde verifiques el dato buscado a la salida de
Locate y de no coincidir restaurar la posición y devolver False, reemplazando el uso de
Locate por ella:
Código Delphi
[-]
function MyLocate(ADataSet: TDataSet; FName, SData: string): Boolean;
var
BM: TBookMarkStr;
begin
BM:= ADataSet.Bookmark;
Result:= ADataSet.Locate(FName, SData,[]) and
(ADataSet.FieldByName(FName).AsString = SData);
if not Result then
ADataSet.Bookmark:= BM;
end;
Llamada de ejemplo:
Código Delphi
[-]
if MyLocate(DataModule1.TablaRecurvo, 'ArcherId', Edit1.Text) then
....
Pero sinceramente creo que sería mucho más eficiente filtrar por una consulta SQL.
Un saludo.