Atualizar valores de tabelas pai x filho

Boa tarde Senhores.

Tenho pouca experiencia com o SC… e estou com o seguinte problema…

No banco de dados tenho 02 tabelas, sendo:

-Tabela Matéria Prima

-Tabela Produto Acabado

A tabela matéria prima é atualizada constantemente devido a variações de preços, etc…

A duvida é a seguinte:

-Quando um usuário alterar o valor da matéria prima, o sistema deve fazer os cálculos e alterar o valor final do produto acabado automaticamente.

Não tenho ideia de como fazer essa ligação.

Por gentileza alguém pode me ajudar?

Gratidão.

Crie Triggers em sua tabela de matéria para atualizar os produtos automática mente.

Isso eh feito direto no banco de dados, sem usar programação no scriptcase.

Haroldo, desculpe a minha ignorância… pode me dar um exemplo de como criar uma Trigger?

http://www.devmedia.com.br/mysql-triggers/8088

Haroldo, agradeço sua disposição e atenção para me ajudar.

Eu li o artigo do link… e estou com dificuldades para criar a Trigger

CREATE TRIGGER atualiza_materia_prima BEFORE UPDATE
ON cadastro_materia_prima FOR EACH ROW BEGIN
EXECUTE PROCEDURE nome_da_função (e agora? como fazer a condição para atualizar os preços dos produtos acabados?)

Não tenho experiencia com trigger… não existe outra maneira (mais simples) de fazer essa atualização?

Gratidão

Estou tentando inserir via phpmyadmin e da erro

CREATE TRIGGER atualiza_materia_prima BEFORE UPDATE ON cadastro_materia_prima
FOR EACH ROW BEGIN
UPDATE cadastro_produto_final
SELECT preco_final_mp FROM cadastro_materia_prima
INNER JOIN cadastro_produto_final on preco_final_mp = preco_mp

A programação pode ser em php num formulário scriptcase, mas mas de qualquer forma precisa c conhecer:

1)PHP
2)SQL
3)Os procedimentos envolvidos, cálculos e operações que serão realizadas quando da alteração na matéria prima.

Em Trigger tem que conhecer:

1)SQL
2) Os procedimentos envolvidos, cálculos e operações que serão realizadas quando da alteração na matéria prima.

Conheço a linguagem PHP e os procedimentos envolvidos (cálculos e operações), minha dificuldade esta na Trigger e no SQL.

Gostaria apenas de um exemplo bem básico de como fazer essa alteração em meu projeto… pode ser via SC ou Trigger…

Sendo que são N matérias-primas e N produtos finais …

Por favor me de uma luz… só falta isso para finalizar e começar a testar o sistema.

Grato

Seque um exemplo de um trigger que atualiza o saldo do local de estoque quando um produto eh movimentado.

USE iwerp_cinco;
DELIMITER $$

CREATE TRIGGER estoqmov_bef_ins BEFORE INSERT ON estoqmov FOR EACH ROW
– Edit trigger body code below this line. Do not edit lines above this one
BEGIN

DECLARE varProdutoId integer;
DECLARE varLocalId integer;
DECLARE varEstoquesId integer;
DECLARE varSaldo decimal(14,4);
DECLARE varQuantidade decimal(14,4);
DECLARE varCodigoTrans varchar(15);
DECLARE varEntradaSaida char(1);

SELECT Parametros INTO varEntradaSaida FROM geraltab WHERE Grupo=‘ESTOQUETRANSAC’ AND Codigo=NEW.GTEstoqTransCod;

IF (NEW.Estorno)
THEN
SELECT codigo INTO varCodigoTrans FROM geraltab WHERE grupo=‘ESTOQUETRANSAC’ AND Parametros=CONCAT(‘ESTORNO:’,NEW.GTEstoqTransCod);
Set NEW.GTEstoqTransCod=varCodigoTrans;
IF varEntradaSaida = ‘E’ THEN SET varEntradaSaida =‘S’; ELSE SET varEntradaSaida=‘E’; END IF;
END IF;

Set NEW.Transacao=varEntradaSaida;

set varQuantidade=(CASE WHEN new.Transacao = ‘E’ THEN new.Quantidade ELSE new.Quantidade*-1 END);
Set varProdutoId=(select Id from produtos where Codigo = new.ProdutoCodigo);
Set varLocalId=(SELECT Id FROM geraltab WHERE grupo = ‘EstoqueLocal’ and Codigo = new.GTLocalCodigo);

SELECT ID, Saldo+varQuantidade
INTO varEstoquesId, varSaldo
FROM estoques
WHERE GTEstoqueLocalId = varLocalId and ProdutoId = varProdutoId;

IF (varEstoquesId > 0)
THEN UPDATE estoques SET Saldo = varSaldo WHERE id = varEstoquesId;
ELSE INSERT INTO estoques (GTEstoqueLocalId,ProdutoId,Saldo)
VALUE (varLocalId,varProdutoId,varQuantidade);
END IF;

SET NEW.Saldo = (CASE WHEN varSaldo IS NULL THEN varQuantidade ELSE varSaldo END);
SET NEW.DTUpdate= Now();
END

Veja o lado positivo nisso, vai ter que se empenhar em aprender SQL, o que eh positivo e muito válido para se tornar um programador melhor e mais completo.

Haroldo,

Meus sinceros agradecimentos…

Esse projeto esta sendo bem desafiador… aprendi bastente coisa… e realmente tenho de aprender SQL…

Vou fazer alguns testes aqui e retorno em breve.

Gratidão!

Isso é um Módulo de Produção?

A lógica é essa mesmo, ou trigger ou via Php criando uma função e depois jogando em um evento.
Eu comecei assim como você! Entrei aqui não sabia o que era um If nem Else. Basta ser perseverante e amar estudar que você se dar bem. Ser teimoso e não desistir.

Olá Fred.

Esse projeto é um sistema “simples” onde o usuário cadastra as matérias primas com seus respectivos valores.

A partir dai é possível desenvolver o produto final dentro do sistema, ao incluir o produto final o sistema faz os calculos e retorna o valor de custo de tal produto.

O problema é que a matéria prima sofre alteração, ou seja, quando a pessoa alterar algum valor de uma materia prima, o sistema deve recalcular todo o produto final que esta vinculado a ela.

Eu fiz um teste bem simples e funcionou… quando eu altero uma matéria prima, o SQL inclui o valor “1” ao produto final.

CREATE DEFINER = root@localhost TRIGGER atualiza_mp AFTER UPDATE ON cadastro_materia_prima FOR EACH ROW UPDATE cadastro_produto_final SET custo_total_pf =1

Minha duvida é a seguinte agora.

Como alterar apenas o produto final que a matéria prima esta vinculada?

Ao alterar o preço da matéria prima que esta vinculado ao produto, você cria na triger o WHERE informando o “id_materia_prima” que no caso é uma FK (Chave estrangeira) na tabela de produtos. Tipo:

TRIGGER atualiza_mp
AFTER UPDATE ON cadastro_materia_prima
FOR EACH ROW UPDATE cadastro_produto_final
SET custo_total_pf =1
WHERE id_materia_prima = 1

Esta dando erro…

Não consigo pegar o ID da matéria prima que esta sendo atualizada.

a logica de calculo é essa aqui

total_produto_final = preco_materia_prima * percentual_produto_final / 100;

No caso tenho de pegar o valor da matéria prima através do ID e fazer o calculo, mas nao estou conseguindo passar para a Trigger

Apresente suas estruturas aqui.

Pergunta: 1 Produto X n Matérias Primas?

Oxente… como assim? Escreve ai a estrutura das duas tabelas assim como o Haroldo falou.

Ótima pergunta, se for 1 para Muitos, vai ter que criar uma terceira tabela produto_x_matprima.

Sim 1 produto final pode ter até 10 matérias primas vinculadas.

Estrutura:

Tabela Materia Prima

id_materia_prima
desc_materia_prima
genero_materia_prima
preco_compra_mp
icms_mp
pis_mp
cofins_mp
ipi_mp
ii_mp
frete_mp
comissao_mp
preco_final_mp

=======================

Tabela Produto Final

id_produto_final
desc_pf
genero_pf
materia_prima_01 ate materia_prima_10 (select das materias primas)
per_pf_01 ate per_pf_10 (quantidade materia prima)
preco_mp_01 ate preco_mp_10 (valor da materia prima)
total_pf_01 ate total_pf_10 (retorno do calculo)
custo_total_pf

Meu amigo, me desculpa, mas se for possível temos que mudar essa modelagem.

E nem me arrisco a sugerir um código para essa sua modelagem.

Tudo bem… sem problemas, aceito sugestões…

Desculpe por esse trabalhão…

agradeço