From 3eacb20a7e33a4a8a51201e6207e270667377f25 Mon Sep 17 00:00:00 2001 From: Antonio Gonzalez Date: Mon, 26 Aug 2019 13:24:43 -0500 Subject: [PATCH] alternativa para leer excel implementada en SaldosIniciales --- General/SaldosIniciales.aspx.vb | 159 ++++++++++++++++++++++---------- 1 file changed, 111 insertions(+), 48 deletions(-) diff --git a/General/SaldosIniciales.aspx.vb b/General/SaldosIniciales.aspx.vb index 8997c6309..791688bc0 100644 --- a/General/SaldosIniciales.aspx.vb +++ b/General/SaldosIniciales.aspx.vb @@ -5,6 +5,8 @@ Imports System.Data Imports Extensiones Imports System.Xml Imports Microsoft.Reporting.WebForms +Imports GemBox.Spreadsheet + Partial Class General_SaldosIniciales Inherits ClsPaginas Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load @@ -28,41 +30,44 @@ Partial Class General_SaldosIniciales Dim Conexion As Odbc.OdbcConnection = Nothing Dim ErrorArchivo = False Dim ErrorExcel = False - Dim strConnString As String = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + Ruta + FileName + ";Extended Properties=""Excel 12.0 Xml;HDR=YES;IMEX=1;""" - Dim objDbFactory As Common.DbProviderFactory = Common.DbProviderFactories.GetFactory("System.Data.OleDb") - Dim objDbAdapter As Common.DbDataAdapter = objDbFactory.CreateDataAdapter() - Dim objDbConnection As Common.DbConnection = objDbFactory.CreateConnection() - objDbConnection.ConnectionString = strConnString - objDbConnection.Open() - Dim objSheetNames As DataTable = objDbConnection.GetSchema("Tables") - Dim HojaExcel As String = objSheetNames.FiltroPrimeroValor("TABLE_NAME") - Try - Select Case Tipo - Case "CSV" - Conexion = New Odbc.OdbcConnection("Driver={Microsoft Access Text Driver (*.txt, *.csv)};Dbq=" + Ruta + ";Extensions=asc,csv,tab,txt;") - Conexion.Open() - Dim cmd = Conexion.CreateCommand() - cmd.CommandType = CommandType.Text - cmd.CommandText = $"SELECT * FROM [{FileName}]" - Dim DataAdapter = New Odbc.OdbcDataAdapter(cmd) - DataAdapter.Fill(dt) - Case "EXCEL" - Conexion = New Odbc.OdbcConnection("Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=" + Ruta + FileName + ";") - Conexion.Open() - Dim cmd = Conexion.CreateCommand() - cmd.CommandType = CommandType.Text - cmd.CommandText = $"SELECT * FROM [{HojaExcel}]" - Dim DataAdapter = New Odbc.OdbcDataAdapter(cmd) - DataAdapter.Fill(dt) - Case Else - Alert("El archivo no tiene el formato correcto", TipoMensaje.MsgError) - Exit Sub - End Select - Catch ex As Exception - ErrorArchivo = True - OnError("Ocurrio un error al leer el archivo
" & ex.Message, ex) - End Try - Conexion.Close() + + dt = ReadExcelFile(Ruta + FileName, True) + + 'Dim strConnString As String = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + Ruta + FileName + ";Extended Properties=""Excel 12.0 Xml;HDR=YES;IMEX=1;""" + 'Dim objDbFactory As Common.DbProviderFactory = Common.DbProviderFactories.GetFactory("System.Data.OleDb") + 'Dim objDbAdapter As Common.DbDataAdapter = objDbFactory.CreateDataAdapter() + 'Dim objDbConnection As Common.DbConnection = objDbFactory.CreateConnection() + 'objDbConnection.ConnectionString = strConnString + 'objDbConnection.Open() + 'Dim objSheetNames As DataTable = objDbConnection.GetSchema("Tables") + 'Dim HojaExcel As String = objSheetNames.FiltroPrimeroValor("TABLE_NAME") + 'Try + ' Select Case Tipo + ' Case "CSV" + ' Conexion = New Odbc.OdbcConnection("Driver={Microsoft Access Text Driver (*.txt, *.csv)};Dbq=" + Ruta + ";Extensions=asc,csv,tab,txt;") + ' Conexion.Open() + ' Dim cmd = Conexion.CreateCommand() + ' cmd.CommandType = CommandType.Text + ' cmd.CommandText = $"SELECT * FROM [{FileName}]" + ' Dim DataAdapter = New Odbc.OdbcDataAdapter(cmd) + ' DataAdapter.Fill(dt) + ' Case "EXCEL" + ' Conexion = New Odbc.OdbcConnection("Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=" + Ruta + FileName + ";") + ' Conexion.Open() + ' Dim cmd = Conexion.CreateCommand() + ' cmd.CommandType = CommandType.Text + ' cmd.CommandText = $"SELECT * FROM [{HojaExcel}]" + ' Dim DataAdapter = New Odbc.OdbcDataAdapter(cmd) + ' DataAdapter.Fill(dt) + ' Case Else + ' Alert("El archivo no tiene el formato correcto", TipoMensaje.MsgError) + ' Exit Sub + ' End Select + 'Catch ex As Exception + ' ErrorArchivo = True + ' OnError("Ocurrio un error al leer el archivo
" & ex.Message, ex) + 'End Try + 'Conexion.Close() If Not ErrorArchivo Then If RblFormato.SelectedValue = "1" Or RblFormato.SelectedValue = "2" Then If Not dt.Columns(0).ColumnName = "Codigo" Then @@ -1523,57 +1528,69 @@ Partial Class General_SaldosIniciales ElseIf RblFormato.SelectedValue = "12" Then Dim ObjMovimientos As New ClsInventarios ObjMovimientos.IniciaTransacSQL() - Dim OcurrioError As Boolean = False + + Dim ProductosServiciosRef As DataTable = GlobalDTPSSimplificado(UsuarioActual.CveEmpresa) + Dim AlmacenRef As DataTable = GlobalDTAlmacen(UsuarioActual.CveEmpresa) Dim contadorMovimientos As Integer = 0 Dim listadoMovimientos As String = "" + Dim mensajeError As String = "" Try For Each almacenSinRepetir As DataRow In dt.FiltraParametros("", DistinctColumns:={"Almacen"}).Rows Dim almacenActual As String = almacenSinRepetir("Almacen").ToString - Dim CveAlmacen As Integer = GlobalDTAlmacen(UsuarioActual.CveEmpresa).FiltroPrimeroValor("CveAlmacen", $"Almacen = '{almacenActual}'").ToEntero + 'Dim CveAlmacen As Integer = GlobalDTAlmacen(UsuarioActual.CveEmpresa).FiltroPrimeroValor("CveAlmacen", $"Almacen = '{almacenActual}'").ToEntero + Dim CveAlmacen As Integer = AlmacenRef.FiltroPrimeroValor("CveAlmacen", $"Almacen = '{almacenActual}'").ToEntero Dim movimientoCabecera As Integer = ObjMovimientos.AddMovimiento(CveAlmacen, 1, 1, Date.Now, -1, UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa, -1, -1, -1, -1) listadoMovimientos += $"movimiento con folio {ObjMovimientos.Folio}
" If CveAlmacen > 0 Then contadorMovimientos += 1 For Each nuevaEntrada As DataRow In dt.FiltraParametros($"Almacen = '{almacenActual}'").Rows - Dim CvePS As Integer = GlobalDTPSSimplificado(UsuarioActual.CveEmpresa).FiltroPrimeroValor("CvePS", $"Codigo = '{nuevaEntrada("CodigoPS")}'").ToEntero - Dim CveUM As Integer = GlobalDTPSSimplificado(UsuarioActual.CveEmpresa).FiltroPrimeroValor("CveUnidadMedida", $"Codigo = '{nuevaEntrada("CodigoPS")}'").ToEntero + Dim RowPS As DataRow = ProductosServiciosRef.FiltroPrimero($"Codigo = '{nuevaEntrada("CodigoPS")}' AND CveEmpresa = {UsuarioActual.CveEmpresa}") + + Dim CvePS As Integer = RowPS("CvePS").ToString().ToEntero + Dim CveUM As Integer = RowPS("CveUnidadMedida").ToString().ToEntero If CvePS > 0 Then If CveUM > 0 Then Dim Cantidad As Decimal = nuevaEntrada("Existencia").ToString.ToDecimal Dim Valor As Decimal = nuevaEntrada("Valor").ToString.ToDecimal If Not ObjMovimientos.AddMovimientoDetalle(movimientoCabecera, Cantidad, CveUM, CvePS, (Valor / Cantidad), -1, -1) Then - OcurrioError = True + mensajeError = "No se logró generar el detalle del movimiento" + Throw New Exception() End If Else - OcurrioError = True + mensajeError = $"La unidad de medida no se reconoce para el producto servicio:{nuevaEntrada("CodigoPS")}" + Throw New Exception() End If Else - OcurrioError = True - + mensajeError = $"No se encontró el producto o servicio con código ""{nuevaEntrada("CodigoPS")}""" + Throw New Exception() End If Next Else - OcurrioError = True - 'alert amacén no existe + mensajeError = $"No se encontró el almacén con nombre ""{almacenActual}""" + Throw New Exception() Exit For End If Next Catch ex As Exception - OcurrioError = True + If mensajeError = "" Then + mensajeError = "Error técnico, informar a soporte" + End If ObjMovimientos.RollBack() End Try - If Not OcurrioError Then + If mensajeError = "" Then ObjMovimientos.Commit() Alert($"Se cargaron correctamente {contadorMovimientos} movimientos

{listadoMovimientos}") Else - Alert("Ocurrió un error al cargar las existencias", TipoMensaje.MsgError) + Alert(mensajeError, TipoMensaje.MsgError) ObjMovimientos.RollBack() End If ObjMovimientos.Dispose() + ProductosServiciosRef.Dispose() + AlmacenRef.Dispose() End If End If @@ -1618,5 +1635,51 @@ Partial Class General_SaldosIniciales End If End Sub + Private Function ReadExcelFile(ByVal flatFilePath As String, ByVal firstRowHasHeaders As Boolean) As DataTable + SpreadsheetInfo.SetLicense(ModExtensiones.SerialGemBoxSpreadsheet) + Dim excelFile As ExcelFile = ExcelFile.Load(flatFilePath) + + Dim unnamed As Integer = 0 + Dim cols As Integer + Dim columns As String() + Dim curRow As Integer = 0 + Dim curCol As Integer = 0 + Dim dataTable As DataTable = New DataTable() + Dim worksheet As ExcelWorksheet = excelFile.Worksheets(0) + + For cols = 0 To worksheet.Rows(0).AllocatedCells.Count - 1 + + If firstRowHasHeaders Then + + If worksheet.Rows(0).Cells(cols).Value IsNot Nothing Then + dataTable.Columns.Add(worksheet.Rows(0).Cells(cols).Value.ToString()) + Else + dataTable.Columns.Add("Unnamed Column " & (System.Threading.Interlocked.Increment(unnamed))) + End If + + curRow = 1 + Else + dataTable.Columns.Add("Column " & (cols + 1)) + End If + Next + + While curRow < worksheet.Rows.Count + columns = New String(cols - 1) {} + + For curCol = 0 To cols - 1 + + If worksheet.Rows(curRow).Cells(curCol).Value Is Nothing Then + columns(curCol) = "" + Else + columns(curCol) = worksheet.Rows(curRow).Cells(curCol).Value.ToString() + End If + Next + + dataTable.Rows.Add(columns) + curRow += 1 + End While + + Return dataTable + End Function End Class