Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

dasjones

Trigger para delete e update ao ser alterado um campo da tabela

Recommended Posts

Olá, sou novo no forum, achei muito interessante as informações por aqui, espero poder ajudar a comunidade e aprender bastante também.

 

Estou tentando configurar um trigger para ser rodado quando uma tabela é atualizada (gostaria que o trigger fosse rodado apenas quando um campo específico da tabela passa de 2) e neste momento ele teria que rodar um delete primeiro (para casos em que o processo já tinha sido efetuado e os valores foram alterados) seguido de um insert.

Quase não tenho conhecimento de sql além de simples selects, updates, etc... Estou dando uma estudada e pesquisando bastante, porém surgiu uma urgência na implantação deste comando e não estou conseguindo achar nenhum exemplo prático para me basear, qualquer sugestão é bem vinda. Abaixo o caso:

 

tenho uma TBL_COMPRAS_NOTAFISCAL_ENTRADA em que quando o campo status nela for alterado pra 2 ele deveria fazer um delete e depois um insert na TBL_CONTABIL_LANCAMENTOS_CTB pegando informações da TBL_CUSTOS_DESDOBRADOS usando o select abaixo:

SELECT A.CD_LANCAMENTO, A.CD_ORIGEM, 1 NR_PARCELA, 1 CD_ITEM_PARCELA, A.CD_EMPRESA, B.CD_FILIAL, D.CD_CONTA_CTB CD_CONTA_DEBITO, C.CD_CONTA CD_CONTA_CREDITO,
D.CD_HISTORICO, A.DT_LANCAMENTO, NULL DS_COMPLEMENTO , B.NR_DOCUMENTO, SUM(A.VL_CUSTO) AS VL_LANCAMENTO, A.DS_NOME_FORMULARIO DS_TEXTO, A.CD_USUARIO,
NULL CD_CHAVE, A.CD_USUARIOAT, B.DT_CADASTRO, B.DT_ATUALIZACAO, A.CD_LANCAMENTO, B.CD_FORNECEDOR, 1 NR_PARCELAS, 'Desdobramento NF entrada' DS_OBS FROM
TBL_CUSTOS_DESDOBRADOS A, TBL_COMPRAS_NOTAFISCAL_ENTRADA B, TBL_CONTABIL_PLANO_CONTAS C, TBL_CONTABIL_PLANO_CONTAS_GERENCIAL D, TBL_ENTIDADES E
WHERE A.CD_LANCAMENTO = B.CD_ENTRADA AND A.CD_CONTA_GERENCIAL = D.CD_CONTA_GERENCIAL AND B.CD_FORNECEDOR = E.CD_ENTIDADE AND
A.CD_EMPRESA = D.CD_EMPRESA AND E.NR_CPFCNPJ = C.NR_CPFCNPJ AND C.CD_CONTA > 500000 AND A.CD_EMPRESA = C.CD_EMPRESA AND A.CD_LANCAMENTO = @cdlanc
GROUP BY A.CD_LANCAMENTO, A.CD_ORIGEM, A.CD_EMPRESA, B.CD_FILIAL, D.CD_CONTA_CTB, C.CD_CONTA,
D.CD_HISTORICO, A.DT_LANCAMENTO, B.NR_DOCUMENTO, A.DS_NOME_FORMULARIO, A.CD_USUARIO, A.CD_USUARIOAT,
B.DT_CADASTRO, B.DT_ATUALIZACAO, B.CD_FORNECEDOR

 

O "@CDLANC" viria da primeira tabela, do lançamento em que é alterado o status pra 2, porém não sei como declarar isso exatamente (para que ele não execute o processo em todas cada vez que há a alteração de status, o que ia demorar bastante...)

 

Qualquer dica, orientação ou sugestão é muito bem vinda

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por clovis.sardinha
      Boa noite.
      Tenho um bd com 2 tabelas. A primeira (serv_os) tem as colunas id, fk_os e fk_servico  a segunda (prod_os) tem as colunas id, fk_os e agora eu criei a coluna fk_serv. A coluna fk_serv vai ser preenchida com o valor id da primeira coluna. Fiz o seguinte update entre as tabelas: 
      UPDATE prod_os
      JOIN serv_os ON serv_os.fk_os= prod_os.fk_os
      SET prod_os.fk_serv = serv_os.id
      WHERE prod_os.fk_os=serv_os.fk_os;
       
      Até aqui tudo bem, porém, fiquei com o seguinte problema.  Muitas vezes  existem vários serviços na primeira tabela, por exemplo id=100 produto A, id=101 produto B, porém o fk_os é o mesmo . Ai na coluna fk_serv aparece sempre o id do produto A. Nesse caso duas vezes. O produto B, C,...etc não aparece. 
      Não consegui nenhum comando, já que o join é pela coluna fk_os, que fizesse o update mudar o ponteiro para o serviço B,C,etc.
      Se alguém puder me ajudar eu agradeço.
    • Por ILR master
      Boa tarde, pessoal.
      Espero que todos estejam bem.
       
      Seguinte:
      Tenho a seguinte consulta:
       
      $usuarios= "SELECT * FROM usuarios";
      $query= mysqli_query($conexao, $usuarios) or die ("Usuário não encontrado");
      $usuario = mysqli_fetch_array($query);
       
      Quero pegar apenas o campo 'nome' da tabela 'usuarios' e colocar todos os resultados da seguinte forma:
       
      $nomes = array("Rafael", "João", "Maria", "Pedro", "Patricia", "Camila");
       
      Agradeço desde já.
      Abs
       
       
    • Por FabianoSouza
      Tenho uma function que precisa receber 02 argumentos.
      Ela funciona se eu aplicar num select qualquer. Mas se eu aplicar num select dinâmico, ocorre erro.
      Veja trecho do meu select.
      ... SET @sql = @sql +', dbo.retornaIco_ItemBloq((SELECT COUNT(*) FROM dbo.tab AS TT2 WHERE TT2.codCategTreina = CTT.id),'+@title+') AS ''resp''' ... No caso, o primeiro argumento da function dbo.retornaIco_ItemBloq é um SELECT COUNT.
      O segundo argumento é uma variável (que está devidamente declarada e definida).
       
      O erro ocorre porque ao executar (chamando EXEC(@sql) ), o SQL entende que o segundo argumento é uma coluna da consulta principal, pois existe uma vírgula antes da variável @title (que é o segundo argumento da function).
      Repito. Se eu aplicar essa function num select normal, funciona normalmente. Porém, preciso que funcione num SQL dinâmico porque é esse é o padrão que estou adotando para o sistema todo.
       
      A function dbo.retornaIco_ItemBloq faz o seguinte:
      1) Recebe o valor do COUNT e da variável @title
      2) Se o COUNT for maior que  Zero, cria uma tag HTML (uma SPAN), define sua title com o valor da variável @title e passa para uma variável
      3) Retorna o HTML que será exibido no resultado da consulta principal
      É super simples.
       
      Há outra forma de chamar a function?
    • Por vicente386
      Ola. Tenho uma tabela no 3 campos que sao "LIVRO, POS, PAGINA" ao qual a logica e a seguinte: cada livro tem 100 paginas cada pagina tem 30 posiçoes tenho 8,364 registros pra inserir chegando a 100 paginas com 30 posiçoes cada passa para o livro 2 e como fazer o update na tabela inserindo nos campos LIVRO = 1, POS de 0 a 30 e PAGINA 1 para cada 30 registros logos apos pagina 2 ?
      estou tentando fazer assim:
      <?php > ini_set('max_execution_time', 2000); $pdo = new > DO(DB_SERVER.":host=".DB_HOST.";dbname=".DB_BASE,DB_USER,DB_PASSWORD); > $sql = $pdo->prepare("SELECT count(*) FROM tabela2018"); > $sql->execute(); > $livro = 1; > foreach($sql as $obj){ > $variavel = $obj[0]; > ceil((float)$variavel/100); > $qtdlaco = ceil((float)$variavel/100); > for ($id = 1; $id <= 35; $id++) { > for($L=1; $L < $qtdlaco; $L++) { > for ($P = 0; $P <= 30; $P++) { > $sql = $pdo->prepare("UPDATE tabela2018 SET LIVRO = :LIVRO, POS = :POS, PAGINA = :PAGINA WHERE idtabela2018 = $id"); > $sql->bindValue(':LIVRO', $livro); > $sql->bindValue(':POS', $P); > $sql->bindValue(':PAGINA', $L); > $sql->execute(); > } > } > } >} ?> mas na tebela so aparece: LIVRO POS PAGINA 1 30 83 1 30 83 1 30 83 e nao como deveria : LIVRO POS PAGINA 1 0 1 1 1 1 1 2 1
    • Por mr22robot
      Ola caros amigos. 
      Estou com uma dúvida aqui que embora nao tenho achado ainda uma resposta, acredito que haja.
      Estou estudando a tão sonhada linguagem de programação asp.net core mvc. Linguagem essa que demorei 5 anos pra iniciar os estudos rsrs.
      Mas estou agarrado em uma situação. 
      Estou usando como base de dados nos meus estudos um banco Oracle. Que já tem algumas informações nele. Utilizei o SCAFFOLD para criar as classes e o contexto baseado no banco e tabelas existentes. 
      Porem agora na fase das consultas, estou perdido em como utilizar o IN que eu utilizo no oracle; no LINQ.
      Ex: 
      SELECT CODPROD,DESCRICAO FROM PRODUTO WHERE CODPROD IN(1,2,3,4,5,6) Como eu utilizo esse filtro com uma restrição de códigos de produtos? no caso o where codprod in(1,2,3,4,5,6) ?.
      Desde já obrigado pela ajuda.
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.