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

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

  • 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 – Создание спецификаций через интерфейсные таблицы” »

OEBS API INV – Удаление резервирований для позиции

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

Пример использования API для удаления резервирований позиции:

declare
  l_rsv_rec                inv_reservation_global.mtl_reservation_rec_type;
  l_serial_number_tbl_type inv_reservation_global.serial_number_tbl_type;
  --
  lx_return_status varchar2(1);
  lx_msg_data      varchar2(4000);
  lx_msg_count     number;
begin
  fnd_global.apps_initialize(-1, 20634, 401); --Запасы - Запасы
  for i_cur in (select * from mtl_reservations t
                where 1=1
                      and rownum=1
                      -- and ...
           )
  loop
    l_rsv_rec.reservation_id               := i_cur.reservation_id;
    l_rsv_rec.organization_id              := i_cur.organization_id;          
    l_rsv_rec.inventory_item_id            := i_cur.inventory_item_id;
    l_rsv_rec.demand_source_type_id        := i_cur.demand_source_type_id; 
    l_rsv_rec.demand_source_header_id      := i_cur.demand_source_header_id; 
    l_rsv_rec.demand_source_line_id        := i_cur.demand_source_line_id;  
    l_rsv_rec.primary_uom_code             := i_cur.primary_uom_code;    
    l_rsv_rec.reservation_uom_code         := i_cur.reservation_uom_code;       
  -- l_rsv_rec.reservation_quantity         := 1;--i_cur.reservation_quantity;     
  -- l_rsv_rec.primary_reservation_quantity := 1;--i_cur.primary_reservation_quantity;
    l_rsv_rec.supply_source_type_id        := i_cur.supply_source_type_id;
        
    inv_reservation_pub.delete_reservation(p_api_version_number => 1.0
                                          ,p_rsv_rec            => l_rsv_rec
                                          ,p_serial_number      => l_serial_number_tbl_type
                                          ,x_return_status      => lx_return_status
                                          ,x_msg_count          => lx_msg_count 
                                          ,x_msg_data           => lx_msg_data
                                          );
                                          
    dbms_output.put_line(lx_return_status);   
    if (lx_return_status <> 'S') then    
      fnd_msg_pub.count_and_get(p_encoded => fnd_api.g_false,                               
                                p_count   => lx_msg_count,                               
                                p_data    => lx_msg_data);       
      dbms_output.put_line('ERROR delete_reservation for reservation_id ='
                           ||l_rsv_rec.reservation_id ||':');       
      if lx_msg_count = 1 then      
        dbms_output.put_line(lx_msg_data);    
      else      
        FOR i IN 1 .. lx_msg_count 
        LOOP         
          dbms_output.put_line(fnd_msg_pub.get(fnd_msg_pub.g_next,fnd_api.g_false));
        END LOOP;     
      end if; 
    end if;
    commit;        
  end loop;                                  
                                          
end;

OEBS API INV – Текущее количество для позиции (ONHAND)

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

Пример использования API для получения текущего или доступного для резервирования количества для позиции:


declare
  p_organization_id   NUMBER := 155;
  p_inventory_item_id NUMBER := 546;
  --
  p_revision          VARCHAR2(3);
  p_lot_number        VARCHAR2(80);
  p_subinventory_code VARCHAR2(10) := 'VAlVALVAL';
  p_locator_id        NUMBER;  
  --
  lx_qoh    NUMBER; -- Total Quantity (Onhand)
  lx_rqoh   NUMBER;
  lx_qr     NUMBER;
  lx_qs     NUMBER;
  lx_att    NUMBER; -- Available to Transact
  lx_atr    NUMBER; -- Available to Reserve
  --
  lx_return_status VARCHAR2(1);
  lx_msg_count     NUMBER;
  lx_msg_data      VARCHAR2(4000);
begin
  inv_quantity_tree_grp.clear_quantity_cache;
  inv_quantity_tree_pub.query_quantities(
        p_api_version_number         => 1.0,
        p_init_msg_lst               => fnd_api.g_false,
        x_return_status              => lx_return_status,
        x_msg_count                  => lx_msg_count,
        x_msg_data                   => lx_msg_data,
        --
        p_organization_id            => p_organization_id,
        p_inventory_item_id          => p_inventory_item_id,
        p_tree_mode                  => apps.inv_quantity_tree_pub.g_transaction_mode,
        p_is_revision_control        => case when p_revision is null   then FALSE else TRUE end,
        p_is_lot_control             => case when p_lot_number is null then FALSE else TRUE end,
        p_is_serial_control          => FALSE,
                                         
        p_revision                   => p_revision,
        p_lot_number                 => p_lot_number,
        p_subinventory_code          => p_subinventory_code,
        p_locator_id                 => p_locator_id,
                                         
        x_qoh                        => lx_qoh,  -- OnHand Quantity
        x_rqoh                       => lx_rqoh,
        x_qr                         => lx_qr,
        x_qs                         => lx_qs,
        x_att                        => lx_att, -- Available To Transact
        x_atr                        => lx_atr  -- Available To Reserve
                                        );
   if lx_return_status ='S' then
     DBMS_OUTPUT.put_line ('Общее количество: ' || lx_qoh);
     DBMS_OUTPUT.put_line ('Доступно для резервирования: ' || lx_atr);
     DBMS_OUTPUT.put_line ('Доступно для транзакции: ' || lx_att);
   else
    fnd_msg_pub.count_and_get(p_encoded => fnd_api.g_false,
                              p_count   => lx_msg_count,
                              p_data    => lx_msg_data);
 
    dbms_output.put_line('ERROR for p_inventory_item_id='||p_inventory_item_id);
 
    if lx_msg_count = 1 then
      dbms_output.put_line(lx_msg_data);
    else
      FOR i IN 1 .. lx_msg_count LOOP
        dbms_output.put_line(fnd_msg_pub.get(fnd_msg_pub.g_next,
                                             fnd_api.g_false));
      END LOOP;
    end if;
  end if;   
                                           
end;

Так же есть запрос для просмотра текущего количества Модуль INV – Текущее количество для позиции

Скрипт вывода полей для XML шаблона данных на основе таблицы

28 Октябрь 2014 Нет комментариев

Скрипт вывода столбцов таблицы в XML шаблон данных( BI Publisher Data Template )

declare
  p_table_owner varchar2(30) := 'APPLSYS';
  p_table_name  varchar2(30) := 'FND_USER';
begin
  for i_cur in (
                  select t.column_name
                        ,t.data_type
                        ,max(length(t.column_name)) over() 
                         - length(t.column_name) as cur_gap_length
                  from all_tab_columns t
                  where 1=1
                        and t.owner = p_table_owner
                        and t.table_name = p_table_name
                  order by t.column_id
                )
   loop
     dbms_output.put_line('<element name="' ||i_cur.column_name
                          ||'"'||rpad(' ',i_cur.cur_gap_length)||' value="'||i_cur.column_name
                          ||'" />');
   end loop;
end;

-- Пример вывода
<element name="USER_ID"                       value="USER_ID" />
<element name="USER_NAME"                     value="USER_NAME" />
<element name="LAST_UPDATE_DATE"              value="LAST_UPDATE_DATE" />
<element name="LAST_UPDATED_BY"               value="LAST_UPDATED_BY" />
<element name="CREATION_DATE"                 value="CREATION_DATE" />
<element name="CREATED_BY"                    value="CREATED_BY" />
<element name="LAST_UPDATE_LOGIN"             value="LAST_UPDATE_LOGIN" />
<element name="ENCRYPTED_FOUNDATION_PASSWORD" value="ENCRYPTED_FOUNDATION_PASSWORD" />
<element name="ENCRYPTED_USER_PASSWORD"       value="ENCRYPTED_USER_PASSWORD" />
<element name="SESSION_NUMBER"                value="SESSION_NUMBER" />
<element name="START_DATE"                    value="START_DATE" />
<element name="END_DATE"                      value="END_DATE" />
<element name="DESCRIPTION"                   value="DESCRIPTION" />
<element name="LAST_LOGON_DATE"               value="LAST_LOGON_DATE" />
<element name="PASSWORD_DATE"                 value="PASSWORD_DATE" />
<element name="PASSWORD_ACCESSES_LEFT"        value="PASSWORD_ACCESSES_LEFT" />
<element name="PASSWORD_LIFESPAN_ACCESSES"    value="PASSWORD_LIFESPAN_ACCESSES" />
<element name="PASSWORD_LIFESPAN_DAYS"        value="PASSWORD_LIFESPAN_DAYS" />
<element name="EMPLOYEE_ID"                   value="EMPLOYEE_ID" />
<element name="EMAIL_ADDRESS"                 value="EMAIL_ADDRESS" />
<element name="FAX"                           value="FAX" />
<element name="CUSTOMER_ID"                   value="CUSTOMER_ID" />
<element name="SUPPLIER_ID"                   value="SUPPLIER_ID" />
<element name="WEB_PASSWORD"                  value="WEB_PASSWORD" />
<element name="USER_GUID"                     value="USER_GUID" />
<element name="GCN_CODE_COMBINATION_ID"       value="GCN_CODE_COMBINATION_ID" />
<element name="PERSON_PARTY_ID"               value="PERSON_PARTY_ID" />     

