Uso de SEEK() en lugar de comando SEEK

6,070 views
Skip to first unread message

Carlos Miguel FARIAS

unread,
Feb 26, 2014, 7:37:05 AM2/26/14
to vfpl...@googlegroups.com
Como comentario para los que están empezando con Fox.
Para buscar en una tabla mediante indice, se dispone de los comandos SEEK y las funciones SEEK(), INDEXSEEK() y KEYMATCH().
Ya desde Fox p/DOS deje de usar el comando SEEK y empecé a usar la función SEEK()
Un comando SEEK solo está completo si tiene un FOUND() después, por lo que implica más código y tiempo de ejecución (no significativo, salvo en un bucle largo).
Para hacer un comando SEEK a una tabla y no tener impacto en el entorno es necesario:
LOCAL lnAreaPrevia, lcIndicePrevio
USE unaTabla IN 0
lnAreaPrevia = SELECT(0) && Guarda Área Previa
SELECT unaTabla
lcIndicePrevio = ORDER() && Guarda Indice en Uso Previo
SET ORDER TO TAG tuIndice
SEEK ...
IF FOUND()
...
ELSE
...
ENDIF
SET ORDER TO TAG (lcIndicePrevio) && Restaura Indice
SELECT (lnAreaPrevia) && Restaura Área

Además SEEK, en algún uso que hice en VFP 5 solía darme error
La función SEEK() además permite, indicar área a la que se accede y etiqueta de indice a utilizar en el SEEK (el comando también permite esos parámetros, pero luego me exige el FOUND(), igualmente, escribirlo en una función implica escribir menos)
Esto permite que con solo abrir la tabla, sin indicar indice activo, y sin seleccionar el área podes ubicar datos en la tabla.
Eso ahorra muchísimas líneas de código para, como se indicó en el ejemplo, guardar área actual, select al área de la tabla donde se busca, guardar índice activo de la tabla, activar índice para buscar, el seek, el found, y luego recuperar índice anterior, recuperar el área anterior).
Además, se puede buscar en la misma tabla por distintos índice sin necesidad de estar activando los índices.
Por ejemplo:
IF SEEK("MARIA", "TuTabla", "xNombre1") OR SEEK("MARIA", "TuTabla", "xNombre2")
...
ENDIF

Para solo controlar la existencia de registros, es mejor INDEXSEEK() con el segundo parámetro en falso, que no mueve punteros.
Saludos: Miguel, La Pampa (RA)

Analyzer

unread,
Feb 26, 2014, 9:25:10 AM2/26/14
to vfpl...@googlegroups.com
Gracias profe Miguel! He visto que algunos dicen que mientras se use un índice, locate da los mismos resultados.

En alguna ocasión vi en un código de Victor Espina ese comando locate y pregunté por qué seguían usándolo si se suponía que un seek (comando o función) era más eficiente. Lamentablemente mi pregunta quedó sin responder entre tantos comentarios del hilo..



Saludos!


--
Has recibido este mensaje porque estás suscrito al grupo "Visual Foxpro Latinoamérica" de Grupos de Google.
Visita este grupo en http://groups.google.com/group/vfplatino.

Daniel Manuel López

unread,
Feb 26, 2014, 11:18:25 AM2/26/14
to vfpl...@googlegroups.com
Estimado Carlos,
En lo personal utilizo el comando SEEK y la función SEEK() en mis programas, para diferentes propósitos.
La Función SEEK() la utilizo para un acceso rápido y directo sobre un índice en particular.
El comando SEEK lo utilizo para un procesamiento en bloque, es decir, si necesito obtener la sumatoria del detalle de una factura y necesito leer sólo los registros de dicha factura, utilizo en comando SEEK para posicionarme en el primer registro y con la ayuda de DO WHILE proceso el bloque requerido. Sé que puedo obtener lo mismo con un SELECT pero se me facilita más usar SEEK y más aún cuando hay que actualizar dichos registros. También por el acceso inmediato cuando tus bases de datos son muy grandes....

        Select    CesionAd_f
        SET     NEAR ON
        SEEK    lcDoc_original
        SET     NEAR OFF

        DO    WHILE ALLTRIM(Num_docto) == lcDoc_original .AND. !EOF()

            Proceso del registro.....
            Skip
        EndDo

