duvida em rotina

Delphi

17/02/2009

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


Lrbusch

Lrbusch

Curtidas 0

Respostas

Daykas

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.


GOSTEI 0
Lrbusch

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


GOSTEI 0
POSTAR