Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая по базам данных.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
278.53 Кб
Скачать

Список использованной литературы:

  1. Дейт К. Дж. Введение в системы баз данных;

  2. ПoлУилтoн, ДжoнКoлби, «Ввeдeниe в SQL», 2006г.

  3. Хомоненко А.Д. Работа с базами данных в DELPHI, 3-е издание // А.Д. Хомоненко, В.Э. Гофман – СПб.: БХВ-Петербург 2005, – 623 с.

  4. Хомоненко А.Д. Базы данных // А.Д. Хомоненко– СПб.: Корона-Принт 2004.

  5. Microsoft Access 2002 Шаг за Шагом// - Москва – Эком 2002.

Приложение а

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, Grids, syscat, ExtCtrls;

type

TAtrib = record

name,typ:string;

end;

TTables = record

name, psevdo,foreign_key,primary_key:string;

atribs:array [0..10] of TAtrib;

end;

TArTables = array [0..10] of TTables;

TForm1 = class(TForm)

StringGrid1: TStringGrid;

StringGrid2: TStringGrid;

ListBox1: TListBox;

Button2: TButton;

Button3: TButton;

Memo1: TMemo;

CheckBox1: TCheckBox;

procedure FormCreate(Sender: TObject);

procedure ComboBoxChange(sender : Tobject);

procedure InitTable;

procedure InitCombo;

function findTable_n(name:string;tables:TArTables):integer;

function findTable_p(psevdo:string;tables:TArTables):integer;

function FindTable(s:string;tables:TArTables):integer;

procedure ListTables;

procedure CreateTableList(var tables:TArTables);

procedure StringGrid2SelectCell(Sender: TObject; ACol, ARow: Integer;

var CanSelect: Boolean);

procedure Button2Click(Sender: TObject);

