ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Incrementar e decrementar estoque e saldo bancario.
Ir à página 1, 2  Próximo
 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
oneshotbr
Colaborador
Colaborador


Registrado: Quarta-Feira, 6 de Mai de 2009
Mensagens: 1948
Localização: Taubaté - SP

MensagemEnviada: Seg Dez 16, 2013 10:25 am    Assunto: Incrementar e decrementar estoque e saldo bancario. Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
johnny-walker
Moderador
Moderador


Registrado: Sábado, 4 de Outubro de 2003
Mensagens: 10653
Localização: Contagem/MG - BRAZIL

MensagemEnviada: Seg Dez 16, 2013 10:57 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
oneshotbr
Colaborador
Colaborador


Registrado: Quarta-Feira, 6 de Mai de 2009
Mensagens: 1948
Localização: Taubaté - SP

MensagemEnviada: Qua Dez 18, 2013 8:56 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
Ghost_Rider
Colaborador
Colaborador


Registrado: Segunda-Feira, 6 de Outubro de 2003
Mensagens: 4437

MensagemEnviada: Qua Dez 18, 2013 10:06 pm    Assunto: Responder com 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...
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
oneshotbr
Colaborador
Colaborador


Registrado: Quarta-Feira, 6 de Mai de 2009
Mensagens: 1948
Localização: Taubaté - SP

MensagemEnviada: Qui Dez 19, 2013 8:31 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qui Dez 19, 2013 10:56 am    Assunto: Responder com 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.


Editado pela última vez por imex em Ter Out 03, 2023 11:52 am, num total de 1 vez
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
oneshotbr
Colaborador
Colaborador


Registrado: Quarta-Feira, 6 de Mai de 2009
Mensagens: 1948
Localização: Taubaté - SP

MensagemEnviada: Qui Dez 19, 2013 8:59 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Sex Dez 20, 2013 8:41 am    Assunto: Responder com 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.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
oneshotbr
Colaborador
Colaborador


Registrado: Quarta-Feira, 6 de Mai de 2009
Mensagens: 1948
Localização: Taubaté - SP

MensagemEnviada: Sex Dez 20, 2013 8:59 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Sex Dez 20, 2013 9:47 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
oneshotbr
Colaborador
Colaborador


Registrado: Quarta-Feira, 6 de Mai de 2009
Mensagens: 1948
Localização: Taubaté - SP

MensagemEnviada: Qui Jan 02, 2014 10:26 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Seg Jan 06, 2014 8:52 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
oneshotbr
Colaborador
Colaborador


Registrado: Quarta-Feira, 6 de Mai de 2009
Mensagens: 1948
Localização: Taubaté - SP

MensagemEnviada: Qui Jan 09, 2014 4:56 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Sex Jan 10, 2014 10:18 am    Assunto: Responder com 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?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
oneshotbr
Colaborador
Colaborador


Registrado: Quarta-Feira, 6 de Mai de 2009
Mensagens: 1948
Localização: Taubaté - SP

MensagemEnviada: Seg Jan 13, 2014 9:35 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Ir à página 1, 2  Próximo
Página 1 de 2

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB