Baixa do estoque Delphi
14/03/2018
0
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
Posts
16/03/2018
Luiz Vichiatto
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;
16/03/2018
Luiz Vichiatto
if dmcantina.zqrProduto.locate ( 'CAMPO_COD_PRODUTO', dsproduto.DataSet.FieldByName('p_id').Value, []) then
16/03/2018
Michel
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;
19/03/2018
Luiz Vichiatto
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.
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.
29/03/2018
Luiz Vichiatto
Clique aqui para fazer login e interagir na Comunidade :)