PO - Cancelar requisição via pl/sql

Perguntas relacionadas a questões técnicas do Oracle EBS. Criação de Concorrentes, Value Sets, Alerts, Forms Personalizations, Configurações, etc
Responder
Msfabris
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 30
Registrado em: Qua, 17 Fev 2010 8:02 am
Localização: Criciuma SC

Bom dia


É possível cancelar requisição (interna ou de compra) via pl/sql?

Obs: Oracle EBS 11.5.9



-----
Marcel
Avatar do usuário
madmax
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 293
Registrado em: Qua, 13 Dez 2006 5:02 pm
Localização: São Paulo
Contato:
________________________________
Douglas - Madmax.

Olá Marcel.

Cara não aconselho fazer isso via PL/SQL e sim seguir o processo do PO, mas se não me engano existe uma package po_document_control_pub.control_document que você pode utilizar para cancelar.

Segue exemplo:

Selecionar tudo

DECLARE
x_return_status VARCHAR2 (10);
BEGIN
fnd_global.apps_initialize (1072, 50382, 201);
po_document_control_pub.control_document (p_api_version => 1.0
, p_init_msg_list => 'T'
, p_commit => 'F'
, x_return_status => x_return_status
, p_doc_type => 'PO'
, p_doc_subtype => 'STANDARD'
, p_doc_id => 35917
, p_doc_num => '830829'
, p_release_id => NULL
, p_release_num => NULL
, p_doc_line_id => NULL
, p_doc_line_num => NULL
, p_doc_line_loc_id => NULL
, p_doc_shipment_num => NULL
, p_action => 'CANCEL'
, p_action_date => SYSDATE
, p_cancel_reason => 'TEST123'
, p_cancel_reqs_flag => 'Y'
, p_print_flag => 'N'
, p_note_to_vendor => 'TEST123'
);
dbms_output.put_line(x_return_status); 
END;


Se precisar de querys sobre PO pode acessar meu Blog rsrsrs.

http://especialistaoracleebs.blogspot.c ... -blog.html

Espero ter ajudado.

Abs..
Msfabris
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 30
Registrado em: Qua, 17 Fev 2010 8:02 am
Localização: Criciuma SC

Douglas, obrigado pela sua contribuição.


Só estou com uma dúvida... Neste exemplo, o Doc_id e o Doc_Num são referentes a Ordem de compra ou a Requisição?




Marcel
Avatar do usuário
madmax
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 293
Registrado em: Qua, 13 Dez 2006 5:02 pm
Localização: São Paulo
Contato:
________________________________
Douglas - Madmax.

Marcel.

Selecionar tudo

Doc_id = PO_HEADERS_ALL.PO_HEADER_ID

Doc_Num = PO_HEADERS_ALL.Segment1
Ou seja a Ordem de Compra.

Mas pesquisando melhor nós temos uma API a

Selecionar tudo

po_reqs_control_sv.update_reqs_status 
que pode ser usado para fechar ou cancelar requisições.

Temos de passar os parâmetros como requisition_header_id, requisition_line_id, Preparer_id, document_type_code,
type_lookup_code, req_control_action, Req_control_reason e o parâmetro padrão diferente para a API.


1 - PO - Sample Script to Cancel PR Using API

Selecionar tudo


DECLARE

X_req_control_error_rc VARCHAR2 (500);
l_org_id NUMBER := 308; -- Enter the Operating_Unit Here
cnt number := 0;

CURSOR C_REQ_CANCEL is

SELECT
prh.segment1 requisition_num,
prh.requisition_header_id,
prh.org_id,
prl.requisition_line_id,
prh.preparer_id,
prh.type_lookup_code,
pdt.document_type_code,
prh.authorization_status,
prl.line_location_id
FROM
apps.po_requisition_headers_all prh,
apps.po_requisition_lines_all prl,
apps.po_document_types_all pdt
WHERE 1 = 1
AND prh.org_id = l_org_id
AND pdt.document_type_code = 'REQUISITION'
AND prh.authorization_status = 'APPROVED'
AND prl.line_location_id is null
AND prh.requisition_header_id = prl.requisition_header_id
AND prh.type_lookup_code = pdt.document_subtype
AND prh.org_id = pdt.org_id
AND prh.segment1 = '21170000909'; -- Enter The Requisition Number

