Архив

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

Скрипт вывода полей для XML шаблона данных на основе таблицы

28 Октябрь 2014 Нет комментариев

Скрипт вывода столбцов таблицы в XML шаблон данных( BI Publisher Data Template )

declare
  p_table_owner varchar2(30) := 'APPLSYS';
  p_table_name  varchar2(30) := 'FND_USER';
begin
  for i_cur in (
                  select t.column_name
                        ,t.data_type
                        ,max(length(t.column_name)) over() 
                         - length(t.column_name) as cur_gap_length
                  from all_tab_columns t
                  where 1=1
                        and t.owner = p_table_owner
                        and t.table_name = p_table_name
                  order by t.column_id
                )
   loop
     dbms_output.put_line('<element name="' ||i_cur.column_name
                          ||'"'||rpad(' ',i_cur.cur_gap_length)||' value="'||i_cur.column_name
                          ||'" />');
   end loop;
end;

-- Пример вывода
<element name="USER_ID"                       value="USER_ID" />
<element name="USER_NAME"                     value="USER_NAME" />
<element name="LAST_UPDATE_DATE"              value="LAST_UPDATE_DATE" />
<element name="LAST_UPDATED_BY"               value="LAST_UPDATED_BY" />
<element name="CREATION_DATE"                 value="CREATION_DATE" />
<element name="CREATED_BY"                    value="CREATED_BY" />
<element name="LAST_UPDATE_LOGIN"             value="LAST_UPDATE_LOGIN" />
<element name="ENCRYPTED_FOUNDATION_PASSWORD" value="ENCRYPTED_FOUNDATION_PASSWORD" />
<element name="ENCRYPTED_USER_PASSWORD"       value="ENCRYPTED_USER_PASSWORD" />
<element name="SESSION_NUMBER"                value="SESSION_NUMBER" />
<element name="START_DATE"                    value="START_DATE" />
<element name="END_DATE"                      value="END_DATE" />
<element name="DESCRIPTION"                   value="DESCRIPTION" />
<element name="LAST_LOGON_DATE"               value="LAST_LOGON_DATE" />
<element name="PASSWORD_DATE"                 value="PASSWORD_DATE" />
<element name="PASSWORD_ACCESSES_LEFT"        value="PASSWORD_ACCESSES_LEFT" />
<element name="PASSWORD_LIFESPAN_ACCESSES"    value="PASSWORD_LIFESPAN_ACCESSES" />
<element name="PASSWORD_LIFESPAN_DAYS"        value="PASSWORD_LIFESPAN_DAYS" />
<element name="EMPLOYEE_ID"                   value="EMPLOYEE_ID" />
<element name="EMAIL_ADDRESS"                 value="EMAIL_ADDRESS" />
<element name="FAX"                           value="FAX" />
<element name="CUSTOMER_ID"                   value="CUSTOMER_ID" />
<element name="SUPPLIER_ID"                   value="SUPPLIER_ID" />
<element name="WEB_PASSWORD"                  value="WEB_PASSWORD" />
<element name="USER_GUID"                     value="USER_GUID" />
<element name="GCN_CODE_COMBINATION_ID"       value="GCN_CODE_COMBINATION_ID" />
<element name="PERSON_PARTY_ID"               value="PERSON_PARTY_ID" />     

Скрипт обновления параметров профиля

28 Апрель 2014 Нет комментариев

Скрипт обновления параметров профиля. В данном примере изменяется поле SQL_VALIDATION.

declare
  l_sql VARCHAR2(4000);
