none
Salvar vendas com LinQ - VB RRS feed

  • Pergunta

  • Não estou conseguindo salvar mais de uma linha do datagrid no banco de dados.

    segue imagem a baixo e configuração

    Public Class frmVendasPedidos
        Inherits System.Windows.Forms.Form
        'Definir o objeto bd da classe JcmSoftDataContext
        Dim bd As New dcVRDataContext
    
        'Definir objeto da clase DetalhesPedidos
        Dim oDetalhesPedidos As DetalhesPedidos
        Dim nomeProduto As String
        Dim codProduto As String
        Dim QuantidadeUni As Integer
        Dim quantidadeCX As Integer
        Dim precoUniProduto As Double
        Dim precoCx As Double
        Dim codigoCliente As String
        Dim estoqueProduto As Integer
        Dim Prazo1 As Integer
        Dim Prazo2 As Integer
        Dim Prazo3 As Integer
        Dim Prazo4 As Integer
        Dim data As Date
        Dim precoTotal As Double
    
        'Definir una LISTA de Objetos DetalhesPedidos
        Dim ArrDetalhesPedidos As New List(Of DetalhesPedidos)


     Private Sub btnSalvar_Click(sender As Object, e As EventArgs) Handles btnSalvar.Click
            'Vamos usar o mapeamento feito pelo LINQ
            'para efetivar as atualizações nas bases de dados
            Try
                'A expressão lambda a seguir devolve um objeto Cliente
                'Estamos usando o codigo do cliente para identificar unicamento o cliente
                Dim Cli As tblCliente = bd.tblClientes.Single(Function(p) p.IdCliente = Me.txtCodigoCliente.Text)
                '-------------------------------------------------
                'Cria um  novo objeto Pedido
                '-------------------------------------------------
                Dim oPedido As New tblPedido
                oPedido.Data = txtData.Text
                oPedido.IdCliente = Cli.IdCliente
                oPedido.tblCliente = Cli
                oPedido.NomeCliente = Cli.Cliente
                oPedido.NomeProduto = nomeProduto
                oPedido.QuantidadeUni = oDetalhesPedidos.QuantidadeUni
                oPedido.QuantidadeCX = oDetalhesPedidos.QuantidadeCX
                oPedido.PrecoUni = oDetalhesPedidos.PrecoUni
                oPedido.PrecoCx = oDetalhesPedidos.PrecoCX
                oPedido.Prazo1 = oDetalhesPedidos.Prazo1
                oPedido.Prazo2 = oDetalhesPedidos.Prazo2
                oPedido.Prazo3 = oDetalhesPedidos.Prazo3
                oPedido.Prazo4 = oDetalhesPedidos.Prazo4
                oPedido.PrecoTotal = oDetalhesPedidos.Subtotal
    
                '--------------------------------------------------
                'Obtendo os detalhes do pedido 
                'realizo a geração dos objetos Pedido
                'vou percorrer o array dos detalhes do pedido
                '----------------------------------------------------
                For Each o As DetalhesPedidos In ArrDetalhesPedidos
                    'Instancio um objeto Produto selecionando pelo codigo do produto
                    Dim prod As tblProduto = bd.tblProdutos.Single(Function(a) a.IdProduto = o.CodProduto.ToString())
                    'Cria um novo detalhe do pedido
                    Dim detPedido As New tblProduto
                    detPedido.Produto = prod.Produto
                    detPedido.IdProduto = prod.IdProduto
                    detPedido.Quantidade = o.QuantidadeUni
    
    
                    '-altera a quantidade de estoque do produto
                    prod.Estoque = prod.Estoque - o.QuantidadeUni
                Next
                '------------------------------------------------------
                'Aqui atualizo a base de dados
                bd.SubmitChanges()
                MsgBox("Venda registrada com sucesso...")
            Catch ex As Exception
                MsgBox(ex.Message)
            Finally
                'chama as rotinas para limpar clientes e produtos e vendas
                limpar_cliente()
                limpar_produto()
                limpar_venda()
                Me.calcular_total()
            End Try
        End Sub
    quarta-feira, 17 de maio de 2017 14:32

Respostas

  • Vilar,

    Não estou vendo essa adição no código ainda.

    For Each rw As DataGridViewRow In DataGridView1.Rows


    Att., Roberto Alves

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    quarta-feira, 17 de maio de 2017 19:35

