Buscar un registro en una tabla

2,925 views
Skip to first unread message

carlosmtzv

unread,
Oct 21, 2012, 10:15:53 PM10/21/12
to publice...@googlegroups.com
Buenas noches, me estoy iniciando en el manejo de VFP y hay algunas cosas que aun no identifico. Mi duda es la siguiente, como puedo realizar la busqueda de un registro en una tabla?
el siguiente codigo es uno que he intentado pero se va al else y me manda el mensaje pero el registro si existe. Estoy poniendo algo incorrecto? Agradecere su aportacion, gracias!!


set order to 1
seek thisform.C_textbox1.value



if found()

thisform.C_textbox2.value = nombre
thisform.C_textbox3.value = a_paterno
thisform.C_textbox4.value = a_materno
thisform.C_textbox5.value = direccion
thisform.C_textbox6.value = telefono_of
thisform.C_textbox7.value = horario_of

else
 messagebox("no se encuentra")
endif

carlosmtzv

unread,
Oct 21, 2012, 10:47:07 PM10/21/12
to publice...@googlegroups.com
ya encontre la forma, gracias de igual manera.

Edgar Acevedo

unread,
Oct 21, 2012, 10:47:14 PM10/21/12
to publice...@googlegroups.com
Depende del SET EXACT ON

Dado el siguiente ejemplo:

thisform.C_textbox1.value = "Carlos"

y en la tabla el registro que deseas ubicar dice "Carlos     "  en el campo Nombre (asumiendo que eso fuera lo que buscas). Entonces...

SEEK  Thisform.C_TextBox1.Value

Te devolverá:  

VERDADERO, si el SET EXACT está en OFF  (es decir, NO CUENTAN los espacios en blanco)
FALSO, si el SET EXACT está en ON  (es decir, SI CUENTAN los espacios en blanco).

Otra cosa que influye en tus búsquedas con SEEK es el uso de mayúsculas y/o minúsculas.

Mediante la instrucción:

? SET("Exact")

Podrás ver en pantalla si tienes el SET EXACT en ON o en OFF.

Salu2,


Edgar Acevedo.




--
 
 
 

Carlos Miguel FARIAS

unread,
Oct 22, 2012, 7:00:25 AM10/22/12
to publice...@googlegroups.com
Ya que estás aprendiendo aqui algunas cositas para mejorar tu código

La función seek te permite reemplazar el comando SEEK y la función posterior FOUND(), en un solo paso, y evitas siquiera cambiar el indice de la tabla actual, por lo que después reducis la probabilidad de conflicto, porque te queda un indice activo.
Además, si luego hicieras un comando SQL, los indices activos pueden interferir negativamente en el desempeño.

set near on
with thisform
   if seek( .C_textbox1.value, "nombreTuTabla", "nombreIndiceBusqueda)
      if .
C_textbox1.value! = idPrimaria
        
messagebox("Hay uno parecido")
      else
         .C_textbox2.value = nombre
         .C_textbox3.value = a_paterno
         .C_textbox4.value = a_materno
         .C_textbox5.value = direccion
         .C_textbox6.value = telefono_of
         .C_textbox7.value = horario_of
      endif
   else
      messagebox("no se encuentra")
   endif
endwith

Además del cambio en el SET EXACT o SET NEAR (me gusta más este último, porque permite verificar si hay alguno parecido)
Saludos: Miguel, La Pampa (RA)

--
 
 
 

FidelJ

unread,
Oct 22, 2012, 10:56:08 AM10/22/12
to publice...@googlegroups.com
A mi me gusta más INDEXSEEK(), porque puedes hacer una prueba que no mueve el puntero en la tabla buscada. Luego, si la respuesta es positiva, vas al registro.

if !Indexseek( .C_textbox1.value,.F., "nombreTuTabla", "nombreIndiceBusqueda)
      Return
endif
Indexseek( .C_textbox1.value,.T., "nombreTuTabla", "nombreIndiceBusqueda)
Agrego a lo dicho, que tampoco necesitas seleccionar el área de trabajo. 

Carlos Miguel FARIAS

unread,
Oct 23, 2012, 7:06:32 AM10/23/12
to publice...@googlegroups.com
Es otra opción válida, sobre todo si tiene que hacerse un test de existencia.
En la consulta se planteaba acceder para mostrar los datos o para modificar, entonces, con el SEEK() era suficiente.
No he usado indexseek, porque cuando empezo a estar disponible, preferí mover con SQL, aún con nativas, porque luego al migrar a SGBD, solo se "envuelven" las SQL con los comandos de SPT y tenes el reemplazo hecho.
Si tienes un amante, lo importante es que se llame como tu conyuge, no te imaginas los problemas que te ahorras.
Saludos: MIguel, La Pampa (RA)

--
 
 
 

Fox Learner

unread,
Oct 23, 2012, 10:44:22 AM10/23/12
to publice...@googlegroups.com
Si no mal recuerdo.. el comando Seek busca un valor del mismo tipo en la tabla. Es decir, si el dato que estas poniendo en el seek es de un tipo diferente al tipo de datos de la tabla, debes hallar una forma de que haya coincidencia entre el tipo de datos.

Revisa las funciones de conversion de tipo y manipulación de cadenas:

Val, Str, DtoC, CtoD, Transform, Type, IsDigit, IsAlpha, Rtrim, Ltrim, Alltrim, Len, Substr, etc.

Saludos!

Walter R. Ojeda Valiente

unread,
Oct 23, 2012, 3:12:48 PM10/23/12
to publice...@googlegroups.com
Quizás porque tiene complejo de maestro, je.

:-)

Saludos.

Walter.





Date: Tue, 23 Oct 2012 14:28:55 -0300
From: luism...@gmail.com
To: publice...@googlegroups.com
Subject: Re: [vfp] Re: Buscar un registro en una tabla

FoxLearner, por que te esmeras en contestar temas que no dominas y que te respuesta puede confundir a quien realizó la pregunta.

SEEK busca una expresión concordante con la clave del índice activo de la tabla en cuestión

Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________

--
 
 
 


--
 
 
 

Arnaldo Toledano

unread,
Oct 24, 2012, 9:55:31 AM10/24/12
to publice...@googlegroups.com
No Aclares QUE OSCURECE ! ! ! ! !....



Arnaldo Toledano

El 24/10/2012 10:33 a.m., Fox Learner escribió:
Carlos, me explico mejor en lo que te quize decir acerca de los tipos de datos.

Observa este ejemplo con un campo numérico:

store 0 to lnclave
clear
if !used("acreedores")
use acreedores in 0
select acreedores
endif
set order to tag clave
go top
lnclave=270   *  El tipo de dato en la tabla/indice es numérico.
seek lnclave
if found()
regactual=str(recno())
wait window 'clave localizada en el registro: '+ regactual
brow
else
wait window 'no se localizó la clave'
return
endif

return

Ahora este otro con un campo tipo caracter:

store space(20) to lcdepto
clear
if !used("acreedores")
use acreedores in 0
select acreedores
endif
set order to tag depto
go top
lcdepto="EVENTOS"     * El tipo de dato en la tabla/indice es tipo caracter.
seek lcdepto
if found()
regactual=str(recno())
wait window 'clave localizada en el registro: '+ regactual
brow
else
wait window 'no se localizó la clave'
return
endif

return

De otra forma el comando Seek no va a encontrar el dato..

Saludos!

--
 
 
 

--
Arnaldo Toledano Tesys Informática Córdoba Argentina

Fox Learner

unread,
Oct 24, 2012, 10:02:48 AM10/24/12
to publice...@googlegroups.com, arnaldo....@gmail.com
Arnaldo, podrías decirme en qué estoy equivocado en los ejemplos que puse?..

Por cierto, no veo tu aporte en este hilo para aclarar nada al compañero.

Saludos!

extremo

unread,
Oct 24, 2012, 10:30:56 AM10/24/12
to publice...@googlegroups.com
Hay dias en que me rio bastante con algunas respuestas que dan en este grupo ajajajajja son mejores que el clasico "por fin es viernes" jajajajajaja

Bendiciones

Luis Maria Guayan

unread,
Oct 23, 2012, 1:28:55 PM10/23/12
to publice...@googlegroups.com
FoxLearner, por que te esmeras en contestar temas que no dominas y que te respuesta puede confundir a quien realizó la pregunta.

SEEK busca una expresión concordante con la clave del índice activo de la tabla en cuestión

Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________

El 23/10/2012 11:44, Fox Learner escribió:
--
 
 
 

Fox Learner

unread,
Oct 24, 2012, 9:33:54 AM10/24/12
to publice...@googlegroups.com
Reply all
Reply to author
Forward
0 new messages