Главная > API, Oracle e-Business Suite, SQL > OEBS API Параллельные программы — отправка, ожидание, скрытый режим


OEBS API Параллельные программы — отправка, ожидание, скрытый режим

OEBS API Запуск параллельной программы

declare
  l_request_id NUMBER;
  --
  p_app_name     VARCHAR2(100);
  p_request_name VARCHAR2(100);
begin
  l_request_id:=apps.fnd_request.submit_request
                         (application => p_app_name     -- код приложения
                         ,program     => p_request_name -- код параллельной программы
                         ,description => NULL           -- описание
                         ,start_time  => NULL           -- когда запустить программу
                         ,sub_request => FALSE          -- признак дочерней программы
                         ,argument1   => 1              -- параметр параллельной программы
                         -- ...
                         --,argument100 =>
                         );
  COMMIT;
  if l_request_id = 0 then
    --write_log('При отправке запроса произошла ошибка');
    raise fnd_api.g_exc_error;
  end if;                                               
end;

Если,
start_time = NULL, то запуск происходит сразу.
start_time = fnd_date.date_to_canonical(sysdate + (1/26/60)*5) — запуск через 5 минут

OEBS API Запуск дочерней параллельной программы

declare
  l_request_id NUMBER;
  l_req_data VARCHAR2(240) := NULL;
  --
  p_app_name     VARCHAR2(100);
  p_request_name VARCHAR2(100);  
begin
  l_req_data := fnd_conc_global.request_data;

  IF (l_req_data IS NULL) THEN --1й запуск
    l_request_id:=apps.fnd_request.submit_request
                           (application => p_app_name     -- код приложения
                           ,program     => p_request_name -- код параллельной программы
                           ,description => NULL          -- описание
                           ,start_time  => NULL          -- когда запустить программу
                           ,sub_request => TRUE          -- признак дочерней программы
                           ,argument1   => 1             -- параметр параллельной программы
                           -- ...
                           --,argument100 =>
                           );
    COMMIT;
    if l_request_id = 0 then
      --write_log('При отправке запроса произошла ошибка');
      raise fnd_api.g_exc_error;
    end if;        

    -- finish waiting for complete child concurents
    fnd_conc_global.set_req_globals(conc_status  => 'PAUSED', request_data => '1');
  ELSE
    NULL; -- действия после отработки дочернего канкарента
  END IF;
end;

OEBS API Ожидание выполнения параллельной программы

-- --------------------------------------------------- -- Ожидание завершения канкарента -- --------------------------------------------------- function wait_concur(p_req_id IN NUMBER ,x_msg OUT VARCHAR2 ) return boolean is l_req_id NUMBER := p_req_id; l_bool BOOLEAN; -- l_phase VARCHAR2(1000); l_status VARCHAR2(1000); l_dev_phase VARCHAR2(1000); l_dev_status VARCHAR2(1000); l_message VARCHAR2(1000); begin if (p_req_id is null) then x_msg := 'p_req_id is null'; return false; end if; loop l_bool := fnd_concurrent.wait_for_request( request_id => l_req_id ,INTERVAL => 5 ,max_wait => 0 ,phase => l_phase ,status => l_status ,dev_phase => l_dev_phase ,dev_status => l_dev_status ,MESSAGE => l_message); IF NOT (l_bool AND l_dev_phase = 'COMPLETE' AND l_dev_status = 'NORMAL') THEN write_log('Параллельный запрос ' || l_req_id ||' завершился с ошибкой: ' || l_message); x_msg := l_message; return false; ELSIF (l_bool AND l_dev_phase = 'COMPLETE') THEN EXIT; END IF; end loop; -- ждем завершения детей FOR ch IN (SELECT a.request_id FROM fnd_concurrent_requests a WHERE a.parent_request_id = l_req_id ) LOOP LOOP -- при необходимости, можно сделать рекурсию l_bool := fnd_concurrent.wait_for_request( request_id => ch.request_id ,INTERVAL => 5 ,max_wait => 0 ,phase => l_phase ,status => l_status ,dev_phase => l_dev_phase ,dev_status => l_dev_status ,MESSAGE => l_message); IF NOT (l_bool AND upper(l_dev_phase) = 'COMPLETE' AND l_dev_status = 'NORMAL') THEN write_log('Параллельный запрос ' || ch.request_id ||' завершился с ошибкой: ' || l_message); x_msg := l_message; return false; ELSIF (l_bool AND upper(l_dev_phase) = 'COMPLETE') THEN EXIT; END IF; END LOOP; END LOOP; if (NVL(l_dev_status, 'ERROR') not in ('NORMAL', 'WARNING')) then x_msg := 'Ошибка выполнения параллельного запроса'; return false; end if; return true; end;

