Atualizando tabela estoque via codigo SQLgt;
Ola pessoal, tentei atualizar minha tabela Estoque desta forma:
Mais infelismente não deu certo, como faço para que este funcione corretamente?
procedure TFRm_EntraNF.BitBtn3Click(Sender: TObject); begin With Dmdados.IBQ_Estoque DO Begin Close; Sql.Clear; Sql.Add(´Update Tabela_Estoque´); Sql.add(´Set Quantidade_atu = New.quantidade_atu´); Sql.Add(´Where Cod_Prod´); Open; End; Dmdados.IBTab_EstoqueCOD_PROD.Value:=Dmdados.IBTab_EntraItenCOD_PROD.Value; Dmdados.IBTab_EstoqueQUANTIDADE_ATU.Value:=Dmdados.IBTab_EstoqueQUANTIDADE_ATU.Value +Dmdados.IBTab_EntraItenQUANTIDADE.Value; end;
Mais infelismente não deu certo, como faço para que este funcione corretamente?
Peninha
Curtidas 0
Respostas
Marcelo_mileris
16/05/2006
Talvez se vc usar [b:2248e6d531]ExecSql[/b:2248e6d531] ao invés de [b:2248e6d531]Open[/b:2248e6d531] [i:2248e6d531](Que é usado para consultas)[/i:2248e6d531] funcione
procedure TFRm_EntraNF.BitBtn3Click(Sender: TObject); begin With Dmdados.IBQ_Estoque DO Begin Close; Sql.Clear; Sql.Add(´Update Tabela_Estoque´); Sql.add(´Set Quantidade_atu = :QUANTIDADE_NOVA´); Sql.Add(´Where Cod_Prod = :COD_PROD´); ParamByName(´QUANTIDADE_NOVA´).AsInteger := (Quantidade Nova); ParamByName(´COD_PROD´).AsInteger := (Código do Produto); ExecSql; end; end;
GOSTEI 0
Emerson Nascimento
16/05/2006
faço uma recomendação: nunca passe um ´resultado´ direto. deixe que a instrução faça o cálculo. assim você já fica prevenido se o sistema for multiusuarios.
tente algo assim:note que é passada apenas a quantidade do item; não é feita a soma na passagem do parâmetro. pq?
simples:
imagine que há dois usuários fazendo entradas de notas fiscais e, por acaso, as notas tem um produto em comum.
quando os dois entraram no sistema, a quantidade lida do estoque para esse produto foi de 56, certo? 56 unidades no estoque para aquele determinado produto.
na nota do 1o usuário entrarão mais 12 unidades;
na nota do 2o, entrarão 9.
o primeiro usuário confirmou:
segundo seu código, o sistema gravaria na quantidade atual:
56 + 12 = 68, certo?
depois o 2o usuário confirmou a entrada da sua nota, então o sistema, ainda segundo o seu código, gravaria:
56 + 9 = 65, certo?
(porque seu sistema ´leu´ 56 e vai passar para a quantidade atual esse 56 - que já não é mais 56, devido a entrada da primeira nota - com a quantidade do item que está sofrendo a entrada)
o saldo final ficaria gravado como 65, mas na verdade deveria ser 77!!! por isso a instrução que eu estou te passando não grava um valor direto na quantidade. ela soma o valor que você passar à quantidade atual, evitando esse tipo de erros.
pense sempre dessa maneira, pois um bom sistema deve estar preparado para múltiplos acessos.
não sei se fui claro, mas espero que essa dica te ajude nos próximos procedimentos.
tente algo assim:
procedure TFrm_EntraNF.BitBtn3Click(Sender: TObject); begin with Dmdados do begin // aqui monta a instrução para atualização do estoque with IBQ_Estoque do begin Close; Sql.Clear; Sql.Add(´Update Tabela_Estoque´); Sql.add(´Set Quantidade_atu = Quantidade_atu + :QUANTIDADE´); Sql.Add(´Where Cod_Prod = :COD_PROD´); end; // varre a tebela de itens e faz a entrada de todos eles IBTab_EntraIten.First; while not IBTab_EntraIten.Eof do begin with IBQ_Estoque do begin Close; ParamByName(´QUANTIDADE´).Value := IBTab_EntraItenQUANTIDADE.Value; ParamByName(´COD_PROD´).Value := IBTab_EntraItenCOD_PROD.Value; ExecSql; end; IBTab_EntraIten.Next; end; end; end;
simples:
imagine que há dois usuários fazendo entradas de notas fiscais e, por acaso, as notas tem um produto em comum.
quando os dois entraram no sistema, a quantidade lida do estoque para esse produto foi de 56, certo? 56 unidades no estoque para aquele determinado produto.
na nota do 1o usuário entrarão mais 12 unidades;
na nota do 2o, entrarão 9.
o primeiro usuário confirmou:
segundo seu código, o sistema gravaria na quantidade atual:
56 + 12 = 68, certo?
depois o 2o usuário confirmou a entrada da sua nota, então o sistema, ainda segundo o seu código, gravaria:
56 + 9 = 65, certo?
(porque seu sistema ´leu´ 56 e vai passar para a quantidade atual esse 56 - que já não é mais 56, devido a entrada da primeira nota - com a quantidade do item que está sofrendo a entrada)
o saldo final ficaria gravado como 65, mas na verdade deveria ser 77!!! por isso a instrução que eu estou te passando não grava um valor direto na quantidade. ela soma o valor que você passar à quantidade atual, evitando esse tipo de erros.
pense sempre dessa maneira, pois um bom sistema deve estar preparado para múltiplos acessos.
não sei se fui claro, mas espero que essa dica te ajude nos próximos procedimentos.
GOSTEI 0
Peninha
16/05/2006
Bem Amigos, tentei das duas formas mas não acontece nada na minha tabela de estoque, já inverti as posições do código mas infelizmente ainda não consegui.
GOSTEI 0
Emerson Nascimento
16/05/2006
você precisa ´comitar´ os dados.
depois de todo o processo, faça algo como:
IBDatabase.DefaultTransaction.Commit;
ou
IBQuery1.Transaction.Commit;
depois de todo o processo, faça algo como:
IBDatabase.DefaultTransaction.Commit;
ou
IBQuery1.Transaction.Commit;
GOSTEI 0
Peninha
16/05/2006
Emerson.en, eu não é preciso gravar dentro da tabela estoque?
Veja bem, vou tentara explicar melhor.
Estou colocando este código dentro do Botão ´Confirmar Operação´
Que é onde dou o Post na Tabela ´EntraIten´ Mesmo colocando o Post para gravar na tabela estoque não acontece nenhuma mudança na Tabela_Estoque.
Outra coisa:
Preciso criar chave primaria na tabela_estoque e fazer relacionamento da Tabela_Estoque e Tab_EntraIten?
Veja bem, vou tentara explicar melhor.
Estou colocando este código dentro do Botão ´Confirmar Operação´
Que é onde dou o Post na Tabela ´EntraIten´ Mesmo colocando o Post para gravar na tabela estoque não acontece nenhuma mudança na Tabela_Estoque.
Outra coisa:
Preciso criar chave primaria na tabela_estoque e fazer relacionamento da Tabela_Estoque e Tab_EntraIten?
GOSTEI 0
Emerson Nascimento
16/05/2006
você digita um item e já faz a movimentação no estoque?
isso não deveria ser feito somente na confirmação da entrada da nota, depois de digitar todos os itens?
bom, de qualquer forma, seguindo seu procedimento, seria necessário gravar o item antes de proceder com a movimentação:
isso não deveria ser feito somente na confirmação da entrada da nota, depois de digitar todos os itens?
bom, de qualquer forma, seguindo seu procedimento, seria necessário gravar o item antes de proceder com a movimentação:
procedure TFrm_EntraNF.BitBtn3Click(Sender: TObject); begin Dmdados.IBTab_EntraIten.Post; with Dmdados, Dmdados.IBQ_Estoque do begin Close; Sql.Clear; Sql.Add(´Update Tabela_Estoque´); Sql.add(´Set Quantidade_atu = Quantidade_atu + :QUANTIDADE´); Sql.Add(´Where Cod_Prod = :COD_PROD´); ParamByName(´QUANTIDADE´).Value := IBTab_EntraItenQUANTIDADE.Value; ParamByName(´COD_PROD´).Value := IBTab_EntraItenCOD_PROD.Value; ExecSql; Transaction.Commit; end; end;
GOSTEI 0
Peninha
16/05/2006
Valeu mesmo amigo muito obrigado pela atenção.
GOSTEI 0