Визуальный построитель запросов на извлечение
Курсовая работа, 23 Октября 2012, автор: пользователь скрыл имя
Краткое описание
Целью данной курсовой работы является разработка программы, способной на основе отношений строить запросы на извлечение информации посредством визуального построителя запросов.
На современном этапе развития информационных технологий, базы данных, а также умение пользователей получать нужную информацию приобретает всё большее значение.
Содержание
Введение………………………………………………………………………..…5
Постановка задачи………………………………………………………………..6
Реализация поставленной задачи…………………………………………….….8
Алгоритм построения запроса………………………………………….……….16
Тестирование и пример работы программы…………………………………...18
Заключение……………………………………………………………………….20
Список литературы………………………………………………………………21
Приложение……………………………………………………………………....22
Вложенные файлы: 1 файл
Визуальный построитель запросов.doc
— 268.00 Кб (Скачать файл)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:=
s1:=''
end
else s1:=s1+s[j];
tables[i].atribs[0].name:=
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(
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].
Combo[i,j].Visible:=false;
Combo[i,j].Parent:=Form1;
Combo[i,j].Tag:=i;
Combo[i,j].OnChange:=form1.
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(
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:
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]:=
a:=GetListAttr(cur);
for j:=1 to Length(a) do
if a[j]=#13 then
begin
StringGrid1.Cells[1,Row-1]:=
StringGrid1.Cells[2,Row-1]:=
if IsPrimaryKey(cur,tem) then
StringGrid1.Cells[3,Row-1]:='
StringGrid1.Cells[4,Row-1]:=
inc(Row); StringGrid1.RowCount:=Row;
tem:='';
end else tem:=tem+a[j];
cur:='';
end else cur:=cur+s[i];
end;
procedure TForm1.StringGrid2SelectCell(
ARow: Integer; var CanSelect: Boolean);
begin
if ARow<3 then
begin
//показываем соответствующий combo
Combo[ACol,ARow].BoundsRect := StringGrid2.CellRect(ACol,
Combo[ACol,ARow].Top:=combo[
Combo[ACol,ARow].Left:=combo[
combo[ACol,ARow].Visible:=
end;
if ARow=4 then begin
//загружаем образ формы в
i:=ACol;
form3.Edit1.Text:=unit3.frm[i]
form3.Edit2.Text:=unit3.frm[i]
form3.Edit3.Text:=unit3.frm[i]
form3.Edit4.Text:=unit3.frm[i]
case unit3.frm[i].IndexRadio of
1: form3.RadioButton1.Checked:=
2: form3.RadioButton2.Checked:=
3: form3.RadioButton3.Checked:=
else begin
form3.RadioButton1.Checked:=
form3.RadioButton2.Checked:=
form3.RadioButton3.Checked:=
end;
end;
form3.ComboBox1.Text:=unit3.
form3.ComboBox2.Text:=unit3.
form3.ComboBox3.Text:=unit3.
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(
begin
form2.ComboBox1.Enabled:=
form2.Button2.Enabled:=True;
form2.Button1.Enabled:=false;
form2.Button3.Enabled:=true;
form2.ComboBox1.Text:=
form2.Edit1.Text:=usetables[
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[
begin
s:=getforeignkey(usetables[i].
if s<>''
then
for k:= 1 to strtoint(usetables[0].name)do
if GetName(s,s1)=usetables[k].
begin
if usetables[i].psevdo<>''
then str:=str+'('+usetables[i].
if usetables[k].psevdo<>''
then str:=str+usetables[k].psevdo+
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[
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(
f:=false;
if (strtoint(usetables[0].name)=
for i:=1 to 20 do
begin
if check[i].Checked then select:=select + combo[i,0].Text+'.'+combo[i,1]
if (combo[i,2].Text<>'')and(
if combo[i,2].text='по возрастанию' then
orderby:=orderby+combo[i,0].
if (combo[i,0].text<>'')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+' '
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(
from:='from '+copy(from,1,length(from)-2)+
addforcom(where);
if where <>'' then
if f then where:='on '+copy(where,1,length(where)-
else where:='where '+copy(where,1,length(where)-
if orderby<>'' then orderby:='order by'+copy(orderby,1,length(
query:=select+from+where+
memo1.Clear;
memo1.Lines.Add(query);
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
memo1.Lines.Add(
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].
for i:= 1 to k do
combobox1.Items.Add(unit1.
end;
procedure TForm2.Button1Click(Sender: TObject);
var k,i,j:integer;
f:boolean;
begin
//Добавление в UseTAble
f:=true;
k:=strtoint(unit1.UseTables[0]
j:=form1.findTable_n(
for i:= 1 to strtoint(usetables[0].name)do
begin
if (usetables[i].name=combobox1.
if (usetables[i].psevdo=edit1.
if ((edit1.Text='')and(usetables[
begin
showmessage('псевдоним не уникален');
f:=false;
end;
end;
if f then //если добалвен уникальный псевдоним
begin
inc(k);
unit1.UseTables[k]:=unit1.
unit1.UseTables[k].psevdo:=
unit1.UseTables[0].name:=
form1.ListBox1.Items.Add(
for i:= 1 to 20 do
if edit1.Text='' then unit1.combo[i,0].items.add(
else unit1.combo[i,0].items.add(
form2.Visible:=false;
end;
end;
procedure TForm2.FormActivate(Sender: TObject);
begin
prev:=edit1.Text;