Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Создание таблиц Аксесс из файла с именами таблиц, именами полей, их типами / 14 сообщений из 14, страница 1 из 1
08.07.2016, 22:13
    #39270936
kanan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание таблиц Аксесс из файла с именами таблиц, именами полей, их типами
Форумчане, доброго времени суток!

Есть таблица DataDictionary в которую автоматом выгрузили из существующей БД имена всех таблиц, полей, их тип (и запросов на выборку) проекта.

Прошу помочь создать процедуру, которая будет делать обратное, т.е. воссоздавать (создавать вновь) все таблицы.
В Модуль1 попытка сделать данную процедуру.
Пока не получилось.

Прошу Вашей помощи!
...
Рейтинг: 0 / 0
10.07.2016, 23:15
    #39271509
guest_rusimport
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание таблиц Аксесс из файла с именами таблиц, именами полей, их типами
kanan,
...
Рейтинг: 0 / 0
12.07.2016, 14:50
    #39272458
kanan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание таблиц Аксесс из файла с именами таблиц, именами полей, их типами
guest_rusimport, Спасибо, попробовал- таблицы создаются. Даже не верится.... Если бы не это- пришлось бы создавать руками 140 таблиц, с общим количеством полей 900.
Еще раз спасибо!
...
Рейтинг: 0 / 0
12.07.2016, 18:01
    #39272603
ПЕНСИОНЕРКА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание таблиц Аксесс из файла с именами таблиц, именами полей, их типами
kanan,
у вас что же нет ни одного поля с типом счетчик
...
Рейтинг: 0 / 0
13.07.2016, 09:22
    #39272798
kanan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание таблиц Аксесс из файла с именами таблиц, именами полей, их типами
Вы правы, в таблице DataDictionary есть не все данные для последующего создания таблиц ( много нужно допиливать руками).
Поэтому выкладываю процедуру, которая создает таблицу DataDictionary - и которая может делать не все, что хотелось бы.
Запускается процедура открытием формы fDataDictionary. Форму выложить не могу- допустивый размер вложения (150Kb) не позволяет.
Прошу посмотреть ее, и, по возможности, доработать- что бы кроме имени таблицы, имен полей, их вида были еще все остальные свойства
И в процедуре по воссозданию таблиц- также учитывать все свойства.
Такая не простая задачка.
Возможно кто-либо захочет ее решить?


Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
Option Compare Database
Option Explicit

Private Sub Form_Load()
    Me.lstColumns.Requery
End Sub

Private Sub Form_Open(Cancel As Integer)
    Dim cnn As ADODB.Connection
    Dim cmdDelete As ADODB.Command
    Dim rstDictionary As ADODB.Recordset
    Dim cat As ADOX.Catalog
    Dim tbl As ADOX.Table
    Dim col As ADOX.Column
    Set cnn = CurrentProject.Connection
    Set cmdDelete = New ADODB.Command
    Set cmdDelete.ActiveConnection = cnn
    cmdDelete.CommandText = "Delete * From DataDictionary"
    cmdDelete.Execute
    Set rstDictionary = New ADODB.Recordset
    rstDictionary.Open "Select * From DataDictionary", cnn, adOpenStatic, adLockOptimistic
    Set cat = New ADOX.Catalog
    Set cat.ActiveConnection = CurrentProject.Connection
    For Each tbl In cat.Tables
        If Left(tbl.Name, 4) <> "MSys" And _
            Left(tbl.Name, 4) <> "USys" And _
            Left(tbl.Name, 4) <> "TMP" Then
                For Each col In tbl.Columns
                    rstDictionary.AddNew
                    rstDictionary.Fields("TableName").Value = tbl.Name
                    rstDictionary.Fields("ColumnName").Value = col.Name
                    rstDictionary.Fields("Type").Value = TranslateType(col.Type)
                    rstDictionary.Update
                Next col
        End If
    Next tbl
    rstDictionary.Close
