Скрипт для создания профиля
Скрипт для создания профиля в 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 («Вид -> Запросы») — отображение конкретного запроса
Для отображении формы FNDRSRUN («Вид -> Запросы») с конкретным запросом, используем полезный параметр DODT_REQ_ID.

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
Для поиска определенных функций в 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
Скрипт копирования меню
Скрипт для копирования меню. В случае, если меню уже существует, то добавляются отсутствуюшие пункты меню.
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
В процессе работы постоянно приходится дописывать в файлы пакетов команду «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
Просмотр настройки сегментов плана счетов
Запрос для просмотра настройки сегментов плана счетов
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
Стандартная функция 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
XSL-Трансформации (XSLT)
Для написания красивых отчетов в Excel (под OEBS) довольно часто используем XSL шаблон.
Для тестирования XSL шаблона есть несколько вариантов:
- Загружаем XSL в OEBS и запускаем отчет — самый долгий способ.
- Используем мощный редактор Altova XMLSpy, который позволяет накладывать XSL на XML (XSL-Transformation). Основной минус, то что продукт платный.
- Используем javascript скрипт представленный ниже.
-
В данных после
< ?xml version="1.0" encoding="UTF-8"?>
добавляем новый тег
< ?xml-stylesheet href="XXX.xsl" type="text/xsl"?>
, где XXX.xsl имя xslt преобразования. Затем открываем xml через Excel
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).
Java Concurrent Program

Как создать Java Concurrent Program:
- Создать директорию $FND_TOP/java/cp/request (желательное, но не обязательное место)
- Скопировать java класс
- Скомпилировать java класс
- Регистрируем Concurrent Program Executable
- Метод выполнения: Параллельная программа JAVA
- Имя исполняемого файла указываем без формата файла
- Регистрируем 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===========================
Список группы запросов для параллельных программ
Простой, но довольно полезный запрос для определения группы запросов параллельной программы.
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


Последние комментарии