![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как сделать Lookup поле с динамическим списком?
lightix © (2003-04-04 10:01:00)Помогите разобраться с такой проблемой:
на Query есть Lookup поле, в качестве списка к которому прицеплено другое Query. Необходимо чтобы для каждой записи этот список был в зависимости от ключа разным. Т.е. например в таблице-справочнике есть записи вида (цех, номер отдела), а в другую таблицу нужно вносить цех, и в зависимости от этого цеха подтягивать в список отделов (TLookupComboBox) ОТДЕЛЫ ТОЛЬКО ВВЕДЕННОГО цеха. И так для каждой записи.
Пробовал пересобирать Query-справочник отделов для каждой записи - получается что для всей таблицы действует последний запрос и некоторые поля пустые т.к. в списке не хватает значений для них.
Подскажите что можно сделать в данном случае?
lightix (2003-04-04 13:32:00) [1]Написал вот так в AfterScroll:
Query2->Filter="CEX="+Query1->Fields->FieldByName("CEX")->AsString;
Query->Refresh();
Так работает нормально, без "пропадания", но заметно тормозит:(
Может есть какие соображения по этому поводу?
lightix (2003-04-04 11:57:00) [2]Угу, работает, только сейчас наблюдается такое:
в таблице 2 записи - см выше
при выполнении запроса все светится красиво. но когда становлючсь на запись с 15-ю отделами, в ней вместо отдела (15) всетится пустота, хотя в списке есть все значения (все 15), и последнее (15) не выбирается :(( Только если выбрать 14, а потом 15, только тогда номально получается... Не пойму, почему так?
И в какой именно момент (какое событие) отключать фильтр?
Соловьев (2003-04-04 11:45:00) [3]понял, млин, что-то торможу :)))))
> Johnmen © (04.04.03 10:17)
> Може достаточно ставить фильтр на лукапный НД.
а потом отключать его после выбора код поменяется так:
AfterScroll:
...
Query2.Filter = "СУЧ = "+QuotedStr(Query.FieldByName("CEX").AsString);
...
lightix (2003-04-04 11:34:00) [4]У меня на форме DBCtrlGrid - сразу видно несколько записей. Вот и получается, что когда в списке значений меньше чем значение в одной из записей, то в ней (записи этой) вместо значения высвечивается пустота (что вполне логично, т.к. этого значения нет в списке)
Соловьев (2003-04-04 11:26:00) [5]
> на 1-ю запись, во 2-й пропадает NOTD, т.к. в Query2 список
> из 14-ти значений
не понял как это???
на первую запись чего?
2-й кого???
lightix (2003-04-04 11:22:00) [6]я именно так и делал. вот чего получается - это основная Query (S_TRUD)
CEX NOTD
1 14
2 15
в справочнике S_OTD для 1 цеха 14 отделов, для 2-го 15 отделов.
когда становишься на 1-ю запись, во 2-й пропадает NOTD, т.к. в Query2 список из 14-ти значений.
Соловьев (2003-04-04 11:11:00) [7]три набора данных. 1-й твоя редактируемая таблица с двумя LookUp полями . 1-е поле выбирается из Query:
select * from s_pz
Повесить на обработчик события AfterScroll такой код:
With Query2 do
begin
Close;
ParamByName("pCex").AsInteger := Query.FieldByName("CEX").AsInteger;
Open;
end;
А в свойстве SQL написать :
select * from s_otd where cex=:pCex
lightix (2003-04-04 11:03:00) [8]SQL> desc s_pz;
KZ NOT NULL NUMBER(2)
CEX NOT NULL NUMBER(3)
NACP VARCHAR2(40)
NACK VARCHAR2(20)
PRB1 NUMBER(1)
PRB2 NUMBER(1)
LANG VARCHAR2(2)
DATEN DATE
DATEK DATE
KGR NUMBER(2)
она тоже загнана в DBLookUpComboBox как список
Соловьев (2003-04-04 10:55:00) [9]
> CEX (выбирается из справочника цехов)
это что за таблица?
Johnmen (2003-04-04 10:51:00) [10]да-да-да, давай подробно и по-русски :)
lightix (2003-04-04 10:51:00) [11]Соловьев, в таблицу S_TRUD вставляю
CEX (выбирается из справочника цехов)
и NOTD - вот его нужно выбирать из справочника S_OTD по CEX, введенному выше.
И так для каждой записи
Соловьев (2003-04-04 10:46:00) [12]в какую таблицу что ты вставляешь? и опиши русскими словами поля.
MsGuns (2003-04-04 10:45:00) [13]Отказаться от LookUp как от лукавого и использовать "дочерний" НД, получаемый по "горячему" параметрическому запросу. Отображается в гриде, положенном в отд.панель или форму, активизируемую по нажатию соотв.кнопки в ячейке грида, отображающего осн. НД. Преимуществ много,- одно из них - возможность "на лету" правки самих справочников.
lightix (2003-04-04 10:44:00) [14]Johnmen, сделал LookUpCache=true - всеравно пропадает :(
Johnmen (2003-04-04 10:39:00) [15]Извени, повторюсь.
Чтобы не пропадало - кеширование лукапного поля...
Причем в момент получения лукапного НД (Open), фильтр на нем не должен стоять !
lightix (2003-04-04 10:33:00) [16]вот таблица, на которой работает эта программа
desc s_trud
KZ NUMBER(2)
CEX NUMBER(3)
DOLJ NUMBER(8)
RAZR NUMBER(1)
NOTD VARCHAR2(2)
FL_DIAP NUMBER(1)
вот таблица, из которой нужно сделать список отделов
desc s_otd
KZ NOT NULL NUMBER(2)
CEX NOT NULL NUMBER(3)
NOTD NOT NULL VARCHAR2(2)
NAOTD VARCHAR2(70)
PS Попробовал только что в справочнике выбрать все, без параметра, и для этого Query менять Filter "CEX="цеху в этой записи. Работает, но всеравно пропадают значения.
Может не там вставил?
list_notd->Filter="CEX="+
q_s_trud->Fields->FieldByName("CEX")->AsString;
вот это вставил в AfterScroll на и OnChange на цех.
Соловьев (2003-04-04 10:23:00) [17]что-то вообще не понятно что у тебя происходит. Приведи структуру своих таблиц.
lightix (2003-04-04 10:21:00) [18]Johnmen, расскажи подробнее про фильтр - где он находится и чего включить?
lightix (2003-04-04 10:20:00) [19]Так и делал. Не то.
Например если у меня 2 записи в таблице:
CEX NOTD
1 2
2 5
и в 1-м цехе 2 отдела, а во 2-м - 5 отделов, то после того как параметр передастся для 1-й записи, в справочнике будут 2 записи и для записи со 2-м цехом не хватит значений в этом списке, будет светиться пустота ....
Или я не там передаю параметр - в AfterScroll на Query и OnChange на поле CEX на Query ?
Johnmen (2003-04-04 10:17:00) [20]Може достаточно ставить фильтр на лукапный НД.
А чтобы не пропадало - вкл.кеширование лукапного поля...