OEBS API Запуск параллельной программы в скрытом режиме

-- перед запуском канкарента IF NOT fnd_request.set_options (implicit => 'YES') THEN -- write_log('fnd_request.set_options error'); raise fnd_api.g_exc_error; END IF; -- запуск канкарента

OEBS API Применение шаблона к параллельной программе

-- перед запуском канкарента if NOT fnd_request.add_layout(template_appl_name => l_appl_code, template_code => l_template_code, template_language => 'ru', template_territory => '00', output_format => 'EXCEL' ) then --write_log('Не удалось применить шаблон '||l_template_code); raise fnd_api.g_exc_error; end if; -- запуск канкарента

OEBS API Отмена параллельной программы

-- просмотр select t.concurrent_program_id ,(select p.concurrent_program_name from FND_CONCURRENT_PROGRAMS p where p.concurrent_program_id = t.concurrent_program_id and p.application_id= t.program_application_id ) as concurrent_program_name ,(select u.user_name from fnd_user u where u.user_id = t.requested_by ) as user_name ,t.requested_by ,t.priority --,t.* from FND_CONCURRENT_REQUESTS t where STATUS_CODE in ('I','Q') and PHASE_CODE='P' order by t.priority; -- отмена update FND_CONCURRENT_REQUESTS set STATUS_CODE='T' , PHASE_CODE='C' where STATUS_CODE in ('I','Q') and PHASE_CODE='P' and concurrent_program_id = :ID;

OEBS API Подмена выходного файла параллельной программы

-- подменяем выходной файл основной параллельной программы на тот файл, -- который сформировался при работе дочерней программы UPDATE fnd_concurrent_requests SET (outfile_name, outfile_node_name, ofile_size, output_file_type ) = (SELECT outfile_name, outfile_node_name, ofile_size, output_file_type FROM fnd_concurrent_requests WHERE request_id = ln_api_request_id) WHERE request_id = fnd_global.conc_request_id; -- Прямая ссылка на файл (outfile_name) substr(outfile_name,1, instr(outfile_name,'/',-1)) ||P_PROGRAM_CODE||'_'||request_id||'_1.EXCEL'

Похожие записи:

  1. Денис
  2. Vladislav
    11 Январь 2016 в 19:01 | #2

    Подскажите, как запустить два канкарента параллельно друг другу и отслеживать их (и только их) через FNDRSRUN (эта форма в параметрах поддерживает только один request_id / DODT_REQ_ID)

  3. 25 Январь 2016 в 20:08 | #3

    @Vladislav
    на этой форме стандартную такую возможность не нашел.

  4. DeemSan
    12 Декабрь 2017 в 12:33 | #4

    Прямой update fnd_concurrent_requests — не есть гуд. Можно воспользоваться процедурой fnd_cp_opp_req.adjust_outfile, правда, нужно учитывать, что это не Public API

  5. 18 Декабрь 2017 в 14:11 | #5

    @DeemSan
    О, интересная АПИ, спасибо

  6. Андрей
    26 Октябрь 2020 в 10:57 | #6

    Привет. Вопрос возник по параметрам параллельной программы.
    Допустим есть параметр, к которому привязан набор на базе таблицы. Он возвращает дубли. Как то можно эти дубли убрать? Например ID — PERSON_ID, значение — PERSON_NAME… Я пробывал писать так distinct person_id в параметре ID. И действительно при выборке дубли пропали… но когда отправляешь на выполнение — валится ошибка — person_id = distinct person_id…. и все.
    :(

  1. Пока что нет уведомлений.