|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
20.05.2010, 18:07 | #1 |
Пользователь
Регистрация: 25.01.2009
Сообщений: 40
|
2х ComboBox'а и БД.
Всем доброго времени суток!
Товарищи, нуждаюсь в помощи. Есть БД в Access'e и в ней 3 таблицы: Type, Series, SubSeries. Type имеет 2 поля: ID (ключ) и Тип. Series имеет 3 поля: ID, Серия, ID2 (ключ). Subseries: много полей и ID2. Нужно сделать так чтобы когда я выбирал в ComboBox1 определённый ТИП, то и в ComboBox2 появлялись только те серии, у которых ID такое же как и у выбранного ТИПА. ADOTable1.First; for I := 0 to ADOTable1.RecordCount - 1 do begin ComBoBox1.Items.AddObject(ADOTable1 .FieldByName('Тип').AsString, tObject(ADOTable1.FieldByName('ID') )); ADOTable1.Next; end; Когда я пытаюсь таким же способом заполнить ComboBox2, то заполняется он только одной записью. Как я понимаю здесь нужно ComboBox2 заполнять на событии OnChangeComboBox1, используя SQL запрос. Помогите, если есть время. Последний раз редактировалось Ce4kok; 20.05.2010 в 18:44. |
21.05.2010, 06:38 | #2 |
Старожил
Регистрация: 05.06.2008
Сообщений: 4,206
|
Через запрос делается все это на раз-два.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
|
21.05.2010, 09:39 | #3 | |
!=
Участник клуба
Регистрация: 08.09.2008
Сообщений: 1,751
|
Цитата:
Код:
Только мне кажется лучше на onSelect |
|
21.05.2010, 14:58 | #4 |
Пользователь
Регистрация: 25.01.2009
Сообщений: 40
|
Таблицы Type и Series связаны ключом ID, а вот Series и Subseries связаны ключом ID2.
Спасибо за помощь, сейчас попробую ваш код =)) UPDATE: Выбираю нужный элемент из ComboBox1, но в Сombobox2 ничё не появляется. Имею в виду что список там пустой =(( Разъясните чайнику что да как, а то я в этом деле не очень силён. Последний раз редактировалось Ce4kok; 21.05.2010 в 15:04. |
21.05.2010, 15:25 | #5 |
Пользователь
Регистрация: 25.01.2009
Сообщений: 40
|
Вот этой процедурой я добавляю записи в ComboBox1.
//---Заполнение ComboBox1 ADOTable1.First; for I := 0 to ADOTable1.RecordCount - 1 do begin spSkinComBoBox1.Items.AddObject(ADO Table1.FieldByName('Тип').AsString, tObject(ADOTable1.FieldByName('ID') )); ADOTable1.Next; end; //----------------------- А вот этой добавляю записи в ComboBox2! procedure TForm1.spSkinComboBox1Change(Sender : TObject); begin with ADOQuery1 do begin sql.Text:= 'SELECT Серия as sp '+ 'FROM Series Right Join Type on ' + ' Type.ID=Series.ID' + ' WHERE Тип=' + Combobox1.text; open; while not Eof do begin spSkinComboBox2.Items.Add(FieldByNa me('sp').AsString); next; end; Free; end; end; Но сейчас вся проблема в том, что когда я выбираю какую-либо запись из ComboBox1, то в ComboBox2 добавляются АБСОЛЮТНО ВСЕ СУЩЕСТВУЮЩИЕ Серии. Что можно с этим поделать?) |
21.05.2010, 15:57 | #6 |
!=
Участник клуба
Регистрация: 08.09.2008
Сообщений: 1,751
|
на счёт первого, ну как я предлагал добавляйте
Код:
ЗЫ прочитал понятно вотъ Код:
ЗЫЗЫ делайте как я предложил, зачем тогда хранить id если не использовать его, к тому же соединение таблиц в запросе существенно влияет на время необходимое для формирования набора данных, если без этого можно обойтись, то так и нужно делать, то есть обходится Последний раз редактировалось vovk; 21.05.2010 в 16:11. |
21.05.2010, 19:22 | #7 |
Пользователь
Регистрация: 25.01.2009
Сообщений: 40
|
Не успел прочесть ваше последнее сообщение как уже решил проблему следующим способом:
procedure TForm1.ComboBox1Change(Sender: TObject); begin ADOTable1.Locate('Тип', ComboBox1.Text, []); ADOTable2.Filter := 'ID='+ADOTable1.Fields[0].AsString; ComboBox2.Clear; with ADOTable2 do begin Open; while not EoF do begin if FieldByName('Серия').AsString<>'' then ComboBox2.Items.Add(FieldByName('Се рия').AsString); Next; end; end; end; Сейчас у меня возник другой вопрос! При выборе элемента из ComboBox2 ("Серии" из таблицы Series) нужно отобразить все записи (из таблицы SubSeries), соответствующие данной серии. Таблицы Series и SubSeries связаны ключом ID2. SubSeries имеет следующие поля: 1)Обозначение 2)d 3)Dbig 4)B 5)B1 6)r 7)Dw 8)ID2 Извините за навязчивость, но как это организовать?) |
21.05.2010, 21:38 | #8 |
!=
Участник клуба
Регистрация: 08.09.2008
Сообщений: 1,751
|
а в этом и предыдушем вопросе есть какаято принципиальная разница?Или вы так шутите?
На счёт вашего решения.. а если записей от 1000 и больше как думаете разница в скорости будет заметна? я к тому что у нас есть всё, для того, чтобы запросить только нужные данные, вместо этого мы запрашиваем все, и потом из них отбираем те которые подходят.. Нее такой подход к решению проблемы не для меня.. с другой стороны это ваше решение... Последний раз редактировалось vovk; 21.05.2010 в 21:46. |
21.05.2010, 23:34 | #9 |
Пользователь
Регистрация: 25.01.2009
Сообщений: 40
|
Я новичок в этом деле и следовательно ваше мнение учту. Сейчас для меня самое главное найти любой работающий способ, а вот дальше, когда я уже столкнусь с проблемой рациональности, то тогда уже придётся выбирать между всеми доступными способами))
В любом случае огромное вам спасибо за ваши старания и помощь! |
22.05.2010, 19:11 | #10 | |
Пользователь
Регистрация: 25.01.2009
Сообщений: 40
|
Цитата:
Т.к. используя мой метод, на второй форме фильтрация проходит не совсем корректно (хотя скорее у меня руки кривые). Вот я добавил отфильтрованные данные в ComboBox2 как вы и советовали. begin with ADOQuery1 do begin sql.Text:= 'SELECT Серия as sp '+ 'FROM Series Right Join Type on ' + ' Type.ID=Series.ID' + ' WHERE Тип=' + QuotedStr(Combobox1.text); open; while not Eof do begin ComboBox2.Items.Add(FieldByName('sp ').AsString); next; end; Free; end; end; Выбрал я сначала "Тип" из ComboBox1, затем "Серию" из ComboBox2 и вот, к примеру мне захотелось изменить "ТИП" т.к. я выбрал не тот, который мне нужен. Так вот когда я пытаюсь поменять значение ComboBox1, то сразу же вылетает ошибка (ЕСЛИ Значение ComboBox2 уже выбрано). Последний раз редактировалось Ce4kok; 22.05.2010 в 19:50. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Текст ComboBox'а | kta87 | Помощь студентам | 5 | 04.03.2010 07:32 |
Изменение текста ComBoBox'а | kta87 | Помощь студентам | 0 | 02.03.2010 21:10 |
Закраска выделенный строк combobox'а без csOwnerDrawFixed | dplz | Компоненты Delphi | 0 | 17.10.2009 15:02 |
Скрытие и раскрытие столбцов по выбору ComboBox'а | gora_omsk | Microsoft Office Excel | 2 | 10.02.2009 06:37 |