Реализация системного каталога. Основные хранимые характеристики: отношения, атрибуты с типами связи, индексы

Создание программы средствами языка Delphi, реализующей системный каталог информации базы данных, его характеристики: отношения, атрибуты с типами, связи, индексы. Разработка подпрограмм для ввода таблиц, полей и ключей и приложения для вывода данных.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 12.08.2011
Размер файла 196,1 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Курсовая работа

по дисциплине

Базы данных

тема:

Реализация системного каталога. Основные хранимые характеристики: отношения, атрибуты с типами, связи, индексы

Содержание

  • Введение
  • 1. Постановка задачи
  • 2. Описание решения
  • 3. Описание интерфейса приложения
  • Заключение
  • Список использованной литературы
  • Приложение А (обязательное)- Листинг программы
  • Введение

Одной из функций СУБД является обеспечение функции системного каталога или словаря данных. Системный каталог -- это набор таблиц и представлений, содержащих важную информацию о базе данных. Системный каталог имеется в любой базе данных. Информация в системном каталоге определяет структуру всей базы данных. Системный каталог фактически является частью базы данных. Системный каталог “содержит данные о данных” - метаданные, т.е. определения других объектов системы. Системный каталог может быть интегрирован в определяемую им базу данных, а значит, должен содержать описание самого себя.

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

Каталог состоит из таблиц. Их называют системными таблицами для отличия от обычных пользовательских. В результате пользователь может обращаться к каталогу так же, как к своим данным. Например, в каталоге обычно содержатся системные таблицы TABLES и COLUMNS, назначение которых - описание известных системе таблиц и столбцов этих таблиц.

Содержимое системного каталога может включать информацию по следующим разделам:

· учетные записи пользователей и установки по умолчанию;

· привилегии и другая связанная с безопасностью информация;

· статистика, характеризующая производительность системы;

· размеры объектов;

· динамика роста объектов;

· структура таблиц и параметры их хранения;

· структура индексов и параметры их хранения;

· информация о других объектах базы данных, в частности, представлениях, синонимах, триггерах, сохраненных процедурах;

· ограничения для таблиц и информация о ссылочной целостности данных;

· пользовательские сеансы доступа;

· информация об аудитах;

· внутренние параметры базы данных;

· размещение файлов базы данных;

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

Таким образом, системный каталог является главным источником информации о структуре и природе базы данных. Он помогает содержать базу данных в порядке не только администратору базы данных и ее пользователям, но и серверу базы данных.

Целью данной работы является создание программы, реализующей системный каталог. Для достижения этой цели были поставлены следующие задачи:

· написание подпрограмм, реализующих ввод таблиц, полей и ключей;

· написание подпрограмм, создающих системный каталог;

· создание приложения, позволяющего добавлять таблицы, поля и ключи, а также выводить данные из системного каталога;

1. Постановка задачи

Задача данной курсовой работы заключается в реализации системного каталога, основными хранимыми характеристиками которого являются отношения, атрибуты с типами, связи, индексы. Кроме того необходимо реализовать интерфейс для других работ, а именно для введения таблиц (отношений), полей таблиц, ключей (первичный и внешние).

Программа должна быть реализована средствами языка Delphi.

2. Описание решения

Содержимое каталога состоит из следующих файлов: файл таблиц, файл полей, файл ключей, файл индексов.

Файл таблиц - tables.txt, состоит из строк, в каждой из которых находится имя таблицы.

Файл полей - field.txt, состоит из строк, каждая из которых имеет следующий формат:

<Имя таблицы>|<Имя поля>|<Тип данных>|<Длина типа данных>

Файл ключей - keys.txt, состоит из строк, каждая из которых имеет структуру следующего вида:

<Имя таблицы>|<Первичный ключ>|<Внешний ключ 1>|

При этом Внешний ключ состоит из пар вида:

<Foreign>|<References>

Файл индексов - index.txt, состоит из строк следующего вида:

<Имя индекса>|<Имя таблицы>|<Имя поля>|

Модуль MyFunction содержит процедуры и функции необходимые для работы с системным каталогом. Процедуры AddTable, AddField, AddKey, AddIndex осуществляют запись таблиц, полей, ключей и индексов в соответствующие файлы, на основании введенных пользователем данных. Процедура AddTable реализована следующим образом.

procedure AddTable(NameTable: string);

begin

AssignFile(Tables,PathToTables);

append(Tables);

WriteLn(Tables,NameTable);

CloseFile(Tables);

end;

В качестве входного параметра выступает имя таблицы. Далее следует обращение к стандартным процедурам AssignFile и Append. AssignFile связывает файловую переменную с именем файла, Append - инициирует запись в существующий файл. Процедуры AddField, AddIndex реализованы анадогично.

Процедура AddKey позволяет вводить первичные ключи и внешние ключи, в зависимости от выбора режима пользователем. Переменная Logic типа boolean показывает, осуществлялись ли ранее записи в файл. Алгоритм этой процедуры представлен на рисунке 1.

Функции InTable, InField, InKey имеют выходное значение типа boolean. Они проверяют наличие соответствующего элемента во введенных данных.

Функции InTable в качестве параметра получает имя таблицы, наличие которой в файле Tables необходимо проверить. Далее выполняются процедуры открытия файла, считывается строка из файла и проверяется ее совпадение с входным параметром. В случае совпадения их значений функция принимает значение True, иначе - False.

Функция InField имеет два параметра: имя таблицы NameTable и имя поля NameField. Данная функция работает следующим образом. Получаем стоку из файла Field. Вид этой строки таков, что сначала записано имя таблицы, а затем принадлежащее ей поле с указанием типа и его размера. Проверяем равенство входного параметра NameTable и первых символов строки, содержащих имя поля, в случае равенства проверяем также соответствие параметра NameField имени поля в данной строке файла. Таким образом просматриваем все строки файла. Функция принимает значение True в том случае если оба параметра совпали с информацией в строке файла.

