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

Определение четная или нечетная текущая неделя

Запрос определения четная или нечетная неделя относительно текущей даты

Используем маску ‘IW’ — Week of year (1-52 or 1-53) based on the ISO standard.

select case when mod(to_number(to_char(sysdate, 'IW')), 2) = 0 then
          'Четная неделя'
         else
          'Нечетная неделя'
       end cur_week
      ,to_number(to_char(sysdate, 'IW')) num_week
from dual


Oracle® Database SQL Language Reference 11g Release 2 (11.2) Table Datetime Format Elements

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

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” »

Регулярные выражения — оставить только цифры или буквы

28 Август 2013 8 comments

Пример использования регулярного выражения (regexp_replace)
— оставить только буквы
— оставить только цифры

with t as (select '#2 apps(0_-ORACLE+*.ru_ )ПРИ13мер' str from dual)
select str
     , regexp_replace(str,'[^[[:alpha:]]]*') as only_char
     , regexp_replace(str,'[^[[:digit:]]]*') as only_number
from t
/

STR                                 ONLY_CHAR                 ONLY_NUMBER
---------------------------------   ------------------------  --------------------
#2 apps(0_-ORACLE+*.ru_ )ПРИ13мер   appsORACLEruПРИмер        2013

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;  
}