|
Создать БД, а в ней таблицу (уперся в мелкие шероховатости)
|
|||
---|---|---|---|
#18+
Шероховатости есть в комментах: 1. Окно акцеса мелькает, Visible как-то не сработал... 2. Как счетчик сделать ключом? 3. Как созданное логическое поле оформить с галочкой? Код: 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.
Кто знает, помогите, спасибо заранее... ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2016, 14:52 |
|
Создать БД, а в ней таблицу (уперся в мелкие шероховатости)
|
|||
---|---|---|---|
#18+
Проще по-моему через SQL это сделать. Только лучше использовать ADO, через DAO, например, нельзя создать связь между таблицами с каскадным удалением. Пока это единственное ограничение DAO, с которым я встретился. Апдейчу бэкэнды исключительно SQL скриптами, очень удобно. Под катом моя функция, которой пользуюсь для апдейта. Там есть вызовы других функций, напрямую не заработает, но идея будет понятна. В параметре - путь к файлу со скриптом. '--------------------------------------------------------------------------------------- ' Procedure : UpdateDatabase ' Purpose : Runs SQL script against common database. Returns True if success and false if errors were detected during execution ' Syntax: ' ";" at the end of each command ' "#" - comment, row ignored ' any SQL commands for db.Execute function, by default INSERT, UPDATE, DELETE executed in local DB ' SQL modifiers, word before SQL command: ' LOCAL - execute command in local db ' REMOTE - execute command in remote DB ' Additional commands: ' RUNMACRO <macro name>; - execute macro ' RUNCODE <function_name>; - copy "Update" module to remote DB and execute function <function_name> ' RUNCODEREMOTE <function_name>; - copy "Update" module to remote DB and execute function <function_name> ' RUNCODELOCAL <function_name>; - execute local function <function_name> ' DATAMACRO DISABLE|ENABLE; - disable or enable datamacro (runs SetDatamacroDisabled() function from common library) '--------------------------------------------------------------------------------------- ' Public Function UpdateDatabase(strFileName As String) As Boolean Dim strLine As String Dim strSQL As String Dim bolLineContinued As Boolean Dim dbsRemote As Database ' Dim dbsLocal As Database Dim errLoop As Error Dim bolErr As Boolean Dim bolResult As Boolean Dim strDBFileName As String Dim strMsg As String Dim strFileVerFrom As String Dim strFileVerTo As String Dim strDBVersion As String Dim strName As String Dim oAccess As Access.Application Dim strSqlToRelink As String Dim strTblName As String Dim tdfLocal As TableDef Dim lErrNo As Long Dim strErrDesc As String Dim connLocal As ADODB.Connection Dim connRemote As New ADODB.Connection Dim bolModuleCopied As Boolean Dim Msg As String Dim intLen As Integer Dim strCommand As String On Error GoTo ErrorHandler ' Msg = "Highly recommended to make common database backup before update." & vbNewLine & "Do you want to make backup now?" ' If MsgBox(Msg, vbQuestion + vbYesNo, "Database Backup") = vbYes Then ' cmdBackupBE_Click ' End If bolLineContinued = False strSQL = "" bolErr = False bolResult = True bolModuleCopied = False Open strFileName For Input As #1 'Check format and version Line Input #1, strLine If Left(strLine, 20) = "# PPS DB Update Ver:" Then strFileVerFrom = Mid(strLine, 19, Len(strLine) - InStr(19, strLine, " to ") - 3) strFileVerTo = Mid(strLine, InStr(19, strLine, " to ") + 4) strDBVersion = GetDefaultParam("VersionDBCommon", False) If strDBVersion <> strFileVerFrom Then If MsgBox("File version " & strFileVerTo & " requres database version " & strFileVerFrom & ", current database version " & strDBVersion & ". Do you want continue anyway?", vbExclamation + vbYesNo, "Versions mismatch") = vbNo Then UpdateDatabase = False Exit Function End If End If ElseIf Left(strLine, 25) = "# CPE DB Data Import Ver:" Then strFileVerFrom = Mid(strLine, 27, Len(strLine) - InStr(27, strLine, " to ") - 3) strFileVerTo = Mid(strLine, InStr(24, strLine, " to ") + 4) strDBVersion = GetDefaultParam("VersionDBCommon", False) If strDBVersion <> strFileVerTo Then If MsgBox("File version " & strFileVerTo & " requres database version " & strFileVerTo & ", current database version " & strDBVersion & ". Do you want continue anyway?", vbExclamation + vbYesNo, "Versions mismatch") = vbNo Then UpdateDatabase = False Exit Function End If End If Else MsgBox "File format not recognized, cannot update", vbExclamation, "Error" UpdateDatabase = False Exit Function End If strDBFileName = GetLinkedDBFileName() Set dbsRemote = OpenDatabase(strDBFileName) 'Set dbsLocal = CurrentDb() Set connLocal = CurrentProject.Connection connRemote.Open "Provider = Microsoft.ACE.OLEDB.12.0; data source=" & strDBFileName Me.txtLog = "" AppendText "Updating database: " & strDBFileName AppendText "Used script file: " & strFileName AppendText "Updating database from version " & strFileVerFrom & " to " & strFileVerTo AppendText "Start time: " & Time() & vbNewLine While Not EOF(1) Line Input #1, strLine strLine = Nz(Trim(strLine)) If InStr(strLine, "#") <> 1 Then If (InStrRev(strLine, ";") = Len(strLine)) And (strLine <> "") Then If bolLineContinued Then strSQL = strSQL & " " & strLine Else strSQL = strLine End If strSqlToRelink = "" strSQL = Trim(strSQL) AppendText strSQL DoCmd.Hourglass True strCommand = Left(UCase(strSQL), InStr(strSQL, " ") - 1) Select Case strCommand Case "UPDATE", "INSERT", "DELETE" 'Can be used local table(s) for local database Me.Painting = False ' 'refresh list of tables ' dbsRemote.Close ' Set dbsRemote = OpenDatabase(strDBFileName) ' dbsLocal.Close ' Set dbsLocal = CurrentDb() On Error GoTo ErrorSQL connLocal.Execute strSQL 'dbsLocal.Execute strSQL On Error GoTo ErrorHandler Me.Painting = True Case "LOCAL" 'force local database strSQL = Trim(Mid(strSQL, 7)) Me.Painting = False On Error GoTo ErrorSQL connLocal.Execute strSQL On Error GoTo ErrorHandler Me.Painting = True Case "REMOTE" 'force remote database strSQL = Trim(Mid(strSQL, 8)) Me.Painting = False On Error GoTo ErrorSQL connRemote.Execute strSQL On Error GoTo ErrorHandler Me.Painting = True If InStr(1, UCase(strSQL), "CREATE TABLE") = 1 Then strSqlToRelink = strSQL End If Case "RUNMACRO" 'Run specified macro strName = Trim(Mid(strSQL, 10, Len(strSQL) - 10)) DoCmd.RunMacro strName Case "RUNCODE", "RUNCODEREMOTE", "RUNCODELOCAL" intLen = InStr(1, strSQL, " ") + 1 If intLen >= 9 Then strName = Trim(Mid(strSQL, intLen, Len(strSQL) - intLen)) If Not bolModuleCopied And (strCommand = "RUNCODE" Or strCommand = "RUNCODEREMOTE") Then 'close ADO connection to prevent locking connRemote.Close DoCmd.SetWarnings False DoCmd.CopyObject strDBFileName, , acModule, "Updates" DoCmd.SetWarnings True bolModuleCopied = True connRemote.Open "Provider = Microsoft.ACE.OLEDB.12.0; data source=" & strDBFileName End If If strCommand = "RUNCODELOCAL" Then On Error GoTo ErrorSQL Eval strName On Error GoTo ErrorHandler Else Set oAccess = CreateObject("Access.Application") oAccess.OpenCurrentDatabase strDBFileName On Error GoTo ErrorSQL oAccess.Run strName On Error GoTo ErrorHandler oAccess.CloseCurrentDatabase Set oAccess = Nothing End If End If Case "DATAMACRO" strName = UCase(Trim(Mid(strSQL, 11, Len(strSQL) - 11))) If strName = "DISABLE" Then SetDataMacroDisabled True Else SetDataMacroDisabled False End If Case Else 'Data Definition queries can be executed normally on remote DB only Me.Painting = False On Error GoTo ErrorSQL connRemote.Execute strSQL On Error GoTo ErrorHandler Me.Painting = True If InStr(1, UCase(strSQL), "CREATE TABLE") = 1 Then strSqlToRelink = strSQL End If End Select If strSqlToRelink <> "" Then 'try to relink created table strTblName = GetNameFromSQL(strSQL, 13) AppendText "Trying to re-link table " & strTblName & "..." If IsRemoteTable(dbsRemote, strTblName) Then 'table exists in remote, reconnect or connect If IsLinkedTableExists(strTblName) Then 'exists as local linked, reconnect Set tdfLocal = CurrentDb.TableDefs(strTblName) tdfLocal.Connect = ";Database=" & strDBFileName tdfLocal.RefreshLink AppendText "Table relinked" Else 'table is new, link it If CreateAttachedTable(strTblName, strDBFileName, strTblName) Then AppendText "Linked new table" Else bolErr = True AppendText "Error linking new table" End If End If 'refresh list of tables dbsRemote.Close Set dbsRemote = OpenDatabase(strDBFileName) Else AppendText "Table not found in remote database" End If End If If Not bolErr Then AppendText Time() & " - OK" & vbNewLine Else bolErr = False End If bolLineContinued = False strSQL = "" Else bolLineContinued = True strSQL = strSQL & " " & strLine End If Else AppendText strLine End If Wend ExitSQLError: If bolResult Then strMsg = "Update completed successfully." SetDefaultParam "VersionDBCommon", strFileVerTo, False Else strMsg = "Update completed with errors." End If AppendText strMsg UpdateDatabase = bolResult ExitHere: On Error Resume Next DoCmd.Hourglass False Me.Painting = True Close 1 dbsRemote.Close connLocal.Close connRemote.Close Set connLocal = Nothing Set connRemote = Nothing Set dbsRemote = Nothing 'enable datamacro in any case SetDataMacroDisabled False Exit Function ErrorSQL: DoCmd.Hourglass False bolErr = True bolResult = False lErrNo = Err.Number strErrDesc = Err.Description AppendText vbNewLine & Time() & " - Error " & lErrNo & ": " & strErrDesc & vbNewLine If MsgBox("Error SQL execution " & lErrNo & " (" & strErrDesc & ") in SQL:" & vbNewLine & _ strSQL & vbNewLine & "Continue update?", vbYesNo + vbExclamation + vbMsgBoxHelpButton, "Update error") = vbYes Then Resume Next Else Resume ExitSQLError End If GoTo ExitHere ErrorHandler: DoCmd.Hourglass False bolResult = True Select Case Err Case 0 Resume Next Case 2501 MsgBox "2501!" Resume ExitHere Case Else LogError Err.Number, Err.Description, Erl, "UpdateDatabase", "Form_frm_DatabaseMaintenance" Resume ExitHere End Select End Function ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2016, 15:32 |
|
Создать БД, а в ней таблицу (уперся в мелкие шероховатости)
|
|||
---|---|---|---|
#18+
vmagне помогает, окно всё равно мелькает А за каким хреном используется CreateObject? сделай Код: vbnet 1.
vmagчто нужно добавить, чтобы стало не только счетчиком, но и ключом ?? Счётчик - это свойство поля. Ключ - это наличие индекса. Создай в структуре первичный индекс - используемое им поле (или комбинация полей) станет ключом. vmagкак сделать чтоб визуально маячила галочка? Что не делай с полем - это никак не повлияет на то, как (какая-то) программа (где-то) будет его отображать. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2016, 15:44 |
|
Создать БД, а в ней таблицу (уперся в мелкие шероховатости)
|
|||
---|---|---|---|
#18+
vmag Код: vbnet 1. 2. 3. 4. 5. 6.
vmag Код: vbnet 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2016, 16:13 |
|
Создать БД, а в ней таблицу (уперся в мелкие шероховатости)
|
|||
---|---|---|---|
#18+
Ошибка (с планшета набираю, простите...) Код: vbnet 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2016, 16:17 |
|
Создать БД, а в ней таблицу (уперся в мелкие шероховатости)
|
|||
---|---|---|---|
#18+
__MichelleОшибка (с планшета набираю, простите...) Да это (Idx) я сразу вычислил... счетчик стал ключом на УРА... Уже СПАСИБО! Тут С первой подсказкой че-то не выходит fld.Properties.Append Prp - недопустимая операция... пока колдую с аналогичной версией Dim Prp As Property, с Variant тоже не прокатило, думаю последовательность строк не так ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2016, 16:47 |
|
Создать БД, а в ней таблицу (уперся в мелкие шероховатости)
|
|||
---|---|---|---|
#18+
vmag, Там, наверное, после tdf.Fields.Append fld нужно еще tdf.Fields.Refresh. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2016, 16:53 |
|
Создать БД, а в ней таблицу (уперся в мелкие шероховатости)
|
|||
---|---|---|---|
#18+
Сейчас проверила на практике - создание нового логического поля, флажок. Все прекрасно получилось. А какая еще может быть последовательность? Создание объекта -> Добавление объекта в коллекцию -> Обновление коллекции -> Создание свойства объекта -> Добавление в семейство свойств объекта -> Обновление семейства свойств объекта ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2016, 17:04 |
|
Создать БД, а в ней таблицу (уперся в мелкие шероховатости)
|
|||
---|---|---|---|
#18+
по 3.2 Код: vbnet 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2016, 17:15 |
|
Создать БД, а в ней таблицу (уперся в мелкие шероховатости)
|
|||
---|---|---|---|
#18+
Predeclared, Спасибо! После формирования всей таблицы, перебор свойств заработал... добавил еще Да/Нет Код: 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.
Спасибо!!!!! : __Michelle, Predeclared, Akina (до моргает не добрался, нужно убегать...) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2016, 17:50 |
|
Создать БД, а в ней таблицу (уперся в мелкие шероховатости)
|
|||
---|---|---|---|
#18+
vmag, оно, конечно, антересно - поколдовать, пошаманить, поволшебничать... особо, когда все получается и срастается вроде... Но вот читаю-слежу, и не могу ответить на вопрос - а пуркуа? Ну, в упор я не вижу куда _практически_ можно и _нужно_ было бы прикрутить этого монстра... не могу даже нафантазировать ничего, кроме "Вот так хочу!". Я чой-то подобное городил в свое время... отказался, плюнул, растер и забыл. Создал ручками внимательно заготовку в нужной мне версии акса. Вылизал все необходимые таблички. Тщательно их задокументировал (все комменты к полям и пр.). Создал служебную табличку для учета внесенных в изначальную заготовку изменений. Сдекомпилил, сжал. Осталось только скопировать заготовку куда надо и разрулить по месту внятное перименование, если таковое будет необходимо. А это недоразумение ты сопровождать лишь застрелишься... один контроль версий - каким кодом нагорожена очередная БД... . ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2016, 18:19 |
|
Создать БД, а в ней таблицу (уперся в мелкие шероховатости)
|
|||
---|---|---|---|
#18+
vmag Код: vbnet 1.
А почему не определяешь переменные конкретными типами? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2016, 18:33 |
|
Создать БД, а в ней таблицу (уперся в мелкие шероховатости)
|
|||
---|---|---|---|
#18+
капча-еду-я-не-роботНо вот читаю-слежу, и не могу ответить на вопрос - а пуркуа? Ну, в упор я не вижу куда _практически_ можно и _нужно_ было бы прикрутить этого монстра... не могу даже нафантазировать ничего, кроме "Вот так хочу!". Сам всегда делаю заготовки и включаю в установщик, но вот в этот раз решил именно так по следующим причинам: 1. Были случаи когда юзеры (от нех...й делать) просто удаляли шаблоны из каталога программы (типа это лишнее), потом замучаешься искать концы. 2. Сейчас нужно под один и тот же функционал подставлять разные наборы исходных данных в формате одной никогда не меняющейся таблицы (структуры), вот и вынес эту таблицу в отдельную бд (буду линковать) Алгоритм работы будет примерно такой: - Заполнили пустую таблицу (около 30 000 записей) работаем пару месяцев - потом нужно перейти на пустую структуру (старую законсервировать), заполнить, поработать - потом нужно вернуться на опять на неизменную первую, поработать - потом нужно скрестить первую и вторую, удалить не нужное и получить третью версию - и таких вариаций море, но требования одни - должно быть всё быстро и не мешать между собой варианты Да филе копи из шаблона проще, но см. п.1 + я так еще не делал (видно по теме сразу) Решение делать так обычно вытекает из конкретной задачи - просто так придумать пуркуа действительно трудно... ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2016, 18:46 |
|
Создать БД, а в ней таблицу (уперся в мелкие шероховатости)
|
|||
---|---|---|---|
#18+
vmag, * 1. Были случаи когда юзеры [...] - Удаляли command.com? Ну, не серьезно это... Да и рублем наказывается легко... * 2. Сейчас нужно [...] - Очень-очень похоже на мою задачу. Мне приходится в последующей аналитике одновременно обращаться к базам, созданным в разных форматах (версиях шаблона). И вот на этом этапе требуется разный код, чтобы в итоге они были представлены одинаково. Основная-то задача, получается, не создать базу автоматом, а потом, время спустя, отличить одну версию от другой _автоматом_. И не запутаться... Так что - думай, крокодил, думай... _ttps://www.youtube.com/watch?v=gqvCS2ZQo7Q&feature=youtu.be&t=3m1s . ... |
|||
:
Нравится:
Не нравится:
|
|||
03.06.2016, 20:34 |
|
Создать БД, а в ней таблицу (уперся в мелкие шероховатости)
|
|||
---|---|---|---|
#18+
AkinaА почему не определяешь переменные конкретными типами? Вообще позднее связывание - более правильный подход с точки зрения надежности работы на разных компьютерах. Разрабатывать, естественно, гораздо удобнее с ранним связыванием, добавляя в список референсов нужную библиотеку, но вот при переносе на другой комп, там может оказаться, что библиотека другой версии и для нормальной работы пользователю нужно будет лезть в диалог с референсами, что не есть гуд. Поэтому лучше всего разрабатывать, объявив типизированную переменную, чтобы работал intellisence, а в продакшн выпускать с поздним связыванием. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2016, 12:08 |
|
Создать БД, а в ней таблицу (уперся в мелкие шероховатости)
|
|||
---|---|---|---|
#18+
vmag1. Были случаи когда юзеры (от нех...й делать) просто удаляли шаблоны из каталога программы (типа это лишнее), потом замучаешься искать концы. 2. Сейчас нужно под один и тот же функционал подставлять разные наборы исходных данных в формате одной никогда не меняющейся таблицы (структуры), вот и вынес эту таблицу в отдельную бд (буду линковать) Т.е. задача - всего лишь периодически создавать новую базу с заданной таблицей? Я поддержу вопрос капчи насчет пуркуа па. По-моему гораздо проще сделать пустую таблицу в качестве шаблона в основном приложении, при необходимости создать очередную копию нужно просто создать новый файл, как уже сделано и скопировать туда таблицу-шаблон под требуемым именем через CopyObject: Код: vbnet 1.
А тут какая-то сборка на ассеблере получается, поддерживать такое решение сложно, менять шаблон тоже. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.06.2016, 12:17 |
|
|
start [/forum/topic.php?fid=45&msg=39250287&tid=1613511]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
44ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
others: | 352ms |
total: | 502ms |
0 / 0 |