Форум: "Базы";
Текущий архив: 2003.03.10;
Скачать: [xml.tar.bz2];
ВнизСортировка 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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.01 c