End Sub
Public Function TranslateType(intType As Integer) As String
    Select Case intType
        Case adUnsignedTinyInt
            TranslateType = "Byte"
        Case adCurrency
            TranslateType = "Currency"
        Case adDate
            TranslateType = "Date/Time"
        Case adNumeric
            TranslateType = "Decimal"
        Case adDouble
            TranslateType = "Double"
        Case adLongVarWChar
            TranslateType = "Memo"
        Case adSmallInt
            TranslateType = "Integer"
        Case adInteger
            TranslateType = "Long Integer"
        Case adLongVarBinary
            TranslateType = "OLE Object"
        Case adGUID
            TranslateType = "Replication ID"
        Case adSingle
            TranslateType = "Single"
        Case adVarWChar
            TranslateType = "Text"
        Case adBoolean
            TranslateType = "Yes/No"
    End Select
End Function
...
Рейтинг: 0 / 0
13.07.2016, 10:23
    #39272844
Шыфл
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание таблиц Аксесс из файла с именами таблиц, именами полей, их типами
kanan,
это, конечно, не совсем то, это создание таблицы на основе ADO запроса. Но может быть натолкнёт на нужные мысли, или кому-то пригодится.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
Public Function CreateLocalTableFromRecordset(localTableName As String, ByRef adoRecordset As ADODB.Recordset, Optional ByVal remoteDBPath As String = "") As Variant

' -----------------------------------------------------------------------------
' Creates new local Access table from ADO recordset
' It examines the datatype and size of fields in ADO recordset,
' converts it to their DAO equivalents and creates a local table
' If the table already exists, it WILL NOT overwrite it, it raises an error instead
' -----------------------------------------------------------------------------

    Dim errorMessage        As Variant      ' Local (this) function error message
    Dim callErrorMessage    As Variant      ' Error message returned from other function call
    
    ' 1. Check whether table already exists
    If LocalTableExists(localTableName, remoteDBPath) = True Then
        errorMessage = "Table " & "[" & localTableName & "]" & " already exists."
        CreateLocalTableFromRecordset = errorMessage
        Exit Function
    End If
    
    Dim localDatabase       As DAO.Database
    Dim newLocalTableDef    As TableDef
    Dim recordsetField      As ADODB.Field
    
    ' 2. Create new local Access table
    If remoteDBPath = "" Then
        Set localDatabase = CurrentDb()
    Else
        Dim app As Access.Application
        Set app = CreateObject("Access.Application")
        app.OpenCurrentDatabase remoteDBPath
        Set localDatabase = app.CurrentDb
    End If
    
    Set newLocalTableDef = localDatabase.CreateTableDef(localTableName)
    
    ' 3. Create each field in the table
    For Each recordsetField In adoRecordset.Fields
        callErrorMessage = CreateDaoField(newLocalTableDef, recordsetField)
                
        If Not IsNull(callErrorMessage) Then
            errorMessage = "CreateLocalTableFromRecordset(): Error creating DAO fields" & vbCr
            errorMessage = errorMessage & callErrorMessage
            CreateLocalTableFromRecordset = errorMessage
            GoTo CleanResources
        End If
    Next recordsetField

    ' 4. Append newly created table to the table collection
    localDatabase.TableDefs.Append newLocalTableDef
    
    ' Everything is OK
    CreateLocalTableFromRecordset = Null
    GoTo CleanResources
    Exit Function


CleanResources:

    If Not recordsetField Is Nothing Then
        Set recordsetField = Nothing
    End If

    If Not newLocalTableDef Is Nothing Then
        Set newLocalTableDef = Nothing
    End If
    
    If Not localDatabase Is Nothing Then
        localDatabase.Close
        Set localDatabase = Nothing
    End If

End Function

Public Function CreateDaoField(ByRef newTableDef As TableDef, adoField As ADODB.Field) As Variant

