Para cualquier motor de bd (inclusive dbf) un SELECT de SQL incorporando en el WHERE la clave primaria de la tabla a acceder es equivalente a un SEEK.
Posiblemente, un SEEK sea más efectivo que un SELECT en DBFs (no existe en otros motores), más que nada, porque luego para actualizar los datos, se puede hacer un REPLACE sin condiciones y si usamos un SELECT, luego debemos hacer un UPDATE con la misma condición en el WHERE que pusimos en el SELECT.
Que aplicaría:
Evidentemente para DBFs, es más simple usar un SEEK (la función), con todos sus parámetros (valor busqueda, nombre tabla, nombre índice) ya que eso, lo puedo meter un if y controlo el flujo lógico directamente.
Pero...
Supongamos que se requiere acceder a un registro y modificarlo, si la tabla esta abierta, dejarla abierta en el orden de indice que estaba, y si no dejarla cerrada. En todos los casos, dejar la tabla en uso al momento del proceso, seleccionada (o sea un entorno de trabajo limpio y aislado, lo hecho no afecta el entorno de otros programas procedimientos)
Comparemos:
* Código a lo dbase III
tablaPrevia = SELECT(0)
IF USED(unaTabla)
indicePrevio = ORDER()
SELECT unaTabla
abierta = .T.
ELSE
SELECT 0
USE unaTabla
indicePrevio = 0
abierta = .F.
ENDIF
SET INDEX TO ORDER 1
SEEK cClaveBusco
IF FOUND()
* Aca hago calculos o lo que tengo que hacer si lo encuentro
REPLACE campoReemplazo WITH datoReemplazo
ELSE
WAIT WINDOW "Registro No Esta"
ENDIF
IF abierta && Si estaba abierta, la dejo en el orden previo
SET ORDER TO indicePrevio
ELSE
USE
ENDIF
SELECT (tablaPrevia)
* Código muestra, puede faltar algún paréntesis o algín detalle
* 25 líneas de código
ya con fox (optimizado?)
* Código tipo Fox
cerrada = NOT USED(unaTabla)
IF cerrada
USE unaTabla IN 0
ENDIF
IF SEEK(cClaveBusco, 'unaTabla', 'elIndice')
* Aca hago lo que tengo que hacer si lo encuentro
REPLACE unaTabla.campoReemplazo WITH datoReemplazo
ELSE
WAIT WINDOW "Registro No Esta"
ENDIF
IF cerrada
USE IN unaTabla
ENDIF
* Como no seleccione el área de la tabla, accedo sus datos calificando los campos, no necesito volver a
* seleccionar la tabla que estaba en uso antes de entrar (menos instrucciones).
* Como la tabla, si abierta, no lo modifico el indice en uso, no tengo luego que restaurarlo.
* 14 líneas de código
y usando SELECT de SQL
* Código Fox usando SQL
cerrada = NOT USED(unaTabla)
IF cerrada
USE unaTabla IN 0
ENDIF
SELECT solo, Datos, Necesito FROM unaTabla INTO CURSOR acaTrabajo WHERE campoPrimario=cClaveBusco
IF _TALLY>0
* Aca hago lo que tengo que hacer si lo encuentro
UPDATE unaTabla SET campoReemplazo = datoReemplazo WHERE campoPrimario=cClaveBusco
ELSE
WAIT WINDOW "Registro No Esta"
ENDIF
IF cerrada
USE IN unaTabla
ENDIF
* Como no seleccione el área de la tabla, accedo sus datos calificando los campos, no necesito volver a
* seleccionar la tabla que estaba en uso antes de entrar (menos instrucciones) (igual quen "buen" fox).
* No me tengo que preocupar si hay indices creados o no, igual funciona, el indice mejora el desempeño
* 14 líneas de código
y usando UPDATE directamente (en casos especiales donde el calculo de datoReemplazo lo puedo hacer con una función
* Código Fox usando SQL
cerrada = NOT USED(unaTabla)
IF cerrada
USE unaTabla IN 0
ENDIF
UPDATE unaTabla SET campoReemplazo = <funcion para calcular datoReemplazo) WHERE campoPrimario = cClaveBusco
IF _TALLY == 0
WAIT WINDOW "Registro No Esta"
ENDIF
IF cerrada
USE IN unaTabla
ENDIF
* Como no seleccione el área de la tabla, accedo sus datos calificando los campos, no necesito volver a
* seleccionar la tabla que estaba en uso antes de entrar (menos instrucciones) (igual quen "buen" fox).
* No me tengo que preocupar si hay indices creados o no, igual funciona, el indice mejora el desempeño
* Hay que tener en cuenta que en el UPDATE, tengo disponibles todos los datos del registro de la tabla
* sobre el que hago el remplazo (lo que en el caso anterior denomine "Solo, Datos, Necesito")
* 11 líneas de código
O sea, que en fox, usando SQL, el código puede lograrse soluciones aún más simples que fox puro y no que decir, del uso de fox a lo xbase, que he visto en muchos ejemplos que suelen postearse en foros sobre fox.
saludos: Miguel, La Pampa (RA)