Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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   |
|
Полезность: Нет оценки
|
Спасибо огромное! всё работает! |
|
 |
|