duvida em rotina
Pessoal,
Tenho a rotina abaixo, onde seleciono dados em uma tabela de estoque, e em seguida faço um update, atualizando este estoque...minha dúvida é..como garantir que o estoque que peguei no select nao foi alterado por outra pessoa..antes que eu dê o update... Grato pela ajuda.
frmprincipal.IBSQL.Close;
frmprincipal.IBSQL.SQL.Clear;
frmprincipal.IBSQL.SQL.Add(´select * from bolao where codigo = ´ + quotedstr(bolao));
frmprincipal.IBSQL.Prepare;
frmprincipal.IBSQL.ExecQuery;
estoque := frmprincipal.IBSQL.fieldByName(´estoque´).asstring;
vendidos:= frmprincipal.IBSQL.fieldByName(´vendidos´).asstring;
novoestoque := floattostr(strtofloat(estoque) + strtofloat(totalpedido));
novovendidos:= floattostr(strtofloat(vendidos)- strtofloat(totalpedido));
//atualiza valores do bolao
If not frmprincipal.IBSQL.Transaction.InTransaction then
frmprincipal.IBSQL.Transaction.StartTransaction;
frmprincipal.IBSQL.Close;
frmprincipal.IBSQL.SQL.Clear;
frmprincipal.IBSQL.SQL.Add(´UPDATE BOLAO SET´);
frmprincipal.IBSQL.SQL.Add(´ESTOQUE = ´+QuotedStr(novoestoque));
frmprincipal.IBSQL.SQL.Add(´,VENDIDOS = ´+QuotedStr(novovendidos));
frmprincipal.IBSQL.SQL.Add(´Where codigo = ´+QuotedStr(bolao));
frmprincipal.IBSQL.Prepare;
frmprincipal.IBSQL.ExecQuery;
frmprincipal.IBSQL.Transaction.CommitRetaining;
Rogerio Busch
Tenho a rotina abaixo, onde seleciono dados em uma tabela de estoque, e em seguida faço um update, atualizando este estoque...minha dúvida é..como garantir que o estoque que peguei no select nao foi alterado por outra pessoa..antes que eu dê o update... Grato pela ajuda.
frmprincipal.IBSQL.Close;
frmprincipal.IBSQL.SQL.Clear;
frmprincipal.IBSQL.SQL.Add(´select * from bolao where codigo = ´ + quotedstr(bolao));
frmprincipal.IBSQL.Prepare;
frmprincipal.IBSQL.ExecQuery;
estoque := frmprincipal.IBSQL.fieldByName(´estoque´).asstring;
vendidos:= frmprincipal.IBSQL.fieldByName(´vendidos´).asstring;
novoestoque := floattostr(strtofloat(estoque) + strtofloat(totalpedido));
novovendidos:= floattostr(strtofloat(vendidos)- strtofloat(totalpedido));
//atualiza valores do bolao
If not frmprincipal.IBSQL.Transaction.InTransaction then
frmprincipal.IBSQL.Transaction.StartTransaction;
frmprincipal.IBSQL.Close;
frmprincipal.IBSQL.SQL.Clear;
frmprincipal.IBSQL.SQL.Add(´UPDATE BOLAO SET´);
frmprincipal.IBSQL.SQL.Add(´ESTOQUE = ´+QuotedStr(novoestoque));
frmprincipal.IBSQL.SQL.Add(´,VENDIDOS = ´+QuotedStr(novovendidos));
frmprincipal.IBSQL.SQL.Add(´Where codigo = ´+QuotedStr(bolao));
frmprincipal.IBSQL.Prepare;
frmprincipal.IBSQL.ExecQuery;
frmprincipal.IBSQL.Transaction.CommitRetaining;
Rogerio Busch
Lrbusch
Curtidas 0
Respostas
Daykas
17/02/2009
Prezado!
Você só pode se garantir se utilizar uma procedure no seu banco de dados, ou seja, ela busca o estoque atual em tempo real e atualiza, independente de que outro usuário esteja dando uma saída ou entrada ao mesmo tempo.
O problema só será gerado se você utilizar variáveis no seu fonte para atualizar o estoque. Ai nunca dará certo mesmo.
Você só pode se garantir se utilizar uma procedure no seu banco de dados, ou seja, ela busca o estoque atual em tempo real e atualiza, independente de que outro usuário esteja dando uma saída ou entrada ao mesmo tempo.
O problema só será gerado se você utilizar variáveis no seu fonte para atualizar o estoque. Ai nunca dará certo mesmo.
GOSTEI 0
Lrbusch
17/02/2009
Pessoal,
Como eu faço para criar uma procedure em banco firebird, para atualizacao de estoque..como eu chamo ela...alguem poderia me ajudar?
Tenho a rotina abaixo..que atualiza o estoque em uma tabela, mas preciso garantir que o valor de estoque atual seja correto, sem que ninguem altere este valor enquanto eu estou atualizando...Para isso teria que criar uma procedure direto no banco e chama-la pelo programa..seria isso? Como faço isso?
frmprincipal.IBSQL.Close;
frmprincipal.IBSQL.SQL.Clear;
frmprincipal.IBSQL.SQL.Add(´select * from bolao where codigo = ´ + quotedstr(bolao));
frmprincipal.IBSQL.Prepare;
frmprincipal.IBSQL.ExecQuery;
estoque := frmprincipal.IBSQL.fieldByName(´estoque´).asstring;
vendidos:= frmprincipal.IBSQL.fieldByName(´vendidos´).asstring;
novoestoque := floattostr(strtofloat(estoque) + strtofloat(totalpedido));
novovendidos:= floattostr(strtofloat(vendidos)- strtofloat(totalpedido));
//atualiza valores do bolao
If not frmprincipal.IBSQL.Transaction.InTransaction then
frmprincipal.IBSQL.Transaction.StartTransaction;
frmprincipal.IBSQL.Close;
frmprincipal.IBSQL.SQL.Clear;
frmprincipal.IBSQL.SQL.Add(´UPDATE BOLAO SET´);
frmprincipal.IBSQL.SQL.Add(´ESTOQUE = ´+QuotedStr(novoestoque));
frmprincipal.IBSQL.SQL.Add(´,VENDIDOS = ´+QuotedStr(novovendidos));
frmprincipal.IBSQL.SQL.Add(´Where codigo = ´+QuotedStr(bolao));
frmprincipal.IBSQL.Prepare;
frmprincipal.IBSQL.ExecQuery;
frmprincipal.IBSQL.Transaction.CommitRetaining;
Rogerio Busch
Como eu faço para criar uma procedure em banco firebird, para atualizacao de estoque..como eu chamo ela...alguem poderia me ajudar?
Tenho a rotina abaixo..que atualiza o estoque em uma tabela, mas preciso garantir que o valor de estoque atual seja correto, sem que ninguem altere este valor enquanto eu estou atualizando...Para isso teria que criar uma procedure direto no banco e chama-la pelo programa..seria isso? Como faço isso?
frmprincipal.IBSQL.Close;
frmprincipal.IBSQL.SQL.Clear;
frmprincipal.IBSQL.SQL.Add(´select * from bolao where codigo = ´ + quotedstr(bolao));
frmprincipal.IBSQL.Prepare;
frmprincipal.IBSQL.ExecQuery;
estoque := frmprincipal.IBSQL.fieldByName(´estoque´).asstring;
vendidos:= frmprincipal.IBSQL.fieldByName(´vendidos´).asstring;
novoestoque := floattostr(strtofloat(estoque) + strtofloat(totalpedido));
novovendidos:= floattostr(strtofloat(vendidos)- strtofloat(totalpedido));
//atualiza valores do bolao
If not frmprincipal.IBSQL.Transaction.InTransaction then
frmprincipal.IBSQL.Transaction.StartTransaction;
frmprincipal.IBSQL.Close;
frmprincipal.IBSQL.SQL.Clear;
frmprincipal.IBSQL.SQL.Add(´UPDATE BOLAO SET´);
frmprincipal.IBSQL.SQL.Add(´ESTOQUE = ´+QuotedStr(novoestoque));
frmprincipal.IBSQL.SQL.Add(´,VENDIDOS = ´+QuotedStr(novovendidos));
frmprincipal.IBSQL.SQL.Add(´Where codigo = ´+QuotedStr(bolao));
frmprincipal.IBSQL.Prepare;
frmprincipal.IBSQL.ExecQuery;
frmprincipal.IBSQL.Transaction.CommitRetaining;
Rogerio Busch
GOSTEI 0