вторник, 29 апреля 2008 г.

Денормализация данных

Попробуем измерить её в ширину :-)


SQL> SELECT *
2 FROM (
3 SELECT c.owner, c.table_name, COUNT(*)
4 FROM dba_tab_columns c
5 ,dba_objects o
6 ,applsys.fnd_oracle_userid fou
7 WHERE o.owner = fou.oracle_username
8 AND o.owner = c.owner
9 AND o.object_name = c.table_name
10 AND o.object_type = 'TABLE'
11 AND fou.oracle_username NOT LIKE 'XX%'
12 GROUP BY c.owner, c.table_name
13 ORDER BY COUNT(*) DESC
14 )
15 WHERE ROWNUM <= 30
16 /

OWNER TABLE_NAME COUNT(*)
---------- ------------------------------ ----------
BIS EDWCMPALLCLASSES 729
IGF IGF_AP_CSS_INTERFACE_ALL 689
EC ECE_STAGE 519
ONT OE_LINE_ACKS 507
ICX ICX_CAT_ITEMS_GT 500
ICX ICX_CAT_UPLOAD_IT_DUMP 500
ENI EDW_ITEMS_M 495
IGF IGF_AP_ISIR_INTRFACE_ALL 475
CSI CSI_HISTORY_ARCHIVE 473
ONT OE_LINES_IFACE_ALL 467
CS CS_INCIDENTS_AUDIT_B 432
AMS AMS_LIST_ENTRIES 416
AMS AMS_IMP_SOURCE_LINES 416
EGO EGO_BULKLOAD_INTF 402
IGF IGF_AP_CSS_FNAR_ALL 371
ONT OE_BLANKET_LINES_HIST 371
AMS AMS_LIST_IMPORT_ERRORS 367
INV MTL_SYSTEM_ITEMS_INTERFACE 358
ONT OE_ORDER_LINES_HISTORY 357
AR HZ_CUSTOMER_MERGE_LOG 356
ICX ICX_POR_UPLOAD_IT_DUMP 345
ONT OE_HEADER_ACKS 341
ONT OE_ORDER_LINES_ALL 340
ICX ICX_CAT_ITEMS_TLP 339
RLM RLM_INTERFACE_LINES_ALL 339
INV MTL_SYSTEM_ITEMS_B 337
ONT OE_HEADERS_IFACE_ALL 330
IGF IGF_AP_CSS_PROFILE_ALL 328
OSM AS_IMPORT_INTERFACE 327
QRM QRM_SAVED_ANALYSES_ROW 327

30 строк выбрано.

среда, 23 апреля 2008 г.

ADF vs OAF

Не далее как 14.04.2008 Oracle выпустил разъяснения относительно того, на чем клиенты должны разрабатывать расширения для Oracle E-Business Suite - Note:563047.1 E-Business Suite Application Development using Oracle Application Framework (OAF) and Application Development Framework (ADF)

Вопрос всплыл в связи с грядущем наступлением "next generation Fusion Middleware technology stack". Как известно, Fusion Middleware основан на ADF, а пользовательский интерфейс ОЕБС разработан на Forms и OAF.

И каковы же рекомендации Oracle:

  • Для разработки хорошо интегрированных расширений ОЕБС (т.е. обычные кастомизации) нужно использовать OAF
  • Для разработки приложений использующих данные из ОЕБС и которые требуют специфические ОЕБС-овые возможности (гибкие поля, персонализация) опять же нужно использовать OAF
  • Для разработки приложений для ОЕБС, которые не требуют тесной интеграции с ОЕБС и не требуют использования ОЕБС-совых штучек, типа гибкие поля, нужно использовать ADF 10g, а интеграцию с ОЕБС делать через SOA.
  • Для разработки приложений, которые вообще не требуют никакой интеграции с ОЕБС и для которых нужен "AJAX-style rich client user interface" нужно использовать ADF 11g!!!!!
Какие можно сделать выводы:
  • Текущая версия ADF 10g до сих пор не готова к тому, чтобы на ней делать серьезные приложения
  • Вот уж действительно нужно быть "rich client" для того, чтобы принять решение о разработке нового приложения на ADF 11g зная что "ADF 11g is currently available in preview beta".
  • Любопытно отметить, что в ноте рассматриваются и сравниваются только OAF и ADF. Т.е. похоже на то, что Oracle Forms в светлое будущее(next generation Fusion Middleware technology stack) не попадает.
Однако так и осталось непонятным сколько же еще лет потребуется Oracle для того, чтобы выпустить продуктивную версию next generation technology stack. Вопрос этот становится особенно актуальным в свете покупки Bea Systems, не самого последнего игрока на рынке продуктов для middleware.

вторник, 22 апреля 2008 г.

Список полномочий для заданной операционной единицы (ORG_ID)

Запрос выдает список всех полномочий, у которых установлено заданное значение профиля
"НО: операционная единица" (ORG_ID) :


