Baixa do estoque Delphi

14/03/2018

0

É o seguinte, eu estou fazendo um sistema de estoque e vendas, já consegui fazer toda a parte de vendas porém preciso debitar os items do estoque e estou tendo problemas com essa parte.

a partir do id da venda preciso selecionar todos os items que estão na tabela vi_vendaitem e pegar a quantidade de cada item e subtrair dos items da tabela produto.

este é meu botão que adiciona os items

with dsvendaitem.dataset do 
Append; 
begin 
fieldbyname('vi_produto').Value := dsproduto.DataSet.FieldByName('p_id').Value; 
fieldbyname('vi_cliente').Value := frmPontoVenda.idcliente; 
fieldbyname('vi_valor').Value := dsproduto.DataSet.FieldByName('p_preco').Value; 
fieldbyname('vi_quantidade').Value := 1; 
FieldByName('vi_peso').Value := 0; 
fieldbyname('vi_total').Value := fieldbyname('vi_quantidade').Value * fieldbyname('vi_valor').Value; 
Post; 
end; 


minha ultima tentativa foi com o seguinte codigo

dmcantina.zqrProduto.Edit; 
dmcantina.zqrProdutop_quantidade.Value := dmcantina.zqrprodutop_quantidade.Value - dmcantina.zqrVendaItemvi_quantidade.Value; 


porém não funciona, estava pensando de algum modo colocar a hora que finalizar a compra selecionando todos os vendaitems pelo campo vi_venda

o máximo que consegui chegar foi nisso:

with dmcantina.zqrVendaItem do 
begin 
Open; 
Locate('vi_venda', idvenda, []); 
edit; 

cheguei nesse código em SQL

SELECT
 vi_produto,
 vi_quantidade
FROM
 vi_venda_item
WHERE
 vi_venda= :idvenda


Porém não sei como usar o vi_produto para selecionar o id do produto na tabela de produtos e subtrair a quantidade de cada produto

Não tenho muita experiencia com programação, estou começando a ver agora no primeiro ano da faculdade.

Alguém pode me ajudar ?
Michel

Michel

Responder

Posts

16/03/2018

Luiz Vichiatto

a lógica é que está faltando a busca do produto na tabela produto
if dmcantina.locate ( 'CAMPO_COD_PRODUTO', dsproduto.DataSet.FieldByName('p_id').Value, []) then
begin 
   dmcantina.zqrProduto.Edit; 
   dmcantina.zqrProdutop_quantidade.Value := dmcantina.zqrprodutop_quantidade.Value - dmcantina.zqrVendaItemvi_quantidade.Value; 
end;
Responder

16/03/2018

Luiz Vichiatto

Faltou o nome da tabela
if dmcantina.zqrProduto.locate ( 'CAMPO_COD_PRODUTO', dsproduto.DataSet.FieldByName('p_id').Value, []) then
Responder

16/03/2018

Michel

Muito obrigado !!

Porém estou com mais um problema, fiz um abrir e fechar caixa.

Porém quando vou fechar o caixa e mando editar o registo ele simplesmente edita o primeiro registro da tabela. não consegui pensar numa logica para ele editar o registro do caixa que está aberto.

O ids_caixa_open_close fica em outra tabela e não tem relação nenhuma com o caixa.

