Baixa do estoque Delphi
É 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
minha ultima tentativa foi com o seguinte codigo
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:
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 ?
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= :idvendaPoré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
Curtidas 0
Respostas
Luiz Vichiatto
14/03/2018
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;
GOSTEI 0
Luiz Vichiatto
14/03/2018
Faltou o nome da tabela
if dmcantina.zqrProduto.locate ( 'CAMPO_COD_PRODUTO', dsproduto.DataSet.FieldByName('p_id').Value, []) then
GOSTEI 0
Michel
14/03/2018
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
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;GOSTEI 0
Luiz Vichiatto
14/03/2018
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.
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.
GOSTEI 0
Emerson Nascimento
14/03/2018
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.
GOSTEI 0
Luiz Vichiatto
14/03/2018
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.
GOSTEI 0