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