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

Сортировка в списочной операции

 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle
Предыдущая тема :: Следующая тема  
Автор Сообщение
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    Ответить с цитатой
Полезность: Нет оценки
Спасибо огромное! всё работает!
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle Часовой пояс: GMT + 3
Страница 1 из 1

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