BEGIN

fnd_global.apps_initialize (user_id => 2083,
resp_id => 20707,
resp_appl_id => 201);

mo_global.init ('PO');
mo_global.set_policy_context ('S', l_org_id);

FOR i IN C_REQ_CANCEL

LOOP

dbms_output.put_line (' Calling po_reqs_control_sv.update_reqs_status to cancel the Requisition=>' i.requisition_num);
dbms_output.put_line ('======================================================');

po_reqs_control_sv.update_reqs_status(
X_req_header_id => i.requisition_header_id
, X_req_line_id => i.requisition_line_id
, X_agent_id => i.preparer_id
, X_req_doc_type => i.document_type_code
, X_req_doc_subtype => i.type_lookup_code
, X_req_control_action => 'CANCEL'
, X_req_control_reason => 'CANCELLED BY API'
, X_req_action_date => SYSDATE
, X_encumbrance_flag => 'N'
, X_oe_installed_flag => 'Y'
, X_req_control_error_rc => X_req_control_error_rc);

DBMS_OUTPUT.PUT_LINE ( 'Status Found:=> ' X_req_control_error_rc);
DBMS_OUTPUT.PUT_LINE ('Requisition Number cancelled is :=>' i.Requisition_num);

cnt := cnt+1;

END LOOP;

DBMS_OUTPUT.PUT_LINE('Count is :=>' cnt);

END;


2 - Script para finalmente fechar PR Usando API.sql

Selecionar tudo

DECLARE

X_req_control_error_rc VARCHAR2 (500);
l_org_id NUMBER := 308; -- Enter the Operating_Unit Here
cnt number := 0;

CURSOR C_REQ_CLOSE is

SELECT
prh.segment1 requisition_num,
prh.requisition_header_id,
prh.org_id,
prl.requisition_line_id,
prh.preparer_id,
prh.type_lookup_code,
pdt.document_type_code,
prh.authorization_status,
prh.closed_code
FROM
apps.po_requisition_headers_all prh,
apps.po_requisition_lines_all prl,
apps.po_document_types_all pdt
WHERE 1 = 1
AND prh.org_id = l_org_id
AND pdt.document_type_code = 'REQUISITION'
AND prh.authorization_status = 'APPROVED'
AND prl.line_location_id is null
AND prh.requisition_header_id = prl.requisition_header_id
AND prh.type_lookup_code = pdt.document_subtype
AND prh.org_id = pdt.org_id
AND prh.segment1 = '21170002264'; -- Enter The Requisition Number

BEGIN

fnd_global.apps_initialize (user_id => 2083,
resp_id => 20707,
resp_appl_id => 201);

mo_global.init ('PO');
mo_global.set_policy_context ('S', l_org_id);

FOR i IN C_REQ_CLOSE

LOOP

DBMS_OUTPUT.PUT_LINE ('Calling po_reqs_control_sv.update_reqs_status to Finally Close Requisition=>' i.requisition_num);

DBMS_OUTPUT.PUT_LINE ('=======================================================');

po_reqs_control_sv.update_reqs_status(
X_req_header_id => i.requisition_header_id
, X_req_line_id => i.requisition_line_id
, X_agent_id => i.preparer_id
, X_req_doc_type => i.document_type_code
, X_req_doc_subtype => i.type_lookup_code
, X_req_control_action => 'FINALLY CLOSE'
, X_req_control_reason => 'FINALLY CLOSED BY API'
, X_req_action_date => SYSDATE
, X_encumbrance_flag => 'N'
, X_oe_installed_flag => 'Y'
, X_req_control_error_rc => X_req_control_error_rc);

DBMS_OUTPUT.PUT_LINE ( 'Status Found: ' X_req_control_error_rc);

DBMS_OUTPUT.PUT_LINE ('Requisition Number which is Finally Closed =>' i.Requisition_num);

