Cuidado! Si tenes un indice estructural, SET ORDER TO 0 lo desactiva a los efectos del acceso, pero sigo "abierto" para inserciones y modificaciones. Cuando se hacen inserciones a granel, lo conveniente es borrar el cdx, y luego recrearlo.
En el código que pasastes, cosas que debes desechar
Nunca selecciones el area de una tabla con SELECT numerodearea, siempre referenciate con SELECT nombredetabla.
Cuando haces un USE tabla conviene usar toda la sintaxis de ese comando para ahorrar lineas de codigo (lo que se hace mas claro por simplicidad)
USE tabla IN 0 ORDER TAG tuIndicePreferido ALIAS aliasParaTuTabla AGAIN SHARED
porque?
IN 0 te abre la tabla en alguna area libre (esto debería ir siempre, evitas cerrar accidentalmente otra tabla)
ORDER TAG activa directamente un indice para acceder u ordenar (esto solo si es el unico acceso que haras y no usaras tambien SELECT , sobre la tabla).
SHARED, si es compartida, EXCLUSIVE si es para mantenimiento (PACK, INDEX ON, REINDEX, etc.)
ALIAS sirve para manejar un nombre de tabla diferenciado, si por alguna razón necesitas tener la misma tabla abierta mas de una vez por las razones que tu aplicación requiera, esto evita superposiciones de nombres (aca agregar AGAIN, de nuevo)
Esto último es interesante si a la tabla de clientes (p.e.) la quieres acceder al azar id cliente y visualizarla por nombre de cliente.
Entonces:
USE Clientes IN 0 ORDER TAG xId ALIAS ClientesAzar AGAIN SHARED
USE Clientes IN 0 ORDER TAG xNombre ALIAS ClientesLista AGAIN SHARED
no tenes que preocuparte donde se abren (IN 0) y cada cual tiene su indice activo independiente (ORDER TAG), el ALIAS para poder diferenciarlas después, en este caso AGAIN y SHARED son obligatorios
Alguno podra decir que el shared lo simplifica con SET EXCLUSIVE OFF, pero esto último, donde lo pusiste, con SHARED lo tenes documentado AHI.
La grilla la asocias con ClientesLista (y visualizas en orden de nombre) y los acceso al azar los haces con ClientesAzar (y no de te cambia la posición en la grilla).
Ahora, para acceder al azar, personalmente, uso toda la potencia de la función SEEK
con SEEK( valorABuscar, "nombreTabla", "rotuloIndice" ) de esa manera no necesito hacer un SET ORDER TO previo o activar el indice al abrir, es más, podrìa tener otro indice activo en la tabla sin tener que desactivarlo.
No necesito posicionarme en el area de la tabla a acceder con el seek y podría acceder a la tabla por distintos indices sin intercalar los SET ORDER TO respectivos.
Esto tiene la ventaja además que me ahorra tener que desactivar el indice (SET ORDER TO 0) al momento de hacer un SELECT de SQL sobre la tabla (que comente en otro hilo, pone mas lento el rushmore).
O sea que usando bien la expresividad de cada función que nos da vfp, escribimos mucho menos, y eso hace el programa más ràpido, màs pequeño, más documentado, con menor probabilidad de una parte afecte otras partes, etc.
Muchas veces, la solución de muchas cosas, esta a un F1 de distancia
Saludos: Miguel, Santa Rosa (LP)