Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
14-30090
Случайный прохожий
2003-02-22 02:21
2003.03.10
Всё! Первый


9-29695
AXe
2002-09-26 19:30
2003.03.10
Как сделать мультиплеер в DelphiX?


1-29805
Шурик Ш
2003-02-27 18:15
2003.03.10
А можно ли выровнять колонку StringGrid а по правому краю?


14-30075
DX_com
2003-02-21 18:34
2003.03.10
Фиг знает....


3-29729
F1
2003-02-19 11:05
2003.03.10
AV при ADOQuery.ExecSQL





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский