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, но она показывает данные только для текущей схемы.
Вывод промежутка времени в часах,минутах, секундах (hh:mi:ss)
Скрипт с примером вывода промежутка времени в часах,минутах, секундах (hh:mi:ss)
SET SERVEROUTPUT ON declare l_point1 NUMBER; l_point2 NUMBER; l_diff NUMBER; l_time_s NUMBER; -- Возвращает затраченное время в секундах function get_time_diff(p_time number) return number is begin return round( p_time/100 , 0); end get_time_diff; -- Возвращает секунды function get_time_diff_ss(p_all_time number) return number is begin return round(mod(p_all_time,60),0); end get_time_diff_ss; -- Возвращает минуты function get_time_diff_mi(p_all_time number) return number is begin return mod(floor(p_all_time/60),60); end get_time_diff_mi; -- Возвращает часы function get_time_diff_hh(p_all_time number) return number is begin return floor(p_all_time/(60*60)); end get_time_diff_hh; -- Возвращает разницу в hh:mi:ss function get_time_diff_hhmiss(p_all_time number) return varchar2 is l_time_s NUMBER; begin l_time_s := round( p_all_time/100 , 0); return lpad( floor(round(l_time_s /3600,2)) ,2,'0') ||':'||lpad( mod(floor(l_time_s /60),60) ,2,'0') ||':'||lpad( round(mod(l_time_s ,60),0) ,2,'0'); end get_time_diff_hhmiss; begin l_point1 := dbms_utility.get_time(); dbms_lock.sleep(5); l_point2 := dbms_utility.get_time(); l_diff := l_point2 - l_point1; l_time_s := get_time_diff(l_diff); dbms_output.put_line('весь период времени в секундах = '|| l_time_s || 's'); dbms_output.put_line('только секунды = '|| get_time_diff_ss(l_time_s)||'s' ); dbms_output.put_line('только минуты = '|| get_time_diff_mi(l_time_s)||'m' ); dbms_output.put_line('только часы = '|| get_time_diff_hh(l_time_s)||'h' ); dbms_output.put_line('h:m:s = '|| get_time_diff_hh(l_time_s)||'h:' ||get_time_diff_mi(l_time_s) ||'m:'||get_time_diff_ss(l_time_s)||'s' ); dbms_output.put_line('hh:mi:ss = '|| lpad(get_time_diff_hh(l_time_s),2,'0') ||':'||lpad(get_time_diff_mi(l_time_s),2,0) ||':'||lpad(get_time_diff_ss(l_time_s),2,'0') ); dbms_output.put_line('get_time_diff_hhmiss = '|| get_time_diff_hhmiss(l_diff)); end; / весь период времени в секундах = 5s только секунды = 5s только минуты = 0m только часы = 0h h:m:s = 0h:0m:5s hh:mi:ss = 00:00:05 get_time_diff_hhmiss = 00:00:05
OEBS API: Добавляем счет на отделение поставщика
Скрипт добавления(назначения) счета на отделение заказчика.
В данном примере счета копируются из одного отделения в другое.
DECLARE p_org_id_from number := 111; p_org_id_to number := 112; -- l_payee_rec iby_disbursement_setup_pub.payeecontext_rec_type; l_pay_instr_rec iby_fndcpt_setup_pub.pmtinstrument_rec_type; l_pay_assign_rec iby_fndcpt_setup_pub.pmtinstrassignment_rec_type; -- x_assign_id NUMBER; x_return_status VARCHAR2(1); x_msg_count NUMBER; x_msg_data VARCHAR2(4000); x_response apps.iby_fndcpt_common_pub.result_rec_type; BEGIN FND_MSG_PUB.initialize; fnd_global.apps_initialize(-1, 20639, 200); --Диспетчер кредиторов - Кредиторы for i in ( SELECT sup.vendor_type_lookup_code , sup.vendor_id , ss.party_site_id , ss2.party_site_id party_site_id_to , ss.vendor_site_id vendor_site_id_from , ss2.vendor_site_id vendor_site_id_to , sup.party_id , sup.segment1 , sup.vendor_name , epa.org_id , ss.vendor_site_code , piu.order_of_preference priority , eba.ext_bank_account_id , eba.bank_id , eba.branch_id , eba.country_code , eba.bank_account_name , eba.bank_account_num , eba.currency_code , eba.foreign_payment_use_flag , eba.payment_factor_flag FROM apps.ap_suppliers sup , apps.ap_supplier_sites_all ss , apps.ap_supplier_sites_all ss2 , apps.iby_external_payees_all epa , apps.iby_pmt_instr_uses_all piu , apps.iby_ext_bank_accounts eba WHERE sup.vendor_id = ss.vendor_id AND ss.vendor_site_id = epa.supplier_site_id and ss2.vendor_id = sup.vendor_id and ss2.vendor_site_code = ss.vendor_site_code and ss2.org_id = p_org_id_to AND epa.ext_payee_id = piu.ext_pmt_party_id AND piu.instrument_id = eba.ext_bank_account_id AND epa.org_id = p_org_id_from and not exists (select 1 from apps.iby_external_payees_all epa1 , apps.iby_pmt_instr_uses_all piu1 , apps.iby_ext_bank_accounts eba1 where 1=1 and epa1.supplier_site_id = ss2.vendor_site_id and epa1.ext_payee_id = piu1.ext_pmt_party_id and piu1.instrument_id = eba1.ext_bank_account_id and eba1.ext_bank_account_id = eba.ext_bank_account_id ) ) loop dbms_output.put_line('sup.vendor_id='||i.vendor_id); x_response := null; -- l_payee_rec.Party_Id := i.party_id; l_payee_rec.Payment_Function := 'PAYABLES_DISB'; l_payee_rec.Party_Site_id := i.party_site_id_to; l_payee_rec.Supplier_Site_id := i.vendor_site_id_to; l_payee_rec.Org_Id := p_org_id_to; l_payee_rec.Org_Type := 'OPERATING_UNIT'; -- Instrument Record. l_pay_instr_rec.Instrument_Type := 'BANKACCOUNT'; l_pay_instr_rec.Instrument_Id := i.ext_bank_account_id; -- Assignment Record. l_pay_assign_rec.Instrument := l_pay_instr_rec; l_pay_assign_rec.Priority := i.priority; l_pay_assign_rec.Start_Date := trunc(sysdate); iby_disbursement_setup_pub.set_payee_instr_assignment( p_api_version => 1.0, p_init_msg_list => 'T', p_commit => 'F', x_return_status => x_return_status, x_msg_count => x_msg_count, x_msg_data => x_msg_data, p_payee => l_payee_rec, p_assignment_attribs => l_pay_assign_rec, x_assign_id => x_assign_id, x_response => x_response); dbms_output.put_line('x_return_status='||x_return_status); dbms_output.put_line('out_mesg.Result_Code ='||x_response.Result_Code); dbms_output.put_line('out_mesg.Result_Category ='||x_response.Result_Category); dbms_output.put_line('out_mesg.Result_Message ='||x_response.Result_Message); 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(chr(10)||'x_msg_count='||x_msg_count); if x_msg_count = 1 then dbms_output.put_line(x_msg_data); else FOR j 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; end loop; commit; end;
Доп. информацию можно прочитать в ноте How to create bank account through API and associate to multiple supplier sites. [ID 1299614.1]
OEBS API: Добавление записи в lookup
Пример использования API для добавление записи в код поиска (lookup):
declare lx_rowid rowid; begin for i in (select 'TEST' as lookup_code, 'TEST' as meaning, null as tag, 'TEST' as descr, sysdate as start_date_active, null as end_date_active from dual t ) loop -- Call the procedure fnd_lookup_values_pkg.insert_row(x_rowid => lx_rowid, x_lookup_type => 'LOOKUP_TYPE_NAME', x_security_group_id => 0, x_view_application_id => 3, x_lookup_code => i.lookup_code, x_tag => i.tag, x_attribute_category => null, x_attribute1 => null, x_attribute2 => null, x_attribute3 => null, x_attribute4 => null, x_enabled_flag => 'Y', x_start_date_active => i.start_date_active, x_end_date_active => i.end_date_active, x_territory_code => null, x_attribute5 => null, x_attribute6 => null, x_attribute7 => null, x_attribute8 => null, x_attribute9 => null, x_attribute10 => null, x_attribute11 => null, x_attribute12 => null, x_attribute13 => null, x_attribute14 => null, x_attribute15 => null, x_meaning => i.meaning, x_description => i.descr, x_creation_date => sysdate, x_created_by => -1, x_last_update_date => sysdate, x_last_updated_by => -1, x_last_update_login => -1); end loop; commit; end; /
Список параметров процедуры SQL запросом
SQL запрос для получения списка параметров процедуры/функции
SELECT A.OBJECT_NAME, A.PACKAGE_NAME, A.ARGUMENT_NAME, A.DATA_TYPE, a.SEQUENCE FROM USER_ARGUMENTS A ,ALL_OBJECTS O WHERE A.OBJECT_ID = O.OBJECT_ID AND O.OBJECT_NAME = 'FND_GLOBAL' -- pkg AND A.OBJECT_NAME = 'APPS_INITIALIZE' -- procedure / OBJECT_NAME PACKAGE_NAME ARGUMENT_NAME DATA_TYPE SEQUENCE ----------------- ------------- ------------------- ----------- ---------- APPS_INITIALIZE FND_GLOBAL USER_ID NUMBER 1 APPS_INITIALIZE FND_GLOBAL RESP_ID NUMBER 2 APPS_INITIALIZE FND_GLOBAL RESP_APPL_ID NUMBER 3 APPS_INITIALIZE FND_GLOBAL SECURITY_GROUP_ID NUMBER 4 APPS_INITIALIZE FND_GLOBAL SERVER_ID NUMBER 5
API для обновления полномочий (RESPONSIBILITY)
Пример использования API для обновления даты действия полномочий
BEGIN FOR cr IN (SELECT * FROM fnd_responsibility_vl WHERE responsibility_key LIKE 'XX%' ) LOOP fnd_responsibility_pkg.update_row( x_responsibility_id => cr.responsibility_id, x_application_id => cr.application_id, x_web_host_name => cr.web_host_name, x_web_agent_name => cr.web_agent_name, x_data_group_application_id => cr.data_group_application_id, x_data_group_id => cr.data_group_id, x_menu_id => cr.menu_id, x_start_date => to_date('01-01-1951','dd-mm-yyyy'), x_end_date => cr.end_date, x_group_application_id => cr.group_application_id, x_request_group_id => cr.request_group_id, x_version => cr.VERSION, x_responsibility_key => cr.responsibility_key, x_responsibility_name => cr.responsibility_name, x_description => cr.description, x_last_update_date => SYSDATE, x_last_updated_by => fnd_global.user_id, x_last_update_login => fnd_global.login_id); END LOOP; COMMIT; END; /
AskTom in Moscow-2012
Удалось побывать на семинаре AskTom in Moscow-2012
и вот презентации с выступления Тома Кайта
What I learned at Oracle Open World 2012 | Depositfiles | Google Docs |
All About Oracle Database Security | Depositfiles | Google Docs |
What’s new in Oracle Database Application Development | Depositfiles | Google Docs |
Five Things about SQL and PL/SQL you might not have known about | Depositfiles | Google Docs |
Flashback | Depositfiles | Google Docs |
OAF R12 Developer’s guide
Весьма полезные гайды по Oracle Application Framework (OAF)
Ноты на металинке:
Oracle Application Framework Developer’s Guide Release 12.1.3 [ID 1107973.1]
Oracle Application Framework Developer’s Guide Release 12.1.2 [ID 972774.1]
Oracle Application Framework Developer’s Guide Release 12.1.1 [ID 744832.1]
У кого нет доступа, тот может взять
Oracle Application Framework Developer’s Guide Release 12.1.3 по ссылкам:
Depositfiles
Google Docs
OEBS API: Обновляем альтернативное имя отделения поставщика
Скрипт обновления альтернативного имени отделения поставщика.
В данном примере обнуляем альтернативное наименование.
SET SERVEROUTPUT ON SIZE 1000000 DECLARE x_return_status varchar2(1); x_msg_count number; x_msg_data varchar2(4000); -- l_vendor_site_rec AP_VENDOR_PUB_PKG.r_vendor_site_rec_type; -- l_success_count NUMBER := 0; l_failure_count NUMBER := 0; l_all_count NUMBER := 0; BEGIN fnd_global.apps_initialize(1, 20639, 200); --Диспетчер кредиторов - Кредиторы l_success_count := 0; l_failure_count := 0; l_all_count := 0; -- цикл по отделениям for s in (select t.vendor_site_id from ap_supplier_sites_all t where 1=1 and t.vendor_site_code like '%XX%' and vendor_site_code_alt is not null ) loop l_all_count := l_all_count + 1; -- обнуляем альт.имя l_vendor_site_rec.VENDOR_SITE_CODE_ALT := chr(0); -- ap_vendor_pub_pkg.update_vendor_site(p_api_version => 1.0, p_init_msg_list => fnd_api.g_true, p_commit => fnd_api.g_false, p_validation_level => fnd_api.g_valid_level_full, x_return_status => x_return_status, x_msg_count => x_msg_count, x_msg_data => x_msg_data, p_vendor_site_rec => l_vendor_site_rec, p_vendor_site_id => s.vendor_site_id); if (x_return_status <> 'S') then l_failure_count := l_failure_count + 1; fnd_msg_pub.count_and_get(p_encoded => fnd_api.g_false, p_count => x_msg_count, p_data => x_msg_data); if x_msg_count = 1 then dbms_output.put_line('ERROR vendor_site_id='||s.vendor_site_id ||'"; '|| x_msg_data ); else FOR j IN 1 .. x_msg_count LOOP x_msg_data := fnd_msg_pub.get(fnd_msg_pub.g_next,fnd_api.g_false); dbms_output.put_line('ERROR vendor_site_id='||s.vendor_site_id ||'"; '|| x_msg_data ); END LOOP; end if; else l_success_count := l_success_count + 1; end if; end loop; -- s dbms_output.put_line('+--------------------------------------+'); dbms_output.put_line('UPDATE INFORMATION'); dbms_output.put_line(' All count : '||l_all_count); dbms_output.put_line(' Update success : '||l_success_count); dbms_output.put_line(' Update failure : '||l_failure_count); dbms_output.put_line('+--------------------------------------+'); commit; END;
Последние комментарии