Sql запросы при работе с базами данных
Есть база в ней 5 полей. Необходимо вытащить тока значения одного поля(pole1) которой состоит из 5 элементов(н-р):2005,2006,2005,2006,2006.
Значения надо запихать в DBComboBox1.
Если их вытаскивать с помощью:
DBComboBox1->Items->Add(Table1->FieldByName("pole1")->AsString);
то в комбобоксе появляются они все! А необходимо чтобы туда записались тока неповторяющееся элементы,т.е. 2005,2006 .
С помощью SQL это делается:
SELECT DISTINCT pole1 FROM "database.DB" database
Но я не знаю как его связать с комбобоксом.
ПРОШУ совета!
Делаю форму: DataSourse1,Table1,Query1,DBComboBox1,DBEdit1.
Есть база в ней 5 полей. Необходимо вытащить тока значения одного поля(pole1) которой состоит из 5 элементов(н-р):2005,2006,2005,2006,2006.
Значения надо запихать в DBComboBox1.
Если их вытаскивать с помощью:
DBComboBox1->Items->Add(Table1->FieldByName("pole1")->AsString);
то в комбобоксе появляются они все! А необходимо чтобы туда записались тока неповторяющееся элементы,т.е. 2005,2006 .
С помощью SQL это делается:
SELECT DISTINCT pole1 FROM "database.DB" database
Но я не знаю как его связать с комбобоксом.
ПРОШУ совета!
Сформулируйте поточнее пожалуйста: если строка "2005,2006,2005,2006,2006" находится в одной записи, насколько я могу судить по
DBComboBox1->Items->Add(Table1->FieldByName("pole1")->AsString);
то тут DISTINCT тебе не поможет
Сформулируйте поточнее пожалуйста: если строка "2005,2006,2005,2006,2006" находится в одной записи, насколько я могу судить по
DBComboBox1->Items->Add(Table1->FieldByName("pole1")->AsString);
то тут DISTINCT тебе не поможет
Нет виноват не так написал! То есть база например имеет 5 полей:pole1,pole2,pole3,pole4,pole5 .
Первое поле содержит вот эти данные:2005,2006 ..
Это не одна строка-это 5 различных элементов:
pole1 pole2 pole3 pole4 pole5
2005 raz ... .... данные
2006 dva ... .... данные
2005 tri ... .... данные
2006 4etire ... .... данные
2006 p9t ... .... данные
Вот примерно такая ситуация!!
Жду совета, очень надо, заранее благодарен!
У DataSource указываешь в качестве DataSet этот Query и все.
Ну тогда можно взять, например, TQuery, выполнить в нем запрос с DISTINCT и точно также привязать к DBComboBox при помощи DataSource.
У DataSource указываешь в качестве DataSet этот Query и все.
Я так помню, что список выбора DBComboBox-a заполняется вручную. Что-то типа
Query1->Open();
while(!Query1->Eof)
{
DBComboBox1->Items->Add(Query1->Fields->Fields[0]->AsString;
Query1->Next();
}
DBComboBox1->Items->Clear();
while(!Table1->Eof)
{
if(DBComboBox1->Items->IndexOf(Table1->Fields->Fields[0]->AsString)<0)
DBComboBox1->Items->Add(Table1->Fields->Fields[0]->AsString);
Table1->Next();
}
Нет виноват не так написал! То есть база например имеет 5 полей:pole1,pole2,pole3,pole4,pole5 .
Первое поле содержит вот эти данные:2005,2006 ..
Это не одна строка-это 5 различных элементов:
pole1 pole2 pole3 pole4 pole5
2005 raz ... .... данные
2006 dva ... .... данные
2005 tri ... .... данные
2006 4etire ... .... данные
2006 p9t ... .... данные
Вот примерно такая ситуация!!
Жду совета, очень надо, заранее благодарен!
Гораздо правильней преобразовать это к двум табличкам:
Table1:
Pole1_id Pole1
1 2005
2 2006
Table2:
p1_id pole2 pole3 pole4 pole5
1 raz ... .... данные
2 dva ... .... данные
1 tri ... .... данные
2 4etire ... .... данные
2 p9t ... .... данные
Сделать relation по pole1_id и в combobox подставлять значения из table1.
Я так помню, что список выбора DBComboBox-a заполняется вручную.
Да, точно. Это я с LoockupComboBox спутал.
Говорят надо DBLookupComboBox2->KeyValue=1; поставить, но чё то не помогает, может не там ставлю!??
Всем большое спасибо-узнал много нового! Я просто поставил элемент DBLookupCombox вместо обычного. Там всё нормально, за исключением того что когда он запускаеться "первая строка" пустая, а потом идут мои данные.
Говорят надо DBLookupComboBox2->KeyValue=1; поставить, но чё то не помогает, может не там ставлю!??
Это смотря что у тебя в качестве KeyField фигурирует. Если в таблице нет записи, у которой значение этого поля равно 1, тогда конечно не поможет. :)
Вот получил я в DBLookupComboBox1 значения(неповторяющееся). А как мне теперь при выборе одного из них сделать запрос и получить остальные данные по этому значению.
А делаю:
{
Form1->DataSource1->DataSet=Form1->Query1;
Form1->Query1->Close();
Form1->Query1->Active=true;
Form1->Query1->SQL->Clear();
Form1->Query1->SQL->Add("SELECT * FROM 'database.DB' database WHERE pole='DBLookupComboBox1->ItemIndex' ");
Form1->Query1->Open();
}
Ничего не выходит. Возможно не правильно получаю значения DBLookupComboBox1->ItemIndex (а как?)
И как можно поступить Если в моём случаи например по значению 2005 существует 3 записи как их выводить(или как их выведет бирланд)?
Делал так чтобы все поля работали через Query1 (а не через Table1, как раньше делал(кроме DBLookupComboBox1) . Всё нормально работает выводяться все поля в соотвествии с моим полем(годом), но проблема в том что если н-р 3 совпавших записи(а если больше) то они все выводятся(выделенным цветом), что не не удобно. Хотелось бы чтобы была одна запись и потом н-р с помощью DBNavigatora можно было их просматривать!
Наверно я просто заморачиваюсь, но я пока не знаю как ещё сделать этот просмотрщик! Если кто-ниб может помочь, то буду ОЧЕНЬ рад выслушать!!!
DBComboBox(или DBLookupComboBox -что более подходит) и DBNavigator . Вот получил я данные из базы. Н-р хочю посмотреть записи по метке 2005 ( но их 3 штуки) если с помощью DBLookupComboBox получаем в комбобоксе 3 выделенных записи соответсвующих разным полям но одинаковым у всех полем равным 2005. Если будет появляться 3 одинаковы записи в комбобоксе, то это не удобно!
В DBComboBox получилось избавиться от "лишних", но не знаю как давать запрос.
И вот хотел бы узнать возможно ли как с помощью навигатора просматривать тока те записи которые прошли по запросу??
Заранее благодарен!
А ещё хотелось бы узнать?!
Вот получил я в DBLookupComboBox1 значения(неповторяющееся). А как мне теперь при выборе одного из них сделать запрос и получить остальные данные по этому значению.
А делаю:
{
Form1->DataSource1->DataSet=Form1->Query1;
Form1->Query1->Close();
Form1->Query1->Active=true;
Form1->Query1->SQL->Clear();
Form1->Query1->SQL->Add("SELECT * FROM 'database.DB' database WHERE pole='DBLookupComboBox1->ItemIndex' ");
Form1->Query1->Open();
}
Ничего не выходит. Возможно не правильно получаю значения DBLookupComboBox1->ItemIndex (а как?)
И как можно поступить Если в моём случаи например по значению 2005 существует 3 записи как их выводить(или как их выведет бирланд)?
Делал так чтобы все поля работали через Query1 (а не через Table1, как раньше делал(кроме DBLookupComboBox1) . Всё нормально работает выводяться все поля в соотвествии с моим полем(годом), но проблема в том что если н-р 3 совпавших записи(а если больше) то они все выводятся(выделенным цветом), что не не удобно. Хотелось бы чтобы была одна запись и потом н-р с помощью DBNavigatora можно было их просматривать!
Наверно я просто заморачиваюсь, но я пока не знаю как ещё сделать этот просмотрщик! Если кто-ниб может помочь, то буду ОЧЕНЬ рад выслушать!!!
Настоятельно рекомендую внимательно прочитаь мой предыдущий пост.
ЗЫ: Все проблемы проистекают из того, что Ваша база не представлена в нормальной форме и чем больше вы будете пытаться с ней что либо сделать, тем больших извращений на это понадобится. Проще и правильней перепроектировать базу или хотя бы привести ее к подобию нормального вида.