Информация об Oracle Project (Проекты) — описание основных таблиц, полезные запросы и примеры использования API.
По мере появления данных, буду добавлять информацию.
Основные таблицы Oracle Project, модуль PA.
Таблица |
Описание |
PA_PROJECTS_ALL |
Список проектов |
PA_PROJECT_ASSETS_ALL |
Активы для проектов капитального строительства |
PA_PROJECT_CLASSES |
Классификация проектов |
PA_CLASS_CATEGORIES |
Категории классификаций |
PA_CLASS_CODES |
Коды классификаций |
PA_PROJECT_ROLE_TYPES_B
view pa_project_role_types |
Список ролей для назначения на проект |
PA_PROJECT_STATUSES |
Список используемых статусов.
Для PROJECT, DELIVERABLE, TASK, PROGRESS, STRUCTURE и т.д. |
PA_PROJECT_TYPES_ALL |
Тип проекта |
PA_TRANSACTION_INTERFACE_ALL |
Интерфейсная таблица для импорта транзакций из внешних источников |
PA_IMPLEMENTATIONS_ALL |
Информация о конфигурации установки |
PA_BUDGET_LINES |
Строки бюджета |
PA_BUDGET_VERSIONS |
Версии бюджета |
PA_BUDGET_TYPES |
Тип бюджета |
PA_EXPENDITURES_ALL |
Группы статей расходов |
PA_EXPENDITURE_CATEGORIES |
Категории затрат |
PA_EXPENDITURE_TYPES |
Типы затрат |
PA_EXPENDITURE_ITEMS_ALL |
Информация о расходах для проектов и задач |
PA_PERIODS_ALL |
Периоды |
PA_RESOURCES |
Список ресурсов |
PA_PROJ_ELEMENTS |
Объекты рабочего плана — задачи, позиции поставки, структура |
PA_PROJ_ELEMENT_VERSIONS |
Версии объектов рабочего плана |
PA_STRUCTURE_TYPES |
Тип структуры |
PA_PROJ_ELEM_VER_STRUCTURE |
Версия структуры |
PA_CONVERSION_TYPES_V |
Тип курса |
PA_COST_DISTRIBUTION_LINES_ALL |
Распределение затрат расходных статей |
Если вы столкнулись с ошибкой JBO-25009, то вот вариант как ее быстро и успешно победить.
Получил ошибку на странице OAF:
US: JBO-25009: Cannot create an object of type:oracle.jbo.domain.Number
RU: JBO-25009: Невозможно создать объект типа:oracle.jbo.domain.Number
Решение:
На странице присутствовало поле xBean (тип messageChoice);
связанное с атрибутом ViewObject типа NUMBER.
Тип поля xBean был VARCHAR2, заменил его на NUMBER и все заработало успешно.
Для удаления скрытых файлов и папок SVN нам поможет следующий батник (windows):
rem Если надо указать конкретную дирректорию, то используем закомментированный вариант
rem for /d /r "%1" %%d in (.svn) do @if exist "%%d" rd /s/q "%%d"
rem Удаляем svn файлы начиная с текущей директории
for /d /r "." %%d in (.svn) do @if exist "%%d" rd /s/q "%%d"
Создание bat файла:
1) Создаём новый файл с расширение «bat». Например, «clear_svn.bat».
2) Помещаем созданный файл в каталог, который хотим почистить от svn файлов (поддерживается рекурсивное удаление) и запускаем его.
3) Все файлы svn удалены.
Если зарегистрировать view в OEBS, указав следующие столбцы
- START_DATE_ACTIVE
- END_DATE_ACTIVE
- ENABLED_FLAG
, то при использовании данной view в наборе значений автоматически будут отсекаться устаревшие данные.
Для регистрации view в OEBS, используем следующий скрипт.
Читать дальше про “Регистрация view в OEBS” »
Если, при кастомизации стандартной формы OEBS, возникает необходимость сохранить функциональность аттачментов, то реализовать это поможет следующий скрипт:
Читать дальше про “Скрипт копирования аттачмент функции” »
Довольно удобно для входа в OEBS использовать ярлык с сохраненным логином.
Создаётся такой ярлык довольно просто:
1) Заходим на инстанс
Читать дальше про “Как создать ярлык для инстанса OEBS” »
Поиск значения по всем таблицам
Вариант1:
DECLARE
match_count INTEGER;
query_str VARCHAR2(400);
l_owner VARCHAR2(10) := 'SCOTT';
l_search_text VARCHAR2(100) := '10';
BEGIN
FOR t IN (select table_name, column_name FROM all_tab_columns a
where owner = l_owner
and a.data_type in ('NUMBER', 'VARCHAR2')
)
LOOP
begin
match_count := 0;
query_str := 'SELECT COUNT(*) FROM ' ||l_owner||'.'|| t.table_name ||
' WHERE to_char(' || t.column_name || ') = :1';
EXECUTE IMMEDIATE query_str
INTO match_count
USING l_search_text;
IF match_count > 0 THEN
dbms_output.put_line(l_owner||'.'||t.table_name || ' ' || t.column_name || ' ' || match_count);
dbms_output.put_line(' SELECT t.'|| t.column_name || ', t.* from '||l_owner||'.'|| t.table_name||' t where to_char(' || t.column_name || ') = '''||l_search_text||'''');
dbms_output.put_line('');
END IF;
exception
when others then
dbms_output.put_line(t.table_name||'.'||t.column_name||' : '||SQLERRM||' : '||SQLCODE);
dbms_output.put_line(query_str);
dbms_output.put_line('');
/*raise*/
end;
END LOOP;
END;
Вариант2:
--SET SERVEROUTPUT ON SIZE 1000000
DECLARE
TYPE tab_columns_rec_type IS RECORD (
table_name all_tab_columns.table_name%type
,column_name all_tab_columns.column_name%type
,data_type all_tab_columns.data_type%type
);
type tab_columns_tab_type is table of tab_columns_rec_type index by binary_integer;
l_tab_columns_rec tab_columns_tab_type;
match_count INTEGER;
query_str VARCHAR2(400);
l_owner VARCHAR2(10) := 'SCOTT';
l_search_text VARCHAR2(100) := '10'; -- % добавляем здесь, если ищем не по точному вхождению
l_number NUMBER;
is_number NUMBER(1);
l_str_length NUMBER;
/*
l_mode:
1 - NUMBER и VARCHAR2
2 - only NUMBER
3 - only VARCHAR2
*/
l_mode NUMBER := 1;
-- При каком количестве найденные совпадений
-- прекращать поиск
l_found_count NUMBER := 1;
l_exists_count NUMBER;
BEGIN
l_str_length := length(l_search_text);
begin
l_number := to_number(l_search_text);
is_number := 1;
exception
when VALUE_ERROR then
is_number := 0;
end;
if (l_mode = 1 and is_number = 1) then
select table_name, column_name, data_type
bulk collect into l_tab_columns_rec
FROM all_tab_columns a
where owner = l_owner
and a.data_length >= l_str_length
and ( a.data_type = 'VARCHAR2' or a.data_type = 'NUMBER' );
elsif (l_mode = 2 and is_number = 1) then
select table_name, column_name, data_type
bulk collect into l_tab_columns_rec
FROM all_tab_columns a
where owner = l_owner
and a.data_length >= l_str_length
and a.data_type = 'NUMBER';
else
select table_name, column_name, data_type
bulk collect into l_tab_columns_rec
FROM all_tab_columns a
where owner = l_owner
and a.data_length >= l_str_length
and a.data_type = 'VARCHAR2';
end if;
l_exists_count := 0;
if NOT (l_tab_columns_rec is null or l_tab_columns_rec.count = 0) then
for j in l_tab_columns_rec.first..l_tab_columns_rec.last
LOOP
begin
match_count := 0;
if (l_tab_columns_rec(j).data_type = 'VARCHAR2') then
query_str := 'SELECT count(*) FROM ' ||l_owner||'.'|| l_tab_columns_rec(j).table_name ||
' WHERE rownum = 1 and to_char(' || l_tab_columns_rec(j).column_name || ') = :1';
EXECUTE IMMEDIATE query_str
INTO match_count
USING l_search_text;
elsif (l_tab_columns_rec(j).data_type = 'NUMBER') then
query_str := 'SELECT count(*) FROM ' ||l_owner||'.'|| l_tab_columns_rec(j).table_name ||
' WHERE rownum = 1 and ' || l_tab_columns_rec(j).column_name || ' = :1';
EXECUTE IMMEDIATE query_str
INTO match_count
USING l_number;
end if;
IF match_count > 0 THEN
l_exists_count := l_exists_count + 1;
dbms_output.put_line(l_tab_columns_rec(j).data_type||' '||l_owner||'.'||l_tab_columns_rec(j).table_name || ' ' || l_tab_columns_rec(j).column_name );
dbms_output.put_line(' SELECT t.'|| l_tab_columns_rec(j).column_name || ', t.* from '||l_owner||'.'|| l_tab_columns_rec(j).table_name||' t where to_char(' || l_tab_columns_rec(j).column_name || ') like '''||l_search_text||'''');
dbms_output.put_line('');
if (l_exists_count = l_found_count) then
exit;
end if;
END IF;
exception
when others then
dbms_output.put_line(l_tab_columns_rec(j).table_name||'.'||l_tab_columns_rec(j).column_name||' : '||SQLERRM||' : '||SQLCODE);
dbms_output.put_line(query_str);
dbms_output.put_line('');
/*raise*/
end;
END LOOP;
end if;
END;
SELECT a.request_id,
b.user_name,
c.program,
c.argument_text,
a.requested_start_date,
/*a.status_code, a.phase_code,*/
lc.MEANING as status_descr,
lp.MEANING as phase_descr
FROM fnd_concurrent_requests a,
fnd_user b,
fnd_conc_req_summary_v c,
fnd_lookups lp,
fnd_lookups lc
WHERE b.user_id = a.requested_by
AND a.request_id = c.request_id
AND a.requested_start_date > trunc(SYSDATE)
AND a.hold_flag = 'N'
and lp.lookup_type = 'CP_PHASE_CODE'
and lp.LOOKUP_CODE = a.phase_code
and lc.lookup_type = 'CP_STATUS_CODE'
and lc.LOOKUP_CODE = a.status_code
/*and a.status_code IN ('Q', 'I')*/
and b.user_name LIKE '%'
and c.program like '%'
ORDER BY a.request_id desc;
Читать дальше про “Параллельные программы в ОЕБС (FND_CONCURRENT_REQUESTS)” »
GREEDY AND LAZY IN REGEXP
Квантификация — поиск последовательностей;
Определяет, сколько раз предшествующее выражение может встречаться.
Квантификатор может относиться более чем к одному символу в регулярном выражении, только если это символьный класс или группа.
Таблица 2: Квантификаторы и операторы повтора
Квантификатор |
Описание |
Пример |
* |
Встречается 0 и более раз |
REGEXP_REPLACE(str, ’11*’, ‘1’)
Результат:
test11 => test1
11123345 => 123345 |
? |
Встречается 0 или 1 раз |
|
+ |
Встречается 1 и более раз |
REGEXP_LIKE(str,’5+’)
Результат:
test11 => false
11123345 => true |
{m} |
Встречается ровно m раз |
REGEXP_LIKE(str,’3{2}’)
Результат:
test11 => false
11123345 => true |
{m,} |
Встречается по крайней мере m раз |
|
{m, n} |
Встречается по крайней мере m раз, но не более n раз |
|
Жадная квантификация — это стремление захватить максимально длинную строку, которая соответствует шаблону.
SQL> with t as (
2 select '<div><img src="http://apps-oracle.ru/logo2.png" alt=""/></div>' str from dual
3 )
4 select regexp_substr(str,'<.*>') as res from t;
RES
--------------------------------------------------------------
<div><img src="http://apps-oracle.ru/logo2.png" alt=""/></div>
Ленивая квантификация — это стремление захватить максимально короткую строку, которая соответствует шаблону. Поддерживается с версии 10gR2.
SQL> with t as (
2 select '<div><img src="http://apps-oracle.ru/logo2.png" alt=""/></div>' str from dual
3 )
4 select regexp_substr(str,'<.*?>') as res from t;
RES
-----
<div>
Жадный |
Ленивый |
* |
*? |
+ |
+? |
{n,} |
{n,}? |
Создадим страницу, на которой будут выводится данные по сотрудникам. Данные будут представлены в виде таблицы.
Подготовка
1) Создаем новый проект или открываем существующий
Создание OAF проекта в JDeveloper
2) Создаем новый View Object (VO) или используем существующий
Создание View Object (VO) – только для просмотра данных
Читать дальше про “Создание страницы с таблицей данных” »
Последние комментарии