C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
DBGrid, Вообще реально это или нет ?
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.

И что дальше ? ohmy.gif
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 и радуемся достигнутым успехам smile.gif .
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);
   }

}
//---------------------------------------------------------------------------

Тут сравнение по булевой переменной, однако ничего не мешает сравнивать что угодно другое.

Вернуться в Работа с базами данных в C++Builder