При использовании ключевых гибких полей в WEBADI может возникнуть ошибка типа:
oracle.apps.bne.utilities.BneViewerServerUtils.getFlexListOfValues(BneViewerServerUtils.java:269)
Помочь может переименование параметров в «SEGMENT1«,»SEGMENT2» и т.д. и убрать номера из поля segment number. Обновляем через таблицу.
Читать дальше про “WEBADI: Ошибка при работе с КГП (KFF)” »
Для добавления функций в избранное по полномочиям — API:FND_SIGNON.UPDATE_NAVIGATOR

Читать дальше про “OEBS Меню полномочий — Избранное (Top Ten List)” »
При разработке проектов с использованием OAF и JDeveloper возникла необходимость частого переноса (или развертывания — deploy) приложений с одного экземпляра системы на другой.
Операция переноса состоит из пяти шагов:
- Компиляция java классов
- Перенос java классов на сервер приложений (в каталог $JAVA_TOP)
- Перенос xml файлов Entity Objects, View Objects, Application Modules ($JAVA_TOP)
- Импорт xml файлов Pages, Regions с помощью утилиты import
- Импорт xliff файлов
Проделав эту операцию пару раз вручную, решил все это дело автоматизировать.
Вся автоматизация построена на известном продукте Apache Ant.
Состоит из четырех файлов
- <project>.bat
- <project>.xml
- build.xml
- <project>.properties
, где <project> имя Вашего проекта.
Читать дальше про “Ant при разработке с использованием OAF” »
Скрипт для создания профиля в 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;
Запрос для просмотра настройки сегментов плана счетов
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;
Для написания красивых отчетов в Excel (под OEBS) довольно часто используем XSL шаблон.
Для тестирования XSL шаблона есть несколько вариантов:
- Загружаем XSL в OEBS и запускаем отчет — самый долгий способ.
- Используем мощный редактор Altova XMLSpy, который позволяет накладывать XSL на XML (XSL-Transformation). Основной минус, то что продукт платный.
- Используем javascript скрипт представленный ниже.
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).
-
В данных после
< ?xml version="1.0" encoding="UTF-8"?>
добавляем новый тег
< ?xml-stylesheet href="XXX.xsl" type="text/xsl"?>
, где XXX.xsl имя xslt преобразования. Затем открываем xml через Excel

Как создать 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===========================
Читать дальше про “Java Concurrent Program” »

Объединенный скрипт создания пользователя включает в себя
- Создание пользователя
- Заполнение профилей
- Добавление полномочий
Читать дальше про “Объединенный скрипт создания пользователя” »
Generic Loader (ORACLE FNDLOAD) — используется для выгрузки application entity с БД в текстовый файл.
Данный файл можно изменять руками и переносить в любое место. Формирование данных в файле .ldt происходит согласно конфигурационному .lct файлу.
Поддерживаются два режима работы: download или upload.
Есть интересный GUI для работы с FNDLOAD — Migration LogiK
Нота на металинке Tips and Examples Using FNDLOAD (Doc ID 735338.1)
Возможности FNDLOAD:
- Concurrent Programs, Executables
- Request Groups, Request Sets
- Profile Options
- Key and Descriptive Flexfields
- Menus and Responsibilities
- Forms and Form Functions/Personalizations
- Attachments
- Messages
- Value Sets and Values
- Lookup Types
- User Responsibilities
- Printer Definitions
- FND Dictionary
- Help Configuration
- Document Sequences
- Alerts
- Concurrent Manager Schedules
- WEB ADI
- Approvals Management Engine
Читать дальше про “Oracle FNDLOAD” »
Запрос для вывода иерархии организаций.
Список существующих иерархий можно увидеть в таблице hr.per_organization_structures.
SELECT LPAD(' ', 10 * (LEVEL - 1)) || org.name hierarchy,
org.organization_id
FROM hr_all_organization_units org, per_org_structure_elements pose
WHERE 1 = 1
AND org.organization_id = pose.organization_id_child
AND pose.org_structure_version_id = &p_structure_version_id
-- START WITH org.organization_id =
CONNECT BY PRIOR pose.organization_id_child = pose.organization_id_parent
ORDER SIBLINGS BY org.location_id, pose.organization_id_child;
Последние комментарии