Y con este uso me funciona bastante bien....
Saludos

Date: Wed, 26 Feb 2014 08:25:10 -0600
Subject: Re: [VFP Latino] Uso de SEEK() en lugar de comando SEEK
From: thenewin...@gmail.com
To: vfpl...@googlegroups.com

Hernan Cano

unread,
Feb 26, 2014, 12:00:00 PM2/26/14
to vfpl...@googlegroups.com
Amigo analista:

Ya Fernando ha explicado bastante sobre ésto del LOCATE:

El comando LOCATE dejó de ser "ineficiente" luego de la "adición" de Rushmore a VFP, el cual es un método para eficientar comandos internos de VFP y que ahora está presente en MS-SQL Server (da risa decirlo hoy, suena a que es algo nuevo).

Sinceramente no he hecho pruebas, pero tal aseveración no es exclusiva de Fernando, sino de muchos otros gurús.

Carlos Miguel FARIAS

unread,
Feb 27, 2014, 5:37:19 AM2/27/14
to vfpl...@googlegroups.com

El LOCATE esta pensado mas que nada para buscar todas las ocurrencias que cumplen la condición dada, la primera se ubica con el LOCATE y las otras con CONTINUE.
E indefectiblemente lo debo usar si no tengo índice disponible.
El SEEK es para una búsqueda puntual o con un SET NEAR ON (e índice activo) ubicarse cerca del punto donde esta lo mas parecido a lo requerido y luego en bucle barre el resto.
No me gusta (en lo personal) usar WHILE (no debo olvidar el skip ni saltear lo saltando a la siguiente vuelta) y uso un SEEK con un SCAN REST FOR...
Eso implica menor cantidad de lineas de código (mi regla KISS) básica.
Igualmente, el LOCATE/CONTINUE implican poner una sentencia en cada punto para determinar si encontré o no lo requerido.
Con un WHILE tengo que poner un SKIP o CONTINUE, preguntar por fin de datos, lo que no necesito con SCAN.
En un LOCATE tengo que escribir código para ubicar el área o activar indice (y resguardar y recuperar al terminar, índice y área anterior) lo que no requiero con SEEK.
En fin son comandos para circunstancias diferentes.
Como dice el dicho, zapatero a tus zapatos.


Saludos: Miguel, La Pampa (RA)

Analyzer

unread,
Feb 27, 2014, 9:58:16 AM2/27/14
to vfpl...@googlegroups.com
CMF,

Lo que comentaba era el hecho de usar locate con indices. Acabo de ver los resultados de una prueba que hizo Victor Espina y se ve que el seek() es más rápido que todos. Luego esta el indexseek(), locate (con índice) y al final los select-sql.

Gracias por las clases!


Saludos!

Analyzer

unread,
Feb 27, 2014, 9:59:03 AM2/27/14
to vfpl...@googlegroups.com
Perdón.. La prueba la hizo Fernando D. Bozzo, no Victor Espina...


Saludos!

Carlos Miguel FARIAS

unread,
Mar 2, 2014, 10:24:11 AM3/2/14
to vfpl...@googlegroups.com

En el ejemplo que paso frenando, no se ve el uso de indice., a lo mejor en la prueba que hizo en la casa si.
En la prueba de sql, no se ve si des activo los índices. por lo que de no hacerlo, perjudicó la prueba.
Igual sirve como base.
A mi no me preocupan tanto los tiempos si no la simplicidad y portabilidad del código.


Saludos: Miguel, La Pampa (RA)

Reply all
Reply to author
Forward
0 new messages