Как сделать lookup для поля, по которому идет сортировка
Модератор: kdv
Как сделать lookup для поля, по которому идет сортировка
Доброго времени суток!
Есть TIBTable с lookup-полем, данные из этой таблице отображаются в TDBGridEh (ehlib). При таком раскладе вроде бы все хорошо и при добавлении/редактировании записи значение lookup-поля можно выбирать из выпадающего списка.
Но появилась необходимость сделать сортировку отображаемой таблицы по _отображаемому_ значению этого lookup-поля.
Единственное решение, которое я знаю, это использовать вместо TIBTable другой датасет (TIBQuery или TIBDataSet), где значение lookup-поля можно получить через join. Но при таком подходе пропадает возможность при редактировании записи выбирать значение этого поля из выпадающего списка.
Хотелось бы узнать, есть ли такое решение, при котором и по полю можно сортировать и при редактировании выбирать значение из списка.
Используется: IB 6.5, IBX, EhLib, C++Builder 6
Есть TIBTable с lookup-полем, данные из этой таблице отображаются в TDBGridEh (ehlib). При таком раскладе вроде бы все хорошо и при добавлении/редактировании записи значение lookup-поля можно выбирать из выпадающего списка.
Но появилась необходимость сделать сортировку отображаемой таблицы по _отображаемому_ значению этого lookup-поля.
Единственное решение, которое я знаю, это использовать вместо TIBTable другой датасет (TIBQuery или TIBDataSet), где значение lookup-поля можно получить через join. Но при таком подходе пропадает возможность при редактировании записи выбирать значение этого поля из выпадающего списка.
Хотелось бы узнать, есть ли такое решение, при котором и по полю можно сортировать и при редактировании выбирать значение из списка.
Используется: IB 6.5, IBX, EhLib, C++Builder 6
Re: Как сделать lookup для поля, по которому идет сортировка
Как вариант предложил бы Вам для сортировки это поле получать в TIBQuery запросом, а для редактирования одновременно с этим использовать LookUp. При этом могут возникнуть впросы с порядком записи после редактирования. Вопросы буферной сортировки неплохо решены в FIBPlusAndrey B писал(а):Доброго времени суток!
Хотелось бы узнать, есть ли такое решение, при котором и по полю можно сортировать и при редактировании выбирать значение из списка.
Используется: IB 6.5, IBX, EhLib, C++Builder 6
Re: Как сделать lookup для поля, по которому идет сортировка
Как вариант предложил бы Вам для сортировки это поле получать в TIBQuery запросом, а для редактирования одновременно с этим использовать LookUp. При этом могут возникнуть впросы с порядком записи после редактирования. Вопросы буферной сортировки неплохо решены в FIBPlusAndrey B писал(а):Доброго времени суток!
Хотелось бы узнать, есть ли такое решение, при котором и по полю можно сортировать и при редактировании выбирать значение из списка.
Используется: IB 6.5, IBX, EhLib, C++Builder 6
Спасибо, за ответ. Только не совсем понятно какой LookUp имеется в виду: контрол TDBLookupComboBox или ряд свойств поля (объект типа TField). Если первое - то хотелось бы все же иметь возможность выбирать из списка непосредственно в таблице, если второе - то свойства LookupDataSet и прочие Lookup... судя по справке не используються при FieldKind отличном от fkLookup. А при получении с помощью запроса придется выставлять FieldKind = fkData.Как вариант предложил бы Вам для сортировки это поле получать в TIBQuery запросом, а для редактирования одновременно с этим использовать LookUp.
Порядком записей в основной таблице или в выпадающем lookup-списке?При этом могут возникнуть впросы с порядком записи после редактирования.
Не совсем понял ? Обязательно ли использование в данном случае буферной (на стороне клиента) сортировки или с этим может успешно справиться серверная часть?Вопросы буферной сортировки неплохо решены в FIBPlus
Поле с установленным fkLookup можно использовать хоть в гриде хоть в TDBLookupComboBox. Дело хозяйское. Вопрос в первоначальной редакции сводился к необходимости сортировки fkLookup полю. Как Вариант я предложил в наборе - запросе работать с двумя полями fkLookup для редактирования и fkData для сортировки. То есть Вы в SQL набора связываетй таблицы и вытаскиваете неоходимое Вам поле в виде fkData, одновременно то же поле в том же наборе представлеете в виде fkLookup.Andrey B писал(а):Спасибо, за ответ. Только не совсем понятно какой LookUp имеется в виду: контрол TDBLookupComboBox или ряд свойств поля (объект типа TField). Если первое - то хотелось бы все же иметь возможность выбирать из списка непосредственно в таблице, если второе - то свойства LookupDataSet и прочие Lookup... судя по справке не используються при FieldKind отличном от fkLookup. А при получении с помощью запроса придется выставлять FieldKind = fkData.
Порядком записей в основной таблице или в выпадающем lookup-списке?При этом могут возникнуть впросы с порядком записи после редактирования.
Не совсем понял ? Обязательно ли использование в данном случае буферной (на стороне клиента) сортировки или с этим может успешно справиться серверная часть?Вопросы буферной сортировки неплохо решены в FIBPlus
Буферная сортировка - это естественно клиент. Если не нравится, то после редактирования fkLookup поля придется делать FullRefresh
Все стало понятно. Да, это подходящее решение и наверное я им воспользуюсь (еще раз большое спасибо).Поле с установленным fkLookup можно использовать хоть в гриде хоть в TDBLookupComboBox. Дело хозяйское. Вопрос в первоначальной редакции сводился к необходимости сортировки fkLookup полю. Как Вариант я предложил в наборе - запросе работать с двумя полями fkLookup для редактирования и fkData для сортировки. То есть Вы в SQL набора связываетй таблицы и вытаскиваете неоходимое Вам поле в виде fkData, одновременно то же поле в том же наборе представлеете в виде fkLookup.
Буферная сортировка - это естественно клиент. Если не нравится, то после редактирования fkLookup поля придется делать FullRefresh
Только небольшая поправка: в результируюшей таблице должно быть не два, а три поля (значение lookup-поля (FK на справочник), отображаемое значение типа fkData и отображаемое значение типа fkLookup).
Вот только хотелось бы понять по поводу необходимости/оптимальности использования буферной сортировки. Не будет ли достаточным вызова метода refresh у TIBDataSet, который получает из базы только отредактированную запись? И не могли бы вы порекомендовать какие-нибудь хорошие статьи по поводу организации буферной обработки на клиенте.
Все зависит от используемой Вами библиотеки доступа. Так, например FIBPlus при Refresh обеспечивает обновление текущей записи и, естественно, сортировку набора не обновляет. FullRefresh переоткрывает набор и при этом с сортировкой все будет нормально. По работе с буфером посмотрите Мир Интербейс. Там достаточно детально прописано как это делать, но в предположении, что используется опять же библиотека FIBPlus. Не могу Вам сказать точно, в каких еще библиотеках доступа реализована технология работы с DataSet непосредственно в буфере. Я прочно сел на FIBPlus и очнь этим доволен.Andrey B писал(а): Все стало понятно. Да, это подходящее решение и наверное я им воспользуюсь (еще раз большое спасибо).
Только небольшая поправка: в результируюшей таблице должно быть не два, а три поля (значение lookup-поля (FK на справочник), отображаемое значение типа fkData и отображаемое значение типа fkLookup).
Вот только хотелось бы понять по поводу необходимости/оптимальности использования буферной сортировки. Не будет ли достаточным вызова метода refresh у TIBDataSet, который получает из базы только отредактированную запись? И не могли бы вы порекомендовать какие-нибудь хорошие статьи по поводу организации буферной обработки на клиенте.