Todas as Respostas

  • IMAGEM DO PROGRAMA

    https://www.scriptbrasil.com.br/forum/uploads/monthly_2017_05/591c5b6a1cb43_Semttulo.thumb.png.2096630ba815165daa21ae459eba597b.png

    IMAGEM DO SQL

    https://www.scriptbrasil.com.br/forum/uploads/monthly_2017_05/591c5ba3d1f89_Semttulo1.thumb.png.a25cf3d0168d09b174fffd64420c6894.png

    quarta-feira, 17 de maio de 2017 14:35
  • Boa tarde Vilar Representações,

    Eu não estou vendo você selecionar as linhas do datagrid como no exemplo abaixo.

    Private Sub inserttoDatagridview()
            con.Open()
            For Each rw As DataGridViewRow In DataGridView1.Rows
                cmd = New SqlCommand("insert into tblEmp (empid,empname,empdesg,dob) values (" & rw.Cells(0).Value & ",'" & rw.Cells(1).Value & "','" & rw.Cells(2).Value & "','" & CDate(rw.Cells(3).Value.ToString()) & "') ", con)
                cmd.ExecuteNonQuery()
            Next
            con.Close()
        End Sub



    Att., Roberto Alves

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    quarta-feira, 17 de maio de 2017 16:57
  • boa tarde roberto!! obg por responder!

    eu nao adicionei todos os codigos.. 

    esse é o de incluir

      Private Sub btnIncluir_Click(sender As Object, e As EventArgs) Handles btnIncluir.Click
    
            'Verificamos a quantidade foi informada
            If txtQuantidadeUni.Text = String.Empty Then
                MsgBox("Informe a quantidade requerida.")
                txtQuantidadeUni.Focus()
                Exit Sub
            End If
            If txtData.Text = String.Empty Then
                MsgBox("Informe a data da venda.")
                txtData.Focus()
            End If
            'Verificamos se o nome do produto , preco e quantidade não estão vazios
            If txtNomeProduto.Text <> "" And txtPrecoProduto.Text <> "" And txtQuantidadeUni.Text <> "" And txtCodigoCliente.Text <> "" Then
                'Verificamos se o Do produto não é menor do que o solicitado
                If Convert.ToInt32(estoqueProduto) < Convert.ToInt32(txtQuantidadeUni.Text) Then
                    'Mostramos uma aviso ao usuário
                    MsgBox("A quantidade requerida é Superior a do estoque")
                    'Como a quantidade solicitada é mario que o estoque
                    'perguntamos se o usuário deseja estabelecer o estoque atual
                    'com a nova quantidade informada
                    If MessageBox.Show("Deseja estabelecer o estoque atual como a nova quantidade requerida",
     "Vendas", MessageBoxButtons.YesNo) = MsgBoxResult.Yes Then
                        'Establecemos a nova quantidade em estoque
                        txtQuantidadeUni.Text = estoqueProduto
                        'Inicializamos o objeto da classe DetalhesPedidos
                        oDetalhesPedidos = New DetalhesPedidos
                        'Preenchemos os valores 
                        '-----------------------------------------------------------------
                        oDetalhesPedidos.QuantidadeUni = Convert.ToInt32(txtQuantidadeUni.Text)
                        oDetalhesPedidos.QuantidadeCX = Convert.ToInt32(txtQuantidadeUni.Text / txtQuantidadeProduto.Text) = quantidadeCX
                        oDetalhesPedidos.CodProduto = codProduto
                        oDetalhesPedidos.NomeProduto = nomeProduto
                        oDetalhesPedidos.PrecoUni = txtPrecoProduto.Text
                        oDetalhesPedidos.PrecoCX = (txtPrecoProduto.Text * txtQuantidadeProduto.Text)
                        oDetalhesPedidos.EstoqueProduto = estoqueProduto
                        oDetalhesPedidos.Prazo1 = Convert.ToInt32(txtPrazo1.Text)
                        oDetalhesPedidos.Prazo2 = Convert.ToInt32(txtPrazo2.Text)
                        oDetalhesPedidos.Prazo3 = Convert.ToInt32(txtPrazo3.Text)
                        oDetalhesPedidos.Prazo4 = Convert.ToInt32(txtPrazo4.Text)
                        oDetalhesPedidos.Subtotal = txtPrecoProduto.Text * Convert.ToInt32(txtQuantidadeUni.Text)
                        '------------------------------------------------------------------------
                        'Verificamos se o produto esta na lista de pedidos
                        'e incluimos a lista de DetalhesPedidos
                        If buscarDetalhesVendas(ArrDetalhesPedidos, oDetalhesPedidos) = False Then
                            'Agregamos o pedido a lista de DetalhesPedidos
                            ArrDetalhesPedidos.Add(oDetalhesPedidos)
                        End If
                        'Assciamos a lista de DetalhesPedidos como fonte de dados ao datagridview
                        Me.dgvVendas.DataSource = ArrDetalhesPedidos
                    Else
                        'Se não deseja estabelecer o estoque atual com a quantidade solicitada
                        'voltamos ao formulario para escolher outro produto
                        btnProcuraProduto_Click(Nothing, Nothing)
                    End If
                Else
                    'Como a quantidade requerida e menor que o estoque
                    'iniciamos o objeto da classe DetalhesPedidos
                    oDetalhesPedidos = New DetalhesPedidos
                    'Preenchemos os valores no objeto
                    oDetalhesPedidos.QuantidadeUni = Convert.ToInt32(txtQuantidadeUni.Text)
                    oDetalhesPedidos.QuantidadeCX = Convert.ToInt32(txtQuantidadeUni.Text / txtQuantidadeProduto.Text)
                    oDetalhesPedidos.CodProduto = codProduto
                    oDetalhesPedidos.NomeProduto = nomeProduto
                    oDetalhesPedidos.PrecoUni = txtPrecoProduto.Text
                    oDetalhesPedidos.PrecoCX = (txtPrecoProduto.Text * Convert.ToInt32(txtQuantidadeProduto.Text))
                    oDetalhesPedidos.EstoqueProduto = estoqueProduto
                    oDetalhesPedidos.Prazo1 = Convert.ToInt32(txtPrazo1.Text)
                    oDetalhesPedidos.Prazo2 = Convert.ToInt32(txtPrazo2.Text)
                    oDetalhesPedidos.Prazo3 = Convert.ToInt32(txtPrazo3.Text)
                    oDetalhesPedidos.Prazo4 = Convert.ToInt32(txtPrazo4.Text)
                    oDetalhesPedidos.Subtotal = txtPrecoProduto.Text * Convert.ToInt32(txtQuantidadeUni.Text)
                    'Verificamos se o produto solicitado esta na lista de pedidos
                    'Se não estiver incluimos na lista de DetalhesPedidos
                    If buscarDetalhesVendas(ArrDetalhesPedidos, oDetalhesPedidos) = False Then
                        'Incluimos o pedido a lista de DetalhesPedidos
                        ArrDetalhesPedidos.Add(oDetalhesPedidos)
                    End If
                    'Associamos a lista como origem da fonte de dados
                    Me.dgvVendas.DataSource = ArrDetalhesPedidos.ToList
                End If
            End If
            'Limpamos os textBox
            Me.limpar_produto()
            'Calculamos o Total do Pedido
            Me.calcular_total()
        End Sub
    Buscar as vendas
        Public Function buscarDetalhesVendas(ByVal array As List(Of DetalhesPedidos), ByVal objDV As DetalhesPedidos) As Boolean
            'Vreificamos se um produto ja foi solicitado
            For Each oDetPed As DetalhesPedidos In array
                If oDetPed.CodProduto = objDV.CodProduto Then
                    Dim nQuantidade As Integer
                    'Se encontramos o produto na lista de pedidos
                    'incrementamos a quantidade solicitada
                    'com a quantidade solicitada anteriomente
                    nQuantidade = oDetPed.QuantidadeUni + objDV.QuantidadeUni
                    If nQuantidade <= oDetPed.EstoqueProduto Then
                        oDetPed.QuantidadeUni = nQuantidade
                        oDetPed.Subtotal = oDetPed.PrecoUni * oDetPed.QuantidadeUni
                    Else
                        MsgBox("O estoque atual é insuficiente para a quantidade solicitada.")
                    End If
                    Return True
                End If
            Next
            Return False
        End Function

    o resto acho q n precisa, qqlr coisa é so falar!! 

    ah e nao sei escrever o codigo de excluir uma linha do datagrid.. se puder ajudar, tentei uns da internet mas todos dao erro!!

    quarta-feira, 17 de maio de 2017 18:32
  • Vilar,

    Não estou vendo essa adição no código ainda.

    For Each rw As DataGridViewRow In DataGridView1.Rows


    Att., Roberto Alves

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    quarta-feira, 17 de maio de 2017 19:35
  • Vilar,

    Não estou vendo essa adição no código ainda.

    For Each rw As DataGridViewRow In DataGridView1.Rows


    Att., Roberto Alves

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

     Private Sub btnIncluir_Click(sender As Object, e As EventArgs) Handles btnIncluir.Click
            For Each rw As DataGridViewRow In dgvVendas.Rows
            Next
            'Verificamos a quantidade foi informada
            If txtQuantidadeUni.Text = String.Empty Then
                MsgBox("Informe a quantidade requerida.")
                txtQuantidadeUni.Focus()
                Exit Sub
            End If
            If txtData.Text = String.Empty Then
                MsgBox("Informe a data da venda.")
                txtData.Focus()
            End If
            'Verificamos se o nome do produto , p

    ficaria assim?
    quarta-feira, 17 de maio de 2017 19:52
  • Vilar Representações,

    Sim, era para funcionar agora.


    Att., Roberto Alves

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    quarta-feira, 17 de maio de 2017 19:53
  • continua a mesma coisa..

    quarta-feira, 17 de maio de 2017 20:11
  • Bom dia Vilar Representações,

    Quando você colocar um breakpoint, ele chega a fazer o foreach?


    Att., Roberto Alves

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    segunda-feira, 29 de maio de 2017 13:05