SELECT fr.responsibility_name
,hou.name AS operating_unit_name
,hou.organization_id AS org_id
FROM fnd_profile_option_values fpov
,hr_operating_units hou
,fnd_responsibility_vl fr
WHERE profile_option_id = 1991 -- org_id
AND level_id = 10003 -- Responsibility level
AND hou.organization_id = TO_NUMBER(fpov.profile_option_value)
AND fr.responsibility_id = TO_NUMBER(fpov.level_value)
AND fr.application_id = TO_NUMBER(fpov.level_value_application_id)
AND hou.name = '&operating_unit_name'
-- AND hou.organization_id = &org_id
/

вторник, 15 апреля 2008 г.

Инициализация APPS-овой сессии

===== Start script =====
/* $Header: fnd_initialize.sql 11.5.10 2 15.04.2008 oebs-ru $ */
-- Назначение
-- Ининциализации APPS-овой сессии
-- Параметры
-- 1 - имя пользователя OEBS. Регистр знаков не важен
-- 2 - имя полномочий.
-- Регистр знаков важен
-- Используется LANGUAGE от текущей сессии
-- Возможно указание шаблона (для LIKE), типа 'Сис%админ%'
-- Если искомому шаблону удовлетворяют несколько полномочий,
-- то будет выбрано случайное
-- Особенности
-- Необрабатывается ситуация, когда одно и тоже имя полномочий используется
-- в разных приложениях.
-- В случае успешной инициализации, в логе скрипта выводятся имена
-- и ID (в скобках) для пользователя, полномочий и приложения
--
SET VERIFY OFF
SET FEEDBACK OFF
DEFINE user_name = "&&1"
DEFINE resp_name = "&&2"
DECLARE
user_name_v fnd_user.user_name%TYPE := '&user_name';
resp_name_v fnd_responsibility_tl.responsibility_name%TYPE := '&resp_name';
--
user_id_v fnd_user.user_id%TYPE;
responsibility_id_v fnd_responsibility_tl.responsibility_id%TYPE;
responsibility_name_v fnd_responsibility_tl.responsibility_name%TYPE;
application_id_v fnd_responsibility_tl.application_id%TYPE;
application_name_v fnd_application_tl.application_name%TYPE;
security_group_id_v fnd_security_groups.security_group_id%TYPE
:= Fnd_Global.security_group_id;

err_msg_v VARCHAR2(255);
BEGIN
err_msg_v := 'User "'||user_name_v||'" does not exist or inactive';
SELECT fu.user_id
INTO user_id_v
FROM fnd_user fu
WHERE fu.user_name = UPPER(user_name_v)
AND SYSDATE BETWEEN fu.start_date AND NVL(fu.end_date, SYSDATE);

err_msg_v := 'Responsibility "'||resp_name_v||'" does not exist or inactive';
SELECT frt.application_id
,frt.responsibility_id
,frt.responsibility_name
,(SELECT fav.application_name
FROM fnd_application_vl fav
WHERE fav.application_id = fr.application_id
) AS application_name
INTO application_id_v
,responsibility_id_v
,responsibility_name_v
,application_name_v
FROM fnd_responsibility_tl frt
,fnd_responsibility fr
WHERE fr.application_id = frt.application_id
AND fr.responsibility_id = frt.responsibility_id
AND SYSDATE BETWEEN fr.start_date AND NVL(fr.end_date, SYSDATE)
AND frt.responsibility_name LIKE resp_name_v
AND frt.LANGUAGE = USERENV ('LANG')
AND ROWNUM = 1;

err_msg_v := 'Error in Fnd_Global.apps_initialize';
Fnd_Global.apps_initialize (
user_id => user_id_v
,resp_id => responsibility_id_v
,resp_appl_id => application_id_v
,security_group_id => security_group_id_v
);

DBMS_OUTPUT.PUT_LINE ('Session initialized');
DBMS_OUTPUT.PUT_LINE (
' User : '||UPPER(user_name_v)||' ('||user_id_v ||')'
);
DBMS_OUTPUT.PUT_LINE (
' Responsibility: '||responsibility_name_v||' ('||responsibility_id_v||')'
);
DBMS_OUTPUT.PUT_LINE (SUBSTR(
' Application : '||application_name_v||' ('||application_id_v||')'
,1,255));
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.PUT_LINE (err_msg_v);
DBMS_OUTPUT.PUT_LINE (SUBSTR(sqlerrm,1,255));
END;
/
SET FEEDBACK ON
UNDEFINE user_name
UNDEFINE resp_name
===== End script =====


Скрипт

понедельник, 14 апреля 2008 г.

Эпиграф

Согласно известной армейской шутке
"Значение синуса в военное время может достигать и четырех!"

ОЕБС - сложная система. Здесь всё как на войне:


SQL> select * from fnd_dual;

DUMMY
----------
1
1
1
1

P.S.
Note:1016620.6