Функция InKey проверяет существования ключа у таблицы. Имеет 2 входных параметра: NameTable и Why. Результат функции формируется следующим образом. В случае обнаружения в файле Keys записи соответствующей паре значений NameTable и Why функция возвращает значение True, которое свидетельствует о наличии первичного либо внешнего ключа у таблицы. В противном случае возвращается значение False, что говорит об отсутствии ключа с данным именем у таблицы.

Эти функции используются для проверки корректности ввода данных пользователем.

Значения функций FSpisokTables, FSpisokField, FSpisokKeys типа string содержат строку с содержимым соответствующего файла. Формат возвращаемого результата этих функций следующий: каждая строка файла отделена от последующей знаком &. Все эти функции реализованы аналогичным образом. Схема функций представлена на рисунке 2.

Функция FPrintStr возвращает содержимое каталога строкой. В этой строке последовательно представлена информация каталога по каждой таблице, разделенная знаком &. Алгоритм это функции представлен на рисунке 3.

Процедура PrintData использует функцию FPrintStr и на основе ее результата выводит все поля заданной пользователем таблицы в текстовую таблицу StringGrid. Алгоритм работы этой процедуры можно записать следующим образом:

1. SpisokPrint:= FPrintStr;

2. Находим информацию в строке SpisokPrint о требуемой таблице;

3. Заносим имя требуемой таблицы в StringGrid;

Рисунок 1 - Алгоритм процедуры AddKey

Размещено на http://www.allbest.ru/

Рисунок 2 - Схема функций FSpisokTables, FSpisokField, FSpisokKeys

4. Находим информацию о ключах таблицы и заносим в StringGrid;

5. В переменную Column заносим имена всех полей и записываем в таблицу StringGrid;

6. В переменную ColumnType заносим типы полей и записываем в таблицу StringGrid;

Процедура PrintTables выводит имена всех содержащихся в файле Tables.txt отношений и количество полей в каждом из них. Для реализации этой процедуры просматриваем строки файла Tables и выводим из в текстовую таблицу StringGrid.

Рисунок 3 - Алгоритм функции FPrintStr

Далее, просматривая строки файла Field считаем количество полей для каждой таблицы и эти значения также выводим в текстовую таблицу. PrintRelations - процедура, осуществляющая вывод в многострочное текстовое поле Memo информацию о связях между отношениями на основе содержимого файла Keys. Результат выполнения процедуры PrintIndex - вывод в StringGrid имени индекса и его принадлежность к полю и таблице. Работа данной процедуры основывается на просмотре информации файла Index.

3. Описание интерфейса приложения

Разработанное приложение имеет удобный интерфейс. На форме имеется меню, которое позволяет выбрать некоторое действие или выйти из программы. Пользователь может осуществлять следующие действия:

· добавить таблицу

· добавить поле

· добавить ключ

· просмотреть каталог

В случае выбора пункта меню Добавить -> Таблицу на форме появляются однострочное текстовое поле для ввода имени таблицы и кнопка Добавить. При нажатии на нее информация о новой таблице будет занесена в файл.

При выборе пункта меню Добавить -> Поле пользователю, с помощью раскрывающегося списка, предлагается выбрать таблицу, в которое будет добавляться поле, ввести имя поля, выбрать его тип и длину типа. Состояние флага Индекс говорит о наличии или отсутствии индекса для данного поля таблицы. Пример работы приложения в таком состоянии представлена на рисунке 4.

Рисунок 4 - Пример работы приложения

Выбор пункта меню Добавить -> Ключ позволяет выбирать пользователю таблицу, куда требуется добавить ключ и его тип. В случае добавления первичного ключа, требуется ввести имя поля, которое будет однозначно идентифицировать запись таблицы. В случае выбора внешнего ключа пользователь заполняет два поля Foreign(туда записывается имя поля - внешний ключ) и References (содержит имя таблицы).

Пункт меню Просмотр каталога предоставляет пользователю выбор вида выводимой информации. С помощью переключателей можно выбрать режим вывода информации из системного каталога. Пример просмотра каталога представлены на рисунках 5, 6.

Рисунок 5 - Просмотр системного каталога

Рисунок 6 - Просмотр полей системного каталога

Заключение

В данной курсовой работе стояла цель реализовать системный каталог со следующими основными хранимыми характеристиками: отношения, атрибуты с типами, связи, индексы, а также реализовать интерфейс для выполнения других работ. В соответствии с поставленными задачами получены следующие результаты:

· написаны подпрограммы, реализующие ввод таблиц, полей и ключей;

· написаны подпрограммы, создающие системный каталог;

· создано приложение, позволяющее добавлять таблицы, поля и ключи, а также выводить данные из системного каталога;

Поставленная в работе цель достигнута, все задачи выполнены полностью.

Список литературы

1. Швецов, В.И., Визгунов, А.Н., Мееров, И.Б. Базы данных [Текст]. - Учебное пособие. - Нижний Новгород: Издательство ННГУ, 2004.- 217 с.

2. Рыженков, Д.В. Курс лекций по дисциплине «Базы данных», 2009 г.

3. Дейт, К.Дж. Введение в системы баз данных, 6-е издание [Текст]: [пер. С англ.] /К.ДЖ. ДеЙт. - М. [и др.]: Вильямс, 2000. - 848 с.; 24 см. 4000 экз. - ISBN: 5-8459-0019-0.

системный каталог ввод атрибут

Приложение А (обязательное)

Листинг программы

unit Unit1;

interface

uses

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

Dialogs, StdCtrls, Grids, Menus, MyFunction;

type

TForm1 = class(TForm)

MainMenu1: TMainMenu;

N1: TMenuItem; //действие

N2: TMenuItem; //добавить

N3: TMenuItem; //таблицу

N4: TMenuItem; //поле

N5: TMenuItem; //ключ

N6: TMenuItem; //просмотр

N7: TMenuItem; //exit

StringGrid1: TStringGrid;

Button1: TButton;

Edit1: TEdit;

Label1: TLabel;

ComboBox1: TComboBox;

Label2: TLabel;

Edit2: TEdit;

Label3: TLabel;

ComboBox2: TComboBox;

Label4: TLabel;

Edit3: TEdit;

