ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Ajuda na trigger postgres para atualizar?

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Sex Jun 23, 2017 10:31 am    Assunto: Ajuda na trigger postgres para atualizar? Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Sex Jun 23, 2017 11:22 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Sex Jun 23, 2017 11:36 am    Assunto: Responder com Citação

imex escreveu:
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


Deu certo Imex, 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
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB