Архив

Архив раздела ‘Oracle e-Business Suite’

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;


Oracle SQL*Loader

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

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

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


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

Scalability Options для XML Publisher Reports

Если при построении отчета XML Publisher Reports получили ошибку типа:
****Warning!!! Due to high volume of data, got out of memory exception…***
****Please retry with scalable option or modify the Data template to run in scalable mode…***

то могут помочь следующие параметры:

Заходим в параллельную программу и в поле «Параметры» ставим одно из значений

(a) -Xmx512m -Xss1024k
(b) -Xmx512m -Xss2048k
(c) -Xmx512m -Xss4096k
(d) -Xmx1024m -Xss1024k
(e) -Xmx1024m -Xss2048k
(f) -Xmx1024m -Xss4096k

-Xmx (-mx): maximum heap size
-Xss : Java stack size

OAF: Поиск страниц с отключенной персонализацией

Запрос для поиска страниц или регионов OEBS OAF с отключенной персонализацией:

select *
from (select att.att_value base_path
            ,jdr_mds_internal.getDocumentName(pat.path_docid) custom_path
            ,regexp_replace(jdr_mds_internal.getDocumentName(pat.path_docid),
                            '.*/customizations/([[:alpha:]]*)/.*',
                            '\1') custom_level
            ,decode(regexp_replace(jdr_mds_internal.getDocumentName(pat.path_docid),
                                   '.*/customizations/([[:alpha:]]*)/.*',
                                   '\1'),
                    'site',
                    'SITE',
                    (regexp_replace(jdr_mds_internal.getDocumentName(pat.path_docid),
                                    '.*/customizations/([[:alpha:]]*)/([0-9A-Za-z_]*)/.*',
                                    '\2'))) custom_level_value
            ,nvl((select 'N'
                 from jdr_attributes cat
                 where cat.att_comp_docid = pat.path_docid
                       and cat.att_name = 'MDSActiveDoc'
                       and cat.att_value = 'false'),
                 'Y') is_active
            ,pat.created_by
            ,pat.creation_date
            ,pat.last_updated_by
            ,pat.last_update_login
            ,pat.LAST_UPDATE_DATE
      from jdr_paths pat
      join jdr_attributes att on (pat.path_docid = att.att_comp_docid)
      where att_comp_seq = 0
            and att_name = 'customizes'
      --and regexp_like( jdr_mds_internal.getDocumentName(path_docid), 'apps/(iby|fnd)' )
      )
where is_active = 'N'

Читать дальше про “OAF: Поиск страниц с отключенной персонализацией” »

OEBS Изменить сообщение ORACLE FORMS

Как в OEBS изменить системное сообщение ORACLE FORMS.
Например, «FRM-41830 LOV не содержит входов» на какое-нибудь другое.

1)  Необходимо заменить файл fmfru.msb по адресу
    /r12/…/apps/tech_st/10.1.2/forms/mesg

2) перезагрузить OC4J

    cd $ADMIN_SCRIPTS_HOME

    adoacorectl.sh stop

    adoacorectl.sh start

Новое сообщение по длине символов должно быть равно исходному сообщению.

FMDUS.MSB contains default (American) Developer messages
FMGUS.MSB contains default (American) Generate messages
FMFUS.MSB contains default (American) Runform messages

Скрипт обновления параметров профиля

28 Апрель 2014 Нет комментариев

Скрипт обновления параметров профиля. В данном примере изменяется поле SQL_VALIDATION.

declare
  l_sql VARCHAR2(4000);
