Obtener última fila datos Excel

HMG en Español

Moderator: Rathinagiri

Post Reply
jparada
Posts: 430
Joined: Fri Jan 23, 2009 5:18 pm

Obtener última fila datos Excel

Post by jparada »

Hola,

Estoy tratando de leer un archivo de lista de precios en Excel para actualizar una tabla de una base de datos, el código para leer el archivo Excel lo tomé de este mismo foro; donde tengo problemas es en obtener la fila hasta la cual debe leer el programa, es decir hasta el final de la lista de precios.

Con lo que leí aún no puedo obtener lo que se requiere ya que me indica un número de fila muy alejado de lo que corresponde, también si alguno me de ustedes me puede ayudar, no logro ver por qué el código en ocasiones funciona sin problema y en otras marca error de método no encontrado etc.

Aquí el código:

Code: Select all

procedure main
   
  DEFINE WINDOW Form_Main ;
    AT 0,0 ;
    WIDTH 400 ;
    HEIGHT 200 ;
    MAIN NOMAXIMIZE NOSIZE ;
    TITLE 'Actualizar precios venta'

      DEFINE BUTTON Button_1
        ROW    10
        COL    10
        CAPTION "Seleccionar archivo lista precios (Excel)"
        ACTION ExcelTest()
        WIDTH 280
	      HEIGHT 27 
      END BUTTON
  END WINDOW

  CENTER WINDOW Form_Main
  ACTIVATE WINDOW Form_Main

return

/*
*
*/
function ExcelTest
  local oExcel, oCnn, cReadData, cQry

  cReadData := Getfile( { {'Archivos Excel','*.xls'} } , 'Seleccionar archivo' )

  if Empty( cReadData )
    MsgBox( "No seleccionó archivo" )
    return
  endif

  if ( oCnn := win_OleCreateObject( "ADODB.Connection" ) ) == NIL
    MsgStop( 'Error de conexión: [' + win_oleErrorText() + ']'  )
    return NIL
  else
    oCnn:Open( "Provider=SQLNCLI11;Server=127.0.0.1\MyServer;Database=MyBD;Uid=MyUser;Pwd=MyPass;" )
  endif

  if ( oExcel := win_oleCreateObject( 'Excel.Application' ) ) == NIL
    MsgStop( 'Error: Microsoft Excel no está disponible. [' + win_oleErrorText() + ']' )
    return NIL
  endif

  oExcel:Workbooks:Open( cReadData ) 
  oExcel:Visible := .T.

  //Determine Last Cell At This Point
  //lastRow = oExcel:WorkSheets(1):UsedRange:ROWS:COUNT
  //lastrow = oExcel:WorkSheets(1):UsedRange:Row - 1 + oExcel:WorkSheets(1):UsedRange:Rows:Count
  //MsgBox( LastRow )

  for i = 2 to 12
    codigo := oExcel:WorkSheets(1):cells(i,1):value
    precio_publico    := oExcel:WorkSheets(1):cells(i,3):value
    Precio_contado    := oExcel:WorkSheets(1):cells(i,4):value
    precio_taller     := oExcel:WorkSheets(1):cells(i,5):value
    precio_distribuidor := oExcel:WorkSheets(1):cells(i,6):value

    /*
    MsgBox( Valtype( codigo ) )
    MsgBox( Valtype( precio_publico ) )
    MsgBox( Valtype( Precio_contado ) )
    MsgBox( Valtype( precio_taller ) )
    MsgBox( Valtype( precio_distribuidor ) )
            
    MsgBox( codigo )
    MsgBox( precio_publico )
    MsgBox( precio_contado )
    MsgBox( precio_taller )
    MsgBox( precio_distribuidor )
    */
    cQry := "UPDATE admProductos SET " + ;
            "cprecio1 =" + DataToSql( precio_publico ) + ", " + ;
            "cprecio2 =" + DataToSql( precio_contado ) + ", " + ;
            "cprecio3 =" + DataToSql( precio_taller  ) + ", " + ;
            "cprecio4 =" + DataToSql( precio_distribuidor ) + " " + ;
            "WHERE ccodigoproducto =" +  DataToSql( codigo )

    //MsgBox( cQry )
            
    oCnn:Execute( cQry )
  next
  
  MsgInfo( "Proceso Terminado..." )
  Form_Main.Button_1.Enabled := .f.
 
  oExcel:Quit()
  oCnn:Close() // cierra conexión
return
Agradezco cualquier ayuda.

Saludos,
Javier
Post Reply