![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
разное содержимое комобобокса в одном столбце DbGridEh
topperz © (2006-11-08 14:08:00)Сначала фрагмент БД:
1 таблица – Сотрудники:
КодСотрудника (INTEGER) – первичный ключ
Фамилия, Имя, Отчество и т.д. – разные информативные поля
2 таблица – Проекты:
КодПроекта (CHAR[5]) – первичный ключ
НазваниеПроекта (CHAR[10])
3 таблица – ИсторияПроектов:
Год (INTEGER) – первичный ключ
КодПроекта (CHAR[5]) – первичный ключ
Т.е. в начале каждого года в эту таблицу заносятся действующие на этот год проекты.
4 таблица – ИсторияСотрудников:
Год (INTEGER) – первичный ключ
КодСотрудника (INTEGER) – первичный ключ
КодПроекта (CHAR[5]) – первичный ключ
Ну соответственно здесь хранится инфа о том, кто в каком проекте и в каком году работал.
Надо мне сделать такую штуку. В DBGridEh выводятся данные из 4 таблицы. Надо, чтобы в столбце КодПроекта вместо самого кода был комбобокс со списком названий проектов. Но этот список должен быть разным для каждой строки и зависеть от указанного в данной строке года, т.е. содержать названия только тех проектов, которые действуют в указанном году (в соответствии с таблицей ИсторияПроектов).
Я пытался в событии OnEditButtonClick для этого столбца определять свойства KeyList и PickList путем параметрического запроса. Но это привело к такой проблеме:
Пусть например есть в таблице строки:
2004 1045 PR123
2005 1045 PR230
Щелкаем по комбобоксу на строке с 2005 годом, выпадает список с названиями проектов, актуальных на 2005 год, вроде все нормально. Но если для 2005 года нет проекта с кодом PR123 (который был для 2004 года), то в строке с 2004 годом в столбце КодПроекта останется пустое место (что понятно, раз код PR123 не задан в свойстве KeyList для 2005 года)
Надеюсь, что понятно описал проблему. Есть у кого какие-нибудь соображения на этот счет?
P.S. Использую BDS 2006
ЮЮ (2006-11-09 04:14:00) [1]
> 5. Потом функция для события OnFormShow:
Т.е. фильтр, ели и получится, применится только раз
Предлагаю идти тем же путем параметрического запроса, указав для него DataSorce - отображаемый НД, т.е. установив Master-Detail связь. Тогда при переходе на другую запись будет обновляться и запрос.
topperz (2006-11-08 18:19:00) [2]Так, не совсем понятно.
Описываю свои действия:
1. Создаю ADODataSet на таблице ИсторияСотрудников, в него добавляю лукап-поле, основанное на ADOQuery, фильтр у которого не установлен.
2. Ну естественно связываю грид с датасетом через DataSource.
3. Создаю ADOQuery2, связываю с ним DataSource2
4. В гриде для столбца, связанного с лукап-полем, в свойстве ListSource указываю DataSource2.
5. Потом функция для события OnFormShow:
ADOQuery2.Close;
ADOQuery2.Filter := "ИсторияПроектов.Год=" + IntToStr(DBGridEh1.Columns[0].Field.AsInteger);
ADOQuery2.Filtered := true;
ADOQuery2.Open;
Вываливается ошибка: Не удается найти объект в семействе, соответствующий требуемому имени или порядковому номеру
Наверное я неправильно устанавливаю фильтрацию. Подскажите, что не так?
Sergey13 (2006-11-08 16:03:00) [3]> [5] Stanislav © (08.11.06 16:01)
Скорее всего.
Stanislav (2006-11-08 16:02:00) [4]DropDownBox->ListSource
Stanislav (2006-11-08 16:01:00) [5]В 3.6 тоже есть. Может не обращал внимания?
Sergey13 (2006-11-08 15:58:00) [6]> [3] Stanislav © (08.11.06 15:51)
Это в 4-ке появилось? Вроде в 3.6-ке я такого не помню.
Stanislav (2006-11-08 15:51:00) [7]Sergey13 © (08.11.06 15:41) [2]
У него EhLib,а там это решено. Настраивается Lookup поле по неотфильтрованному запросу, а в колонке грида указываешь ListSource, который можно фильтровать.
Sergey13 (2006-11-08 15:41:00) [8]> [0] topperz (08.11.06 14:08)
Так можно сделать, ИМХО, только если рисовать свой комбобокс вместо встроенного на лукап-поле. Стандартно не прокатит, ИМХО, опять же.
Stanislav (2006-11-08 14:18:00) [9]есть у колонки еще свойство ListSource Куда подключается отфильтрованный запрос .