Проблемы с Delphi XE2, DataSnap и Lookup Field

У меня тут небольшая проблема. Я создал поле поиска на своем сервере приложений, используя технологию Delphi XE2 DataSnap. На стороне клиента это поле становится TStringField. Теперь проблема в том, что я теряю функциональность поиска на стороне клиента. Кроме того, я не могу изменить строковое поле на стороне клиента, потому что оно доступно только для чтения (даже если я вручную отключу свойство только для чтения).

Я не хочу просматривать таблицы поиска на стороне клиента, потому что я не хочу, чтобы все данные загружались на мою сторону клиента только для поддержки поиска.

Я могу изменить значение поля «Ключ», но текст поиска строкового поля не изменится, если я не применю обновления и не перезагружу данные.

Пользователи хотят видеть изменение текста.

Что я должен делать?


person Nirav KAKU    schedule 01.02.2012    source источник
comment
Как вы можете писать в поле поиска в обычном (не DataSnap) приложении?   -  person mjn    schedule 01.02.2012
comment
не DataSnap является простым. Вы создаете поле поиска и все. Однако с Datasnap совсем другое дело (как объяснялось выше).   -  person Nirav KAKU    schedule 02.02.2012


Ответы (2)


Кажется, вам нужно пересмотреть функциональность вашего графического интерфейса: поля поиска на самом деле являются функцией на стороне клиента. И ему нужен источник поиска, поэтому, чтобы использовать его на клиенте, таблица поиска должна быть загружена. Ребята из DataSnap здесь очень хороши, преобразовывая его в TStringField при передаче клиенту... Я бы просто проигнорировал это.

Таким образом, если таблица поиска такая большая, вам следует использовать не поля поиска, а поисковые интерфейсы или поля со списком с автозаполнением, которые вы выполняете для запросов к серверу DataSnap. Может быть, вам нужно закодировать это вручную в случае со списком, я не знаю (посмотрите, есть ли в JVCL что-то, что вы можете использовать для сокращения пути).

В качестве альтернативы, если таблица поиска редко обновляется, вы можете агрессивно кэшировать ее и иметь механизм обновления для обнаружения изменений. Таким образом, вы можете использовать поля поиска так, как они были созданы.

person Fabricio Araujo    schedule 02.02.2012
comment
Эй, Фабрицио, это меня одновременно радует и огорчает! Во всяком случае, вот что я сделал. Я отпустил поле поиска. Вместо этого я создал поле Calc на стороне клиента. В calc я вызываю функцию сервера, которая ищет нужное мне значение на основе данных клиента. работает довольно хорошо на самом деле. Я думаю, что это «неоднородно», но что поделаешь. :-) - person Nirav KAKU; 03.02.2012
comment
Поля поиска — это функция, упрощающая настройку элементов управления поиском, но ничем не отличающаяся от работы TDbLookupComboBox. Ему нужен источник данных происхождения и источник данных поиска. Он берет значение поля («Ключ») из источника и выполняет поиск связывающего поля («Ключ поиска») в источнике поиска и, если он найден, показывает значение другого поля («Отображение») в поле поиска. В этом больше нет магии. ;-) Кстати, вы примете этот ответ? ;-) - person Fabricio Araujo; 06.02.2012
comment
Я сделал именно это. Я написал функцию, которая принимает имя таблицы, имя поля, значение поля и имя возвращаемого поля. Единственная проблема, он вызывает сервер каждый раз, когда вызывается событие поля calc, но нагрузка незначительна. :-) - person Nirav KAKU; 10.02.2012

Давным-давно я столкнулся с этой проблемой и нашел решение, которое немного сложно анализировать здесь, но я попытаюсь дать некоторые рекомендации, пока у меня не будет времени написать подробный пост в блоге. Идея состоит из информации (касающейся полей поиска, таких как свойства поля, наборы данных, провайдеры), упакованной провайдером как необязательные параметры на стороне сервера. На стороне клиента производный TClientDataset может распаковывать и обрабатывать эту информацию, создавать на лету клиентские наборы данных, которые извлекают необходимые наборы данных поиска и соответствующим образом настраивают поля поиска. Процесс прозрачен из-за встроенной функциональности в производном классе клиентского набора данных, и единственное, что нужно помнить, — это создать эту информацию в событии OnGetDatasetProperties поставщика и установить ложные все флаги поставщика в полях поиска.

person G.Vavoulogiannis    schedule 10.02.2012
comment
Я написал сообщение в блоге и опубликовал библиотеку. Вот он: «LookCDS», небольшой библиотечный набор функций, классов и компонентов для Delphi, который включает и использует на стороне клиента поля поиска, определенные в удаленном модуле привязки данных. g-vavoulogiannis.blogspot.com/2012/02/ - person G.Vavoulogiannis; 18.02.2012