Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Связь ComboBox и DBGrid

21K
30 марта 2007 года
unas
15 / / 20.03.2007
Как связать ComboBox и DBGrid так что бы при выборе записи из ComboBox, например автор - (в него уже предворительно загружена таблица), в DBGrid отбразились все записи относяшися к этому автору(в данном случае это книги автора)...Между таблицами связь один ко многим... По идее надо, что то прописать в событие OnChange комбобокса, но что то пока не получается найти правельный код...
4.6K
31 марта 2007 года
Tokolist
268 / / 22.03.2007
К сожалению, не указана база данных...

Можно:
1. Использовать фильтр
2. Использовать параметры SQL-запроса
3. Генерировать необходимый SQL-запрос
21K
31 марта 2007 года
unas
15 / / 20.03.2007
все, спасибо сделал с помощью фильтра, а как такое же делать между 2_мя ComboBox, при выборе одного значения ComboBox1 в ComboBox2 отображались "подчиненные" значения этой записи...
9.5K
31 марта 2007 года
Borgir
97 / / 20.12.2006
Сделай в событии OnChange первого бокса процедуру занесения нужных тебе данных во второй бокс. :)
21K
31 марта 2007 года
unas
15 / / 20.03.2007
Это понятно, а каким способом мне находить (загружать) записи в ComboBox2, которые по ключевым полям (табл. один ко мгогим), соотвутствуют полям в ComboBo1...Фильтр тут не катит...
Если можно пример кода...
1
31 марта 2007 года
kot_
7.3K / / 20.01.2000
Цитата: unas
Это понятно, а каким способом мне находить (загружать) записи в ComboBox2, которые по ключевым полям (табл. один ко мгогим), соотвутствуют полям в ComboBo1...Фильтр тут не катит...
Если можно пример кода...


А почему не использовать TDBComboBox?
Для хранения ключевого поля нужно использовать ComboBox1->Items->Objects и передавать его в параметры запроса.

 
Код:
ComboBox1->Items->AddObject(ADOQuery1->FieldByName("name")->Value,(TObject*) new int(ADOQuery1->FieldByName("code")->Value));
...
void __fastcall TForm1::ComboBox1CloseUp(TObject *Sender)
{
if(ComboBox1->ItemIndex==-1)return;
ADOQuery2->Params->ParamByName("@code")->Value = (*(int*)(ComboBox1->Items->Objects[ComboBox1->ItemIndex]));
}
263
01 апреля 2007 года
koltaviy
816 / / 16.12.2004
Так можно вообще ничо не передавать, а установить зависимость между таблицами(а точнее компонентами, настроенными на таблицы) через свойство DataSet. Если это конечно не критично и нет необходимости работать с 'дочерними' данными как с самостоятельными(хотя при необходимости зависимость можно 'сбросить')!!
21K
03 апреля 2007 года
unas
15 / / 20.03.2007
Все равно не ясно, каким способом в приведенном выше коде вторая таблица загружается в ComboBox2, или каким способом данные в ComboBox2 управляются из ComboBox1.

Мне то надо, что бы я в 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
Как их правельно связать кто знает....?
1
03 апреля 2007 года
kot_
7.3K / / 20.01.2000
Цитата: unas
Все равно не ясно, каким способом в приведенном выше коде вторая таблица загружается в ComboBox2, или каким способом данные в ComboBox2 управляются из ComboBox1.

Мне то надо, что бы я в 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
Как их правельно связать кто знает....?



Что сложного? Для начала загрузи все данные в первый комбобокс (если набор данных не предполагается изменять, то это можно сделать при загрузке формы) и во второй - те которые соответствуют первой записи.

Код:
String Query = "select id_thream, name_thream from Thream";
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;

вот и все. Какое событие нужно использовать для перезагрузки второго комбо - я показал в предыдущем посте. Технология таже. Естественно этот код писался в живую - так что если мелкие ошибки - не надо спрашивать почему не работает - смотришь хелп. Ну и переносить так как написано в живую программу не стоит - когда все заработает - стоит оптимизировать - это только пример.
21K
04 апреля 2007 года
unas
15 / / 20.03.2007
Последний вопрос, этот весь код на событии OnCreate формы? и можно ли вместо ADOQuery использовать просто Query
1
05 апреля 2007 года
kot_
7.3K / / 20.01.2000
Цитата: unas
Последний вопрос, этот весь код на событии OnCreate формы? и можно ли вместо ADOQuery использовать просто Query


Лучше выделить код в отдельную функцию и вызвать ее в конструкторе. А какой именно компонент ты используешь значения не имеет.

21K
05 апреля 2007 года
unas
15 / / 20.03.2007
я переписал вот так
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]));
263
06 апреля 2007 года
koltaviy
816 / / 16.12.2004
А чо непонятно то? Тебе, вроде, все написа'ли.. Не понимаешь чо пишут - учи английский..
 
