Procedure update comparando duas tabelas

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
psneves
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Sex, 11 Set 2020 11:00 am
Localização: linhares

Bom dia. Como estão?
Sou novo nos estudos com SQL e ando tendo dificuldades na criação de procedures. o meu cenário é o seguinte. Eu preciso criar uma procedure que toda vez que o usuário fature um pedido de compra pelo portal de compras e ai ao confirmar ocorra uma atualização no meu portal de importação XML. A forma correta de ser feito isso é pelo portal de importação, onde os usuários processam a nota e automaticamente ao finalizar o processamento o status muda. Porém, a uma forma de se fazer direto pelo portal de compras faturando um pedido e inserindo a chave que vem no XML da NF enviada pelo fornecedor. Mas fazendo dessa forma o status lá no portal de xml continua pendente o que causa um problema no controle. Então preciso criar uma procedure que ao usuário de entrada nessa nota pelo portal de compras, o status lá do portal de xml seja atualizado para 2 = confirmado deixando então de ser pendente. Poderiam me ajudar?

Selecionar tudo

CREATE OR REPLACE PROCEDURE TESTE.AD_ATUALIZA_STATUS_XML (
P_STATUSNOTA IN TGFCAB.STATUSNOTA %TYPE -- Avalia se a nota está liberada para uso
P_STATUS IN 	TGFIXN.STATUS %TYPE -- status da nota do portal de importação ( deve ser atualizado no update da procedure)
P_NUMNOTA IN 	TGFIXN.NUMNOTA NOTA %TYPE -- numero da nota no portal de importação xml
P_CHAVECAB IN   TGFCAB.CHAVENFE %TYPE  -- chave da NF no portal de compras 
P_CHAVEXML IN   TGFIXN.CHAVEACESSO %TYPE --Chave da nf no portal de importação de xml 
P_TIPMOV IN     TGFTOP.TIPMOV %TYPE -- tipo de movimento compra)
IS 
BEGIN 
	IF (P_CHAVECAB = P_CHAVEXML AND P_TIPMOV = 'C' AND P_STATUSNOTA = 'L') THEN -- verifica se a chave do portal é de compras é a mesma do arquivo XML no portal de importação 
		UPDATE TGFIXN SET STATUS = 2 WHERE TGFIXN.NUMNOTA = P_NUMNOTA ; -- muda status daquela nota.
	ELSE 'CHAVE DA NOTA NÃO CORRESPONDE A CHAVE NO PORTAL DE IMPORTAÇÃO XML';
END IF;
--COMMIT;
END AD_ATUALIZA_STATUS_XML;
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

A sua procedure acima não está funcionando ?
psneves
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Sex, 11 Set 2020 11:00 am
Localização: linhares

Perdão pela demora, amigo. Mas no meu usuário não fui atualizado da resposta. Desde já agradeço a sua boa vontade. Venho apanhando com isso desde o dia em que abri o questionamento no fórum rs
Então, não estava. já mudei algumas vezes e agora o meu select me retorna esse erro :ORA-01403: dados não encontrados.
Irei postar meu código atualizado. Deixei os comentários para facilitar já que o sistema gera esse template.

Selecionar tudo

CREATE OR REPLACE PROCEDURE TESTE."AD_ATUALIZA_STATUS_XML" (
       P_TIPOEVENTO INT,    -- Identifica o tipo de evento
       P_IDSESSAO VARCHAR2, -- Identificador da execução. Serve para buscar informações dos campos da execução.
       P_CODUSU INT         -- Código do usuário logado
) AS
       BEFORE_INSERT INT;
       AFTER_INSERT  INT;
       BEFORE_DELETE INT;
       AFTER_DELETE  INT;
       BEFORE_UPDATE INT;
       AFTER_UPDATE  INT;
       BEFORE_COMMIT INT;
       
       
       P_CHAVEXML VARCHAR2(44);
       P_CHAVECAB VARCHAR2(44);
       P_NUMNOTAXML NUMBER;
       P_NUMNOTACAB NUMBER;
       P_STATUSNFECAB VARCHAR2(1);
       P_STATUSNOTACAB VARCHAR2(1);
       P_CODEMP NUMBER;
       P_TIPMOV VARCHAR2(1);
       
BEGIN
       BEFORE_INSERT := 0;
       AFTER_INSERT  := 1;
       BEFORE_DELETE := 2;
       AFTER_DELETE  := 3;
       BEFORE_UPDATE := 4;
       AFTER_UPDATE  := 5;
       BEFORE_COMMIT := 10;
       
    
        P_NUMNOTAXML := EVP_GET_CAMPO_INT(P_IDSESSAO, 'NUMNOTA');
        P_NUMNOTACAB := EVP_GET_CAMPO_INT(P_IDSESSAO, 'NUMNOTA');
        
/*******************************************************************************
   É possível obter o valor dos campos através das Functions:
   
  EVP_GET_CAMPO_DTA(P_IDSESSAO, 'NOMECAMPO') -- PARA CAMPOS DE DATA
  EVP_GET_CAMPO_INT(P_IDSESSAO, 'NOMECAMPO') -- PARA CAMPOS NUMÉRICOS INTEIROS
  EVP_GET_CAMPO_DEC(P_IDSESSAO, 'NOMECAMPO') -- PARA CAMPOS NUMÉRICOS DECIMAIS
  EVP_GET_CAMPO_TEXTO(P_IDSESSAO, 'NOMECAMPO')   -- PARA CAMPOS TEXTO
  
********************************************************************************/

     IF P_TIPOEVENTO = AFTER_INSERT THEN 
         SELECT CHAVENFE 
         INTO P_CHAVECAB
         FROM TGFCAB 
         WHERE NUMNOTA = P_NUMNOTACAB
         AND STATUSNFE = P_STATUSNFECAB
         AND STATUSNOTA = P_STATUSNOTACAB
         AND CODEMP = P_CODEMP
         AND TIPMOV = P_TIPMOV ;
       
          
            SELECT CHAVEACESSO
            INTO P_CHAVEXML
            FROM TGFIXN 
            WHERE NUMNOTA = P_NUMNOTAXML;
                     
        END IF;

   IF P_TIPOEVENTO = BEFORE_UPDATE  THEN 
     
   			UPDATE TGFIXN 
			SET STATUS = 2
			WHERE EXISTS (SELECT CHAVEACESSO FROM TGFCAB CAB 
			JOIN TGFIXN XML ON CAB.CHAVENFE = XML.CHAVEACESSO 
			WHERE CAB.CHAVENFE = XML.CHAVEACESSO 
			AND CAB.STATUSNOTA = 'L'
		    AND CAB.STATUSNFE = 'A'
		    AND CAB.TIPMOV = 'C');
            COMMIT;
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 13 visitantes