begin
           
  l_sql := 'SQL="SELECT LOOKUP_CODE, MEANING \"Включить проверку\"
            INTO :PROFILE_OPTION_VALUE, :VISIBLE_OPTION_VALUE
            FROM FND_LOOKUP_VALUES_VL
            WHERE LOOKUP_TYPE = ''!!!LOOKUP_NAME''
                  AND ENABLED_FLAG = ''Y''
                  AND SYSDATE BETWEEN NVL(START_DATE_ACTIVE,SYSDATE)
                      AND NVL(END_DATE_ACTIVE,SYSDATE)
            ORDER BY MEANING"
            COLUMN="\"Включить проверку\"(20)"';

  for i in (select profile_option_name
                 , user_profile_option_name
                 , start_date_active
                 , end_date_active
                 , user_changeable_flag
                 , user_visible_flag
                 , read_allowed_flag
                 , write_allowed_flag
                 , site_enabled_flag
                 , site_update_allowed_flag
                 , app_enabled_flag
                 , app_update_allowed_flag
                 , resp_enabled_flag
                 , resp_update_allowed_flag
                 , user_enabled_flag
                 , user_update_allowed_flag
                 , (select a.application_short_name 
                    from fnd_application a 
                    where a.application_id = t.application_id
                    ) as appl_short_name
            from fnd_profile_options_vl t
            where profile_option_name like '!!!%'
          )
  loop
   dbms_output.put_line('update '||i.profile_option_name);
   fnd_profile_options_pkg.load_row (
                   x_profile_name             => i.profile_option_name,
                   x_owner                    => '!!!XX',
                   x_application_short_name   => i.appl_short_name,
                   x_user_profile_option_name => i.user_profile_option_name,
                   x_description              => i.user_profile_option_name,
                   x_user_changeable_flag     => i.user_changeable_flag,
                   x_user_visible_flag        => i.user_visible_flag,
                   x_read_allowed_flag        => i.read_allowed_flag,
                   x_write_allowed_flag       => i.write_allowed_flag,
                   x_site_enabled_flag        => i.site_update_allowed_flag,
                   x_site_update_allowed_flag => i.site_update_allowed_flag,
                   x_app_enabled_flag         => i.app_enabled_flag,
                   x_app_update_allowed_flag  => i.app_update_allowed_flag,
                   x_resp_enabled_flag        => i.resp_enabled_flag,
                   x_resp_update_allowed_flag => i.resp_update_allowed_flag,
                   x_user_enabled_flag        => i.user_enabled_flag,
                   x_user_update_allowed_flag => i.user_update_allowed_flag,
                   x_start_date_active        => to_char(i.start_date_active,'YYYY/MM/DD'),
                   x_end_date_active          => to_char(i.end_date_active,'YYYY/MM/DD'),
                   x_sql_validation           => l_sql
                                    );
    dbms_output.put_line('done');
  end loop;
  
end;

API Модуль AP: Отмена счет-фактуры

Пример использования API для отмены счет-фактуры

declare
  l_result               BOOLEAN;
  l_all_count            NUMBER := 0;
  l_not_cancel_count     NUMBER := 0;
  l_error_count          NUMBER := 0;  
  l_successful_count     NUMBER := 0;    
  --
  lx_error_code  VARCHAR2(100);
  lx_debug_info  VARCHAR2(400);
  --
  lx_message_name                VARCHAR2(400);
  lx_invoice_amount              NUMBER;
  lx_base_amount                 NUMBER;
  lx_temp_cancelled_amount       NUMBER;
  lx_cancelled_by                NUMBER;
  lx_cancelled_amount            NUMBER;
  lx_cancelled_date              DATE;
  lx_last_update_date            DATE;
  lx_original_prepayment_amount  NUMBER;
  lx_pay_curr_invoice_amount     NUMBER;
  lx_token                       VARCHAR2(400);    
