quarta-feira, 13 de maio de 2009

Submeter um concurrent no Oracle EBS de dentro de um código PL/SQL com data de execução dinâmica (FND_REQUEST.SUBMIT_REQUEST)

E ai pessoal!!!! Blz???

Hoje vou mostrar uma solução simples para um problema que tive, talvez alguém não conheça essa função e suas opções...

A situação é seguinte, precisamos executar um concurrent todo último dia do mês e não pode ser sábado ou domingo.

Na minha primeira visão da solução, imaginei o próprio schedule do concurrent, colocando na opção "Em dias específicos", porém, lá só tem a opção de ultimo dia, ele não vai se importar se o dia é sábado ou domingo...

Minha idéia é submeter o concurrent de dentro do meu PL/SQL, pega o último dia do mês seria simples, verificar se é sábado ou domingo também é simples, só não sabia se conseguiria colocar uma data para iniciar a execução do concurrent usando o FND_REQUEST.SUBMIT_REQUEST.

Pra quem não conhece o FND_REQUEST.SUBMIT_REQUEST, ela é um API da Oracle que irá submeter o concurrent do seu PL/SQL... guarda esse nome, que com certeza irá usar algum dia.

Depois de uma pesquisada... descobri um parâmetro do FND_REQUEST.SUBMIT_REQUEST que se coloca a data de execução, é somente preencher o parâmetro START_TIME.

Sempre que utilizava o FND_REQUEST.SUBMIT_REQUEST colocava somente os parâmetros obrigatórios e argumentos, não conhecia o START_TIME.

Assim, a solução ficou simples, montei o meu código da seguinte maneira, peguei o ultimo dia do mês com a query abaixo e verifiquei se é sábado ou domingo:

SELECT DECODE( TO_CHAR(LAST_DAY(ADD_MONTHS(SYSDATE,1)),'D')
, '1', TO_CHAR(LAST_DAY(ADD_MONTHS(SYSDATE,1))-2,'DD-MON-RRRR ')
, '7', TO_CHAR(LAST_DAY(ADD_MONTHS(SYSDATE,1))-1,'DD-MON-RRRR ')
, TO_CHAR(LAST_DAY(ADD_MONTHS(SYSDATE,1)),'DD-MON-RRRR ')
) '14:00:00'
INTO v_date_submit
FROM dual;

Com o resultado executei a FND_REQUEST.SUBMIT_REQUEST passando a data que select acima retornou no parâmetro START_TIME.

v_request_id := fnd_request.submit_request( application => 'XXFND' -- Aplicação do concurrent
, program => 'XXCONCURRENT' -- Nome do concurrent
, description => 'Meu Concurrent' -- Descrição do concurrent
, start_time => v_date_submit -- Data de Execução do concurrent
, argument1 => 'S' -- Parâmetro do concurrent
, argument2 => '1060' -- Parâmetro do concurrent
);

Ai é só sair para o abraço!!!!!!

Um exemplo de como o programa ira funcionar: Hoje é dia 30/04/2009, o usuário submete o concurrent. O programa vai fazer todo o processo, buscar o ultima dia do mês seguinte 29/05/2009 e submeter o concurrent para rodar nesta data. Quando chegar no dia 29/05/2009 ele vai fazer processo, buscar o ultima dia do mês seguinte 30/06/2009 e submter o concurrent para rodar nesta data... e assim vai longe... até alguém cancelar o concurrent schedulado.

Espero que a dica acima ajude algum profissional necessitado... heheheheeeeeeeeee



Absss

2 comentários:

  1. o velhinho bem isso que eu precisava, mas realizando um teste aqui ele ta retornando o v_request_id = 0.....tens ideia pq?

    abraço!
    Gabriel

    ResponderExcluir
  2. Gabriel,

    Se o v_request_id retornou 0 é sinal q não rodou o concurrent, na maioria das vezes é algum problema de parametro... revise os parametros passados para a API 'fnd_request.submit_request', confirma dentro do aplicativo se a aplicação q vc esta passando é a do concurrent e se o nome do programa esta certo.

    Se estiver tudo certo, me avisa q tentamos buscar o problema de outro jeito.

    Abs,

    ResponderExcluir