Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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
))
дедушка умер , а дело живет |
|
 |
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 -- клиент |
|
|
 |
|