Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 05-09-2011
Avatar de cubanbaker
cubanbaker cubanbaker is offline
Miembro
NULL
 
Registrado: ago 2011
Ubicación: La Habana, Cuba
Posts: 65
Poder: 0
cubanbaker cantidad desconocida en este momento
Ayuda con Locate y Lookup

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
Responder Con Cita
  #2  
Antiguo 05-09-2011
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 2.010
Poder: 20
oscarac Va por buen camino
y podrias colocar el codigo de como estas haciendo el locate?
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita
  #3  
Antiguo 05-09-2011
Avatar de cubanbaker
cubanbaker cubanbaker is offline
Miembro
NULL
 
Registrado: ago 2011
Ubicación: La Habana, Cuba
Posts: 65
Poder: 0
cubanbaker cantidad desconocida en este momento
Aqui esta el codigo. La Tabla la filtro por Sexo en un RadioGroup, asi el DBGrid se filtra segun se seleccione el sexo: Masculino o Femenino. Cuando está filtrada por Masculino y busco un articulo que es Femenino y existe en la Tabla, lo encuentra, pero como el DBGrid solo me esta mostrando los masculinos lo que hace es que el puntero se mueve al articulo masculino mas cercano. Asi hace cuando esta filtrada por Femenino, etc.
Código Delphi [-]
 
procedure TModifyRecurve.BtnBuscarClick(Sender: TObject);
begin
  if Radiogroup1.ItemIndex=0 then {Buscar por ArcherId}
    if DataModule1.TablaRecurvo.Locate('ArcherId',edit1.Text,[]) then
      DataModule1.TablaRecurvo.Locate('ArcherId',edit1.Text,[])
    else
      Showmessage('Archer not found. Check the Archer Id')
  else {Buscar por Apellidos}
    if DataModule1.TablaRecurvo.Locate('Apellidos',edit1.Text,[]) then
      DataModule1.TablaRecurvo.Locate('Apellidos',edit1.Text,[])
    else
      Showmessage('Archer not found. Check the Archer Last Name');
end;

Última edición por ecfisa fecha: 05-09-2011 a las 05:22:16. Razón: ETIQUETAS [DELPHI] [/DELPHI]
Responder Con Cita
  #4  
Antiguo 05-09-2011
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 2.010
Poder: 20
oscarac Va por buen camino
Cita:
Empezado por cubanbaker Ver Mensaje
Código Delphi [-]

procedure TModifyRecurve.BtnBuscarClick(Sender: TObject);
begin
if Radiogroup1.ItemIndex=0 then {Buscar por ArcherId}
if DataModule1.TablaRecurvo.Locate('ArcherId',edit1.Text,[]) then
DataModule1.TablaRecurvo.Locate('ArcherId',edit1.Text,[])
else
Showmessage('Archer not found. Check the Archer Id')
else {Buscar por Apellidos}
if DataModule1.TablaRecurvo.Locate('Apellidos',edit1.Text,[]) then
DataModule1.TablaRecurvo.Locate('Apellidos',edit1.Text,[])
else
Showmessage('Archer not found. Check the Archer Last Name');
end;
Como comentario adicional
si ya localizo lo que buscas ya no es necesario buscarlo nuevamente
Código Delphi [-]
 if DataModule1.TablaRecurvo.Locate('ArcherId',edit1.Text,[]) then

Se traduce en....
SI lo que escribi en el edit esta en la tabla en el campo ArcherId entonces....

ya lo encontraste.. ya no es necesatio

Código Delphi [-]
DataModule1.TablaRecurvo.Locate('ArcherId',edit1.Text,[])
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita
  #5  
Antiguo 05-09-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Tu observación es correcta oscarac , la línea es redundante ya que de encontrarlo vuelve a buscarlo.

Pero esa no es la raíz del problema, ya que si se hace:
Código Delphi [-]
  if ADOTable1.Locate('Campo', Edit2.Text,[]) then
  begin
    ADOTable1.Locate('Campo', Edit2.Text,[]);
    ShowMessage('Encontrado')
  end
  else
   ShowMessage('No encontrado');
O se hace:
Código Delphi [-]
 if ADOTable1.Locate('Campo', Edit2.Text,[]) then
    ShowMessage('Encontrado')
  else
   ShowMessage('No encontrado');
Y el dato a buscar existe en la tabla pero está excluido del conjunto de datos filtrados, en ambos casos mostrará el mensaje 'Encontrado', siendo que no debería hacerlo. Es decir que ignora el filtro en la busqueda.

Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #6  
Antiguo 05-09-2011
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 2.010
Poder: 20
oscarac Va por buen camino
y dime cubanbaker, que tal si haces la busqueda por el codigo y por el sexo? sin necesidad de filtrar la tabla?

Código Delphi [-]
 
if Tabla.Locate('Empresa;KOD', VarArrayOf([_empresa, _Codigo]), []) then

has considerado esa forma?
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita
  #7  
Antiguo 05-09-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por cubanbaker Ver Mensaje
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.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 05-09-2011 a las 12:45:22. Razón: Agregar ejemplo de llamada a la función.
Responder Con Cita
  #8  
Antiguo 08-09-2011
Avatar de cubanbaker
cubanbaker cubanbaker is offline
Miembro
NULL
 
Registrado: ago 2011
Ubicación: La Habana, Cuba
Posts: 65
Poder: 0
cubanbaker cantidad desconocida en este momento
Ecfisa, ya me respondieron. Dicen que "ese es el comportamiento que debe tener el Locate, que NO es un bug de Delphi" y punto, no dijeron mas nada. Parece que les molestó que le encontraras un bug... De todas maneras les envié la forma de cómo tuviste que hacer para que funcionara. Sé que lo tendran en cuenta para proximas ediciones de Delphi.
Gracias!
Responder Con Cita
  #9  
Antiguo 08-09-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola cubanbaker.

Cita:
Sé que lo tendran en cuenta para proximas ediciones de Delphi.
Esperemos que así sea...

Un saludo y gracias por realizar el reclamo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
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
Ayuda Lookup ComboBox Cristalero OOP 4 19-04-2009 16:49:03
ayuda con locate ercrizeporta Varios 2 21-08-2007 17:12:21
ayuda con LOCATE vivamotos C++ Builder 4 27-08-2006 04:40:46
Busqueda con Locate o Lookup noshy Conexión con bases de datos 7 15-05-2006 01:45:02
Locate en un campo lookup amadis Conexión con bases de datos 1 22-12-2005 21:46:52


La franja horaria es GMT +2. Ahora son las 10:35:21.


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