Архив

Архив автора

Oracle Project (Проекты)

15 Сентябрь 2011 Нет комментариев

Информация об 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 Распределение затрат расходных статей
Categories: oracle, Oracle e-Business Suite Tags: , , ,

JBO-25009: Невозможно создать объект типа:oracle.jbo.domain.Number

14 Сентябрь 2011 Нет комментариев

Если вы столкнулись с ошибкой 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

14 Сентябрь 2011 3 comments

Для удаления скрытых файлов и папок 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 удалены.

Categories: Others Tags: ,

Регистрация view в OEBS

9 Сентябрь 2011 1 комментарий


Если зарегистрировать view в OEBS, указав следующие столбцы

  • START_DATE_ACTIVE
  • END_DATE_ACTIVE
  • ENABLED_FLAG

, то при использовании данной view в наборе значений автоматически будут отсекаться устаревшие данные.

Для регистрации view в OEBS, используем следующий скрипт.
Читать дальше про “Регистрация view в OEBS” »

Скрипт копирования аттачмент функции

8 Сентябрь 2011 Нет комментариев


Если, при кастомизации стандартной формы OEBS, возникает необходимость сохранить функциональность аттачментов, то реализовать это поможет следующий скрипт:

Читать дальше про “Скрипт копирования аттачмент функции” »

Как создать ярлык для инстанса OEBS

8 Сентябрь 2011 3 comments

Довольно удобно для входа в OEBS использовать ярлык с сохраненным логином.
Создаётся такой ярлык довольно просто:

1) Заходим на инстанс

Вход на инстанс OEBS

Читать дальше про “Как создать ярлык для инстанса OEBS” »

Categories: Oracle e-Business Suite Tags:

Поиск значения по всем таблицам

7 Сентябрь 2011 19 comments

Поиск значения по всем таблицам

Вариант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;
Categories: oracle, SQL Tags: , ,

Параллельные программы в ОЕБС (FND_CONCURRENT_REQUESTS)

18 Август 2011 1 комментарий
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)” »

Жадная и ленивая квантификация в регулярных выражениях

16 Август 2011 Нет комментариев

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,}?




Создание страницы с таблицей данных

8 Август 2011 6 comments

Создадим страницу, на которой будут выводится данные по сотрудникам. Данные будут представлены в виде таблицы.

Подготовка

1) Создаем новый проект или открываем существующий
Создание OAF проекта в JDeveloper


2) Создаем новый View Object (VO) или используем существующий
Создание View Object (VO) – только для просмотра данных



Читать дальше про “Создание страницы с таблицей данных” »