Циклическое переключение по таблице Def и удаление - PullRequest
0 голосов
/ 08 октября 2018

У меня есть подпрограмма, которая выполняется на локальной копии базы данных и хранящегося в сети мастера.

Чтобы разрешить пользователям запускать мою надстройку Excel в автономном режиме, я создаю локальную версию с той же таблицейимена в качестве основного, но только с соответствующими полями.

Первый подпункт не выдает никаких ошибок, однако, когда я просматривал локальную базу данных, чтобы убедиться, что таблицы были удалены и созданы заново, только 2 из 4 таблиц былибудучи удаленным.

Я разработал обходной путь, но я хотел бы знать, есть ли что-то, что я пропустил или сделал неправильно, или это просто причуда работы с базами данных Access через DAO?

First Sub (удаляет только 2 таблицы вместо всех 4):

Sub gUpdateDBTables()
    Dim DBPath As String
    Dim sSQL_Table1 As String
    Dim sSQL_Table2 As String
    Dim sSQL_Table3 As String
    Dim sSQL_Table4 As String
    Dim DB As DAO.Database
    Dim DB2 As DAO.Database
    Dim tblDef As DAO.TableDef
        'Get DB File Locations From Registry
        LocalDBPath = Interaction.GetSetting("Tools", "Settings\FileInfo", "Local_DB_Location")
        DBPath = Interaction.GetSetting("Tools", "Settings\FileInfo", "DB_Location")
        'Set SQL statements
        sSQL_Table1 = "SELECT Table1.Field1, Table1.Field2, Table1.Field3, Table1.Field4, Table1.Field INTO Table1 IN '" & LocalDBPath & "' FROM Table1 WHERE (((Table1.Field1)='1') AND ((Table1.Field4)='A' Or (Table1.Field4)='T')) OR (((Table1.Field1)='1' Or (Table1.Field1)='20'));"
        sSQL_Table2 = "SELECT Table2.Field1, Table2.Field2, Table2.Field3, Table2.Field4, Table2.Field5, Table2.Field6, Table2.Field7, Table2.Field8 INTO Table2 IN '" & LocalDBPath & "' FROM Table2 WHERE (((Table2.Field4)=99999) AND ((Table2.Field6)='1' Or (Table2.Field6)='20'));"
        sSQL_Table3 = "SELECT Table3.Field1, Table3.Field2, Table3.Field3, Table3.Field4, Table3.Field5, Table3.Field6, Table3.Field7, Table3.Field8, Table3.Field9, Table3.Field10, Table3.Field11, Table3.Field12 INTO Table3 IN '" & LocalDBPath & "' FROM Table3 WHERE (((Table3.Field1)='1' Or (Table3.Field1)='20') AND ((Table3.Field12)=0 Or (Table3.Field12)=99999));"
        sSQL_Table4 = "SELECT Table4.Field1, Table4.Field2, Table4.Field3, Table4.Field4, Table4.Field5, Table4.Field6, Table4.Field7, Table4.Field8 INTO Table4 IN '" & LocalDBPath & "' FROM Table4 WHERE (((Table4.Field8)='1' Or (Table4.Field8)='20'));"
        'Open Local DB and Cycle Through Table Definitions and Delete as Needed
        Set DB = OpenDatabase(LocalDBPath, False, False)
        For Each tblDef In DB.TableDefs
            Select Case tblDef.Name
                Case "Table1`"
                    DB.TableDefs.Delete ("Table1")
                Case "Table2"
                    DB.TableDefs.Delete ("Table2")
                Case "Table3"
                    DB.TableDefs.Delete ("Table3")
                Case "Table4"
                    DB.TableDefs.Delete ("Table4")
            End Select
        Next tblDef
        DB.Close
        'Open Networked Database and Process SQL Statements To Refresh Table Data in Local DB File
        Set DB2 = OpenDatabase(DBPath, True, False)
        With DB2
            .Execute sSQL_Table1
            .Execute sSQL_Table2
            .Execute sSQL_Table3
            .Execute sSQL_Table4
        End With
        DB2.Close
        Set DB = Nothing
        Set DB2 = Nothing
End Sub

Second Sub (обходное решение):

