Архив

Публикации с меткой ‘concurrent’

Поля STATUS_CODE и PHASE_CODE из FND_CONCURRENT_REQUESTS

14 Октябрь 2013 Нет комментариев

Расшифровка STATUS_CODE и PHASE_CODE из таблицы канкарентов FND_CONCURRENT_REQUESTS

PHASE_CODE:

select  lookup_code
       ,max(decode(LANGUAGE, 'RU',meaning,null )) as meaning_ru
       ,max(decode(LANGUAGE, 'US',meaning,null )) as meaning_us
from apps.FND_LOOKUP_VALUES
where lookup_type = 'CP_PHASE_CODE'
      and VIEW_APPLICATION_ID = 0
group by lookup_code;
LOOKUP_CODE MEANING_RU MEANING_US
R Выполнение Running
P Отложено Pending
I Неактивно Inactive
C Завершено Completed

STATUS_CODE:

select  lookup_code
       ,max(decode(LANGUAGE, 'RU',meaning,null )) as meaning_ru
       ,max(decode(LANGUAGE, 'US',meaning,null )) as meaning_us
from apps.FND_LOOKUP_VALUES
where lookup_type = 'CP_STATUS_CODE'
      and VIEW_APPLICATION_ID = 0
group by lookup_code;
LOOKUP_CODE MEANING_RU MEANING_US
W Пауза Paused
R   Обычное   Normal
U Отключено Disabled
H Заблокирован On Hold
P Запланировано Scheduled
I  Обычное  Normal
D Отменено Cancelled
M Нет диспетчера No Manager
Q Резервный Standby
C Обычный Normal
B Возобновлен Resuming
X Прекращено Terminated
T Прекращение Terminating
A Ожидание Waiting
Z  Ожидание  Waiting
E Ошибка Error
S Приостановлено Suspended
G Предупреждение Warning

 

Читать дальше про “Поля STATUS_CODE и PHASE_CODE из FND_CONCURRENT_REQUESTS” »

OEBS Генерация параметров запуска канкарента

Скрипт генерации параметров запуска канкарента

declare
 p_conc_code VARCHAR2(100) := 'AFBFULDL';
 --
 l_space_num number := 40;
 l_space varchar2(100) := lpad(' ',l_space_num,' ');
 l_appl_code varchar2(50);
 l_conc_prog_rec fnd_concurrent_programs_vl%rowtype;
 
begin
 
 select * into l_conc_prog_rec from fnd_concurrent_programs_vl t
 where concurrent_program_name = p_conc_code;
 
 select application_short_name into l_appl_code
 from fnd_application a where a.application_id = l_conc_prog_rec.application_id;
 
 dbms_output.put_line('-- '||l_conc_prog_rec.USER_CONCURRENT_PROGRAM_NAME);
 dbms_output.put_line('p_req_id := fnd_request.submit_request( application => '''
                      ||l_appl_code ||''',');
 dbms_output.put_line(l_space||'program     => '''||p_conc_code||''',');
 dbms_output.put_line(l_space||'start_time  => null,');
 dbms_output.put_line(l_space||'description => null,');
 dbms_output.put_line(l_space||'sub_request => false,');   
 
 for p in (select max(rownum) over() as max_rownum
                 ,row_number() over(order by column_seq_num) as row_num, t.*
           from fnd_descr_flex_col_usage_vl t
           where descriptive_flexfield_name = '$SRS$.'||p_conc_code
                 and enabled_flag='Y'
           order by column_seq_num)
 loop
   dbms_output.put_line(l_space||rpad('argument'||p.row_num,12,' ')
                     ||'=> null'||case when p.row_num!=p.max_rownum then ',' else ' ' end
                     ||' -- '||'REQUIRED='||p.REQUIRED_FLAG
                     ||' '||nvl(p.description,p.form_left_prompt)
                     ||' ('||p.end_user_column_name||')'
                     || case when p.DEFAULT_VALUE is not null 
                         then ' DEFAULT_VALUE='||p.DEFAULT_VALUE
                        end
                     );
 end loop;
 dbms_output.put_line(lpad(' ',l_space_num-2,' ')||');');  
 
end;

-- Пример вывода
-- Диспетчер масс-обработки файлов
p_req_id := fnd_request.submit_request( application => 'FND',
                                        program     => 'AFBFULDL',
                                        start_time  => null,
                                        description => null,
                                        sub_request => false,
                                        argument1   => null, -- REQUIRED=N Имя файла (File Name)
                                        argument2   => null, -- REQUIRED=N Тип содержимого файла (File Content Type)
                                        argument3   => null, -- REQUIRED=N Имя программы (Program Name)
                                        argument4   => null, -- REQUIRED=N Тег программы (Program Tag)
                                        argument5   => null, -- REQUIRED=N Язык (Language)
                                        argument6   => null, -- REQUIRED=N Формат файла (File Format)
                                        argument7   => null, -- REQUIRED=N Режим (upload/download или upload_help/download_help) (Mode)
                                        argument8   => null, -- REQUIRED=Y Загрузка/выгрузка каталога (Directory)
                                        argument9   => null, -- REQUIRED=N Создание каталога в случае его отсутствия (Create Directory) DEFAULT_VALUE=true
                                        argument10  => null, -- REQUIRED=N Переопределение каталога для выгрузки в случае, если выгружаемый файл является абсолютным (Override Directory) DEFAULT_VALUE=false
                                        argument11  => null, -- REQUIRED=N Конец строки (Line Break)
                                        argument12  => null, -- REQUIRED=N Заголовок (Title)
                                        argument13  => null  -- REQUIRED=N Имя контрольного значения (Target Name)
                                      );

Дополнительный код для запуска параллельной программы

declare 
  p_req_id    number;
  p_user_name varchar2(100) := '!!!USER_NAME';
  --
  l_user_id number;
begin
  select nvl(max(u.user_id),-1) into l_user_id from fnd_user u where u.user_name=p_user_name;
  fnd_global.apps_initialize(l_user_id, 20639, 200); --Диспетчер кредиторов - Кредиторы
 
  execute immediate 'alter session set NLS_LANGUAGE = ''RUSSIAN''';
  execute immediate 'alter session set NLS_DATE_FORMAT = ''DD.MM.YYYY HH24:MI:SS''';

  -- вставить запуск канкарента
  -- ...  
  
  dbms_output.put_line('p_req_id='||p_req_id);                                    
  commit;
end;
-- запрос для просмотра запущенного канкарента
-- select t.completion_text, t.* from APPLSYS.FND_CONCURRENT_REQUESTS t where t.request_id=

Вызов формы FNDRSRUN для запуска канкарента с определенными параметрами

10 Апрель 2012 Нет комментариев

Открытие формы FNDRSRUN с определенным канкарентом и выставленными параметрами:

1) Создаем свою форм функцию XX_FNDRSRUN для доступа к форме FNDRSRUN. (необязательный шаг)

