|
|||||||
CreateDataBase
Время создания: 16.03.2019 23:43
Текстовые метки: CreateDataBase, DataBase, Db
Раздел: Разные закладки - VBA - Access - CreateDataBase
Запись: xintrea/mytetra_db_adgaver_new/master/base/1513062550fhe8734ntw/text.html на raw.githubusercontent.com
|
|||||||
|
|||||||
m_CreateDataBase 'Option Compare Database 'http://msa.polarcom.ru/st/s0000353.htm 'Программное создание базы данных (ADO) _ С помощью ADO можно легко изменять структуру данных. Для создания и изменения таблиц, _ запросов и других объектов данных, например индексов, следует использовать специальную библиотеку ADO, _ называемую ADOx. Перед использованием ADOx необходимо установить ссылку на библиотеку _ Microsoft ADO Ext. 2.1 For DDL and Security, выполнив команды меню Tools | References (Сервис | Ссылки) в VBE. _ Если ссылка установлена, ADOx готов к использованию. _ При использовании ADOx все операции так или иначе связаны с объектом Catalog. _ Этот объект представляет базу данных. Работая в Access, необходимо всего лишь _ присвоить свойству ActiveConnection объекта Catalog допустимое значение, соответствующее _ объекту ADO Command, с которого начинается выполнение. _ 'Создание базы данных _ Для создания с помощью ADOx новой пустой базы данных необходимо использовать метод _ Create объекта Catalog, передав ему значение, содержащее путь и имя создаваемой базы данных. Sub CreateDataBaseADO(ByVal strDate As String) Dim oDb As DAO.Database ' бд, в которой будет создаваться таблица Dim strTblName As String: strTblName = "Старение_авто" Dim strDateSQL As String 'Stop ' newDB = ThisWorkbook.Path & "\Старение_авто.mdb" newDB = ThisWorkbook.Path & "\Старение_авто.accdb" 'newDB = Left(newDB, Len(newDB) - 4) & "_New.mdb" 'On Error GoTo x: 'Kill newDB 'x: If Len(Dir(newDB, 16)) = 0 Then 'если база отсутствует MsgBox "База данных не обнаружена!" & vbCrLf & "Будет создана новая. " & _ vbCrLf & "Посмотрите предыдущие версии и восстановите." & _ vbCrLf & "После восстановления, внесите данные повторно", 48, "Внимание"
Создать_базу = FnCreateDataBaseADO(newDB) Set oDb = OpenDatabase(newDB)
Создать_таблицу = FnCreateTblInDB(oDb, strTblName) ' Set oDb = Nothing Else
Set oDb = OpenDatabase(newDB) End If '''' выбор интервала дат '' ' Удалить_даты '' Set oDb = OpenDatabase(newDB) '' таблица = IsTablePresent(oDb, strTblName) ' Dim dDate As Date: dDate = Format(Now, "DD.MM.YYYY") ' Dim strDate As String:
' Удалить_даты = FnAllRecordsInRecordset(oDb, strTblName, 0, dDate) 'удаление записей strDateSQL = FnDatePi(strDate) 'DELETE Старение_авто.*, Старение_авто.Дата From Старение_авто WHERE (((Старение_авто.Дата)=#11/23/2017#)); ' strSQL = "DELETE " & strTblName & ".*, " & strTblName & ".Дата From Старение_авто WHERE (((Старение_авто.Дата)=#" & strDate & "#));" strSQL = "DELETE " & strTblName & ".*, " & strTblName & ".Дата From " & strTblName & " WHERE (((" & strTblName & ".Дата) Between #" & strDateSQL & "# And #" & strDateSQL & "#));" ' Debug.Print strSQL oDb.Execute strSQL 'добавляем записи With ThisWorkbook 'СКИНУТЬ ФИЛЬТР iNbTemp = FnFindiRowINCln("Config", "Стартовая_строка", 1) iNbRowStart = ThisWorkbook.Sheets("Config").Cells(iNbTemp, 2).value Фильтр = FnFiltersSheet(ThisWorkbook.Sheets("Анкур"), iNbRowStart, 1)
With .Sheets("Анкур") iNbRowEnd = .Columns(1).Rows(65536).End(xlUp).Row iNbClnEnd = .Cells(iNbRowStart, 256).End(xlToLeft).Column vData = Range(.Cells(iNbRowStart + 1, 1), .Cells(iNbRowEnd, iNbClnEnd)).value End With End With InsertToTable newDB, vData, strDate End Sub '================================================================================ '### Преобразует дату в басурманский формат Function FnDatePi(ByVal strDate As String) As String ' m = Split(strDate, "/", -1, vbBinaryCompare) m = Split(strDate, ".", -1, vbBinaryCompare) ' If Len(m(0)) = 1 Then m(0) = "0" & m(0) ' If Len(m(1)) = 1 Then m(1) = "0" & m(1) If Left(m(0), 1) = 0 Then m(0) = Right(m(0), Len(m(0) - 1)) If Left(m(1), 1) = 0 Then m(1) = Right(m(1), Len(m(1) - 1)) FnDatePi = m(1) & "/" & m(0) & "/" & m(2) End Function '================================================================================ 'Перебор всех записей (DAO) для удаления 'strTblName - имя таблицы 'iNbFld - номер столбца для проверки 'vValue - запись для удаления Function FnAllRecordsInRecordset(ByVal oDb As DAO.Database, _ ByVal strTblName As String, _ ByVal iNbFld As Integer, _ ByVal vValue As Variant) As Variant 'Перебор всех записей в наборе Dim rst As DAO.Recordset, i As Long Dim dDateCheck As Date On Error GoTo AllRecordsInRecordsetErr
'Set rst = CurrentDb.OpenRecordset("tblExample", dbOpenDynaset) 'Открытие на редакцию Set rst = oDb.OpenRecordset(strTblName, dbOpenSnapshot) 'Только просмотр i = 1 With rst Do Until .EOF = True 'Цикл до конца таблицы ' Debug.Print Format(!exRecordID, "00000") & " - " & !exName dDateCheck = Format(rst.Fields(0).value, "DD.MM.YYYY") If vValue = dDateCheck Then Debug.Print i & ": " & rst.Fields(iNbFld).value & " - " & rst.Fields(1).value '... '...операции с записью .MoveNext i = i + 1 Loop End With AllRecordsInRecordsetEnd: On Error Resume Next rst.Close Set rst = Nothing Exit Function
AllRecordsInRecordsetErr: MsgBox "Процедура [...] привела к ошибке:" & vbCrLf & _ Err.Description & vbCrLf & " Err#" & Err.Number, vbCritical Resume AllRecordsInRecordsetEnd End Function '================================================================================ 'Проверка на наличие таблицы в текущей базе данных Public Function IsTablePresent(ByVal oDb As DAO.Database, _ ByVal strTableName As String) As Boolean 'es - 13.06.2013 'Проверка на наличие таблицы в текущей базе данных ' Если таблица существует - вернет True (Истина = -1) ' В остальных случаях: False '-------------------------------------------------------------------- Dim i As Integer On Error GoTo IsTablePresent_Err ' Пытаемся посчитать кол-во полей в заданной таблице i = oDb.TableDefs(strTableName).Fields.Count
' Если поля есть - значит и таблица существует (что вполне логично) If i > 0 Then IsTablePresent = True IsTablePresent_Bye: Exit Function IsTablePresent_Err: 'Болок [Select Case] ниже в принцие не нужен - так ... на всякий случай Select Case Err.Number Case 3265 ' Ошибка обращения к обьекту (т.е. НЕТ таблицы) Case Else 'MsgBox "Error " & Err.Number & vbCrLf & Err.Description & vbCrLf & _ "in procedure IsTablePresent", vbCritical, "Error!" End Select Resume IsTablePresent_Bye End Function '================================================================================ 'добавляем записи Function InsertToTable(ByVal strDb As String, _ ByVal vData As Variant, _ ByVal dDate As Date) ' Const lastRow = 400000, lastCol = 15 Dim ilastRow As Long: ilastRow = UBound(vData) Dim ilastCol As Long: ilastCol = UBound(vData, 2) ' Dim pCon As New ADODB.Connection, pRSet As New ADODB.Recordset Dim pCon As New ADODB.Connection, pRSet As New ADODB.Recordset ' Dim vData As Variant Dim k As Long, t As Single, i As Long t = Timer: k = 0 pCon.CursorLocation = adUseClient ' pCon.Open "DBQ=c:\Projects\Database2 min.accdb;Driver={Microsoft Access Driver (*.mdb, *.accdb)};DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;ReadOnly=0;ExtendedAnsiSQL=1;" pCon.Open "DBQ=" & strDb & ";Driver={Microsoft Access Driver (*.mdb, *.accdb)};DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;ReadOnly=0;ExtendedAnsiSQL=1;" pRSet.CursorLocation = adUseClient: pRSet.CursorType = adOpenStatic ' pRSet.Open "Select * From " & "Старение_авто" & " Where FLong1 Is Null", pCon, adOpenStatic, adLockOptimistic pRSet.Open "Select * From " & "Старение_авто", pCon, adOpenStatic, adLockOptimistic '' vData = Range("A2").Resize(lastRow, lastCol).value ' vData = Range("A11:O211").value
pCon.BeginTrans For i = 1 To ilastRow k = k + 1 If (k Mod 10000) = 0 Then Debug.Print k: DoEvents pRSet.AddNew
pRSet(0).value = dDate 'Format(Now, "DD.MM.YYYY")
pRSet(1).value = vData(i, 1) pRSet(2).value = vData(i, 2) pRSet(3).value = vData(i, 3) pRSet(4).value = vData(i, 4) pRSet(5).value = vData(i, 5) pRSet(6).value = vData(i, 6) ' pRSet(7).value = vData(i, 7) pRSet(8).value = vData(i, 8) pRSet(9).value = vData(i, 9) pRSet(10).value = vData(i, 10) pRSet(11).value = vData(i, 11) pRSet(12).value = vData(i, 12) pRSet(13).value = vData(i, 13) pRSet(14).value = vData(i, 14) pRSet(15).value = vData(i, 15) Next pRSet.UpdateBatch: pCon.CommitTrans pRSet.Close: pCon.Close
Debug.Print Timer - t 'MsgBox; Timer - t End Function '================================================================= 'Создаем новую базу http://msa.polarcom.ru/st/s0000353.htm Function FnCreateDataBaseADO(ByVal newDB As String) As Boolean ''Данная процедура создает новую базу данных с использованием возможностей ADOx. ''По материалам книги "Microsoft Access 2000 Development Unleashed" издательства SAMS ''Авторы: Forte, Howe, Ralston ''Объект Catalog в ADOx Dim cat As ADOX.Catalog Err.Clear ' On Error GoTo Proc_Err Set cat = New ADOX.Catalog cat.Create "provider=Microsoft.JET.OLEDB.4.0;data source=" & newDB ' MsgBox "Database Created!", vblnformation
If Len(Err.Description) = 0 Then FnCreateDataBaseADO = True 'Proc_Exit: 'Exit Function ' 'Proc_Err: ' MsgBox Err.Description ' Resume Proc_Exit End Function ''Перед использованием ADOx необходимо установить ссылку на библиотеку _ Microsoft ADO Ext. 2.1 For DDL and Security, _ выполнив команды меню Tools | References (Сервис | Ссылки) в VBE. '================================================================= 'Создаем таблицу в базе Function FnCreateTblInDB(ByVal oDb As DAO.Database, _ ByVal strTblName As String) As Boolean Dim Tbl As TableDef ' создаваемая таблица Dim oFld As Field On Error Resume Next Err.Clear Set oTbl = oDb.CreateTableDef(strTblName) For i = 1 To 16 Select Case i Case 1: Set oFld = oTbl.CreateField("Дата", 8) Case 2: Set oFld = oTbl.CreateField("ПЖИ", 10, 12) Case 3: Set oFld = oTbl.CreateField("Зона", 10, 4): oFld.AllowZeroLength = True 'пустые строки Case 4: Set oFld = oTbl.CreateField("Дата_ТСМ", 8) Case 5: Set oFld = oTbl.CreateField("Цвет", 10, 5): oFld.AllowZeroLength = True Case 6: Set oFld = oTbl.CreateField("Тип", 10, 10): oFld.AllowZeroLength = True Case 7: Set oFld = oTbl.CreateField("Dept", 10, 10): oFld.AllowZeroLength = True Case 8: Set oFld = oTbl.CreateField("Критерий", 3) Case 9: Set oFld = oTbl.CreateField("Описание", 10, 250): oFld.AllowZeroLength = True Case 10: Set oFld = oTbl.CreateField("Место", 10, 10): oFld.AllowZeroLength = True Case 11: Set oFld = oTbl.CreateField("ФИО", 10, 250): oFld.AllowZeroLength = True Case 12: Set oFld = oTbl.CreateField("Дата_MADU", 8) Case 13: Set oFld = oTbl.CreateField("Текущая_зона", 10, 50): oFld.AllowZeroLength = True Case 14: Set oFld = oTbl.CreateField("Группа", 10, 50): oFld.AllowZeroLength = True Case 15: Set oFld = oTbl.CreateField("Проверка_344", 3) Case 16: Set oFld = oTbl.CreateField("CLES", 3) End Select
oTbl.Fields.Append oFld Next i ' добавляю таблицу oDb.TableDefs.Append oTbl ' обновляю данные о таблицах oDb.TableDefs.Refresh
Set oDb = Nothing
If Len(Err.Description) = 0 Then FnCreateTblInDB = True End Function |
|||||||
Так же в этом разделе:
|
|||||||
|
|||||||
|