Архив

Архив автора

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

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

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]

Объединенный скрипт создания пользователя

15 Декабрь 2011 Нет комментариев

oebs_create_user
Объединенный скрипт создания пользователя включает в себя

  1. Создание пользователя
  2. Заполнение профилей
  3. Добавление полномочий

Читать дальше про “Объединенный скрипт создания пользователя” »

R12: таблицы HZ (Заказчики)

14 Декабрь 2011 Нет комментариев

Рассмотрим назначение основных HZ таблиц и связи между ними.



HZ_PARTIES

Содержит основную информацию о сущностях (сторонах). Разные сущности могу иметь одинаковое имя.

Типы сущностей

  1. Person — лицо
  2. Organization — организация
  3. Group — группа
  4. Relationship — отношение
Поле Описание
PARTY_ID (PK) ID сущности
PARTY_NUMBER (PK) Номер  сущности
PARTY_NAME Имя  сущности
PARTY_TYPE Тип  сущности

Читать дальше про “R12: таблицы HZ (Заказчики)” »