Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
oneshotbr Colaborador


Registrado: Quarta-Feira, 6 de Mai de 2009 Mensagens: 1948 Localização: Taubaté - SP
|
Enviada: Seg Dez 16, 2013 10:25 am Assunto: Incrementar e decrementar estoque e saldo bancario. |
|
|
Bom dia,
Gostaria de saber como vocês fazem a incrementação e decrementação do estoque e saldo bancário no sistema de vocês, eu sei que podemos fazer via código (delphi) ou criar uma trigger no banco mas qual é o melhor modo? Quais são os prós e contra de cada um? _________________ AMD Phenom II X4 960T 3.00 GHz - 8 GB DDR III - HD 1000 GB SATA - GeForce GTX 650 TI GDDR 5 - Monitor 21,5" Full HD - Kubuntu 14.04 + Windows 7 Professional x64. |
|
Voltar ao Topo |
|
 |
johnny-walker Moderador


Registrado: Sábado, 4 de Outubro de 2003 Mensagens: 10653 Localização: Contagem/MG - BRAZIL
|
Enviada: Seg Dez 16, 2013 10:57 am Assunto: |
|
|
Eu acho melhor vc fazer numa transação no banco de dados, pois se algo sair errado toda a transação seria excluída e não teria problemas com registros órfãos no banco.
Acho mais seguro, pois no banco ou é tudo ou nada, caso saia algo errado...
bye _________________ P.O.W.E.R B.Y D.E.L.P.H.I |
|
Voltar ao Topo |
|
 |
oneshotbr Colaborador


Registrado: Quarta-Feira, 6 de Mai de 2009 Mensagens: 1948 Localização: Taubaté - SP
|
Enviada: Qua Dez 18, 2013 8:56 am Assunto: |
|
|
Por código eu faço assim.
Exemplo de recebimento de contas.
Código: | var
contasID:integer;
saldo, valorPago:currency;
begin
contasID := ds.DataSet.FieldByName('CONTASID').AsInteger;
dsContas.DataSet.Locate('CONTASID', contasID, []);
saldo := dsContas.DataSet.FieldByName('SALDOINICIAL').AsCurrency;
valorPago := Ds.DataSet.FieldByName('VALORPAGO').AsCurrency;
saldo := saldo + valorPago;
dscontas.DataSet.Edit;
dsContas.DataSet.FieldByName('SALDOINICIAL').AsCurrency := saldo;
TClientDataSet(dsContas.Dataset).ApplyUpdates(0); |
Pelo banco de dados eu faço assim.
Exemplo de estoque no before delete.
Código: | AS
begin
/* Trigger text */
update estoque set estoque.quantidade = estoque.quantidade - old.quantidade
where estoque.codigo = old.codigo;
end |
Esse modelo de trigger está correto? Posso utilizar ele para o contas? _________________ AMD Phenom II X4 960T 3.00 GHz - 8 GB DDR III - HD 1000 GB SATA - GeForce GTX 650 TI GDDR 5 - Monitor 21,5" Full HD - Kubuntu 14.04 + Windows 7 Professional x64. |
|
Voltar ao Topo |
|
 |
Ghost_Rider Colaborador

Registrado: Segunda-Feira, 6 de Outubro de 2003 Mensagens: 4437
|
Enviada: Qua Dez 18, 2013 10:06 pm Assunto: |
|
|
Pelo banco de dados, como disse o jhonny, não tem volta, logo, pra arrumar um erro é um trampo brabo, principalmente se voce usa FK no banco..
Pelo código, sugiro proteger com um try except....
Eu faço quase tudo via código, justamente por ter maior controle do que eu poderei controlar... |
|
Voltar ao Topo |
|
 |
oneshotbr Colaborador


Registrado: Quarta-Feira, 6 de Mai de 2009 Mensagens: 1948 Localização: Taubaté - SP
|
Enviada: Qui Dez 19, 2013 8:31 am Assunto: |
|
|
Citação: | Pelo banco de dados, como disse o jhonny, não tem volta, logo, pra arrumar um erro é um trampo brabo, principalmente se voce usa FK no banco..
Pelo código, sugiro proteger com um try except....
Eu faço quase tudo via código, justamente por ter maior controle do que eu poderei controlar... |
Certo! Eu acho que o meu caso para estoque eu vou ter que fazer via código mesmo agora o saldo bancário eu até posso fazer pelo banco.
Ghost a minha dúvida é a seguinte se eu tenho uma tabela master detail com 1 compra e 10 itens e se eu cancelar o master ele vai estornar todo o meu estoque? _________________ AMD Phenom II X4 960T 3.00 GHz - 8 GB DDR III - HD 1000 GB SATA - GeForce GTX 650 TI GDDR 5 - Monitor 21,5" Full HD - Kubuntu 14.04 + Windows 7 Professional x64. |
|
Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qui Dez 19, 2013 10:56 am Assunto: |
|
|
Bom dia,
oneshotbr, acho que você pode ter problemas com aquele código que você postou se o sistema for utilizado em um ambiente multiusuário, pois o saldo pode ser atualizado por outro usuário entre a abertura do DataSet e o calculo antes da edição.
Acho que seria mais seguro utilizar um Update semelhante ao da trigger que você postou para atualizar o saldo, seja ele executado pela aplicação ou pela trigger.
Espero que ajude.
Editado pela última vez por imex em Ter Out 03, 2023 11:52 am, num total de 1 vez |
|
Voltar ao Topo |
|
 |
