- Запуск параллельной программы
- Запуск дочерней параллельной программы
- Ожидание выполнения параллельной программы
- Запуск параллельной программы в скрытом режиме
- Применение шаблона к параллельной программе
- Отмена параллельной программы
- Подмена выходного файла параллельной программы
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'
Добрый день.
а как победить «no manager» для дочернего запроса при FND_CONCURRENT.WAIT_FOR_REQUEST описанный здесь
https://support.oracle.com/epmos/faces/CommunityDisplay?resultUrl=https%3A%2F%2Fcommunity.oracle.com%2Fthread%2F3584219&_afrLoop=286764440741965&resultTitle=fnd_request.submit_request%2C+when+we+use+sub_request+TRUE%2C+how+can+we+capture+the+Completion+Status+of+Sub+Request+%28Child+Concurrent+Program%29+and+accordingly+set+Parent+Program+Completion+Status&commId=3584219&displayIndex=2&_afrWindowMode=0&_adf.ctrl-state=ii6ycgt0s_272
Подскажите, как запустить два канкарента параллельно друг другу и отслеживать их (и только их) через FNDRSRUN (эта форма в параметрах поддерживает только один request_id / DODT_REQ_ID)
@Vladislav
на этой форме стандартную такую возможность не нашел.
Прямой update fnd_concurrent_requests — не есть гуд. Можно воспользоваться процедурой fnd_cp_opp_req.adjust_outfile, правда, нужно учитывать, что это не Public API
@DeemSan
О, интересная АПИ, спасибо
Привет. Вопрос возник по параметрам параллельной программы.
Допустим есть параметр, к которому привязан набор на базе таблицы. Он возвращает дубли. Как то можно эти дубли убрать? Например ID — PERSON_ID, значение — PERSON_NAME… Я пробывал писать так distinct person_id в параметре ID. И действительно при выборке дубли пропали… но когда отправляешь на выполнение — валится ошибка — person_id = distinct person_id…. и все.
:(