| Предыдущая тема :: Следующая тема   | 
	
	
	
		| Автор | 
		Сообщение | 
	
	
		arkazar Участник со стажем
 
  Вступление в Клуб: 27.09.2010
  | 
		
			
				 Вт Сен 06, 2011 13:25   Сортировка в списочной операции | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				Добрый день!
 
Столкнулся с задачей : необходимо реализовать сортировку строк по столбцу в списочной операции выводящую на печать.
 
Я понимаю, что можно отсортировать в представлении по столбцу, а потом выполнить операцию, но пользователь не хочет этим заниматься.
 
Подскажите, возможно, есть пример в ЦФТ, пользовался поиском не нашёл.
 
 
Заранее спасибо! | 
			 
		  | 
	
	
		  | 
	
	
		pas Профи
 
  Вступление в Клуб: 20.11.2007
  | 
		
			
				 Вт Сен 06, 2011 13:50    | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				| Попробуй меню пользователя. | 
			 
		  | 
	
	
		  | 
	
	
		arkazar Участник со стажем
 
  Вступление в Клуб: 27.09.2010
  | 
		
			
				 Вт Сен 06, 2011 15:41    | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				| Пользователь хочет гибкости и желательно галочки "сортировать". А в коде операции есть ли возможность реализации? | 
			 
		  | 
	
	
		  | 
	
	
		Volod Эксперт
 
  Вступление в Клуб: 19.09.2007
  | 
		
			
				 Вт Сен 06, 2011 15:59    | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				| Воспользуйтесь вспомогательной таблицей и сортируйте на здоровье. | 
			 
		  | 
	
	
		  | 
	
	
		arkazar Участник со стажем
 
  Вступление в Клуб: 27.09.2010
  | 
		
			
				 Вт Сен 06, 2011 16:14    | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				| Volod, могли бы пример дать? | 
			 
		  | 
	
	
		  | 
	
	
		Volod Эксперт
 
  Вступление в Клуб: 19.09.2007
  | 
		
			
				 Вт Сен 06, 2011 16:54    | 
				     | 
			 
			
				Полезность: 1 
  | 
			 
			
				Без привязки к конкретным таблицам
 
 	  | Код: | 	 		  
 
-- заполняем временную таблицу
 
   for I in this.first   .. this.last loop -- по списку id
 
      insert into [temp_table] x(x.[a] = this(i))
 
   end loop;
 
 
   For a in [temp_table] -- временная таблица
 
   order by a.[a]
 
   loop
 
   -- что-то делаем
 
   end loop;   
 
 
 | 	 
  | 
			 
		  | 
	
	
		  | 
	
	
		arkazar Участник со стажем
 
  Вступление в Клуб: 27.09.2010
  | 
		
			
				 Ср Сен 07, 2011 09:21    | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				| Спасибо. | 
			 
		  | 
	
	
		  | 
	
	
		maestro Профи
 
  Вступление в Клуб: 12.10.2010
  | 
		
			
				 Ср Сен 07, 2011 09:29    | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				Вариантов масса.
 
Вот еще 3 из неперчисленных:
 
1. Перегнать в массив "index by varchar2" с ключом по сортируемому полю.
 
 
2. Отсортировать THIS QuickSort'ом (Я бы выбрал этот вариант, т.к. он наиболее оптимальный с т.з. вычислительных затрат).
 
 
3. Сформировать VARRAY и выполнить по нему select. | 
			 
		  | 
	
	
		  | 
	
	
		arkazar Участник со стажем
 
  Вступление в Клуб: 27.09.2010
  | 
		
			
				 Ср Сен 07, 2011 10:40    | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				| maestro, расскажи пожалуйста поподробней про 2й вариант! | 
			 
		  | 
	
	
		  | 
	
	
		maestro Профи
 
  Вступление в Клуб: 12.10.2010
  | 
		
			
				 Ср Сен 07, 2011 11:09    | 
				     | 
			 
			
				Полезность: 5 
  | 
			 
			
				пятиминутный пример:
 
В списочной операции на майн_докуме сортируем this по полю номер документа:
 
 
 	  | Код: | 	 		  
 
procedure quicksort(p_array in out rtl.number_table, l number default null , r number default null) is
 
      v_middle   number;
 
      v_temp      number;
 
      i         number;
 
      j         number;
 
      
 
   function Get_Sort_Value(p_doc ref [MAIN_DOCUM]) return number is
 
   begin
 
      return p_doc.[DOCUMENT_NUM];
 
   end;
 
begin
 
   if l is null then
 
      l := p_array.first;
 
   end if;
 
   
 
   if r is null then
 
      r := p_array.last;
 
   end if;
 
   
 
   if not (p_array.exists(l) and p_array.exists(r)) then
 
      return;
 
   end if;
 
   
 
 
   if r > l then
 
      v_middle   := Get_Sort_Value(p_array(r));
 
      i         := p_array.prior(l);
 
      j         := r;
 
 
      loop
 
         loop
 
            if i is null then
 
               i := l;
 
            else
 
               i := p_array.next(i);
 
            end if;
 
            exit when Get_Sort_Value(p_array(i)) >= v_middle or i is null or i >= j;
 
         end loop;
 
         i := nvl(i, r);
 
 
         loop
 
            j := p_array.prior(j);
 
            exit when Get_Sort_Value(p_array(j)) <= v_middle or j is null or i >= j;
 
         end loop;
 
         j := nvl(j, r);
 
 
         v_temp      := p_array(i);
 
         p_array(i)   := p_array(j);
 
         p_array(j)   := v_temp;
 
 
         exit when j <= i;
 
      end loop;
 
 
      p_array(j)   := p_array(i);
 
      p_array(i)   := p_array(r);
 
      p_array(r)   := v_temp;
 
 
      j := nvl(p_array.prior(i), i);
 
      quicksort(p_array, l, j);
 
 
      j := nvl(p_array.next(i), i);
 
      quicksort(p_array, j, r);
 
   end if;
 
end;
 
 
begin
 
   debug_pipe('-- До сортировки --', 0);
 
   for i in 1..this.count loop
 
      debug_pipe(this(i).[DOCUMENT_NUM], 0);
 
   end loop;
 
   
 
   quicksort(this);
 
   
 
   debug_pipe('-- После сортировки --', 0);
 
   for i in 1..this.count loop
 
      debug_pipe(this(i).[DOCUMENT_NUM], 0);
 
   end loop;
 
end;
 
 | 	 
  | 
			 
		  | 
	
	
		  | 
	
	
		arkazar Участник со стажем
 
  Вступление в Клуб: 27.09.2010
  | 
		
			
				 Ср Сен 07, 2011 14:08    | 
				     | 
			 
			
				Полезность: Нет оценки 
  | 
			 
			
				| Спасибо огромное! всё работает! | 
			 
		  | 
	
	
		  | 
	
	
		 |