Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.05.2010, 18:07   #1
Ce4kok
Пользователь
 
Регистрация: 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.
Ce4kok вне форума Ответить с цитированием
Старый 21.05.2010, 06:38   #2
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Через запрос делается все это на раз-два.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 21.05.2010, 09:39   #3
vovk
!=
Участник клуба
 
Аватар для vovk
 
Регистрация: 08.09.2008
Сообщений: 1,751
По умолчанию

Цитата:
Series имеет 3 поля: ID, Серия, ID2 (ключ).
ID2 как понял внешний ключ к таблице Type


Код:
with TADOQuery.Create(nil) do
begin
  try
Connection:=ADOConnection1;//тут ваш adoconnection если не используете, то вместо этого можно сформировать connectionstring
SQL.Text:='SELECT Серия FROM Series Where ID2=:id_';
Parameters.ParamByName('id_').Value:=integer(ComboBox1.Items.Objects[ComboBox1.ItemIndex]);
Open;
       while Not Eof do
         begin
          ComboBox2.Items.Add(Fields.Fields[0].AsString);
            Next;
         end;
  finally
   Free;
  end;
end;

Только мне кажется лучше на onSelect
vovk вне форума Ответить с цитированием
Старый 21.05.2010, 14:58   #4
Ce4kok
Пользователь
 
Регистрация: 25.01.2009
Сообщений: 40
По умолчанию

Таблицы Type и Series связаны ключом ID, а вот Series и Subseries связаны ключом ID2.

Спасибо за помощь, сейчас попробую ваш код =))

UPDATE:
Выбираю нужный элемент из ComboBox1, но в Сombobox2 ничё не появляется. Имею в виду что список там пустой =((
Разъясните чайнику что да как, а то я в этом деле не очень силён.

Последний раз редактировалось Ce4kok; 21.05.2010 в 15:04.
Ce4kok вне форума Ответить с цитированием
Старый 21.05.2010, 15:25   #5
Ce4kok
Пользователь
 
Регистрация: 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 добавляются АБСОЛЮТНО ВСЕ СУЩЕСТВУЮЩИЕ Серии.

Что можно с этим поделать?)
Ce4kok вне форума Ответить с цитированием
Старый 21.05.2010, 15:57   #6
vovk
!=
Участник клуба
 
Аватар для vovk
 
Регистрация: 08.09.2008
Сообщений: 1,751
По умолчанию

на счёт первого, ну как я предлагал добавляйте
Код:
spSkinComBoBox1.Items.AddObject(ADO Table1.FieldByName('Тип').AsString, tObject(ADOTable1.FieldByName('ID').asinteger ));
на счёт как вы делаете сейчас подумаю

ЗЫ прочитал понятно вотъ
Код:
' WHERE Тип=' + QuotedStr(Combobox1.text);
правда непонятно почему ошибки не было


ЗЫЗЫ делайте как я предложил, зачем тогда хранить id если не использовать его, к тому же соединение таблиц в запросе существенно влияет на время необходимое для формирования набора данных, если без этого можно обойтись, то так и нужно делать, то есть обходится

Последний раз редактировалось vovk; 21.05.2010 в 16:11.
vovk вне форума Ответить с цитированием
Старый 21.05.2010, 19:22   #7
Ce4kok
Пользователь
 
Регистрация: 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

Извините за навязчивость, но как это организовать?)
Ce4kok вне форума Ответить с цитированием
Старый 21.05.2010, 21:38   #8
vovk
!=
Участник клуба
 
Аватар для vovk
 
Регистрация: 08.09.2008
Сообщений: 1,751
По умолчанию

а в этом и предыдушем вопросе есть какаято принципиальная разница?Или вы так шутите?
На счёт вашего решения.. а если записей от 1000 и больше как думаете разница в скорости будет заметна?
я к тому что у нас есть всё, для того, чтобы запросить только нужные данные, вместо этого мы запрашиваем все, и потом из них отбираем те которые подходят.. Нее такой подход к решению проблемы не для меня.. с другой стороны это ваше решение...

Последний раз редактировалось vovk; 21.05.2010 в 21:46.
vovk вне форума Ответить с цитированием
Старый 21.05.2010, 23:34   #9
Ce4kok
Пользователь
 
Регистрация: 25.01.2009
Сообщений: 40
По умолчанию

Я новичок в этом деле и следовательно ваше мнение учту. Сейчас для меня самое главное найти любой работающий способ, а вот дальше, когда я уже столкнусь с проблемой рациональности, то тогда уже придётся выбирать между всеми доступными способами))

В любом случае огромное вам спасибо за ваши старания и помощь!
Ce4kok вне форума Ответить с цитированием
Старый 22.05.2010, 19:11   #10
Ce4kok
Пользователь
 
Регистрация: 25.01.2009
Сообщений: 40
По умолчанию

Цитата:
Сообщение от vovk Посмотреть сообщение
а в этом и предыдушем вопросе есть какаято принципиальная разница?Или вы так шутите?
На счёт вашего решения.. а если записей от 1000 и больше как думаете разница в скорости будет заметна?
я к тому что у нас есть всё, для того, чтобы запросить только нужные данные, вместо этого мы запрашиваем все, и потом из них отбираем те которые подходят.. Нее такой подход к решению проблемы не для меня.. с другой стороны это ваше решение...
В общем я всё таки решил прибегнуть к предложенному вами методу!
Т.к. используя мой метод, на второй форме фильтрация проходит не совсем корректно (хотя скорее у меня руки кривые).

Вот я добавил отфильтрованные данные в 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.
Ce4kok вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Текст 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