Jump to content
caiquestevanatto

Trigger Baixa Estoque

Recommended Posts

Boa noite pessoal,

estou criando uma trigger em Oracle, que ao realizar uma venda (insert ou update), a trigger retire a quantidade vendida do estoque. Porém, estou com alguma dificuldades.

A trigger criada é a seguinte:
CREATE OR REPLACE TRIGGER BAIXA_ESTOQUE
AFTER UPDATE OR INSERT ON ITEMPEDIDO
FOR EACH ROW
DECLARE IDPEDIDO INT;
BEGIN
SELECT IDPEDIDO INTO IDPEDIDO FROM PEDIDO WHERE IDPEDIDO = :NEW.IDPEDIDO;
IF (IDPEDIDO > :NEW.IDPEDIDO) THEN
UPDATE PRODUTO SET QUANTIDADE = QUANTIDADE - :NEW.QUANTIDADE 
WHERE IDPRODUTO = :NEW.IDPRODUTO;
END IF;
END;

Realizo o insert na tabela itempedido, porém quando vou verificar no select * from produto, a quantidade não foi modificada.

Conseguem me ajudar onde estou errando ?

Share this post


Link to post
Share on other sites

Não precisa do select e nem do if pois o pedido e fk é está ponteirado.

 

E faça

 SET QUANTIDADE = QUANTIDADE + NVL( :OLD.QUANTIDADE,0) - NVL(:NEW.QUANTIDADE,0)

 

Garante o update da quantidade.

 

Share this post


Link to post
Share on other sites

Obrigado pelo retorno!

Porém descobri um outro problema... A trigger é criada com sucesso, porém ao realizar um teste, fazendo um insert na tabela ITEMPEDIDO(insert into itempedido values (7,3,1300.33,3,2)), é apresentada a mensagem: ORA-02291: restrição de integridade (SYSTEM.FK_IDPEDIDO) violada - chave mãe não localizada.

A coluna IDPEDIDO é uma PK da tabela PEDIDO e creio que o motivo do erro é que primeiramente deve-se inserir o registro na tabela PEDIDO antes de fazer o insert na ITEMPEDIDO.

 

Existem 2 tabelas, uma é a PEDIDO, no qual esta as informações do pedido, como por exemplo: id do pedido (PK), ID cliente, data do pedido e o valor total.

Outra é a tabela ITEMPEDIDO, onde está os registros: ID PEDIDO (FK PEDIDO), nºitem, Valor, Quantidade e ID Produto.

Ou seja, primeiramente o registro IDPEDIDO, deve constar na tabela PEDIDO, antes de ser inserido na tabela ITEMPEDIDO, correto ?

 

Consegue me dar uma luz?

 

Share this post


Link to post
Share on other sites
Citar

 

Outra é a tabela ITEMPEDIDO, onde está os registros: ID PEDIDO (FK PEDIDO), nºitem, Valor, Quantidade e ID Produto.

Ou seja, primeiramente o registro IDPEDIDO, deve constar na tabela PEDIDO, antes de ser inserido na tabela ITEMPEDIDO, correto ?

 

 

