Hola, tengo una función que toma un excel y lo convierte a cursor de 
fox via ODBC.

Esta funciona correctamente en los siguientes entornos:
windows 7 con office instalado
windows 2k3 con AccessDatabaseEngine2010 instalado

pero no me funciona con w2k8 y AccessDatabaseEngine2010 instalado.

El error es "el origen de datos para este objeto debe ser una 
referencia a variable"

y este es la función que uso:

FUNCTION excelACursor
LPARAMETERS lcXLBook as String, lcSheet as String, lcCursor as String 
LOCAL lcXLBook AS STRING, lnSQLHand AS INTEGER, ;
    lcSQLCmd AS STRING, lnSuccess AS INTEGER, ;
    lcConnstr AS STRING

SET NULLDISPLAY TO ''

lcSheet  = '[' + lcSheet + '$]'

lcCursor = 'cur' + lcCursor

lcConnstr = [Driver=] + ;
    [{Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};] + ;
    [DBQ=] + lcXLBook

IF !FILE( lcXLBook )
    MESSAGEBOX('No se encontro el archivo Excel ' + lcXLbook + '.  ', 
16,'')
    RETURN .F.
ENDIF

lnSQLHand = SQLSTRINGCONNECT( lcConnstr )
IF lnSQLHand <= 0                       && agrego = 0 ** 18/03/2015
        MESSAGEBOX('No se pudo establecer la conexión con el archivo 
Excel '+ lcXLbook + '.  ', 16,'')
        RETURN .F.
ENDIF 

lcSQLCmd = [Select * FROM ] + lcSheet
lnSuccess = SQLEXEC( lnSQLHand, lcSQLCmd, [xlResults] )
IF lnSuccess <= 0
        LOCAL ARRAY laErr[1]
    AERROR( laErr )
        MESSAGEBOX( 'No se pudo extraer datos del 
archivo.'+CHR(13)+'Error: ' + laErr(3),16,'')
    SQLDISCONNECT( lnSQLHand )
        RETURN .F.
ENDIF

*** Transformo memo en string
SELECT xlResults
cSql = ""
= AFIELDS(aFlds)
FOR i = 1 TO ALEN(aFlds,1)
        cSql = cSql + IIF(EMPTY(cSql),"",",") + IIF(aFlds[i,2]='M', 
"LEFT(" + aFlds[i,1] + ",50) "+ aFlds[i,1], aFlds[i,1])
ENDFOR
***
SELECT &csql FROM xlResults INTO CURSOR &lcCursor READWRITE 
USE IN xlResults
SELECT &lcCursor 
SQLDISCONNECT( lnSQLHand )
RETURN .t.

Alguna idea que puede ser?

Gracias, saludos


Responder a