Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.03.10;
Скачать: CL | DM;

Вниз

Сортировка LokUp-полей   Найти похожие ветки 

 
User_OKA ©   (2003-02-06 09:12) [0]

В общем, с самого начала.
Существют таблицы - справочники:
X (поля: ID, Sprav);
Y (поля: ID, Sprav);
Z (поля: ID, Sprav),

а также таблица A (поля: ID, ID_X, ID_Y, ID_Z).
Пользователю нужно представить все это в одной таблице, чтобы вместо кодов значений высветились сами значения.
Делаю запрос:
"SELECT A.ID, X.Sprav, Y.Sprav, Z.Sprav
FROM A A, X X, Y Y, Z Z
WHERE A.ID_X = X.ID AND A.ID_Y = Y.ID AND A.ID_Z = Z.ID"
Сортировку можно проводить по любому полю, но если в таблице A не заполнено какое-либо поле (имеется ввиду ID_X, ID_Y или ID_Z), то строка не попадает в итоговый запрос и пользователь ее не увидит.
Выход в использовании lookup - полей.
Но как провести по ним сортировку?
Пишу "ORDER BY A.ID_Y", но сами значения справочника для пользователя все равно остаются неотсортированными.
Что делать?


 
AlexSerp ©   (2003-02-06 09:25) [1]

Пробовал так?
SELECT A.ID, X.Sprav, Y.Sprav, Z.Sprav
FROM A
left join x on A.ID_X = X.ID
left join y on A.ID_X = y.ID
left join z on A.ID_X = z.ID




 
User_OKA ©   (2003-02-06 09:33) [2]

Запрос с JOIN долго выполняется.
Особенно если в таблицах > 1000 записей.
Ксати, с lookup-полями запрос выполняется быстрее, чем с запросом WHERE.


 
User_OKA ©   (2003-02-06 12:24) [3]

Может есть другие идеи?
Хотя бы направление для поиска решений.


 
Val ©   (2003-02-06 12:46) [4]

>User_OKA © (06.02.03 09:33)
постройте view на основе запроса AlexSerp © (06.02.03 09:25)
и обращайтесь к нему в программе, урезая условиями, врядли пользователю нужны все записи.


 
Johnmen ©   (2003-02-06 12:58) [5]

>User_OKA © (06.02.03 12:24)
>Может есть другие идеи?

Базовых идей может быть только две : как было сказано LEFT JOIN и лукапные поля... А борьба за производительность может идти по многим направлениям...:)


 
User_OKA ©   (2003-02-06 13:50) [6]

Да вопрос, вообще-то, не про производительность...
И все записи я пользователю не выдаю.
Можно ли сделать сортировку по Lookup-полю?
В SQL-запросе я не могу записать "ORDER BY " + имя Lookup-поля. Это ж поле только на клиенте получается.
А сортировать, однако, надо.
Такая вот борьба по многим направлениям...


 
AlexSerp ©   (2003-02-06 14:57) [7]

Как это ты не можешь написать В SQL-запросе я не могу записать "ORDER BY " + имя Lookup-поля. Это ж поле только на клиенте получается. ?
Именно так и напиши. Или просто укажи в ORDER BY порядковый номер поля выборки.

Саня.

ЗЫ. Или ты что-то другое подразумеваешь под сортировкой?


 
passm ©   (2003-02-06 15:07) [8]

AlexSerp © (06.02.03 14:57)> Нагляднее:
SELECT T1.*, T2.NAME AS NAME_T2
FROM TABLE1 AS T1
LEFT OUTER JOIN TABLE2 AS T2 ON (T1.FIELD_TABLE2 = T2.ID)
ORDER BY NAME_T2


 
User_OKA ©   (2003-02-07 09:06) [9]

Да не в запросах дело. С запросами все понятно. ORDER BY и нет проблем.
Создается lookup-поле на клиенте. Проблема в том, можно ли отсортировать набор именно по этому поле. Под сортировкой я понимаю упорядочивание, в частности, для строковых полей по алфавиту.
Lookup-поле получаю в редакторе полей конкретного TFIBDataSet.
Соответственно под каждое такое поле бросаю на форму свой TFIBDataSet.
Или я много туману напустил? Вроде все понятно...


 
User_OKA ©   (2003-02-07 09:07) [10]

Да не в запросах дело. С запросами все понятно. ORDER BY и нет проблем.
Создается lookup-поле на клиенте. Проблема в том, можно ли отсортировать набор именно по этому поле. Под сортировкой я понимаю упорядочивание, в частности, для строковых полей по алфавиту.
Lookup-поле получаю в редакторе полей конкретного TFIBDataSet.
Соответственно под каждое такое поле бросаю на форму свой TFIBDataSet.
Или я много туману напустил? Вроде все понятно...


 
AlexSerp ©   (2003-02-07 09:12) [11]

А в TFIBDataSet нельзя получить НД с нужной сортировкой сразу.
Извини, но я с таким компонентом не работал.
В нем идет подключение к таблице напрямую или данные получаются запросом?
Если запросом, то кто мешает сделать сортировку в запросе?

Саня

ЗЫ. Пардон за мою бестолковость.


 
passm ©   (2003-02-07 09:27) [12]

User_OKA © (07.02.03 09:07)> Может All"у покажется неправильно, но в подобных случаях поступаю так:
1. Возвращаю селектом нужный НД со всеми полями (включая те, которые в дальнейшем собираюсь использовать как lookup).
2. Рядом еще запрос(ы) с нужными справочниками.
3. Редактирую поля в запросе (1) - преобразую поля возвращающие значения из справочников в lookup (указываю FieldKind = fkLookup...)
Вот и все. Минус подхода - получается двойной расчет lookup поля: на сервере и на клиенте. Но решается вопрос сортировки при клике на заголовок грида.


 
User_OKA ©   (2003-02-07 12:27) [13]

Не совсем понятен пункт 3.
Я делаю так:
1. Возвращаю селектом нужный НД со всеми полями
-> select * from A
2. Создаю TFIBDataSet-ы для каждого справочника
-> select * from A и т.д.
3. Создаю TField (FieldKind = fkLookup) для каждого справочника.
Только вот произвольную сортировку по любому полю сделать не получается. Не сортируются lookup, хоть тресни!


 
User_OKA ©   (2003-02-07 12:28) [14]

Не совсем понятен пункт 3.
Я делаю так:
1. Возвращаю селектом нужный НД со всеми полями
-> select * from A
2. Создаю TFIBDataSet-ы для каждого справочника
-> select * from A и т.д.
3. Создаю TField (FieldKind = fkLookup) для каждого справочника.
Только вот произвольную сортировку по любому полю сделать не получается. Не сортируются lookup, хоть тресни!


 
passm ©   (2003-02-07 13:09) [15]

User_OKA © (07.02.03 12:28)> ??? Если действовать по схеме <passm © (07.02.03 09:27)>, то сортировка происходит не по lookup полю, а по полю, возвращенному SELECT"ом в части GROUP BY.
Попродую подробнее.
SELECT T1.*, S1.NAME AS SPRAVKA_NAME
FROM TABLE T1
LEFT OUTER JOIN SPRAVKA1 S1 ON (T1.SPRAVKA1 = S1.ID)
ORDER BY SPRAVKA_NAME
Это запрос. Далее открываешь Fields Editor и добавляешь все поля (Add all Fields). Выбираешь поле SPRAVKA_NAME и указываешь:
FieldKind = fkLookup & LookupDataSet & KeyFields...


 
Andriano ©   (2003-02-07 13:28) [16]

В FIB-ах с вер. 4.77 появилась локальная сортировка по LOOKUP-полям.


 
User_OKA ©   (2003-02-07 14:15) [17]

Спасибо всем за ответы.
Буду копать!


 
User_OKA ©   (2003-02-19 10:00) [18]

А как в версиях FIB 4.77 осуществляется сотировка по LookUp-полям?


 
Johnmen ©   (2003-02-19 10:57) [19]

см. DoSort и DoSortEx, разобраться можно за полчаса...:)))
(сортировка локальная)


 
User_OKA ©   (2003-02-19 13:48) [20]

to Johnmen
Огромное спасибо! Разберемся.


 
User_OKA ©   (2003-02-20 10:06) [21]

Кстати, в FIBPlus DoSort и DoSortEx не сортируют LookUp-поля!
Что делать-то?


 
DarkGreen ©   (2003-02-20 11:25) [22]

Думаю можно, но для этого потребуется малость поработать.
Поизучай модуль FIBDataSet, там есть методы DoSort, DoSortEx, а так же процедуры Sort и FastSort, вот у FastSort есть Compare & Compare1 думается тебе сюда, переопределяй их и юзай.
Но я могу ошибаться



Страницы: 1 вся ветка

Текущий архив: 2003.03.10;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.016 c
14-30025
Andrey
2003-02-24 12:11
2003.03.10
Как отцепить курсор мышки от самой мышки


14-30041
Vvedensk
2003-02-20 14:09
2003.03.10
Инсталяция компанента...


14-30074
shusha
2003-02-21 17:21
2003.03.10
Алгоритм


1-29910
Sectey
2003-02-26 19:24
2003.03.10
Словари в MsOffice


14-30068
Palladin
2003-02-21 13:53
2003.03.10
Подскажите имя hlp файла для Microsoft Data Access SDK