procedure ListBox1DblClick(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

Combo : array [1..20,0..2] of TCombobox;

Check : array [1..20] of TCheckBox;

Btn : array [1..20] of tButton;

Tables, UseTables: TArTables;

implementation

uses Unit2, Unit3;

{$R *.dfm}

// поиск BOxa в массиве

procedure findCombo(sender : TObject; var x,y:integer);

var i,j:integer;

begin

for i:=1 to 20 do

for j:= 0 to 2 do

if sender=combo[i,j] then begin x:= i; y:= j; end;

end;

//поиск таблицы по имени

function tform1.findTable_n(name:string;tables:TArTables):integer;

var i:integer;

begin

result:=0;

for i := 1 to strtoint(tables[0].name)do

if tables[i].name=name then begin

result:=i;

break;

end;

end;

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

function tform1.findTable_p(psevdo:string;tables:TArTables):integer;

var i:integer;

begin

result:=0;

for i := 1 to strtoint(tables[0].name)do

if tables[i].psevdo=psevdo then begin

result:=i;

break;

end;

end;

function tform1.FindTable(s:string;tables:TArTables):integer;

begin

if findTable_p(s,tables)=0 then result:=findTable_n(s,tables)

else result:=findTable_p(s,tables)

end;

procedure Tform1.ComboBoxChange(sender : TObject);

var k,x,y,i:integer;

CurCombo:TCombobox;

begin

findCombo(sender,x,y);

CurCombo:=Combo[x,y];

k:=findTable_p(CurCombo.Text,usetables);

if k=0 then k:=findTable_n(CurCombo.Text,usetables);

//загружаем в combo второй строки атрибуты из таблицы

case y of

0: begin

if CurCombo.Text<>'' then

begin

combo[x,y+1].Clear;

for i :=1 to strtoint(usetables[k].atribs[0].name)do

combo[x,y+1].Items.add(usetables[k].atribs[i].name);

end;

end;

end;

stringgrid2.Cells[x,y]:=(sender as TCombobox).Text;

(sender as TCombobox).Visible:=false;

end;

procedure Tform1.InitTable;

begin

// инициализация надписей

Stringgrid1.Cells[0,0]:='Таблица';

Stringgrid1.Cells[1,0]:='Атрибут';

Stringgrid1.Cells[2,0]:='Тип';

Stringgrid1.Cells[3,0]:='Перв. ключ';

Stringgrid1.Cells[4,0]:='Внешний ключ';

stringgrid2.Cells[0,0]:=' таблица';

stringgrid2.Cells[0,1]:=' поле';

stringgrid2.Cells[0,2]:='сортировка';

stringgrid2.Cells[0,3]:=' результат';

stringgrid2.Cells[0,4]:=' условие';

end;

procedure tform1.CreateTableList(var tables:TArTables);

var s,s1:string;

c,i,j:integer;

begin

c:=0;

s:=GetListTable;

s1:='';

//находим имена таблиц

for i:= 1 to length(s) do

if s[i]=#13 then begin

inc(c);

tables[c].name:=s1;

s1:=''

end

else s1:=s1+s[i];

tables[0].name:=inttostr(c);

//формируем для каждой таблицы список атрибутов

s1:='';

c:=0;

for i:= 1 to strtoint(tables[0].name)do

begin

s:=GetListAttr(tables[i].name);

for j:= 1 to length(s) do

begin

if s[j]=#13 then begin

inc(c);

tables[i].atribs[c].name:=s1;

tables[i].atribs[c].typ:=GetTypeStr(tables[i].name,s1);

s1:=''

end

else s1:=s1+s[j];

tables[i].atribs[0].name:=inttostr(c);

end;

c:=0;

end;

usetables[0].name:='0';

end;

procedure Tform1.InitCombo;

var i,j,k:integer;

begin

for i:=1 to StringGrid2.colcount do

for j:= 0 to 2 do

begin

Combo[i,j]:=TComboBox.Create(form1.StringGrid2);

Combo[i,j].BoundsRect := StringGrid2.CellRect(i,j);

Combo[i,j].Top:=combo[i,j].Top + StringGrid2.Top + 2;

Combo[i,j].Left:=combo[i,j].Left + StringGrid2.Left + 2;

Combo[i,j].Visible:=false;

Combo[i,j].Parent:=Form1;

Combo[i,j].Tag:=i;

Combo[i,j].OnChange:=form1.ComboBoxChange;

case j of

2: begin

Combo[i,j].Items.Add('по возрастанию');

Combo[i,j].Items.Add('по убыванию');

end;

end;

end;

for i:=1 to StringGrid2.colcount do

begin

Check[i]:=TCheckBox.Create(form1.StringGrid2);

Check[i].BoundsRect := StringGrid2.CellRect(i,3);

Check[i].Top:= Check[i].Top + StringGrid2.Top + 2;

Check[i].Left:= Check[i].Left + StringGrid2.Left + 2;

check[i].Caption:=inttostr(i);

Check[i].Parent:=Form1;

end;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

OpenSysCatFiles;

CreateTableList(Tables);

InitTable;

InitCombo;

ListTables;

end;

procedure tform1.ListTables;

var s,a,cur,tem:string;row,i,j:byte;

begin

cur:='';tem:='';Row:=2;

s:=GetListTable;

for i:=1 to Length(s) do

if s[i]=#13 then

begin

StringGrid1.RowCount:=Row;

StringGrid1.Cells[0,Row-1]:=cur;

a:=GetListAttr(cur);

for j:=1 to Length(a) do

if a[j]=#13 then

begin

StringGrid1.Cells[1,Row-1]:=tem;

StringGrid1.Cells[2,Row-1]:=GetTypeStr(cur,tem);

if IsPrimaryKey(cur,tem) then StringGrid1.Cells[3,Row-1]:='Primary key';

StringGrid1.Cells[4,Row-1]:=GetForeignKey(cur,tem);

inc(Row); StringGrid1.RowCount:=Row;

tem:='';

end else tem:=tem+a[j];

cur:='';

end else cur:=cur+s[i];

end;

procedure TForm1.StringGrid2SelectCell(Sender: TObject; ACol,

ARow: Integer; var CanSelect: Boolean);

begin

if ARow<3 then

begin

//показываем соответствующий combo

Combo[ACol,ARow].BoundsRect := StringGrid2.CellRect(ACol,ARow);

Combo[ACol,ARow].Top:=combo[ACol,ARow].Top + StringGrid2.Top + 2;

Combo[ACol,ARow].Left:=combo[ACol,ARow].Left + StringGrid2.Left + 2;

combo[ACol,ARow].Visible:=true;

end;

if ARow=4 then begin

//загружаем образ формы в форму3

i:=ACol;

form3.Edit1.Text:=unit3.frm[i].edit1;

form3.Edit2.Text:=unit3.frm[i].edit2;

form3.Edit3.Text:=unit3.frm[i].edit3;

form3.Edit4.Text:=unit3.frm[i].edit4;

case unit3.frm[i].IndexRadio of

1: form3.RadioButton1.Checked:=true;

2: form3.RadioButton2.Checked:=true;

3: form3.RadioButton3.Checked:=true;

else begin

form3.RadioButton1.Checked:=false;

form3.RadioButton2.Checked:=false;

form3.RadioButton3.Checked:=false;

end;

end;

form3.ComboBox1.Text:=unit3.frm[i].combo1;

form3.ComboBox2.Text:=unit3.frm[i].combo2;

form3.ComboBox3.Text:=unit3.frm[i].combo3;

form3.setindex(ACol);

form3.visible:=true;

end;

form1.caption:='Acol '+inttostr(acol)+' Arow '+inttostr(Arow);

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

form2.Edit1.Clear;

form2.Button2.Enabled:=false;

form2.Button3.Enabled:=false;

form2.ComboBox1.Text:='';

form2.Visible:=true;

end;

procedure TForm1.ListBox1DblClick(Sender: TObject);

begin

form2.ComboBox1.Enabled:=false;

form2.Button2.Enabled:=True;

form2.Button1.Enabled:=false;

form2.Button3.Enabled:=true;

form2.ComboBox1.Text:=usetables[listbox1.itemindex+1].name;

form2.Edit1.Text:=usetables[listbox1.itemindex+1].psevdo;

form2.Visible:=true;

end;

procedure AddForCom(var str:string);

//добавление внешних ключей

function GetName(s:string; var s1:string):string;

var i:integer;

begin

result:='';

i:=1;

while s[i]<>'.' do

begin

result:=result+s[i];

inc(i);

end;

s1:=copy(s,i,length(s));

end;

var s,s1:string;

j,i,k:integer;

begin

for i:= 1 to strtoint(usetables[0].name) do

begin

s1:='';

for j := 1 to strtoint(usetables[i].atribs[0].name)do

begin

s:=getforeignkey(usetables[i].name,usetables[i].atribs[j].name);

if s<>''

then

for k:= 1 to strtoint(usetables[0].name)do

if GetName(s,s1)=usetables[k].name then

begin

if usetables[i].psevdo<>'' then str:=str+'('+usetables[i].psevdo+'.'+usetables[i].atribs[j].name+'='

else str:=str+'('+usetables[i].name+'.'+usetables[i].atribs[j].name+'=';

if usetables[k].psevdo<>'' then str:=str+usetables[k].psevdo+s1+')'+'and '

else str:=str+usetables[k].name+s1+')'+'and ';

end;

end;

end;

end;

procedure TForm1.Button3Click(Sender: TObject);

function Dif:boolean;

var i,j:integer;

begin

Result:=false;

for i:= 1 to strtoint(UseTAbles[0].name) do

for j:= 1 to strtoint(UseTAbles[0].name) do

if (Usetables[i].name<>UseTables[j].name) then result:=True;

end;

var select,from,where,orderby, query:string;

i,j:integer;

m:set of byte;

count:byte;

f,join:boolean;

begin

m:=[];

select:='select ';

where:='';

orderby:='';

if checkbox1.Checked then select:=select+'distinct ';

count:=0;

for i:= 1 to 20 do if ((combo[i,0].text<>'')and(combo[i,1].Text<>'')and(Stringgrid2.Cells[i,4]='')) then inc(count);

f:=false;

if (strtoint(usetables[0].name)=2)and(count=2)and(Dif) then begin

f:=true;

join:=true;

end;

for i:=1 to 20 do

begin

if check[i].Checked then select:=select + combo[i,0].Text+'.'+combo[i,1].Text+', '; //select

if (combo[i,2].Text<>'')and(combo[i,1].Text<>'')then

if combo[i,2].text='по возрастанию' then orderby:=orderby+combo[i,0].Text+'.'+combo[i,1].Text+', ' //orderby

else orderby:=orderby+combo[i,0].Text+'.'+combo[i,1].Text+'desc, ';

if (combo[i,0].text<>'')and(combo[i,1].Text<>'')and(unit3.frm[i].usl<>'')then where:=where + '('+unit3.frm[i].usl+')'+' and ';

end;

for i:= 1 to StrToint(UseTAbles[0].name)do

if f

then

begin

if usetables[i].psevdo<>'' then from:=from+' '+usetables[i].name+' as '+usetables[i].psevdo+' '

else from:=from+' '+usetables[i].name+' ';

if join then begin

from:=from+'full outer join';

join:=false;

end;

end

else

if usetables[i].psevdo<>'' then from:=from+usetables[i].name+' as '+usetables[i].psevdo+', '

else from:=from+usetables[i].name+', ';

select:=copy(select,1,length(select)-2)+' '; //удаление лишних запятых and и т.д.

from:='from '+copy(from,1,length(from)-2)+' ';

addforcom(where);

if where <>'' then

if f then where:='on '+copy(where,1,length(where)-4)+' '

else where:='where '+copy(where,1,length(where)-4)+' ';

if orderby<>'' then orderby:='order by'+copy(orderby,1,length(orderby)-2)+' ';

query:=select+from+where+orderby;

memo1.Clear;

memo1.Lines.Add(query);

end;

procedure TForm1.Button4Click(Sender: TObject);

begin

memo1.Lines.Add(getforeignkeys(combo[1,0].text));

end;

end.

unit Unit2;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, unit1;

type

TForm2 = class(TForm)

ComboBox1: TComboBox;

Edit1: TEdit;

Button1: TButton;

Button2: TButton;

Button3: TButton;

procedure FormCreate(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure FormActivate(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form2: TForm2;

prev:string;

implementation

{$R *.dfm}

procedure TForm2.FormCreate(Sender: TObject);

var i,k:integer;

begin

k:=strtoint(unit1.Tables[0].name);

for i:= 1 to k do

combobox1.Items.Add(unit1.tables[i].name);

end;

procedure TForm2.Button1Click(Sender: TObject);

var k,i,j:integer;

f:boolean;

begin

//Добавление в UseTAble

f:=true;

k:=strtoint(unit1.UseTables[0].name);

j:=form1.findTable_n(combobox1.text,Tables);

for i:= 1 to strtoint(usetables[0].name)do

begin

if (usetables[i].name=combobox1.Text)and(usetables[i].psevdo='') then showmessage('повторяющаяся таблица не имеет псевдонима');

if (usetables[i].psevdo=edit1.Text)then

if ((edit1.Text='')and(usetables[i].name=combobox1.Text))or(edit1.Text<>'')then

begin

showmessage('псевдоним не уникален');

f:=false;

end;

end;

if f then //если добалвен уникальный псевдоним

begin

inc(k);

unit1.UseTables[k]:=unit1.tables[j];

unit1.UseTables[k].psevdo:=edit1.Text;

unit1.UseTables[0].name:=inttostr(k);

form1.ListBox1.Items.Add(unit1.UseTables[k].name+' : '+unit1.UseTables[k].psevdo);

for i:= 1 to 20 do

if edit1.Text='' then unit1.combo[i,0].items.add(usetables[k].name)

else unit1.combo[i,0].items.add(usetables[k].psevdo);

form2.Visible:=false;

end;

end;

procedure TForm2.FormActivate(Sender: TObject);

begin

prev:=edit1.Text;

end;

procedure TForm2.Button2Click(Sender: TObject);

var i,k:integer;

f:boolean;

begin

//Измение в UseTAble

f:=true;

combobox1.Enabled:=true;

for i:=1 to strtoint(Unit1.UseTables[0].name) do

if (useTables[i].name=combobox1.Text)and(useTables[i].psevdo=prev) then k:= i;

for i:= 1 to strtoint(usetables[0].name)do

begin

if (i<>k)and(usetables[i].name=combobox1.Text)and(usetables[i].psevdo='') then showmessage('повторяющаяся таблица не имеет псевдонима');

if (i<>k)and(usetables[i].psevdo=edit1.Text)then

if ((edit1.Text='')and(usetables[i].name=combobox1.Text))or(edit1.Text<>'')then

begin

showmessage('псевдоним не уникален');

f:=false;

end;

end;

if f then begin //если добалвен уникальный псевдоним

unit1.usetables[k].psevdo:=edit1.Text;

form1.ListBox1.Items[k-1]:=usetables[k].name+' : '+usetables[k].psevdo;

form2.Visible:=false;

for i:= 1 to 20 do

if edit1.Text='' then unit1.combo[i,0].items[k-1]:=usetables[k].name

else unit1.combo[i,0].items[k-1]:=usetables[k].psevdo;

end;

button1.Enabled:=true;

end;

procedure TForm2.Button3Click(Sender: TObject);

var i, index:integer;

begin

//Удаление в UseTAble

if form1.FindTable(combobox1.Text,UseTables)<>0 then index:=form1.FindTable(combobox1.Text,UseTables)

else index:=form1.FindTable(Edit1.Text,UseTables);

for i:= index to strtoint(UseTables[0].name)-1 do

begin

UseTables[i]:=UseTAbles[i+1]

end;

UseTables[0].name:=inttostr(StrToInt(UseTAbles[0].name)-1);

form1.ListBox1.Items.Delete(form1.listbox1.ItemIndex);

form2.Visible:=false;

end;

end.

unit Unit3;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls,syscat;

type

TImageForm=record

IndexRadio:integer;

edit1,edit2,edit3,edit4:string;

combo1,combo2,combo3:string;

usl:string;

end;

TForm3 = class(TForm)

RadioButton1: TRadioButton;

Label2: TLabel;

RadioButton2: TRadioButton;

Edit1: TEdit;

Edit2: TEdit;

Edit3: TEdit;

RadioButton3: TRadioButton;

ComboBox1: TComboBox;

Button1: TButton;

ComboBox2: TComboBox;

ComboBox3: TComboBox;

Edit4: TEdit;

procedure initforms;

procedure setindex(i:integer);

procedure FormCreate(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure ComboBox2Change(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

index:integer;

Form3: TForm3;

frm:array[1..20] of TImageForm;

implementation

uses Unit1;

{$R *.dfm}

procedure tform3.initforms;

var i:integer;

begin

for i:= 1 to 20 do

begin

frm[i].IndexRadio:=0;

frm[i].edit1:='';

frm[i].edit2:='';

frm[i].edit3:='';

frm[i].combo1:='';

frm[i].combo2:='';

end;

end;

procedure tform3.setindex(i:integer);

begin

index:=i;

end;

procedure TForm3.FormCreate(Sender: TObject);

begin

combobox1.items.Add('=');

combobox1.items.Add('>');

combobox1.items.Add('<');

combobox1.items.Add('<=');

combobox1.items.Add('>=');

combobox2.Items.Add('значение');

combobox2.Items.Add('поле');

initforms;

end;

procedure TForm3.Button1Click(Sender: TObject);

var f:boolean;

begin

f:=true;

frm[index].edit1:=edit1.Text;

frm[index].edit2:=edit2.Text;

frm[index].edit3:=edit3.Text;

frm[index].edit4:=edit4.Text;

frm[index].combo1:=combobox1.Text;

frm[index].combo2:=combobox2.Text;

frm[index].combo3:=combobox3.Text;

if radiobutton1.Checked then begin

if GetTypeStr(unit1.Combo[index,0].text,unit1.Combo[index,1].text)<>'число'

then begin

frm[index].IndexRadio:=1;

frm[index].usl:=combo[index,0].text+'.'+ combo[index,1].text+' like ''' + edit1.Text+'''';

end

else f:=false;

end;

if radiobutton2.Checked then begin

frm[index].IndexRadio:=2;

if GetTypeStr(unit1.Combo[index,0].text,unit1.Combo[index,1].text)='строка'

then frm[index].usl:=unit1.combo[index,0].text+'.'+unit1.combo[index,1].text+' between '''+ edit2.Text + ''' and '''+edit3.Text+''''

else frm[index].usl:=unit1.combo[index,0].text+'.'+unit1.combo[index,1].text+' between '+ edit2.Text + ' and '+edit3.Text;

end;

if radiobutton3.Checked then begin

frm[index].IndexRadio:=3;

if combobox2.Text='поле' then frm[index].usl:=unit1.combo[index,0].text+'.'+unit1.combo[index,1].text+combobox1.Text+combobox3.Text

else frm[index].usl:=unit1.combo[index,0].text+'.'+unit1.combo[index,1].text+combobox1.Text+edit4.Text;

end;

if f then begin

form3.Visible:=false;

form1.stringgrid2.cells[index,4]:=frm[index].usl;

end

else showmessage('Несоответствие типов');

end;

procedure TForm3.ComboBox2Change(Sender: TObject);

var i,j:integer;

begin

combobox3.Clear;

if combobox2.Text='поле' then begin

edit4.Visible:=false;

combobox3.Visible:=true;

for i:=1 to strtoint(unit1.usetables[0].name)do

for j:=1 to strtoint(unit1.usetables[i].atribs[0].name)do

if unit1.UseTables[i].atribs[j].typ=GetTypeStr(usetables[form1.findTable(unit1.Combo[index,0].text,usetables)].name,unit1.Combo[index,1].text)then

if unit1.usetables[i].psevdo='' then combobox3.Items.Add(unit1.usetables[i].name+'.'+unit1.usetables[i].atribs[j].name)

else combobox3.Items.Add(unit1.usetables[i].psevdo+'.'+unit1.usetables[i].atribs[j].name)

end

else begin

edit4.Visible:=true;

combobox3.Visible:=false;

end;

end;

end.

34