Label5: TLabel;

Edit4: TEdit;

Label6: TLabel;

RadioButton1: TRadioButton;

RadioButton2: TRadioButton;

RadioButton3: TRadioButton;

Memo1: TMemo;

RadioButton4: TRadioButton;

CheckBox1: TCheckBox;

Edit5: TEdit;

procedure N3Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure N4Click(Sender: TObject);

procedure ComboBox1DropDown(Sender: TObject);

procedure ComboBox1Change(Sender: TObject);

procedure ComboBox2Change(Sender: TObject);

procedure ComboBox1Select(Sender: TObject);

procedure N5Click(Sender: TObject);

procedure ComboBox2Select(Sender: TObject);

procedure N6Click(Sender: TObject);

procedure RadioButton1Click(Sender: TObject);

procedure RadioButton2Click(Sender: TObject);

procedure RadioButton3Click(Sender: TObject);

procedure CheckBox1Click(Sender: TObject);

procedure RadioButton4Click(Sender: TObject);

procedure N7Click(Sender: TObject);

procedure N9Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

MyAction: integer;

Tables: TextFile; //Файл таблиц

Field: TextFile; //Файл полей

Keys: TextFile; //Файл ключей

Index:TextFile;

SpisokTables,SpisokField,SpisokKeys,Content,Temp,Temp1,Temp2, Temp3, Temp4:string;

NameTable, Primary, Foreign, Column, ColumnType,SpisokPrint: string;

Logic:boolean;

row: integer;

implementation

{$R *.dfm}

procedure ClearAll;

var i,j:integer;

begin

Form1.Label1.Visible:=false;

Form1.Label2.Visible:=false;

Form1.Label3.Visible:=false;

Form1.Label4.Visible:=false;

Form1.Label5.Visible:=false;

Form1.Label6.Visible:=false;

form1.Button1.Visible:=false;

form1.Edit1.Visible:=false;

form1.Edit2.Visible:=false;

form1.Edit3.Visible:=false;

form1.Edit4.Visible:=false;

form1.Edit5.Visible:=false;

Form1.Stringgrid1.Visible:=false;

form1.ComboBox1.Visible:=false;

form1.ComboBox2.Visible:=false;

form1.RadioButton1.Visible:=false;

form1.RadioButton2.Visible:=false;

form1.RadioButton3.Visible:=false;

form1.RadioButton4.Visible:=false;

form1.Memo1.Visible:=false;

form1.CheckBox1.Visible:=false;

end;

procedure TForm1.N3Click(Sender: TObject);

begin

ClearAll;

MyAction:=1;

Form1.Label1.Caption:='название таблицы';

Form1.Label1.Visible:=true;

form1.Edit1.Text:='';

form1.Edit1.Visible:=true;

form1.Button1.Visible:=true;

form1.Button1.Caption:='Добавить'

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

ClearAll;

end;

procedure TForm1.Button1Click(Sender: TObject);

var i:integer;

ind:boolean;

Str,Temp1,Temp2:string;

begin

if (MyAction=1) then

begin

//Добавляем таблицу

if form1.Edit1.Text<>'' then

begin

AddTable(Form1.Edit1.Text);

ShowMessage('Таблица добавлена');

end

end

else

if (MyAction=2) then

//Добавляем поле

begin

if (ComboBox1.Text<>'Выбрать') and (Trim(Edit2.Text)<>'') and (ComboBox2.Text<>'Выбрать') then

begin

AddField(ComboBox1.Text, Edit2.Text, ComboBox2.Text, Edit3.Text);

ShowMessage('Поле добавлено');

end

else

MessageDlg('Не все поля заполнены', mtError, [mbOk], 0);

if CheckBox1.Checked=true and (edit5.Text<>'')then

begin

AddIndex(edit5.Text,ComboBox1.Text, Edit2.Text);

ShowMessage('Индекс добавлен');

end;

ClearAll;

end

else if (MyAction=3) then

begin

//Добавляем ключ

if (Trim(ComboBox1.Text)<>'Выбрать') and (Trim(ComboBox2.Text)='Primary') then

begin

if (Trim(ComboBox1.Text)<>'Выбрать') and (Trim(Edit3.Text)<>'') then

if not InKey(Trim(ComboBox1.Text), 'Primary') then

if InField(Trim(ComboBox1.Text), Trim(Edit3.Text)) then

begin

AddKey(Trim(ComboBox1.Text), Trim(Edit3.Text), '', '', 'Primary');

ShowMessage('Ключ добавлен');

end

else

MessageDlg('Указанного поля не найдено в таблице '+Trim(ComboBox1.Text), mtError, [mbOk], 0)

else

MessageDlg('Такой первичный ключ уже есть в таблице '+Trim(ComboBox1.Text), mtError, [mbOk], 0)

else

MessageDlg('Не все поля заполнены', mtError, [mbOk], 0);

end

else if (Trim(ComboBox2.Text)='Foreign') then

begin

if (Trim(ComboBox1.Text)<>'Выбрать') and (Trim(Edit3.Text)<>'') and (Trim(Edit4.Text)<>'') then

begin

if InField(Trim(ComboBox1.Text), Trim(Edit3.Text)) then

begin

i:=1;

Str:=Trim(Edit4.Text);

while i<=Length(Str) do if Str[i]<>'.' then inc(i) else break;

if i<Length(Str) then

begin

Temp1:=Copy(Str,1,i-1);

Temp2:=Copy(Str,i+1,Length(Str));

if InField(Temp1, Temp2) then

begin

AddKey(Trim(ComboBox1.Text), '', Trim(Edit3.Text), Trim(Edit4.Text), 'Foreign');

ShowMessage('Ключ добавлен');

end

else

MessageDlg('Указанного поля в References '+Temp2+' не найдено в таблице '+Temp1, mtError, [mbOk], 0)

end

else

MessageDlg('Неправльный формат поля References', mtError, [mbOk], 0)

end

else

MessageDlg('Указанного поля в Foreign не найдено в таблице '+Trim(ComboBox1.Text), mtError, [mbOk], 0)

end

else

MessageDlg('Не все поля заполнены', mtError, [mbOk], 0);

end;

ClearAll;

end

else if (MyAction=5) then

//изменяем имя таблицы

begin

AlterTable(Trim(ComboBox1.Text),edit2.Text) ;

end;

if radiobutton2.Checked=true then

begin

Content:=FPrintStr();

PrintData(Content,combobox1.Text, StringGrid1);

end;

end;

//добавляем поле

procedure TForm1.N4Click(Sender: TObject);

begin

ClearAll;

MyAction:=2;

form1.ComboBox1.Visible:=true;

Form1.Label1.Visible:=true;

Form1.Label1.Caption:='Таблица';

Form1.Label2.Visible:=true;

Form1.Label2.Caption:='Имя поля';

Form1.Label3.Visible:=true;

Form1.Label3.Caption:='Тип';

Form1.Label4.Visible:=true;

Form1.Label4.Caption:='Длина';

form1.Edit2.Visible:=true;

form1.Edit3.Visible:=true;

form1.Button1.Visible:=true;

form1.Button1.Caption:='Добавить';

form1.ComboBox2.Visible:=true;

form1.CheckBox1.Visible:=true;

ComboBox2.Items.Clear;

ComboBox2.Items.Add('int');

ComboBox2.Items.Add('char');

ComboBox2.Items.Add('varchar');

ComboBox2.Items.Add('double');

ComboBox2.Text:='Выбрать';

end;

procedure TForm1.CheckBox1Click(Sender: TObject);

begin

form1.Edit5.Visible:=true;

end;

procedure TForm1.ComboBox1Change(Sender: TObject);

begin

ComboBox1.Text:='Выбрать';

end;

procedure TForm1.ComboBox2Change(Sender: TObject);

begin

ComboBox2.Text:='Выбрать';

end;

procedure TForm1.ComboBox1Select(Sender: TObject);

var

i, j, k, n, m: integer;

begin

if (MyAction=2) then

begin

//Читаем список полей

SpisokField:=FSpisokField;

// ComboBox2.Items.Clear;

i:=1;

j:=0;

Temp:='';

Content:='';

while i<=Length(SpisokField) do

begin

if (SpisokField[i]<>'&') then Content:=Content+SpisokField[i]

else

begin

k:=0;

while k<=Length(Content) do

begin

if Content[k]='|' then inc(j);

if (Content[k]='|') and (j=2) then

begin

Temp:=Copy(Content,1,k);

j:=1;

Temp1:='';

while j<=Length(Temp) do

begin

if Temp[j]<>'|' then Temp1:=Temp1+Temp[j]

else if Temp1=ComboBox1.Text then

begin

Temp1:=Temp1+'|';

Temp:=Copy(Temp,j+1,Length(Temp)-j-1);

ComboBox2.Items.Add(Temp);

Temp:='';

Temp1:='';

j:=Length(Temp);

end;

inc(j);

end;

Temp:='';

Temp1:='';

j:=0;

k:=Length(Content);

end;

inc(k);

end;

Content:='';

end;

inc(i);

end;

end;

end;

procedure TForm1.N6Click(Sender: TObject);

begin

ClearAll;

MyAction:=4;

Label5.Caption:='Просмотр данных';

Label5.Visible:=true;

form1.RadioButton1.Visible:=true;

form1.RadioButton2.Visible:=true;

form1.RadioButton3.Visible:=true;

form1.RadioButton4.Visible:=true;

end;

procedure TForm1.N7Click(Sender: TObject);

begin

form1.Close;

end;

procedure TForm1.N9Click(Sender: TObject);

begin

ClearAll;

MyAction:=5;

form1.ComboBox1.Visible:=true;

Form1.Label1.Visible:=true;

Form1.Label1.Caption:='Таблица';

Form1.Label2.Visible:=true;

Form1.Label2.Caption:='Новое Имя';

form1.Edit2.Visible:=true;

form1.Button1.Visible:=true;

end;

procedure TForm1.RadioButton1Click(Sender: TObject);

var i,j:integer;

begin

form1.Memo1.Visible:=false;

for i:=0 to Form1.StringGrid1.RowCount do

for j:=0 to Form1.StringGrid1.ColCount do

Form1.StringGrid1.Cells[i,j]:='';

StringGrid1.Visible:=true;

form1.StringGrid1.ColCount:=2;

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

Form1.StringGrid1.Cells[1,0]:='Кол-во полей';

printTables(stringGrid1);

end;

procedure TForm1.RadioButton2Click(Sender: TObject);

var i,j:integer;

begin

form1.Memo1.Visible:=false;

combobox1.Visible:=true;

label1.Visible:=true;

form1.Button1.Visible:=true;

form1.Button1.Caption:='Показать';

for i:=0 to Form1.StringGrid1.RowCount do

for j:=0 to Form1.StringGrid1.ColCount do

Form1.StringGrid1.Cells[i,j]:='';

StringGrid1.Visible:=true;

form1.StringGrid1.ColCount:=5;

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

Form1.StringGrid1.Cells[1,0]:='Поле';

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

Form1.StringGrid1.Cells[3,0]:='Primary';

Form1.StringGrid1.Cells[4,0]:='Foreign';

end;

procedure TForm1.RadioButton3Click(Sender: TObject);

begin

form1.Memo1.Visible:=true;

PrintRelations(Memo1);

end;

procedure TForm1.RadioButton4Click(Sender: TObject);

var i,j:integer;

begin

form1.Memo1.Visible:=false;

StringGrid1.Visible:=true;

form1.StringGrid1.ColCount:=3;

for i:=0 to Form1.StringGrid1.RowCount do

for j:=0 to Form1.StringGrid1.ColCount do

Form1.StringGrid1.Cells[i,j]:='';

Form1.StringGrid1.Cells[0,0]:='Индекс';

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

Form1.StringGrid1.Cells[2,0]:='Поле';

printIndex(StringGrid1);

end;

procedure TForm1.N5Click(Sender: TObject);

begin

ClearAll;

MyAction:=3;

form1.ComboBox1.Visible:=true;

Form1.Label1.Visible:=true;

Form1.Label1.Caption:='Таблица';

Form1.Label3.Visible:=true;

Form1.Label3.Caption:='Тип';

form1.Button1.Visible:=true;

form1.Button1.Caption:='Добавить';

form1.ComboBox2.Visible:=true;

ComboBox2.Items.Clear;

ComboBox2.Items.Add('Foreign');

ComboBox2.Items.Add('Primary');

ComboBox2.Text:='Выбрать';

end;

//выбираем имя таблицы для заполнения поля

procedure TForm1.ComboBox1DropDown(Sender: TObject);

var

i, j, k, n, m: integer;

begin

if (MyAction=2)or (MyAction=3) or (MyAction=4) then

begin

SpisokTables:=FSpisokTables;

ComboBox1.Items.Clear;

i:=1;

Temp:='';

while i<=Length(SpisokTables) do

begin

if SpisokTables[i]<>'&' then Temp:=Temp+SpisokTables[i]

else

begin

ComboBox1.Items.Add(Temp);

Temp:='';

end;{else}

inc(i);

end; {while}

end; {if}

end; {pocedure}

procedure TForm1.ComboBox2Select(Sender: TObject);

begin

if (MyAction=3) then

begin

if (ComboBox2.Text='Primary') then

begin

label4.Visible:=true;

label4.Caption:='Primary';

edit3.Visible:=true;

label6.Visible:=false;

edit4.Visible:=false;

end {if}

else if (ComboBox2.Text='Foreign')

then

begin

label4.Visible:=true;

label4.Caption:='Foreign';

edit3.Visible:=true;

label6.Visible:=true;

label6.Caption:='References';

// label4.Caption:='Foreign';

edit4.Visible:=true;

end;{then}

end;{if}

end;

end.

unit MyFunction;

interface

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

Dialogs, StdCtrls, Grids;

procedure AddTable(NameTable: string);

procedure AddField(NameTable: string; NameField: string; NameType: string; LengthType: string);

procedure AddKey(NameTable: string; Primary: string; Foreign: string; References: string; Why: string);

procedure AddIndex(NameInd,NameTable,NameField:string);

function InTable(NameTable: string):boolean;

function InField(NameTable: string; NameField: string):boolean;

function InKey(NameTable: string; Why: string):boolean;

function FPrintStr():string;

procedure PrintData(PrintStr,name:string; StringGrid1:TStringGrid);

procedure printTables(StringGrid1:TStringGrid);

procedure PrintRelations(Memo1:Tmemo);

procedure PrintIndex(StringGrid1:TStringGrid);

function FSpisokTables:string;

function FSpisokField:string;

function FSpisokKeys:string;

function AlterTable(OldName: string; NewName: string):boolean;

const

PathToTables: string='syscatalog\tables.txt';

PathToField: string='syscatalog\field.txt';

PathToKeys: string='syscatalog\keys.txt';

PathToInd: string='syscatalog\index.txt';

var

Tables: TextFile; //Файл таблиц

Field: TextFile; //Файл полей

Keys: TextFile; //Файл ключей

Index:TextFile;

SpisokTables,SpisokField,SpisokKeys,Content,Temp,Temp1,Temp2, Temp3, Temp4:string;

NameTable, Primary, Foreign, Column, ColumnType,SpisokPrint: string;

Logic:boolean;

row: integer;

implementation

procedure AddTable(NameTable: string);

begin

AssignFile(Tables,PathToTables);

append(Tables);

WriteLn(Tables,NameTable);

CloseFile(Tables);

end;

procedure AddField(NameTable: string; NameField: string; NameType: string; LengthType: string);

begin

AssignFile(field, PathToField);

append(field);

Temp:=Trim(NameTable)+'|'+Trim(NameField)+'|'+Trim(NameType)

+'|'+Trim(LengthType);

WriteLn(field, Temp);

CloseFile(field);

end;

procedure AddKey(NameTable: string; Primary: string; Foreign: string; References: string; Why: string);

var

i: integer;

begin

Logic:=false;

AssignFile(Keys, PathToKeys);

append(Keys);

SpisokKeys:='';

while not eof(Keys) do

begin

ReadLn(Keys, Content);

i:=1;

Temp:='';

while i<=Length(Content) do

begin

if (Content[i]<>'|') then Temp:=Temp+Content[i];

if (Content[i]='|') then

begin

if NameTable<>Temp then SpisokKeys:=SpisokKeys+Content+'&'

else if (Why='Primary') and (NameTable=Temp) then begin SpisokKeys:=SpisokKeys+NameTable+'|'+Primary+'|'+Copy(Content,i+1,Length(Content)-i)+'&'; Logic:=true; end

else if (Why='Foreign') and (NameTable=Temp) then begin SpisokKeys:=SpisokKeys+Content+'|'+Foreign+'|'+References+'&'; Logic:=true; end;

Temp:='';

i:=Length(Content);

end;

inc(i);

end;

end;

if not Logic then

begin

if Why='Primary' then

SpisokKeys:=SpisokKeys+NameTable+'|'+Primary+'&'

else if Why='Foreign' then

SpisokKeys:=SpisokKeys+NameTable+'|'+Foreign+'|'+References+'&';

end;

Rewrite(Keys);

i:=1;

Temp:='';

while i<=Length(SpisokKeys) do

begin

if SpisokKeys[i]<>'&' then Temp:=Temp+SpisokKeys[i]

else

begin

WriteLn(Keys, Temp);

Temp:='';

end;

inc(i);

end;

CloseFile(Keys);

end;

procedure AddIndex(NameInd,NameTable,NameField:string);

begin

Temp:='';

AssignFile(Index, PathToInd);

append(index);

Temp:=NameInd+'|'+NameTable+'|'+NameField ;

WriteLn(Index, Temp);

CloseFile(Index);

end;

//Существование таблицы

function InTable(NameTable: string):boolean;

begin

Logic:=false;

AssignFile(Tables, PathToTables);

Reset(Tables);

Content:='';

while not eof(Tables) do

