Форум: "Базы";
Текущий архив: 2003.04.24;
Скачать: [xml.tar.bz2];
ВнизКак сделать Lookup поле с динамическим списком? Найти похожие ветки
← →
lightix (2003-04-04 10:01) [0]Помогите разобраться с такой проблемой:
на Query есть Lookup поле, в качестве списка к которому прицеплено другое Query. Необходимо чтобы для каждой записи этот список был в зависимости от ключа разным. Т.е. например в таблице-справочнике есть записи вида (цех, номер отдела), а в другую таблицу нужно вносить цех, и в зависимости от этого цеха подтягивать в список отделов (TLookupComboBox) ОТДЕЛЫ ТОЛЬКО ВВЕДЕННОГО цеха. И так для каждой записи.
Пробовал пересобирать Query-справочник отделов для каждой записи - получается что для всей таблицы действует последний запрос и некоторые поля пустые т.к. в списке не хватает значений для них.
Подскажите что можно сделать в данном случае?
← →
Lord Warlock (2003-04-04 10:09) [1]Использовать параметр в запросе-справочнике, в него передавать номер цеха из текущей записи
← →
Johnmen (2003-04-04 10:17) [2]Може достаточно ставить фильтр на лукапный НД.
А чтобы не пропадало - вкл.кеширование лукапного поля...
← →
lightix (2003-04-04 10:20) [3]Так и делал. Не то.
Например если у меня 2 записи в таблице:
CEX NOTD
1 2
2 5
и в 1-м цехе 2 отдела, а во 2-м - 5 отделов, то после того как параметр передастся для 1-й записи, в справочнике будут 2 записи и для записи со 2-м цехом не хватит значений в этом списке, будет светиться пустота ....
Или я не там передаю параметр - в AfterScroll на Query и OnChange на поле CEX на Query ?
← →
lightix (2003-04-04 10:21) [4]Johnmen, расскажи подробнее про фильтр - где он находится и чего включить?
← →
Соловьев (2003-04-04 10:23) [5]что-то вообще не понятно что у тебя происходит. Приведи структуру своих таблиц.
← →
lightix (2003-04-04 10:33) [6]вот таблица, на которой работает эта программа
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 на цех.
← →
Johnmen (2003-04-04 10:39) [7]Извени, повторюсь.
Чтобы не пропадало - кеширование лукапного поля...
Причем в момент получения лукапного НД (Open), фильтр на нем не должен стоять !
← →
lightix (2003-04-04 10:44) [8]Johnmen, сделал LookUpCache=true - всеравно пропадает :(
← →
MsGuns (2003-04-04 10:45) [9]Отказаться от LookUp как от лукавого и использовать "дочерний" НД, получаемый по "горячему" параметрическому запросу. Отображается в гриде, положенном в отд.панель или форму, активизируемую по нажатию соотв.кнопки в ячейке грида, отображающего осн. НД. Преимуществ много,- одно из них - возможность "на лету" правки самих справочников.
← →
Соловьев (2003-04-04 10:46) [10]в какую таблицу что ты вставляешь? и опиши русскими словами поля.
← →
Johnmen (2003-04-04 10:51) [11]да-да-да, давай подробно и по-русски :)
← →
lightix (2003-04-04 10:51) [12]Соловьев, в таблицу S_TRUD вставляю
CEX (выбирается из справочника цехов)
и NOTD - вот его нужно выбирать из справочника S_OTD по CEX, введенному выше.
И так для каждой записи
← →
Соловьев (2003-04-04 10:55) [13]
> CEX (выбирается из справочника цехов)
это что за таблица?
← →
lightix (2003-04-04 11:03) [14]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 11:11) [15]три набора данных. 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:22) [16]я именно так и делал. вот чего получается - это основная Query (S_TRUD)
CEX NOTD
1 14
2 15
в справочнике S_OTD для 1 цеха 14 отделов, для 2-го 15 отделов.
когда становишься на 1-ю запись, во 2-й пропадает NOTD, т.к. в Query2 список из 14-ти значений.
← →
Соловьев (2003-04-04 11:26) [17]
> на 1-ю запись, во 2-й пропадает NOTD, т.к. в Query2 список
> из 14-ти значений
не понял как это???
на первую запись чего?
2-й кого???
← →
lightix (2003-04-04 11:34) [18]У меня на форме DBCtrlGrid - сразу видно несколько записей. Вот и получается, что когда в списке значений меньше чем значение в одной из записей, то в ней (записи этой) вместо значения высвечивается пустота (что вполне логично, т.к. этого значения нет в списке)
← →
Соловьев (2003-04-04 11:45) [19]понял, млин, что-то торможу :)))))
> Johnmen © (04.04.03 10:17)
> Може достаточно ставить фильтр на лукапный НД.
а потом отключать его после выбора код поменяется так:
AfterScroll:
...
Query2.Filter = "СУЧ = "+QuotedStr(Query.FieldByName("CEX").AsString);
...
← →
lightix (2003-04-04 11:57) [20]Угу, работает, только сейчас наблюдается такое:
в таблице 2 записи - см выше
при выполнении запроса все светится красиво. но когда становлючсь на запись с 15-ю отделами, в ней вместо отдела (15) всетится пустота, хотя в списке есть все значения (все 15), и последнее (15) не выбирается :(( Только если выбрать 14, а потом 15, только тогда номально получается... Не пойму, почему так?
И в какой именно момент (какое событие) отключать фильтр?
← →
lightix (2003-04-04 13:32) [21]Написал вот так в AfterScroll:
Query2->Filter="CEX="+Query1->Fields->FieldByName("CEX")->AsString;
Query->Refresh();
Так работает нормально, без "пропадания", но заметно тормозит:(
Может есть какие соображения по этому поводу?
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.04.24;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.007 c