- Запуск параллельной программы
- Запуск дочерней параллельной программы
- Ожидание выполнения параллельной программы
- Запуск параллельной программы в скрытом режиме
- Применение шаблона к параллельной программе
- Отмена параллельной программы
- Подмена выходного файла параллельной программы
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…. и все.
:(