
- •Лабораторная работа №6 (8 часов) Работа с локальными базами данных и несвязанными таблицами
- •6.1. Приложение для работы с локальной базой данных
- •6.1.1. Цель работы
- •6.1.2. Задание на выполнение работы
- •6.1.3. Процесс разработки приложения
- •6.1.4. Создание псевдонима базы данных
- •6.1.5. Разработка структуры записи таблицы базы данных
- •6.1.6. Разработка основной формы и ее компонентов для работы с бд
- •6.1.6.1. Размещение и настройка основных компонентов
- •6.1.6.2. Размещение и настройка панелей
- •6.1.6.3. Настройка компонента dbGrid1
- •6.1.6.4. Формирование вычисляемого поля
- •6.1.6.5. Дополнение формы окнами из редактора полей таблицы
- •6.1.7. Формирование основного меню
- •6.1.8. Методы подменю Показать данные
- •6.1.9. Методы для сортировки данных
- •6.1.10. Методы для поиска данных
- •6.1.11. Выполнение команд подменю ‘Вычислить:’
- •6.1.12. Метод команды меню Трафик' и настройка графика
- •6.1.13. Выполнение команд подменю Отчет
- •6.1.13.1. Формирование отчета
- •6.1.13.2. Методы подменю Отчет
- •6.1.14. Листинги примера проекта
- •6.1.15. Варианты заданий на работу с локальными базами данных
- •6.1.16. Контрольные вопросы
- •6.2. Приложение для соединения данных двух таблиц 1:1
- •6.2.1. Цель и задание на выполнение работы
- •6.2.2. Процесс разработки приложения
- •1) Установка русификатора для работы с таблицами типа Paradox7;
- •6.2.4. Контрольные вопросы
- •6.3. Приложение для формирования, слияния и разъединения однотипных таблиц баз данных
- •6.3.1. Цель и задание на выполнение работы
- •6.3.2. Процесс разработки приложения
- •6.3.3. Метод для работы с данных двух таблиц
- •6.3.4. Контрольныевопросы
6.1.13.2. Методы подменю Отчет
Подменю Отчет содержит 2 пункта: Просмотр и Печать. Метод команды Просмотр вызывает форму отчета и отображает его содержимое для проверки перед его печатью операторами:
Form3.Show; // - показать форму с отчетом
Form3.QuickRep1.Preview; // - предварительный просмотр
Метод Печать вызывает печать отчета, представленного на Form3.
6.1.14. Листинги примера проекта
Листинг 6.1. Фрагмент методов модуля основной формы для определения вычисляемого поля и полей для сортировки
// Определение значения вычисляемого поля - для ТаЫе1 procedureTForm1.Table1CalcFields(DataSet: TDataSet);
begin
Table1NRS.Value := Table1RS.Value * 1.5;
end;
// Определениезначениявычисляемогополя - для Query1 procedure TForm1.Query1CalcFields(DataSet: TDataSet);
begin
Query1NRS.Value := Query1RS.Value * 1.5;
end;
// Сортироватьпономерузачетки
procedure TForm1.N16Click(Sender: TObject);
begin
DataSource1.DataSet := Table1;
IF Table1.Filtered = True
then
Table1.Filtered := False;
Tablel.IndexFieldNames := 'NZ';
end;
// Сортироватьпо FIO
procedure TForm1.N17Click(Sender: TObject);
begin
DataSource1.DataSet := Table1;
IF Table1.Filtered = True
then
Table1.Filtered := False;
Table1.IndexFieldNames := 'FIO';
end;
// Сортироватьпо RS
procedure TForm1.N18Click(Sender: TObject);
begin
DataSource1.DataSet := Table1;
IF
Table1.Filtered = True
then
Table1.Filtered := False;
Table1.IndexFieldNames := 'RS';
end;
Листинг 6.2. Текст модуля основной формы приложения для работы с локальной базой данных
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, ExtCtrls, DBCtrls, Grids, DBGrids, DB, DBTables, Mask,
StdCtrls, ComCtrls, XPMan;
type
TForm1 = class(TForm)
Table1: TTable;
Query1: TQuery;
Query2: TQuery;
Query3: TQuery;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
MainMenu1: TMainMenu;
Timer1: TTimer;
StatusBar1: TStatusBar;
Panel1: TPanel;
Panel2: TPanel;
Panel3: TPanel;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Edit1: TEdit;
Button1: TButton;
MaskEdit1: TMaskEdit;
Edit2: TEdit;
XPManifest1: TXPManifest;
Table1NZ: TFloatField;
Table1FIO: TStringField;
Table1RS: TFloatField;
Table1FOTO: TGraphicField;
Label4: TLabel;
DBEdit1: TDBEdit;
Label5: TLabel;
DBEdit2: TDBEdit;
Label6: TLabel;
DBEdit3: TDBEdit;
Label7: TLabel;
DBImage1: TDBImage;
Label8: TLabel;
DBEdit4: TDBEdit;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N1501: TMenuItem;
Cpflfyysvyjvthjvpfxtnrb1: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
Query4: TMenuItem;
N7: TMenuItem;
N8: TMenuItem;
N9: TMenuItem;
N10: TMenuItem;
N11: TMenuItem;
N12: TMenuItem;
N13: TMenuItem;
N14: TMenuItem;
N16: TMenuItem;
N17: TMenuItem;
N18: TMenuItem;
N19: TMenuItem;
N20: TMenuItem;
N21: TMenuItem;
N22: TMenuItem;
N23: TMenuItem;
N24: TMenuItem;
N15: TMenuItem;
StringGrid1: TStringGrid;
DBNavigator1: TDBNavigator;
Table1RNS: TIntegerField;
Label9: TLabel;
procedure Table1CalcFields(DataSet: TDataSet);
procedure N21Click(Sender: TObject);
procedure N15Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure N8Click(Sender: TObject);
procedure N9Click(Sender: TObject);
procedure N10Click(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure N1501Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure N23Click(Sender: TObject);
procedure Cpflfyysvyjvthjvpfxtnrb1Click(Sender: TObject);
procedure N12Click(Sender: TObject);
procedure MaskEdit1DblClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure N16Click(Sender: TObject);
procedure Edit2Change(Sender: TObject);
procedure Edit2DblClick(Sender: TObject);
procedure N19Click(Sender: TObject);
procedure N24Click(Sender: TObject);
procedure N20Click(Sender: TObject);
procedure Query1CalcFields(DataSet: TDataSet);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
S:real;
J:integer;
implementation
uses Unit2,Unit3;
{$R *.dfm}
procedure TForm1.Table1CalcFields(DataSet: TDataSet);
begin
with DataSet do
FieldByName('RNS').AsFloat:=FieldByName('RS').AsFloat * 1.5;
end;
procedure TForm1.N21Click(Sender: TObject);
begin
Form2.Show;
end;
procedure TForm1.N15Click(Sender: TObject);
begin
Form1.Close;
Form2.Close;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
StatusBar1.Panels[2].Text:=TimeToStr(Time);
end;
procedure TForm1.N8Click(Sender: TObject);
begin
DataSource1.DataSet:=Table1;
if Table1.Filtered=True then Table1.Filtered:=False;
with Sender as TMenuItem do
Table1.IndexFieldNames:=Table1.IndexDefs[0].Fields;
end;
procedure TForm1.N9Click(Sender: TObject);
begin
DataSource1.DataSet:=Table1;
if Table1.Filtered=True then Table1.Filtered:=False;
with Sender as TMenuItem do
Table1.IndexFieldNames:=Table1.IndexDefs[1].Fields;
end;
procedure TForm1.N10Click(Sender: TObject);
begin
DataSource1.DataSet:=Table1;
if Table1.Filtered=True then Table1.Filtered:=False;
with Sender as TMenuItem do
Table1.IndexFieldNames:=Table1.IndexDefs[2].Fields;
end;
procedure TForm1.N2Click(Sender: TObject);
begin
if Table1.Filtered=True then Table1.Filtered:=False;
DataSource1.DataSet:=Table1;
end;
procedure TForm1.N1501Click(Sender: TObject);
begin
if Query1.Filtered=true then Query1.Filtered:=false;
if Query1.Active=false then Query1.Active:=true;
DataSource1.DataSet:=Query1;
end;
procedure TForm1.FormCreate(Sender: TObject);
var i,j:integer;
const c:array[0..1,0..5] of string=(('','номер зач.','ФИО','стипендия','','нов.стип.'),('','','','','',''));
begin
J:=Tag;
for i:=0 to 1 do
for j:=0 to 5 do StringGrid1.Cells[j,i]:=c[i,j];
end;
procedure TForm1.N23Click(Sender: TObject);
begin
Form3.Show;
Form3.QuickRep1.Preview;
end;
procedure TForm1.Cpflfyysvyjvthjvpfxtnrb1Click(Sender: TObject);
begin
with sender as TMenuItem do Begin
J:=Tag;
Panel3.Visible:=True;
Label7.WordWrap:=True;
Label7.Height:=39;
Label7.Width:=146;
end;end;
procedure TForm1.N12Click(Sender: TObject);
begin
with sender as TMenuItem do begin
J:=Tag;
Panel1.Visible:=true;
Edit1.SetFocus;
if J=8 then begin
Panel2.Visible:=true;
MaskEdit1.SetFocus;
Label2.Caption:='Введите размер стипендии';
end; end; end;
procedure TForm1.MaskEdit1DblClick(Sender: TObject);
var A:integer;
begin
case J of
1: begin
if Query2.Filtered=true then Query2.Filtered:=false;
DataSource1.DataSet:=Query2;
A:=StrToInt(MaskEdit1.Text);
with Query2 do begin Close;
Query2.Active:=False;
ParamByName('NZ').Value:=A;
//Params[0].AsInteger:=A; //или это вместо предыдущ. 2 строчек
Open; end;end;
2: begin
DataSource1.DataSet:=Table1;
if Table1.Filtered=false then Table1.Filtered:=True;
Table1.Filter:='NZ>'+MaskEdit1.Text;
end;
3: begin
DataSource1.DataSet:=Query1;
Query1.Close;
Query1.Filter:='NZ>'+MaskEdit1.Text;
if Query1.Filtered=false then Query1.Filtered:=True;
Query1.Open;
end;
4: begin
DataSource1.DataSet:=Query3;
Query3.Close;
Query3.SQL.Clear;
Query3.SQL.Add('SELECT * FROM Stud1 WHERE Stud1.NZ > '+MaskEdit1.Text);
Query3.Open;
end;
end;
Panel3.Visible:=False;
end;
procedure TForm1.Button1Click(Sender: TObject);
procedure S1;
begin
MessageDlg('Запись найдена',mtInformation,[mbOK],0);
end;
procedure S2;
begin Beep;
MessageDlg('Запись не найдена',mtInformation,[mbOK],0);
end;
begin
case J of
5: begin Table1.IndexFieldNames:='FIO';
Table1.SetKey;
Table1.FieldByName('FIO').AsString:=Edit1.Text;
if Table1.GotoKey then S1
else S2;
end;
6: if Table1.Locate('FIO',Edit1.Text,[loCaseInsensitive, loPartialKey])
then S1 else S2;
7: begin
Table1.IndexFieldNames:='FIO';
Table1.SetKey;
Table1.FieldByName('FIO').AsString:=Edit1.Text;
Table1.GotoNearest;
end;
8: begin
if Table1.Locate('FIO;RS',VarArrayOf([Edit1.Text,MaskEdit1.Text]),[loCaseInsensitive,loPartialKey])
then S1 else S2;
Panel3.Visible:=false;
end; end;
Panel1.Visible:=false;
end;
procedure TForm1.N16Click(Sender: TObject);
begin
Panel2.Visible:=true;
Edit2.SetFocus;
end;
procedure TForm1.Edit2Change(Sender: TObject);
begin
Table1.IndexFieldNames:='FIO';
Table1.FindNearest([Edit2.Text]);
end;
procedure TForm1.Edit2DblClick(Sender: TObject);
begin
Panel2.Visible:=false;
end;
procedure TForm1.N19Click(Sender: TObject);
var st:string;
begin
Table1.First;
S:=0;
while not (Table1.Eof) do
begin
S:=S+Table1RS.Value;
Table1.Next;
end;
st:=FloatToStr(S);
Label9.Caption:='Сумма стипендий = '+st;
end;
procedure TForm1.N24Click(Sender: TObject);
begin
Form3.QuickRep1.Print;
end;
procedure TForm1.N20Click(Sender: TObject);
var st:string;n:integer;
begin
n:=Table1.RecordCount;
N19Click(Sender);
s:=s/n;
st:=FloatToStr(s);
Label9.Caption:='Средняя стипендия = '+st;
end;
procedure TForm1.Query1CalcFields(DataSet: TDataSet);
begin
with DataSet do
FieldByName('RNS').AsFloat:=FieldByName('RS').AsFloat * 1.5;
end; end.
Листинг 6.3. Текст модуля формы с графиком
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, TeeProcs, TeEngine, Chart, DbChart, Series, StdCtrls;
type
TForm2 = class(TForm)
DBChart1: TDBChart;
Series1: TLineSeries;
Series2: TLineSeries;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
uses Unit1,Unit3;
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
begin
Form2.Hide;
end; end.
Листинг 6.4. Текст модуля формы с отчетом
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, QRCtrls, QuickRpt, ExtCtrls, Menus;
type
TForm3 = class(TForm)
QuickRep1: TQuickRep;
QRBand1: TQRBand;
QRLabel1: TQRLabel;
QRBand2: TQRBand;
QRLabel2: TQRLabel;
QRLabel3: TQRLabel;
QRLabel4: TQRLabel;
QRLabel5: TQRLabel;
QRBand3: TQRBand;
QRBand4: TQRBand;
QRDBText1: TQRDBText;
QRDBText2: TQRDBText;
QRDBText3: TQRDBText;
QRDBText4: TQRDBText;
QRDBImage1: TQRDBImage;
QRExpr1: TQRExpr;
QRExpr2: TQRExpr;
QRLabel6: TQRLabel;
QRLabel7: TQRLabel;
QRLabel8: TQRLabel;
QRLabel9: TQRLabel;
QRSysData1: TQRSysData;
procedure N1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form3: TForm3;
implementation
uses Unit1,Unit2;
{$R *.dfm}
procedure TForm3.N1Click(Sender: TObject);
begin
Form3.Hide;
end; end.