Код:
..
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]));
..
1
06 апреля 2007 года
kot_
7.3K / / 20.01.2000
В крайнем случае - не можешь выяснить как передавать параметры в мускул используй формирование строки запроса вручную.
 
Код:
Query1->SQL->Add("select id_kategor, name_kategor from kategor, thream where id_thream = IntToStr(*((int*)(ComboBox1->Items->Objects[ComboBox1->ItemIndex]))));
...

P.S. И используй плз средства форматирования кода
263
06 апреля 2007 года
koltaviy
816 / / 16.12.2004
Опечаточка:)
 
Код:
..
Query1->SQL->Add(    "select id_kategor, name_kategor from kategor, thream where id_thream = [COLOR=red]" +[/COLOR] IntToStr(   *(  (int*)( ComboBox1->Items->Objects[ComboBox1->ItemIndex] )  )   )    );
..
1
06 апреля 2007 года
kot_
7.3K / / 20.01.2000
Угу. Сенкс. Торопился и забыл о коннектации строк.
21K
07 апреля 2007 года
unas
15 / / 20.03.2007
:eek: че намутил, и что не так, нешарю
разложем все по местам
для начала при создании формы я загружаю ComboBox1 и ComboBox2
 
Код:
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_thream, name_thream from subthream, thream where id_thream = " + IntToStr(*((int*)(ComboBox1->Items->Objects[ComboBox1->ItemIndex]))));

здесь тоже нет проблем


Вот здесь, мне надо уже использовать Query2? когда я загружаю данные во второй ComboBox2, по аналогии с первым ComboBox1...Просто про примеру что был написан ранее на первой странице, с Query1 вылетает ошибка...
 
Код:
Query2->SQL->Clear();
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
 
Код:
if(ComboBox1->ItemIndex==-1)return;
Query2->SQL->Add("Select name_subthream from subthream, thream where id_thream = " + IntToStr(*((int*)(ComboBox1->Items->Objects[ComboBox1->ItemIndex]))));

здесь проблема...событие не срабатывает
вообше ComboBox_ы загружаются, но подчиненные записи не выбираются

Извеняюсь, за такую тупость, что не могу разобратся, но я больше не нашел форума где могуг объяснить...
1
07 апреля 2007 года
kot_
7.3K / / 20.01.2000
Цитата: unas
:eek: че намутил, и что не так, нешарю
разложем все по местам
для начала при создании формы я загружаю ComboBox1 и ComboBox2
 
Код:
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_thream, name_thream from subthream, thream where id_thream = " + IntToStr(*((int*)(ComboBox1->Items->Objects[ComboBox1->ItemIndex]))));

здесь тоже нет проблем


Вот здесь, мне надо уже использовать Query2? когда я загружаю данные во второй ComboBox2, по аналогии с первым ComboBox1...Просто про примеру что был написан ранее на первой странице, с Query1 вылетает ошибка...
 
Код:
Query2->SQL->Clear();
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_ы загружаю данные


Для твоей задачи вполне достаточно одного компонента - зачем вводить второй - ведь данные у тебя загружаются последовательно? Это одно. Второе - второй комбобокс необходимо очищать - ведь для каждого занчения в первом, свой набор данных во втором. И собственно третье - в чем смысл приведенного кода? Ты выбираешь все записи из подчиненной таблицы - зачем?

Цитата: unas

И событие на ComboBox1CloseUp
 
Код:
if(ComboBox1->ItemIndex==-1)return;
Query2->SQL->Add("Select name_subthream from subthream, thream where id_thream = " + IntToStr(*((int*)(ComboBox1->Items->Objects[ComboBox1->ItemIndex]))));

здесь проблема...событие не срабатывает
вообше ComboBox_ы загружаются, но подчиненные записи не выбираются


Событие скорей всего срабатывает - но так как у тебя комобобокс не ощищен - ты этого не видишь.

21K
09 апреля 2007 года
unas
15 / / 20.03.2007
Ладно все, всем спасибо, очищай не очищай, все одно не работает :( , придется.....
10K
10 апреля 2007 года
Archy_74
51 / / 13.12.2006
в одной из первых своих програм для SQL мну замутил такой код

Код:
void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
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 а напрямую к серву. Вобщем-то рабобтало все :)
21K
11 апреля 2007 года
unas
15 / / 20.03.2007
все не знаю, можно по подробнее про событие OnClose() комбобокса, ну не работает, я в тупике...
1
12 апреля 2007 года
kot_
7.3K / / 20.01.2000
Цитата: unas
все не знаю, можно по подробнее про событие OnClose() комбобокса, ну не работает, я в тупике...



Ты не в тупике - ты в тупаке. Во первых - у комбобокса нет события OnClose(). Во вторых. Есть такая штука как отладчик. Возьми и установи точку прерывания вот на этот фрагмент кода:

 
Код:
if(ComboBox1->ItemIndex==-1)return;

и посмотри на результат.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог