Lock Registro Dbexpress + FireBird 2.1

Firebird

22/03/2012

Olá bom dia!

Tenho um sistema Ordem de Serviço que roda em rede e ultimamente vinha apresentando um
problema no valor total da conta, logo descobri q em alguns terminais
o programa ficava editado com o mesma registro.
A primeira (TA) com valor 50,00,
o segunda (TB) com valor 200,00 e
o terceira (TC) com valor 500,00 todos editando.
O terminal (TC) lancava pecas e fechava total 500,00, logo o termina
(TB) fecha valor tal R$ 200,00.
O Termnal (Tc) voltava a consulta a mesma venda e la tinha o valor
total de R$ 200,00 mas se somasse o valor do itens o valor seria 700,00.

Então pergunto tem como eu fazer um lock (como em Paradox ou Clipper) no
registro editado para q um segundo usuario não o edit ?

Obs: Usuarios q editam ao mesmo tempo, Recepcionista, Usuario-Dep-Pecas (Estoque) e o Caixa que fecha a OS.


Caso tenha uma outra solução, bem vinda.

desde já meus agradecimentos a quem puder ajudar.

100+

ANT.CARLOS/SP
Antonio Jesus

Antonio Jesus

Curtidas 0

Respostas

Diego Lusa

Diego Lusa

22/03/2012

Olá Antônio.

Este é um típico caso de concorrência transacional. Acredito que você deva utilizar a transação com nível de isolamento Serializable. Assim, as operações concorrentes serão ordenadas de forma que a sua execução seja equivalente à execução sequencial das mesmas.
GOSTEI 0
Antonio Jesus

Antonio Jesus

22/03/2012

olá!
Há muito tempo já vinha pessando nisto q um dia poderia ocorrer.
Quando comecei a estudar BD Distribuidos, ai q vi claramente uma falha no meu sistema.

Vc de ter entendido bem o q eu disse.

Então como ficaria:

To falando de Ordem de Serviço:
o Term-1 abri a OS No 2500 e informou 1 produto R$ 100,00 e ficou editando,
o Term-2 abri a OS No 2500 e informou + 2 produto R$ 200,00 e ficou editando,
o Term-3 abri a OS No 2500 e informou + 3 produto R$ 300,00 e ficou editando, finalizou a OS, valor total : R$ 300,00.
o term-2 finalizou a OS e foi calculado R$ 200,00 no total dos serviços e assim aconteceria com o Term-1.

no final o term-3 iria abrir a Os 2500 novamente e viria 6 produtos e valor Total da OS igual a R$ 100,00.

Claro q no meu sistema ao fecha a OS o valor total é recalculado, mas o caixa passaria para o cliente o valor de R$ 100,00 e ao fecha seria apresentado do valor real de R$ 600,00.

Mas se eu serealizar o ultimo update será o q permanecer, então não vai continuar errado.

Por enquanto deu um jeito em logo apos salvar recalcular lendo os itens no banco e recalculando isto pq uso ClientDataSet.

100+

ANT.CARLOS/SP












GOSTEI 0
Diego Lusa

Diego Lusa

22/03/2012

Acredito que quando um terminal estiver editando a ordem, os demais devem ser impedidos de editá-la. Utilize o SELECT ... FOR UPDATE, que cria um bloqueio para os registros.
Uma vez bloqueado, os demais terminais que tentarem adiquirir o bloqueio sobre o registro já bloqueado serão impedidos de fazê-lo. Somente após quem adiquiriu o bloqueio comitar a transação, o próximo será liberado para editar o registro
GOSTEI 0
Daniel Capelari

Daniel Capelari

22/03/2012

to desenterrando o tópico, mas nao podia deixar passar batido.

vc está gravando o valor do pedido e é esse o problema. vc não precisa gravar o valor do pedido. vc deve calcular com base nos seus produtos. vc não precisa de um campo com o total gravado. no máximo vc pode ter um campo calculado.

se vc bloquear o registro pra alteração vai "resolver" o problema do banco de dados e estragar totalmente o processo da loja... imagina cada terminal esperando sua vez de trabalhar...
GOSTEI 0
Antonio Jesus

Antonio Jesus

22/03/2012

To falando de Ordem de Serviço:
o Term-1 abri a OS No 2500 e informou 1 produto R$ 100,00 e ficou editando,
o Term-2 abri a OS No 2500 e informou + 2 produto R$ 200,00 e ficou editando,
o Term-3 abri a OS No 2500 e informou + 3 produto R$ 300,00 e ficou editando, finalizou a OS, valor total : R$ 300,00.
o term-2 finalizou a OS e foi calculado R$ 200,00 no total dos serviços e assim aconteceria com o Term-1.


Então descobri qual era o problema e resolvi-o.

1-era o seguinte o Term-1 abria uma Ord.Serviço N.5200 e alterava lançando mais serviços e não salvava,
o caixa TERM-CX abria esta mesma OS e fazia o fechamento com valores já salvos, mais tarde o TERM-1 salva as
alterações efetuadas, e a merda, a OS já tinha sido fechada e os valores da OS fechada as 12:00hs R$ 200,00 as 13:00hs TERM-1 salvava as alterações e os valores eram de R$ 300,00.

Solução, tive q fazer uma rotina p/ q o caixa só feche uma OS se a mesma tiver sido finaliza pelos frentistas.

Obrigado pela atenção.

100+

ANT.CARLOS/SP



GOSTEI 0
José

José

22/03/2012

Antonio que bom que conseguiu solucionar sua duvida, e obrigado por compartilhar a solução conosco.
Sendo assim estou dando o tópico por concluído.
GOSTEI 0
POSTAR