begin

ReadLn(Tables, Temp);

if (NameTable=Temp) then Logic:=true

end;

CloseFile(Tables);

InTable:=Logic;

end;

//Существование поля в таблице

function InField(NameTable: string; NameField: string):boolean;

var

i, j, k, n, m: integer;

begin

AssignFile(Field, PathToField);

k:=0;

m:=0;

n:=1;

Temp:='';

while n<=Length(NameField) do

begin

if NameField[n]<>',' then Temp:=Temp+NameField[n];

if (NameField[n]=',') or (n=Length(NameField)) then

begin

inc(m);

Temp:=NameTable+'|'+Trim(Temp);

Reset(Field);

while not eof(Field) do

begin

ReadLn(Field, Content);

i:=1;

j:=0;

Temp1:='';

while i<=Length(Content) do

begin

if (Content[i]<>'|') and (j<>2) then Temp1:=Temp1+Content[i]

else if Content[i]='|' then begin Temp1:=Temp1+Content[i]; inc(j); end;

if (Content[i]='|') and (j=2) then

begin

if Temp1[Length(Temp1)]='|' then Temp1:=Copy(Temp1,1,Length(Temp1)-

1);

if Temp=Temp1 then inc(k);

Temp1:='';

i:=Length(Content);

end;

inc(i);

end;

end;

Temp:='';

CloseFile(Field);

end;

inc(n);

end;

if m=k then Logic:=true

else Logic:=false;

InField:=Logic;

end;

//Существование ключа в таблице

function InKey(NameTable: string; Why: string):boolean;

var

i, j, n:integer;

begin

Logic:=false;

AssignFile(Keys, PathToKeys);

reset(Keys);

SpisokKeys:='';

while (not eof(Keys)) and (not Logic) do

begin

ReadLn(Keys, Content);

i:=1;

j:=0;

Temp:='';

while i<=Length(Content) do

begin

if Content[i]<>'|' then Temp:=Temp+Content[i]

else if Content[i]='|' then

begin

if (Temp=NameTable) and (not Logic) then Logic:=true;

if Logic then inc(j);

end;

inc(i);

end;

end;

if (Logic) then

begin

if Why='Primary' then

begin

n:=j mod 2;

if n=1 then Logic:=true

else Logic:=false;

end

else if Why='Foreign' then

begin

if j>1 then Logic:=true

else Logic:=false;

end

end;

CloseFile(Keys);

InKey:=Logic;

end;

//Список таблиц

function FSpisokTables:string;

begin

AssignFile(Tables, PathToTables);

Reset(Tables);

SpisokTables:='';

while not eof(Tables) do

begin

ReadLn(Tables, Temp);

SpisokTables:=SpisokTables+Temp+'&';

end;

CloseFile(Tables);

FSpisokTables:=SpisokTables;

end;

//Список полей

function FSpisokField:string;

begin

AssignFile(Field, PathToField);

reset(Field);

SpisokField:='';

while not eof(Field) do

begin

ReadLn(Field, Temp);

SpisokField:=SpisokField+Temp+'&';

end;

CloseFile(Field);

FSpisokField:=SpisokField;

end;

//Список ключей

function FSpisokKeys:string;

begin

AssignFile(Keys, PathToKeys);

Reset(Keys);

SpisokKeys:='';

while not eof(Keys) do

begin

ReadLn(Keys, Temp);

SpisokKeys:=SpisokKeys+Temp+'&';

end;

CloseFile(Keys);

FSpisokKeys:=SpisokKeys;

end;

function FPrintStr():string;

var

i, j, k:integer;

begin

SpisokTables:=FSpisokTables;

i:=1;

Content:='';

SpisokPrint:='';

while i<=Length(SpisokTables) do

begin

if SpisokTables[i]<>'&' then Content:=Content+SpisokTables[i]

else

begin

SpisokPrint:=SpisokPrint+Content;

Logic:=false;

SpisokKeys:=FSpisokKeys;

j:=1;

Temp:='';

while j<=Length(SpisokKeys) do

begin

if (SpisokKeys[j]<>'&') then Temp:=Temp+SpisokKeys[j]

else

begin

k:=0;

while k<=Length(Temp) do

begin

if Temp[k]='|' then

begin

if Content=Copy(Temp,1,k-1) then

begin

Logic:=true;

SpisokPrint:=SpisokPrint+'|'+Copy(Temp,k+1,Length(Temp)-k)+'|'

end;

k:=Length(Temp);

end;

inc(k);

end;

Temp:='';

end;

inc(j);

end;

if not Logic then

SpisokPrint:=SpisokPrint+'|||';

SpisokPrint:=SpisokPrint+'$';

Logic:=false;

SpisokField:=FSpisokField;

j:=1;

Temp:='';

while j<=Length(SpisokField) do

begin

if (SpisokField[j]<>'&') then Temp:=Temp+SpisokField[j]

else

begin

k:=0;

while k<=Length(Temp) do

begin

if Temp[k]='|' then

begin

if Content=Copy(Temp,1,k-1) then

begin

Logic:=true;

SpisokPrint:=SpisokPrint+Copy(Temp,k+1,Length(Temp)-k)+'|$';

end;

k:=Length(Temp);

end;

inc(k);

end;

Temp:='';

end;

inc(j);

end;

if not Logic then

SpisokPrint:=SpisokPrint+'|||';

SpisokPrint:=SpisokPrint+'&';

Content:='';

end;

inc(i);

end;

FPrintStr:=SpisokPrint;

end;

//Выводим данные каталога в StringGrid

procedure PrintData(PrintStr,name:string; StringGrid1:TStringGrid);

var

i, j, k, n:integer;

begin

//Смотрим

row:=1;

SpisokPrint:=PrintStr;

i:=1;

Content:='';

while i<=Length(SpisokPrint) do

begin

if SpisokPrint[i]<>'&' then Content:=Content+SpisokPrint[i]

else

begin

NameTable:='';

Primary:='';

Foreign:='';

j:=1;

while j<=Length(Content) do if Content[j]<>'$' then inc(j) else break;