oneshotbr Colaborador


Registrado: Quarta-Feira, 6 de Mai de 2009 Mensagens: 1948 Localização: Taubaté - SP
|
Enviada: Qui Dez 19, 2013 8:59 pm Assunto: |
|
|
Citação: | Bom dia,
oneshotbr, acho que você pode ter problemas com aquele código que você postou se o sistema for utilizado em um ambiente multiusuário, pois o saldo pode ser atualizado por outro usuário entre a abertura do DataSet e o calculo antes da edição.
Acho que seria mais seguro utilizar um Update semelhante ao da trigger que você postou para atualizar o saldo, seja ele executado pela aplicação ou pela trigger.
Espero que ajude. |
Imex,
O sistema será utilizado por multi usuários o saldo só é liberar para ser alterado direto na tabela quando está inserindo uma nova conta mas pelo o que você falou acho que quis dizer no caso de um usuário pagar uma conta e outro usuário receber ou pagar uma outra conta correto? _________________ AMD Phenom II X4 960T 3.00 GHz - 8 GB DDR III - HD 1000 GB SATA - GeForce GTX 650 TI GDDR 5 - Monitor 21,5" Full HD - Kubuntu 14.04 + Windows 7 Professional x64. |
|
Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Sex Dez 20, 2013 8:41 am Assunto: |
|
|
Acho que o problema que citei pode ocorrer se houver a possibilidade de serem executadas ao mesmo tempo qualquer operação no sistema que altere o saldo. Ex:
- vendedor A e B vendendo o mesmo produto
- venda de um produto quando está sendo lançada uma entrada no estoque
- operador A e B pagando contas diferentes
- etc...
Espero que ajude. |
|
Voltar ao Topo |
|
 |
oneshotbr Colaborador


Registrado: Quarta-Feira, 6 de Mai de 2009 Mensagens: 1948 Localização: Taubaté - SP
|
Enviada: Sex Dez 20, 2013 8:59 am Assunto: |
|
|
Citação: | Acho que o problema que citei pode ocorrer se houver a possibilidade de serem executadas ao mesmo tempo qualquer operação no sistema que altere o saldo. Ex:
- vendedor A e B vendendo o mesmo produto
- venda de um produto quando está sendo lançada uma entrada no estoque
- operador A e B pagando contas diferentes
- etc...
Espero que ajude. |
Entendi, é o que eu pensei mesmo! Vou passar o saldo para triggers então mas o estoque eu vou ter que passar por código porque na mesma tela eu vou incrementar e decrementar o estoque. _________________ AMD Phenom II X4 960T 3.00 GHz - 8 GB DDR III - HD 1000 GB SATA - GeForce GTX 650 TI GDDR 5 - Monitor 21,5" Full HD - Kubuntu 14.04 + Windows 7 Professional x64. |
|
Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Sex Dez 20, 2013 9:47 am Assunto: |
|
|
oneshotbr escreveu: | ...mas o estoque eu vou ter que passar por código porque na mesma tela eu vou incrementar e decrementar o estoque. |
Você quis dizer nesse trecho que vai executar um Update pela sua aplicação para atualizar o saldo? |
|
Voltar ao Topo |
|
 |
oneshotbr Colaborador


