Связь ComboBox и DBGrid
Можно:
1. Использовать фильтр
2. Использовать параметры SQL-запроса
3. Генерировать необходимый SQL-запрос
Если можно пример кода...
Если можно пример кода...
А почему не использовать TDBComboBox?
Для хранения ключевого поля нужно использовать ComboBox1->Items->Objects и передавать его в параметры запроса.
...
void __fastcall TForm1::ComboBox1CloseUp(TObject *Sender)
{
if(ComboBox1->ItemIndex==-1)return;
ADOQuery2->Params->ParamByName("@code")->Value = (*(int*)(ComboBox1->Items->Objects[ComboBox1->ItemIndex]));
}
Мне то надо, что бы я в ComboBox1 выбрал тему, а ComboBox2 отобразились бы подтемы... c BDGrid_ами все работает, но это не вариант их использовать
Успользовать DBLookupComboBox2 не сказал бы что проще, он все время глючит.. У меня такие таблицы
Table Thream
----------------
(PK) id_thream - auto_increment
name_thream
----------------
Table SubThream
----------------
(PK) id_subthream - auto_increment
(FK) id_thream
name_subthream
----------------
Каким бы способом не пробывал все одно правильно не работает, то не может найти поля, то еще что то..... БД на MySQL
Как их правельно связать кто знает....?
Мне то надо, что бы я в ComboBox1 выбрал тему, а ComboBox2 отобразились бы подтемы... c BDGrid_ами все работает, но это не вариант их использовать
Успользовать DBLookupComboBox2 не сказал бы что проще, он все время глючит.. У меня такие таблицы
Table Thream
----------------
(PK) id_thream - auto_increment
name_thream
----------------
Table SubThream
----------------
(PK) id_subthream - auto_increment
(FK) id_thream
name_subthream
----------------
Каким бы способом не пробывал все одно правильно не работает, то не может найти поля, то еще что то..... БД на MySQL
Как их правельно связать кто знает....?
Что сложного? Для начала загрузи все данные в первый комбобокс (если набор данных не предполагается изменять, то это можно сделать при загрузке формы) и во второй - те которые соответствуют первой записи.
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add(Query);
ADOQurery1->Active = true;
while(!ADOQuery1->Eof){
ComboBox1->Items->AddObject(ADOQuery1->FieldByName("name_thream")->Value,(TObject*)new int(ADOQuery1->FieldByName("id_thream")->Value));
ADOQuery1->Next();
}
ADOQurery1->Active = false;
ComboBox1->ItemIndex = 0;
Query = "select name_subthream, id_subthream from SubThream where id_thream = @id_thream";
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add(Query);
ADOQuery1->Params->ParamByName("@id_thream")->Value = *((int*)(ComboBox1->Items->Objects[ComboBox1->ItemIndex]));
ADOQurery1->Active = true;
while(!ADOQuery1->Eof){
ComboBox2->Items->AddObject(ADOQuery1->FieldByName("name_subthream")->Value,(TObject*)new int(ADOQuery1->FieldByName("id_subthream")->Value));
ADOQuery1->Next();
}
ADOQurery1->Active = false;
вот и все. Какое событие нужно использовать для перезагрузки второго комбо - я показал в предыдущем посте. Технология таже. Естественно этот код писался в живую - так что если мелкие ошибки - не надо спрашивать почему не работает - смотришь хелп. Ну и переносить так как написано в живую программу не стоит - когда все заработает - стоит оптимизировать - это только пример.
Лучше выделить код в отдельную функцию и вызвать ее в конструкторе. А какой именно компонент ты используешь значения не имеет.
Query1->SQL->Clear();
Query1->SQL->Add("select id_thream ,name_thream from thream");
Query1->Open();
Query1->Active = true;
while(!Query1->Eof)
{
ComboBox1->Items->AddObject(Query1->FieldByName("name_thream")->Value,(TObject*)new int(Query1->FieldByName("id_thream")->Value));
Query1->Next();
}
Query1->Active = false;
//------------------------------------------------------------------------
ComboBox1->ItemIndex = 0;
Query1->SQL->Clear();
Query1->SQL->Add("select id_kategor, name_kategor from kategor, thream where id_thream = @id_thream");
Query1->Params->ParamByName("@id_thream")->Value = *((int*)(ComboBox1->Items->Objects[ComboBox1->ItemIndex]));
но вылетает ошибка
Debuger Exeption Notificatio
Project library.exe raised exception class EDDatabaseError with massage 'Query1: Parametr '@id_thream' not found. Process stopped.
в этой строке
Query1->Params->ParamByName("@id_thream")->Value = *((int*)(ComboBox1->Items->Objects[ComboBox1->ItemIndex]));
Query1->SQL->Add("select id_kategor, name_kategor from kategor, thream where id_thream = :id_thream");
Query1->Params->ParamByName("id_thream")->Value = *((int*)(ComboBox1->Items->Objects[ComboBox1->ItemIndex]));
..
...
P.S. И используй плз средства форматирования кода
Query1->SQL->Add( "select id_kategor, name_kategor from kategor, thream where id_thream = [COLOR=red]" +[/COLOR] IntToStr( *( (int*)( ComboBox1->Items->Objects[ComboBox1->ItemIndex] ) ) ) );
..
разложем все по местам
для начала при создании формы я загружаю ComboBox1 и ComboBox2
Query1->SQL->Add("select id_thream ,name_thream from thream");
Query1->Open();
Query1->Active = true;
while(!Query1->Eof)
{
ComboBox1->Items->AddObject(Query1->FieldByName("name_thream")->Value,(TObject*)new int(Query1->FieldByName("id_thream")->Value));
Query1->Next();
}
Query1->Active = false;
здесь все понятно, ошибок нет...
Query1->SQL->Clear();
Query1->SQL->Add("Select id_thream, name_thream from subthream, thream where id_thream = " + IntToStr(*((int*)(ComboBox1->Items->Objects[ComboBox1->ItemIndex]))));
здесь тоже нет проблем
Вот здесь, мне надо уже использовать Query2? когда я загружаю данные во второй ComboBox2, по аналогии с первым ComboBox1...Просто про примеру что был написан ранее на первой странице, с Query1 вылетает ошибка...
Query2->SQL->Add("select id_subtheram ,name_subthream from subhtream");
Query2->Open();
Query2->Active = true;
while(!Query2->Eof)
{
ComboBox2->Items->AddObject(Query2->FieldByName("name_subthream")->Value,(TObject*)new int(Query2->FieldByName("id_subthream")->Value));
Query2->Next();
}
Query2->Active = false;
В те ли я ComboBox_ы загружаю данные
И событие на ComboBox1CloseUp
Query2->SQL->Add("Select name_subthream from subthream, thream where id_thream = " + IntToStr(*((int*)(ComboBox1->Items->Objects[ComboBox1->ItemIndex]))));
здесь проблема...событие не срабатывает
вообше ComboBox_ы загружаются, но подчиненные записи не выбираются
Извеняюсь, за такую тупость, что не могу разобратся, но я больше не нашел форума где могуг объяснить...
разложем все по местам
для начала при создании формы я загружаю ComboBox1 и ComboBox2
Query1->SQL->Add("select id_thream ,name_thream from thream");
Query1->Open();
Query1->Active = true;
while(!Query1->Eof)
{
ComboBox1->Items->AddObject(Query1->FieldByName("name_thream")->Value,(TObject*)new int(Query1->FieldByName("id_thream")->Value));
Query1->Next();
}
Query1->Active = false;
здесь все понятно, ошибок нет...
Query1->SQL->Clear();
Query1->SQL->Add("Select id_thream, name_thream from subthream, thream where id_thream = " + IntToStr(*((int*)(ComboBox1->Items->Objects[ComboBox1->ItemIndex]))));
здесь тоже нет проблем
Вот здесь, мне надо уже использовать Query2? когда я загружаю данные во второй ComboBox2, по аналогии с первым ComboBox1...Просто про примеру что был написан ранее на первой странице, с Query1 вылетает ошибка...
Query2->SQL->Add("select id_subtheram ,name_subthream from subhtream");
Query2->Open();
Query2->Active = true;
while(!Query2->Eof)
{
ComboBox2->Items->AddObject(Query2->FieldByName("name_subthream")->Value,(TObject*)new int(Query2->FieldByName("id_subthream")->Value));
Query2->Next();
}
Query2->Active = false;
В те ли я ComboBox_ы загружаю данные
Для твоей задачи вполне достаточно одного компонента - зачем вводить второй - ведь данные у тебя загружаются последовательно? Это одно. Второе - второй комбобокс необходимо очищать - ведь для каждого занчения в первом, свой набор данных во втором. И собственно третье - в чем смысл приведенного кода? Ты выбираешь все записи из подчиненной таблицы - зачем?
И событие на ComboBox1CloseUp
Query2->SQL->Add("Select name_subthream from subthream, thream where id_thream = " + IntToStr(*((int*)(ComboBox1->Items->Objects[ComboBox1->ItemIndex]))));
здесь проблема...событие не срабатывает
вообше ComboBox_ы загружаются, но подчиненные записи не выбираются
Событие скорей всего срабатывает - но так как у тебя комобобокс не ощищен - ты этого не видишь.
{
Edit1->Text=ComboBox1->Text;
DataModule2->ADODataSet4->Active=false;
DataModule2->ADODataSet4->CommandText="select * from Table1 where Book = '"+ComboBox1->Text+"'";
DataModule2->ADODataSet4->Active=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ComboBox2Change(TObject *Sender)
{
DataModule2->ADODataSet4->Active=false;
DataModule2->ADODataSet4->CommandText="select * from Table1 where Article = '"+ComboBox2->Text+"'";
DataModule2->ADODataSet4->Active=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ComboBox3Change(TObject *Sender)
{
DataModule2->ADODataSet4->Active=false;
DataModule2->ADODataSet4->CommandText="select * from Table1 where Avtor = '"+ComboBox3->Text+"'";
DataModule2->ADODataSet4->Active=true;
}
//---------------------------------------------------------------------------
3 комбо бокса, друг от друга зависимы. только они стучаться не к GRID а напрямую к серву. Вобщем-то рабобтало все :)
Ты не в тупике - ты в тупаке. Во первых - у комбобокса нет события OnClose(). Во вторых. Есть такая штука как отладчик. Возьми и установи точку прерывания вот на этот фрагмент кода:
и посмотри на результат.