| Предыдущая тема :: Следующая тема   | 
	
	
	
		| Автор | 
		Сообщение | 
	
	
		Dizzy072 Участник
 
  Вступление в Клуб: 06.03.2017
  | 
		
			
				 Пн Апр 10, 2017 14:36   Массив в представлении | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				| День добрый. Прошу вашей помощи уважаемые форумчане. Ситуация такая - имеется некий массив, который содержит в себе данный. Необходимо эти поля из массива вынести отдельно в представление. Кажется этот момент должен быть выполнен через функцию, но хотелось бы усылать Ваше мнение. | 
			 
		  | 
	
	
		  | 
	
	
		Матвеев Евгений Профи
 
  Вступление в Клуб: 31.01.2012
  | 
		
			
				 Пн Апр 10, 2017 18:32    | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				Наверх, как вариант, можно вот так поднимать...
 
 
 
1. Пишешь в библиотеке обработчик:
 
 
(Это совсем из простых... выводим или символы {...} когда пусто или единичное значение или символы множества {***}, когда значений 2 и более)
 
 
 	  | Код: | 	 		  
 
function get_res_chck(cur_inst ref [FM_RESULT_CHECK]) return varchar2(1000) is
 
   rez varchar2(1000);
 
begin
 
 
   begin
 
      
 
      select x(x.[KD_CRIT].[NAME])
 
      in cur_inst.[REMARK_ARR] all
 
      into rez;
 
   
 
   exception
 
      when NO_DATA_FOUND then rez := '{...}';
 
      when TOO_MANY_ROWS then rez := '{***}';
 
   end;
 
 
   return rez;
 
end;
 
 | 	  
 
 
(или чуть чуть по другому ... либо пусто {...}, либо накапливаем текст и выводим общей строкой, вместо {***}, для 1ого или более вхождений)
 
 
 	  | Код: | 	 		  
 
function get_res_chck(cur_inst ref [FM_RESULT_CHECK]) return varchar2(1000) is
 
   rez varchar2(1000) := '';
 
begin
 
    
 
   for x in cur_inst.[REMARK_ARR] all loop 
 
       rez := rez||x.[KD_CRIT].[NAME]||';';
 
   end loop;
 
   
 
   if length(rez) = 0 then
 
      rez := '{...}';   
 
   end if;
 
   
 
   return rez;
 
end;
 
 | 	  
 
 
2. Создаешь расширение (если не дистрибутив... пункт можно пропустить)
 
 
3. Добавляешь поле в закладке "Колонки представления"
 
 
  | 
			 
		  | 
	
	
		  | 
	
	
		Alkov Профи
 
  Вступление в Клуб: 23.09.2010
  | 
		
			
				 Ср Апр 12, 2017 05:58    | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				можно через SQL функции преобразование  столбца в строку,
 
см. sql.ru | 
			 
		  | 
	
	
		  | 
	
	
		Эмиралька Эксперт
 
  Вступление в Клуб: 09.11.2015
  | 
		
			
				 Ср Апр 12, 2017 13:01    | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				 	  | Alkov пишет: | 	 		  можно через SQL функции преобразование  столбца в строку,
 
см. sql.ru | 	  
 
pivot/unpivot ? | 
			 
		  | 
	
	
		  | 
	
	
		Матвеев Евгений Профи
 
  Вступление в Клуб: 31.01.2012
  | 
		
			
				 Ср Апр 12, 2017 13:03    | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				 	  | Эмиралька пишет: | 	 		   	  | Alkov пишет: | 	 		  можно через SQL функции преобразование  столбца в строку,
 
см. sql.ru | 	  
 
pivot/unpivot ? | 	  
 
 
Коллеги, может и пример какой под рукой есть? | 
			 
		  | 
	
	
		  | 
	
	
		Alkov Профи
 
  Вступление в Клуб: 23.09.2010
  | 
		
			
				 Чт Апр 13, 2017 10:51    | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				ну например для вывода нескольких свойств по договору
 
пишем в столбец:
 
[code]
 
(select listagg(C_STR_VALUE, ', ') within group (order by C_STR_VALUE) from z#property where collection_id = A1_1.C_PRORERTY_ARR 
 
and c_date_begin <= A2_1.C_OP_DATE  
 
and (nvl(c_date_end, A2_1.C_OP_DATE) >= A2_1.C_OP_DATE) 
 
and c_property_type = /*PL+*/::[PROPERTY_TYPE]([code]='MY_PROP')/*PL-*/)
 
[/code] | 
			 
		  | 
	
	
		  | 
	
	
		Матвеев Евгений Профи
 
  Вступление в Клуб: 31.01.2012
  | 
		
			
				 Чт Апр 13, 2017 12:41    | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				 	  | Alkov пишет: | 	 		  ну например для вывода нескольких свойств по договору
 
пишем в столбец:
 
 
(select listagg(C_STR_VALUE, ', ') within group (order by C_STR_VALUE) from z#property where collection_id = A1_1.C_PRORERTY_ARR 
 
and c_date_begin <= A2_1.C_OP_DATE  
 
and (nvl(c_date_end, A2_1.C_OP_DATE) >= A2_1.C_OP_DATE) 
 
and c_property_type = /*PL+*/::[PROPERTY_TYPE]([code]='MY_PROP')/*PL-*/) | 	  
 
 
Вероятно, более производительный вариант, но функционал ограничен синтаксисом sql,  какие то сложные расчеты и вывод легче первым вариантом | 
			 
		  | 
	
	
		  | 
	
	
		kai Профи
 
  Вступление в Клуб: 16.08.2012
  | 
		
			
				 Чт Май 25, 2017 07:54    | 
				     | 
			 
			
				Полезность: 1 
  | 
			 
			
				 	  | Матвеев Евгений пишет: | 	 		   	  | Alkov пишет: | 	 		  ну например для вывода нескольких свойств по договору
 
пишем в столбец:
 
 
(select listagg(C_STR_VALUE, ', ') within group (order by C_STR_VALUE) from z#property where collection_id = A1_1.C_PRORERTY_ARR 
 
and c_date_begin <= A2_1.C_OP_DATE  
 
and (nvl(c_date_end, A2_1.C_OP_DATE) >= A2_1.C_OP_DATE) 
 
and c_property_type = /*PL+*/::[PROPERTY_TYPE]([code]='MY_PROP')/*PL-*/) | 	  
 
 
Вероятно, более производительный вариант, но функционал ограничен синтаксисом sql,  какие то сложные расчеты и вывод легче первым вариантом | 	  
 
 
LISTAGG можно использовать в PL+ через псевдофункцию ANALYTIC. Поищите "LISTAGG" в представлениях и найдёте примеры. | 
			 
		  | 
	
	
		  | 
	
	
		Аленушка Участник со стажем
 
  Вступление в Клуб: 13.05.2015
  | 
		
			
				 Вт Май 30, 2017 14:27    | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				| только хотела про listag написать )) | 
			 
		  | 
	
	
		  | 
	
	
		 |