Шаг 161 - Дальше о заполнении списка из БД, связанные таблицы

В реальных проектак конечно все сложнее. Существуют взаимосвязанные таблицы. Только вот на чьи плечи возложить ответственность за взаимосвязь таблиц ??? Microsoft предлагает разделить любую программу логически на 3 слоя.

  1. данные
  2. логика
  3. интерфейс

Правда я нигде не встречал подробного объяснения, что понимается под логикой. Так вот, если у нас две связанные таблицы, то кто будет ответственен за связь ??? БД или приложение ??? Давайте попробуем возложить ответственность на БД. Раз уж она называется Access, что вроде означает "доступ", так пусть и работает :-))) Вот схема данных.

161_1.gif (1447 b)

Мы договаривались, что ответственность за связь возмет БД. Поэтому создадим в БД запрос.

161_2.gif (4413 b)

Имя ему дадим Query1.

Вот пора делать программу. Будет изменять предыдущий проект. Итак, теперь мы будет работать не на основе таблицы, а на основе запроса. Значит надо поменять тип класса.

CDaoQueryDef cf(&cd);
// CDaoTableDef cf(&cd);

Идея простая, с таблицами работают одни классы, а с запросами другие. Но класс CDaoRecordset можно строить и на основе таблицы и на основе запроса. Поэтому всё остается похоже. Только при открытии набора записей нужно указать имя запроса.

if (cd.IsOpen())
{
 cf.Open("Query1");
 if (cd.IsOpen())

Что произойдет при выполнении запроса ??? Две таблицы превратятся в одну. Вот так. Теперь мы можем выводить и фамилию и год.

char buf[256];
COleVariant val;
cr.GetFieldValue("family",val); 
COleVariant valyear;
cr.GetFieldValue("year",valyear);
sprintf(buf,"%s %s",val.bstrVal,valyear.bstrVal);
m_ListBox.AddString(buf);
cr.MoveNext(); 

Давайте запустим и посмотрим как это будет выглядеть.

161_3.gif (2319 b)

Видите фамилия и год рядом, т.е. таблицы слились. Некрасиво скажете Вы. Ну это дело поправимое. Чего хотели того добились !!!


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 22.03.2000