powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Lookup на 2 зависимых поля в гриде
10 сообщений из 10, страница 1 из 1
Lookup на 2 зависимых поля в гриде
    #32809980
Просто гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как правильно настроить Lookup-поля в такой ситуации?
Имеется таблица абонентов A.
Абонент имеет адрес, нас интересует улица и город.
Код: plaintext
1.
2.
3.
T   (Справочник городов):
  T_ID                
  T_NAME  
  ... 
Код: plaintext
1.
2.
3.
4.
S (Справочник улиц):
  S_ID
  T_ID
  S_NAME
  ...
Код: plaintext
1.
2.
3.
4.
A  (абоненты):
  A_ID
  ...
  S_ID
  ...
Требуется редактировать данные об абонентах в гриде (я использую TDBGridEh),причем город выбирается из полного списка городов, а улица из списка улиц только того города,который выбран ранее.

Я сделал так (используя FIBPlus, сервер БД FB)
1. Dataset dsA имеет поля S_ID, T_ID, для них созданы Lookup-поля A_SName (отображает название улицы) и A_TName (назв. города).
2. для поля A_TName создан Dataset dsTown, SelectSQL = 'SELECT T.TOWN_ID, T.TOWN_NAME FROM TOWN ORDER BY 1'
3. для поля A_SName создан Dataset dsStreet, SelectSQL = 'SELECT S_STREET_ID, S_STREET_NAME FROM STREET WHERE TOWN_ID = :TOWN_ID ORDER BY 1'
4. dsTown и dsStreet связаны как Master-Detail.
5. Lookup поля A_SName и A_TName настроил на соответствующие Dataset'ы (все правильно)

Такая незадача: меняем у одного из абонентов город, и у других абонентов (где город другой) в поле A_SName теряются улицы, поскольку набор dsStreet переоткрывается из-за смены параметра :TOWN_ID.

Реальная задача сложнее, там вместе с улицами задействованы еще и районы города.
У кого был опыт по организации такого редактирования, подскажите оптимальное решение, плиз.
...
Рейтинг: 0 / 0
Lookup на 2 зависимых поля в гриде
    #32810086
Фотография Dim Grishin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты хотел сказать, не выводятся.
Ну, не знаю, как бы я сделал.... :)
Мысли всух:
1. Редактирал в отдельной форме.!!
2. Можно держать еще три фиксированых компонента dataset с полным
списком городов. В lookup'ах брать данные из фильтрованых datasetов.
3. Если используешь sdac, можешь открывать запрос полностью со всеми inner join'ами. + 3 твои dataset'a. После редактирования делаешь RefreshRow.
...
Рейтинг: 0 / 0
Lookup на 2 зависимых поля в гриде
    #32810117
Фотография Sash*
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
очищать надо зависымые поля на onChange мастер записи
...
Рейтинг: 0 / 0
Lookup на 2 зависимых поля в гриде
    #32810400
Delphiman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to Sash*
ты сам понял что сказал?
...
Рейтинг: 0 / 0
Lookup на 2 зависимых поля в гриде
    #32810410
Ну, я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мысли вслух: Вряд-ли лукапы здесь лучшее решение (ИМХО)...Я бы возвращал в единственный(!) датасет уже соединенные поля из всех трех таблиц, включая описания городов и улиц. А на изменения колонок 'назв. города' и 'назв. улицы' ставил обработчик, к-рый запросом проверяет наличие такой записи в справочной таблице.
А где же здесь поиск - спросите ? А поиск в вызываемой доп. форме, к-рая активируется кнопочкой у соотв. колонки в гриде. И которая при активации выполняет требуемый запрос к БД, возвращая результирующую выборку. (Это вместо лукапа). Туда можно передавать доп. усл. типа id_города, чтобы в результирующем запросе возвращались только нужные записи.
Ну и т.д.
Немного громоздко выглядит? Это только при создании такой формочки придется (совсем чуть-чуть!) повозиться, зато потом ее легко использовать во всех аналогичных ситуациях, и не только в гридах. И оставить лукапы только на самые простейшие случаи (из max 5-10 строк).
...
Рейтинг: 0 / 0
Lookup на 2 зависимых поля в гриде
    #32810437
Фотография Sash*
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Delphiman to Sash*
ты сам понял что сказал?
если не догоняешь не повод грубить
...
Рейтинг: 0 / 0
Lookup на 2 зависимых поля в гриде
    #32810535
Константин Заровный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стандартный Lookup ты скорее всего не настроиш.
В большинстве случаев Lookup срабатывает при каждом обращении к записи (GetRecord). Соответственно если ты наложил фильтр на LookupdataSet, то часть занченний (не попавшая под условия фильтра) просто не будет найдена и отобразится пустотой.

Для этого нужно, чтобы компоненты, через которые ты лезеш в БД поддерживали хитрый режим, при котором данные выбираются полным select-ом (со всеми Join и вычисляемыми полями), а lookup и вычисляемые поля считались только при редактировании. (Может быть это похоже на LookupCache, но я в своих компонентах это по другому прикручивал).

Можно попытаться переопределить функцию Lookup, но это все неправильно.

Если твои компоненты сами этого не делают, то прийдется обходиться модальными справочниками.
...
Рейтинг: 0 / 0
Lookup на 2 зависимых поля в гриде
    #32810552
Фотография Sash*
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хм не знаю как на стандартных - я делал на девках - нормально работало
...
Рейтинг: 0 / 0
Lookup на 2 зависимых поля в гриде
    #32810842
Просто гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Народ! Спасибо за участие в решении моей проблемы.
Самой полезным для меня было авторитетное мнение о том, что стандандартными возможностями Lookup полей задача не решается. Мысль о том, чтобы редактировать улицы в модальной форме у меня конечно была, но в моем случае это не подходит. Просто почуствуйте себя в роли оператора, который забивает сотню записей, и для каждой записи в нескольких полях вынужден щелкать на кнопку, открывать форму, выбирать запись, закрывать форму. А по моей идее он нажимает Ins для ввода новой строки, быстро набирает каждое поле (как в Excele), а для полей со значениями из справочника ему достаточно набрать первые 2-3 буквы, не открывая никаких новых окон.
Короче, я решил использовать свойство PickList у TColumnEh из грида. При переходе на редактирование нужного поле нужно будет перезаполнять PickList.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Lookup на 2 зависимых поля в гриде
    #39838690
bas02
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мне удалось сделать зависимое поле через свойство Filter и два события:


procedure TfmOros.dsChecksDataChange(Sender: TObject; Field: TField);
begin

if Field = nil then
begin
qLookupSourceFld.Filter := '';
end;

end;


procedure TfmOros.qCheckssourcefldlookupGetText(Sender: TField;
var Text: String; DisplayText: Boolean);
begin
qLookupSourceFld.Filter := 'sourceid = '+FloatTostr(qChecksSOURCEID.AsFloat);

Text := TField(Sender).asString;

end;
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Lookup на 2 зависимых поля в гриде
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]