Codigo Locate for para dos condiciones ??

1,681 views
Skip to first unread message

Saúl Piña

unread,
Dec 21, 2015, 3:09:33 PM12/21/15
to Comunidad de Visual Foxpro en Español
Buenos dias, 

El codigo siguiente está bien estructurado? 

    SELECT Ventas_Movimientos
    LOCATE FOR
Ventas_Movimientos.idProducto = _idProducto ;
    AND
Ventas_Movimientos.idPrecio == _idPrecio ;
    IF FOUND
()

Tengo duda si así es correcto. 

gracias.

alvarocastellar

unread,
Dec 21, 2015, 3:42:38 PM12/21/15
to Comunidad de Visual Foxpro en Español
Hola. la sentencia esta bien, el problema con el locate es que siempre debes pararte al inicio (go Top) para iniciar la busqueda y que la busqueda es mas lenta que con un Seek

HernanCano

unread,
Dec 21, 2015, 5:39:48 PM12/21/15
to Comunidad de Visual Foxpro en Español
Saúl:
La instrucción luce bien.
¿Qué dificultad tienes?


El lunes, 21 de diciembre de 2015, 15:09:33 (UTC-5), Saúl Piña escribió:

HernanCano

unread,
Dec 21, 2015, 5:47:34 PM12/21/15
to Comunidad de Visual Foxpro en Español
Alvaro:

>>> ... el problema con el locate es que siempre debes pararte al inicio (go Top) ...

No entiendo bien esta apreciación tuya; pero diré que LOCATE se posiciona al inicio (es decir que ejecuta un GO TOP automático si no se usa REST).
Lo que no me cuadra es la expresión "...debes pararte..."; pareciera que estás diciendo que cuando uno va a usar LOCATE, uno tiene que anteponerle GO TOP, lo que no es plenamente cierto dada la experiencia que tengo.

Carlos Miguel FARIAS

unread,
Dec 21, 2015, 6:04:31 PM12/21/15
to Grupo Fox
El LOCATE siempre busca desde el principio, para buscar registros a continuación (igual condición a partir del primero) se debe usar CONTINUE.

SELECT Ventas_Movimientos
    LOCATE FOR 
idProducto = _idProducto AND idPrecio == _idPrecio
    IF FOUND
()

El problema es que después de la última condición, tenías un ; que debería desencadenarte un error de código. Como has seleccionado la tabla, no hace hacer referencia con . a los campos de los mimos, y en el caso de variables de memoria con igual nombre, usas m.nombrevariable.

Otra forma de resolver tu problema (si tuvieras más de un registro) es usar un SCAN

SELECT Ventas_Movimientos
SET ORDER TO TAG xIdProducto && como es una "supuesta" clave primaria debes tener un indice por dicho campo
SET NEAR ON  && Activo posicionamiento cercano.
SEEK idProducto && úbico por indice el registro con clave igual o lo mas parecida
SCAN REST FOR idProducto = _idproducto AND idPrecio = _idPrecio
   NOTE que acá están los registros filtrados
ENDSCAN

Saludos: Miguel, La Pampa (RA)

Larga Prosperidad y Fuerza
Que el acompañamiento les de vida

P.D: Vo'y a tener que dejar de brindar con anticipación.

Elides Paredes

unread,
Dec 21, 2015, 6:13:39 PM12/21/15
to Comunidad de Visual Foxpro en Español
Hola..!
Saludos

Utilizo únicamente locate, nunca he usado un seek, (la diferencia en cuanto a velocidad es despreciable para mí, supongo que por el número de registros, y vengo programando desde hace mas de.. no recuerdo, jejeje.. con clipper), la única diferencia es que pregunto If !eof(), si no llego, entonces la encontró. las condiciones me parecen correctas. ¿que problemas tienes amigo? ah,, y no es necesario definitivamente el go top.


Elides Paredes
Barquisimeto Venezuela

Carlos Miguel FARIAS

unread,
Dec 22, 2015, 5:42:43 AM12/22/15
to Grupo Fox
Correcto Elides, si el proceso es sobre pocos registros, la diferencia de tiempo puede ser despreciable, pero si son muchos, empieza a surgir la diferencia.
Si es para un solo registro, ni siquiera hay que pensar en LOCATE o SEEK.
Si es para más de un registro, el SCAN REST... ENDSCAN, es más rápido que el LOCATE DO WHILE... CONTINUE ENDDO
También depende del tipo de usuario que espera el requerimiento, o si esta busqueda no está dentro de un bucle mayor.
Saludos: Miguel, La Pampa (RA)

mapner

unread,
Dec 22, 2015, 9:38:49 AM12/22/15
to Comunidad de Visual Foxpro en Español
Hola,

un tema importante, VFP usa tecnología Rushmore (índices para optimizar búsquedas y consultas)

Luis Maria Guayan

unread,
Dec 22, 2015, 9:54:16 AM12/22/15
to Comunidad Visual FoxPro en Español
Ya que hablan de Rushmore, un excelente artículo del Profe y Amigo Carlitos Perez (Chaco, Argentina)


-- Visual FoxPro y la optimización Rushmore --

 
Luis María Guayán
Tucumán, Argentina
_______________________________
Comunidad Visual FoxPro en Español

Saúl Piña

unread,
Dec 22, 2015, 10:43:06 AM12/22/15
to Comunidad de Visual Foxpro en Español
Buenos dias, el problema que me aparecía (porque le hice una correccion) es que
al parecer cuando encontraba la primera condicion, me mostraba el dato, pero no respetaba que existe una segunda condicion. y mostraba un registro no deseado.

el codigo es el siguiente:

SELECT Ventas_Movimientos
    LOCATE FOR
Ventas_Movimientos.idProducto = _idProducto ;
    AND
Ventas_Movimientos.idPrecio == _idPrecio
    IF FOUND
()

Como les parece? tuve que agregar un "==" exactamente igual  para que me mostrara el registro a buscar

Jairo Miranda

unread,
Dec 22, 2015, 11:06:01 AM12/22/15
to publicesvfoxpro
usa el ejemplo que viene en la ayuda de fox
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'Data\testdata')
USE customer  && Open Customer table
SET TALK OFF

STORE 0 TO gnCount
LOCATE FOR ALLTRIM(UPPER(customer.country)) = 'GERMANY' 
DO WHILE FOUND( )
   gnCount = gnCount + 1
   ? company
   CONTINUE
ENDDO

? 'Total companies Germany: '+ LTRIM(STR(gnCount))
y puede anidar los locates 
JM

Jose Mario

unread,
Dec 22, 2015, 2:56:08 PM12/22/15
to Comunidad de Visual Foxpro en Español
lo mas conveniente que le agregues
set talk on
hacelo con busquedas acertadas y busquedas erroneas
como quien dice a prueba de fallos

HernanCano

unread,
Dec 23, 2015, 1:11:48 AM12/23/15
to Comunidad de Visual Foxpro en Español
Miguel:

>>> El LOCATE siempre busca desde el principio....

Probablemente no te has dado cuenta de mi comentario.

Te indico:

El LOCATE siempre busca desde el principio si no usas la cláusula REST......

Te cuento, Alvaro, que nno es conveniente desviar el  tema: él pregunta si es correcto o no; no nos pregunta si tiene deficiencias o si debe ser mejorado (no le veo deficiencias ni creo que deba ser mejorado mientras nno sepa qué está  presentando que no le parece al preguntante).


HernanCano

unread,
Dec 23, 2015, 1:29:50 AM12/23/15
to Comunidad de Visual Foxpro en Español
Saúl:

>>> Como les parece? Tuve que agregar un "==" exactamente igual  para que me mostrara el registro a buscar...

Me parece que la información que das es sesgada.
Observo en tu instrucción original que tienes "AND Ventas_Movimientos.idPrecio == _idPrecio". Cuando uno observa un ejemplo así puesto por un colega que "pregunta", considera que el campo idPrecio es numérico, es más pareciera que es Integer.
En cuyo caso el doble igual es indiferente (para campos numéricos).

Pero si --en tu escenario-- estás observando que el registro correcto se obtiene con el doble igual, considero que entonces el campo idPrecio no es numérico sino alfanumérico (character, string)..........
Pero ese doble igual estaba desde el principio... ¿cómo así que lo agregaste?.. El único cambio es que quitaste el punto y coma....que ya te había dicho Miguel.....

HernanCano

unread,
Dec 23, 2015, 1:32:21 AM12/23/15
to Comunidad de Visual Foxpro en Español
Correcto, Jose.
Y tabién estás SET STEP ON, SET DEBUG ON, ASSERTs, etc...

VFP/Fox/xBase es un gran lenguaje que cada uno debería poder aprovechar.
Reply all
Reply to author
Forward
0 new messages