* Importador Para Base de Datos Firebird desde un cursor VFP
*
* Dado un cursor local VFP con la misma estructura de campos que una tabla remota Firebird
* lo importa en el servidor usando Table External File
*
* cArea : Cursor Local
* cTable: Tabla Firebird
* nCon : Conexión ya establecida con BD Firebird
* cDirExt : Directorio del servidor donde se grabará el archivo plano a importar
*
* ej.
* USE C:\DBF\CLIENTES ALIAS CLI IN 0
* nCon = SQLSTRINGCONNECT(.....)
* ImportFBExt('Cli','Clientes',nCon,'C:\DBEXT\')
*
PROCEDURE ImportFBExt
LPARAMETERS cArea,cTable,nCon,cDirExt
LOCAL nF,cSQL,i, cExtFile, cFieldList1, cFieldList2, aFlds[1], cCmd
cExtFile = LOWER(STRTRAN(cDirExt+cArea,'v_',''))+'.txt'
cFieldList1 = ""
cFieldList2 = ""
cSQL = "DROP TABLE "+cTable+"_TXT"
ExecSQL(nCon,cSQL,'',.T.)
SELECT (cArea)
* Crea el comando SQL FB para crear la Table External File
cSQL = "CREATE TABLE "+cTable+"_TXT EXTERNAL FILE '"+cExtFile+"' ( "+CHR(13)
FOR i=1 TO AFIELDS(aFlds)
DO CASE
CASE aFlds[i,2] = "I"
nLen = 11
CASE aFlds[i,2] $ "D"
nLen = 8
CASE aFlds[i,2] = "N"
nLen = aFlds[i,3]
CASE aFlds[i,2] $ "T"
LOOP
OTHERWISE
nLen = aFlds[i,3]
ENDCASE
cSQL = cSQL + aFlds[i,1] +" CHAR("+ALLTRIM(STR(nLen))+") "
cFieldList1 = cFieldList1 + "CaFlds("+aFlds[i,1] + " AS CHAR("+ALLTRIM(STR(nLen))+")) "
cFieldList2 = cFieldList2 + aFlds[i,1]
cSQL = cSQL +", "+CHR(13)
cFieldList1 = cFieldList1 +", "
cFieldList2 = cFieldList2 +", "
ENDFOR
cSQL = LEFT(cSQL,LEN(cSQL)-3)
cFieldList1 = LEFT(cFieldList1,LEN(cFieldList1)-2)
cFieldList2 = LEFT(cFieldList2,LEN(cFieldList2)-2)
cSQL = cSQL +" , "+CHR(13)+" NEWLINE__x__ char(2)"
cSQL = cSQL + ");"+CHR(13)+CHR(13)
* A partir del cursor local genera el archivo plano SDF
cCmd = "COPY FIELDS "+cFieldList2+" TO (cExtFile) SDF" && copio al txt
&cCmd
ExecSQL(nCon,cSQL)
* Creo el comando SQL FB para insertar en la tabla FB destino desde la tabla externa origen
cSQL = "INSERT INTO "+cTable+" ("+cFieldList2+") SELECT "+cFieldList1+" FROM "+cTable+"_TXT;"+CHR(13)+CHR(13)
ExecSQL(nCon,cSQL)
* La correspondencia de tipos es:
* INTEGER como CHAR(11); SMALLINT como CHAR(6); DATE como
* CHAR(8), DECIMAL(8,2) como CHAR(13).
* elimino la tabla externa
cSQL = "DROP TABLE "+cTable+"_TXT "
ExecSQL(nCon,cSQL)
ENDPROC
********************
*
PROCEDURE ExecSQL
LPARAMETERS nCon, cSQL, cArea, lNoCheck
IF !EMPTY(cArea)
nRet = SQLExec(nCon,cSQL,cArea)
ELSE
nRet = SQLExec(nCon,cSQL)
ENDIF
SQLSETPROP(nCon,"Transactions",2)
IF nRet < 1 AND !lNoCheck