cnt := cnt+1;

END LOOP;

DBMS_OUTPUT.PUT_LINE('Count is :=>' cnt);

END; 
Espero ter ajudado.

Abs.
Msfabris
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 30
Registrado em: Qua, 17 Fev 2010 8:02 am
Localização: Criciuma SC

Douglas, funcionou perfeitamente... Muito obrigado!


Marcel
Avatar do usuário
madmax
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 293
Registrado em: Qua, 13 Dez 2006 5:02 pm
Localização: São Paulo
Contato:
________________________________
Douglas - Madmax.

Que bom Marcel.

Precisando estamos aí.

Abs..
Msfabris
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 30
Registrado em: Qua, 17 Fev 2010 8:02 am
Localização: Criciuma SC

Bom dia

Utilizei o codigo abaixo para fazer o cancelamento, mas o mesmo não está revertendo o empenho. já tentei mudar o parametro X_encumbrance_flag para N e Y, mas em nenhum dos casos o empenho foi revertido.

Selecionar tudo

po_reqs_control_sv.update_reqs_status
( X_req_header_id        => :REQLINES.requisition_header_id
, X_req_line_id          => w_req_line_id
, X_agent_id             => :REQHEAD.preparer_id
, X_req_doc_type         => 'REQUISITION'
, X_req_doc_subtype      => :REQHEAD.type_lookup_code
, X_req_control_action   => 'CANCEL'
, X_req_control_reason   => 'CANCELLED BY API'
, X_req_action_date      => SYSDATE
, X_encumbrance_flag     => 'Y'
, X_oe_installed_flag    => 'Y'
, X_req_control_error_rc => V_RETURN
);
alguém tem o código para reverter o empenho de uma requisição?



Marcel
Avatar do usuário
madmax
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 293
Registrado em: Qua, 13 Dez 2006 5:02 pm
Localização: São Paulo
Contato:
________________________________
Douglas - Madmax.

Marcel,

Poderia explicar melhor o que seria empenho de uma requisição?

Abs.
Msfabris
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 30
Registrado em: Qua, 17 Fev 2010 8:02 am
Localização: Criciuma SC

Nós utilizamos a parte de Orçamento do GL.

Ela funciona assim, cada combinação contabil (ou um conjunto de combinações) possui um valor X para gastar no periodo (período do gl). Quando é feita uma requisição, o sistema reserva a quantia do orçamento correspondente a conta da requisição, isto é chamado empenho. Depois, quando é dado entrada da nota, este valor sai do empenho e vai para o realizado.
Acontece que quando é cancelada uma requisição utilizando a procedure descrita no outro post, não está estornando este valor empenhado.

Exemplo:
- Conta 1.2.2 Periodo MAI-2010 Orçamento R$ 100
- Crio uma requisição com encargo na conta 1.2.2 de R$60
- Orçamento R$100 Empenhado R$ 60 Realizado R$0 Disponível R$ 100
Neste momento, se cancelar a requisição deveria ficar assim
- Orçamento R$100 Empenhado R$ 0 Realizado R$0 Disponível R$ 100
Mas está mantendo o valor que havia empenhado
- Orçamento R$100 Empenhado R$ 60 (!) Realizado R$0 Disponível R$ 40

Ou seja, o valor disponivel fica inconsistente, não deixando que seja feita outra requisição para substituir aquela que foi cancelada.



Se ainda ficou com alguma duvida sobre o processo, fala ai.

Marcel
Avatar do usuário
madmax
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 293
Registrado em: Qua, 13 Dez 2006 5:02 pm
Localização: São Paulo
Contato:
________________________________
Douglas - Madmax.

Marcel.

Com certeza a API não irá extornar no empenho porque deve ser outras tabelas que não seja essas:

Selecionar tudo

apps.po_requisition_headers_all 
apps.po_requisition_lines_all 
apps.po_document_types_all 
Acho que você devera customizar a po_reqs_control_sv para que pegue o valor do empenho da requisição e abata no valor total onde e guardado.

Abs.
Responder
  • Informação
  • Quem está online

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