Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Carcleo

Erro ao alterar um pedido e na sequencia alterar outro

Recommended Posts

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("preco") = preco.Text
			rowNew("quantidade") = qtde.Text
			rowNew("subtotal") = preco.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,preco,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,preco,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?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Movido Plataforma .NET http://forum.imasters.com.br/public/style_emoticons/default/seta.gif Plataforma .NET » Windows Applications

 

Tem como dar uma filtrada no problema?

Espero que entenda como um conselho, quando um membro posto muito código e muito textos dificilmente alguém presta atenção e fica lendo com calma, afinal todos nós temos obrigações.

Então peço que poste somente a parte importante da sua dúvida. http://forum.imasters.com.br/public/style_emoticons/default/natal_wink.gif

 

Abraços...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tem razão me desculpe mais essa vez.

 

Vou tentar ser mais específico ok?

 

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha Não!

 

Eu temnho a DataGridView ligado a tabela temporaria (datatable) e quano cliko em uma linha na DatagridView, o que eu espero é que o código delete, la nos registros do datatable, o registro correspondente àquela linha selecionada na DataGridView.

 

Eu não estou conseguindo fazer isso.

 

O Interessande é que se excluir um linha apenas, o erro não ocorre. Mas, se excluir varias linhas fora de seuqncia no DataGridView tipo a 1ª, a 4ª, a 6ª e inluir mais linhas nesse intervalo, aí ele da o erro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

É problema para veterano ajudar resolver:

 

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 INCLUIR OU EXCLUIR os ítens dos pedido de um pedido que ja apareceram na DataGridView no momento em que eu abri o formulario ocorre tudo cero inclusive quando tento incluir linhas novas. Mas, se exluir qualquer uma dessas linhas novas ele ja não acha a correspondencia entre datagridviewrow e a datarow.

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 que forma inseridas e que por ventura tenha desistido delas:

 

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

Código para inserir:

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("preco") = preco.Text
		rowNew("quantidade") = qtde.Text
		rowNew("subtotal") = preco.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

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.