Как сделать lookup для поля, по которому идет сортировка

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
Andrey B
Сообщения: 4
Зарегистрирован: 04 дек 2005, 17:42

Как сделать lookup для поля, по которому идет сортировка

Сообщение Andrey B » 04 дек 2005, 18:00

Доброго времени суток!
Есть TIBTable с lookup-полем, данные из этой таблице отображаются в TDBGridEh (ehlib). При таком раскладе вроде бы все хорошо и при добавлении/редактировании записи значение lookup-поля можно выбирать из выпадающего списка.
Но появилась необходимость сделать сортировку отображаемой таблицы по _отображаемому_ значению этого lookup-поля.
Единственное решение, которое я знаю, это использовать вместо TIBTable другой датасет (TIBQuery или TIBDataSet), где значение lookup-поля можно получить через join. Но при таком подходе пропадает возможность при редактировании записи выбирать значение этого поля из выпадающего списка.
Хотелось бы узнать, есть ли такое решение, при котором и по полю можно сортировать и при редактировании выбирать значение из списка.
Используется: IB 6.5, IBX, EhLib, C++Builder 6

SAMZ
Сообщения: 128
Зарегистрирован: 21 мар 2005, 08:17

Re: Как сделать lookup для поля, по которому идет сортировка

Сообщение SAMZ » 06 дек 2005, 16:02

Andrey B писал(а):Доброго времени суток!
Хотелось бы узнать, есть ли такое решение, при котором и по полю можно сортировать и при редактировании выбирать значение из списка.
Используется: IB 6.5, IBX, EhLib, C++Builder 6
Как вариант предложил бы Вам для сортировки это поле получать в TIBQuery запросом, а для редактирования одновременно с этим использовать LookUp. При этом могут возникнуть впросы с порядком записи после редактирования. Вопросы буферной сортировки неплохо решены в FIBPlus

SAMZ
Сообщения: 128
Зарегистрирован: 21 мар 2005, 08:17

Re: Как сделать lookup для поля, по которому идет сортировка

Сообщение SAMZ » 06 дек 2005, 16:03

Andrey B писал(а):Доброго времени суток!
Хотелось бы узнать, есть ли такое решение, при котором и по полю можно сортировать и при редактировании выбирать значение из списка.
Используется: IB 6.5, IBX, EhLib, C++Builder 6
Как вариант предложил бы Вам для сортировки это поле получать в TIBQuery запросом, а для редактирования одновременно с этим использовать LookUp. При этом могут возникнуть впросы с порядком записи после редактирования. Вопросы буферной сортировки неплохо решены в FIBPlus

Andrey B
Сообщения: 4
Зарегистрирован: 04 дек 2005, 17:42

Сообщение Andrey B » 07 дек 2005, 14:47

Как вариант предложил бы Вам для сортировки это поле получать в TIBQuery запросом, а для редактирования одновременно с этим использовать LookUp.
Спасибо, за ответ. Только не совсем понятно какой LookUp имеется в виду: контрол TDBLookupComboBox или ряд свойств поля (объект типа TField). Если первое - то хотелось бы все же иметь возможность выбирать из списка непосредственно в таблице, если второе - то свойства LookupDataSet и прочие Lookup... судя по справке не используються при FieldKind отличном от fkLookup. А при получении с помощью запроса придется выставлять FieldKind = fkData.
При этом могут возникнуть впросы с порядком записи после редактирования.
Порядком записей в основной таблице или в выпадающем lookup-списке?
Вопросы буферной сортировки неплохо решены в FIBPlus
Не совсем понял ? Обязательно ли использование в данном случае буферной (на стороне клиента) сортировки или с этим может успешно справиться серверная часть?

SAMZ
Сообщения: 128
Зарегистрирован: 21 мар 2005, 08:17

Сообщение SAMZ » 07 дек 2005, 15:47

Andrey B писал(а):
Спасибо, за ответ. Только не совсем понятно какой LookUp имеется в виду: контрол TDBLookupComboBox или ряд свойств поля (объект типа TField). Если первое - то хотелось бы все же иметь возможность выбирать из списка непосредственно в таблице, если второе - то свойства LookupDataSet и прочие Lookup... судя по справке не используються при FieldKind отличном от fkLookup. А при получении с помощью запроса придется выставлять FieldKind = fkData.
При этом могут возникнуть впросы с порядком записи после редактирования.
Порядком записей в основной таблице или в выпадающем lookup-списке?
Вопросы буферной сортировки неплохо решены в FIBPlus
Не совсем понял ? Обязательно ли использование в данном случае буферной (на стороне клиента) сортировки или с этим может успешно справиться серверная часть?
Поле с установленным fkLookup можно использовать хоть в гриде хоть в TDBLookupComboBox. Дело хозяйское. Вопрос в первоначальной редакции сводился к необходимости сортировки fkLookup полю. Как Вариант я предложил в наборе - запросе работать с двумя полями fkLookup для редактирования и fkData для сортировки. То есть Вы в SQL набора связываетй таблицы и вытаскиваете неоходимое Вам поле в виде fkData, одновременно то же поле в том же наборе представлеете в виде fkLookup.
Буферная сортировка - это естественно клиент. Если не нравится, то после редактирования fkLookup поля придется делать FullRefresh

Andrey B
Сообщения: 4
Зарегистрирован: 04 дек 2005, 17:42

Сообщение Andrey B » 07 дек 2005, 22:16

Поле с установленным fkLookup можно использовать хоть в гриде хоть в TDBLookupComboBox. Дело хозяйское. Вопрос в первоначальной редакции сводился к необходимости сортировки fkLookup полю. Как Вариант я предложил в наборе - запросе работать с двумя полями fkLookup для редактирования и fkData для сортировки. То есть Вы в SQL набора связываетй таблицы и вытаскиваете неоходимое Вам поле в виде fkData, одновременно то же поле в том же наборе представлеете в виде fkLookup.
Буферная сортировка - это естественно клиент. Если не нравится, то после редактирования fkLookup поля придется делать FullRefresh
Все стало понятно. Да, это подходящее решение и наверное я им воспользуюсь (еще раз большое спасибо).
Только небольшая поправка: в результируюшей таблице должно быть не два, а три поля (значение lookup-поля (FK на справочник), отображаемое значение типа fkData и отображаемое значение типа fkLookup).

Вот только хотелось бы понять по поводу необходимости/оптимальности использования буферной сортировки. Не будет ли достаточным вызова метода refresh у TIBDataSet, который получает из базы только отредактированную запись? И не могли бы вы порекомендовать какие-нибудь хорошие статьи по поводу организации буферной обработки на клиенте.

SAMZ
Сообщения: 128
Зарегистрирован: 21 мар 2005, 08:17

Сообщение SAMZ » 08 дек 2005, 06:22

Andrey B писал(а): Все стало понятно. Да, это подходящее решение и наверное я им воспользуюсь (еще раз большое спасибо).
Только небольшая поправка: в результируюшей таблице должно быть не два, а три поля (значение lookup-поля (FK на справочник), отображаемое значение типа fkData и отображаемое значение типа fkLookup).

Вот только хотелось бы понять по поводу необходимости/оптимальности использования буферной сортировки. Не будет ли достаточным вызова метода refresh у TIBDataSet, который получает из базы только отредактированную запись? И не могли бы вы порекомендовать какие-нибудь хорошие статьи по поводу организации буферной обработки на клиенте.
Все зависит от используемой Вами библиотеки доступа. Так, например FIBPlus при Refresh обеспечивает обновление текущей записи и, естественно, сортировку набора не обновляет. FullRefresh переоткрывает набор и при этом с сортировкой все будет нормально. По работе с буфером посмотрите Мир Интербейс. Там достаточно детально прописано как это делать, но в предположении, что используется опять же библиотека FIBPlus. Не могу Вам сказать точно, в каких еще библиотеках доступа реализована технология работы с DataSet непосредственно в буфере. Я прочно сел на FIBPlus и очнь этим доволен.

Andrey B
Сообщения: 4
Зарегистрирован: 04 дек 2005, 17:42

Сообщение Andrey B » 10 дек 2005, 12:27

Большое спасибо за ответы.

Ответить