Usuário com melhor resposta
Cancelar Update , Rollback

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
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
- Marcado como Resposta Matheus L. M. C. Campos terça-feira, 16 de junho de 2015 21:15
Todas as 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
- Marcado como Resposta Matheus L. M. C. Campos terça-feira, 16 de junho de 2015 21:15