abrir tabla en una carpeta que no esta en el servidor
Supuestamente tendrás una tabla de detalle en tu base de datos (obviamente compartida). Si lo que pretendes es llenar esa tabla con datos, lo puedes hacer de varias maneras, pero nunca necesitas una tabla local:
1) Usar la misma tabla con set multilocks ON, buffering 5 y TableUpdate() al momento de confirmar.
2) Usar un cursor con la estructura de dicha tabla, llenarlo y luego actualizar la tabla en base a los datos del cursor.
2.1 ) Crear el cursor. supongamos que la tabla de detalle se llama "fact_detalle" (generalmente lo haces en el Load del formulario de facturas).
SELECT * FROM FAC_DETALLE WHERE .F. INTO CURSOR MIDETALLE READWRITE
2.2) Llenar el cursor de detalle "MiDetalle" con el mecanismo que fuere
2.3) Agregar los datos del cursor MiDetalle a la tabla "Fact_detalle"
INSERT INTO FAC_DETALLE SELECT * FROM MiDetalle
UNLOCK IN FAC_DETALLE
FLUSH
2.4) Limpiar el cursor:
SELECT MiDetalle
ZAP
Thisform.grdDetalle.refresh && suponiendo que hay un control Grid llamado "grdDetalle".
La ventaja del cursor así creado es que no necesitas tener (ni mantener) una tabla local. Te evita el problema de controlar la estructura de la tabla local si cambió la tabla de destino y trabaja en el directorio temporal de windows.
La única prevención con los cursores es que no puedes utilizar el comado PACK. Para eliminar los datos directamente utiliza ZAP.
Por otra parte, si necesitas poner en el cursor campos que no estan en la tabla (para información del usuario o para coordinar otras operaciones, lo debes hacer al crear el cursor:
SELECT *,SPACE(40) AS NOMBRE,CAST(0 as N(12,2)) as sumas, .F. AS INCLUYE FROM Fac_Detalle WHERE .F. INTO CURSOR MIDETALLE READWRITE
Con esto has agregado 3 campos al cursor creado (Nombre,Sumas e Incluye).
En este caso no puedes utilizar el INSERT SQL como en el ejemplo 2.3) porque te dará un error. Tienes dos alternativas: o indicas los campos que se actualizan o utilzas SCAN / ENDSCAN con SCATTER / GATHER
SELECT MIDETALLE
SCAN
SCATTER TO laDatos
INSERT INTO FACT_DETALLE FROM ARRAY laDatos
ENDSCAN
UNLOCK IN FAC_DETALLE
FLUSH
* Limpiar el cursor
SELECT MIDETALLE
ZAP
Nota:
También funcionaría
SELECT FACT_DETALLE
APPEND FROM DBF("MIDETALLE")
Pero hay que tener en cuenta que el append from bloquea la cabecera de la tabla y no resulta apropiado en una lógica de control de errores como TRY CATCH ENDTRY
En Clipper tampoco era necesario (ni recomendable) tener esa tabla local, aunque su generación en tiempo de ejecución resultaba algo más trabajosa.