CftClub.ru
Клуб специалистов ЦФТ-Банк

Здравствуйте. Проблема обработки xml файла в цикле.
На страницу 1, 2  След.
 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle
Предыдущая тема :: Следующая тема  
Автор Сообщение
mmm_kazan
Участник со стажем


Вступление в Клуб: 28.03.2018
СообщениеЧт Мар 29, 2018 08:46   Здравствуйте. Проблема обработки xml файла в цикле. Ответить с цитатой
Полезность: Нет оценки
Мне нужно закачать пенсии нескольким пенсионерам.
Написал программу типа.

fileR := stdio.open(P_FILE_ALT.[DST_PATH], P_FILE_ALT.[DST_NAME], 'r');
while stdio.get_line(fileR, g_str, false, stdio.WINTEXT) loop
...
if substr(trim(g_str),1,22) = '</СведенияОполучателе>' then
doc_struct%init;
doc_struct.[DOCUMENT_NUM] := to_char(i);
...
end if;
MAIN_DOCUM]%insert(doc_struct);
end loop;

По одному клиенту срабатывает, по двум нет


В настоящий момент операция невозможна:
Дублируется значение реквизита [История состояний] в типе [DOCUMENT]

ОЧЕНЬ прошу совета.
Volod
Эксперт


Вступление в Клуб: 19.09.2007
СообщениеЧт Мар 29, 2018 09:21    Ответить с цитатой
Полезность: Нет оценки
Код:
MAIN_DOCUM]%insert(doc_struct);

Странное решение - обычно вызывают NEW#AUTO или бизнес-операцию
Alkov
Профи


Вступление в Клуб: 23.09.2010
СообщениеЧт Мар 29, 2018 09:31    Ответить с цитатой
Полезность: Нет оценки
--Дублируется значение реквизита [История состояний] в типе [DOCUMENT]
Наверное реквизит [История состояний] это массив,
а id массивов должны быть уникальны,
а у вас похоже этот реквизит заполняется не новым, а уже существующим id ...
mmm_kazan
Участник со стажем


Вступление в Клуб: 28.03.2018
СообщениеЧт Мар 29, 2018 09:53   Таже Ответить с цитатой
Полезность: Нет оценки
Может быть полный текст поможет для ответа? Понятно, что он не идеален.

fileR := stdio.open(P_FILE_ALT.[DST_PATH], P_FILE_ALT.[DST_NAME], 'r');
i := 1;

while stdio.get_line(fileR, g_str, false, stdio.WINTEXT) loop
if substr(trim(g_str),1,16) = '<СуммаПоФилиалу>' then
exit;
end if;

if substr(trim(g_str),1,9) = '<Фамилия>' then
tmpInteger := instr(trim(g_str),'</Фамилия>');
str_clnt_fname_3 := substr(trim(g_str),10,tmpInteger-1-9);
end if;

if substr(trim(g_str),1,5) = '<Имя>' then
tmpInteger := instr(trim(g_str),'</Имя>');
str_clnt_iname_3 := substr(trim(g_str),6,tmpInteger-1-5);
end if;

if substr(trim(g_str),1,10) = '<Отчество>' then
tmpInteger := instr(trim(g_str),'</Отчество>');
str_clnt_oname_3 := substr(trim(g_str),11,tmpInteger-1-10);
end if;

if substr(trim(g_str),1,12) = '<НомерСчета>' then
tmpInteger := instr(trim(g_str),'</НомерСчета>');
str_clnt_acc_3 := substr(trim(g_str),13,tmpInteger-1-12);
end if;

if substr(trim(g_str),1,16) = '<СуммаКдоставке>' then
tmpInteger := instr(trim(g_str),'</СуммаКдоставке>');
sum_for_pay := to_number(substr(trim(g_str),17,tmpInteger-1-16));

end if;

if substr(trim(g_str),1,22) = '</СведенияОполучателе>' then
str_clnt_sum_3 := to_char(sum_for_pay);
doc_struct%init;
doc_struct.[DOCUMENT_NUM] := to_char(i);
doc_struct.[DATE_DOC] := sysdate;
doc_struct.[DOCUMENT_DATE] := sysdate;
doc_struct.[DOCUMENT_USER] := stdlib.UserId;
doc_struct.[SUM] := to_number(str_clnt_sum_3);
doc_struct.[SUM_PO] := to_number(str_clnt_sum_3);
doc_struct.[SUM_NT] := to_number(str_clnt_sum_3);
doc_struct.[VID_DOC] := ::[NAME_PAYDOC]([CODE] = 'БЕЗН_БАНК_ОРД');
doc_struct.[VID_OBOROTA] := ::[VID_OBOROT]([SHORT_NAME] = 'ОСНОВНЫЕ');
doc_struct.[NAZN] := 'На выплату пенсий за '||month_str||' на счет '||str_clnt_acc_3||' т.г., согл. списка, без налога (НДС).';
doc_struct.[ACC_DT] := this.[ACC_KT];
doc_struct.[TYPE_MESS] := 1984043;

for (select x( x : REC)
in ::[AC_FIN] all
where x.[MAIN_V_ID] =str_clnt_acc_3)
loop
acc_fin_kt := x.[rec];
exit;
end loop;

