Lock Registro Dbexpress + FireBird 2.1
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
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
Curtidas 0
Respostas
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.
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
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
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
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
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
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...
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
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é
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.
Sendo assim estou dando o tópico por concluído.
GOSTEI 0