SATORI |
Отправлено: 02.07.2004, 00:38 |
|
Не зарегистрирован
|
Исходные данные.
Есть база данных в ней две таблицы.
В одной таблица пользователей:
ИМЯ ПОЛЬЗОВАТЕЛЯ, № ГОРОДА
Василий Алибабаевич 3
В другой номера городов. Например
ID CITYNAME
1 Москва
2 Питер
3 Ростов
Можно ли в DBGrid'e сделать отображение
Василий Алибабаевич — Ростов
Т.е. смешать две таблицы...
Или же просто генерировать свой грид через попу ?
Спасибо.
|
|
PeroManiak |
Отправлено: 02.07.2004, 01:52 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 71
|
Не знаю, насколько это в твоем понимании "Через попу", но тем не менее:
CODE |
Table1->Active=true;
Table1->First();
while (!Table1->Eof)
{
DBGrid1->Columns->Items[1]->PickList->Add(Table1->FieldByName("Car_Type")->AsString);
Table1->Next();
}
Table1->First();
|
Items[1] — это твоя колонка с городом — т.е. у тебя юзер или кто-то будет выбирать это из PickList'a не знаю как это тебе подходит, или нет. Вообще, поясни, чего ты хочешь увидеть конкретно?
ЗЫ. Почитай Архангельского — там все об этом здорово написано
|
|
AVC |
Отправлено: 02.07.2004, 09:15 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
DBGrid — инструмент отображения данных на экране.
Если у вас SQL'евская база данных то выбока из двух или более таблиц элементарно решается на уровне Select'а.
Если нет, то придется поработать ручками (эмулировать Select тем или иным способом). |
|
SATORI |
Отправлено: 02.07.2004, 09:59 |
|
Не зарегистрирован
|
У меня сервер баз данных — mysql.
Компонент с которым я работаю в builder'e — DAC for mysql.
Уставливаю и прописываю Database, MySQLTable, DataSource1, MysqlQuerry, DataSource2 и DBGrid.
И что дальше ? |
|
AVC |
Отправлено: 02.07.2004, 11:12 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
С SQL'евскими базами принято работать через запросы. Работа через Table — признак плохого стиля, так как все равно происходит неявный вызов Select * From table.
Вам нужно через Query выполнить запрос типа
SQL | Select
пользователи.ИМЯ ПОЛЬЗОВАТЕЛЯ
,города.CITYNAME
From пользователи ,города
Where пользователи.№ ГОРОДА = города.ID
|
Это макет запроса, не воспринимайте его буквально. |
|
SATORI |
Отправлено: 02.07.2004, 19:18 |
|
Не зарегистрирован
|
Все равно ничего не понял....
Через что мне лучше вывести данные ?
Через DBGrid, через какой-нибудь DrawGrid и пр. Задача требует быстрого выполнения и стиль программирования особо здесь не важен. Если я буду втыкать в стиль и делать не через попу, то у меня есть все возможности уйти в отпуск так и не окончив проект.
В Builder'e я сижу не больше 3 дней, так что не обессудьте за мои простецкие и наивные вопросы.
Может посоветуете компонент какой ? |
|
Gedeon |
Отправлено: 02.07.2004, 20:46 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
Как Вы не поймете, задача грида отобразить данные, задача датасэта их получить из базы, задача датасоурса это связь грида и датасэта.
Для получения данных из разных таблиц лучше всего использовать Query, в котором пишется запрос, см. выше, и данные выбираются из базы, в вышеприведенном запросе измените названия таблиц и столбцов на свои. На форму ложите Query, DataSource, DBGrid. Query цепляйте к базе либо через connection, либо непосредственно через ConnectionString. У DataSource укажите свойство DataSet = Query, у DBGrid свойство датасоурсе = DataSource. У Query свойство Active меняем на true и радуемся достигнутым успехам .
|
|
S A T O R I |
Отправлено: 04.07.2004, 14:23 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 8
|
Спасибо, все сделал как вы сказали.. Заработало. Через select действительно все отлично работает и не надо извращаться.
Пользовался не стандартным DBGrid'ом, а EHLIB'овским.
Отсюда для полной красотищи вопрос... Можно ли раскрасить строчки в таблице, в зависимости от содержания конкретного поля ?
|
|
Gedeon |
Отправлено: 05.07.2004, 07:40 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
QUOTE (S A T O R I @ 04/07/2004, 15:25) | Отсюда для полной красотищи вопрос... Можно ли раскрасить строчки в таблице, в зависимости от содержания конкретного поля ? |
Конечно можно вот так примерно:
CODE |
void __fastcall TFMailNotifier::DBGridEh1DrawColumnCell(TObject *Sender,
const TRect &Rect, int DataCol, TColumnEh *Column,
TGridDrawState State)
{
if(DataCol==0){
if(QNBU->FieldByName("Input")->AsBoolean){
DBGridEh1->Canvas->Brush->Color = clWhite;
DBGridEh1->Canvas->Font->Color = clOlive;
}
else{
DBGridEh1->Canvas->Brush->Color = clWhite;
DBGridEh1->Canvas->Font->Color = clBlue;
}
DBGridEh1->DefaultDrawColumnCell(Rect,DataCol,Column,State);
}
}
//---------------------------------------------------------------------------
|
Тут сравнение по булевой переменной, однако ничего не мешает сравнивать что угодно другое.
|
|