begin
  fnd_global.apps_initialize(-1, 20639, 200); --Диспетчер кредиторов - Кредиторы
  mo_global.init('SQLAP');
  
  for i in (select i.invoice_id, i.invoice_num
            from ap_invoices_all i
            where 1=1
                  ...
                  --and rownum<=5
            )
  loop
    l_all_count := l_all_count + 1;
    l_result :=ap_cancel_pkg.is_invoice_cancellable( p_invoice_id       => i.invoice_id,
                                                     p_error_code       => lx_error_code,   
                                                     p_debug_info       => lx_debug_info,
                                                     p_calling_sequence => NULL
                                                   );
    if NOT l_result then
      l_not_cancel_count:= l_not_cancel_count+ 1;
      dbms_output.put_line ('Invoice '||i.invoice_num||' is not cancellable' );
      continue;
    end if;
          
    l_result := ap_cancel_pkg.ap_cancel_single_invoice(
        p_invoice_id                 => i.invoice_id,
        p_last_updated_by            => fnd_global.user_id,
        p_last_update_login          => fnd_global.login_id,
        p_accounting_date            => sysdate,
        p_message_name               => lx_message_name,
        p_invoice_amount             => lx_invoice_amount,
        p_base_amount                => lx_base_amount,
        p_temp_cancelled_amount      => lx_temp_cancelled_amount,
        p_cancelled_by               => lx_cancelled_by,
        p_cancelled_amount           => lx_cancelled_amount,
        p_cancelled_date             => lx_cancelled_date,
        p_last_update_date           => lx_last_update_date,
        p_original_prepayment_amount => lx_original_prepayment_amount,
        p_pay_curr_invoice_amount    => lx_pay_curr_invoice_amount,
        p_token                      => lx_token,
        p_calling_sequence           => NULL
                                                     );
    if NOT l_result  then
      l_error_count := l_error_count + 1;
      dbms_output.put_line('Error for invoice '||i.invoice_num||':'||lx_message_name);
      continue;
    else
      dbms_output.put_line('Successfully cancelled the invoice '||i.invoice_num );
      l_successful_count := l_successful_count + 1;
    end if;   

  end loop;
  
  commit;
  
  dbms_output.put_line('');
  dbms_output.put_line('----------------------------------------');
  dbms_output.put_line('Total info:');
  dbms_output.put_line('----------------------------------------');  
  dbms_output.put_line('         ALL COUNT = '||l_all_count);
  dbms_output.put_line('IS NOT CANCELLABLE = '||l_not_cancel_count);  
  dbms_output.put_line('       ERROR COUNT = '||l_error_count);  
  dbms_output.put_line('  SUCCESSFUL COUNT = '||l_successful_count);  
  dbms_output.put_line('----------------------------------------');

end;

Поля STATUS_CODE и PHASE_CODE из FND_CONCURRENT_REQUESTS

14 Октябрь 2013 Нет комментариев

Расшифровка STATUS_CODE и PHASE_CODE из таблицы канкарентов FND_CONCURRENT_REQUESTS

PHASE_CODE:

select  lookup_code
       ,max(decode(LANGUAGE, 'RU',meaning,null )) as meaning_ru
       ,max(decode(LANGUAGE, 'US',meaning,null )) as meaning_us
from apps.FND_LOOKUP_VALUES
where lookup_type = 'CP_PHASE_CODE'
      and VIEW_APPLICATION_ID = 0
group by lookup_code;
LOOKUP_CODE MEANING_RU MEANING_US
R Выполнение Running
P Отложено Pending
I Неактивно Inactive
C Завершено Completed

STATUS_CODE:

select  lookup_code
       ,max(decode(LANGUAGE, 'RU',meaning,null )) as meaning_ru
       ,max(decode(LANGUAGE, 'US',meaning,null )) as meaning_us
from apps.FND_LOOKUP_VALUES
where lookup_type = 'CP_STATUS_CODE'
      and VIEW_APPLICATION_ID = 0
group by lookup_code;
LOOKUP_CODE MEANING_RU MEANING_US
W Пауза Paused
R   Обычное   Normal
U Отключено Disabled
H Заблокирован On Hold
P Запланировано Scheduled
I  Обычное  Normal
D Отменено Cancelled
M Нет диспетчера No Manager
Q Резервный Standby
C Обычный Normal
B Возобновлен Resuming
X Прекращено Terminated
T Прекращение Terminating
A Ожидание Waiting
Z  Ожидание  Waiting
E Ошибка Error
S Приостановлено Suspended
G Предупреждение Warning

 

Читать дальше про “Поля STATUS_CODE и PHASE_CODE из FND_CONCURRENT_REQUESTS” »

OAF: Вывести список VO и значения атрибутов

22 Август 2013 Нет комментариев

Вывести все View Objects (VO) и значения атрибутов для OAApplicationModule

    // Вывод всех значений VO
    public void printALLVO(OAApplicationModule am)
    {
      OADBTransaction tr = am.getOADBTransaction();
      if(tr.isLoggingEnabled(1)) 
      {
        tr.writeDiagnostics(this.getClass().getName() + ".printALLVO XX", " ",1);
        tr.writeDiagnostics(this.getClass().getName() + ".printALLVO XX", " AM "+am.getName(), 1);
      }
      String[] rootViewNames = am.getViewObjectNames();
      if(tr.isLoggingEnabled(1)) 
      {  
        tr.writeDiagnostics(this.getClass().getName() + ".printALLVO XX", " count of VOs from AM = " +rootViewNames.length,1 );
      }
      for (int j =0 ;j < rootViewNames.length ;j++ )
      {
        if(tr.isLoggingEnabled(1)) 
        {  
          tr.writeDiagnostics(this.getClass().getName() + ".printALLVO XX", " ",1);
          tr.writeDiagnostics(this.getClass().getName() + ".printALLVO XX", "================",1);
          tr.writeDiagnostics(this.getClass().getName() + ".printALLVO XX", " VO "+rootViewNames[j],1 );
        }
     
        oracle.jbo.ViewObject lVO = (oracle.jbo.ViewObject)am.findViewObject(rootViewNames[j]);
        if (lVO!=null && lVO.isExecuted()) {
          oracle.jbo.server.ViewRowImpl lVORow;
          int numRow = 1;
          for(lVORow = (oracle.jbo.server.ViewRowImpl)lVO.first(); lVORow != null;
              lVORow = (oracle.jbo.server.ViewRowImpl)lVO.next())
          {
              if (lVORow!=null) {
                  int attrCount = lVORow.getAttributeCount();
                  if(tr.isLoggingEnabled(1)) 
                  {              
                    tr.writeDiagnostics(this.getClass().getName() + ".printALLVO XX", " ",1);
                    tr.writeDiagnostics(this.getClass().getName() + ".printALLVO XX", " [row "+numRow+"]",1);
                    tr.writeDiagnostics(this.getClass().getName() + ".printALLVO XX", " count of attributes = "+attrCount,1);
                  }
     
                  String[] attributeNames = lVORow.getAttributeNames();
                  for (int i = 0 ;i< attributeNames.length ;i++ )
                  {
                    if(tr.isLoggingEnabled(1)) 
                    {              
                      tr.writeDiagnostics(this.getClass().getName() + ".printALLVO XX", attributeNames[i]
                      +" = "
                      +lVORow.getAttribute(i),1);
                    }
                  }
              }
              numRow ++;
          }
          if (numRow==1) {
            if(tr.isLoggingEnabled(1)) 
            {          
              tr.writeDiagnostics(this.getClass().getName() + ".printALLVO XX", " not exists rows",1);
            }
          }
        }
        else {
          if(tr.isLoggingEnabled(1)) 
          {                
            tr.writeDiagnostics(this.getClass().getName() + ".printALLVO XX", " not executed",1);
          }
        }
      }              
     
    }

Цикл по вложенным Application Modules (текущий AM не входит во вложенные AM)

String nestedAMArray[]=oapagecontext.getRootApplicationModule().getApplicationModuleNames();
for(int i = 0; i < nestedAMArray.length; i++)
{
    String amName = nestedAMArray[i];
    OAApplicationModule amIter = (OAApplicationModule)am.findApplicationModule(amName);
    oapagecontext.writeDiagnostics(this,"Nested AM Name=>"+amName,1);
}    

OAF: Как получить дочерний Application Module

22 Август 2013 Нет комментариев

Пример получения дочернего Application Module (AM) из контроллера

// Возвращает дочерний AM по его названию
public static OAApplicationModule getRequestedAM(OAPageContext oapagecontext,
                                                 String requestedAMName
                                                )  
{  
  OAApplicationModule rootAM    = oapagecontext.getRootApplicationModule();
  OAApplicationModule currentAM = null;  
  oapagecontext.writeDiagnostics(oapagecontext, "XX find applicationModule = "
                                                +requestedAMName,1);  
  String amName = "";  
  String nestedAMArray[] = rootAM.getApplicationModuleNames();  
  oapagecontext.writeDiagnostics(oapagecontext,"XX Root AM = "
                                 + rootAM.getName()
                                 + "; count child AMs = "
                                 + nestedAMArray.length,1);  
  for(int i = 0; i < nestedAMArray.length; i++)  
  {  
      amName = nestedAMArray[i];  
      currentAM = (OAApplicationModule)rootAM.findApplicationModule(amName); 
      String originalAmName = currentAM.getDefName();
      oapagecontext.writeDiagnostics(oapagecontext,"XX nested AM name = "
                                     +originalAmName,1);  
      if (originalAmName.equals(requestedAMName)) {
        oapagecontext.writeDiagnostics(oapagecontext,"XX found nested AM " 
                                       + originalAmName ,1);  
        break;  
      }  
  }  
  return currentAM;  
}