begin
           
  l_sql := 'SQL="SELECT LOOKUP_CODE, MEANING \"Включить проверку\"
            INTO :PROFILE_OPTION_VALUE, :VISIBLE_OPTION_VALUE
            FROM FND_LOOKUP_VALUES_VL
            WHERE LOOKUP_TYPE = ''!!!LOOKUP_NAME''
                  AND ENABLED_FLAG = ''Y''
                  AND SYSDATE BETWEEN NVL(START_DATE_ACTIVE,SYSDATE)
                      AND NVL(END_DATE_ACTIVE,SYSDATE)
            ORDER BY MEANING"
            COLUMN="\"Включить проверку\"(20)"';

  for i in (select profile_option_name
                 , user_profile_option_name
                 , start_date_active
                 , end_date_active
                 , user_changeable_flag
                 , user_visible_flag
                 , read_allowed_flag
                 , write_allowed_flag
                 , site_enabled_flag
                 , site_update_allowed_flag
                 , app_enabled_flag
                 , app_update_allowed_flag
                 , resp_enabled_flag
                 , resp_update_allowed_flag
                 , user_enabled_flag
                 , user_update_allowed_flag
                 , (select a.application_short_name 
                    from fnd_application a 
                    where a.application_id = t.application_id
                    ) as appl_short_name
            from fnd_profile_options_vl t
            where profile_option_name like '!!!%'
          )
  loop
   dbms_output.put_line('update '||i.profile_option_name);
   fnd_profile_options_pkg.load_row (
                   x_profile_name             => i.profile_option_name,
                   x_owner                    => '!!!XX',
                   x_application_short_name   => i.appl_short_name,
                   x_user_profile_option_name => i.user_profile_option_name,
                   x_description              => i.user_profile_option_name,
                   x_user_changeable_flag     => i.user_changeable_flag,
                   x_user_visible_flag        => i.user_visible_flag,
                   x_read_allowed_flag        => i.read_allowed_flag,
                   x_write_allowed_flag       => i.write_allowed_flag,
                   x_site_enabled_flag        => i.site_update_allowed_flag,
                   x_site_update_allowed_flag => i.site_update_allowed_flag,
                   x_app_enabled_flag         => i.app_enabled_flag,
                   x_app_update_allowed_flag  => i.app_update_allowed_flag,
                   x_resp_enabled_flag        => i.resp_enabled_flag,
                   x_resp_update_allowed_flag => i.resp_update_allowed_flag,
                   x_user_enabled_flag        => i.user_enabled_flag,
                   x_user_update_allowed_flag => i.user_update_allowed_flag,
                   x_start_date_active        => to_char(i.start_date_active,'YYYY/MM/DD'),
                   x_end_date_active          => to_char(i.end_date_active,'YYYY/MM/DD'),
                   x_sql_validation           => l_sql
                                    );
    dbms_output.put_line('done');
  end loop;
  
end;

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=

Oracle Создание PARTITION BY RANGE по полю DATE

21 Ноябрь 2012 1 комментарий

Скрипт помогающий создать PARTITION BY RANGE по полю DATE

SET LINESIZE 150
SET SERVEROUTPUT ON SIZE 1000000
WHENEVER SQLERROR CONTINUE
SPOOL C:\create_partition_date.log
declare
 iter number;
 l_date_start date := to_date('01-11-2011','dd-mm-yyyy');
 l_date_end   date := to_date('01-01-2023','dd-mm-yyyy');
 l_name_part  varchar2(20) := 'TEST';
 l_part_field varchar2(20) := 'MY_DATE';
