Fórum Bloquear Registro #41232

29/12/2003

0

Uso FB1.5 e Delphi 7 IBX -> IBDataSet
Transaction -> Read-Committed
Um Componente Transaction para cadastros e outro para Pedido

1º Problema
- Edito um produto (deixo em edição)
- Lanço um pedido que contenha este produto e gravo
- Confirmo a alteração do produto
Erro: O Estoque deste produto permanece o mesmo. Ou seja, toda a movimento perde ao gravar o produto.
Resolvi tirando o campo estoque no ModifySQL do IBDataSet.
Estou certo ou existe outra maneira mais correta?

2º Problema
- Quando duas ou mais usuários lançam um pedido que contenha o mesmo produto e confirmam a inclusão ao mesmo tempo, gerando um DeadLock. (A Rotina de atualizar o estoque está em uma trigger)
Como resolver isto? Teria como esperar o registro sair da edição?


Lucianoko

Lucianoko

Responder

Posts

30/12/2003

Afarias

Tirar o campo estoque do UpdateSQL no cadastro do produto e manter a atualização do registro de estoque em uma trigger são boas abordágens.

Os registros são bloqueados quando vc altera e dá um POST. Procure COMITAR a transação assim q realizar o post.

Se ainda assim tiver pequenos conflitos, coloque as transações em WAIT -- mas tenha cuidado para não manter ´bloqueios´ longos.


T+


Responder

Gostei + 0

30/12/2005

Raserafim

afarias, vc pode dar um exemplo de como fazer isso em uma trigger?


Responder

Gostei + 0

30/12/2005

Afarias

|afarias, vc pode dar um exemplo de como fazer isso em uma trigger?

tudo depende muito da estrutura do banco, mas supondo algo básico como:

tabela: produtos {cod, desc, preco, estoque}
tabela: itens_venda {num, cod_venda, cod_prod, qtde, preco, total_item}

vc pode então ter uma trigger after insert em itens_venda da forma:

create trigger tr_estoque1 for itens_venda after insert as
begin
  update produtos set
    estoque = estoque - new.qtde
    where cod = new.cod_prod;
end;



bom, *dependendo* da sua forma/política de ´correção´ de vendas etc, vc pode ter a necessidade tb de criar uma trigger after update para o caso de uma qtde de item de venda for alterado depois de incluída a venda, algo +/- assim:

create trigger tr_estoque1 for itens_venda after update as
begin
  update produtos set
    estoque = estoque + old.qtde - new.qtde
    where cod = new.cod_prod;
end;



bom, note q esses são códigos exemplos!

T+


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar