
3 курс Разработка управленческих решений (лабы) / ЛР3 БД
.doc
Концептуальная модель база данных
Физическая модель базы данных
Created: 11.04.2014
' Modified: 11.04.2014
' Model: MS Access 2000-2003
' Database: MS Access 2000-2003
'=======================================================
'=== MS Access 2000/2002/2003 database creation method
'===
'=== 1. Create a new database in the MS Access
'=== 2. Create a new module
'=== 3. Copy the TDM3 output SQL script into the new MS Access module
'=== 4. Select from main menu "Tools" item "References..." and check
'=== the "Microsoft ActiveX Data Objects 2.x Library"
'=== and "Microsoft ADO Ext. 2.x for DDL and Security"
'=== and "Microsoft DAO 3.6 Object Library"
'=== 5. Place your mouse cursor somewhere in the main procedure Main()
'=== 6. Run the module code (Click the "Run Sub/UserForm" button or press F5)
'=======================================================
Public con As New ADODB.Connection
Public cat As New ADOX.Catalog
Public tbl As ADOX.Table
Public idx As ADOX.Index
Public dbs As DAO.Database
Sub Main()
Set con = CurrentProject.Connection
cat.ActiveConnection = con
Set dbs = CurrentDb()
On Error GoTo ErrorHandler
Call CreateTables
Call CreatePrimaryKeys
Call CreateIndexes
Call CreateAlterKeys
Call CreateRelations
Call CreateRelationsDAO
Call CreateQueries
MsgBox "Script successfully processed.", vbInformation
Exit Sub
ErrorHandler:
Select Case Err.Number
Case -2147217857 'DAO: 3010
MsgBox "Table " & tbl.Name & " already exist!", vbInformation
Err.Clear
Case -2147217868 'DAO: 3284
MsgBox "Index " & idx.Name & " for table " & tbl.Name & " already exist!", vbInformation
Err.Clear
Case Else
MsgBox Err.Description, vbCritical
End Select
End Sub
' Create tables
'===============
Sub CreateTables()
Call CreateTable1 'Student
Call CreateTable2 'Ocenki
Call CreateTable3 'FCLT
Call CreateTable4 'SPECT
Call CreateTable5 'Entity5
End Sub
'=== Create table Student ========
Sub CreateTable1()
Set tbl = New ADOX.Table
tbl.Name = "Student"
cat.Tables.Append tbl
Call AddFieldToTable("Student", "NZ", adVarWChar, 7, 0, "", "FALSE", "", "", "", "", "")
Call AddFieldToTable("Student", "N_fclt", adNumeric, 2, 0, "", "FALSE", "", "", "", "", "")
Call AddFieldToTable("Student", "N_spect", adNumeric, 2, 0, "", "FALSE", "", "", "", "", "")
Call AddFieldToTable("Student", "FIO", adVarWChar, 45, 0, "", "TRUE", "", "", "", "", "")
Call AddFieldToTable("Student", "Date_p", adDate, 0, 0, "", "TRUE", "", "", "", "", "")
Call AddFieldToTable("Student", "kurs", adNumeric, 1, 0, "", "TRUE", "", "", "", "", "")
Call AddFieldToTable("Student", "N_grup", adVarWChar, 10, 0, "", "TRUE", "", "", "", "", "")
Call AddFieldToTable("Student", "N_pasp", adVarWChar, 10, 0, "", "TRUE", "", "", "", "", "")
dbs.TableDefs.Refresh
Call AddPropertyToFieldDAO( "Student","NZ","Caption","Номер зачетки",dbText)
Call AddPropertyToFieldDAO( "Student","N_fclt","Caption","Номер факультета",dbText)
Call AddPropertyToFieldDAO( "Student","N_spect","Caption","№ специальности",dbText)
Call AddPropertyToFieldDAO( "Student","FIO","Caption","ФИО",dbText)
Call AddPropertyToFieldDAO( "Student","Date_p","Caption","Дата поступления",dbText)
Call AddPropertyToFieldDAO( "Student","kurs","Caption","Курс",dbText)
Call AddPropertyToFieldDAO( "Student","N_grup","Caption","Номер группы",dbText)
Call AddPropertyToFieldDAO( "Student","N_pasp","Caption","Номер паспорта",dbText)
End Sub
'=== Create table Ocenki ========
Sub CreateTable2()
Set tbl = New ADOX.Table
tbl.Name = "Ocenki"
cat.Tables.Append tbl
Call AddFieldToTable("Ocenki", "NZ", adVarWChar, 7, 0, "", "FALSE", "", "", "", "", "")
Call AddFieldToTable("Ocenki", "N_predm", adNumeric, 2, 0, "", "FALSE", "", "", "", "", "")
Call AddFieldToTable("Ocenki", "N_sem", adNumeric, 2, 0, "", "TRUE", "", "", "", "", "")
Call AddFieldToTable("Ocenki", "osenka", adVarWChar, 1, 0, "", "TRUE", "", "", "", "", "")
Call AddFieldToTable("Ocenki", "Date_pol", adDate, 0, 0, "", "TRUE", "", "", "", "", "")
Call AddFieldToTable("Ocenki", "F_prep", adSmallInt, 0, 0, "", "TRUE", "", "", "", "", "")
dbs.TableDefs.Refresh
Call AddPropertyToFieldDAO( "Ocenki","NZ","Caption","Номер зачетки",dbText)
Call AddPropertyToFieldDAO( "Ocenki","N_predm","Caption","№ предмета",dbText)
Call AddPropertyToFieldDAO( "Ocenki","N_sem","Caption","Номер семестра",dbText)
Call AddPropertyToFieldDAO( "Ocenki","osenka","Caption","оценка",dbText)
Call AddPropertyToFieldDAO( "Ocenki","Date_pol","Caption","Дата получения оценки",dbText)
Call AddPropertyToFieldDAO( "Ocenki","F_prep","Caption","Фамилия преподователя",dbText)
End Sub
'=== Create table FCLT ========
Sub CreateTable3()
Set tbl = New ADOX.Table
tbl.Name = "FCLT"
cat.Tables.Append tbl
Call AddFieldToTable("FCLT", "N_fclt", adNumeric, 2, 0, "", "FALSE", "", "", "", "", "")
Call AddFieldToTable("FCLT", "Nazv_fclt", adVarWChar, 50, 0, "", "TRUE", "", "", "", "", "")
dbs.TableDefs.Refresh
Call AddPropertyToFieldDAO( "FCLT","N_fclt","Caption","Номер факультета",dbText)
Call AddPropertyToFieldDAO( "FCLT","Nazv_fclt","Caption","Название факультета",dbText)
End Sub
'=== Create table SPECT ========
Sub CreateTable4()
Set tbl = New ADOX.Table
tbl.Name = "SPECT"
cat.Tables.Append tbl
Call AddFieldToTable("SPECT", "N_spect", adNumeric, 2, 0, "", "FALSE", "", "", "", "", "")
Call AddFieldToTable("SPECT", "Nazv_spect", adVarWChar, 50, 0, "", "TRUE", "", "", "", "", "")
dbs.TableDefs.Refresh
Call AddPropertyToFieldDAO( "SPECT","N_spect","Caption","№ специальности",dbText)
Call AddPropertyToFieldDAO( "SPECT","Nazv_spect","Caption","Название специальности",dbText)
End Sub
'=== Create table Entity5 ========
Sub CreateTable5()
Set tbl = New ADOX.Table
tbl.Name = "Entity5"
cat.Tables.Append tbl
Call AddFieldToTable("Entity5", "N_predm", adNumeric, 2, 0, "", "FALSE", "", "", "", "", "")
Call AddFieldToTable("Entity5", "Predmet", adNumeric, 2, 0, "", "TRUE", "", "", "", "", "")
dbs.TableDefs.Refresh
Call AddPropertyToFieldDAO( "Entity5","N_predm","Caption","№ предмета",dbText)
Call AddPropertyToFieldDAO( "Entity5","Predmet","Caption","Предмет",dbText)
End Sub
' Create primary keys
'=====================
Sub CreatePrimaryKeys()
'=== Create primary key for table Student ======
Set idx = New ADOX.Index
Set tbl = cat.Tables("Student")
idx.Name = "Key1"
idx.PrimaryKey = True
idx.Unique = True
idx.IndexNulls = adIndexNullsDisallow
Call AddFieldToIndex(idx, "NZ", False )
tbl.Indexes.Append idx
'=== Create primary key for table FCLT ======
Set idx = New ADOX.Index
Set tbl = cat.Tables("FCLT")
idx.Name = "Key3"
idx.PrimaryKey = True
idx.Unique = True
idx.IndexNulls = adIndexNullsDisallow
Call AddFieldToIndex(idx, "N_fclt", False )
tbl.Indexes.Append idx
'=== Create primary key for table SPECT ======
Set idx = New ADOX.Index
Set tbl = cat.Tables("SPECT")
idx.Name = "Key4"
idx.PrimaryKey = True
idx.Unique = True
idx.IndexNulls = adIndexNullsDisallow
Call AddFieldToIndex(idx, "N_spect", False )
tbl.Indexes.Append idx
'=== Create primary key for table Entity5 ======
Set idx = New ADOX.Index
Set tbl = cat.Tables("Entity5")
idx.Name = "Key5"
idx.PrimaryKey = True
idx.Unique = True
idx.IndexNulls = adIndexNullsDisallow
Call AddFieldToIndex(idx, "N_predm", False )
tbl.Indexes.Append idx
End Sub
' Create indexes
'================
Sub CreateIndexes()
End Sub
' Create alternate keys (unique indexes in MS ACCESS)
'================================================
Sub CreateAlterKeys()
End Sub
' Create relations
'==================
Sub CreateRelations()
Dim keyFk As ADOX.Key
'=== Create relationship between parent table FCLT and child table Student ======
Set keyFk = New ADOX.Key
Set tbl = cat.Tables("Student")
keyFk.Name = "Связь 3"
keyFk.Type = adKeyForeign
keyFk.RelatedTable = "FCLT"
Call AddFieldToRelation(keyFk, "N_fclt", "N_fclt")
tbl.Keys.Append keyFk
'=== Create relationship between parent table SPECT and child table Student ======
Set keyFk = New ADOX.Key
Set tbl = cat.Tables("Student")
keyFk.Name = "Связь 2"
keyFk.Type = adKeyForeign
keyFk.RelatedTable = "SPECT"
Call AddFieldToRelation(keyFk, "N_spect", "N_spect")
tbl.Keys.Append keyFk
'=== Create relationship between parent table Student and child table Ocenki ======
Set keyFk = New ADOX.Key
Set tbl = cat.Tables("Ocenki")
keyFk.Name = "Связь1"
keyFk.Type = adKeyForeign
keyFk.RelatedTable = "Student"
Call AddFieldToRelation(keyFk, "NZ", "NZ")
tbl.Keys.Append keyFk
'=== Create relationship between parent table Entity5 and child table Ocenki ======
Set keyFk = New ADOX.Key
Set tbl = cat.Tables("Ocenki")
keyFk.Name = "Связь 4"
keyFk.Type = adKeyForeign
keyFk.RelatedTable = "Entity5"
Call AddFieldToRelation(keyFk, "N_predm", "N_predm")
tbl.Keys.Append keyFk
End Sub
' Create relations (DAO)
'========================
Sub CreateRelationsDAO()
Dim rel As DAO.Relation
dbs.Relations.Refresh
End Sub
' Create queries
'================
Sub CreateQueries()
Dim cmd As ADODB.Command
End Sub
' Add fields to table
'=====================
Sub AddFieldToTable(TableName As String, FieldName As String, _
DataType As Integer, SizePrecCol As Integer, ScaleCol As Integer, Attributes As String, _
Nullable As String, DefaultValue As Variant, _
AllowZeroLength As String, CompressUnicode As String, _
ValText As String, ValRule As String)
Dim col As New ADOX.Column
col.ParentCatalog = cat
col.Name = FieldName
col.Type = DataType
If DataType = adVarWChar Then col.DefinedSize = SizePrecCol
If DataType = adNumeric Then
col.Precision = SizePrecCol
col.NumericScale = ScaleCol
End If
If Nullable <> "" Then col.Properties("Nullable").Value = CBool(Nullable)
If Attributes <> "" Then col.Properties(Attributes).Value = True
If AllowZeroLength <> "" Then col.Properties("Jet OLEDB:Allow Zero Length").Value = CBool(AllowZeroLength)
If CompressUnicode <> "" Then col.Properties("Jet OLEDB:Compressed UNICODE Strings").Value = CBool(CompressUnicode)
If DefaultValue <> "" Then col.Properties("Default").Value = DefaultValue
If ValRule <> "" Then col.Properties("Jet OLEDB:Column Validation Rule").Value = ValRule
If ValText <> "" Then col.Properties("Jet OLEDB:Column Validation Text").Value = ValText
cat.Tables(TableName).Columns.Append col
End Sub
' Add DAO properties to table
'=============================
Sub AddPropertyToTableDAO( TableName As String, PropertyName As String, Value As Variant, DataType As String)
Dim prp As DAO.Property
Dim tdf As DAO.TableDef
Set tdf = dbs.TableDefs(TableName)
Set prp = tdf.CreateProperty(PropertyName, DataType, Value)
tdf.Properties.Append prp
End Sub
' Add DAO properties to field
'=============================
Sub AddPropertyToFieldDAO( TableName As String, FieldName As String, PropertyName As String, Value As Variant, DataType As String)
Dim prp As DAO.Property
Dim fld As DAO.Field
Dim tdf As DAO.TableDef
Set tdf = dbs.TableDefs(TableName)
Set fld = tdf.Fields( FieldName )
Set prp = fld.CreateProperty(PropertyName, DataType, Value)
fld.Properties.Append prp
End Sub
' Add fields to index
'=====================
Sub AddFieldToIndex(idx As ADOX.Index, FieldName As String, Descending As Boolean )
idx.Columns.Append FieldName
If Descending = True Then idx.Columns(FieldName).SortOrder = adSortDescending
End Sub
' Add fields to relation
'========================
Sub AddFieldToRelation(keyFk As ADOX.Key, PKField As String, FKField As String )
keyFk.Columns.Append FKField
keyFk.Columns(FKField).RelatedColumn = PKField
End Sub
' Add fields to relation (DAO)
'=============================
Sub AddFieldToRelationDAO( rel As DAO.Relation, PKField As String, FKField As String )
Dim fld As DAO.Field
Set fld = rel.CreateField( PKField )
fld.ForeignName = FKField
rel.Fields.Append fld
End Sub
После конвертирования
/*
Created: 11.04.2014
Modified: 11.04.2014
Model: MS Access 2000-2003
Database: MS SQL Server 2005
*/
-- Create tables section -------------------------------------------------
-- Table Student
CREATE TABLE [Student]
(
[NZ] Char(7) NOT NULL,
[N_fclt] Decimal(2,0) NOT NULL,
[N_spect] Decimal(2,0) NOT NULL,
[FIO] Char(45) NULL,
[Date_p] Datetime NULL,
[kurs] Decimal(1,0) NULL,
[N_grup] Char(10) NULL,
[N_pasp] Char(10) NULL
)
go
-- Add keys for table Student
ALTER TABLE [Student] ADD CONSTRAINT [Key1] PRIMARY KEY ([NZ])
go
-- Table Ocenki
CREATE TABLE [Ocenki]
(
[NZ] Char(7) NOT NULL,
[N_predm] Decimal(2,0) NOT NULL,
[N_sem] Decimal(2,0) NULL,
[osenka] Char(1) NULL,
[Date_pol] Datetime NULL,
[F_prep] Smallint NULL
)
go
-- Table FCLT
CREATE TABLE [FCLT]
(
[N_fclt] Decimal(2,0) NOT NULL,
[Nazv_fclt] Char(50) NULL
)
go
-- Add keys for table FCLT
ALTER TABLE [FCLT] ADD CONSTRAINT [Key3] PRIMARY KEY ([N_fclt])
go
-- Table SPECT
CREATE TABLE [SPECT]
(
[N_spect] Decimal(2,0) NOT NULL,
[Nazv_spect] Char(50) NULL
)
go
-- Add keys for table SPECT
ALTER TABLE [SPECT] ADD CONSTRAINT [Key4] PRIMARY KEY ([N_spect])
go
-- Table Entity5
CREATE TABLE [Entity5]
(
[N_predm] Decimal(2,0) NOT NULL,
[Predmet] Decimal(2,0) NULL
)
go
-- Add keys for table Entity5
ALTER TABLE [Entity5] ADD CONSTRAINT [Key5] PRIMARY KEY ([N_predm])
go
-- Create relationships section -------------------------------------------------
ALTER TABLE [Student] ADD CONSTRAINT [Связь 3] FOREIGN KEY ([N_fclt]) REFERENCES [FCLT] ([N_fclt])
go
ALTER TABLE [Student] ADD CONSTRAINT [Связь 2] FOREIGN KEY ([N_spect]) REFERENCES [SPECT] ([N_spect])
go
ALTER TABLE [Ocenki] ADD CONSTRAINT [Связь1] FOREIGN KEY ([NZ]) REFERENCES [Student] ([NZ])
go
ALTER TABLE [Ocenki] ADD CONSTRAINT [Связь 4] FOREIGN KEY ([N_predm]) REFERENCES [Entity5] ([N_predm])
Go