begin
 dbms_output.put_line('PARTITION BY RANGE('||l_part_field||')');
 dbms_output.put_line('(');
 dbms_output.put_line(' PARTITION '||l_name_part
                        ||'_MIN     VALUES LESS THAN (to_date('''
                        ||to_char(add_months(l_date_start,-1),'dd-mm-yyyy')
                        ||''',''dd-mm-yyyy''))');
 for j in (
              with t as (
              select l_date_start d1,
                     l_date_end d2
              from dual
            )
            --
            select decode(level,1,d1,
                          trunc(add_months(d1,level-1),'mm')
                         ) as date_from
            from t
            connect by add_months(trunc(d1,'mm'),level-1) <= d2
           ) 
 loop
   dbms_output.put_line(',PARTITION '||l_name_part||'_'
                        ||to_char(add_months(j.date_from,-1),'mm_yyyy')
                        ||' VALUES LESS THAN (to_date('''
                        ||to_char(j.date_from,'dd-mm-yyyy')
                        ||''',''dd-mm-yyyy''))');
 end loop;
 dbms_output.put_line(',PARTITION '||l_name_part
                      ||'_MAX     VALUES LESS THAN (MAXVALUE)'); 
 dbms_output.put_line(')');
end;
/
spool off

PARTITION BY RANGE(MY_DATE)
(
 PARTITION TEST_MIN     VALUES LESS THAN (to_date('01-10-2011','dd-mm-yyyy'))
,PARTITION TEST_10_2011 VALUES LESS THAN (to_date('01-11-2011','dd-mm-yyyy'))
,PARTITION TEST_11_2011 VALUES LESS THAN (to_date('01-12-2011','dd-mm-yyyy'))
...
,PARTITION TEST_11_2022 VALUES LESS THAN (to_date('01-12-2022','dd-mm-yyyy'))
,PARTITION TEST_12_2022 VALUES LESS THAN (to_date('01-01-2023','dd-mm-yyyy'))
,PARTITION TEST_MAX     VALUES LESS THAN (MAXVALUE)
)
 
PL/SQL procedure successfully completed
SQL> spool off
Stopped spooling to C:\create_partition_date.log

OEBS Меню полномочий — Избранное (Top Ten List)

15 Октябрь 2012 Нет комментариев

Для добавления функций в избранное по полномочиям — API:FND_SIGNON.UPDATE_NAVIGATOR


Читать дальше про “OEBS Меню полномочий — Избранное (Top Ten List)” »

Ant при разработке с использованием OAF

24 Апрель 2012 3 comments

При разработке проектов с использованием OAF и JDeveloper возникла необходимость частого переноса (или развертывания — deploy) приложений с одного экземпляра системы на другой.

Операция переноса состоит из пяти шагов:

  1. Компиляция java классов
  2. Перенос java классов на сервер приложений (в каталог $JAVA_TOP)
  3. Перенос xml файлов Entity Objects, View Objects, Application Modules ($JAVA_TOP)
  4. Импорт xml файлов Pages, Regions с помощью утилиты import
  5. Импорт xliff файлов

Проделав эту операцию пару раз вручную, решил все это дело автоматизировать.
Вся автоматизация построена на известном продукте Apache Ant.

Состоит из четырех файлов

  1. <project>.bat
  2. <project>.xml
  3. build.xml
  4. <project>.properties

, где <project> имя Вашего проекта.

Читать дальше про “Ant при разработке с использованием OAF” »

ОЕБС Расширенный скрипт инициализации сессиии

6 Апрель 2012 3 comments

ОЕБС Инициализация сессии
ОЕБС Расширенный скрипт для инициализации сессии:

  • Выводит в output короткую запись для инициализации.
  • Если не заданы полномочия или приложение, то выводит в output список назначенных пользователю полномочий.
declare
 l_lang           varchar2(2)   := 'RU';
 l_user_name      varchar2(100) := 'AOSTAPISHEN';
 l_resp_name      varchar2(400);
 l_resp_appl_name varchar2(400);
 -- ------------------------------------------------------------------
 l_user_id        NUMBER;
 l_resp_id        NUMBER;
 l_resp_appl_id   NUMBER;
 l_appl_code      VARCHAR2(10);
 l_org_id         NUMBER;
 l_mo_sec_profile NUMBER;
 l_mo_product     number;
begin
 
 -- l_resp_name := 'Управление активами предприятия';
 -- l_resp_name := 'Диспетчер Дебиторов';
 -- l_resp_name := 'Разработчик приложений';
 -- l_resp_name := 'Движение денежных средств: суперпользователь';
 
 -- l_resp_appl_name := 'Управление активами предприятия';
 -- l_resp_appl_name := 'Главная книга';
 -- l_resp_appl_name := 'Дебиторы'
 -- l_resp_appl_name := 'Кредиторы';
 -- l_resp_appl_name := 'Движение денежных средств';
 -- l_resp_appl_name := 'Библиотека объектов приложений';
 
   select user_id into l_user_id from fnd_user t where user_name like l_user_name; 
 
   if (l_resp_name is null or l_resp_appl_name is null) then
 
     for i in (
                 SELECT ap.application_short_name as appl_code,
                        a.application_name        as appl_name,
                        r.responsibility_name     as resp_name,
                        r0.responsibility_key,
                        --
                        max(length(a.application_name )) over() as length_appl_name
                  FROM fnd_user u,
                       fnd_user_resp_groups g,
                       fnd_application_tl a,
                       fnd_responsibility_tl r,
                       fnd_responsibility    r0,
                       fnd_application       ap
                 WHERE g.user_id(+) = u.user_id
                   AND g.responsibility_application_id = a.application_id
                   AND a.application_id = r.application_id
                   AND g.responsibility_id = r.responsibility_id
                   and a.language = l_lang
                   and ap.application_id = a.application_id
                   and r.language = l_lang
                   and u.user_name = l_user_name
                   and r.responsibility_name <> 'Диагностика приложения'
                   and r.responsibility_name = nvl(l_resp_name,r.responsibility_name)
                   and a.application_name = nvl(l_resp_appl_name,a.application_name)
                   and r0.responsibility_id = r.responsibility_id
 
                 ORDER BY appl_name, resp_name
               )
     loop
       dbms_output.put_line(rpad('l_resp_appl_name := '''||i.appl_name||'''',i.length_appl_name+22,' ') || ' ; l_resp_name := '''||i.resp_name||''';');
       dbms_output.put_line(rpad('appl_code := '''||i.appl_code||'''',i.length_appl_name+22,' ') || ' ; responsibility_key := '''||i.responsibility_key||''';');
     end loop;
 
   else
  
     select b.application_id, b.application_short_name into l_resp_appl_id, l_appl_code
     from fnd_application_tl t
         ,fnd_application    b
     where 1=1
           and t.application_name like l_resp_appl_name
           and t.language = l_lang
           and b.application_id = t.application_id;
            
     select t.responsibility_id into l_resp_id from fnd_responsibility_tl t 
     where t.responsibility_name like l_resp_name and t.language = l_lang and t.application_id = l_resp_appl_id;
 
     l_org_id := fnd_profile.VALUE_SPECIFIC(NAME => 'ORG_ID', RESPONSIBILITY_ID => l_resp_id, APPLICATION_ID=> l_resp_appl_id);
 
     fnd_global.apps_initialize( user_id      => l_user_id,
                                 resp_id      => l_resp_id,
                                 resp_appl_id => l_resp_appl_id
                               );
                               
     SELECT count(1) into l_mo_product FROM fnd_mo_product_init mpi where mpi.application_short_name = l_appl_code and nvl(mpi.status, 'N') = 'Y';                             
     
     if (l_mo_product = 1) then
       begin
         MO_GLOBAL.init(l_appl_code);
   
         if (l_org_id is not null) then
           mo_global.set_policy_context('M',l_org_id);
         end if;
   
         l_mo_sec_profile := fnd_profile.value('XLA_MO_SECURITY_PROFILE_LEVEL');
   
         mo_global.set_org_context(l_resp_id,l_mo_sec_profile,l_appl_code);
       exception
         when others then
           dbms_output.put_line('SQLERRM:'||SQLERRM||chr(10));
           dbms_output.put_line('FORMAT_ERROR_BACKTRACE:'||chr(10)||dbms_utility.format_error_backtrace);
       end;
 
       dbms_output.put_line('begin'||chr(10)||' fnd_global.apps_initialize('||l_user_id||', '||l_resp_id||', '||l_resp_appl_id||'); --'||l_resp_name||' - '||l_resp_appl_name
                            ||chr(10)||' mo_global.init('''|| l_appl_code||''');'
                            ||case when l_org_id is not null then chr(10)||' mo_global.set_policy_context(''M'','||l_org_id||');' end
                            ||chr(10)||' mo_global.set_org_context('||l_resp_id||', '||l_mo_sec_profile||', '''||l_appl_code||''');'
                            ||chr(10)||'end;');
     else
       dbms_output.put_line('begin'||chr(10)||' fnd_global.apps_initialize('||l_user_id||', '||l_resp_id||', '||l_resp_appl_id||'); --'||l_resp_name||' - '||l_resp_appl_name
                            ||chr(10)||'end;');       
     end if;                            
   end if;
end;

Скрипт для создания профиля

Скрипт для создания профиля в OEBS:

DECLARE
  vr_Profile_name VARCHAR2(100) := 'PROFILE_CODE!!';
BEGIN
  fnd_profile_options_pkg.load_row
  (
    x_profile_name              => vr_Profile_name
  , x_owner                     => 'INITIAL SETUP'
  , x_application_short_name    => 'APPL_CODE!!'
  , x_user_profile_option_name  => 'PROFILE_NAME!!'
  , x_description               => 'PROFILE_NAME!!'
  , x_user_changeable_flag      => 'Y'
  , x_user_visible_flag         => 'Y'
  , x_read_allowed_flag         => 'Y'
  , x_write_allowed_flag        => 'Y'
  , x_site_enabled_flag         => 'Y'
  , x_site_update_allowed_flag  => 'Y'
  , x_app_enabled_flag          => 'Y'
  , x_app_update_allowed_flag   => 'Y'
  , x_resp_enabled_flag         => 'Y'
  , x_resp_update_allowed_flag  => 'Y'
  , x_user_enabled_flag         => 'Y'
  , x_user_update_allowed_flag  => 'Y'
  , x_start_date_active         => to_char(sysdate,'yyyy/mm/dd')
  , x_end_date_active           => NULL
  , x_sql_validation            => 'SQL="SELECT LOOKUP_CODE, MEANING \"Включить проверку\"
INTO :PROFILE_OPTION_VALUE, :VISIBLE_OPTION_VALUE
FROM FND_LOOKUPS
WHERE LOOKUP_TYPE = ''YES_NO''"
COLUMN="\"Включить проверку\"(20)"'
  );
  --
  IF NOT 
    fnd_profile.save
    (
      x_name           => vr_Profile_name
    , x_value          => 'Y'
    , x_level_name     => 'SITE' 
    )
  THEN
    DBMS_OUTPUT.Put_Line('Error in setting value');
  END IF;
  COMMIT;
END;

Скрипт копирования меню

27 Февраль 2012 Нет комментариев

Скрипт для копирования меню. В случае, если меню уже существует, то добавляются отсутствуюшие пункты меню.

DECLARE
 l_original_menu_name VARCHAR2(150) := 'MENU_NAME!!!';
 l_new_menu_name      VARCHAR2(150) := 'NEW_MENU_NAME!!!';
 l_new_user_menu_name VARCHAR2(400) := 'Описание меню!!!';
 --
 l_flag_exist_menu NUMBER := 0;
 l_new_menu_id     NUMBER;
 l_last_menu_id    NUMBER;
 l_row_id          VARCHAR2(100);
 l_descr           VARCHAR2(400);
 --
 l_req_status      VARCHAR2(1);
BEGIN
  
  -- получаем ID оригинального меню
  SELECT max(menu_id) into l_last_menu_id 
  FROM fnd_menus_vl where menu_name = l_original_menu_name;
  
  if (l_last_menu_id is null) then
    dbms_output.put_line('Не найдено оригинальное меню');
    return;
  else
    dbms_output.put_line('Original menu_id='||l_last_menu_id);    
  end if;
  
  -- =====================================================
  -- проверка на существование нового меню
  -- =====================================================
  SELECT max(menu_id) into l_new_menu_id FROM fnd_menus_vl
  where menu_name = l_new_menu_name;
  
  if (l_new_menu_id is not null) then
    l_flag_exist_menu := 1; -- меню уже существует
    dbms_output.put_line('Меню уже существует');
  else
    -- создаем новое меню
    l_new_menu_id := fnd_menus_s.nextval;
    
    FND_MENUS_PKG.INSERT_ROW(
        X_ROWID             => l_row_id,
        X_MENU_ID           => l_new_menu_id,
        X_MENU_NAME         => l_new_menu_name,
        X_USER_MENU_NAME    => l_new_user_menu_name,
        X_MENU_TYPE         => null,
        X_DESCRIPTION       => null,
        X_CREATION_DATE     => sysdate,
        X_CREATED_BY        => fnd_global.user_id,
        X_LAST_UPDATE_DATE  => sysdate,
        X_LAST_UPDATED_BY   => fnd_global.user_id,
        X_LAST_UPDATE_LOGIN => fnd_global.login_id);    
    dbms_output.put_line('Создали меню: '||l_new_menu_name);
    dbms_output.put_line('  menu_id: '||l_new_menu_id);
  end if;
  
  -- =====================================================  
  -- Создание пунктов меню
  -- =====================================================  
  for i in (select t.* from fnd_menu_entries_vl t where t.menu_id = l_last_menu_id)
  loop
    
    -- проверка на существование пункта меню
    select nvl(max(1),0) into l_flag_exist_menu
    from fnd_menu_entries t
    where t.menu_id = l_new_menu_id 
          and ( (i.sub_menu_id is null and t.sub_menu_id is null) or t.sub_menu_id = i.sub_menu_id)
          and ( (i.function_id is null and t.function_id is null) or t.function_id = i.function_id)
          and 1=1;

    -- создаем только новые пункты меню
    if (l_flag_exist_menu = 0) then
      FND_MENU_ENTRIES_PKG.INSERT_ROW(
       X_ROWID             => l_row_id,
       X_MENU_ID           => l_new_menu_id,
       X_ENTRY_SEQUENCE    => FND_MENUS_PKG.NEXT_ENTRY_SEQUENCE(), --i.entry_sequence,
       X_SUB_MENU_ID       => i.sub_menu_id,
       X_FUNCTION_ID       => i.function_id,
       X_GRANT_FLAG        => i.grant_flag,
       X_PROMPT            => i.prompt,
       X_DESCRIPTION       => i.description,
       X_CREATION_DATE     => sysdate,
       X_CREATED_BY        => fnd_global.user_id,
       X_LAST_UPDATE_DATE  => sysdate,
       X_LAST_UPDATED_BY   => fnd_global.user_id,
       X_LAST_UPDATE_LOGIN => fnd_global.login_id);  
       
       l_descr := 'Создан пункт';
       if (i.prompt is not null) then
         l_descr := l_descr ||' : '|| i.prompt;
       end if;
       if (i.description is not null) then
         l_descr := l_descr ||' : '|| i.description;
       end if;  
       if (i.sub_menu_id is not null) then
         l_descr := l_descr ||' : sub_menu_id='|| i.sub_menu_id;
       end if; 
       if (i.function_id is not null) then
         l_descr := l_descr ||' : function_id='|| i.function_id;
       end if;              
       dbms_output.put_line(l_descr);
    end if;
    
  end loop;   
  
  l_req_status := FND_MENU_ENTRIES_PKG.SUBMIT_COMPILE();
  dbms_output.put_line('SUBMIT_COMPILE='||l_req_status);
  
END;

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]