Re: Leer archivo Excel / lectura lenta
Posted: Mon Dec 23, 2019 2:39 am
Hola amigos,
Con el cambio que me comentan al parecer está funcionando el obtener los datos correctamente, pero ahora la duda por qué se se detiene después de leer las primeras 4 filas.
Éste es el código hasta el momento:
Gracias por su ayuda.
Saludos,
Javier
Con el cambio que me comentan al parecer está funcionando el obtener los datos correctamente, pero ahora la duda por qué se se detiene después de leer las primeras 4 filas.
Éste es el código hasta el momento:
Code: Select all
#include "hmg.ch"
#xcommand TRY => BEGIN SEQUENCE WITH {| oErr | Break( oErr ) }
#xcommand CATCH [<!oErr!>] => RECOVER [USING <oErr>] <-oErr->
#xcommand FINALLY => ALWAYS
FUNCTION Main()
LOCAL lastRow
LOCAL oErr, oErrRS
LOCAL oCnn, oRs
LOCAL oExcel, cQry
LOCAL oWorkBook, oHoja, nFilas
LOCAL i
LOCAL codigo, descripcion, costo, precio
LOCAL cTime := Time()
LOCAL numRows
LOCAL numColumns
LOCAL aExcel := {}
LOCAL cEnde
LOCAL nRow
LOCAL j
IF ( oCnn := win_OleCreateObject( "ADODB.Connection" ) ) == NIL
? 'No es posible crear objeto conexión, ' + win_OleErrorText()
RETURN NIL
ENDIF
TRY
oCnn:Open( "Provider=SQLNCLI11;Server=JPARADA\COMPAC;Database=adMI_EMPRESA;Uid=sa;Pwd=sapito;" )
CATCH oErr
? "Error al intentar conectar a la base de datos " + e"\n" + hb_StrToUtf8(oErr:Description)
RETURN NIL
END
//aquí RecordSet
//oRs := win_OleCreateObject( "ADODB.Recordset" )
//
IF ( oExcel := win_oleCreateObject( "Excel.Application" ) ) == NIL
? 'Error: Microsoft Excel no está disponible, ', win_OleErrorText()
RETURN NIL
ENDIF
oExcel:Visible := .F.
oExcel:Application:DisplayAlerts := .F.
oExcel:Application:Workbooks:open( "C:\desarrollo_hmg\actualizar_precios_hmg\lista_precios_2020.xlsx" )
oWorkBook := oExcel:activeWorkBook
oExcel:Application:Worksheets(1):activate()
oSheet := oExcel:Worksheets(1):cells
//oWorkBook:WorkSheets(1):usedRange:Select // ***** ERROR ***** //
//numRows := oWorkBook:workSheets(1):usedRange:Rows:Count
//numColumns := oWorkBook:workSheets(1):usedRange:Columns:Count
numRows := 2091
numColumns := 4
FOR i := 1 TO numRows
AADD( aExcel, Array(numColumns) )
NEXT
cEnde := DataToChr(numColumns)
aExcel := oSheet:Range( "A2:"+cEnde+LTrim(Str(numRows)) ):Value
//? ValtoPrg( aExcel )
FOR j:=1 TO Len(aExcel)
codigo := aExcel [1][j]
descripcion := aExcel [2][j]
costo := aExcel [3][j]
precio := aExcel [4][j]
? 'Registro ' + Alltrim( Str(j) )
? hb_utf8ToStr('Código: ') + codigo
? hb_utf8ToStr('Descripción: ') + descripcion
? 'Costo: ' + str(costo)
? 'Precio: ' + str(precio)
cQry := "UPDATE admProductos SET " + ;
"cprecio1 = " + DataToSQL(precio) + ", " + ;
"cprecio2 = " + DataToSQL(precio) + ", " + ;
"cprecio3 = " + DataToSQL(precio) + ", " + ;
"cprecio4 = " + DataToSQL(precio) + ", " + ;
"cprecio5 = " + DataToSQL(costo) + ", " + ;
"cprecio6 = " + DataToSQL(precio) + ", " + ;
"cprecio7 = " + DataToSQL(precio) + ", " + ;
"cprecio8 = " + DataToSQL(precio) + ", " + ;
"cprecio9 = " + DataToSQL(precio) + ", " + ;
"cprecio10 = " + DataToSQL(precio) + " " + "WHERE ccodigoproducto = " + DataToSQL(codigo)
//MsgInfo( cQry )
QOut( cQry )
//?
//?
//HB_TimeSleep( 0.10 )
/*
TRY
oCnn:Execute( cQry )
CATCH oErrRS
? "Error al actualizar datos en la tabla" + e"\n" + hb_StrToUtf8(oErrRS:Description)
RETURN .F.
END
*/
NEXT
oExcel:Quit()
?
? "Todo OK, Tiempo transcurrido : " + ElapTime( cTime, time() )
?
//cerrar conexión y recordset (si es que utilizamos RecordSet)
oCnn:Close()
oCnn := NIL
// RecordSet
//oRS:Close()
//oRS := NIL
RETURN NIL
/*******/
Saludos,
Javier