Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка Builder 2курс.doc
Скачиваний:
4
Добавлен:
16.11.2019
Размер:
1.26 Mб
Скачать

7. 4. Контрольные вопросы

1. Как задать параметрический запрос?

2. Как запросы считывать с диска?

3. Как используется функция Format в запросах?

8. Лабораторная работа №7 Тема: Создание связей между таблицами

8. 1. Краткие теоретические сведения

Задать отношение «один-ко-многим» позволяют связанные указатели. Для этого используются свойства  MasterSource, MasterField, IndexName   объекта  TTable. Создать отношение между таблицами можно с помощью объекта TQuery. Объект TQuery имеет свойство DataSource,  которое служит для образования связи между объектом и другим набором данных.

В программировании операторов SQL важную роль играет поле RequestLive объекта TQuery. По умолчанию в результате любого запроса возвращается набор данных, доступный только для чтения. Присвоив свойству  RequestLive  объекта TQuery  значение True, можно выполнить активный запрос. Если в запросе используется несколько таблиц, задание свойству RequestLive значение True может привести к нежелательным результатам. Если требуется откорректировать набор данных, полученный в результате сложного SQL-запроса, следует воспользоваться командами Update или Insert. После того как оператор SQL сформирован,  его можно выполнить двумя различными способами. Если оператор SQL не будет возвращать данные, то нужно применять команду ExecSQL. Например, для вставки, удаления или изменения данных следует вызывать ExecSQL, а команду Open необходимо применять для выполнения составных операторов select [2].

 

8. 2. Задание

1. Создайте приложение, в котором при выборе имени текущего заказчика из таблицы Customer, можно было видеть список связанных с ним заказов из таблицы Orders. При выполнении задания использовать свойства объекта TTable.

2. Создайте приложение, в котором при выборе имени текущего заказчика, можно было видеть список связанных с ним заказов. При выполнении задания использовать свойства объекта TQuery.

3. Создайте приложение, в котором в верхней части формы располагается таблица Customer, а под ней набор данных , содержащий записи из связанных таблиц Orders и Items. Связать даннные с помощью таблицы и запроса. 

4. Создать приложение, позволяющее вносить изменения в записи и удалять их с помощью запроса.

 

8. 3. Ход выполнения работы

Задание №1

1. Откройте новое приложение. Создайте модуль данных DMod.

2. В модуль данных поместите по два компонента TTable,  TDataSource для таблиц Customer и Orders.

