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

Скрипт для создания профиля в 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;

Форма 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) || '"'
      );

Просмотр всех процедур PL/SQL package

29 Февраль 2012 1 комментарий

Для поиска определенных функций в plsql package можно использовать следующий запрос:

SQL> select object_name,
           procedure_name
    from ALL_PROCEDURES
    where 1=1
          and owner = 'APPS'
          and object_name like 'FND%'
          and object_type = 'PACKAGE'
          and subprogram_id <> 0
          --
          and procedure_name like '%CANONICAL%'
   /
 
OBJECT_NAME                    PROCEDURE_NAME
------------------------------ ------------------------------
FND_DATE                       CANONICAL_TO_DATE
FND_DATE                       DATE_TO_CANONICAL
FND_DATE                       STRING_TO_CANONICAL
FND_NUMBER                     CANONICAL_TO_NUMBER
FND_NUMBER                     NUMBER_TO_CANONICAL
FND_OAM_DSCFG_API_PKG          GET_PROPERTY_CANONICAL_VALUE
FND_OAM_DSCFG_PROPERTIES_PKG   GET_PROPERTY_CANONICAL_VALUE
FND_OAM_DSCFG_UTILS_PKG        BOOLEAN_TO_CANONICAL
FND_OAM_DSCFG_UTILS_PKG        CANONICAL_TO_BOOLEAN
FND_OAM_DSCFG_UTILS_PKG        CANONICAL_TO_DATE
FND_OAM_DSCFG_UTILS_PKG        CANONICAL_TO_NUMBER
FND_OAM_DSCFG_UTILS_PKG        DATE_TO_CANONICAL
FND_OAM_DSCFG_UTILS_PKG        NUMBER_TO_CANONICAL
 
13 rows selected

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

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;

MySave — Plug-in for PL/SQL Developer

15 Февраль 2012 2 comments

В процессе работы постоянно приходится дописывать в файлы пакетов команду «SHOW ERRORS».
Делать это постоянно крайне утомило, да и забывается иногда.
Настройками PL/SQL Developer это сделать не удалось, поэтому попробовал решить данный вопрос написав свой плагин.

Представляю вашему вниманию плагин MySave.

Описание: Сохраняет данные в файл, дописывает в конце «/» и «SHOW ERRORS».
Description: Use this plug-in to save file with ‘SHOW ERRORS’
Requirements: PL/SQL Developer 5.1.2 or newer

Пункт меню:

  • File -> Save with show errors
  • File -> Save with show errors as …

Install Plug-in

1) Download plug-in MySave
2) Run Setup.exe or Do copy file MySave.dll to folder PlugIns

allroundautomations.com

Categories: Others, SQL Tags: , , ,

Просмотр настройки сегментов плана счетов

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

Запрос для просмотра настройки сегментов плана счетов

