none
Sistema de articulos, restar inventariado con datagridview y checbox RRS feed

  • Pregunta

  • Buenas dias, veran este es mi problema.

     

    Tengo una base de datos basada en mysql donde solo tengo una tabla llamada items, dentro de esta tengo varios campos en varchar y una en INT donde tengo el total de los articulos en existencia.

     

    utilizo el ado.net para crear mis consultas y conectar las bases de datos mas facilmente. He agregado un datagrid view a mi formulario y e agregado una columna nueva que no esta enlasada a la base de datos de tipo checkbox, que cuando yo seleccione un articulo para despues imprimirlo a excel, se reste del que seleccione a la base de datos.

    este es el codigo ke tengo

     

    Imports Microsoft.Office.Interop
    Imports Excel = Microsoft.Office.Interop.Excel
    Public Class operaciones
    
        Private Sub TiposBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TiposBindingNavigatorSaveItem.Click
            Me.Validate()
            Me.TiposBindingSource.EndEdit()
            Me.TableAdapterManager.UpdateAll(Me.SistemaDataSet)
    
        End Sub
    
        Private Sub operaciones_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            'TODO: esta línea de código carga datos en la tabla 'SistemaDataSet.tipos' Puede moverla o quitarla según sea necesario.
            Me.TiposTableAdapter.Fill(Me.SistemaDataSet.tipos)
    
        End Sub
    
        Private Sub OperacionToolStripButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OperacionToolStripButton.Click
            Try
                Me.TiposTableAdapter.operacion(Me.SistemaDataSet.tipos, OperacionToolStripTextBox.Text)
            Catch ex As System.Exception
                System.Windows.Forms.MessageBox.Show(ex.Message)
            End Try
    
        End Sub
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim query As String = "SELECT cantidad_disponible FORM tipos = cantidad_disponible-1"
    
            If seleccion.Selected = True Then
                query = ("SELECT cantidad_disponible FORM tipos = cantidad_disponible-1 WHERE id " & seleccion.Selected & ") ")
    
                'query = "SELECT cantidad_disponible FORM tipos = cantidad_disponible-1"
    
    
    
    
            End If
    
    
            Try
                'Intentar generar el documento.
                'Se adjunta un texto debajo del encabezado
                ExportarDatosExcel(TiposDataGridView, "TICKTS DEL SISTEMA DE COMPONENTES")
            Catch ex As Exception
                'Si el intento es fallido, mostrar MsgBox.
                MessageBox.Show("No se puede generar el documento Excel.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
    
           
    
    
        End Sub
    
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Try
                Me.TiposTableAdapter.operacion(Me.SistemaDataSet.tipos, TextBox1.Text)
            Catch ex As System.Exception
                System.Windows.Forms.MessageBox.Show(ex.Message)
            End Try
        End Sub
        Public Sub ExportarDatosExcel(ByVal ArticulosDataGridView As DataGridView, ByVal titulo As String)
            Dim m_Excel As New Excel.Application
            m_Excel.Cursor = Excel.XlMousePointer.xlWait
            m_Excel.Visible = True
            Dim objLibroExcel As Excel.Workbook = m_Excel.Workbooks.Add
            Dim objHojaExcel As Excel.Worksheet = objLibroExcel.Worksheets(1)
            With objHojaExcel
                .Visible = Excel.XlSheetVisibility.xlSheetVisible
                .Activate()
                'Encabezado  
                .Range("A1:L1").Merge()
                .Range("A1:L1").Value = "TICKETS DE ITEMS NECESARIOS"
                .Range("A1:L1").Font.Bold = True
                .Range("A1:L1").Font.Size = 15
                'Copete  
                .Range("A2:L2").Merge()
                .Range("A2:L2").Value = titulo
                .Range("A2:L2").Font.Bold = True
                .Range("A2:L2").Font.Size = 12
    
                Const primeraLetra As Char = "A"
                Const primerNumero As Short = 3
                Dim Letra As Char, UltimaLetra As Char
                Dim Numero As Integer, UltimoNumero As Integer
                Dim cod_letra As Byte = Asc(primeraLetra) - 1
                Dim sepDec As String = Application.CurrentCulture.NumberFormat.NumberDecimalSeparator
                Dim sepMil As String = Application.CurrentCulture.NumberFormat.NumberGroupSeparator
                'Establecer formatos de las columnas de la hija de cálculo  
                Dim strColumna As String = ""
                Dim LetraIzq As String = ""
                Dim cod_LetraIzq As Byte = Asc(primeraLetra) - 1
                Letra = primeraLetra
                Numero = primerNumero
                Dim objCelda As Excel.Range
                For Each c As DataGridViewColumn In ArticulosDataGridView.Columns
                    If c.Visible Then
                        If Letra = "Z" Then
                            Letra = primeraLetra
                            cod_letra = Asc(primeraLetra)
                            cod_LetraIzq += 1
                            LetraIzq = Chr(cod_LetraIzq)
                        Else
                            cod_letra += 1
                            Letra = Chr(cod_letra)
                        End If
                        strColumna = LetraIzq + Letra + Numero.ToString
                        objCelda = .Range(strColumna, Type.Missing)
                        objCelda.Value = c.HeaderText
                        objCelda.EntireColumn.Font.Size = 8
                        'objCelda.EntireColumn.NumberFormat = c.DefaultCellStyle.Format  
                        If c.ValueType Is GetType(Decimal) OrElse c.ValueType Is GetType(Double) Then
                            objCelda.EntireColumn.NumberFormat = "#" + sepMil + "0" + sepDec + "00"
                        End If
                    End If
                Next
    
                Dim objRangoEncab As Excel.Range = .Range(primeraLetra + Numero.ToString, LetraIzq + Letra + Numero.ToString)
                objRangoEncab.BorderAround(1, Excel.XlBorderWeight.xlMedium)
                UltimaLetra = Letra
                Dim UltimaLetraIzq As String = LetraIzq
    
                'CARGA DE DATOS  
                Dim i As Integer = Numero + 1
    
                For Each reg As DataGridViewRow In ArticulosDataGridView.Rows
                    LetraIzq = ""
                    cod_LetraIzq = Asc(primeraLetra) - 1
                    Letra = primeraLetra
                    cod_letra = Asc(primeraLetra) - 1
                    For Each c As DataGridViewColumn In ArticulosDataGridView.Columns
                        If c.Visible Then
                            : If Letra = "Z" Then
                                Letra = primeraLetra
                                : cod_letra = Asc(primeraLetra)
                                cod_LetraIzq += 1
                                : LetraIzq = Chr(cod_LetraIzq)
                                : Else
                                : cod_letra += 1
                                Letra = Chr(cod_letra)
                            End If
                            strColumna = LetraIzq + Letra
                            ' acá debería realizarse la carga  
                            .Cells(i, strColumna) = IIf(IsDBNull(reg.ToString), "", reg.Cells(c.Index).Value)
                            '.Cells(i, strColumna) = IIf(IsDBNull(reg.(c.DataPropertyName)), c.DefaultCellStyle.NullValue, reg(c.DataPropertyName))  
                            '.Range(strColumna + i, strColumna + i).In()  
    
                        End If
                    Next
                    Dim objRangoReg As Excel.Range = .Range(primeraLetra + i.ToString, strColumna + i.ToString)
                    objRangoReg.Rows.BorderAround()
                    objRangoReg.Select()
                    i += 1
                    : Next
                UltimoNumero = i
    
                'Dibujar las líneas de las columnas  
                : LetraIzq = ""
                cod_LetraIzq = Asc("A")
                : cod_letra = Asc(primeraLetra)
                : Letra = primeraLetra
                : For Each c As DataGridViewColumn In ArticulosDataGridView.Columns
                    : If c.Visible Then
                        objCelda = .Range(LetraIzq + Letra + primerNumero.ToString, LetraIzq + Letra + (UltimoNumero - 1).ToString)
                        : objCelda.BorderAround()
                        If Letra = "Z" Then
                            : Letra = primeraLetra
                            : cod_letra = Asc(primeraLetra)
                            LetraIzq = Chr(cod_LetraIzq)
                            cod_LetraIzq += 1
                            : Else
                            cod_letra += 1
                            Letra = Chr(cod_letra)
                            : End If
                    End If
                Next
    
                'Dibujar el border exterior grueso  
                Dim objRango As Excel.Range = .Range(primeraLetra + primerNumero.ToString, UltimaLetraIzq + UltimaLetra + (UltimoNumero - 1).ToString)
                objRango.Select()
                objRango.Columns.AutoFit()
                objRango.Columns.BorderAround(1, Excel.XlBorderWeight.xlMedium)
            End With
    
            m_Excel.Cursor = Excel.XlMousePointer.xlDefault
        End Sub
    
        Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
            Me.Close()
            secciones.Show()
    
        End Sub
    
        Private Sub TiposDataGridView_CellContentClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles TiposDataGridView.CellContentClick
            If e.RowIndex = -7 Then
                Return
            End If
    
            If TiposDataGridView.Columns(e.ColumnIndex).Name = "Seleccion" Then
    
                ' Se toma la fila seleccionada
                Dim row As DataGridViewRow = TiposDataGridView.Rows(e.RowIndex)
    
                ' Se selecciona la celda del checkbox
                Dim cellSelecion As DataGridViewCheckBoxCell = TryCast(row.Cells("Seleccion"), DataGridViewCheckBoxCell)
    
                ' If Convert.ToBoolean(cellSelecion.Value) Then
                'label1.Text = CStr(row.Cells("NombreSegundaColumna").Value)
                ' End If
    
            End If
        End Sub
        Private Sub DataGridView1_CellContentClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles TiposDataGridView.CellContentClick
            If e.ColumnIndex = 0 Then
                If (Convert.ToBoolean(TiposDataGridView.Rows(e.RowIndex).Cells(0).Value)) Then
    
                    TiposDataGridView.Rows(e.RowIndex).Cells(0).Value = False
    
                Else
                    TiposDataGridView.Rows(e.RowIndex).Cells(0).Value = True
    
                End If
            End If
        End Sub
    End Class
    
    

    esta es la imagen del programa


    si alguien puede darme alguna ayuda o comentario seria gratificante. Gracias

    • Cambiado Enrique M. Montejo martes, 7 de febrero de 2012 8:38 acceso a datos (De:Lenguaje VB.NET)
    lunes, 6 de febrero de 2012 17:12

Todas las respuestas

  • Hola,

    Lo siento, no me queda clara tu duda.

    ¿A qué te refieres cuando dices "imprimir a excel"?

    Lo que puedes hacer es recorrer las filas de tu dataGridView y mirar el valor de la columna no enlazada. Esta es la forma más simple, haciendo la búsqueda "a mano".

    Te recomiendo que modularices un poco tu código. Crea una función que inicialice la hoja de excel, otra función que escriba un item a la hoja de excel y le de formato. Así podrás recorrer tu dgview y hacer una llamada por cada item marcado.

    Saludos!


    Si he contestado tu pregunta, por favor marca mi post como respuesta.
    ...Y si mi post te ha servido, márcalo como útil smile

    lunes, 20 de febrero de 2012 17:20