Sub gUpdateDBTables()
    Dim DBPath As String
    Dim sSQL_Table1 As String
    Dim sSQL_Table2 As String
    Dim sSQL_Table3 As String
    Dim sSQL_Table4 As String
    Dim delTbl1 As Boolean
    Dim delTbl2 As Boolean
    Dim delTbl3 As Boolean
    Dim delTbl4 As Boolean
    Dim DB As DAO.Database
    Dim DB2 As DAO.Database
    Dim tblDef As DAO.TableDef
        'Get DB File Locations From Registry
        LocalDBPath = Interaction.GetSetting("Tools", "Settings\FileInfo", "Local_DB_Location")
        DBPath = Interaction.GetSetting("Tools", "Settings\FileInfo", "DB_Location")
        'Set SQL statements
        sSQL_Table1 = "SELECT Table1.Field1, Table1.Field2, Table1.Field3, Table1.Field4, Table1.Field INTO Table1 IN '" & LocalDBPath & "' FROM Table1 WHERE (((Table1.Field1)='1') AND ((Table1.Field4)='A' Or (Table1.Field4)='T')) OR (((Table1.Field1)='1' Or (Table1.Field1)='20'));"
        sSQL_Table2 = "SELECT Table2.Field1, Table2.Field2, Table2.Field3, Table2.Field4, Table2.Field5, Table2.Field6, Table2.Field7, Table2.Field8 INTO Table2 IN '" & LocalDBPath & "' FROM Table2 WHERE (((Table2.Field4)=99999) AND ((Table2.Field6)='1' Or (Table2.Field6)='20'));"
        sSQL_Table3 = "SELECT Table3.Field1, Table3.Field2, Table3.Field3, Table3.Field4, Table3.Field5, Table3.Field6, Table3.Field7, Table3.Field8, Table3.Field9, Table3.Field10, Table3.Field11, Table3.Field12 INTO Table3 IN '" & LocalDBPath & "' FROM Table3 WHERE (((Table3.Field1)='1' Or (Table3.Field1)='20') AND ((Table3.Field12)=0 Or (Table3.Field12)=99999));"
        sSQL_Table4 = "SELECT Table4.Field1, Table4.Field2, Table4.Field3, Table4.Field4, Table4.Field5, Table4.Field6, Table4.Field7, Table4.Field8 INTO Table4 IN '" & LocalDBPath & "' FROM Table4 WHERE (((Table4.Field8)='1' Or (Table4.Field8)='20'));"
        'Open Local DB and Cycle Through Table Definitions and Delete as Needed
        Set DB = OpenDatabase(LocalDBPath, False, False)
        For Each tblDef In DB.TableDefs
            If tblDef.Name = "Table1" Then delTbl1 = True
            If tblDef.Name = "Table2" Then delTbl2 = True
            If tblDef.Name = "Table3" Then delTbl3 = True
            If tblDef.Name = "Table4" Then delTbl4 = True
        Next tblDef
        If delTbl1 = True Then DB.TableDefs.Delete ("Table1")
        If delTbl2 = True Then DB.TableDefs.Delete ("Table2")
        If delTbl3 = True Then DB.TableDefs.Delete ("Table3")
        If delTbl4 = True Then DB.TableDefs.Delete ("Table4")
        DB.Close
        'Open Networked Database and Process SQL Statements To Refresh Table Data in Local DB File
        Set DB2 = OpenDatabase(DBPath, True, False)
        With DB2
            .Execute sSQL_Table1
            .Execute sSQL_Table2
            .Execute sSQL_Table3
            .Execute sSQL_Table4
        End With
        DB2.Close
        Set DB = Nothing
        Set DB2 = Nothing
End Sub

1 Ответ

0 голосов
/ 09 октября 2018

Вы часто получаете странные результаты при циклическом просмотре коллекции и удалении / добавлении элементов.Ваш второй подход избегает этого, как если бы он проходил в обратном порядке по нумерации всей коллекции, например

For x = DB.TableDefs.Count to 1 Step -1
    'Check DB.TableDefs(x)
Next x

В качестве альтернативы просто попробуйте удалить каждое определение и игнорировать любые ошибки:

Dim arrTD, td
arrTD = Array("Table1","Table2","Table3","Table4")
For Each td in arrTD
    On Error Resume Next
    DB.TableDefs.Delete td
    On Error Goto 0
Next td 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...