Em SQL não se faz Processos Diretos e Inversos isso era para Época do DBF, ou bancos de dados lentos, você deve criar Key Indices em todos os campos,
principais envolvidos tanto no WHERE quanto que no INNER JOIN, existe uma outra ferramenta no Mercado que Ainda mantem essa
filosofia antiga ‘de processos diretos/invertidos’, ehehe começava com G.
Ai crie Em Programação > PHP Método PHP > AtualizarEstoque << Ele vai servir tanto para Incluir, Atualizar ou Excluir/Cancelar.
** Observação no MySQL é possível fazer uma formula só, usando o SUM (**)
ai ele já calcula uma só vez, se for estoque é ESTOQUE ATUAL = (ESTOQUE INICIAL + (TABELA ITENS > COMPRAS - TABELA ITENS > VENDAS)) WHERES CANCELADO<>‘S’
ai neste caso não será necessario usar formulas diretas e invertidas.
EXEMPLO USANDO SÓ O SQL DIRETO QUE JÁ FAZ TUDO:
// ESTOQUE
$sql ="
UPDATE
estoque
SET
EntradasQtde = (SELECT IF(SUM(Quantidade)>0,SUM(Quantidade)) FROM ComprasItens WHERE CodigoProdutoID=[glo_CodigoProdutoID] AND Cancelado<>‘S’),
SaidasQtde = (SELECT IF(SUM(Quantidade)>0,SUM(Quantidade)) FROM VendasItens WHERE CodigoProdutoID=[glo_CodigoProdutoID] AND Cancelado<>‘S’),
EstoqueAtual = EstoqueInicial + QtdeEntradas - QtdeSaidas
WHERE
CodigoProdutoID = [glo_CodigoProdutoID]
";
sc_exec_sql($sql);
// CUSTO MÉDIO
$sql ="
UPDATE
estoque
SET
EntradasQtde = (SELECT IF(SUM(Quantidade)>0,SUM(Quantidade)) FROM ComprasItens WHERE CodigoProdutoID=[glo_CodigoProdutoID] AND Cancelado<>'S'),
EntradasValorTotal = (SELECT IF(SUM(ValorTotalItem)>0,SUM(ValorTotalItem)) FROM ComprasItens WHERE CodigoProdutoID=[glo_CodigoProdutoID] AND Cancelado<>'S'),
CustoMedio = IF(EntradasValorTotal/EntradasQtde>0,EntradasValorTotal/EntradasQtde,0)
WHERE
CodigoProdutoID = [glo_CodigoProdutoID]
";
sc_exec_sql($sql);
Criar Programção > PHP > Metódos: AtualizarEstoque
Como Usar:
OnAfterInsert:
[glo_CodigoProdutoID]={CodigoProdutoID}; // [glo_CodigoProdutoID] = Variável de Saída marcar.
AtualizarEstoque();
OnAfterUpdate:
[glo_CodigoProdutoID]={CodigoProdutoID};
AtualizarEstoque();
OnBeforeDelete:
[glo_CodigoProdutoID]={CodigoProdutoID};
OnAfterDelete:
AtualizarEstoque();
Em Mestres detalhes filhos é a mesma coisa, ai você atualiza todas as tabelas com uma única formula e no final os campos na tela com:
AtualizarEstoque();
sc_master_value(‘VALOR_TOTAL’, sc_format_num($_Total_Soma_Itens, ‘.’, ‘,’, 2, ‘S’, ‘1’, ‘’));
Com essa dica suas quantidades sempre vão bater mesmo se o cliente decidir fazer uma listagem de contagem e decidir ticar na caneta
quanto ele tinha, quanto entrou item por item e quanto saiu, sempre bate o resultado.