АУЖИЦИ. АУЖЦИ Контрольная. Контрольная работа по автоматизации управления жизненным циклом изделия
Скачать 264.7 Kb.
|
1 КОНТРОЛЬНАЯ РАБОТА ПО АВТОМАТИЗАЦИИ УПРАВЛЕНИЯ ЖИЗНЕННЫМ ЦИКЛОМ ИЗДЕЛИЯ Электронный паспорт изделия представляет собой технический доку- мент, предназначенный, прежде всего, для её потребителей, поскольку в нём содержатся основные технические и эксплуатационные характеристики изде- лия, а также информация о проведенных работах по его обслуживанию. Электронный паспорт изделия должен прийти на смену обычному паспорту изделия, что определяется всей логикой развития информационных техноло- гий автоматизации управления жизненным циклом изделия. Целью контрольной работы является приобретение навыков создания объектной модели и базы данных для электронного паспорта изделия. Пас- порт изделия создается на языке C# с использованием платформы ADO.NET Entity Framework. База данный реализуется для MS SQL Server. Информация по созданию приложений на языке C# представлена на канале YouTube: https://www.youtube.com/playlist?list=PLgpowKVDMNLWbYgDxowiHm xLSs1ncgUI8 ОСНОВЫ ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ПРОГРАММИРОВА- НИЯ НА C# Алгоритмический язык C# относится к новейшим языкам объектно- ориентированного программирования. C# создавался «с нуля» для новой платформы Microsoft .NET и вобрал в себя все лучшее от предыдущих язы- ков объектно-ориентированного программирования, в первую очередь, от языков C++ и Java. Но последние версии этого языка программирования включили новые конструкции, которые отсутствуют в С++ и Java. Начиная с третьей версии языка C# получил мощнейшее средство - интегрированных язык запросов LINQ. C# является активно развивающимся языком, который по праву можно считать основным языком при разработке приложений Win- dows. C# относится к языкам с C-подобным синтаксисом. Синтаксически он очень похож на языки программирования C++ и Java, хотя имеются и неко- торые отличия. Классы и объекты В C# классы создаются с помощью ключевого слова class. Тело класса помещается внутри операторов блока, задаваемого с помощью фигурных скобок: class Имя_класса { 2 //Тело класса } Приведем примеры создания атрибутов и методов на примере про- стейшего класса точек: class Point { public int X; public int Y; public string MoveBy(int dx, int dy) { X += dx; Y += dy; } } Атрибуты создаются как обычные переменные, предваряемые квали- фикатором доступа public, который означает, что атрибутам можно обра- щаться как внутри класса, так и извне. Это правило распространяется на лю- бые члены класса, предваряемые квалификатором видимости public. Методы реализуются с помощью функций языка C, которые, как и в случае с атрибу- тами, предваряются квалификатором доступа (в нашем случае public). Методы реализуются с помощью функций, сигнатура которой предва- ряется модификатором области видимости. Объекты являются экземплярами класса и создаются с помощью опера- тора new: Point p1 = new Ponint(); Point p2 = new Point(); p1.X = 5; p1.Y = 10; p2.X = 8; p2.Y = 19; Здесь p1 и p2 отдельные объекты точек. Эти объекты ведут себя неза- висимо друг от друга. Мы можем менять значения атрибутов одного объекта, никак не влияя на другой. Например, в следующей строчке кода мы изменяем значения координат точки p1 на 10 (по x) и 20 (по y): p1.MoveBy(10, 20); Тогда значения координат x и y точки p1 будут равны 15 и 30, соответ- ственно. Значения координат точки p2 останутся неизменными и будут иметь значения 8 (по x) и 19 (по y). Таким образом, p1 и p2 – два независимых объ- екта, а объединяет их лишь то, что они являются экземплярами класса Point. Здесь полная аналогия с объектами предметной области, в нашем случае – с точками. 3 Управление видимостью. Методы доступа и свойства. Конструктор В реальных объектно-ориентированных программах атрибуты, обычно, не являются общедоступными, их делают либо закрытыми, либо защищен- ными. К закрытым (private) атрибутам, как и прочим членам класса, можно обратиться лишь из класса, которому они принадлежат (внутри тела класса) и невозможно обратиться извне. К защищенным (private) атрибутам, как и про- чим членам класса, можно обратиться как внутри тела класса, так и из класса – потомка данного класса (класса, который порожден от данного класса). Чтобы получить доступ к закрытым и защищенным атрибутам извне класса создают методы доступа Get и Set, которые, соответственно, считы- вают и устанавливают значения атрибутов: public int GetX() { Return _X; } public void SetX(int x) { _X = x; } Пример использования методов доступа: Point p1 = new Point(); p1.SetX(15); p1.SetY(20); Point p2 = new Point(); p2.SetX(p1.GetX()); p2.SetY(p2.GetY()); Здесь координаты точки p2 будут такими же, как и у p1. Но при этом это будут два отдельных объекта! В C# обычно вместо методов доступа используются свойства. Свойства – это такие методы, которые с точки зрения пользователя выглядят как атри- буты. public int X { get { return _X; { set { _X = value; 4 } } Здесь переменная value содержит значение, которое устанавливается у атрибута. Пример использования свойств: Point p1 = new Point(); P1.X = 100; P1.Y = 200; Разумеется, в классе создаются или методы доступа, или свойства. В C# традиционно вместо методов доступа используются именно свойства. Также следует заметить, что у атрибутов класса могут быть как свойства (или методы доступа) get и set, так может быть и только какое-то одно свойство (метод доступа) get или set, что определяется логикой класса. Кроме того, помимо установки/считывания значений атрибутов, в коде свойств и методов доступов могут выполняться и другие действия (например, выставления фла- га изменения значения атрибута в свойстве set). А могут быть свойства без атрибутов, например, свойство получения текущей даты и времени: public DateTime DateTimeNow { get { return DateTime.Now; } } Если к какому-либо атрибуту происходит обращение только внутри класса, то такой атрибут не будет иметь методов доступа или свойств. Классы всегда имеют конструкторы. Конструктор – это такой метод, который вызывается в момент создания объекта. Даже если конструктор не задан явно, вызывается конструктор по умолчанию. Имя конструктора совпадает с именем класса. В конструкторе содержится код, который необходим для инициализации объекта. Конструкторов у клас- са может быть сколько угодно, главное, чтобы они имели разные сигнатуры. Бывают конструкторы без параметров и с параметрами. Конструктор без па- раметров не принимает при создании объекта таковых. Конструкторы по умолчанию всегда является конструктором без параметров. Пример исполь- зования конструктора без параметров при создании объекта: Point p1 = new Point(); Здесь Point() – это не что иное, как вызов конструктора. Пример конструктора без параметров: public Point() { _X = 0; _Y = 0; 5 } Здесь создается объект класса точек с нулевыми значениями коорди- нат. В сигнатуре конструктора не указывается тип возвращаемого значения. Приведем пример конструктора с параметрами: public Point (int x, int y) { _X = x; _Y = y; } Здесь конструктор в качестве параметров принимает значения коорди- нат создаваемой точки. Таким образом, мы можем создать точку с опреде- ленными значениями координат: Point p1 = new Point(20, 50); Таким образом конструктор – это метод, вызываемый в момент созда- ния объекта, который имеет синтаксис обычного метода, за исключением то- го, что не указывается тип возвращаемого значения. Класс может иметь не- сколько конструкторов. Такую ситуацию называют перегрузкой конструкто- ров. Если создан хотя бы один конструктор (с параметрами или без), то кон- структор по умолчанию уже вызван быть не может! Приведем пример кода класса профилей пользователя. using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace ООП { public class Пользователь { private string _Фамилия; public string Фамилия { get { return _Фамилия; } set { _Фамилия = value ; } } private string _Имя; 6 public string Имя { get { return _Имя; } set { _Имя = value ; } } private string _Отчество; public string Отчество { get { return _Отчество; } set { _Отчество = value ; } } public Пользователь() { _Фамилия = "" ; _Имя = "" ; _Отчество = "" ; } public Пользователь( string фамилия, string имя, string отчество) { _Фамилия = фамилия; _Имя = имя; _Отчество = отчество; } public string Получить_ФИО() { return _Фамилия + " " + _Имя + " " + _Отчество; } } 7 } Обычно класс C# помещается в отдельном файле (хотя бывают и ис- ключения из этих правил). Вначале подключаются необходимые простран- ства имен: using System; using System.Collections.Generic; using System.Linq; using System.Web; Далее создается новое пространство имен (в нашем случае ООП): namespace ООП { …………………… } Пространство имен – это некое пространство, в котором мы можем об- ращаться к структурам по сокращенному имени. Например, когда мы нахо- димся в Санкт-Петербурге и набираем городской номер 555-55-55, мы наби- раем именно номер абонента, который находится в Санкт-Петербурге, а не в Москве, Минске, Череповце или Лондоне. Предполагается, что мы находим- ся в пространстве имен (в данном случае – телефонных номеров) города Санкт-Петербурга (812), который в свою очередь находится в пространстве имен (телефонных номеров) Российской Федерации (+7). Полностью номер будет выглядеть следующим образом: +7 812 555-55-55. Таким образом, указывая пространство имен с помощью оператора us- ing, мы определяем то пространство имен, в котором мы будем находится. Таким образом, мы можем использовать краткие имена, не беспокоясь о конфликтах одинаковых имен из разных пространств. Так, набирая город- ской телефонный номер, находясь в Санкт-Петербурге, будет установлена связь именно с абонентом петербургского номера, не смотря на то, что ана- логичные номера могут быть и в других городах. Как и в случае с телефон- ными номерами мы можем дать полное имя класса, указав через точку все пространства имен, в иерархии которых находится класс. Это обусловлено тем, что пространства имен могут вкладываться в друг друга: namespace Пространство_имен_1 { namespace Пространство_имен_2 { class Класс_1 { } } } 8 Тогда полное имя класса Класс_1 будет выглядеть следующим обра- зом: Пространство_имен_1. Пространство_имен_1.Класс_1 Ниже приведен код использования класса Пользователь путем создания двух объектов и манипуляции ими: Пользователь пользователь = new Пользователь(); пользователь.Фамилия = "Иванов" ; пользователь.Имя = "Иван" ; пользователь.Отчество = "Иванович" ; Пользователь пользователь2 = new Пользователь( "Петров" , "Петр" , "Петро- вич" ); Label1.Text = пользователь.Получить_ФИО(); Label2.Text = пользователь2.Получить_ФИО(); Label3.Text = пользователь2.Имя; пользователь.Имя = "Иван" ; Label4.Text = пользователь.Получить_ФИО(); Label5.Text = пользователь2.Получить_ФИО(); Label1 – Label5 – объекты текстовых полей, куда может быть выведен текст. Объекты текстовых полей Label имеют свойство Text, с помощью ко- торого можно считать или установить выводимый текст. Статические члены класса Помимо атрибутов и методов, которые принадлежат объектам и вызы- ваются на объектах, которые являются экземплярами класса, существуют члены класса, всецело принадлежащих классу и вызываемых исключительно на классе. Такие члены класса называются статическими членами класса. Статические члены класса всегда присутствуют в программе в единственном экземпляре и не могут быть вызваны на объекте. Кроме того, статические ме- тоды не могут обращаться к нестатическим членам класса (атрибутам и ме- тодам). Приведем пример статического метода, суммирующего два целых числа: class Math { ……………. public static int Sum(int a, int b) { return a + b; } ……………. } Осуществить вызов статического метода Sum() можно следующим об- разом: 9 int s = Math.Sum(5, 25); Как видим, для того, чтобы вызвать статический метод не нужно созда- вать объект класса, в котором он объявлен, достаточно его вызвать, придер- живаясь следующего синтаксиса: Имя_класс.Имя_статического_метода(параметры); Более того, даже если и будет создан экземпляр класса (объект), содер- жащего статический метод, его вызов через и имя объекта (вызов на объекте) невозможен, так как статический метод (как и атрибут) принадлежит исклю- чительно классу, в котором он объявлен, а, следовательно, может быть вы- зван исключительно на классе. Наследование и полиморфизм Реализацию наследования в C# рассмотрим на примере классов Транс- портное_средство, Самолет и Автомобиль. Класс Транспортное_средство яв- ляется базовым классом (родительским классом, суперклассом) для классов Автомобиль и Самолет, которые являются дочерними (производными) клас- сами. Класс Транспортное_средство является обобщением (генерализацией) классов Автомобиль и Самолет. Напротив, классы Автомобиль и Самолет являются более специализированными классами, по отношению к классу Транспортное_средство, и таким образом можно говорить о специализации. Наследование, генерализация и специализация Когда один класс (дочерний), порождается от другого (базового), то он приобретает все члены классы, от которого он порождается. Такое приобре- тение дочерними классами членов базового класса называется наследовани- ем. Так, классы Автомобиль и Самолет унаследуют от базового класса Транспортное_средство атрибут Текущая_скорость и метод Парамет- 10 ры_движения(). Причем наследование может быть как прямым, так и через другие классы. Иерархия классов транспортных средств Наследование атрибутов и методов класса Транспортное_средства дочерни- ми классами Автомобиль и Самолет 11 Наследование атрибутов и методов базового класса дочерними классами Приведем код классов Транспортное_средство, Автомобиль и Самолет. public class Транспортное_средство { public int Текущая_скорость { get; set; } public virtual string Получить_параметры_движения() { return "Текущая скорость: " + Текущая_скорость; } } public class Автомобиль : Транспортное_средство { public int Текущая_передача { get; set; } public override string Получить_параметры_движения() { return base.Получить_параметры_движения() + ", текущая передача: " + Текущая_передача; } } public class Самолет : Транспортное_средство 12 { public int Текущая_высота { get; set; } public override string Получить_параметры_движения() { return "Полет на высоте " + Текущая_высота + " со скоростью " + Текущая_скорость; } } Как видим, в дочерних классах может быть выполнено переопределе- ние методов базового класса (полиморфизм). Для этого метод базового клас- са должен быть объявлен как виртуальный (с помощью ключевого слова vir- tual), а в дочернем классе должен использоваться квалификатор override. ГЛАВА 4. АССОЦИАЦИИ МЕЖДУ КЛАССАМИ И КОЛЛЕКЦИИ ОБЪЕКТОВ В данной главе рассматривается реализация на C# ассоциаций между классами, а также классы коллекций, которые используются в отдельных ви- дах таких ассоциаций. Классы коллекций Коллекция – это объект, который может содержать набор других объ- ектов. В C# существует обширный набор классов коллекций, включая так называемые обобщенные коллекции, речь о которых и пойдет ниже. Коллек- ции являются обобщением массивов. В них преодолеваются недостатки при- сущие массивам, таки как фиксированный размер, невозможность добавле- ния и извлечения новых элементов, а только их перезапись, изменения раз- мера массивов. Коллекции позволяют хранить как переменные, так и объек- ты, причем обработка коллекций реализуется в C# унифицированным спосо- бом. Одним из наиболее распространенных классов коллекций является обобщенная коллекция List. Сразу следует заметить, что List в C# отличается от классической коллекции типа «список», обладая дополнительной функци- ональностью. Так, классические списки не позволяют произвольное обраще- ние к элементу, что реализовано в List. Рассмотрим пример использования класса обобщенных списков List. List < int > числа = new List < int >(); for ( int i = 1; i < 11; i++) { числа.Add(i); 13 } Label1.Text = числа.Count.ToString(); числа.RemoveAt(4); Label2.Text = числа.Count.ToString(); Метка.Text = числа[4].ToString(); ListBox1.DataSource = числа; ListBox1.DataBind(); В первой строке создается объект класса List, причем мы указываем, что в нем будут храниться целые числа. List < int > числа = new List < int >(); Иными словами мы создаем коллекцию целых чисел. Сразу после создания список не содержит элементов – целых чисел, то есть коллекция является пу- стой. Далее, в цикле мы заполняем список целыми числами от одного до де- сяти. Элементы в список добавляются с помощью метода Add(): числа.Add(i); Далее, с помощью свойства Count мы определяем размер списка, т.е. сколько элементов в нем находится. Label1.Text = числа.Count.ToString(); Значение свойства Count заносим в объект текстового поля, но так как поля текстовое, а значения свойства Count является целочисленным, то вы- зываем метод ToString(), который преобразует целочисленное значение в числовое. Особенностью C# является возможность вызова метода ToString() на любом объекте, включая целочисленную переменную или константу. Та- ким образом, приведенные ниже строки являются корректными. int a = 5; string s1 = a.ToString(); string s2 = 15.ToString(); Далее в нашем примере мы удаляем элемент массива с индексом 4, вы- зывая метод RemoveAt(), в который передаем индекс удаляемого элемента. числа.RemoveAt(4); После выполнения данного метода будет удален пятый элемент. Это происходит потому, что в C#, как и во всех языках с C-подобным синтакси- сом индексация начинается с нуля. После этого число элементов в списке будет равно девяти: Label2.Text = числа.Count.ToString(); А на позиции с индексом 4 будет находится число 6. Объекта класса список можно связать с элементами управления, выводящи- ми сразу несколько строк, например, с GridView: ListBox1.DataSource = числа; ListBox1.DataBind(); 14 Помимо переменных в коллекциях, в частности в списке, можно хранить лю- бые объекты. Рассмотрим пример списка, содержащего объекты, которые яв- ляются экземплярами класса Персоналия. List<Персоналия> персоналии = new List<Персоналия>(); персоналии.Add( new Персоналия( "Иванов" , "Иван" , "Иванович" )); персоналии.Add( new Персоналия( "Петров" , "Петр" , "Петрович" )); персоналии.Add( new Персоналия( "Степанов" , "Степан" , "Степанович" )); GridView1.DataSource = персоналии; GridView1.DataBind(); Обход коллекций может быть выполнен с помощью цикла foreach. Этот же цикл можно использовать для прохождения всех элементов массивов. Это возможно потому, что как коллекции, так и массивы, реализуют интерфейс IEnumerable. ЗАДАНИЕ НА ВЫПОЛНЕНИЕ КОНТРОЛЬНОЙ РАБОТЫ 1. Разработать электронный паспорт изделия, который должен отра- жать информацию, представленную в таблице, согласно своему варианту (определяется последней цифрой студенческого билета). Отражаемая в элек- тронном паспорте информация Номер варианта 1 2 3 4 5 6 7 8 9 0 Номер изделия + + + + + + + + + + Серия изделия + + + + + + + Дата производства + + + + + + + + + + Дата отгрузки + + + Дата продажи + + + + + Гарантийный срок + + + + + Цена изделия + + + + ФИО продавца + + + + Наименование ре- гламентной работы + + + + + + + + + + Дата и время выпол- нения регламентной работы + + + + + + + + + + ФИО сервисного инженера + + + + + Идентификационный номер сервисного инженера + + + + + 15 Стоимость работы + + + + + 2. Дать описание свойств навигации объектной модели для сущностных классов. 3. Сгенерировать базу данных для сохранения объектов сущностных классов. ПРИМЕР ВЫПОЛНЕНИЯ КОНТРОЛЬНОЙ РАБОТЫ Задание: 1. Разработать объектную модель электронного паспорта изделия. Электронный паспорт должен хранить информацию о номере и серии изде- лия, типе изделия, дате и времени производства изделия, а также информа- цию о проведенных регламентных работах, включая наименование регла- ментных работ, содержание работ, дату и время проведения и идентификатор сервисного инженера, выполнившего данную работу. 2. Дать описание свойств навигации объектной модели для сущностных классов. 3. Сгенерировать базу данных для сохранения объектов сущностных классов. Выполнение 1. Для реализации электронного паспорта изделия, удовлетворяющего данным требованиям необходимо два класса: 1) Класс электронного паспорта TechObject 2) Класс регламентных работ MaintenanceWorks 16 Ниже представлен файл класса контекста TechObject, содержащий коллек- ции объектов сущностных классов EPasportSDO и MaintenanceWorksSet. namespace EPasportSDO { using System; using System.Data.Entity; using System.Data.Entity.Infrastructure; public partial class EModelContainer : DbContext { public EModelContainer() : base ( "name=EModelContainer" ) { } protected override void OnModelCreat‐ ing( DbModelBuilder modelBuilder) { throw new UnintentionalCodeFirstException (); } public virtual DbSet < TechObject > TechObjectSet { get ; set ; } 17 public virtual DbSet < MaintenanceWorks > Maintenance‐ WorksSet { get ; set ; } } } Класс TechObject является основным классом системы. Ниже при‐ веден код данного класса на алгоритмическом языке C#. namespace EPasportSDO { using System; using System.Collections.Generic; public partial class TechObject { [Sys‐ tem.Diagnostics.CodeAnalysis. SuppressMessage ( "Microsoft.Usag e" , "CA2214:DoNotCallOverridableMethodsInConstructors" )] public TechObject() { this .MaintenanceWorks = new HashSet < MaintenanceWorks >(); } public System. Guid Id { get ; set ; } public string Number { get ; set ; } public string Series { get ; set ; } public string Type { get ; set ; } public System. DateTime ProductionTime { get ; set ; } [Sys‐ tem.Diagnostics.CodeAnalysis. SuppressMessage ( "Microsoft.Usag e" , "CA2227:CollectionPropertiesShouldBeReadOnly" )] public virtual ICollection < MaintenanceWorks > Mainte‐ nanceWorks { get ; set ; } } } Ниже приведен исходный код класса объектов, содержащих информацию о проведении регламентных работ. namespace EPasportSDO { 18 using System; using System.Collections.Generic; public partial class MaintenanceWorks { public System. Guid Id { get ; set ; } public string Title { get ; set ; } public string Desctiption { get ; set ; } public string Time { get ; set ; } public int EngineerID { get ; set ; } public virtual TechObject TechObject { get ; set ; } } } 2. Свойством навигации класса EPasportSDO является public virtual ICollection < MaintenanceWorks > Maintenance‐ Works { get ; set ; } Данное свойство содержит коллекцию объектов, содержащих информацию о проведении всех регламентных работ. Свойством навигации класса MaintenanceWorks является public virtual TechObject TechObject { get ; set ; } Данное свойство содержит ссылку на объект класса электронно‐ го паспорта, для которого выполнена данная регламентная ра‐ бота. 3. Ниже приведен SQL код, определяющий структуру базы данных для хранения значений свойств (атрибутов) объектов сущностной модели: ‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐ Entity Designer DDL Script for SQL Server 2005, 2008, 2012 and Azure ‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐ Date Created: 07/10/2016 17:20:06 ‐‐ Generated from EDMX file: C:\Users\Admin\Documents\Visual Studio 2015\Projects\EPasportSDO\EPasportSDO\EModel.edmx ‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ SET QUOTED_IDENTIFIER OFF ; GO USE [EPasport] ; GO 19 IF SCHEMA_ID ( N'dbo' ) IS NULL EXECUTE ( N'CREATE SCHEMA [dbo]' ); GO ‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐ Dropping existing FOREIGN KEY constraints ‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐ Dropping existing tables ‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐ Creating all tables ‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐ Creating table 'TechObjectSet' CREATE TABLE [dbo] [TechObjectSet] ( [Id] uniqueidentifier NOT NULL, [Number] nvarchar ( max ) NOT NULL, [Series] nvarchar ( max ) NOT NULL, [Type] nvarchar ( max ) NOT NULL, [ProductionTime] datetime NOT NULL ); GO ‐‐ Creating table 'MaintenanceWorksSet' CREATE TABLE [dbo] [MaintenanceWorksSet] ( [Id] uniqueidentifier NOT NULL, [Title] nvarchar ( max ) NOT NULL, [Desctiption] nvarchar ( max ) NOT NULL, [Time] nvarchar ( max ) NOT NULL, [EngineerID] int NOT NULL, [TechObject_Id] uniqueidentifier NOT NULL ); GO ‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐ Creating all PRIMARY KEY constraints ‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ 20 ‐‐ Creating primary key on [Id] in table 'TechObjectSet' ALTER TABLE [dbo] [TechObjectSet] ADD CONSTRAINT [PK_TechObjectSet] PRIMARY KEY CLUSTERED ( [Id] ASC ); GO ‐‐ Creating primary key on [Id] in table 'Maintenance‐ WorksSet' ALTER TABLE [dbo] [MaintenanceWorksSet] ADD CONSTRAINT [PK_MaintenanceWorksSet] PRIMARY KEY CLUSTERED ( [Id] ASC ); GO ‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐ Creating all FOREIGN KEY constraints ‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐ Creating foreign key on [TechObject_Id] in table 'Mainte‐ nanceWorksSet' ALTER TABLE [dbo] [MaintenanceWorksSet] ADD CONSTRAINT [FK_TechObjectMaintenanceWorks] FOREIGN KEY ( [TechObject_Id] ) REFERENCES [dbo] [TechObjectSet] ( [Id] ) ON DELETE NO ACTION ON UPDATE NO ACTION ; GO ‐‐ Creating non‐clustered index for FOREIGN KEY 'FK_TechObjectMaintenanceWorks' CREATE INDEX [IX_FK_TechObjectMaintenanceWorks] ON [dbo] [MaintenanceWorksSet] ( [TechObject_Id] ); GO ‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ‐‐ Script has ended ‐‐ ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ |