Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сортировка LokUp-полей [D5, IB5.x, IB6.x]


Страницы:   1 2

User_OKA ©   (2003-02-06 09:12:00) 

В общем, с самого начала.
Существют таблицы - справочники:
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", но сами значения справочника для пользователя все равно остаются неотсортированными.
Что делать?


DarkGreen   (2003-02-20 11:25:00) [1]

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


User_OKA   (2003-02-20 10:06:00) [2]

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


User_OKA   (2003-02-19 13:48:00) [3]

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


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

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


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

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


User_OKA   (2003-02-07 14:15:00) [6]

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


Andriano   (2003-02-07 13:28:00) [7]

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


passm   (2003-02-07 13:09:00) [8]

User_OKA © (07.02.03 12:28)> ??? Если действовать по схеме , то сортировка происходит не по 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...


User_OKA   (2003-02-07 12:28:00) [9]

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


User_OKA   (2003-02-07 12:27:00) [10]

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


passm   (2003-02-07 09:27:00) [11]

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


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

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

Саня

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


User_OKA   (2003-02-07 09:07:00) [13]

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


User_OKA   (2003-02-07 09:06:00) [14]

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


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

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


AlexSerp   (2003-02-06 14:57:00) [16]

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

Саня.

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


User_OKA   (2003-02-06 13:50:00) [17]

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


Johnmen   (2003-02-06 12:58:00) [18]

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

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


Val   (2003-02-06 12:46:00) [19]

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


User_OKA   (2003-02-06 12:24:00) [20]

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо