|
ActiveDelphi .: O site do programador Delphi! :.
|
Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
adriano_servitec Colaborador
Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Sex Jun 23, 2017 10:31 am Assunto: Ajuda na trigger postgres para atualizar? |
|
|
Tenho um select aqui da tabela PRODUTO que contem dois tipos de id. Um campo se chama id mesmo e outro campo id_web
Veja a imagem
E um outro table chamado GRADE que contém o id_produto que vem tanto do id ou id_web da tabela PRODUTO como referencia e seu codigo de barras com campo chamando CODIGO_BARRA_PAI
Na imagem mostra o id_web da tabela produto como sendo o id de referencia da tabela grade, veja imagem
O problema esta sendo em atualizar o campo codigo_barra na tabela produto, pois o mesmo não esta atualizando na tabela grade cfe a trigger que uso no after update da tabela produto
Chamo ela assim
Código: | CREATE TRIGGER tgr_produto_up
AFTER UPDATE
ON public.produto
FOR EACH ROW
EXECUTE PROCEDURE public.tgr_produto_up();
COMMENT ON TRIGGER tgr_produto_up ON public.produto IS 'Msg Adriano>> Serve para atualizar a tabela GRADE quando altera a tabela PRODUTO'; |
A trigger
Código: | CREATE OR REPLACE FUNCTION public.tgr_produto_up() RETURNS trigger AS
$BODY$
DECLARE id_produto_old INT;
DECLARE id_produto_old_web INT;
DECLARE codigo_barra_old CHAR(30);
DECLARE codigo_barra_new CHAR(30);
DECLARE identificacao_interna_new CHAR(50);
DECLARE qtd_minima_new DECIMAL(20,3);
DECLARE qtd_estoque_atual_new DECIMAL(20,3);
DECLARE locacao_quantidade_new DECIMAL(20,3);
DECLARE valor_custo_p DECIMAL(20,2);
DECLARE custo_venda DECIMAL(20,2);
DECLARE custo_venda_atacado DECIMAL(20,2);
DECLARE porc_venda DECIMAL(30,15);
DECLARE v_id_usuario_alteracao INT;
BEGIN
id_produto_old = OLD.id;
id_produto_old_web = OLD.id_web;
codigo_barra_old = OLD.codigo_barra;
codigo_barra_new = NEW.codigo_barra;
identificacao_interna_new = NEW.identificacao_interna;
qtd_minima_new = NEW.qtd_minima;
qtd_estoque_atual_new = NEW.qtd_unidade;
locacao_quantidade_new = NEW.locacao_quantidade;
valor_custo_p = NEW.custo;
custo_venda = NEW.custo_medio_venda;
if valor_custo_p = 0 then
porc_venda = (custo_venda * 100) - 100;
else
porc_venda = ((custo_venda / valor_custo_p) * 100) - 100;
end if;
v_id_usuario_alteracao = NEW.id_usuario;
custo_venda_atacado = NEW.custo_medio_venda_atacado;
/** UPDATE NA GRADE DO PRODUTO DEFAULT **/
UPDATE
grade
SET codigo_barra_pai = codigo_barra_new,
codigo_barra = codigo_barra_new,
codigo_interno = identificacao_interna_new,
qtd_minima = qtd_minima_new,
qtd_atual = qtd_estoque_atual_new,
qtd_locacao = locacao_quantidade_new,
valor_custo = valor_custo_p,
valor_varejo_aprazo = custo_venda,
valor_atacado_aprazo = custo_venda_atacado,
porc_varejo_aprazo = porc_venda,
id_usuario_alterou = v_id_usuario_alteracao
WHERE (id_produto = id_produto_old) or (id_produto = id_produto_old_web)
AND codigo_barra_pai = codigo_barra_old
AND codigo_barra = codigo_barra_old;
UPDATE
grade
SET codigo_barra_pai = codigo_barra_new
WHERE (id_produto = id_produto_old) or (id_produto = id_produto_old_web)
AND codigo_barra_pai = codigo_barra_old
AND codigo_barra <> codigo_barra_new;
IF NEW.ativo = 'I' OR NEW.ativo = 'E' THEN
UPDATE
grade
SET ativo = 0
WHERE (id_produto = NEW.id) or (id_produto = NEW.id_web);
ELSEIF NEW.ativo = 'A' AND OLD.ativo <> 'A' THEN
UPDATE
grade
SET ativo = 1
WHERE (id_produto = NEW.id) or (id_produto = NEW.id_web);
END IF;
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql VOLATILE NOT LEAKPROOF
COST 100;
|
Reparem que na clausula where fiz assim
Código: | WHERE (id_produto = id_produto_old) or (id_produto = id_produto_old_web) | para tentar pegar os dois modos do codigo, mais não quer alterar a tabela GRADE.
Obrigado. _________________ Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree |
|
Voltar ao Topo |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Sex Jun 23, 2017 11:22 am Assunto: |
|
|
Bom dia,
Não sei se a trigger vai funcionar da forma esperada, mas como existem outros filtros com o operador And, acredito que esses 2 filtros com o Or devem ficar entre parênteses. Experimente fazer uns testes dessa forma:
Código: | WHERE (id_produto = id_produto_old or id_produto = id_produto_old_web)
AND codigo_barra_pai = codigo_barra_old
AND codigo_barra = codigo_barra_old;
|
Espero que ajude
_________________
Assinatura: http://www.imoveisemexposicao.com.br/imoveis-alugar-guarulhos-comercial_ou_industrial-galpão |
|
Voltar ao Topo |
|
|
adriano_servitec Colaborador
Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
|
Voltar ao Topo |
|
|
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|