Se me ocurre esto:
1- Debes tener un TAG de índice ya creado en base al apellido. Por ejemplo:
USE MITABLA EXCLUSIVE
INDEX TAG APELLIDOS ON APELLIDOS
2- Debes "filtrar" todos aquellos que coincidan con el criterio a buscar pero SIN USAR el LOCATE. Para este caso debes usar el SET KEY TO. Por ejemplo:
M.ApeBuscar = "ANDRADA" && Para efectos de ejemplo hacemos esta asignación de variable
SET ORDER TO APELLIDOS && Activas el TAG "apellidos" que ya deberías tener creado.
SET EXACT OFF && Desactivas el EXACT
SET KEY TO ALLTRIM(M.ApeBuscar) && Activas el "filtro de registros"
GO TOP && Tratamos de ubicar el primer registro filtrado de "ANDRADA"
IF NOT EOF() && Si no llegó al final de archivo, logró filtrar a los "ANDRADA"
BROWSE FIELDS APELLIDOS,NOMBRES && Visualizamos todos los registros filtrados como "ANDRADA"
ENDIF
SET KEY TO && Para quitar el filtro
3- NO TE OLVIDES de quitar el filtro mediante un SET KEY TO cuando ya no lo necesites.
4- Por otro lado, si de forma "programática" deseas buscar alguien de nombre "CARLOS", entonces donde arriba te puse el BROWSE podrías hacer lo siguiente:
M.ApeBuscar = "ANDRADA"
M.NomBuscar = "CARLOS"
SET ORDER TO APELLIDOS
SET EXACT OFF
SET KEY TO ALLTRIM(M.ApeBuscar)
GO TOP
IF NOT EOF()
LOCATE FOR ALLTRIM(M.NomBuscar) $ NOMBRES
IF FOUND()
M.Conteo = 0
DO WHILE .T.
M.Conteo = M.Conteo + 1
? TRANSFORM(M.Conteo, '999,999'), APELLIDOS, NOMBRE
? "Pulse una tecla para ubicar otro CARLOS ANDRADA o ESC para terminar."
IF INKEY(0,'H') = 27
EXIT
ELSE
CONTINUE
ENDIF
ENDDO
ELSE
ENDIF
SET KEY TO
5- Finalmente, si desearas de una vez ubicar a todos los CARLOS ANDRADA, podrías anidar dentro del SET KEY TO un SET FILTER TO de esta manera:
M.ApeBuscar = "ANDRADA"
M.NomBuscar = "CARLOS"
SET ORDER TO APELLIDOS
SET EXACT OFF
SET KEY TO ALLTRIM(M.ApeBuscar)
GO TOP
IF NOT EOF()
SET FILTER TO ALLTRIM(M.NomBuscar) $ NOMBRES
GO TOP
IF NOT EOF()
BROWSE FIELDS APELLIDOS, NOMBRES
ELSE
? "Habían apellidos ANDRADA, pero ninguno de nombre CARLOS".
ENDIF
SET FILTER TO
ENDIF
SET KEY TO
Yo he usado muy bien esta técnica con hasta medio millón de apellidos y nombres de personas en una tabla con 60 campos. He tenido muy buena velocidad de respuesta (Tablas alojadas en un Servidor ClearOs, 22 estaciones usando las mismas tablas y todas ellas con procesadores INTEL CORE i3 y 4Gb RAM). Pero no tengo idea de como se comportaría con 4 millones de registros y tus condiciones de hardware...
Saludos,