doc_struct.[PRIORITET] :='05';
doc_struct.[ACC_KT] := acc_fin_kt;
doc_struct.[FILIAL] := this.[FILIAL];
doc_struct.[KL_DT].[1].[2] := this.[ACC_KT];
doc_struct.[KL_DT].[1].[1] := this.[ACC_KT].[CLIENT_V];

doc_struct.[KL_KT].[1].[1] := acc_fin_kt.[CLIENT_V];
doc_struct.[KL_KT].[1].[2] := acc_fin_kt;
doc_struct.[VALUTA] := this.[VALUTA];
doc_struct.[VALUTA_PO] := this.[VALUTA_PO];
if str_clnt_sum_3 is null or str_clnt_acc_3 is null or acc_fin_kt is null then
pragma error('Не заполнены ключевые реквизиты для проводки');
end if;

V_MAIN_DOC := ::[MAIN_DOCUM]%insert(doc_struct);

stdio.put_line_buf('Проводка на счет '||str_clnt_acc_3||' на сумму '||str_clnt_sum_3||' зачислена.');
end if;

i := i+1;

end loop;
mmm_kazan
Участник со стажем


Вступление в Клуб: 28.03.2018
СообщениеЧт Мар 29, 2018 09:54    Ответить с цитатой
Полезность: Нет оценки
На счет массива DOCUMENT я уже понял. Явно я его не заполняю. Как пока не знаю.
vtar
Эксперт


Вступление в Клуб: 20.03.2009
СообщениеЧт Мар 29, 2018 10:27    Ответить с цитатой
Полезность: Нет оценки
что то типа

doc_struct.[HISTORY_STATE] := rtl.next_value('SEQ_ID');
mmm_kazan
Участник со стажем


Вступление в Клуб: 28.03.2018
СообщениеЧт Мар 29, 2018 10:33    Ответить с цитатой
Полезность: Нет оценки
Вроде помогло, но теперь на другое ругнулось
В настоящий момент операция невозможна:
Дублируется значение реквизита [Суммы для бизнес-операций] в типе [DOCUMENT]

Все-таки может как-то DOCUMENT туда можно засунуть со структурой какой-то?
vtar
Эксперт


Вступление в Клуб: 20.03.2009
СообщениеЧт Мар 29, 2018 10:35    Ответить с цитатой
Полезность: 1
doc_struct.[ARRAY_SUM_DOG] := rtl.next_value('SEQ_ID');

все массивы надо инициализировать так.

Посмотри в Админе словаря в типе Документ

если у тебя тип реквизита заканчивается на _ARR то это массив
vtar
Эксперт


Вступление в Клуб: 20.03.2009
СообщениеЧт Мар 29, 2018 10:37    Ответить с цитатой
Полезность: Нет оценки
mmm_kazan пишет:


MmM

Smile))

дедушка умер , а дело живет
mmm_kazan
Участник со стажем


Вступление в Клуб: 28.03.2018
СообщениеЧт Мар 29, 2018 10:52    Ответить с цитатой
Полезность: Нет оценки
А на счет такой ошибки можно присваивать null?

В настоящий момент операция невозможна:
Дублируется значение реквизита [Настройки отношения к файлам электронного архива] в типе [MAIN_DOCUM]
vtar
Эксперт


Вступление в Клуб: 20.03.2009
СообщениеЧт Мар 29, 2018 10:58    Ответить с цитатой
Полезность: Нет оценки
mmm_kazan пишет:
А на счет такой ошибки можно присваивать null?

В настоящий момент операция невозможна:
Дублируется значение реквизита [Настройки отношения к файлам электронного архива] в типе [MAIN_DOCUM]


doc_struct.[FOR_SVOD] := rtl.next_value('SEQ_ID');

Дальше смотри массивы в типе "Платежные документы" если будут такие ругательства
svn
Профи


Вступление в Клуб: 04.02.2008
СообщениеЧт Мар 29, 2018 11:20    Ответить с цитатой
Полезность: Нет оценки
попробуй MAIN_DOCUM]%insert(doc_struct,true);
mmm_kazan
Участник со стажем


Вступление в Клуб: 28.03.2018
СообщениеПт Мар 30, 2018 08:26    Ответить с цитатой
Полезность: Нет оценки
Здравствуйте.
Еще вопрос по теме.

Как правильно заполнить Получателя?
У меня не заполняются реквизиты при просмотре созданного документа.
Хотя после проводки все нормально.

В тксте файла, который получаю есть только номер счета и ФИО.

Текст кода ранее.
mmm_kazan
Участник со стажем


Вступление в Клуб: 28.03.2018
СообщениеПт Мар 30, 2018 08:29    Ответить с цитатой
Полезность: Нет оценки
Отдельное спасибо vtar
Volod
Эксперт


Вступление в Клуб: 19.09.2007
СообщениеПт Мар 30, 2018 09:49    Ответить с цитатой
Полезность: 1
Код:
doc_struct.[FILIAL] := this.[FILIAL];
doc_struct.[KL_DT].[1].[2] := this.[ACC_KT];
doc_struct.[KL_DT].[1].[1] := this.[ACC_KT].[CLIENT_V];


Откуда взялся this? Это разве не групповая операция?


Код:
doc_struct.[KL_KT].[0] := 1 -- клиент
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle Часовой пояс: GMT + 3
На страницу 1, 2  След.
Страница 1 из 2

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru