Ir para conteúdo
Fórum Script Brasil
  • 0

Erro ao alterar um pedido e na sequencia alterar outro


Carlos Rocha

Pergunta

persebi que a datagridview é somente para exibição de dados que estão no datatable e não para usar suas colunas para salva-las no banco pois assim, quando gravo as colunas da DataGridView no banco sempre irá uma linha toda em branco (a última) certo?

assim,

Estou fazendo dessa forma.

Uso um dataset ligado ao MySql tabela detalhespedidos (atraves de datasource) para (exibir) os detalhes do pedido atraves da datagridview.

depois, quando cliko no botão "editar pedido",

Depois, crio um dataset com uma tabela temporaria (detalhespedidos) igualzinha a tabela que esta la no mysql e entrego os valores dela para a tabela temporaria que esta no dataset criado e depois faço

DGWPeidos.datasource=Nothing e depois entrego a DataGridView ao datasouce da tabela temporaria. Desta forma, desconecto os a DataGridView do banco MySql mas não perco os detalhes dos pedidos que estão na DataGridView.

Assim:

Private Sub Atualizar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Atualizar.Click
        If Atualizar.Text = "Atualizar" Then
            habilita()
            entrega_item_item()
            DGWPedidos.DataSource = Nothing
            DGWPedidos.DataSource = ds_itens_temp.Tables(0).DefaultView
            Novo.Enabled = False
            Primeiro.Enabled = False
            Proximo.Enabled = False
            Anterior.Enabled = False
            Ultimo.Enabled = False
            Eliminar.Enabled = False
            Encerrar.Text = "Cancela"
            Atualizar.Text = "Salvar"
            bcliente.Enabled = True
            bproduto.Enabled = True
            Incluir.Enabled = True
            Excluir.Enabled = True
            qtde.Enabled = True
            cliente.Focus()
            codigoped.Enabled = False
            codigoped.Visible = True
            LabelCodigoPed.Visible = True
        ElseIf Atualizar.Text = "Salvar" Then
            codigoped.Enabled = False
            If registropedidos < 0 OrElse registropedidos > dt.Rows.Count - 1 Then Exit Sub
            Dim dre As DataRow = dt.Rows(registropedidos)
            atualizarRegistro(dre)
            Atualizar.Text = "Atualizar"
            Encerrar.Text = "Encerrar"
            Novo.Enabled = True
            Eliminar.Enabled = True
            desabilita()
            Primeiro.Enabled = True
            Proximo.Enabled = True
            Anterior.Enabled = True
            Ultimo.Enabled = True
        End If
    End Sub
Bom, deu para perceber que quando cliko no botão atualizar ele troca o texto para salvar que depois de likado ira salvar as alterações. Eis a procidure Que entrega os ítens do MySql para a tabela temporaria
Public Sub entrega_item_item()
        Dim Sqlitens As String = "Select * from detalhespedidos where pedidoID=" & codigoped.Text
        ds_itens_temp = accDb.ExecuteDSTEMP(Sqlitens)
        For Each linha As DataRow In ds_itens.Tables(0).Rows
            ds_itens_temp.Tables(0).Rows.Add(linha(0), linha(1), linha(2), linha(3), linha(4), linha(5), linha(6))
        Next linha
    End Sub
Eis o código que estou usando para incluir ítens e remover ítens (alterar) do pedido:
Private Sub Incluir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Incluir.Click
        'a propriedade SelectionMode deve ser igual a FullRowSelect para deletar linhas
        If cliente.Text = String.Empty Then
            MsgBox("Escolha o clientes...")
            bcliente_Click(Nothing, Nothing)
            Exit Sub
        ElseIf produto.Text = String.Empty Then
            MsgBox("Escolha o produto.")
            bproduto_Click(Nothing, Nothing)
            Exit Sub
        ElseIf qtde.Text = String.Empty Then
            MsgBox("Informe a quantidade requerida...")
            qtde.Focus()
            Exit Sub
        End If
       
            Dim rowNew As DataRow = ds_itens_temp.Tables(0).NewRow
            rowNew("pedidoID") = codigoped.Text
            rowNew("produtoID") = codigoprod.Text
            rowNew("unidade") = unidade.Text
            rowNew("descricao") = produto.Text
            rowNew("preço") = preço.Text
            rowNew("quantidade") = qtde.Text
            rowNew("subtotal") = preço.Text * qtde.Text
            ds_itens_temp.Tables(0).Rows.Add(rowNew)
            ds_itens_temp.AcceptChanges()
       
        total.Text = 0.0
        For Each linha As DataGridViewRow In DGWPedidos.Rows
            total.Text += linha.Cells(6).Value
            total.Text = FormatCurrency(total.Text, "0.00")
        Next linha
    End Sub