OAF: Передача параметра с кириллицей в URL

27 Октябрь 2014 Нет комментариев

Oracle Application Framework: Пример кода для передачи параметра с кириллицей в URL.

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import oracle.apps.fnd.framework.OANLSServices;
import oracle.apps.fnd.framework.server.OAApplicationModuleImpl;
...
OAApplicationModuleImpl am = (OAApplicationModuleImpl)pageContext.getApplicationModule(webBean);  
OANLSServices nls = am.getOADBTransaction().getOANLSServices();
           
try {
         pAssignmentSet = URLEncoder.encode(pAssignmentSet, nls.getJAVAClientEncoding());
     
    } catch (UnsupportedEncodingException e) {
        throw new OAException(e.getMessage());
    }
...

OEBS API: Деактивация контрагента в HZ_PAPTIES (тип person)

6 Октябрь 2014 Нет комментариев

Пример использования API для перевода контрагента (таблица HZ_PAPTIES) с типом “PERSON” в статус “Неактивно”:

declare
  p_party_id      number := 17323325;
  --
  l_person_rec  HZ_PARTY_V2PUB.PERSON_REC_TYPE;
  l_party_rec   HZ_PARTY_V2PUB.PARTY_REC_TYPE;
  l_object_version_number number;
  --
  x_profile_id    NUMBER;
  x_return_status VARCHAR2(1);
  x_msg_count     NUMBER;
  x_msg_data      VARCHAR2(4000);  
begin
  
  fnd_global.apps_initialize(-1, 20639, 200); --Диспетчер кредиторов - Кредиторы
 
  l_party_rec.party_id   := p_party_id;
  l_party_rec.status     := 'I';
  
  l_person_rec.party_rec := l_party_rec;
 
  select hp.object_version_number into l_object_version_number
  from hz_parties hp where hp.party_id = l_party_rec.party_id;
  
  hz_party_v2pub.update_person (
      p_init_msg_list                    => fnd_api.g_false,
      p_person_rec                       => l_person_rec,
      p_party_object_version_number      => l_object_version_number,
      x_profile_id                       => x_profile_id,
      x_return_status                    => x_return_status,
      x_msg_count                        => x_msg_count,
      x_msg_data                         => x_msg_data
      );
      
  dbms_output.put_line(x_return_status);
  if (x_return_status <> 'S') then
    fnd_msg_pub.count_and_get(p_encoded => fnd_api.g_false,
                              p_count   => x_msg_count,
                              p_data    => x_msg_data);
 
    dbms_output.put_line('ERROR update for party_id='||l_party_rec.party_id||':');
 
    if x_msg_count = 1 then
      dbms_output.put_line(x_msg_data);
    else
      FOR i IN 1 .. x_msg_count LOOP
        dbms_output.put_line(fnd_msg_pub.get(fnd_msg_pub.g_next,
                                             fnd_api.g_false));
      END LOOP;
    end if;
  end if;
 
  commit;      
end;

