
Список использованной литературы:
Дейт К. Дж. Введение в системы баз данных;
ПoлУилтoн, ДжoнКoлби, «Ввeдeниe в SQL», 2006г.
Хомоненко А.Д. Работа с базами данных в DELPHI, 3-е издание // А.Д. Хомоненко, В.Э. Гофман – СПб.: БХВ-Петербург 2005, – 623 с.
Хомоненко А.Д. Базы данных // А.Д. Хомоненко– СПб.: Корона-Принт 2004.
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.