2) Помещаем вызов нашего канкарента в меню Сервис на определенный SPECIAL.

3) Строка для вызова

CONCURRENT_PROGRAM_NAME ="<CODE>"
PROGRAM_APPL_SHORT_NAME="<APPL_CODE>"
CHAR1="<param1:param2:...>"
SUBMIT_ONCE="Y"

В параметр CHAR1 записываем параметры канкарента (value), через двоеточие.

FNDDSRUN Запуск канкарента ОЕБС

Читать дальше про “Вызов формы FNDRSRUN для запуска канкарента с определенными параметрами” »

Форма FNDRSRUN («Вид -> Запросы») — отображение конкретного запроса

16 Март 2012 14 comments

Для отображении формы FNDRSRUN («Вид -> Запросы») с конкретным запросом, используем полезный параметр DODT_REQ_ID.

FNDDSRUN
      fnd_function.execute
      (
        function_name => 'FND_FNDRSRUN'
      , open_flag     => 'Y'
      , session_flag  => 'Y'
      , other_params  => 'MODE="VIEW" DODT_REQ_ID="' || to_char(l_request_id) || '"'
      );

Java Concurrent Program

10 Январь 2012 1 комментарий

Java Concurrent Program
Как создать Java Concurrent Program:

  1. Создать директорию $FND_TOP/java/cp/request (желательное, но не обязательное место)
  2. Скопировать java класс
  3. Скомпилировать java класс
  4. Регистрируем Concurrent Program Executable
    • Метод выполнения: Параллельная программа JAVA
    • Имя исполняемого файла указываем без формата файла
  5. Регистрируем Concurrent Program
    • Поле формат = Текст
    • Для параметров заполняем также идентификаторы (token)

Шаблон java класса

================= Template.java===========================
package oracle.apps.fnd.cp.request;
// Change the package name to the required one.
// import all the other required classes/packages.

import oracle.apps.fnd.util.*;
import oracle.apps.fnd.cp.request.*;

// Change the name of the class from Template to your concurrent program
// class name
public class Template implements JavaConcurrentProgram
{
/** Optionally provide class constructor without any arguments.
* If you provide any arguments to the class constructor then while
* running the program will fail.
*/

public void runProgram(CpContext pCpContext)
{
  ReqCompletion lRC = pCpContext.getReqCompletion();
  String CompletionText = "";

  /* Code your program logic here.
  * Use getJDBCConnection method to get the connection object for any
  * JDBC operations.
  * Use CpContext provided commit,rollback methods to commit/rollback
  * data base transactions.
  * Don't forget to release the connection before returning from this
  * method.
  */

  /* Call setCompletion method to set the request completion status and
  * completion text.
  * Status values are ReqCompletion.NORMAL,ReqCompletion.WARNING,
  * ReqCompletion.ERROR.
  * Use Completion text message of length 240 characters. If it is more
  * than 240 then full string will appear in log file and truncated 240
  * characters will be used as request completion text.
  */
  lRC.setCompletion(ReqCompletion.NORMAL, CompletionText);
}

}
==================End of Template.java===========================

Читать дальше про “Java Concurrent Program” »

Список группы запросов для параллельных программ

10 Январь 2012 Нет комментариев

Простой, но довольно полезный запрос для определения группы запросов параллельной программы.

select  rg.request_group_name
      , rg.description
      , cp.concurrent_program_name
      , cp.user_concurrent_program_name
  from fnd_request_group_units    rgu
     , fnd_concurrent_programs_vl cp
     , fnd_request_groups         rg
 where 1=1
       -- rg
       and rg.request_group_id=rgu.request_group_id
       -- cp
       and cp.concurrent_program_id=rgu.request_unit_id
       and cp.application_id=rgu.unit_application_id
       and cp.concurrent_program_name like 'XX%'
order by rg.request_group_name, cp.concurrent_program_name

HOST BASED CONCURRENT PROGRAM

26 Декабрь 2011 1 комментарий

Как создать concurrent основаный на sh скрипте:

  1. Создаем скрипт, расширение файла указываем .prog
  2. Скрипт должен находиться в директории $XX_TOP/bin
  3. Выставляем права на выполнение для файла скрипта
  4. Создаём ссылку fndcpesr: ln -s $FND_TOP/bin/fndcpesr $XX_TOP/bin/filename.
    Название скрипта указываем без расширения
  5. Регистрируем Concurrent Program Executable
  6. Регистрируем Concurrent Program
  7. Добавляем в полномочия
  8. Возможно, надо будет перегрузить concurrent manager:
    $ADMIN_SCRIPTS_HOME/adcmctl.sh stop apps/apps
    $ADMIN_SCRIPTS_HOME/adcmctl.sh start apps/apps

Первые 4 параметра передаваемые в скрипт, служебные:

#!/bin/sh
 p_orauser_pwd=${1}
 p_user_id=${2}
 p_user_name=${3}
 p_request_id=${4}

 echo "p_orauser_pwd=${p_orauser_pwd}"
 echo "p_user_id=${p_user_id}"
 echo "p_user_name=${p_user_name}"
 echo "p_request_id=${p_request_id}"

 ...

Ссылка на metalink: How To Setup A Custom Concurrent Host Program [ID 147455.1]

Как посмотреть OPP service log

При выполнении concurrent request в Oracle E-business suite, который строится с использованием XML Publisher, можно столкнуться с тем что concurrent завершается со статусом Warning.

В логе будет следующая запись:

+————- 1) PUBLISH ————-+
Запуск заключительной обработки запроса 565518 в узле PART4: 03-НОЯ-2011 10:37:15.
Ошибка заключительной обработки запроса 565518: 03-НОЯ-2011 10:37:15. Сообщение об ошибке:
One or more post-processing actions failed. Consult the OPP service log for details.
+—————————————+

Эта запись говорит о том, что по каким-то причинам не смог прицепиться шаблон отчета.

Читать дальше про “Как посмотреть OPP service log” »

Просмотр лога и xml для concurrent`а

Для удобного доступа к логу и xml канкарента, можно использовать следующий запрос

SELECT get_log_bfile('l' || x.request_id || '.req') as log_date,
       get_xml_bfile('o' || x.request_id || '.out') as xml_date
FROM fnd_concurrent_requests x
WHERE x.request_id = :p_request_id

Но перед его использованием следует создать директории для доступа к файлам:

create or replace directory CUNCURRENT_XML
 as '/oracle/NAME_INSTANCE/inst/apps/NAME/logs/appl/conc/out';
create or replace directory CUNCURRENT_LOG
 as '/oracle/NAME_INSTANCE/inst/apps/NAME/logs/appl/conc/log';


и сами функции

create or replace function get_log_bfile(p_filename in varchar2) 
 return bfile as
l_bfile bfile := bfilename('CUNCURRENT_LOG',p_filename);
begin
    return l_bfile;
end;
/
create or replace function get_xml_bfile(p_filename in varchar2 ) 
 return bfile as
  l_bfile bfile := bfilename('CUNCURRENT_XML',p_filename);
begin
    return l_bfile;
end;
/

Вывод сообщения в лог (для concurrent)

24 Март 2010 2 comments
-- Вывод сообщения в лог
procedure output_log_data(p_log_str in varchar2) is
    g_output_dbms    number := 1; -- Вывод сообщений в dbms_output.put_line
    g_output_oebs    number := 2; -- Вывод сообщений в fnd_file.put_line
    v_output_current number := g_output_oebs;
begin
    if fnd_global.conc_request_id = -1 then
      v_output_current := g_output_dbms;
    end if;
    if v_output_current = g_output_dbms then
      dbms_output.put_line(p_log_str);
    elsif v_output_current = g_output_oebs then
    --fnd_file.put_line(fnd_file.output, p_log_str); --Строка выводится в "Просмотр Результатов"
      fnd_file.put_line(fnd_file.log, p_log_str); --Строка выводится в "Просмотр Журнала"
    end if;
end output_log_data;