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?
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;
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.
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;