Atualizando tabela estoque via codigo SQLgt;

Delphi

16/05/2006

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

Curtidas 0

Respostas

Marcelo_mileris

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

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


GOSTEI 0
Peninha

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

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;


GOSTEI 0
Peninha

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?


GOSTEI 0
Emerson Nascimento

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

Peninha

16/05/2006

Valeu mesmo amigo muito obrigado pela atenção.


GOSTEI 0
POSTAR