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

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

Скачать работу Скачать уникальную работу

Чтобы скачать работу, Вы должны пройти проверку:


Аннотация к работе
Постановка задачи.

Список литературы
Приложение А (обязательное)- Листинг программы

Введение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Файл индексов - 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

Рисунок 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"." 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 NAMETABLETEMP 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 (j2) 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"$" then inc(j) else break;

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

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

j:=1;

while 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"|" 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 (OLDNAMETEMP) 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 OLDNAMETEMP 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 OLDNAMETEMP 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.

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

Вы можете ЗАГРУЗИТЬ и ПОВЫСИТЬ уникальность
своей работы


Новые загруженные работы

Дисциплины научных работ





Хотите, перезвоним вам?