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

Последние комментарии