Архив

Архив автора

Регулярные выражения. Удаление последней буквы или цифры в строке.

4 Апрель 2018 2 comments

Используем регулярное выражение с REGEXP_LIKE для удаления последней буквы в строке:

with t as
(           select 'H18.DHSHJ7' as str from dual
 union all  select 'H18.AAA1A' from dual
 union all  select 'H18.AAA10' from dual 
 union all  select 'H18.AAAB4B' from dual  
)
select t.str, regexp_replace(str, '[[:alpha:]]$','')
from t

SQL> 
STR        REGEXP_REPLACE(STR,'[[:ALPHA:]
---------- ------------------------------------------------------------------
H18.DHSHJ7 H18.DHSHJ7
H18.AAA1A  H18.AAA1
H18.AAA10  H18.AAA10
H18.AAAB4B H18.AAAB4

Для удаления последней цифры заменяем [[:alpha:]] на [[:digit:]]

with t as
(           select 'H18.DHSHJ7' as str from dual
 union all  select 'H18.AAA1A' from dual
 union all  select 'H18.AAA10' from dual 
 union all  select 'H18.AAAB4B' from dual  
)
select t.str, regexp_replace(str, '[[:digit:]]$','')
from t

SQL> 
STR        REGEXP_REPLACE(STR,'[[:DIGIT:]
---------- -------------------------------------------------------------------
H18.DHSHJ7 H18.DHSHJ
H18.AAA1A  H18.AAA1A
H18.AAA10  H18.AAA1
H18.AAAB4B H18.AAAB4B

JSP страница для входа в OEBS с логином и паролем

26 Декабрь 2017 1 комментарий


Весьма полезная JSP страница для авто входа в OEBS с логином и паролем:

http://host:port/OA_HTML/fndvald.jsp?username=!login&password=!pwd

Пример ссылки:

Читать дальше про “JSP страница для входа в OEBS с логином и паролем” »

Ассоциативный массив: цикл по коллекции с ключом varchar2

27 Июль 2017 1 комментарий

Пример заполнения ассоциативного массива и цикл для вывода данных.
Ключом является строка varchar2(1):

declare
  -- объявление типа
  TYPE resultRec is record
  (
      ready  varchar2(1),
      cnt    number
  );
  type resultTab is table of resultRec INDEX BY VARCHAR2(1);
  --
  p_iter varchar2(1); -- итератор
  p_validation_res_tbl resultTab; -- экземпляр коллекции
  --
  -- запись данных в коллекцию
  procedure put_result(p_ready varchar2)
  is
  begin
    if (p_validation_res_tbl.exists(p_ready)) then
      p_validation_res_tbl(p_ready).cnt := p_validation_res_tbl(p_ready).cnt + 1;
    else
      p_validation_res_tbl(p_ready).ready := p_ready;
      p_validation_res_tbl(p_ready).cnt   := 1;
    end if;
  end;  
begin
  
  -- запись данных в коллекцию через вспомогательную процедуру
  put_result('E');
  put_result('E');
  put_result('S');
  put_result('W');
  
  -- первичное выставление итератора коллекции  
  p_iter := p_validation_res_tbl.FIRST;
  -- проверка, на то, что коллекция не пустая
  if (p_iter is null) then
    dbms_output.put_line('p_validation_res_tbl is null');
  else  
    -- цикл по коллекции
    WHILE p_iter IS NOT NULL
    LOOP
      -- Пример оращения к данным p_validation_res_tbl(p_iter).cnt, где
      --   p_validation_res_tbl: экземпляр коллекции
      --   p_iter : текущий итератор
      --   cnt : поле из record resultRec
      dbms_output.put_line(p_validation_res_tbl(p_iter).ready 
                           ||':'
                           ||p_validation_res_tbl(p_iter).cnt
                           ||' row(s)');
      -- получение следующей записи
      p_iter := p_validation_res_tbl.NEXT(p_iter);
    END LOOP; 
  end if; 
  
end;
>
E:2 row(s)
S:1 row(s)
W:1 row(s)

Список полномочий и групп запросов для отчета

15 Апрель 2016 1 комментарий

Запрос для вывода списка полномочий и групп запросов по коду или имени отчета/параллельной программы:

with params as (
select 'FNDATREP' as short_name
      ,''    as long_name
      ,'RU'  as lang /* RU;US */
from dual
)
select  p1.concurrent_program_name
       ,pt.user_concurrent_program_name
       ,fa.application_short_name as appl_resp
       ,r.responsibility_key
       ,rt.responsibility_name      
       ,fa1.application_short_name as appl_request_group
       ,g.request_group_name
from fnd_request_groups      g,
     fnd_request_group_units u,
     fnd_application    fa,
     fnd_application    fa1,         
     fnd_concurrent_programs_tl pt,
     fnd_concurrent_programs    p1,
     fnd_responsibility    r,
     fnd_responsibility_tl rt,
     params
where 1=1
      and u.application_id = g.application_id
      and u.request_group_id = g.request_group_id
      and (u.request_unit_id = pt.concurrent_program_id
          or u.request_unit_type = 'A')
      and u.unit_application_id = pt.application_id
      and pt.application_id = fa.application_id
      and pt.concurrent_program_id = p1.concurrent_program_id
      and g.application_id = fa1.application_id
      and r.request_group_id = g.request_group_id
      and r.responsibility_id = rt.responsibility_id
      and rt.language = params.lang
      and pt.language  = params.lang
      and (
            (p1.concurrent_program_name like '%'||params.short_name||'%' 
             and params.short_name is not null 
            ) 
            or 
            (pt.user_concurrent_program_name like '%'||params.long_name||'%' 
             and params.long_name is not null and params.short_name is null
            )
          )
order by 1,2;

Список полномочий где используется форма + путь для вызова

15 Апрель 2016 Нет комментариев

Скрипт для вывода списка полномочий, в которых используется форма.
Так же добавлен путь внутри полномочий для вызова формы.
Желаемый язык для вывода данных вынесен в параметры.

with params as (
select 'FNDSCRSP' as form_name
      ,''         as user_form_name
      ,''         as description_form
      ,'RU'       as lang /* RU;US */
from dual
)
select (select rt.responsibility_name from fnd_responsibility_tl rt , params
        where rt.responsibility_id  = r.responsibility_id
              and rt.application_id = r.application_id
              and rt.language = params.lang
       ) as responsibility_name
      ,(select ltrim(sys_connect_by_path(me.prompt, ' --> '),' --> ') 
        from (select b.menu_id,b.entry_sequence,b.sub_menu_id,b.function_id, t.prompt
             from fnd_menu_entries_tl t, fnd_menu_entries b, params
             where b.menu_id = t.menu_id
               and b.entry_sequence = t.entry_sequence
               and t.language = params.lang) me
        where me.prompt is not null 
              and me.function_id = ff1.function_id 
              and rownum=1
        start with me.menu_id = r.menu_id  
        connect by prior me.sub_menu_id = me.menu_id and prior me.prompt is not null
       ) path_to_form
      ,r.application_id
      ,r.responsibility_id
      ,r.responsibility_key 

      ,r.menu_id    
      ,(select mt.user_menu_name from fnd_menus_tl mt, params where mt.menu_id = r.menu_id and mt.language = params.lang) as user_menu_name
      ,ff1.function_id
      ,(select fft.user_function_name from fnd_form_functions_tl fft, params where fft.function_id = ff1.function_id and fft.language = params.lang) as user_function_name
      ,ff1.form_id 
      ,(select ff.form_name from fnd_form ff where ff.form_id = ff1.form_id ) as form_name      
      ,(select ftl.user_form_name from fnd_form_tl ftl, params where ftl.form_id = ff1.form_id  and ftl.language = params.lang) as user_form_name
from fnd_responsibility r
    ,(select ff.function_id, ff.form_id from fnd_form_functions ff 
      where ff.form_id in (select f.form_id 
                           from fnd_form f, fnd_form_tl ft, params
                           where f.form_id = ft.form_id
                                 and (
                                        f.form_name = params.form_name 
                                     or (ft.user_form_name like '%'||params.user_form_name||'%' and params.user_form_name is not null)
                                     or (ft.description like '%'||params.description_form||'%' and params.description_form is not null)
                                     )
                          )
     ) ff1 
where 1=1
      and sysdate between r.start_date and nvl(r.end_date, sysdate+1)
      and r.menu_id in (select me.menu_id from fnd_menu_entries me 
                        start with me.function_id = ff1.function_id
                        connect by prior me.menu_id = me.sub_menu_id 
                       )

SQL Склонение количества ошибок

9 Февраль 2016 2 comments


Пример SQL запроса для склонения слова «ошибка» для вывода количества ошибок: «Найдена 1 ошибка»; «Найдено 3 ошибки»; «Найдено 5 ошибок» :

select 
  val
 ,case when mod(val,10) between 2 and 4 then 'Найдено '||val||' ошибки'
       
       when val between 11 and 14 or mod(val,10) between 5 and 9 
            or mod(val,10) = 0 then 'Найдено '||val||' ошибок' 
                          
       when mod(val,10) = 1 then 'Найдена '||val||' ошибка'
 end str
from ( select level val from dual connect by level<=25 )

       VAL STR
---------- -------------------------------------------------------
         1 Найдена 1 ошибка
         2 Найдено 2 ошибки
         3 Найдено 3 ошибки
         4 Найдено 4 ошибки
         5 Найдено 5 ошибок
         6 Найдено 6 ошибок
         7 Найдено 7 ошибок
         8 Найдено 8 ошибок
         9 Найдено 9 ошибок
        10 Найдено 10 ошибок
        11 Найдено 11 ошибок
        12 Найдено 12 ошибки
        13 Найдено 13 ошибки
        14 Найдено 14 ошибки
        15 Найдено 15 ошибок
        16 Найдено 16 ошибок
        17 Найдено 17 ошибок
        18 Найдено 18 ошибок
        19 Найдено 19 ошибок
        20 Найдено 20 ошибок
        21 Найдена 21 ошибка
        22 Найдено 22 ошибки
        23 Найдено 23 ошибки
        24 Найдено 24 ошибки
        25 Найдено 25 ошибок
25 rows selected

Riga DevDay 2016

25 Январь 2016 Нет комментариев

Riga DevDay 2016
Уважаемые посетители моего блога,
обращаю ваше внимание на ежегодную конференцию для разработчиков Riga DevDay 2016, которая пройдёт со 2 по 4 марта в Риге.

Стоимость, расписание сессий, другие подробности по ссылке
www.rigadevday.lv и www.facebook.com/rigadevday

OEBS API INV: Создание заказа на перемещение

Пример использования API для создания заказа на перемещение

declare 
  lx_doc_hdr    inv_move_order_pub.Trohdr_Rec_Type;
  lx_doc_lines  inv_move_order_pub.Trolin_Tbl_Type;    
  --
  lx_doc_hdr_vals   inv_move_order_pub.Trohdr_Val_Rec_Type;
  lx_doc_lines_vals inv_move_order_pub.Trolin_Val_Tbl_Type;
  lx_return_status  varchar2(1);
  lx_msg_data       varchar2(4000);
  lx_msg_count      number;
begin
  -- тип заказа на перемещение = заявка
  lx_doc_hdr.move_order_type        := inv_globals.G_MOVE_ORDER_REQUISITION;
  lx_doc_hdr.organization_id        := 1775;
  lx_doc_hdr.date_required          := sysdate;
  
  lx_doc_hdr.operation              := inv_globals.G_OPR_CREATE;
  lx_doc_hdr.header_status          := inv_globals.G_TO_STATUS_PREAPPROVED;
    
  -- создание заголовка заказа на перемещение
  inv_move_order_pub.create_move_order_header(
    p_api_version_number => 1,
    p_init_msg_list      => fnd_api.G_TRUE,
    p_return_values      => fnd_api.G_TRUE,
    p_commit             => fnd_api.G_FALSE,
    x_return_status      => lx_return_status,
    x_msg_count          => lx_msg_count,
    x_msg_data           => lx_msg_data,
    p_trohdr_rec         => lx_doc_hdr,
    p_trohdr_val_rec     => lx_doc_hdr_vals,
    x_trohdr_rec         => lx_doc_hdr,
    x_trohdr_val_rec     => lx_doc_hdr_vals
  );
  
  dbms_output.put_line('create_move_order_header='||lx_return_status);
  dbms_output.put_line('header_id='||lx_doc_hdr.header_id);

  if (lx_return_status!='S') then
    FOR j IN 1 .. lx_msg_count LOOP
      dbms_output.put_line('error('||j||')= ' ||fnd_msg_pub.get(j,fnd_api.g_false));
    END LOOP;  
  else

    lx_doc_lines(1).header_id      := lx_doc_hdr.header_id;
    
    lx_doc_lines(1).operation      := inv_globals.G_OPR_CREATE;
    lx_doc_lines(1).line_status    := inv_globals.G_TO_STATUS_PREAPPROVED;
    lx_doc_lines(1).date_required  := sysdate;       
    lx_doc_lines(1).status_date    := sysdate;
    -- 64 Перенос заказа на перемещение    
    lx_doc_lines(1).transaction_type_id := inv_globals.g_type_transfer_order_subxfr;
    --
    lx_doc_lines(1).from_subinventory_code := 'ttttttt';
    lx_doc_lines(1).organization_id        := 1775;
    lx_doc_lines(1).to_subinventory_code   := 'fffffff';      
    lx_doc_lines(1).to_organization_id     := 1775;
          
    lx_doc_lines(1).inventory_item_id      := 57878;
    lx_doc_lines(1).uom_code               := 'шт'; 
    lx_doc_lines(1).quantity               := 5;    
    
    -- создание строки заказа на перемещение
    inv_move_order_pub.create_move_order_lines(
      p_api_version_number       => 1,
      p_init_msg_list            => fnd_api.G_TRUE,
      p_return_values            => fnd_api.G_TRUE,      
      p_commit                   => fnd_api.G_FALSE,
      x_return_status            => lx_return_status,
      x_msg_count                => lx_msg_count,
      x_msg_data                 => lx_msg_data,
      p_trolin_tbl               => lx_doc_lines,
      p_trolin_val_tbl           => lx_doc_lines_vals,
      x_trolin_tbl               => lx_doc_lines,
      x_trolin_val_tbl           => lx_doc_lines_vals
    );    
    
    dbms_output.put_line('create_move_order_lines='||lx_return_status);
    if (lx_return_status!='S') then
      FOR j IN 1 .. lx_msg_count LOOP
        dbms_output.put_line('error('||j||')='||fnd_msg_pub.get(j,fnd_api.g_false));
      END LOOP;  
    else
      dbms_output.put_line('line_id='||lx_doc_lines(1).line_id);      
    end if;    

  end if;
  
end;

Удаление управляющих символов из строки

Для удаления управляющих символов (не отображаемых) можно использовать регулярные выражения:

  • REGEXP_LIKE — для поиска значений с управляющими символами
  • REGEXP_REPLACE — для удаления управляющих символов
select str, regexp_replace(t.str, '[[:cntrl:]]') as new_str
from (
select 'test1'||chr(28) as str from dual
union all
select 'test2' from dual
union all
select 'test3+_*- =\\\|()^%#3@' from dual
) t
where regexp_like(t.str, '[[:cntrl:]]')

STR                    NEW_STR
---------------------- ----------------------
test1                  test1

OEBS API BOM – Создание спецификаций через интерфейсные таблицы

11 Декабрь 2014 Нет комментариев

Описание шагов по заполнение интерфейсных таблиц для создания спецификаций (комплектов позиций).

1) Таблица BOM_BILL_OF_MTLS_INTERFACE — заголовок
список обязательных полей:

  • assembly_item_id
  • item_number
  • organization_id
  • organization_code
  • transaction_type
  • process_flag

2) Таблица BOM_INVENTORY_COMPS_INTERFACE — строки
список обязательных полей:

  • operation_seq_num
  • item_num
  • component_quantity
  • component_item_id
  • component_item_number
  • organization_id
  • organization_code
  • assembly_item_id
  • assembly_item_number
  • transaction_type
  • process_flag

Читать дальше про “OEBS API BOM – Создание спецификаций через интерфейсные таблицы” »