Страница 1 из 1

Опять эта сортировка

Добавлено: 31 авг 2006, 11:32
Saltava
Люди добрые, пацкажите :)
Как мовно отсортировать таблицу TMPSaldo3 так, чтоб при Loop'е автоматом выводилось упорядочено по KatPodr.Name, и по TMPSaldo3.cParty?

Добавлено: 04 сен 2006, 19:30
Maverick
Т.е. сортировка Подразделение - Партия?

Добавлено: 05 сен 2006, 06:23
Saltava
Maverick
Доброе время суток! :)
Да, в результате таблица должна быть упорядочена во-первых по подразделениям, а внутри подразделений - по партиям. Я уже вывернул это через дополнительные цикл по подразделениям и партиям, но хотелось бы уточнить, как это можно сделать проще. С индексами никак толком разобраться не могу.

Добавлено: 05 сен 2006, 09:32
Maverick
Первоначально порядок сортировки в таблицах определяется порядком их подцепки в условии Where главной логической таблицы (интерфейса или отчета с SQL-таблицей). Если же порядок неоднозначный (т.е. подцепка осуществляется по N полям, задающих часть индекса, т.е. N сегментов из M(N<M), которые присутствуют в нескольких индексах), то таблица будет индексирована по первому индексу, описанному в словаре, и его N сегментов совпадают с порядком подцепки. Чтобы явно указать индекс в этом случае, после имени физической таблицы в секции FROM в круглых скобках задают имя индекса: MyTable (MyTable01). Аналогично поступают и в том случае, когда на таблицу не наложено никаких ограничений в WHERE.

Пример1:

Код: Выделить всё

Create View 
As Select *
From 
 KatSopr,
 SpSopr,
 KatOrg, 
 KatMC,
 KatUsl
Where
((
 Katsopr.NRec == SpSopr.cSopr And
 KatSopr.cOrg == KatOrg.NRec And
 SpSopr.cMcUsl == KatMC.NRec And
 SpSopr.cMcUsl == KatUsl.NRec 
));
В данном случае т.к. KatSopr не ограничена в логической таблице, то она будет индексирована по первому индексу словаря - т.е. по NRec (по индексу KatSopr01),по Nrec же будут индексированы таблицы KatOrg, KatMC и KatUsl. Но их индекс уже будет определяться тем, что в подцепке первым условием подцепки для них используется NRec, а это есть первые сегменты соответствующих индексов по Nrec (KatOrg01, KatMC01 и KatUsl01 соответственно).
Таблица же SpSopr будет индексирована по одному из индексов, первым сегментом которых является поле cSopr. Это индексы SpSopr03, SpSopr05, SpSopr06, SpSopr08 и т.д. По умолчанию система из этих индексов выбирает первый, который описан в словаре - это индекс SpSopr03, т.о. сортировка таблицы SpSopr будет осуществляться по полям cSopr+Npp.

Пример2:

Код: Выделить всё

Create View 
As Select *
From 
 KatSopr,
 SpSopr (SpSopr11),
 KatOrg, 
 KatMC,
 KatUsl
Where
((
 Katsopr.NRec == SpSopr.cSopr And
 KatSopr.cOrg == KatOrg.NRec And
 SpSopr.cMcUsl == KatMC.NRec And
 SpSopr.cMcUsl == KatUsl.NRec 
));
Данная логическая таблица ничем не отличается от предыдущей, за исключением того, что теперь таблица SpSpor будет отсортирована по полям cSopr+cMcUsl+Npp, т.е. по индексу SpSopr11 (vs его описали в круглых скобках после имени таблицы).

Однако необходимо помнить, что явное указание индекса для таблицы и условие ее подцепки в WHERE должны быть взаимно корректными (т.е. в вышеприаедленных примерах нельзя явно задавать индекс, первым сегментом которого является поле, отличное от cSopr). В этом случае система скомпилирует все, но при инициализации данной лог.таблицы (в интерфейсе, отчете) пользователь получит сообщение об ошибке конфликта используемого индекса и условий ограничения на таблицу.

Добавлено: 05 сен 2006, 09:41
Maverick
Индексы явно можно задавать не только непосредственно в описании логической таблицы, но и уже в самом алгоритме обхода того или иного узла - в ф-ях GetFirst - GetNext - GetPrev - GetLast и в цикле _Loop

Пример 3

Код: Выделить всё

//цикл  по таблице с типом документа tDoc и годом выписки y

Var  tdoc, y : word;
 ...

If GetFirst BaseDoc Where (( tDoc == BaseDoc.vidDoc And y == BaseDoc )) = tsOk
Do 
{
..
}
While (GetNext BaseDoc Where (( tDoc == BaseDoc.vidDoc And y == BaseDoc )) = tsOk);
Пример 4

Код: Выделить всё

//встать на последний имеющийся архив для указанного ОС
var cOs : comp;
If GetLast ArcIznos (ArcIznos04) Where ((cOs == ArcIznos.cKatos)) = tsOk then 
{
..
};

Добавлено: 05 сен 2006, 12:17
coolibin
Предлагаю в опыт, а то использование индексов и сортировки в Галактике - это похоже главные грабли всех начинающих

Добавлено: 05 сен 2006, 12:34
Maverick
Для опыта - слишком мелко. должно быть более подробное изложение.
В моей методичке по курсу Atlantis SQL оно есть.

Добавлено: 05 сен 2006, 12:42
m0p3e
Угу. Еще во время прочтения появилась мысль создать раздел FAQ и эту тему туда как пилотную :)
Maverick писал(а):Для опыта - слишком мелко. должно быть более подробное изложение.
В моей методичке по курсу Atlantis SQL оно есть.
ЗЫ вот для раздела FAQ самое оно :)

Добавлено: 05 сен 2006, 13:33
Maverick
:mrgreen:
материал методичек преподается на курсах. Вэлкам в Тюмень )))

Добавлено: 06 сен 2006, 06:00
Saltava
Maverick, благодарен за стольразвернутый ответ :razz:
Буду продолжать безжалостные эксперименты :grin:

Добавлено: 07 сен 2006, 11:45
coolibin
Maverick писал(а)::mrgreen:
материал методичек преподается на курсах. Вэлкам в Тюмень )))
спасибо, уж лучче вы к нам...