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 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
  #5  
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
  #6  
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
  #7  
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
  #8  
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
Si, tienen razon los dos, es redundante como me dicen, solo me di cuenta despues que habia escrito el codigo y despues no sabia como editar el mensaje para arreglarlo. No se pq escribi eso de esa forma, seria que el dia que lo hice tenia el tonto de guardia...no tengo que localizarlo 2 veces... de todas maneras, como dice ecfisa esa no es al raiz dle problema porque la busqueda se hace y el locate ignora el filtro. tendre que hacer como me dices y filtrar por una consulta SQL.
Oscarac, es necesario filtrar por sexo porque el usuario tiene que tener la posibilidad de solo "trabajar" con un sexo determinado pq en determinado momento solo necesitará visualizar los hombres o las mujeres (la base de datos tiene mas de 5000 articulos).
El Lookup tambien ignora el filtro... Eso pensé que seria un bug, pero estoy usando Delphi 2010. Muchas gracias, ya les diré que he hecho y como lo hice.! Saludos desde La Habana.
Responder Con Cita
  #9  
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 probaste la opcion de buscar por el articulo y el sexo a la vez?
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita
  #10  
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
Oscarac, la búsqueda por el código y por el sexo, sin filtrar la tabla, me funciona perfectamente, pero tengo necesidad de filtrarla, el usuario necesita solo ver los hombres o las mujeres en determinado momento y no todos mezclados. Ese es mi problema, que necesito filtrar la tabla y que el Locate no ignore el filtro. Gracias.[/font][/color]
Responder Con Cita
  #11  
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 cubanbaker.

¿ Ya probaste la funcion que te puse en el post #4 ? Corrige el problema del Locate.

Un saludo.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #12  
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
Ecfisa, la funcion me esta dando lo siguiente

BM: TBookMarkStr;
BM:= ADataSet.Bookmark;


Incompatible types: 'AnsiString' and 'TBytes'
Perdona mi ignorancia
Responder Con Cita
  #13  
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
prueba asi
Código Delphi [-]
BM := DataModule1.TablaRecurvo.Bookmark

y despues

Código Delphi [-]
 
DataModule1.TablaRecurvo.Bookmark := BM
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita
  #14  
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
Unhappy

Tuve que modificar el STR del Bookmark

Última edición por cubanbaker fecha: 05-09-2011 a las 17:45:58.
Responder Con Cita
  #15  
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
Smile

PERFECTO! Tu funcion lo hace perfecto, ya reconoce el filtro y me da como si no lo encontrara! Eres un GENIO! Muchas gracias, llevo varios dias en esto y me queria volver loco. Gracias nuevamente.
Responder Con Cita
  #16  
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.

Me alegra que lo hayas solucionado , pero ¿ Que generaba el error Incompatible types: 'AnsiString' and 'TBytes' ?
A mi no me lo generó en ningún momento ( como te dije antes no uso ADO) y no lo encuentro por ningún lado en la web.

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 17:55:05.
Responder Con Cita
  #17  
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
El error lo estaba generando la declaracion de la variable BM como TBookMarkStr. Le quite el STR y lo acepto perfectamente.

Muchas gracias por tu tiempo y tu paciencia conmigo, me has sido de muchisima ayuda!
Responder Con Cita
  #18  
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.

Mira vos, otra más del ADOTable... Con esta ya le descubrimos dos...

Las pruebas las hice con un ADOConnection y la tabla customer de dbdemos.mdb que viene con Delphi (no tenía otra cosa para probar) y me aceptó BookmarkStr sin problemas, ¿ Será el tipo de conexión ?

Ya algún experto en ADO nos sacará de dudas.

Saludos.
__________________
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 18:24:08.
Responder Con Cita
  #19  
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
Será porque uso Delphi 2010?
Una pregunta, cómo puedo reportar a Delphi de esas bugs?, sobre todo la del Locate y de los filtros que ignora?
Responder Con Cita
  #20  
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
Bueno, no soy un experto en el tema, es el primero que descubro , pero supongo que en la página de embarcadero

Aparte el bug lo arrastra de vieja data, yo uso Delphi 7...

Contanos que te responden.

Saludos.
__________________
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 18:19:45.


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