como posso solucionar isso ? oque estou fazendo de errado ? =O

   if dmCantina.ztqrCaixaids_caixa_open_close.AsString = 'N' then
   begin
   dmCantina.ztqrCaixa.Open;
   dmCantina.ztqrCaixa.Edit;
   dmCantina.ztqrCaixaids_caixa_open_close.AsString := 'S';
   dmCantina.ztqrCaixa.Post;

   dmCantina.ztrCaixa.Insert;
   dmCantina.ztrCaixas_saldo_inicial.AsString := (Inputbox('Digite o valor','Qual é o valor inicial do caixa ?',''));
   dmCantina.ztrCaixas_data_abertura.Value := now;
   dmCantina.ztrCaixas_hora_abertura.Value := now;
   dmCantina.ztrCaixa.Post;
   dmCantina.ztrCaixa.ApplyUpdates;
   frmprincipal.ToolButton1.Enabled := true;
   end
   else if dmCantina.ztqrCaixaids_caixa_open_close.AsString = 'S' then
   begin
   if MessageDlg('Tem certeza que deseja fechar o caixa ?',mtConfirmation, [mbYes, mbNo], 0, mbYes) = mrYes then
   begin
   dmCantina.ztqrCaixa.Open;
   dmCantina.ztqrCaixa.Edit;
   dmCantina.ztqrCaixaids_caixa_open_close.AsString := 'N';
   dmCantina.ztqrCaixa.Post;

   dmCantina.ztrCaixa.Edit;
   dmCantina.ztrCaixas_data_fechamento.Value := now;
   dmCantina.ztrCaixas_hora_fechamento.Value := now;
   dmCantina.ztrCaixa.Post;
   dmCantina.ztrCaixa.ApplyUpdates;
   showmessage('Caixa fechado com sucesso!');
   frmprincipal.ToolButton1.Enabled := false;
   end;
   end;
Responder

19/03/2018

Luiz Vichiatto

Olá Michel,
Então, você deseja marcar os itens do caixa como fechado?
Se o teu caixa tem mais de um item então tenho que fazer um looping para marcar os itens como fechado. Como está fazendo está marcando o primeiro item da tabela, já que você não faz uma busca pelo registro que deseja alterar.
Crie uma chave (se não existir) e percorra para fazendo a marcação.

Eu particularmente faria diferente, criaria uma tabela de controle do caixa, uma tabela com o número do caixa, data de abertura, usuário data inicio, data fim e algum controle a mais. Também criaria para isto uma storeprocedure ou function no banco de dados para fazer tal operação, assim em um eventual problema, como o desligamento involuntário do computador, não teria problemas.

A vantagem da tabela de controle é que sempre você irá saber qual o caixa que está aberto, qual o encerrado e qual está em fechamento, entre outras informações, e assim controlar o saldo inicial e final, usuário, quando se trata de caixa ($$) os controles deverão evitar perdas, principalmente se existir volume de lançamentos.
Outra, é trazer para o banco de dados que você faz o commit no fim da instrução total, fazendo a cada registro você pode ter problemas caso ocorra alguma eventual parada.

Há um tempo fiz uma situação de encerramento bancário, similar o que você quer fazer, conferia os itens lançados na conta com o movimento do sistema e fazia a marcação com a data contábil, funcionava (até quando estive lá) muito bem.

Responder

28/03/2018

Emerson Nascimento

dmcantina.zqrProdutop_quantidade.Value := dmcantina.zqrprodutop_quantidade.Value - dmcantina.zqrVendaItemvi_quantidade.Value;


cuidado com esse tipo de cálculo. imagine que seu sistema seja aberto em dois computadores simultaneamente.
computador1 abriu a tabela de produtos e está posicionada no produto x, cujo saldo é 100.
computador2 abriu a tabela de produtos e está posicionada no produto x, cujo saldo é 100.

computador1 fez uma venda de 80 unidades (na leitura da tabela havia 100), então alterou o saldo para 20.
computador2 fez uma venda de 10 unidades (na leitura da tabela havia 100), então alterou o saldo para 90.

o saldo final do produto será de 90, quando deveria ser 10.

para esse tipo de tarefa use instrucoes SQL ou melhor, stored procedures, onde você envia o código do produto, a operação (entrada ou saída) e a quantidade movimentada. daí a instrução faz a substração do conteúdo do campo em tempo real, e não do conteúdo "lido" em algum momento.


Responder

29/03/2018

Luiz Vichiatto

Por isto que a baixa de estoque é melhor que seja feita bloqueando o item, ou por instrução de trigguer no sql, assim você pode minimizar ou evitar erros de saldo.

Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

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

Aceitar