OEBS API: Обновляем имя поставщика
Скрипт обновления имени и альтернативного имени поставщика.
Убираем лишние пробелы в конце и начале имени.
declare l_organization_rec HZ_PARTY_V2PUB.ORGANIZATION_REC_TYPE; l_party_rec HZ_PARTY_V2PUB.PARTY_REC_TYPE; x_profile_id NUMBER; -- l_success_count NUMBER := 0; l_failure_count NUMBER := 0; l_all_count NUMBER := 0; -- x_return_status VARCHAR2(1); x_msg_count NUMBER; x_msg_data VARCHAR2(4000); begin fnd_global.apps_initialize(1, 20639, 200); --Диспетчер кредиторов - Кредиторы for i in (SELECT vendor_id, vendor_name, vendor_name_alt, party_id, (select hp.object_version_number from hz_parties hp where party_id = pv.party_id ) as object_version_number FROM po_vendors pv WHERE 1=1 and (vendor_name like '% ' or vendor_name like ' %' or vendor_name_alt like '% ' or vendor_name_alt like ' %') ) loop l_all_count := l_all_count + 1; --dbms_output.put_line('vendor_id='||i.vendor_id); l_party_rec.party_id := i.party_id; l_organization_rec.organization_name := trim(i.vendor_name); l_organization_rec.organization_name_phonetic := trim(i.vendor_name); l_organization_rec.party_rec := l_party_rec; HZ_PARTY_V2PUB.update_organization(p_init_msg_list => FND_API.G_TRUE, p_organization_rec => l_organization_rec, p_party_object_version_number => i.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 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_id='||i.vendor_id ||'; vendor_name="'||i.vendor_name||'"; '|| 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_id='||i.vendor_id ||'; vendor_name="'||i.vendor_name||'"; '|| x_msg_data ); END LOOP; end if; else l_success_count := l_success_count + 1; end if; end loop; dbms_output.put_line('+--------------------------------------+'); dbms_output.put_line('Обновление поставщиков'); dbms_output.put_line(' Общее количество : '||l_all_count); dbms_output.put_line(' Обновлено успешно : '||l_success_count); dbms_output.put_line(' Не удалось обновить : '||l_failure_count); dbms_output.put_line('+--------------------------------------+'); COMMIT; end;
Oracle Создание PARTITION BY RANGE по полю DATE
Скрипт помогающий создать PARTITION BY RANGE по полю DATE
SET LINESIZE 150 SET SERVEROUTPUT ON SIZE 1000000 WHENEVER SQLERROR CONTINUE SPOOL C:\create_partition_date.log declare iter number; l_date_start date := to_date('01-11-2011','dd-mm-yyyy'); l_date_end date := to_date('01-01-2023','dd-mm-yyyy'); l_name_part varchar2(20) := 'TEST'; l_part_field varchar2(20) := 'MY_DATE'; begin dbms_output.put_line('PARTITION BY RANGE('||l_part_field||')'); dbms_output.put_line('('); dbms_output.put_line(' PARTITION '||l_name_part ||'_MIN VALUES LESS THAN (to_date(''' ||to_char(add_months(l_date_start,-1),'dd-mm-yyyy') ||''',''dd-mm-yyyy''))'); for j in ( with t as ( select l_date_start d1, l_date_end d2 from dual ) -- select decode(level,1,d1, trunc(add_months(d1,level-1),'mm') ) as date_from from t connect by add_months(trunc(d1,'mm'),level-1) <= d2 ) loop dbms_output.put_line(',PARTITION '||l_name_part||'_' ||to_char(add_months(j.date_from,-1),'mm_yyyy') ||' VALUES LESS THAN (to_date(''' ||to_char(j.date_from,'dd-mm-yyyy') ||''',''dd-mm-yyyy''))'); end loop; dbms_output.put_line(',PARTITION '||l_name_part ||'_MAX VALUES LESS THAN (MAXVALUE)'); dbms_output.put_line(')'); end; / spool off PARTITION BY RANGE(MY_DATE) ( PARTITION TEST_MIN VALUES LESS THAN (to_date('01-10-2011','dd-mm-yyyy')) ,PARTITION TEST_10_2011 VALUES LESS THAN (to_date('01-11-2011','dd-mm-yyyy')) ,PARTITION TEST_11_2011 VALUES LESS THAN (to_date('01-12-2011','dd-mm-yyyy')) ... ,PARTITION TEST_11_2022 VALUES LESS THAN (to_date('01-12-2022','dd-mm-yyyy')) ,PARTITION TEST_12_2022 VALUES LESS THAN (to_date('01-01-2023','dd-mm-yyyy')) ,PARTITION TEST_MAX VALUES LESS THAN (MAXVALUE) ) PL/SQL procedure successfully completed SQL> spool off Stopped spooling to C:\create_partition_date.log
OEBS API: Создание расчетного счета на отделении поставщика
Пример скрипта для создания расчетного счета на отделении поставщика:
DECLARE l_bank_acct_rec apps.iby_ext_bankacct_pub.extbankacct_rec_type; out_mesg apps.iby_fndcpt_common_pub.result_rec_type; l_acct NUMBER; l_bank_id NUMBER := 0; --!!! установить значение l_branch_id NUMBER := 0; --!!! l_acct_owner_party_id NUMBER := 0; --!!! l_supplier_site_id NUMBER := 0; --!!! l_party_site_id NUMBER := 0; --!!! -- x_return_status VARCHAR2(1); x_msg_count NUMBER; x_msg_data VARCHAR2(4000); BEGIN FND_MSG_PUB.initialize; fnd_global.apps_initialize(1, 20639, 200); --Диспетчер кредиторов - Кредиторы l_bank_acct_rec.bank_id := l_bank_id; l_bank_acct_rec.branch_id := l_branch_id; l_bank_acct_rec.country_code := 'RU'; l_bank_acct_rec.bank_account_name := '3321615678101831567890'; l_bank_acct_rec.bank_account_num := 3321615678101831567890; l_bank_acct_rec.acct_owner_party_id := l_acct_owner_party_id; l_bank_acct_rec.currency := 'RUB'; l_bank_acct_rec.object_version_number := 1.0; l_bank_acct_rec.start_date := sysdate; l_bank_acct_rec.foreign_payment_use_flag := 'Y'; l_bank_acct_rec.payment_factor_flag := 'N'; apps.iby_ext_bankacct_pub.create_ext_bank_acct(p_api_version => 1.0, p_init_msg_list => 'F', p_ext_bank_acct_rec => l_bank_acct_rec, p_association_level => 'SS', p_supplier_site_id => l_supplier_site_id, p_party_site_id => l_party_site_id, p_org_id => 82, p_org_type => 'OPERATING_UNIT', x_acct_id => l_acct, x_return_status => x_return_status, x_msg_count => x_msg_count, x_msg_data => x_msg_data, x_response => out_mesg); COMMIT; dbms_output.put_line('x_return_status='||x_return_status); dbms_output.put_line('out_mesg.Result_Code ='||out_mesg.Result_Code); dbms_output.put_line('out_mesg.Result_Category ='||out_mesg.Result_Category); dbms_output.put_line('out_mesg.Result_Message ='||out_mesg.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 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; end;
OEBS API: Создание поставщика и отделения
OEBS Пример использования API для создания поставщика и отделения поставщика:
declare l_vendor_rec AP_VENDOR_PUB_PKG.r_vendor_rec_type; l_vendor_site_rec AP_VENDOR_PUB_PKG.r_vendor_site_rec_type; x_vendor_id number; x_party_id number; x_vendor_site_id number; x_party_site_id number; x_location_id number; l_party_site_id number; -- x_return_status VARCHAR2(1); x_msg_count NUMBER; x_msg_data VARCHAR2(4000); begin l_vendor_rec.SEGMENT1 := '1234575'; l_vendor_rec.VENDOR_NAME := 'MYTESTSUPPLIER2'; l_vendor_rec.SUMMARY_FLAG := 'N'; l_vendor_rec.ENABLED_FLAG := 'Y'; AP_VENDOR_PUB_PKG.Create_Vendor(p_api_version => 1, x_return_status => x_return_status, x_msg_count => x_msg_count, x_msg_data => x_msg_data, p_vendor_rec => l_vendor_rec, x_vendor_id => x_vendor_id, x_party_id => x_party_id); if (x_return_status <> 'S') then dbms_output.put_line('ERROR in supplier creation'); dbms_output.put_line('--------------------------------------'); 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; else l_vendor_site_rec.vendor_id := x_vendor_id; l_vendor_site_rec.VENDOR_SITE_CODE := 'MYHOME'; l_vendor_site_rec.org_id := 82; l_vendor_site_rec.COUNTRY := 'RU'; l_vendor_site_rec.ADDRESS_LINE1 := 'Lenina'; l_vendor_site_rec.PURCHASING_SITE_FLAG := 'Y'; l_vendor_site_rec.PAY_SITE_FLAG := 'Y'; AP_VENDOR_PUB_PKG.Create_Vendor_Site(p_api_version => 1, 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, x_vendor_site_id => x_vendor_site_id, x_party_site_id => x_party_site_id, x_location_id => x_location_id); if (x_return_status <> 'S') then dbms_output.put_line('ERROR in supplier site creation'); dbms_output.put_line('--------------------------------------'); 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; else dbms_output.put_line('Supplier Site Created!'); end if; end if; commit; end;
OEBS Программа – сторнирование журналов SQLGL GLPREV
ОЕБС Пример вызова параллельной программы для сторнирования журналов
-- ------------------------------------------------------------------------------- -- Сторнирование журнала PROCEDURE reverse_journals(x_return_status OUT VARCHAR2 ,x_mess OUT VARCHAR2) IS TYPE t_integers IS TABLE OF INTEGER INDEX BY PLS_INTEGER; l_request_ids t_integers; l_result BOOLEAN := TRUE; l_access_set_id NUMBER; BEGIN write_log('START REVERSE_JOURNALS'); x_return_status := 'E'; l_access_set_id := fnd_profile.value('GL_ACCESS_SET_ID'); FOR c_je IN (SELECT jh.je_header_id ,jh.rowid AS row_id ,jh.name AS journal_name ,b.name AS batch_name FROM gl.gl_je_headers jh, gl_je_batches b WHERE 1 = 1 AND jh.je_batch_id = b.je_batch_id -- AND jh.ledger_id = G_LEDGER_ID AND jh.je_source = G_JE_SOURCE_NAME AND jh.je_category = G_JE_CATEGORY_NAME AND jh.period_name = P_PERIOD_NAME AND (b.name LIKE g_bath_name_in || '%' OR b.name LIKE g_bath_name_out || '%') AND (jh.name LIKE g_jh_name_in || '%' OR jh.name LIKE g_jh_name_out || '%') AND ( --Неотсторнированные журналы (jh.accrual_rev_status IS NULL AND -- сторно на сторно на сторно ... jh.reversed_je_header_id IS NULL) OR (jh.accrual_rev_status IS NULL AND jh.reversed_je_header_id IS NOT NULL AND MOD((SELECT COUNT(*) FROM gl_je_headers jh0 START WITH jh0.je_header_id = jh.je_header_id CONNECT BY jh0.je_header_id = PRIOR jh0.reversed_je_header_id) ,2) != 0)) ORDER BY jh.je_header_id) LOOP write_log(' Сторнирование журнала "' || c_je.journal_name || '" из пакета "' || c_je.batch_name || '"'); UPDATE gl_je_headers SET accrual_rev_flag = 'Y' ,accrual_rev_period_name = P_PERIOD_NAME ,accrual_rev_change_sign_flag = 'Y' ,accrual_rev_effective_date = SYSDATE WHERE ROWID = c_je.row_id; -- l_request_ids(l_request_ids.COUNT + 1) := fnd_request.submit_request(application => 'SQLGL' ,program => 'GLPREV' ,description => NULL ,start_time => NULL ,sub_request => FALSE ,argument1 => l_access_set_id ,argument2 => c_je.je_header_id); COMMIT; IF l_request_ids(l_request_ids.COUNT) = 0 THEN write_log('Ошибка при отправке параллельного запроса Сторнирование журналов.'); l_request_ids.DELETE(l_request_ids.COUNT); l_result := FALSE; --exit; END IF; END LOOP; -- WHILE l_request_ids.COUNT > 0 LOOP -- описание функции http://apps-oracle.ru/fnd_request_exec/#WAIT_CONCURRENT if NOT (wait_concur(l_request_ids(l_request_ids.FIRST),x_mess)) then write_log(x_mess); l_result := FALSE; exit; end if; l_request_ids.DELETE(l_request_ids.FIRST); END LOOP; write_log('END REVERSE_JOURNALS' || chr(10)); -- IF l_result THEN x_return_status := 'S'; x_mess := 'Сторнирование журналов завершено успешно.'; RETURN; ELSE x_return_status := 'E'; x_mess := 'Сторнирование журналов завершено с ошибками. '||x_mess; RETURN; END IF; -- END reverse_journals;
OEBS Программа – проведение журналов SQLGL GLPPOSS
ОЕБС Пример вызова параллельной программы для проведения журналов
-- ----------------------------------------------------- -- Проведение журналов -- ----------------------------------------------------- PROCEDURE post_journals(p_ledger_id NUMBER ,p_group_id NUMBER ,p_period VARCHAR2 ,p_rev NUMBER ,x_return_status OUT VARCHAR2 ,x_mess OUT VARCHAR2) IS l_request_id INTEGER; l_posting_run_id INTEGER; l_chart_of_accounts_id INTEGER; l_access_set_id INTEGER; BEGIN write_log('START POST_JOURNALS'); x_return_status := 'E'; l_posting_run_id := gl_je_posting_s.nextval; IF (p_rev = 0) THEN UPDATE gl_je_batches b SET status = 'S' ,approval_status_code = 'Z' -- пакет должен быть утвержден ,posting_run_id = l_posting_run_id WHERE b.status = 'U' AND b.GROUP_ID = p_group_id; ELSIF (p_rev = 1) THEN UPDATE gl_je_batches b SET status = 'S' ,approval_status_code = 'Z' -- пакет должен быть утвержден ,posting_run_id = l_posting_run_id WHERE b.status = 'U' AND EXISTS (SELECT 1 FROM gl_je_batches jb, gl_je_headers h, gl_je_headers hr WHERE jb.je_batch_id = h.je_batch_id AND h.je_header_id = hr.reversed_je_header_id AND (h.name LIKE G_JH_NAME_IN || '%' OR h.name LIKE G_JH_NAME_OUT || '%') AND h.period_name = p_period AND h.ledger_id = p_ledger_id AND hr.je_batch_id = b.je_batch_id) AND 2 = 2; END IF; write_log(' UPDATE ' || SQL%ROWCOUNT || ' rows in GL_JE_BATCHES'); IF (SQL%ROWCOUNT > 0) THEN -- SELECT l.chart_of_accounts_id, a.access_set_id INTO l_chart_of_accounts_id, l_access_set_id FROM gl_ledgers l, gl_access_sets a WHERE 1 = 1 AND l.ledger_id = p_ledger_id AND a.default_ledger_id = l.ledger_id AND a.chart_of_accounts_id = l.chart_of_accounts_id AND a.period_set_name = l.period_set_name AND a.accounted_period_type = l.accounted_period_type; l_request_id := fnd_request.submit_request( application => 'SQLGL' ,program => 'GLPPOSS' ,description => NULL ,start_time => NULL ,sub_request => FALSE ,argument1 => p_ledger_id ,argument2 => TO_CHAR(fnd_profile.value('GL_ACCESS_SET_ID')) ,argument3 => l_chart_of_accounts_id ,argument4 => l_posting_run_id); COMMIT; IF l_request_id = 0 THEN x_mess := 'Ошибка при отправке запроса проводки журналов'; RETURN; END IF; -- описание функции http://apps-oracle.ru/fnd_request_exec/#WAIT_CONCURRENT if NOT (wait_concur(l_request_id,x_mess)) then write_log(x_mess); RETURN; end if; END IF; x_return_status := 'S'; write_log('END POST_JOURNALS' || chr(10)); RETURN; EXCEPTION WHEN OTHERS THEN x_mess := 'Ошибка при запуске запроса проводки журналов: ' || SQLERRM; END;
OEBS Программа — импорт журналов SQLGL GLLEZLSRS
Пример вызова параллельной программы для импорта журналов
-- ----------------------------------------------------- -- Импорт журналов -- ----------------------------------------------------- PROCEDURE import_journals(x_return_status OUT VARCHAR2 ,x_mess OUT VARCHAR2 ) IS l_flag_exist NUMBER; l_request_id NUMBER; BEGIN x_return_status := 'E'; write_log('START IMPORT_JOURNALS'); -- проверка, что есть вставленные строки SELECT COUNT(1) INTO l_flag_exist FROM gl_interface t WHERE group_id = fnd_global.conc_request_id; IF (l_flag_exist != 0) THEN write_log('Запуск программы "Программа - импорт журналов"'); l_request_id := apps.fnd_request.submit_request( 'SQLGL' ,'GLLEZLSRS' ,NULL ,SYSDATE ,FALSE ,fnd_profile.value('GL_ACCESS_SET_ID') --Data Access Set ID ,G_JE_SOURCE_NAME --Source ,G_LEDGER_ID --Ledger ,fnd_global.conc_request_id --Group ID ,'N' --Post Errors to Suspense ,'N' --Create Summary Journals ,'W' --Import Descriptive Flexfields ); COMMIT; IF l_request_id = 0 THEN x_mess := 'При отправке запроса произошла ошибка. Номер запроса:' || l_request_id; write_log(x_mess); RETURN; END IF; -- описание функции http://apps-oracle.ru/fnd_request_exec/#WAIT_CONCURRENT if NOT (wait_concur(l_request_id,x_mess)) then write_log(x_mess); RETURN; end if; END IF; write_log('END IMPORT_JOURNALS' || chr(10)); x_return_status := 'S'; END;
OEBS API Параллельные программы — отправка, ожидание, скрытый режим
- Запуск параллельной программы
- Запуск дочерней параллельной программы
- Ожидание выполнения параллельной программы
- Запуск параллельной программы в скрытом режиме
- Применение шаблона к параллельной программе
- Отмена параллельной программы
- Подмена выходного файла параллельной программы
OEBS API Запуск параллельной программы
declare l_request_id NUMBER; -- p_app_name VARCHAR2(100); p_request_name VARCHAR2(100); begin l_request_id:=apps.fnd_request.submit_request (application => p_app_name -- код приложения ,program => p_request_name -- код параллельной программы ,description => NULL -- описание ,start_time => NULL -- когда запустить программу ,sub_request => FALSE -- признак дочерней программы ,argument1 => 1 -- параметр параллельной программы -- ... --,argument100 => ); COMMIT; if l_request_id = 0 then --write_log('При отправке запроса произошла ошибка'); raise fnd_api.g_exc_error; end if; end;
Если,
start_time = NULL, то запуск происходит сразу.
start_time = fnd_date.date_to_canonical(sysdate + (1/26/60)*5) — запуск через 5 минут
Читать дальше про “OEBS API Параллельные программы — отправка, ожидание, скрытый режим” »
EXCEL — некорректная точность чисел с десятичной точкой
Случайно наткнулся на то, что EXCEL2007/2010 число 2,01 хранит как 2.0099999999999998.
Пример: Создаем excel файл и прописываем в ячейки числовые значения с точкой
Сохраняем файл как «Таблица XML 2003» и открываем на просмотр в текстовом редакторе:
Читать дальше про “EXCEL — некорректная точность чисел с десятичной точкой” »
Даты в oracle — получить первый/последний день
with t as (select trunc(sysdate) d from dual) -- select 'ГОД - первый день' descr,trunc(d,'YY') new_date from t union all select 'ГОД - последний день', add_months(trunc(d,'YY'),12)-1 from t union all select 'КВАРТАЛ - первый день', trunc(d,'Q') from t union all select 'КВАРТАЛ - последний день', trunc(add_months(d, 3), 'Q')-1 from t union all select 'МЕСЯЦ - первый день' ,trunc(d,'MM') from t union all -- LAST_DAY не изменяет время select 'МЕСЯЦ - последний день',last_day(d) from t union all -- какой день недели считается первым, зависит от параметра NLS_TERRITORY select 'НЕДЕЛЯ - первый день', trunc(d,'D') from t union all select 'НЕДЕЛЯ - последний день', trunc(d,'D')+6 from t DESCR NEW_DATE ------------------------ ----------- ГОД - первый день 01.01.2012 ГОД - последний день 31.12.2012 КВАРТАЛ - первый день 01.10.2012 КВАРТАЛ - последний день 31.12.2012 МЕСЯЦ - первый день 01.11.2012 МЕСЯЦ - последний день 30.11.2012 НЕДЕЛЯ - первый день 05.11.2012 НЕДЕЛЯ - последний день 11.11.2012 8 rows selected
SQL> select (sysdate-trunc(sysdate-1)) day to second + time '00:00:00' as diff_time from dual; DIFF_TIME --------- 15:32:2
Последние комментарии