Exato.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By joeythai
      Boa tarde rapaziada,
       
      Criei uma procedure que está trazendo os dados certinhos com exceção de uma coluna(Caminho do Arquivo) está cortando o nome do arquivo que salvo lá. O código é esse:
       
      <code>
      CREATE PROCEDURE dbo.clientes2 @Produto_ID INT = NULL, @Comprador_ID INT = NULL, @NM_Token NVARCHAR(MAX) = NULL, @DocumentoTipo INT = NULL, @NM_CPF CHAR(20) = NULL, @Teste INT = 0 AS   SET @Produto_ID = ISNULL(@Produto_ID, 0); SET @Comprador_ID = ISNULL(@Comprador_ID, 0); SET @NM_Token = RTRIM(LTRIM( ISNULL(@NM_Token, '') )); SET @DocumentoTipo = ISNULL(@DocumentoTipo, 0); SET @NM_CPF = RTRIM(LTRIM(@NM_CPF)); SET @Teste = ISNULL(@Teste, 1);   IF(@Teste = 1) BEGIN   IF(ISNULL(@Comprador_ID,0) > 0 AND @Produto_ID > 0)   BEGIN SELECT cliente.ID, cliente.Produto_ID, cliente.Carro_ID, cliente.Coligacao_ID, cliente.Cliente_ID, cliente.Deposito_ID, cliente.DocumentoTipo, CAST(cliente.NM_Arquivo AS nvarchar) as NM_Arquivo, CAST(cliente.NM_Token AS nvarchar) as NM_Token, cliente.NM_Responsavel, cliente.Data_BR, compradores.ID FROM Cliente cliente WITH (NOLOCK) INNER JOIN Produto produto WITH (NOLOCK) ON produto.ID = cliente.Produto_ID INNER JOIN Compradores compradores WITH (NOLOCK) ON compradores.ID = produto.Comprador_ID WHERE compradores.ID = @Comprador_ID AND cliente.Produto_ID = @Prodtuo_ID AND cliente.DocumentoTipo = @DocumentoTipo; END   END   ELSE BEGIN   IF(ISNULL(@Comprador_ID,0) > 0 AND @Produto_ID > 0)   BEGIN SELECT cliente.*, compradores.ID FROM Cliente cliente WITH (NOLOCK) INNER JOIN Produto produto WITH (NOLOCK) ON produto.ID = cliente.Produto_ID INNER JOIN Notas notas WITH (NOLOCK) ON notas.ID = produto.NVenda_ID INNER JOIN Compradores compradores WITH (NOLOCK) ON compradores.ID = notas.Comprador_ID WHERE compradores.ID = @Comprador_ID AND cliente.Produto_ID = @Produto_ID AND cliente.DocumentoTipo = DocumentoTipo; END   END   RETURN; </code>
       
      faço um join na tabela clientes, esse campo é de lá, e na tabela clientes o caminho do arquivo está salvo certinho, completo com o nome do arquivo.
      Alguem tem alguma ideia do que está errado ?
    • By Thiago Duarte
      Eu tenho uma página que abri um alert ao clicar no link , só que nao cadastra e nem funciona o login.
       
       <div class="btn-box">          <a class="btn btn-color venobox vbox-item" data-toggle="modal" href="javascript:void(0)" onclick="openRegisterModal();">Start now Free </a>             <img src="images/seta.png"> </div>  
      <div class="modal-body">                               <div class="box">                                  <div class="content">                                     <!-- Login Form -->                                     <div class="loginBox">                                        <form id="login-modal" role="form"  method="post" action="#">                                           <input type="hidden" name="param" value="logar" />                                           <!-- Success/Alert Notification -->                                           <p class="lm-success"><i class="icon icon_check_alt2"></i> <strong>Congratulation! Login modal validation is working. Implement your code.</strong></p>                                           <p class="lm-failed"><i class="icon icon_close_alt2"></i><strong> Something went wrong! Insert correct value.</strong></p>                                           <!-- Input Fields -->                                           <input id="lm-email" class="form-control input-lg" type="text" placeholder="Email" name="email" required="">                                           <input id="lm-password" class="form-control input-lg" type="password" placeholder="Password" name="senha" required="">                                           <!-- Login Button -->                                           <input type="submit" class="btn btn-color" value="Login">                                           <!-- <button class="btn btn-color">Login</button> -->                                        </form>                                     </div>                                     <!-- /End Login Form -->                                  </div>                               </div>                               <!-- /End Login Form Box -->                               <div class="box">                                  <!-- Signup Form -->                                  <div class="content registerBox" style="display:none;">                                     <form id="signup-modal" role="form" method="post" action="?go=cadastrar">                                        <!-- Success/Alert Notification -->                                        <p class="sm-success"><i class="icon icon_check_alt2"></i> <strong>Congratulation! Signup modal validation is working. Implement your code.</strong></p>                                        <p class="sm-failed"><i class="icon icon_close_alt2"></i><strong> Something went wrong! Insert correct value.</strong></p>                                        <!-- Input Fields -->                                        <input id="sm-email" class="form-control input-lg" type="text" placeholder="Email" name="email" required="">                                        <input id="sm-password" class="form-control input-lg" type="password" placeholder="password" name="password">                                        <input id="sm-confirm" class="form-control input-lg" type="password" placeholder="Repeat password" name="senha-confirm">                                        <!-- Signup Button -->                                        <!--  <button class="btn btn-color">Create an account</button> -->                                        <input type="submit" class="btn btn-color" value="Create an account">                                     </form>                                  </div>                                  <!-- /End Signup Form -->                               </div>                               <!-- /End Signup Form Box -->                            </div>  
      e em baixo do </html> coloquei
        <?php           $param = (empty($_POST['param'])) ? 'error' : $_POST['param'];           if($param == 'logar'){       //if($_POST['param'] == 'logar'){             $email = $_POST['email'];             $password = $_POST['password'];             $query1 = mysql_num_rows(mysql_query("SELECT * FROM usuario WHERE email = '$email' AND password = '$password'")) or die(mysql_error());             if($query1 == 1){           // print "<script>alert('logou');</script>";              print "<script>window.location.replace('dashboard/index.php');</script>";           }else{              echo "<script>alert('User and password do not match.'); history.back();</script>";           }        }        if(@$_GET['go'] == 'cadastrar'){           // $dominio_gratis = $_POST['dominio_gratis'];          $email = $_POST['email'];          $password = $_POST['password'];          $date_register = date("m-d-Y");                // if(empty($dominio_gratis)){           //     echo "<script>alert('Preencha todos os campos para se cadastrar.'); history.back();</script>";           // }else          if(empty($email)){           echo "<script>alert('Fill in all the fields to register.'); history.back();</script>";            }elseif(empty($password)){           echo "<script>alert('Fill in all the fields to register.'); history.back();</script>";        }else{           $query1 = mysql_num_rows(mysql_query("SELECT * FROM usuario WHERE email = '$email'"));           if($query1 == 1){            echo "<script>alert('User already exists.'); history.back();</script>";          }else{            mysql_query("insert into usuario (email, password, date_register, plan) values ('$email','$password','$date_register', '0')");            header("Location: dashboard/dashboard.php");         }      }   }   ?>  
      Alguem pode ajudar?
    • By ldblucas
      Boa tarde,
       
      Atualmente qual a melhor formar de fazer um conexao C# com o banco Oracle ?
       
       
       
      desde já agradeço
    • By mr22robot
      select A.CODPROD,A.DESCRICAO,A.DTMOVLOG DATA,A.NUMNOTA,ROUND(A.QT,2)QTDE,A.PUNIT,A.NOMECODOPER OPERACAO,ROUND(A.P_TOTAL,2)P_TOTAL, (SELECT QTEST - PCEST.QTRESERV QTEST FROM PCEST WHERE CODFILIAL = 1 AND CODPROD = A.CODPROD)QTESTOQUE FROM( SELECT PCMOV.CODPROD,PCMOV.DESCRICAO, TRUNC(PCMOV.DTMOV) DTMOV, PCMOV.DTMOVLOG, PCMOV.NUMNOTA, PCMOV.NUMSEQ, PCMOV.NUMSEQPED, PCMOV.NUMTRANSENT, PCMOV.DTCANCEL, DECODE(DTCANCEL,NULL,'','Cancelado') SITUACAO, PCMOV.CODUSUR, PCMOV.NUMTRANSVENDA, PCMOV.NUMCAR, PCMOV.NUMLOTE, PCMOV.CODFISCAL, NVL(PCMOV.CUSTOREAL,0) CUSTOREAL, NVL(PCMOV.CUSTOFIN,0) CUSTOFIN, (CASE WHEN (SUBSTR(PCMOV.CODOPER,1,1) = 'E') THEN NVL(PCMOV.CUSTOFIN,0) ELSE NVL(PCMOV.CUSTOFINEST,0) END) CUSTOFINEST, NVL(PCMOV.CUSTOULTENT,0) CUSTOULTENT, NVL(PCMOV.CUSTOFORNEC,0) CUSTOFORNEC, NVL(PCMOV.CUSTOCONT,0) CUSTOCONT, DECODE(PCMOV.CODOPER, 'E',PCMOV.CODFORNEC, 'EB',PCMOV.CODFORNEC, 'ET',PCMOV.CODFORNEC, 'ER',PCMOV.CODFORNEC, 'ES',PCMOV.CODFORNEC, PCMOV.CODCLI) CODCLI, NVL(PCMOV.CODFUNCLANC,0) AS CODFUNCLANC, DECODE(SUBSTR(PCMOV.CODOPER, 1, 1), 'S',(PCMOV.QT * (-1)), 'R',(PCMOV.QT * (-1)), DECODE(NVL(PCMOVCOMPLE.QTRETORNOTV13, 0), 0, NVL(PCMOV.QT, 0), PCMOVCOMPLE.QTRETORNOTV13)) AS QT, NVL(PCMOV.PUNIT,0) PUNIT, PCMOV.CODOPER, DECODE(PCMOV.CODOPER, 'E', DECODE(GREATEST(PCMOV.QT,0),0,'Entrada Cancelada','Entrada Merc.'), 'EB',DECODE(GREATEST(PCMOV.QT,0),0,'Bonif. Cancelada','Entrada Bonific.'), 'ET',DECODE(GREATEST(PCMOV.QT,0),0,'Entrada Transf. Cancelada','Entrada Transf.'), 'EA',DECODE(GREATEST(PCMOV.QT,0),0,'Entrada Ajuste Cancelada','Ajuste Estoque'), 'E1',DECODE(GREATEST(PCMOV.QT,0),0,'Entrada Avaria Cancelada','Entrada Avaria'), 'EI',DECODE(GREATEST(PCMOV.QT,0),0,'Ajuste Invent. Cancelado','Ajuste Invent.'), 'ED',DECODE(GREATEST(PCMOV.QT,0),0,'Devolução Cancelada','Dev. Cliente'), 'EN',DECODE(GREATEST(PCMOV.QT,0),0,'Dev. Venda Consig. Cancelada','Dev. Venda Consignada'), 'ER',DECODE(GREATEST(PCMOV.QT,0),0,'Simples Remessa Cancelada','Simples Remessa'), 'ES',DECODE(GREATEST(PCMOV.QT,0),0,'Sobra Mercadoria Cancelamento','Sobra de Mercadoria'), 'EM',DECODE(GREATEST(PCMOV.QT,0),0,'Ent. Mat. Consumo Cancelada','Entrada Materiais de Consumo'), 'EC',DECODE(GREATEST(PCMOV.QT,0),0,'Ent. Consig. Cancelada','Entrada Consignação'), 'EO',DECODE(GREATEST(PCMOV.QT,0),0,'Dev. Comodato Cancelada','Devolução de Comodato'), 'EX',DECODE(GREATEST(PCMOV.QT,0),0,'Dev. Avulsa Cancelada','Devolução Avulsa'), 'EG',DECODE(GREATEST(PCMOV.QT,0),0,'Entrada Benefic. Cancelada','Entrada de Beneficiamento'), 'S', DECODE(GREATEST(PCMOV.QT,0),0,'NF Cancelada','Saida'), 'SD',DECODE(GREATEST(PCMOV.QT,0),0,'Dev. Cancelada','Dev. Fornecedor'), 'SB',DECODE(GREATEST(PCMOV.QT,0),0,'Saida Bonific. Cancelada','Saida Bonific.'), 'ST',DECODE(GREATEST(PCMOV.QT,0),0,'Saida Transf. Cancelada','Saida Transf.'), 'S1',DECODE(GREATEST(PCMOV.QT,0),0,'Avaria Reaprov. Cancelada','Avaria por Reaproveitamento'), 'SS',DECODE(GREATEST(PCMOV.QT,0),0,'Saída Sobra Cancelada','Saída de Sobra'), 'SA',DECODE(GREATEST(PCMOV.QT,0),0,'Saída Ajuste Cancelada','Ajuste Estoque'), 'SI',DECODE(GREATEST(PCMOV.QT,0),0,'Ajuste Invent. Cancelado','Ajuste Invent.'), 'SR',DECODE(GREATEST(PCMOV.QT,0),0,'Simples Remessa Cancelada','Simples Remessa'), 'SC',DECODE(GREATEST(PCMOV.QT,0),0,'Saída Consig. Cancelada','Saída Consignação'), 'SO',DECODE(GREATEST(PCMOV.QT,0),0,'Remessa Comodato Cancelada','Remessa de Comodato'), 'SF',DECODE(GREATEST(PCMOV.QT,0),0,'Dev. Comodato Fornec. Cancelada','Devolução de Comodato a Fornecedor'), 'RA',DECODE(GREATEST(PCMOV.QT,0),0,'Req. Avulsa Cancelada','Requisição Avulsa'), 'EP',DECODE(GREATEST(PCMOV.QT,0),0,'Cancelamento Produção','Entrada Produção'), 'SP',DECODE(GREATEST(PCMOV.QT,0),0,'Cancelamento Produção','Requisição Mat.Prima'), 'SV',DECODE(GREATEST(PCMOV.QT,0),0,'Saída Avaria Cancelada','Saída por Avaria'), 'SM',DECODE(GREATEST(PCMOV.QT,0),0,'Saída Mat. Consumo Cancelada','Saída Materiais de Consumo'), 'SL',DECODE(GREATEST(PCMOV.QT,0),0,'Saída Perda Cancelada','Saída de Perda'), 'EL',DECODE(GREATEST(PCMOV.QT,0),0,'Ent. Perda Cancelada','Entrada de Perda'), 'EF',DECODE(GREATEST(PCMOV.QT,0),0,'Entrada Comodato Cancelada','Entrada de Comodato'), 'SN',DECODE(GREATEST(PCMOV.QT,0),0,'Saída Benefic. Cancelada','Saída de Beneficiamento'), 'EV',DECODE(GREATEST(PCMOV.QT,0),0,'Ent. Dev. Rem. Benefic. Cancelada','Entrada Devolução de Remessa para Beneficiamento'), 'EG',DECODE(GREATEST(PCMOV.QT,0),0,'Ent. Benefic. Cancelada','Entrada de Beneficiamento'), 'Desconhecido') NOMECODOPER, (NVL(PCMOV.PUNIT,0)*DECODE(NVL(PCMOVCOMPLE.QTRETORNOTV13, 0), 0, NVL(PCMOV.QT, 0), PCMOVCOMPLE.QTRETORNOTV13)) P_TOTAL, (CASE WHEN PCMOV.CODOPER IN ('SA', 'EA') THEN (SELECT DISTINCT HISTORICO FROM PCLANC WHERE NUMTRANSENT = PCMOV.NUMTRANSENT AND ROWNUM = 1) ELSE ' ' END) MOTIVO FROM PCMOV, PCPRODUT, PCMOVCOMPLE WHERE PCMOV.CODPROD IN(SELECT CODPROD FROM PCPRODUT WHERE CODSEC IN(10020)) AND PCMOV.CODPROD = PCPRODUT.CODPROD AND PCMOV.NUMTRANSITEM = PCMOVCOMPLE.NUMTRANSITEM(+) AND NVL(PCMOVCOMPLE.MOVEST, 'S') = 'S' AND PCMOV.DTMOV BETWEEN '01-JAN-2020' AND '29-SEP-2021' AND NVL(PCMOV.CODFILIALNF, PCMOV.CODFILIAL) = '1' AND PCMOV.CODOPER <> 'S' AND ((NVL(PCPRODUT.ESTOQUEPORLOTE, 'N') = 'S' AND PCMOV.NUMLOTE IS NOT NULL) OR (NVL(PCPRODUT.ESTOQUEPORLOTE, 'N') = 'N' AND PCMOV.NUMLOTE IS NULL)) AND PCMOV.STATUS IN ('B','AB') AND NOT EXISTS (SELECT DISTINCT (PCNFSAID.NUMTRANSVENDA) FROM PCNFSAID, PCPRODUT WHERE PCNFSAID.NUMTRANSVENDA = PCMOV.NUMTRANSVENDA AND PCNFSAID.CODFILIAL = PCMOV.CODFILIAL AND PCMOV.CODOPER = 'S' AND PCNFSAID.CONDVENDA IN (4, 7, 14) AND PCMOV.CODPROD = PCPRODUT.CODPROD AND PCPRODUT.TIPOMERC = 'CB') AND NOT (FERRAMENTAS.F_BUSCARPARAMETRO_ALFA('DEVOLVESIMPLESREMTV13TOTAL',PCMOV.CODFILIAL,'N') = 'S' AND PCMOV.ROTINACAD LIKE '%1332%' AND NVL(PCMOVCOMPLE.QTRETORNOTV13,0) = 0) AND NOT EXISTS (SELECT NUMNOTA FROM PCNFSAID WHERE NUMTRANSVENDA = PCMOV.NUMTRANSVENDA AND SITUACAONFE IN (110,205,301,302,303)) ORDER BY PCMOV.CODOPER, PCMOV.DTMOV, PCMOV.NUMNOTA )A WHERE A.DTCANCEL IS NULL AND A.CODOPER = 'E' ORDER BY CODPROd,DATA Boa tarde. Estou com essa dúvida:
      Preciso em um select trazer os dados com a seguinte condição: 
      Quando  o valor do punit repetir, somente traz o ultimo registro. ou seja a maior data. 
      caso contrário, traz todos os registros. 
      é possíveç, mais não sei como. Tentei usar o ROW_NUMBER(). Mas não encontrei uma forma de usar. 
      Greato
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.