Usuário com melhor resposta
Preciso de uma ajuda, Windows Forms CSharp

Pergunta
-
Tenho um sistema de Vendas em CSharp ele dá baixa no estoque normalmente, mais preciso de que quando se retire um produto do estoque e acaso a quantidade estiver errada no Botão Editar consiga editar a quantidade. Pois fiz dois metódos de atualizar estoque um quando vai editar o valor ele soma no estoque e o outro retira se a quantidade digitada foi errada. Mas, o problema é que quando coloca adiciona o produto e dá baixa no estoque e depois vai editar ele está incluindo o valor digitado. Ex: Estoque 992 - Produto 1 - QTDE = 2 ai efetua a venda e vai para 990 se for no textbox e mudar e digitar 12 em vez dele tirar 12 sem contar o 2 ele conta o 2 e tira 14 do estoque.
E queria saber onde coloco os métodos atualizarsaldo que um ele adiciona e outro ele retira do estoque.
O AtualizarSaldo() ele retira do estoque O AtualizarSaldo1() ele adiciona ao estoque Portanto preciso saber como colcocar os dois métodos dentro do botão Editar
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Data.SqlClient; using System.IO; //namespace para trabalhar com arquivos using System.Diagnostics; //namespace para executar progs externos namespace Mercado { public partial class Venda : Form { //estabelecer a conexão com o banco de dados private SqlConnection conexao = new SqlConnection(); String StrConexao = "Data Source=" + "DESKTOP-FTH0L3V\\MARCIORICHARD;Initial Catalog=MERCADO; Persist Security Info=True; User ID=sa;Password=91975203;"; //String StrConexao = "Data Source=MARCIO\\SQLEXPRESS;" + //"Initial Catalog=EXESTOQUE_2IA;Persist Security Info=True;User ID=sa;Password=91975203"; //SqlCommand é usado para passar o comando SQL para uma tabela //(.CommandText = "SELECT ... INSERT ... UPDATE... ou DELETE SqlCommand cmd = new SqlCommand(); SqlDataReader Dr; //Montar DataTables das tabelas usadas no formulário DataTable DtVENDA = new DataTable(); DataTable DtITENS = new DataTable(); DataTable DtPRODUTO = new DataTable(); DataTable DtCliente = new DataTable(); Int32 iSaldo_Atual = 0; //variavel que guarda a quantidade atual do produto (txtSaldo.text) int iqtde = 0; public String chaveID; //variavel pública para guardar a chave ID do grupo public Venda() { InitializeComponent(); } private void Venda_Load(object sender, EventArgs e) { btnSalvar.Enabled = false; groupBox1.Enabled = false; dataGridView1.Enabled = false; } private void mskData_Enter(object sender, EventArgs e) { if (mskData.Text == " / /") { mskData.Text = DateTime.Today.ToString("dd/MM/yyyy"); txtHora.Text = DateTime.Now.ToShortTimeString(); btnSalvar.Enabled = true; } } private void btnSalvar_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(mskData.Text.Trim())) { MessageBox.Show("Data de Emissão Não Pode Ficar Em Branco.", "Atenção"); mskData.Focus(); return; } if (MessageBox.Show("Confirma a Gravação da Nova Venda?", "Atenção", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { conexao.ConnectionString = StrConexao; cmd.Connection = conexao; cmd.CommandType = CommandType.Text; cmd.CommandText = "INSERT INTO VENDA (DATA, HORA, VL_TOTAL) VALUES (@Data, @Hora, 0.00)"; //definir parâmetros cmd.Parameters.Clear(); cmd.Parameters.AddWithValue("@Data", mskData.Text); cmd.Parameters.AddWithValue("@Hora", txtHora.Text); try { conexao.Open(); cmd.ExecuteNonQuery(); dataGridView1.Enabled = true; //Liberar dataGridView txtNr_Venda.Enabled = false; mskData.Enabled = false; txtHora.Enabled = false; btnSalvar.Enabled = false; btnSalvar.Enabled = false; Recuperar_Ultima_venda(); groupBox1.Enabled = true; txtValorTotal.Text = Convert.ToDouble(0.00).ToString("########0.00"); txtCodProduto.Focus(); } catch (Exception ex) //catch = catar { MessageBox.Show(ex.Message.ToString(), "Atenção"); //mensagem que ajuda a identificar o erro(caso tenha) } finally { if (conexao.State == ConnectionState.Open) { conexao.Close(); } } } } private void Recuperar_Ultima_venda() { if (conexao.State == ConnectionState.Open) conexao.Close(); conexao.ConnectionString = StrConexao; cmd.Connection = conexao; conexao.Open(); cmd.CommandType = CommandType.Text; cmd.CommandText = "SELECT * FROM VENDA WHERE NR_VENDA=IDENT_CURRENT('VENDA')"; Dr = cmd.ExecuteReader(); Dr.Read(); txtNr_Venda.Text = Dr["NR_VENDA"].ToString(); conexao.Close(); } private void txtCodProduto_Leave(object sender, EventArgs e) { if (txtCodProduto.Text != "") //se o código do produto for diferente de branco { conexao.ConnectionString = StrConexao; cmd.Connection = conexao; conexao.Open(); cmd.CommandType = CommandType.Text; cmd.CommandText = "SELECT * FROM PRODUTO WHERE CODPROD = @Codigo"; //definir parametros cmd.Parameters.Clear(); cmd.Parameters.AddWithValue("@Codigo", txtCodProduto.Text); Dr = cmd.ExecuteReader(); if (Dr.HasRows) //se encontrou o produto { //exibir a descrição, o preço de venda do produto e 1 na qtde. Dr.Read(); txtDescricao.Text = Dr["DESCPROD"].ToString(); txtPrecoVenda.Text = Convert.ToDouble(Dr["PRVENDAPROD"]).ToString("########0.00"); iSaldo_Atual = Convert.ToInt32(Dr["QTDESTPROD"].ToString()); txtSaldo.Text = iSaldo_Atual.ToString(); txtQtde.Text = "1"; } else //se não for encontrado { MessageBox.Show("Produto não cadastrado!", "Atenção"); txtCodProduto.Clear(); conexao.Close(); txtCodProduto.Focus(); //limpar o código e retornar return; } if (conexao.State == ConnectionState.Open) conexao.Close(); } } private void txtQtde_KeyPress(object sender, KeyPressEventArgs e) { if (!char.IsDigit(e.KeyChar) && e.KeyChar != Convert.ToChar(8)) e.Handled = true; } private void txtQtde_Leave(object sender, EventArgs e) { if (string.IsNullOrEmpty(txtQtde.Text)) { txtQtde.Enabled = true; MessageBox.Show("Quantidade Não Pode Ficar em Branco!"); return; } if (Convert.ToInt32(txtQtde.Text) <= 0) //se a qtd for <= 0 { MessageBox.Show("Informe Uma Quantidade Válida", "Atenção"); txtQtde.Focus(); return; } if (Convert.ToInt32(txtSaldo.Text) <= 5) //se o saldo for <= 5 { MessageBox.Show("Produto em Estoque Acabando ", "Atenção"); } if (iSaldo_Atual < (Convert.ToInt32(txtQtde.Text))) //se o saldo atual for menor que a quantidade solicitada pelo produto { MessageBox.Show("Saldo Insuficiente!", "Atenção"); txtCodProduto.Focus(); return; } try { Int32 iqtde = Convert.ToInt32(txtQtde.Text); Double dpreco_venda = Convert.ToDouble(txtPrecoVenda.Text); Double dpreco_total = iqtde * dpreco_venda; txtPrecoTotal.Text = Convert.ToDouble(dpreco_total).ToString("########0.00"); btnNovo.Enabled = true; } catch { MessageBox.Show("Informe Uma Quantidade Válida!", "Atenção"); txtQtde.Focus(); } } private void Totalizar_venda(Double ntotal_item) { Double nvalor_total = Convert.ToDouble(txtValorTotal.Text); //total atual nvalor_total += ntotal_item; //novo valor total conexao.ConnectionString = StrConexao; cmd.Connection = conexao; cmd.CommandType = CommandType.Text; cmd.CommandText = "UPDATE VENDA SET VL_TOTAL = @ValorTotal WHERE NR_VENDA = @NrVenda"; //definir parametros cmd.Parameters.Clear(); cmd.Parameters.AddWithValue("@NrVenda", txtNr_Venda.Text); cmd.Parameters.AddWithValue("@ValorTotal", nvalor_total); conexao.Open(); cmd.ExecuteNonQuery(); conexao.Close(); } private void Exibir_Valor_Total_venda() { if (conexao.State == ConnectionState.Open) conexao.Close(); conexao.ConnectionString = StrConexao; cmd.Connection = conexao; conexao.Open(); cmd.CommandType = CommandType.Text; cmd.CommandText = "SELECT * FROM VENDA WHERE NR_VENDA= @NrVenda"; //definir parâmetros cmd.Parameters.Clear(); cmd.Parameters.AddWithValue("@NrVenda", txtNr_Venda.Text); Dr = cmd.ExecuteReader(); Dr.Read(); txtValorTotal.Text = Convert.ToDouble(Dr["VL_TOTAL"]).ToString("########0.00"); conexao.Close(); txtCodProduto.Clear(); txtDescricao.Clear(); txtQtde.Clear(); txtPrecoVenda.Clear(); txtPrecoTotal.Clear(); txtSaldo.Clear(); } private void Exibir_Valor_Total_venda1() { if (conexao.State == ConnectionState.Open) conexao.Close(); conexao.ConnectionString = StrConexao; cmd.Connection = conexao; conexao.Open(); cmd.CommandType = CommandType.Text; cmd.CommandText = "SELECT * FROM ITENS WHERE NR_VENDA= @NrVenda"; //definir parâmetros cmd.Parameters.Clear(); cmd.Parameters.AddWithValue("@NrVenda", txtNr_Venda.Text); Dr = cmd.ExecuteReader(); Dr.Read(); txtValorTotal.Text = Convert.ToDouble(Dr["PRECO_TOTAL"]).ToString("########0.00"); conexao.Close(); txtCodProduto.Clear(); txtDescricao.Clear(); txtQtde.Clear(); txtPrecoVenda.Clear(); txtPrecoTotal.Clear(); txtSaldo.Clear(); } private void btnNovo_Click(object sender, EventArgs e) { txtSaldo.Clear(); Double ntotal_item = Convert.ToDouble(txtPrecoTotal.Text); //total do item conexao.ConnectionString = StrConexao; cmd.Connection = conexao; cmd.CommandType = CommandType.Text; cmd.CommandText = "INSERT INTO ITENS (NR_VENDA, PRODUTO,QTDE, PRECO_UNIT,PRECO_TOTAL)" + " VALUES (@NrVenda, @CodProduto, @Qtde, @PrecoVenda, @PrecoTotal)"; //definir parametros cmd.Parameters.Clear(); cmd.Parameters.AddWithValue("@NrVenda", txtNr_Venda.Text); cmd.Parameters.AddWithValue("@CodProduto", txtCodProduto.Text); cmd.Parameters.AddWithValue("@Qtde", txtQtde.Text); cmd.Parameters.AddWithValue("@PrecoVenda", Convert.ToDecimal(txtPrecoVenda.Text)); cmd.Parameters.AddWithValue("@PrecoTotal", Convert.ToDecimal(txtPrecoTotal.Text)); conexao.Open(); cmd.ExecuteNonQuery(); conexao.Close(); btnNovo.Enabled = false; btnFinalizarVenda.Enabled = true; AtualizarSaldo(Convert.ToInt32(txtQtde.Text)); Totalizar_venda(ntotal_item); //totalizar a venda Exibir_Valor_Total_venda(); //após totalizar, exibir o novo valor total MontarListaItens(int.Parse(txtNr_Venda.Text)); txtCodProduto.Focus(); return; } private void MontarListaItens(int nNrVenda) { conexao.ConnectionString = StrConexao; try { conexao.Open(); } catch (System.Exception e) { MessageBox.Show(e.Message.ToString()); } if (conexao.State == ConnectionState.Open) { cmd.Connection = conexao; cmd.CommandType = CommandType.Text; cmd.CommandText = "SELECT PRODUTO.CODPROD, PRODUTO.DESCPROD, QTDE," + " PRECO_UNIT, PRECO_TOTAL FROM ITENS INNER JOIN PRODUTO ON " + " ITENS.PRODUTO = PRODUTO.CODPROD WHERE NR_VENDA = @NrVenda"; //definir parametros cmd.Parameters.Clear(); cmd.Parameters.AddWithValue("@NrVenda", nNrVenda); Dr = cmd.ExecuteReader(); DtITENS.Clear(); DtITENS.Load(Dr); dataGridView1.DataSource = DtITENS; conexao.Close(); dataGridView1.AutoGenerateColumns = false; } } private void Imprimir_Cupom() { Int32 inrVenda = Convert.ToInt32(txtNr_Venda.Text); //Cupom CP = new Cupom(); // CP.nrVenda = inrVenda; // CP.ShowDialog(); } private void AtualizarSaldo(Int32 iQtde) //metodo para atualizar a quantidade do produto no banco de dados { Int32 iNova_qtde = iSaldo_Atual - iQtde; //iNova_qtde(é a nova quantidade do banco de dados "QTDE") //Que é igual a isaldo_atual - iQtde conexao.ConnectionString = StrConexao; cmd.Connection = conexao; cmd.CommandType = CommandType.Text; cmd.CommandText = "UPDATE PRODUTO SET QTDESTPROD = @QTDE WHERE CODPROD = @Produto"; //definir parametros cmd.Parameters.Clear(); cmd.Parameters.AddWithValue("@QTDE", iNova_qtde); //iNova quantidade será o novo valor da tabela QTDE cmd.Parameters.AddWithValue("@Produto", txtCodProduto.Text); conexao.Open(); cmd.ExecuteNonQuery(); conexao.Close(); } private void AtualizarSaldo1(Int32 iQtde) //metodo para atualizar a quantidade do produto no banco de dados { Int32 iNova_qtde = iSaldo_Atual + iQtde; //iNova_qtde(é a nova quantidade do banco de dados "QTDE") //Que é igual a isaldo_atual - iQtde conexao.ConnectionString = StrConexao; cmd.Connection = conexao; cmd.CommandType = CommandType.Text; cmd.CommandText = "UPDATE PRODUTO SET QTDESTPROD = @QTDE WHERE CODPROD = @Produto"; //definir parametros cmd.Parameters.Clear(); cmd.Parameters.AddWithValue("@QTDE", iNova_qtde); //iNova quantidade será o novo valor da tabela QTDE cmd.Parameters.AddWithValue("@Produto", txtCodProduto.Text); conexao.Open(); cmd.ExecuteNonQuery(); conexao.Close(); } private void btnexcluir_Click(object sender, EventArgs e) { Double ntotal_item = Convert.ToDouble(txtPrecoTotal.Text); iSaldo_Atual = Convert.ToInt16(txtSaldo.Text); if (MessageBox.Show("Confirma a Exclusão Desse Item?", "Atenção", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { conexao.ConnectionString = StrConexao; cmd.Connection = conexao; cmd.CommandType = CommandType.Text; cmd.CommandText = "DELETE FROM ITENS WHERE Nr_Venda = @NrVenda AND PRODUTO = @Produto"; //definir parametros cmd.Parameters.Clear(); cmd.Parameters.AddWithValue("@NrVenda", txtNr_Venda.Text); cmd.Parameters.AddWithValue("@Produto", txtCodProduto.Text); try //try = testar... se esse código não funcionar, executa o catch { conexao.Open(); cmd.ExecuteNonQuery(); MessageBox.Show("Item Excluído com Sucesso!"); } catch (Exception ex) //catch = catar { MessageBox.Show(ex.Message.ToString(), "Atenção"); //mensagem que ajuda a identificar o erro(caso tenha) } finally { if (conexao.State == ConnectionState.Open) { conexao.Close(); btnexcluir.Enabled = false; AtualizarSaldo((Convert.ToInt32(txtQtde.Text) * -1)); Totalizar_venda(ntotal_item * -1); Exibir_Valor_Total_venda(); //após totalizar, exibir o novo valor total MontarListaItens(int.Parse(txtNr_Venda.Text)); txtCodProduto.Focus(); } } } } private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) { txtCodProduto.Text = dataGridView1.SelectedRows[0].Cells[0].Value.ToString(); txtDescricao.Text = dataGridView1.SelectedRows[0].Cells[1].Value.ToString(); txtPrecoVenda.Text = dataGridView1.SelectedRows[0].Cells[3].Value.ToString(); txtQtde.Text = dataGridView1.SelectedRows[0].Cells[2].Value.ToString(); txtPrecoTotal.Text = dataGridView1.SelectedRows[0].Cells[4].Value.ToString(); btnexcluir.Enabled = true; btnEditar.Enabled = true; MostrarSaldo(); } private void MostrarSaldo() { conexao.ConnectionString = StrConexao; cmd.Connection = conexao; cmd.CommandType = CommandType.Text; conexao.Open(); cmd.CommandText = "SELECT * FROM PRODUTO WHERE CODPROD = @Codigo"; cmd.Parameters.Clear(); cmd.Parameters.AddWithValue("@Codigo", txtCodProduto.Text); Dr = cmd.ExecuteReader(); if (Dr.HasRows) { Dr.Read(); iSaldo_Atual = Convert.ToInt32(Dr["QTDESTPROD"].ToString()); txtSaldo.Text = iSaldo_Atual.ToString(); conexao.Close(); } } private void btnFinalizarVenda_Click(object sender, EventArgs e) { if (MessageBox.Show("Confirma o Fechamento da Venda?", "Atenção", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { if (MessageBox.Show("Imprime está Venda?", "Atenção", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { Imprimir_Cupom(); } txtNr_Venda.Clear(); txtHora.Clear(); txtValorTotal.Clear(); mskData.Clear(); txtNr_Venda.Enabled = true; mskData.Enabled = true; txtHora.Enabled = true; btnSalvar.Enabled = true; DtITENS.Clear(); dataGridView1.DataSource = DtITENS; groupBox1.Enabled = false; txtNr_Venda.Focus(); return; } } private void btnEditar_Click(object sender, EventArgs e) { Double ntotal_item = Convert.ToDouble(txtPrecoTotal.Text); //total do item { conexao.ConnectionString = StrConexao; cmd.Connection = conexao; cmd.CommandType = CommandType.Text; cmd.CommandText = "UPDATE ITENS SET PRODUTO = @Produto, QTDE = @Qtde, PRECO_UNIT = @Preco_Unit, PRECO_TOTAL = @Preco_Total WHERE Nr_Venda = @Nr_Venda "; //definir parâmetros cmd.Parameters.Clear(); cmd.Parameters.AddWithValue("@Nr_Venda", txtNr_Venda.Text); cmd.Parameters.AddWithValue("@Produto", txtCodProduto.Text); cmd.Parameters.AddWithValue("@Qtde", txtQtde.Text); cmd.Parameters.AddWithValue("@Preco_Unit", txtPrecoVenda.Text); cmd.Parameters.AddWithValue("@Preco_Total", txtPrecoTotal.Text); if (conexao.State == ConnectionState.Open) { conexao.Close(); btnEditar.Enabled = false; btnFinalizarVenda.Enabled = true; AtualizarSaldo((Convert.ToInt32(txtQtde.Text) * +1)); //Diminui Saldo do Estoque Totalizar_venda(ntotal_item * +1); Exibir_Valor_Total_venda1(); //após totalizar, exibir o novo valor total MontarListaItens(int.Parse(txtNr_Venda.Text)); txtCodProduto.Focus(); } } } } }
Respostas
-
Olá Marcio,
Bom primeiro, não se ajusta estoque em sistema editando quantidade, se for projeto pequeno ou até mesmo de estudo, aconselho repensar esse conceito, para você evoluir, deve-se ter integridade nas informações, estou falando isso para você evoluir e começar da forma correta. Vamos imaginar o seguinte cenário.
Conceitos básicos:
1 - Tenha tabela de estoque separada do cadastro de produtos
2 - Usuário nunca altera o estoque (Pode fazer um ajuste através de transferências ou entradas de notas)
3 - Em sua situação aconselharia ter um processo separado para esse ajuste, já que o sistema pelo que vi pode vender sem estoque disponível.
Se você gostar de tentar aplicar essas regras, fique livre, caso contrário eu postarei a solução que precisar.
Não adianta eu lhe dá uma resposta para o que quer, sabendo que não está legal o objetivo que deseja alcançar, acreditamos que aqui no fórum tudo isso vai mais além, estamos aqui para ajudar não só resolver código, e sim ajudar também em uma solução melhor para o problema.
Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!
Rafael Almeida
Senior Developer C#
Development Leader at JAMSOFT Informática
Microsoft Certified Professional
Criador e Mantenedor do EntityFramework Core for Firebird
Contribuidor do EntityFramework Core
Email: ralms@ralms.net
Blog - GitHub - LinkedIn - Twitter- Marcado como Resposta Filipe B CastroModerator segunda-feira, 11 de dezembro de 2017 12:05