3. Установите значения в свойствах  DatabaseName (используемый псевдоним) , TableName (Customer, Orders , Name (tblCustomer  и tblOrders ), Active (True) для компонентов TTable. Свяжите каждый из компонентов TTable с источником TDataSource. Компонентам  TDataSource  присвойте соответственно  имена dsCustomer и dsOrders.

4. Щелкните правой кнопкой мыши по объекту tblCustomer . Из контекстного меню выберите команду Fields Editor.

5. Щелкните правой кнопкой мыши по свободному полю, затем выберите команду Add fields и добавьте нужные поля : CustNo, Company, Add1, Add2, City, State, Zip (Таким образом, эти поля будут определены в заголовочном файле модуля данных)

6. Окно редактора полей не закрывайте  и перенесите в сторону. Перейдите в основную форму разместите в верней части объект  TPanel.  Включите в модуль основной формы модуль данных

7. Затем поочередно перетащите поля из редактора полей. Сразу будут создаваться по два объекта TDBEdit, TLabel.  Разместите их  как показано на рисунке.

8. Также поместите в форму объект DBNavigator. Определите ему свойства: DataSource –dsCustomer (это свойство было определено объекту DataSource, связанному с таблицей Customer, VisibleButtons –оставьте  значение True только для First, Prior, Next, Last.

9. В форму поместите компонент  TDBGrid. Установите для него в свойстве DataSource значение dsOrders.

10. Теперь установите связь между таблицами.

11. Установите в свойстве  MasterSource объекта tblOrders  значение dsCustomer (имя объекта DataSource для таблицы Orders).

12. Установите значение в свойстве MasterFields . После щелчка в конце строки свойства  MasterFields появляется окно Field Link Designer. Выберите в списке AvailableIndexes (Доступные индексы) значение CustNo. Затем щелкните на CustNo в списках Detail Fields и Master Fields. Щелкните на кнопке Add. Оба выбранных поля появятся в списке Joined Fields (Связанные поля). Закройте окно щелчком на кнопке ОК.

13. В свойстве IndexName установите значение СustNo (или ByCustNo, т.е. введите имя индекса).

14.     Запустите приложение на выполнение.

Задание №2

1. Откройте новое приложение.

2. Поместите в модуль данных (DMod)  два объекта TQuery, два объекта TDataSource.

3. Установите для объекта TQuery  в свойстве DatabaseName значение используемого псевдонима, в свойстве Name – значение. например,  sqlCustomer, sqlOrders ,  в свойстве SQL 

 для первого объекта (sqlCustomer)  :       select * from Customer

для второго объекта  (sqlOrders)               select * from Orders where CustNo=  :CustNo

В свойстве DataSource объекта sqlOrders (на стороне “многие”) установите значение dsCustomer (источник данных на стороне “один “). в свойстве Active –значение True;  т.е. вместо того , чтобы использовать свойство Params для присвоения значения переменной вручную , это значение выбирают из другой таблицы.

4. Перейдите в форму. Включите модуль данных в программу.

На форме разместите два объекта TDBGrid. Подключите их к источнику данных: DBGrid1  к dsCustomer,  DBGrid2- к  dsOrders.

5. Также поместите в форму объект DBNavigator. Определите ему свойства: DataSource –dsCustomer (это свойство было определено объекту DataSource, связанному с запросом sqlCustomer, в  свойстве VisibleButtons –оставьте  значение True только для First, Prior, Next, Last

6. Запустите приложение. Убедитесь в его работоспособности.

Задание №3

1. Откройте новое приложение.

2. Поместите в модуль данных компоненты TTable (1), TQuery (1), два компонента TDataSource.

3. Установите свойства для объекта TTable: DatabaseName-используемый псевдоним, TableName –Customer, Name- tblCustomer, Active- True.

4. Объекту TDataSource установите свойства Name –dsCustomer, DataSet- tblCustomer.

5. Для объекта TQuery установите свойства:  Database-алиас, Name –Query1, SQL :

select

  O.CustNo, O.OrderNo, O.SaleDate,

  L.PartNo, L.Discount, L.Qty

from

  Orders O,Items L

where

  O.CustNo=  :CustNo  and

  O.OrderNo=L.OrderNo

в свойстве DataSource –dsCustomer, Active –True.

6. Объекту TDataSource установите свойства Name –dsOrders, DataSet- Query1.

7. Перейдитев в форму.Сохраните модуль данных под именем Dmod .Включите модуль данных в программу.

7. На форме разместите два объекта TDBGrid. Подключите их к источнику данных: DBGrid1  к dsCustomer,  DBGrid2- dsOrders.

8. В форму поместите  объект DBNavigator. Определите ему свойства: DataSource –dsCustomer В свойстве VisibleButtons –оставьте  значение True только для First, Prior, Next, Last

 

 Запустите приложение. Убедитесь в его работоспособности

Задание №4

1. Откройте новое приложение. Создайте  модуль данных (DMod) и поместите в него три компонента TQuery и один компонент TDataSourse.

2. Для первого компонента TQuery  установите значения в свойстве DatabaseName значение используемого псевдонима, свойстве Name –CountryQuery, SQL- select * from country, Active- True, RequestLlive- false.

3. Для компонента TDataSource установите значения в свойствах:  Name –CountrySource, DataSet –CountryQuery.

4. Для второго компонента TQuery установите значения в свойствах : DatabaseName - значение псевдонима, Name- InsertQuery, SQL –

   insert

  into Country (Name, Capital, Continent, Area,  Population)

  values (:Name, :Capital, :Continent, :Area, :Population)

Active –false. Убедитесь, что в свойстве Params –заданы имена переменных.

5. Для третьего компонента TQuery установите значения в свойствах : DatabaseName - значение псевдонима, Name- DeleteQuery, SQL –

delete from Country

where Name = :Name

Active -false

6. Включите модуль данных в основной.

7. Расположите в форме Form1 (SQL Insert) в верхней части компонент TPanel  с двумя кнопками TBitBtn, в нижней части сетку TDBGrid.

8. Задайте свойства для панели Align- alTop

9. Для первой кнопки  задайте свойство Caption- Insert, Name –bbInsert, Glyph –выберите изображение.

10. Для второй кнопки установите свойство Caption- Delete, Name –bbDelete, Glyph –выберите изображение.

11. Для сетки установите свойство Align- alClient и выберите из списка источник данных. (DMod->CountySource)

12. Для модуля данных используется следующий код [3]:

///////////////////////////////////////

//    File: DMod1.cpp

#include <vcl\vcl.h>

#pragma hdrstop

#include "DMod1.h"

#pragma resource "*.dfm"

 

TDMod *DMod;

 

__fastcall TDMod::TDMod(TComponent* Owner)

  : TDataModule(Owner)

{

}

 

void TDMod::FakeRefresh()

{

  TBookmark Bookmark = CountryQuery->GetBookmark();

  CountryQuery->Close();

  CountryQuery->Open();

  CountryQuery->GotoBookmark(Bookmark);

  CountryQuery->FreeBookmark(Bookmark);

}

 

void TDMod::AutoInsert(void)

{

  InsertQuery->Prepare();

  InsertQuery->Params->Items[0]->AsString = "Израйль";

  InsertQuery->Params->Items[1]->AsString = "Тель-Авив";

  InsertQuery->Params->Items[2]->AsString = "Азия";

  InsertQuery->Params->Items[3]->AsFloat = 0.0;

  InsertQuery->Params->Items[4]->AsFloat = 1.0;

  InsertQuery->ExecSQL();

//CountryQuery->Refresh();

  FakeRefresh();

}

void TDMod::Delete(void)

{

  AnsiString S("Delete " + CountryQuery->Fields->Fields[0]->AsString + "?");

  if (MessageDlg(S, mtConfirmation,

      TMsgDlgButtons() << mbYes << mbNo, 0) != ID_YES)

    return;

  DeleteQuery->Prepare();

  DeleteQuery->Params->Items[0]->AsString = CountryQuery->Fields->Fields[0]->AsString;

  DeleteQuery->ExecSQL();

  //CountryQuery->Refresh();

  FakeRefresh();

}

 

Заголовочный файл:

#ifndef DMod1H

#define DMod1H

 

#include <vcl\Classes.hpp>

#include <vcl\Controls.hpp>

#include <vcl\StdCtrls.hpp>

#include <vcl\Forms.hpp>

#include <vcl\DBTables.hpp>

#include <vcl\DB.hpp>

#include <Db.hpp>

 

class TDMod : public TDataModule

{

__published:

    TQuery *InsertQuery;

    TQuery *DeleteQuery;

    TQuery *CountryQuery;

    TDataSource *CountrySource;

private:

    void FakeRefresh();

public:

    virtual __fastcall TDMod(TComponent* Owner);

    void AutoInsert(void);

    void Delete(void);

};

 

extern TDMod *DMod;

 

#endif

12.  Определите для кнопок процедуры нажатия [3]:

#include <vcl\vcl.h>

#pragma hdrstop

 

#include "Main.h"

#include "DMod1.h"

 

#pragma resource "*.dfm"

TForm1 *Form1;

 

__fastcall TForm1::TForm1(TComponent* Owner)

  : TForm(Owner)

{

}

 

void __fastcall TForm1::bbInsertClick(TObject *Sender)

{

  DMod->AutoInsert(); 

}

 

void __fastcall TForm1::bbDeleteClick(TObject *Sender)

{

  DMod->Delete();

}

///Заголовочный файл

//

#ifndef MainH

#define MainH

 

#include <vcl\Classes.hpp>

#include <vcl\Controls.hpp>

#include <vcl\StdCtrls.hpp>

#include <vcl\Forms.hpp>

#include <vcl\DBGrids.hpp>

#include <vcl\Grids.hpp>

#include <vcl\ExtCtrls.hpp>

#include <vcl\Buttons.hpp>

 

class TForm1 : public TForm

{

__published:

    TDBGrid *DBGrid1;

    TPanel *Panel1;

    TBitBtn *bbInsert;

    TBitBtn *bbDelete;

    void __fastcall bbInsertClick(TObject *Sender);

    void __fastcall bbDeleteClick(TObject *Sender);

private:

public:

    virtual __fastcall TForm1(TComponent* Owner);

};

 

extern TForm1 *Form1;

 

#endif