E por fim o código que salva as alterações que estão na tabela temporarias na tabela do Banco MySql
Private Sub atualizarRegistro(ByVal dr As DataRow)
        Dim sqlpedidos As String = "UPDATE " & TabelaPedidos & " SET clienteID='" & codigocli.Text & "' where pedidoID='" & dr("pedidoID") & "'"
        Dim sqlitensdeletaitens As String = "delete from " & TabelaDetalhesPedidos & "  where pedidoID='" & dr("pedidoID") & "'"
        accDb.ExecuteDS(sqlitensdeletaitens, TabelaDetalhesPedidos)
        accDb.ExecuteDS(sqlpedidos, TabelaPedidos)
        For Each linha As DataRow In ds_itens_temp.Tables(0).Rows
            Dim sqlitens As String = "INSERT INTO " & TabelaDetalhesPedidos & " (pedidoID,produtoID,unidade,descricao,preço,quantidade,subtotal) VALUES ('" & ds_itens_temp.Tables(0).Rows(I).Item(0) & "','" & ds_itens_temp.Tables(0).Rows(I).Item(1) & "','" & ds_itens_temp.Tables(0).Rows(I).Item(2) & "','" & ds_itens_temp.Tables(0).Rows(I).Item(3) & "','" & ds_itens_temp.Tables(0).Rows(I).Item(4) & "','" & ds_itens_temp.Tables(0).Rows(I).Item(5) & "','" & ds_itens_temp.Tables(0).Rows(I).Item(6) & "')"
            accDb.ExecuteDS(sqlitens, TabelaDetalhesPedidos)
            I = I + 1
        Next linha

        Try
            MessageBox.Show("Pedido atualizado com sucesso.")
            DGWPedidos.DataSource = Nothing
            CarregaPagina() ' função que entrega ao DataGridWiew o datasource do banco MySql de novo
        Catch ex As Exception
            MessageBox.Show("Erro ao efetuar a conexão com a base de dados : " + ex.Message)
        End Try
    End Sub
Bom tudo funciona correto, porem, quando recebo do programa a informaçao de que a alteração foi efetuada com sucesso, dai, se tento alterar outro pedido, todos os passos da certo mas quando vou salvar no banco as alterações ele para a execução na linha de sql abaixo:
[code]
  Private Sub atualizarRegistro(ByVal dr As DataRow)
        Dim sqlpedidos As String = "UPDATE " & TabelaPedidos & " SET clienteID='" & codigocli.Text & "' where pedidoID='" & dr("pedidoID") & "'"
        Dim sqlitensdeletaitens As String = "delete from " & TabelaDetalhesPedidos & "  where pedidoID='" & dr("pedidoID") & "'"
        accDb.ExecuteDS(sqlitensdeletaitens, TabelaDetalhesPedidos)
        accDb.ExecuteDS(sqlpedidos, TabelaPedidos)
        For Each linha As DataRow In ds_itens_temp.Tables(0).Rows
'para a execução nessa sql  
          Dim sqlitens As String = "INSERT INTO " & TabelaDetalhesPedidos & " (pedidoID,produtoID,unidade,descricao,preço,quantidade,subtotal) VALUES ('" & ds_itens_temp.Tables(0).Rows(I).Item(0) & "','" & ds_itens_temp.Tables(0).Rows(I).Item(1) & "','" & ds_itens_temp.Tables(0).Rows(I).Item(2) & "','" & ds_itens_temp.Tables(0).Rows(I).Item(3) & "','" & ds_itens_temp.Tables(0).Rows(I).Item(4) & "','" & ds_itens_temp.Tables(0).Rows(I).Item(5) & "','" & ds_itens_temp.Tables(0).Rows(I).Item(6) & "')"
'para a execução nessa sql
            accDb.ExecuteDS(sqlitens, TabelaDetalhesPedidos)
            I = I + 1
        Next linha

        Try
            MessageBox.Show("Pedido atualizado com sucesso.")
            DGWPedidos.DataSource = Nothing
            CarregaPagina() ' função que entrega ao DataGridWiew o datasource do banco MySql de novo
        Catch ex As Exception
            MessageBox.Show("Erro ao efetuar a conexão com a base de dados : " + ex.Message)
        End Try
    End Sub
e da erro dizendo:
Não há linha na posição 6(último ítem dos ítens na gridview).

O interessante de tudo é que, se eu alterar o primeiro o pedido, e da cerrto, e fechar o formulario e abrir de novo para alterar o outro pedido, aoi da certo mas se eu não fechar o form e alterar na sequencia ai da o erro.

Como posso resolver isso?

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

Bom, os problemas anteriores consegui matar porem, sempre resta algum restolho né?

Bom, estou trabalhando com inserção de registros (ítens dos pedidos) usando datatables temporarios (tabelas criadas dentro do dataset e não ligadas a Bancos de dados).

Para exibir esses ítens dos pedidos, estou usando uma DataGridView ligada por datasource à essa tabela temporia. O problema que ta acontecendeo agora é que, quando vou alterar os ítens dos pedido de um pedido, e deleto linhas na datagrid,não sei como fazer para que, ao alterar umaq determinada linha na datagrid delete exatamente essa linha na datable temporaria.

Estou usando o código abaixo mas ta dando o seguinte erro na hora de salvar as alterações:

"Informações sobre a linha excluída não podem ser acessadas através da linha."

Mas esse erro é só se eu deletar linhas, se eu só incluir linhas não da erro:

Private Sub Excluir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Excluir.Click
        'a propriedade SelectionMode deve ser igual a FullRowSelect para deletar linhas
        'verifica se a linha a ser excluida é valida
        Dim registro As DataRowView = TryCast(DGWPedidos.CurrentRow.DataBoundItem, DataRowView)
        ' Existe algum registro selecionado? 
        If registro IsNot Nothing Then
            ' Sim... Então apaga;) 
            registro.Delete()
        End If
    End Sub

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...