select sob.name                     Ledger_Name
      ,sob.ledger_id                Ledger_Id
      ,sob.chart_of_accounts_id     coa_id
      ,fifst.id_flex_structure_name struct_name
      ,ifs.segment_name
      ,ifs.application_column_name  column_name
      ,sav1.attribute_value         BALANCING
      ,sav2.attribute_value         COST_CENTER
      ,sav3.attribute_value         NATURAL_ACCOUNT
      ,sav4.attribute_value         INTERCOMPANY
      ,sav5.attribute_value         SECONDARY_TRACKING
      ,sav6.attribute_value         GLOBAL
      ,ffvs.flex_value_set_name
      ,ffvs.flex_value_set_id
  from fnd_id_flex_structures       fifs
      ,fnd_id_flex_structures_tl    fifst
      ,fnd_segment_attribute_values sav1
      ,fnd_segment_attribute_values sav2
      ,fnd_segment_attribute_values sav3
      ,fnd_segment_attribute_values sav4
      ,fnd_segment_attribute_values sav5
      ,fnd_segment_attribute_values sav6
      ,fnd_id_flex_segments         ifs
      ,fnd_flex_value_sets          ffvs
      ,gl_ledgers                   sob
 where 1 = 1
   and fifs.id_flex_code = 'GL#'
   and fifs.application_id = fifst.application_id
   and fifs.id_flex_code = fifst.id_flex_code
   and fifs.id_flex_num = fifst.id_flex_num
   and fifst.language = userenv('LANG')
   and fifs.application_id = ifs.application_id
   and fifs.id_flex_code = ifs.id_flex_code
   and fifs.id_flex_num = ifs.id_flex_num
   and sav1.application_id = ifs.application_id
   and sav1.id_flex_code = ifs.id_flex_code
   and sav1.id_flex_num = ifs.id_flex_num
   and sav1.application_column_name = ifs.application_column_name
   and sav2.application_id = ifs.application_id
   and sav2.id_flex_code = ifs.id_flex_code
   and sav2.id_flex_num = ifs.id_flex_num
   and sav2.application_column_name = ifs.application_column_name
   and sav3.application_id = ifs.application_id
   and sav3.id_flex_code = ifs.id_flex_code
   and sav3.id_flex_num = ifs.id_flex_num
   and sav3.application_column_name = ifs.application_column_name
   and sav4.application_id = ifs.application_id
   and sav4.id_flex_code = ifs.id_flex_code
   and sav4.id_flex_num = ifs.id_flex_num
   and sav4.application_column_name = ifs.application_column_name
   and sav5.application_id = ifs.application_id
   and sav5.id_flex_code = ifs.id_flex_code
   and sav5.id_flex_num = ifs.id_flex_num
   and sav5.application_column_name = ifs.application_column_name
   and sav6.application_id = ifs.application_id
   and sav6.id_flex_code = ifs.id_flex_code
   and sav6.id_flex_num = ifs.id_flex_num
   and sav6.application_column_name = ifs.application_column_name
   and sav1.segment_attribute_type = 'GL_BALANCING'
   and sav2.segment_attribute_type = 'FA_COST_CTR'
   and sav3.segment_attribute_type = 'GL_ACCOUNT'
   and sav4.segment_attribute_type = 'GL_INTERCOMPANY'
   and sav5.segment_attribute_type = 'GL_SECONDARY_TRACKING'
   and sav6.segment_attribute_type = 'GL_GLOBAL'
   and ifs.id_flex_num = sob.chart_of_accounts_id
   and ifs.flex_value_set_id = ffvs.flex_value_set_id
   and sob.ledger_id = nvl(fnd_profile.value('GL_SET_OF_BKS_ID'), sob.ledger_id)
 order by sob.name, sob.chart_of_accounts_id, ifs.application_column_name;

SYS_CONTEXT

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

Стандартная функция SYS_CONTEXT служит для получения атрибутов контекста.
Пример использования SYS_CONTEXT для получения общей информации:

select SYS_CONTEXT('USERENV', 'TERMINAL') terminal
      ,SYS_CONTEXT('USERENV', 'LANGUAGE') language
      ,SYS_CONTEXT('USERENV', 'LANG') lang     
      ,SYS_CONTEXT('USERENV', 'SESSIONID') sessionid
      ,SYS_CONTEXT('USERENV', 'INSTANCE') instance
      ,SYS_CONTEXT('USERENV', 'ENTRYID') entryid
      ,SYS_CONTEXT('USERENV', 'ISDBA') isdba
      ,SYS_CONTEXT('USERENV', 'NLS_TERRITORY') nls_territory
      ,SYS_CONTEXT('USERENV', 'NLS_CURRENCY') nls_currency
      ,SYS_CONTEXT('USERENV', 'NLS_CALENDAR') nls_calendar
      ,SYS_CONTEXT('USERENV', 'NLS_DATE_FORMAT') nls_date_format
      ,SYS_CONTEXT('USERENV', 'NLS_DATE_LANGUAGE') nls_date_language
      ,SYS_CONTEXT('USERENV', 'NLS_SORT') nls_sort
      ,SYS_CONTEXT('USERENV', 'CURRENT_USER') current_user
      ,SYS_CONTEXT('USERENV', 'CURRENT_USERID') current_userid
      ,SYS_CONTEXT('USERENV', 'CURRENT_SCHEMAID' ) current_schemaid
      ,SYS_CONTEXT('USERENV', 'CURRENT_SCHEMA' ) current_schema
      ,SYS_CONTEXT('USERENV', 'SESSION_USER') session_user
      ,SYS_CONTEXT('USERENV', 'SESSION_USERID') session_userid
      ,SYS_CONTEXT('USERENV', 'PROXY_USER') proxy_user
      ,SYS_CONTEXT('USERENV', 'PROXY_USERID') proxy_userid
      ,SYS_CONTEXT('USERENV', 'DB_DOMAIN') db_domain
      ,SYS_CONTEXT('USERENV', 'DB_NAME') db_name
      ,SYS_CONTEXT('USERENV', 'HOST') host
      ,SYS_CONTEXT('USERENV', 'OS_USER') os_user
      ,SYS_CONTEXT('USERENV', 'EXTERNAL_NAME') external_name
      ,SYS_CONTEXT('USERENV', 'IP_ADDRESS') ip_address
      ,SYS_CONTEXT('USERENV', 'NETWORK_PROTOCOL') network_protocol
      ,SYS_CONTEXT('USERENV', 'BG_JOB_ID') bg_job_id
      ,SYS_CONTEXT('USERENV', 'FG_JOB_ID') fg_job_id
      ,SYS_CONTEXT('USERENV', 'AUTHENTICATION_TYPE') authentication_type
      ,SYS_CONTEXT('USERENV', 'AUTHENTICATION_DATA') authentication_data
      ,SYS_CONTEXT('USERENV', 'CURRENT_SQL') current_sql
      ,SYS_CONTEXT('USERENV', 'CLIENT_IDENTIFIER') client_identifier
      ,SYS_CONTEXT('USERENV', 'GLOBAL_CONTEXT_MEMORY') global_context_memory
from dual

Oracle® Database SQL Language Reference
11g Release 2 (11.2): Table 5-11 Predefined Parameters of Namespace USERENV

XSL-Трансформации (XSLT)

6 Февраль 2012 5 comments

Для написания красивых отчетов в Excel (под OEBS) довольно часто используем XSL шаблон.

Для тестирования XSL шаблона есть несколько вариантов:

  1. Загружаем XSL в OEBS и запускаем отчет — самый долгий способ.
  2. Используем мощный редактор Altova XMLSpy, который позволяет накладывать XSL на XML (XSL-Transformation). Основной минус, то что продукт платный.
  3. Используем javascript скрипт представленный ниже.
  4. var xmlFile = "data.xml";         // xml данные
    var xslFile = "tempalate.xsl";	  // xsl шаблон
    var outFile = "REPORT.xls";       // имя генерируемого файла
    //
    var Xml = null;
    var Xsl = null;
    var objTransformer = null;
    
    function init()
    {
       Xml = new ActiveXObject("MSXML2.DOMDocument");
       Xml.async = false;
       Xml.load(xmlFile);
    
       Xsl = new ActiveXObject("MSXML2.FreeThreadedDOMDocument");
       Xsl.async = false;
       Xsl.load(xslFile);
    
       // запись в файл   
       f = new ActiveXObject("ADODB.Stream");
       f.Charset = "UTF-8";
       f.Open();
       f.WriteText(Xml.transformNode(Xsl));
       f.SaveToFile(outFile,2);
       f.Close();   
    
       // запуск файла
       //var WshShell = new ActiveXObject("WScript.Shell");
       //WshShell.Run(outFile);   
    }
    
    init();


    Для использования скрипта создаем файл с расширением «.js», например «GenerateReportXML-XSL.js». Указываем в скрипте название файлов для шаблона и данных. Запускаем скрипт на выполнение (Windows).

  5. В данных после

    < ?xml version="1.0" encoding="UTF-8"?>

    добавляем новый тег

    < ?xml-stylesheet href="XXX.xsl" type="text/xsl"?>

    , где XXX.xsl имя xslt преобразования. Затем открываем xml через Excel

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