' -----------------------------------------------------------------------------
' Creates new DAO datafield for the TableDef from ADO data field parameters
' Appends it to the TableDef collection
' -----------------------------------------------------------------------------

    Dim errorMessage        As Variant      ' Local (this) function error message
    Dim fieldName           As String
    Dim fieldSize           As Integer
    Dim fieldDataType       As Integer
    Dim newTableField       As Field
    
    Dim UNKNOWN_DAO_CODE    As Integer
    UNKNOWN_DAO_CODE = -1
    
    fieldName = adoField.Name
    fieldSize = adoField.DefinedSize
    fieldDataType = GetDaoFieldDataType(adoField.Type, fieldSize)
    
    If fieldDataType = UNKNOWN_DAO_CODE Then
        errorMessage = "CreateDaoField(): Error" & vbCr
        errorMessage = errorMessage & "Cannot determine corresponding DAO datatype"
        errorMessage = errorMessage & " for ADO datatype " & "[" & GetAdoDataTypeName(adoField.Type) & "]"
        CreateDaoField = errorMessage
        Exit Function
    End If
    
    Set newTableField = newTableDef.CreateField(fieldName, fieldDataType, fieldSize)
    newTableDef.Fields.Append newTableField

    ' Everything is OK
    CreateDaoField = Null

End Function

Public Function GetDaoFieldDataType(adoDataType As Integer, fieldSize As Integer) As Integer

' -----------------------------------------------------------------------------
' Gets corresponding DAO datatype from ADO recordset field datatype
' It is necessary to create a local Access table (DAO) from SQL stored procedure (ADO)
' Note that not all ADO datatypes are supported in Access local database
' -----------------------------------------------------------------------------

    Dim daoDataType         As Integer
    Dim UNKNOWN_DAO_CODE    As Integer
    
    UNKNOWN_DAO_CODE = -1

    Select Case adoDataType