OEBS API: Деактивация контрагента в HZ_PAPTIES (тип organization)

6 Октябрь 2014 Нет комментариев

Пример использования API для перевода контрагента (таблица HZ_PAPTIES) с типом «organization» в статус “Неактивно”:

declare
  p_party_id      number := 2661479911;
  --  
  l_organization_rec  HZ_PARTY_V2PUB.ORGANIZATION_REC_TYPE;
  l_party_rec         HZ_PARTY_V2PUB.PARTY_REC_TYPE;
  l_object_version_number number;
  --
  x_profile_id    NUMBER;  
  x_return_status VARCHAR2(1);
  x_msg_count     NUMBER;
  x_msg_data      VARCHAR2(4000);  
begin
  
  fnd_global.apps_initialize(-1, 20639, 200); --Диспетчер кредиторов - Кредиторы

  l_party_rec.party_id  := p_party_id;
  l_party_rec.status    := 'I';
  l_organization_rec.party_rec := l_party_rec;
  
  select hp.object_version_number into l_object_version_number 
  from hz_parties hp where hp.party_id = l_party_rec.party_id;
    
  HZ_PARTY_V2PUB.update_organization(p_init_msg_list               => fnd_api.g_false,
                                     p_organization_rec            => l_organization_rec,
                                     p_party_object_version_number => l_object_version_number,
                                     x_profile_id                  => x_profile_id,
                                     x_return_status               => x_return_status,
                                     x_msg_count                   => x_msg_count,
                                     x_msg_data                    => x_msg_data);
      
  dbms_output.put_line(x_return_status);
  if (x_return_status <> 'S') then
    fnd_msg_pub.count_and_get(p_encoded => fnd_api.g_false,
                              p_count   => x_msg_count,
                              p_data    => x_msg_data);
                                      
    dbms_output.put_line('ERROR update for party_id='||l_party_rec.party_id||':');
     
    if x_msg_count = 1 then
      dbms_output.put_line(x_msg_data);
    else
      FOR i IN 1 .. x_msg_count LOOP
        dbms_output.put_line(fnd_msg_pub.get(fnd_msg_pub.g_next,
                                             fnd_api.g_false));
      END LOOP;
    end if;
  end if;
  
  commit;
                             
end;


OEBS API: Деактивация счета заказчика

1 Октябрь 2014 Нет комментариев

Пример использования API для перевода счета заказчика в статус «Неактивно» — деактивация счета заказчика.

declare
  l_cust_account_rec hz_cust_account_v2pub.cust_account_rec_type;
  l_object_version_number number;
  --
  x_return_status varchar2(1);
  x_msg_data      varchar2(4000);
  x_msg_count     number;
begin
  l_cust_account_rec := null;
  l_cust_account_rec.cust_account_id := 9787987;
  l_cust_account_rec.status := 'I';
  
  select ca.object_version_number into l_object_version_number 
  from hz_cust_accounts ca 
  where cust_account_id = l_cust_account_rec.cust_account_id;
  -- Call the procedure
  hz_cust_account_v2pub.update_cust_account(p_init_msg_list         => 'T',
                                            p_cust_account_rec      => l_cust_account_rec,
                                            p_object_version_number => l_object_version_number,
                                            x_return_status         => x_return_status,
                                            x_msg_count             => x_msg_count,
                                            x_msg_data              => x_msg_data);
                                            
  dbms_output.put_line('x_return_status='||x_return_status);   
  commit;                                         
end;

Oracle SQL*Loader

SQL*Loader — мощный инструмент для импорта различных данных из файла в базу данных.
Если надо загрузить что-либо из файла в БД, то этот инструмент, как раз то что вам поможет.

Возможности SQL*Loader

  • Загрузка данных из разных файлов в одной сессии
  • Загрузка данных в разные таблицы в одной сессии
  • Указание кодировки файла данных
  • Использование SQL функций перед загрузкой
  • Генерация уникальных ключей для колонок
  • Ограничение вставляемых данных по условию
  • Загрузка двоичных данных
  • Запись ошибочных данных в файл ошибок


Читать дальше про “Oracle SQL*Loader” »