none
Cancelar Update , Rollback RRS feed

  • Pergunta

  • ola rapaziada bom minha duvida e o seguinte : vou postar o meu código pra que vcs entenda oque ta com tecendo :

      public ArrayList CarregaProdLista()
            {
                Conexao con = new Conexao();
                DataTable dt = new DataTable();
                ArrayList lista = new ArrayList();
                FbConnection econ = new FbConnection(con.Con());
                econ.Open();
                FbTransaction sqlTran = econ.BeginTransaction();
                
                // Enlist a command in the current transaction.
                FbCommand command = econ.CreateCommand();
                command.Transaction = sqlTran;
                try
                {
                    // Execute two separate commands.
                    command.CommandText =
                        "SELECT CodigoBarras, Nome,ValorVenda,Estoque" +
                                   " FROM Produtos" +
                                   " WHERE (CodigoBarras LIKE @CodigoBarras)" +
                                   " ORDER BY CodigoBarras";

                    command.Parameters.AddWithValue("CodigoBarras", "@codigobarras");

                    // Preenche o parametro com o valor obtido do campo texto
                    command.Parameters["@CodigoBarras"].Value = txtCodigoProd.Text + "%";
                    FbDataAdapter da = new FbDataAdapter(command);
                    da.Fill(dt);

                    foreach (DataRow dtrow in dt.Rows)
                    {
                        codProd = dtrow.ItemArray[0].ToString();
                        nomeProd = dtrow.ItemArray[1].ToString();
                        valorProd = Convert.ToDecimal(dtrow.ItemArray[2].ToString());
                        Estoque = Convert.ToInt32(dtrow.ItemArray[3].ToString());
                        lista.Add(dtrow);
                        for (int indice = 0; indice < lista.Count; indice++)
                        {
                            //Transaction();
                            indice = lista.Add(dtrow);
                            listBox1.Items.Add(dtrow.ItemArray[0] + " DESCRIÇÂO " + dtrow.ItemArray[1] + "-------R$:" + dtrow.ItemArray[2].ToString());
                            txtPrecoUnitario.Text = valorProd.ToString("00.00");
                            somaTotal += valorProd;
                            txtValor.Text = Convert.ToString(somaTotal);
                            txtQuantidade.Text = Estoque.ToString();
                        }

                    }
                 
                    command.ExecuteNonQuery();
                    command.CommandText =
                    "UPDATE produtos SET Estoque= Estoque -1 ";
                    command.ExecuteNonQuery();

                    // Commit the transaction.
                    sqlTran.Commit();
                    Label3.Text = "Foi atualizado o Estoque Com Sucesso !!!";
                }
                catch (Exception ex)
                {
                    // Handle the exception if the transaction fails to commit.
                    Label4.Text = ex.Message;


                    try
                    {
                      
                    

                        // Attempt to roll back the transaction.
                        sqlTran.Rollback();
                    
                    }
                    catch (Exception exRollback)
                    {
                        // Throws an InvalidOperationException if the connection 
                        // is closed or the transaction has already been rolled 
                        // back on the server.
                        Label5.Text = exRollback.Message;

                    }
                }

                return lista;
            }

    Bom como vcs pode ver eu tenho um listBox que lista o meus produtos, e acada passada do laço  e diminui  um  no banco de Dados minha duvida e que:  na aplicação  eu preciso de um botão para cancelar a  a venda no caso , e realocar de novo os dados como era antes tipo Um Rollback mais , nao sei se estou fazendo direito o Transaction  se alguém ai poder me ajudar  

    se tiver uma alma ai boa lendo me ajude por favor  estou fazendo uma Tela de venda PDV  na raça e para uma lojinha de uma amigo  se alguém souber de material que explica esse processo de Caixa Rápido , material sei la estou aki para aprende , fiquem para me manda  Deus abençoe 

    quinta-feira, 4 de junho de 2015 23:44

Respostas

  • João,

    existe uma boa prática para a estrutura do banco de dados.

    No seu caso você precisa criar IDs para cada venda efetuada, e consequentemente cada venda possuirá seus itens vendidos e seus preços no dia da venda... 

    Cria a estrutura do seu banco mais ou menos assim:

    TB_VENDA [SEQ_VENDA , DATA_VENDA , COD_CLIENTE , VLR_TOTAL_VENDA ] - onde SEQ_VENDA seja auto-increment

    e a tabela dos itens:

    TB_VENDA_ITEM [SEQ_VENDA , SEQ_ITEM , COD_PRODUTO , VLR_PRODUTO , QTD , VLR_TOTAL] - aqui o seq venda não é auto-increment e deverá ser o mesmo código lançado na TB_VENDA

    Como você está trabalhando com transactions você deve:

    Executar o comando para inserir os dados na tabela TB_VENDA

    Identificar qual o sequencial que foi criado na tabela TB_VENDA (pesquise por select Select Identity)

    Com o Seq_venda faça o laço por todos os itens e insira na TB_VENDA_ITEM informando esse sequencial.

    Se tudo der certo, commit, se não RollBack.

    Nesse ponto sua venda estará finalizada....

    Caso haja necessidade de cancelar a venda você deve inicialmente identificar o sequencial da venda.... suponhamos que o seq_venda seja 98.... aí você deve fazer um delete nas duas tabelas....

    delete * from TB_VENDA_ITEM where SEQ_VENDA = 98
    
    //e depois
    
    delete * from TB_VENDA where SEQ_VENDA = 98

    porém existe outra boa prática de que vendas não devem ser excluídas do banco, você deveria simplesmente criar mais uma coluna que determinaria o status da venda (P - PENDENTE / E - EFETUADA / C - CANCELADA )...

    assim você teria o controle de quantas vendas foram excluídas em um determinado período.

    infelizmente eu não tenho um exemplo simples somente disso pois tudo está separado por classes distintas e regras de negócio... mas acima serve como sugestão.

    Abraço!



    Natan

    domingo, 7 de junho de 2015 15:10

Todas as Respostas

  • Você poderia deixar como global a Trasanction ai quando finalizar a venda você da commit se cancelar você da Roolback, acho que assim deve funcionar.

    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    sexta-feira, 5 de junho de 2015 01:03
  • Não teria um exemplo mais detalhado de como fazer o botão de cancelar 
    sexta-feira, 5 de junho de 2015 22:27
  • João,

    existe uma boa prática para a estrutura do banco de dados.

    No seu caso você precisa criar IDs para cada venda efetuada, e consequentemente cada venda possuirá seus itens vendidos e seus preços no dia da venda... 

    Cria a estrutura do seu banco mais ou menos assim:

    TB_VENDA [SEQ_VENDA , DATA_VENDA , COD_CLIENTE , VLR_TOTAL_VENDA ] - onde SEQ_VENDA seja auto-increment

    e a tabela dos itens:

    TB_VENDA_ITEM [SEQ_VENDA , SEQ_ITEM , COD_PRODUTO , VLR_PRODUTO , QTD , VLR_TOTAL] - aqui o seq venda não é auto-increment e deverá ser o mesmo código lançado na TB_VENDA

    Como você está trabalhando com transactions você deve:

    Executar o comando para inserir os dados na tabela TB_VENDA

    Identificar qual o sequencial que foi criado na tabela TB_VENDA (pesquise por select Select Identity)

    Com o Seq_venda faça o laço por todos os itens e insira na TB_VENDA_ITEM informando esse sequencial.

    Se tudo der certo, commit, se não RollBack.

    Nesse ponto sua venda estará finalizada....

    Caso haja necessidade de cancelar a venda você deve inicialmente identificar o sequencial da venda.... suponhamos que o seq_venda seja 98.... aí você deve fazer um delete nas duas tabelas....

    delete * from TB_VENDA_ITEM where SEQ_VENDA = 98
    
    //e depois
    
    delete * from TB_VENDA where SEQ_VENDA = 98

    porém existe outra boa prática de que vendas não devem ser excluídas do banco, você deveria simplesmente criar mais uma coluna que determinaria o status da venda (P - PENDENTE / E - EFETUADA / C - CANCELADA )...

    assim você teria o controle de quantas vendas foram excluídas em um determinado período.

    infelizmente eu não tenho um exemplo simples somente disso pois tudo está separado por classes distintas e regras de negócio... mas acima serve como sugestão.

    Abraço!



    Natan

    domingo, 7 de junho de 2015 15:10