Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка ЛР по ОС.doc
Скачиваний:
3
Добавлен:
04.05.2019
Размер:
735.23 Кб
Скачать

4.7Реализация запросов на выбор данных из одной или нескольких таблиц

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

В качестве примера будет рассмотрена реализация запроса следующего вида: вывести сведения обо всех студентах, изучающих дисциплину «Х».

Разместите необходимые графические элементы в окне, при этом не забывая присваивать осмысленные наименования объектам. Примерный вид окна представлен на рисунке 4.7.

Рисунок 4.7 – Окно вывода результатов запроса

Для реализации данного запроса необходимо сформировать обработчик нажатия клавиши «Выполнить». Логику работы выполнения запроса по поиску строк можно описать следующим образом:

  1. Найти дисциплину в таблице «Дисциплин», соответствующую заданному названию. Если дисциплина не найдена, прервать работу алгоритма.

  2. Найти все номера студентов в таблице «Д_С», для которых значение номера дисциплины совпадает с номером дисциплины, полученным на Шаге 1.

  3. Для каждого найденного номера студента получить необходимые сведения из таблицы «Студент».

  4. Сформировать строку с обобщёнными сведениями и вывести полученный результат на экран.

Ниже приведён пример программного кода, который осуществляет поиск строк, удовлетворяющих заданному критерию поиска.

    1. Реализация обработчика нажатия клавиши «Выполнить»

// файл fmQuery1Unit.cpp, класс TfmQuery1

void __fastcall TfmQuery1::btExecuteClick(TObject *Sender)

{

lvList->Clear();

AnsiString Name = edName->Text;

bool Exists = false;

int i;

TDiscipline *discipline;

// Поиск в таблице дисциплин дисциплины с заданным названием

for (i = 0; i<MainForm->Disciplines->Count; i++)

{

discipline = (TDiscipline *)MainForm->Disciplines->Items[i];

if (discipline->Name.AnsiCompareIC(Name) == 0)

{

Exists = true;

break ;

}

}

// Если дисциплина не найдена, выйти из функции

if (Exists == false)

return ;

TD_S *disc_stud;

// Поиск в таблице Дисциплина_Студент всех номеров студентов, изучающих заданную дисциплину

for (i = 0; i<MainForm->DiscStud->Count; i++)

{

disc_stud = (TD_S *)MainForm->DiscStud->Items[i];

// Сравнение номера найденой дисциплины с номером из общего списка

if (disc_stud->DisciplineNo == discipline->No)

{

TStudent *student;

// Поиск для каждого найденного номера дисциплины сведений о студенте, изучающем дисциплину

for (int j = 0; j<MainForm->Students->Count; j++)

{

student = (TStudent *)MainForm->Students->Items[j];

// Если номера студентов совпали, выводить общую строку результата на экран

if (student->No == disc_stud->StudentNo)

{

TListItem *item;

// Добавление строки в таблицу на экране

item = lvList->Items->Add();

item->Caption = discipline->Name;

item->SubItems->Add(discipline->Teacher);

item->SubItems->Add(student->No);

item->SubItems->Add(student->Fio);

item->SubItems->Add(student->GroupNo);

item->SubItems->Add(student->Birthday.FormatString("dd.mm.yyyy"));

}

}

}

}

}

Реализация остальных запросов на выбор данных производится аналогичным образом.