Registrado: Quarta-Feira, 6 de Mai de 2009 Mensagens: 1948 Localização: Taubaté - SP
|
Enviada: Qui Jan 02, 2014 10:26 am Assunto: |
|
|
Citação: | Você quis dizer nesse trecho que vai executar um Update pela sua aplicação para atualizar o saldo? |
Não, é o seguinte eu tenho uma tela que se chama Movimentação de produtos e nela eu faço várias operações com os meus produtos tais como:
Entrada, Saida, devolução do cliente, devolução do fornecedor e consumo interno.
Algumas operações são de inclusão no estoque e outras são de retirada de estoque!
Só que a minha dúvida é a seguinte em uma tabela master detail onde master é a movimentação e o detalhe são os itens como eu vou fazer isso?
Porque se eu incluir 10 produtos e clicar no cancelar do master ele cancela todos os meus itens e vai dar baixa no estoque. _________________ AMD Phenom II X4 960T 3.00 GHz - 8 GB DDR III - HD 1000 GB SATA - GeForce GTX 650 TI GDDR 5 - Monitor 21,5" Full HD - Kubuntu 14.04 + Windows 7 Professional x64. |
|
Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Seg Jan 06, 2014 8:52 am Assunto: |
|
|
oneshotbr escreveu: | Porque se eu incluir 10 produtos e clicar no cancelar do master ele cancela todos os meus itens e vai dar baixa no estoque. |
Acho que depende do momento em que você dá baixa no estoque.
De forma geral, acredito que nesse tipo de situação seja comum iniciar uma transação no banco de dados para poder cancelar todas as modifições se ocorrer algum erro.
Lembrando que a transação deve de preferência ser iniciada e finalizada o mais rápido possível para não comsumir muitos recursos do BD.
Segue um exemplo de código (post do Marco Salles) no tópico abaixo:
http://www.activedelphi.com.br/forum/viewtopic.php?t=76028&postdays=0&postorder=asc&start=15
Espero que ajude. |
|
Voltar ao Topo |
|
 |
oneshotbr Colaborador


Registrado: Quarta-Feira, 6 de Mai de 2009 Mensagens: 1948 Localização: Taubaté - SP
|
Enviada: Qui Jan 09, 2014 4:56 pm Assunto: |
|
|
Citação: | Acho que depende do momento em que você dá baixa no estoque.
De forma geral, acredito que nesse tipo de situação seja comum iniciar uma transação no banco de dados para poder cancelar todas as modifições se ocorrer algum erro.
Lembrando que a transação deve de preferência ser iniciada e finalizada o mais rápido possível para não comsumir muitos recursos do BD.
Segue um exemplo de código (post do Marco Salles) no tópico abaixo:
http://www.activedelphi.com.br/forum/viewtopic.php?t=76028&postdays=0&postorder=asc&start=15 |
Sim, imex o problema está sendo na hora que eu dou baixa no estoque! Quando eu trabalhava com os componentes IBX eu fazia o masterdetail "na mão" tento que passar o código do pai para os itens filho agora com o dbexpress ele "faz tudo" sozinho e quando eu dou um applyupdates no master ou no detail ele funciona nos 2, eu li o texto mas não sei achei nada para me ajudar. _________________ AMD Phenom II X4 960T 3.00 GHz - 8 GB DDR III - HD 1000 GB SATA - GeForce GTX 650 TI GDDR 5 - Monitor 21,5" Full HD - Kubuntu 14.04 + Windows 7 Professional x64. |
|
Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Sex Jan 10, 2014 10:18 am Assunto: |
|
|
Pelo que entendi você está fazendo o Master/Detail utilizando DataSetField, certo? Nesse caso deve ser executado apenas o ApplyUpdates do ClientDataSet Master.
Sobre a baixa do estoque, imagino que seja uma terceira tabela a ser atualizada, diferente da Master e da Detail. Estou certo? Como e quando você fazia a baixa com IBX? |
|
Voltar ao Topo |
|
 |
oneshotbr Colaborador


Registrado: Quarta-Feira, 6 de Mai de 2009 Mensagens: 1948 Localização: Taubaté - SP
|
Enviada: Seg Jan 13, 2014 9:35 am Assunto: |
|
|
Citação: | Pelo que entendi você está fazendo o Master/Detail utilizando DataSetField, certo? Nesse caso deve ser executado apenas o ApplyUpdates do ClientDataSet Master.
Sobre a baixa do estoque, imagino que seja uma terceira tabela a ser atualizada, diferente da Master e da Detail. Estou certo? Como e quando você fazia a baixa com IBX? |
Sim, exatamente usando os DataSetFields do DbExpress, não existe uma terceira tabela! Eu trabalho com 2 tabelas mesmo a de movimentacao e os itens da movimentacao, no ibx eu não usava os DataSetFields então eu atualizar o details era sem problemas, sobre como eu fazia eu só salvava direto na base. _________________ AMD Phenom II X4 960T 3.00 GHz - 8 GB DDR III - HD 1000 GB SATA - GeForce GTX 650 TI GDDR 5 - Monitor 21,5" Full HD - Kubuntu 14.04 + Windows 7 Professional x64. |
|
Voltar ao Topo |
|
 |
|