'        Case adArray:
'            ' Flag value combined with another data type constant
'            ' Indicates an array of that other data type.
'            daoDataType = UNKNOWN_DAO_CODE  ' Not supported in Access

        Case adBigInt:
            ' 8-byte signed integer
            daoDataType = UNKNOWN_DAO_CODE  ' Not supported in Access

        Case adBinary:
            ' Binary value
            daoDataType = UNKNOWN_DAO_CODE  ' Not supported in Access

        Case adBoolean:
            ' Boolean value
            daoDataType = dbBoolean

        Case adBSTR:
            ' Null-terminated character string.
            daoDataType = dbText
            
        Case adChapter:
            ' 4-byte chapter value that identifies rows in a child rowset
            daoDataType = UNKNOWN_DAO_CODE  ' Not supported in Access

        Case adChar:
            ' String value
            daoDataType = dbText

        Case adCurrency:
            ' Currency value
            daoDataType = dbCurrency

        Case adDate:
            ' Datetime
            daoDataType = dbDate

        Case adDBDate:
            ' Date value (yyyymmdd)
            ' removed for testing purposes
            'daoDataType = UNKNOWN_DAO_CODE
            daoDataType = dbDate

        Case adDBTime:
            ' Time value (hhmmss)
            ' Can be recognized in attached tables but cannot be created
            ' removed for testing purposes
            'daoDataType = UNKNOWN_DAO_CODE
            'daoDataType = dbTime
            daoDataType = dbDate
            
        Case adDBTimeStamp:
            ' Date/time stamp (yyyymmddhhmmss plus a fraction in billionths)
            ' Can be recognized in attached tables but cannot be created
            ' removed for testing purposes
            'daoDataType = UNKNOWN_DAO_CODE
            'daoDataType = dbTimeStamp
            daoDataType = dbDate

        Case adDecimal:
            ' An exact numeric value with a fixed precision and scale
            daoDataType = dbDecimal
            
        Case adDouble:
            ' Double-precision floating-point value
            daoDataType = dbDouble

        Case adEmpty:
            ' No value
            daoDataType = UNKNOWN_DAO_CODE  ' Not supported in Access

        Case adError:
            ' 32-bit error code
            daoDataType = UNKNOWN_DAO_CODE  ' Not supported in Access
            
        Case adFileTime:
            ' 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601 (DBTYPE_FILETIME)
            daoDataType = UNKNOWN_DAO_CODE  ' Not supported in Access
            
        Case adGUID:
            ' Globally unique identifier (GUID)
            daoDataType = dbGUID

        Case adIDispatch:
            ' This data type is currently not supported by ADO
            ' Usage may cause unpredictable results.
            daoDataType = UNKNOWN_DAO_CODE

        Case adInteger:
            ' 4-byte signed integer (DBTYPE_I4).
            daoDataType = dbLong
            
        Case adIUnknown:
            ' This data type is currently not supported by ADO.
            ' Usage may cause unpredictable results.
            daoDataType = UNKNOWN_DAO_CODE
        
        Case adLongVarBinary:
            ' Indicates a long binary value.
            daoDataType = dbLongBinary

        Case adLongVarChar:
            ' Indicates a long string value.
            daoDataType = dbMemo

        Case adLongVarWChar:
            ' Indicates a long string value.
            daoDataType = dbMemo

        Case adNumeric:
            ' Can be recognized in attached tables but cannot be created
            'daoDataType = dbNumeric
            daoDataType = dbDecimal

        Case adPropVariant:
            ' Automation PROPVARIANT (DBTYPE_PROP_VARIANT).
            daoDataType = UNKNOWN_DAO_CODE

        Case adSingle:
            ' Single-precision floating-point value (DBTYPE_R4).
            daoDataType = dbSingle

        Case adSmallInt:
            ' 2-byte signed integer (DBTYPE_I2).
            daoDataType = dbInteger

        Case adTinyInt:
            ' 1-byte signed integer (DBTYPE_I1)
            daoDataType = dbByte

        Case adUnsignedBigInt:
            ' Not supported by Access
            daoDataType = UNKNOWN_DAO_CODE

        Case adUnsignedInt:
            ' 4-byte unsigned integer (DBTYPE_UI4)
            daoDataType = dbLong

        Case adUnsignedSmallInt:
            ' 2-byte unsigned integer (DBTYPE_UI2)
            daoDataType = dbInteger

        Case adUnsignedTinyInt:
            ' 1-byte unsigned integer (DBTYPE_UI1)
            daoDataType = dbByte

        Case adUserDefined:
            ' User-defined variable (DBTYPE_UDT)
            daoDataType = UNKNOWN_DAO_CODE
            
        Case adVarBinary:
            ' Binary value (Parameter object only)
            'daoDataType = dbBinary
            daoDataType = UNKNOWN_DAO_CODE

        Case adVarChar:
            ' String value
            daoDataType = dbText

        Case adVariant:
            ' This data type is currently not supported by ADO.
            ' Usage may cause unpredictable results.
            daoDataType = UNKNOWN_DAO_CODE

        Case adVarNumeric:
            ' Numeric value (Parameter object only)
            daoDataType = UNKNOWN_DAO_CODE

        Case adVarWChar:
            ' Null-terminated Unicode character string
            If fieldSize > 255 Then
                daoDataType = dbMemo
            Else
                daoDataType = dbText
            End If
            
        Case adWChar:
            ' Null-terminated Unicode character string (DBTYPE_WSTR)
                        If fieldSize > 255 Then
                daoDataType = dbMemo
            Else
                daoDataType = dbText
            End If
            
        Case Else:
            ' Cannot determine proper DAO datatype
            daoDataType = UNKNOWN_DAO_CODE

    End Select

    GetDaoFieldDataType = daoDataType

End Function


...
Рейтинг: 0 / 0
13.07.2016, 11:02
    #39272883
guest_rusimport
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание таблиц Аксесс из файла с именами таблиц, именами полей, их типами
kanan,
А к чему все эти сложности, может быть просто импортом из вашего mdb в чистый mdb скопировать только структуру таблиц , и всё, и , думаю , будет вам счастье
...
Рейтинг: 0 / 0
13.07.2016, 11:13
    #39272892
