Hola Alexis tenemos varios puntos a tomar en cuenta en tu código que nos envias...
1.- En realidad necesitas
todos (SELECT * ...) los campos de tu tabla de empleados?. Esta comprobado que reducir el numero de columnas que viajarán por el cable (o el aire) ayuda a que la consulta llegue al lado cliente de forma mas rapida y sin saturar la red.
2.- Necesitas tomar en cuenta el tema de parametrización, es sumamente importante en el esquema cliente-servidor que se consulten únicamente los registros que sean necesarios, en tu ejemplo estas haciendo viajar la tabla completa desde el servidor hacia tu cliente, esto es una perdida de tiempo y un desperdicio de recursos de red.
3.- De igual forma, para que quieres un producto cartesiano entre Empleados y Empresas?, no le veo forma de proceso de negocios.
4.- El hacer tu proceso en lote, es decir, bajar toda la información y procesarla después, te llevará a tu problema de inconsistencia de datos, ya que los procesos deberían de ser en linea.
A mi juicio deberías centrarte en optimizar los procesos en línea para que no fueran lentos, en estos momentos acabo de terminar un procedimiento que me calcula el adeudo algún contribuyente, en los casos mas drásticos se tarda 0.078 segundos en procesar todo (tanto la consulta en SQLServer como el procesamiento desde VFP), en una tabla de 160,000 contribuyentes contra otra de 400,000 de avaluos que hay que cotejar. No veo el por que deba de tardarse tanto el tuyo.
>el codigo es el siguienteSTORE SQLSTRINGCONNECT('dsn=conefox;uid=nn;pwd=nn') TO ln_sql
IF ln_sql <= 0
MESSAGEBOX('Imposible Conectar con base de datos Sql',48,'Master Retail')
ELSE
WAIT windows 'Buscando Informacion de Empleados...' nowait
lc_empleados = "select * from empleados order by compania,numep"
= SQLSETPROP(ln_sql, 'asynchronous', .F.)
= SQLEXEC(ln_sql, lc_empleados, 'LC_EMPLEADO1')
lc_emp = "select nombre,codigo,nomenc from empresa"
= SQLSETPROP(ln_sql, 'asynchronous', .F.)
= SQLEXEC(ln_sql, lc_emp, 'LC_EMPrEsa')
ENDIF
SELECT *, cia_autoriza as ciaa from LC_EMPLEADO1 INTO TABLE c:\LC_EMPLEADO
SELECT LC_EMPLEADO1
use
= SQLDISCONNECT(ln_sql)
>este es el codigo que utilizo, revise la estructura de la tabla y el campo mas grande es un char de 30....