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

Formado em Gestão em Tecnologia da Informação, com sólidos conhecimentos em SQL, PL/SQL, Oracle Forms, Reports e E-Business Suite (AP,AR e GL).
Foi durante 3 anos gerente de tecnologia de grande empresa do setor de saúde, e atualmente atua como Analista de Sistema Sênior na Scania Latin America e também como Diretor-fundador do GPO (Grupo de Profissionais Oracle).