Temp3:=Copy(Content,1,j-1);

Temp4:=Copy(Content,j+1,Length(Content));

j:=1;

while j<=Length(Temp3) do if Temp3[j]<>'|' then inc(j) else break;

NameTable:=Copy(Temp3,1,j-1);

if NameTable=Name then

begin

Temp3:=Copy(Temp3,j+1,Length(Temp3));

if InKey(Trim(NameTable), 'Primary') then

begin

j:=1;

while j<=Length(Temp3) do if Temp3[j]<>'|' then inc(j) else break;

Primary:='primary key ('+Copy(Temp3,1,j-1)+')';

Temp3:=Copy(Temp3,j+1,Length(Temp3));

end;

j:=0;

k:=1;

Temp1:='';

Temp2:='';

while (k<=Length(Temp3)) do

begin

if (Temp3[k]<>'|') and (j mod 2 = 0) then Temp1:=Temp1+Temp3[k];

if (Temp3[k]<>'|') and (j mod 2 <> 0) then Temp2:=Temp2+Temp3[k];

if (Temp3[k]='|') or (k=Length(Temp3)) then begin Logic:=true; inc(j); end;

if (Logic) and (j mod 2 = 0) then

begin

if (Temp1<>'') and (Temp2<>'') then

Foreign:=Foreign+'foreign key ('+Temp1+') references '+Temp2+' ';

Logic:=false;

end;

if (Temp3[k]='|') and (j mod 2 = 0) then begin Temp1:=''; Temp2:=''; end;

inc(k);

end;

Content:=Temp4;

StringGrid1.Cells[0,row]:=NameTable;

StringGrid1.Cells[3,row]:=Primary;

StringGrid1.Cells[4,row]:=Foreign;

StringGrid1.RowCount:=row+1;

//Собираем поля

Logic:=false;

Temp:='';

n:=1;

while n<=Length(Content) do

begin

if Content[n]<>'$' then Temp:=Temp+Content[n]

else

begin

Logic:=true;

j:=0;

k:=1;

Column:='';

ColumnType:='';

while k<=Length(Temp) do

begin

if Temp[k]='|' then

begin

inc(j);

if j=1 then Column:=Copy(Temp,1,k-1);

if (j=2) and (Copy(Temp,1,k-1)<>'') then ColumnType:=Copy(Temp,1,k-1);

if (j=3) and (Copy(Temp,1,k-1)<>'') then ColumnType:=ColumnType+' ('+Copy(Temp,1,k-1)+')';

Temp:=Copy(Temp,k+1,Length(Temp)-k);

k:=0;

end;

if j=3 then k:=Length(Temp);

inc(k);

end;

Temp:='';

StringGrid1.Cells[1,row]:=Column;

StringGrid1.Cells[2,row]:=ColumnType;

StringGrid1.RowCount:=row+1;

inc(row);

end;

inc(n);

end;

end;

if not Logic then inc(row);

Content:='';

end;

inc(i);

end;

end;

procedure printTables(StringGrid1:TStringGrid);

var i,j,n,count,rows:integer;

content:string;

begin

i:=1; j:=1; n:=1; count:=0; rows:=0;

SpisokTables:=FSpisokTables;

while i<=length(SpisokTables) do

begin

while SpisokTables[i]<>'&' do i:=i+1;

stringGrid1.Cells[0,j]:=copy(SpisokTables,n,i-n);

rows:=rows+1;

i:=i+1;

n:=i;

j:=j+1;

end;

j:=1;

i:=1;

for i:=1 to rows do

begin

AssignFile(Field, PathToField);

reset(Field);

while not eof (Field) do

begin

j:=1;

Readln(field,Content);

while (content[j]<>'|') and (i<=length(content)) do j:=j+1;

if StringGrid1.Cells[0,i]=copy(content,1,j-1) then

begin

count:=count+1;

end;

end;

stringGrid1.cells[1,i]:=inttostr(count);

count:=0;

CloseFile(Field);

end;

end;

procedure PrintRelations(Memo1:Tmemo);

var i,n:integer;

NameTable1,NameTable2,primary1,primary2,s:string;

f:boolean;

begin

AssignFile(Keys, PathToKeys);

reset(Keys);

while not eof (keys) do

begin

f:=false;

readln(keys,content);

for i:=1 to length(content) do

if content[i]='.' then f:=true;

if f=true then

begin

i:=1;n:=i;

NameTable1:=''; NameTable2:='';primary1:='';primary2:='';

foreign:='';

while (content[i]<>'|') and (i<=length(content)) do i:=i+1;

NameTable1:=copy(content,n,i-n);

i:=i+1; n:=i;

while (content[i]<>'|') and (i<=length(content)) do i:=i+1;

primary1:=copy(content,n,i-n);

i:=i+1; n:=i;

while (content[i]<>'|') and (i<=length(content)) do i:=i+1;

foreign:=copy(content,n,i-n);

i:=i+1; n:=i;

while (content[i]<>'.') and (i<=length(content)) do i:=i+1;

NameTable2:=copy(content,n,i-n);

i:=i+1; n:=i;

while i<=length(content) do i:=i+1;

primary2:=copy(content,n,i-n);

i:=i+1; n:=i;

s:='Таблица '+NameTable1+' ('+primary1+' - primary key'+')'

+' связана внешним ключом '+ foreign+ ' с таблицей '+NameTable2+' ('

+ primary2+' - primary key)';

memo1.Lines.Add(s);

memo1.Lines.Add('');

s:='';

end;

end;

closeFile(keys);

end;

procedure PrintIndex(StringGrid1:TStringGrid);

var i,n,rows:integer;

content:string;

begin

AssignFile(Index, PathToInd);

reset(Index);

rows:=1;

while not eof(index) do

begin

i:=1; n:=i;

readln(Index,Content);

while content[i]<>'|' do i:=i+1;

StringGrid1.Cells[0,rows]:= copy(content,n,i-n);

i:=i+1; n:=i;

while content[i]<>'|' do i:=i+1;

StringGrid1.Cells[1,rows]:= copy(content,n,i-n);

i:=i+1; n:=i;

while i<=length(content) do i:=i+1;

StringGrid1.Cells[2,rows]:= copy(content,n,i-n);

i:=i+1; n:=i;

rows:=rows+1;

end;

end;

//Изменение таблицы

function AlterTable(OldName: string; NewName: string):boolean;

var

i:integer;

begin

Logic:=false;

AssignFile(Tables, PathToTables);

Reset(Tables);

Content:='';

while not eof(Tables) do

begin

ReadLn(Tables, Temp);

if (OldName<>Temp) then Content:=Content+Temp+'|'

else begin Content:=Content+NewName+'|'; Logic:=true; end;

end;

CloseFile(Tables);

Rewrite(Tables);

i:=1;

Temp:='';

while i<=Length(Content) do

begin

if Content[i]<>'|' then Temp:=Temp+Content[i]

else

begin

WriteLn(Tables, Temp);

Temp:='';

end;

inc(i);

end;

CloseFile(Tables);

//Изменяем в списке полей

AssignFile(Field, PathToField);

Reset(Field);

SpisokField:='';

while not eof(Field) do

begin

ReadLn(Field, Content);

i:=1;

Temp:='';

while i<=Length(Content) do

begin

if Content[i]<>'|' then Temp:=Temp+Content[i]

else

begin

if OldName<>Temp then SpisokField:=SpisokField+Content+'&'

else SpisokField:=SpisokField+NewName+Copy(Content, i, Length(Content)-i+1)+'&';

Temp:='';

i:=Length(Content);

end;

inc(i);

end;

end;

CloseFile(Field);

Rewrite(Field);

i:=1;

Temp:='';

while i<=Length(SpisokField) do

begin

if SpisokField[i]<>'&' then Temp:=Temp+SpisokField[i]

else

begin

WriteLn(Field, Temp);

Temp:='';

end;

inc(i);

end;

CloseFile(Field);

//Изменяем в списке ключей

AssignFile(Keys, PathToKeys);

Reset(Keys);

SpisokKeys:='';

while not eof(Keys) do

begin

ReadLn(Keys, Content);

i:=1;

Temp:='';

while i<=Length(Content) do

begin

if Content[i]<>'|' then Temp:=Temp+Content[i]

else

begin

if OldName<>Temp then SpisokKeys:=SpisokKeys+Content+'&'

else SpisokKeys:=SpisokKeys+NewName+Copy(Content, i, Length(Content)-i+1)+'&';

Temp:='';

i:=Length(Content);

end;

inc(i);

end;

end;

CloseFile(Keys);

Rewrite(Keys);

i:=1;

Temp:='';

while i<=Length(SpisokKeys) do

begin

if SpisokKeys[i]<>'&' then Temp:=Temp+SpisokKeys[i]

else

begin

WriteLn(Keys, Temp);

Temp:='';

end;

inc(i);

end;

CloseFile(Keys);

AlterTable:=Logic;

end;

end.

Размещено на Allbest.ru


Подобные документы

  • Сущности и функциональные зависимости базы данных. Атрибуты и связи. Таблицы базы данных. Построение ER-диаграммы. Организация ввода и корректировки данных. Реляционная схема базы данных. Реализация запросов, получение отчетов. Защита базы данных.

    курсовая работа [2,4 M], добавлен 06.02.2016

  • Проектирование и создание информационной базы данных для управления предприятием "Завод металлоизделий". Данные для базы, предметная область, атрибуты объектов базы данных. Объектные отношения, их ключи, связи объектов и отношений базы данных предприятия.

    реферат [26,9 K], добавлен 04.12.2009

  • Особенности модификации таблиц базы данных средствами СУБД Access. Описание свойств полей, задания ограничений, масок ввода данных. Создание и модификации таблиц, установка их свойств. Схема связи таблиц. Представление результатов задания в виде таблицы.

    лабораторная работа [243,5 K], добавлен 13.06.2014

  • Теоретические основы разработки приложения для автоматизации данных по Олимпиаде. Основные свойства объектов, связей, их атрибуты. Создание отчета на примере "спортсмены занявшие места с 1 по 3". Структура запросов, таблиц базы данных в Microsoft Access.

    курсовая работа [1,1 M], добавлен 09.12.2013

  • Создание базы данных и таблиц. Определение таблиц и информации, которую они будут содержать. Определение индексированных полей и организации связи между ними. Создание формы в окне базы данных. Создание отчета "Список улиц". Выбор внешнего вида макета.

    контрольная работа [1,4 M], добавлен 11.04.2012

  • Создание инфологической и даталогической модели базы данных, которые отображают сущности и атрибуты, отношения и поля. Разработка информационной системы учета пролеченных в дневном стационаре (DSP) с помощью СУБД MS Access и среды разработки Delphi 7.

    курсовая работа [1,5 M], добавлен 03.07.2012

  • Понятие баз данных и принципы проектирования информационных систем. Разработка программы для отслеживания финансовой стороны работы компании в среде Delphi 7. Создание таблиц и схемы данных. Разработка клиентского приложения и процедуры добавления данных.

    курсовая работа [1,4 M], добавлен 25.04.2012

  • Процесс разработки базы данных для хранения и обработки информации. Ключи, индексы, триггеры, хранимые процедуры. Разработка пользовательского интерфейса и базы данных. Основные инструментальные средства для разработки клиентской и серверной частей.

    дипломная работа [225,0 K], добавлен 18.05.2013

  • Сущность и характеристика типов моделей данных: иерархическая, сетевая и реляционная. Базовые понятия реляционной модели данных. Атрибуты, схема отношения базы данных. Условия целостности данных. Связи между таблицами. Общие представления о модели данных.

    курсовая работа [36,1 K], добавлен 29.01.2011

  • Правила создания баз данных в Access. Основы строения таблиц базы "Оператор сотовой связи" с помощью Конструктора; изучение их связи. Определение полей и типов данных. Создание параметрических универсальных запросов, главной кнопочной формы и отчетов.

    курсовая работа [1,7 M], добавлен 22.04.2014

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.