Fórum Atualizando tabela estoque via codigo SQLgt; #321525

16/05/2006

0

Ola pessoal, tentei atualizar minha tabela Estoque desta forma:
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

Peninha

Responder

Posts

17/05/2006

Marcelo_mileris

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; 



Responder

Gostei + 0

17/05/2006

Emerson Nascimento

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:
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;
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.


Responder

Gostei + 0

17/05/2006

Peninha

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.


Responder

Gostei + 0

18/05/2006

Emerson Nascimento

você precisa ´comitar´ os dados.

depois de todo o processo, faça algo como:
IBDatabase.DefaultTransaction.Commit;
ou
IBQuery1.Transaction.Commit;


Responder

Gostei + 0

18/05/2006

Peninha

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?


Responder

Gostei + 0

18/05/2006

Emerson Nascimento

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:
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;



Responder

Gostei + 0

21/05/2006

Peninha

Valeu mesmo amigo muito obrigado pela atenção.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar