La Web del Programador: Comunidad de Programadores
 
    Pregunta:  30531 - BUSQUEDA EN VISUAL FOX PRO 6
Autor:  Carlos Ojeda
Hola, saludos, quisiera ver si alguien puede ayudarme porque deseo hacer una busqueda en una base de datos de Visual Fox Pro, al momento de capturar los datos los guarda correctamente en la base de datos, pero al buscarlos me dice que el registro no existe, el codigo lo tengo de la siguiente manera:

select articulos
seek carti
if found ()
descr = descripci
pventa = pvent
pcom = pcomp
existen = exisr
stk = stock
falt = fechalt
else
messagebox ("El registro no existe", 48 ,"Almacén")
endif
thisform.refresh

funciona correctamente si el campo indice es de tipo numerico, pero en este caso quiero utilizar como campo indice un campo de tipo caracter y es ahi cuando no lo encuentra siendo que el registro ya se encuentra almacenado en la base de datos, espero entiendan mi pregunta y me puedan ayudar muchas gracias.

  Respuesta:  Toño Fco
A ver si la clave es numerica, no te sirve la funcion alltr, por que esta solo quita espacios en un dato tipo caracter, primero debes checar que el indice y el dato usado para la busqueda sean del mismo tipo, aunque de no serlo te devolvera el VFP un error, en caso de que sea caracter que el indice tenga la misma longitud que el dato buscado, esto es quitando los espacios, no uses locate, mejor usa seek con un indece creado y ordenada la tabla por el saludos y quedo a tus ordenes para cualquier pregunta.

  Respuesta:  Toño Fco
No es optimo usar locate, por el tipo de busqueda que realiza, usa indices y el comando SEEK, de preferencia valida que la clave no tenga espacios con alltrim y que lo que buscas sea no sea mayor al tamaño del campo, sino solo bucscara los caractres que entren en este.

  Respuesta:  jaime martinez
1. verifica si la etiqueta del indice corresponde al campo
2.Si la etiqueta de indice es caracter y estas buscando con variable numerica utiliza allt(carti).
3 crea un indice a la tabla con el mismo tipo de datos que utilizas en el SEEK.

4.
select articulos
set order to XXX &&donde XXX es la etiqueta del mismo tipo de datos.
seek carti
if found ()
descr = descripci
pventa = pvent
pcom = pcomp
existen = exisr
stk = stock
falt = fechalt
else
messagebox ("El registro no existe", 48 ,"Almacén")
endif
thisform.refresh

  Respuesta:  Cristobal Melara
El problema es que cuando a una variable le asignas el valor que se ha dado en un textbox no controlas la longitud de la variable entonces puede darse el caso que siendo texto la longitud de la variable carti sea diferente a la longitud del campo indice.
Trata de probar lo siguiente
select articulos
go top
Locate for allt(carti) = allt(campo_indice)
if found()
....
...

Ojala te sirva