E-Business Suite R12 – Criando um novo Concurrent
Olá pessoal !
Nesse artigo eu vou mostrar como se cria um novo Concurrent no E-Business Suite R12. Consequentemente, esse processo passa pelo cadastro do executável, do programa até a criação do Request.
1) Executável (System Administrator > Concurrent > Program > Executable)
Você pode criar o executável através de um script ou mesmo pela tela Concurrent Program Executable. Para criar via script, execute o código abaixo:
BEGIN
fnd_program.executable
(
'SLAAGING' -- Nome do executavel
,'Receivables' -- Aplicacao
,'SLAAGING' -- Short_name
,'AR - Aging Reports' -- Descricao
,'PL/SQL Stored Procedure' -- Metodo de execucao
,'SLA_AR_AGING.MAIN' -- Nome para execucao
,'' -- Sub Rotina
,'' -- File Path
,'US' -- Idioma
,'');
COMMIT;
END;
/
O Resultado é:
2) Concurrent Program (System Administrator > Concurrent > Program > Define)
O próximo passo é criar o Concurrent Program. Também é possível fazer isso tanto pelo código PL/SQL quanto pela tela:
BEGIN
fnd_program.register
(
'SLAAGING' -- Programa
,'Receivables' -- Aplicacao
,'Y' -- Enabled
,'SLAAGING' -- Short_name
,'AR - Aging Reports'-- Descricao
,'SLAAGING' -- Executavel
,'Receivables' -- Aplicacao
,'' -- Opcoes de Execucao
,'' -- Prioridade
,'Y' -- Salvar Output
,'Y' -- Impressao
,'' -- Colunas
,'' -- Linhas
,'' -- Estilo
,'N' -- Estilo Obrigatorio
,'' -- Impressora
,'' -- Tipo de Request
,'' -- Aplicacao do tipo de request
,'Y' -- Usar em SRS
,'N' -- Permitir desabilitar valores
,'N' -- Executar Sozinho
,'TEXT' -- Tipo de Output
,'N' -- Habilitar Trace
,'Y' -- Restart
,'Y' -- Nls_compliant
,'' -- Nome do icone
,'US' -- Codigo do Idioma
);
COMMIT;
END;
O Concurrent program que estou criando terá 3 parâmetros nos quais:
- O primeiro será um List of Values com os tipos de relatórios a serem processados;
- O segundo será um SQL Statement que retornará uma data;
- O terceiro e último um Profile que retornará o ORG ID corrente;
3) Criando os parâmetros do Concurrent Program
a) List of Values (System Administrator > Application > Validation > Set)
Para o primeiro parâmetro eu vou criar a lista de Valores XX_CUSTOM_AGING_REPORT com as características da tela abaixo:
O próximo passo é criar as Values (System Administrator > Application > Validation > Values) da minha LoV:
Agora faremos a atribuição do meu parâmetro Report Type com a LoV criada:
b) SQL Statement
O parâmetro period será do tipo SQL Statement. Um SQL retornará o último dia do mês anterior como resultado:
c) Profile
O terceiro e último parâmetro será do tipo Profile e eu utilizarei o resultado da ORG ID setada em sessão:
Parâmetros criados, agora é só salvar !
Não se esqueça de setar o campo Required, caso os parâmetros sejam obrigatórios !
4) Request Groups (System Administrator > Security > Responsibility > Request )
Agora vamos atrelar o nosso programa a um Request Group para que ele fique disponível nas Responsibilities que os acessam:
5) Submeter o Request
Agora chegou a hora que tanto esperamos, que é submeter o Request de execução do Concurrent. Se todos os passos acima foram seguidos corretamente, a seguinte window com os parâmetros aparecerá:
Basta dar OK e Submit para que a execução se inicie. No meu caso, eu obtive o seguinte resultado:
Fiquei me perguntando o porquê desse erro…Tinha completado todos os passos corretamente, mas a seguinte mensagem aparecia no LOG:
PLS-00306: wrong number or types of arguments in call to ‘MAIN’
A primeira reação é verificar os parâmetros IN da procedure. Só que nesse caso, um detalhe mais importante foi esquecido. Os parâmetros OUT.
Para executar uma procedure via Concurrent, é obrigatório a criação de dois parâmetros OUT:
- errbuff VARCHAR2;
- retcode VARCHAR2;
A chamada da minha procedure teve que ser modificada para contemplar os seguintes argumentos:
PROCEDURE main
(
errbuf OUT VARCHAR2,
retcode OUT VARCHAR2,
p_aging IN VARCHAR2 DEFAULT 'ALL_REPORTS',
p_period IN DATE DEFAULT SYSDATE,
p_orgID IN NUMBER DEFAULT NULL
);
Após a correção, submeti um novo request e abaixo o resultado do log:
Dessa vez, executado com sucesso !
Dica: Para que as mensagens sejam exibidas no log, é preciso utilizar a package fnd_file. Abaixo uma sugestão de como criar uma procedure que exiba tanto no log como no output de uma IDE SQL:
--
-- Show messages (DBMS and FND)
--
PROCEDURE message
(
p_message IN VARCHAR2,
p_raise IN BOOLEAN DEFAULT FALSE
)
IS
BEGIN
fnd_file.put_line
(
fnd_file.log
,p_message
);
DBMS_OUTPUT.PUT_LINE
(
p_message
);
IF p_raise THEN
RAISE_APPLICATION_ERROR
(
-20000
,p_message
);
ENDIF;
END MESSAGE;
Referências
- 73492.1 (Creating a PL/SQL Concurrent Program in Oracle Applications)
- 1016543.102 (Custom Stored Procedure Run as Concurrent Request Fails w/ PLS-306 AND ORA-6550)
Abraço