Як зробити lookup поле з динамічним списком

Як зробити Lookup поле з динамічним списком?

Допоможіть розібратися з такою проблемою:
на Query є Lookup поле, як список до якого причеплено інше Query. Необхідно щоб для кожного запису цей список був в залежності від ключа різним. Тобто наприклад в таблиці-довіднику є записи виду (цех, номер відділу), а в іншу таблицю потрібно вносити цех, і в залежності від цього цеху підтягувати до списку відділів (TLookupComboBox) ВІДДІЛИ тільки введення цеху. І так для кожного запису.
Пробував збирати заново Query-довідник відділів для кожного запису - виходить що для всієї таблиці діє останній запит і деякі поля порожні тому в списку не вистачає значень для них.
Підкажіть що можна зробити в даному випадку?

Використовувати параметр в запиті-довіднику, в нього передавати номер цеху з поточного запису

Може досить ставити фільтр на лукапний НД.
А щоб не пропадало - вкл.кешірованіе лукапного поля.

Так і робив. Не те.
Наприклад якщо у мене 2 записи в таблиці:
CEX NOTD
1 2
2 5
і в 1-му цеху 2 відділу, а у 2-му - 5 відділів, то після того як параметр передасться для 1-й записи, в довіднику будуть 2 записи і для запису з 2-м цехом не вистачить значень в цьому списку, світитиметься порожнеча.
Або я не там передаю параметр - в AfterScroll на Query і OnChange на поле CEX на Query?

Johnmen, розкажи докладніше про фільтр - де він знаходиться і чого включити?

щось взагалі не зрозуміло що у тебе відбувається. Приведи структуру своїх таблиць.

ось таблиця, на якій працює ця програма
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 на цех.

Извени, повторюся.
Щоб не пропадало - кешування лукапного поля.
Причому в момент отримання лукапного НД (Open), фільтр на ньому не повинен стояти.

Johnmen, зробив LookUpCache = true - всерівно пропадає :(

Відмовитися від LookUp як від лукавого і використовувати "дочірній" НД, що отримується по "гарячим" параметричного запиту. Відображається в гріді, призначеному в отд.панель або форму, що активізується після натискання соотв.кнопкі в осередку гріда, що відображає осн. НД. Переваг багато, - одне з них - можливість "на льоту" правки самих довідників.

в яку таблицю що ти вставляєш? і опиши російськими словами поля.

да-да-да, давай детально і по-російськи :)

Соловйов, в таблицю S_TRUD вставляю
CEX (вибирається з довідника цехів)
і NOTD - ось його потрібно вибирати з довідника S_OTD по CEX, введеному вище.
І так для кожного запису


> CEX (вибирається з довідника цехів)

це що за таблиця?

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 як список

три набори даних. 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

я саме так і робив. ось чого виходить - це основна Query (S_TRUD)
CEX NOTD
1 14
2 15

в довіднику S_OTD для 1 цеху 14 відділів, для 2-го 15 відділів.
коли стаєш на 1-ю запис, у 2-й пропадає NOTD, тому що в Query2 список з 14-ти значень.


> На 1-ю запис, у 2-й пропадає NOTD, тому що в Query2 список
> З 14-ти значень

не зрозумів як це.

на перший запис чого?

У мене на формі DBCtrlGrid - відразу видно кілька записів. Ось і виходить, що коли в списку значень менше ніж значення в одному із записів, то в ній (записи цієї) замість значення висвічується порожнеча (що цілком логічно, тому що цього значення немає в списку)

Угу, працює, тільки зараз спостерігається таке:
в таблиці 2 записи - см вище
при виконанні запиту все світиться красиво. але коли становлючсь на запис з 15-ю відділами, в ній замість відділу (15) всет порожнеча, хоча в списку є всі значення (всі 15), і останнє (15) не вибирають: ((Тільки якщо вибрати 14, а потім 15 , тільки тоді номально виходить. Не розумію, чому так?
І в який саме момент (яка подія) відключати фільтр?

Написав ось так в AfterScroll:
Query2-> Filter = "CEX =" + Query1-> Fields-> FieldByName ( "CEX") -> AsString;
Query-> Refresh ();

Так працює нормально, без "провалля", але помітно гальмує :(
Може є якісь міркування з цього приводу?

Пам'ять: 0.76 MB
Час: 0.031 c

Схожі статті