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