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

OEBS Генерация параметров запуска канкарента

Скрипт генерации параметров запуска канкарента

declare
 p_conc_code VARCHAR2(100) := 'AFBFULDL';
 --
 l_space_num number := 40;
 l_space varchar2(100) := lpad(' ',l_space_num,' ');
 l_appl_code varchar2(50);
 l_conc_prog_rec fnd_concurrent_programs_vl%rowtype;
 
begin
 
 select * into l_conc_prog_rec from fnd_concurrent_programs_vl t
 where concurrent_program_name = p_conc_code;
 
 select application_short_name into l_appl_code
 from fnd_application a where a.application_id = l_conc_prog_rec.application_id;
 
 dbms_output.put_line('-- '||l_conc_prog_rec.USER_CONCURRENT_PROGRAM_NAME);
 dbms_output.put_line('p_req_id := fnd_request.submit_request( application => '''
                      ||l_appl_code ||''',');
 dbms_output.put_line(l_space||'program     => '''||p_conc_code||''',');
 dbms_output.put_line(l_space||'start_time  => null,');
 dbms_output.put_line(l_space||'description => null,');
 dbms_output.put_line(l_space||'sub_request => false,');   
 
 for p in (select max(rownum) over() as max_rownum
                 ,row_number() over(order by column_seq_num) as row_num, t.*
           from fnd_descr_flex_col_usage_vl t
           where descriptive_flexfield_name = '$SRS$.'||p_conc_code
                 and enabled_flag='Y'
           order by column_seq_num)
 loop
   dbms_output.put_line(l_space||rpad('argument'||p.row_num,12,' ')
                     ||'=> null'||case when p.row_num!=p.max_rownum then ',' else ' ' end
                     ||' -- '||'REQUIRED='||p.REQUIRED_FLAG
                     ||' '||nvl(p.description,p.form_left_prompt)
                     ||' ('||p.end_user_column_name||')'
                     || case when p.DEFAULT_VALUE is not null 
                         then ' DEFAULT_VALUE='||p.DEFAULT_VALUE
                        end
                     );
 end loop;
 dbms_output.put_line(lpad(' ',l_space_num-2,' ')||');');  
 
end;

-- Пример вывода
-- Диспетчер масс-обработки файлов
p_req_id := fnd_request.submit_request( application => 'FND',
                                        program     => 'AFBFULDL',
                                        start_time  => null,
                                        description => null,
                                        sub_request => false,
                                        argument1   => null, -- REQUIRED=N Имя файла (File Name)
                                        argument2   => null, -- REQUIRED=N Тип содержимого файла (File Content Type)
                                        argument3   => null, -- REQUIRED=N Имя программы (Program Name)
                                        argument4   => null, -- REQUIRED=N Тег программы (Program Tag)
                                        argument5   => null, -- REQUIRED=N Язык (Language)
                                        argument6   => null, -- REQUIRED=N Формат файла (File Format)
                                        argument7   => null, -- REQUIRED=N Режим (upload/download или upload_help/download_help) (Mode)
                                        argument8   => null, -- REQUIRED=Y Загрузка/выгрузка каталога (Directory)
                                        argument9   => null, -- REQUIRED=N Создание каталога в случае его отсутствия (Create Directory) DEFAULT_VALUE=true
                                        argument10  => null, -- REQUIRED=N Переопределение каталога для выгрузки в случае, если выгружаемый файл является абсолютным (Override Directory) DEFAULT_VALUE=false
                                        argument11  => null, -- REQUIRED=N Конец строки (Line Break)
                                        argument12  => null, -- REQUIRED=N Заголовок (Title)
                                        argument13  => null  -- REQUIRED=N Имя контрольного значения (Target Name)
                                      );

Дополнительный код для запуска параллельной программы

declare 
  p_req_id    number;
  p_user_name varchar2(100) := '!!!USER_NAME';
  --
  l_user_id number;
begin
  select nvl(max(u.user_id),-1) into l_user_id from fnd_user u where u.user_name=p_user_name;
  fnd_global.apps_initialize(l_user_id, 20639, 200); --Диспетчер кредиторов - Кредиторы
 
  execute immediate 'alter session set NLS_LANGUAGE = ''RUSSIAN''';
  execute immediate 'alter session set NLS_DATE_FORMAT = ''DD.MM.YYYY HH24:MI:SS''';

  -- вставить запуск канкарента
  -- ...  
  
  dbms_output.put_line('p_req_id='||p_req_id);                                    
  commit;
end;
-- запрос для просмотра запущенного канкарента
-- select t.completion_text, t.* from APPLSYS.FND_CONCURRENT_REQUESTS t where t.request_id=

Мониторинг использования индексов

Если появилось желание проверить используется индекс или нет, то:

1) Сначала включаем мониторинг интересующих нас индексов

ALTER INDEX OWNER.INDEX_NAME MONITORING USAGE;

2) После того, как отработала программа, которая потенциально должна была использовать индекс, выполняем запрос

select io.name as index_name
      ,t.name  as table_name
      ,decode(bitand(i.flags, 65536), 0, 'NO', 'YES') as monitoring
      ,decode(bitand(ou.flags, 1), 0, 'NO', 'YES')    as used
      ,ou.start_monitoring as start_monitoring
      ,ou.end_monitoring   as end_monitoring
from sys.obj$         io
    ,sys.obj$         t
    ,sys.ind$         i
    ,sys.object_usage ou
where i.obj# = ou.obj#
      and io.obj# = ou.obj#
      and t.obj# = i.bo#;

3) Выключаем мониторинг индекса

ALTER INDEX OWNER.INDEX_NAME NOMONITORING USAGE;

Есть также view V$OBJECT_USAGE, но она показывает данные только для текущей схемы.