kanan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание таблиц Аксесс из файла с именами таблиц, именами полей, их типами
Вся сложность в том что я сейчас занимаюсь переименованием по сути всех объектов 9 их полей) в разделенной рабочей БД Аксесс 2003.
Старые наименования объектов и полей таблиц были длинные, смешанного типа ( кириллица + латиница), имели разные префиксы -т.е. не было четкой системы в наименовании.
далее это хозяйство (таблицы) будет переезжать на MySQL
В БД примерно 1000 (таблиц, запросов, отчетов, форм, модулей) т.е. МНОГО.
...
Рейтинг: 0 / 0
13.07.2016, 13:10
    #39273014
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание таблиц Аксесс из файла с именами таблиц, именами полей, их типами
kananВся сложность в том что я сейчас занимаюсь переименованием по сути всех объектов 9 их полей) в разделенной рабочей БД Аксесс 2003.которая станет не рабочей
...
Рейтинг: 0 / 0
13.07.2016, 13:38
    #39273050
kanan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание таблиц Аксесс из файла с именами таблиц, именами полей, их типами
почему ? И как сделать ее рабочей? У Вас был подобный опыт в переименовывании ? поделитесь?
...
Рейтинг: 0 / 0
13.07.2016, 14:12
    #39273102
ПЕНСИОНЕРКА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание таблиц Аксесс из файла с именами таблиц, именами полей, их типами
kanan,

я бы видимо попробовала запросами в другую базу
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT Таблица_статистика_групп_на_раскрутке.[ид] AS id,
 Таблица_статистика_групп_на_раскрутке.[Дата] AS data,
 Таблица_статистика_групп_на_раскрутке.[Критерий] AS kriterii,
 Таблица_статистика_групп_на_раскрутке.[Парам# №1] AS param1,
 Таблица_статистика_групп_на_раскрутке.[Парам# №2] AS param2,
 Таблица_статистика_групп_на_раскрутке.[Значение] AS znachenie,
 Таблица_статистика_групп_на_раскрутке.[Код_группы_ВК] AS kod_gruppi_bk

 INTO tbl_stat_grupp_na_raskrutke in "c:\temp\wrem.mdb"

FROM Таблица_статистика_групп_на_раскрутке;
...
Рейтинг: 0 / 0
13.07.2016, 14:38
    #39273134
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание таблиц Аксесс из файла с именами таблиц, именами полей, их типами
kanan,
Если нет кода, то Access произведет автозамену имен, если же есть код и в нем ссылки на объекты и поля -получите сообщение о том что объект или поле не найдены (все ссылки придется править в соответствии с новым именем объекта или поля)
...
Рейтинг: 0 / 0
13.07.2016, 15:25
    #39273192
kanan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание таблиц Аксесс из файла с именами таблиц, именами полей, их типами
Есть инструменты:
1. Модуль, который выгружает формы и отчеты в текстовые файлы.
2. Скрипт, который позволяет менять одно имя на другое, причем в скрипте можно прописать сколь угодно много таких замен.
3. процедура, которая выгружает структуру таблицы (всех таблиц одновременно) в один файл (но не все свойства при этом учитываются).
4. Процедура, которая создает заново таблицы (но не все свойства при этом учитываются).

доработка п.3 и п. 4 и есть проблема, который я прошу помочь решить.
...
Рейтинг: 0 / 0
13.07.2016, 15:46
    #39273211
MrShin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание таблиц Аксесс из файла с именами таблиц, именами полей, их типами
kanan,

Любое переименование/удаление в сруктуре базы обычно приводит к полной или частичной неработоспособности приложения. Как правило потом приходится долго выискивать и править руками код. Если бОльшую часть вы можете переименовать через скрипты или специальные утилиты типа Find And Replace , то только руками придется править после полного тестирования куски кода, которые полагаются на соглашения о наименовании, формирующие полное название таблицы или колонки по части названия, а также если названия или части названий хранятся в базе.

Но т.к. вы затеяли переход на серверную базу, все равно достаточно много запросов и кода придется переделывать руками
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Создание таблиц Аксесс из файла с именами таблиц, именами полей, их типами / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]