Страница 1 из 1

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

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

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

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

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

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

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

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

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

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

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

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

Добавлено: 10 дек 2005, 12:27
Andrey B
Большое спасибо за ответы.