Это вовсе не проблема, и ее абсолютно можно выполнить, если пояснить, что вы используете один файл MDW.
Для пояснения, что Microsoft Access Workgroup Security - это, по сути, "сеансовая" модель безопасности, котораяприменяется непосредственно к внешнему файлу MDB при его открытии.
В вашем примере командной строки означает, что Microsoft Access откроет файл внешнего интерфейса SAMPLE.MDB
, используя указанный файл рабочей группы.
Как только Microsoft Access открыл SAMPLE.MDB
в этом файле рабочей группы, вы не можете перейти на другой файл рабочей группы в рамках этой «сессии», не закрывая Microsoft Access и не открывая заново в новом файле рабочей группы.
К вашему сведению - этоМожно открыть с помощью кода таблицу в другом MDB, используя другой файл рабочей группы в этом соединении, но таким образом таблицу можно использовать только в коде как RecordSet (например), вы не можете сделать ее связанной таблицей.
В любом случае, вернемся к вашей реальной проблеме.Как связать различный внутренний набор таблиц для каждой компании.
Я бы рекомендовал добавить в вашу таблицу Company
несколько полей, которые определяют имя файла и расположение каждого внутреннего файла.Например:
Обратите внимание, что местом может быть путь UNC или сопоставленный путь диска.Или, может быть, вам не нужно явно определять местоположение в таблице.Возможно, все серверные части находятся в одной папке или в определяемом динамическом месте, например \Dallas\Dallas.mdb
, \NewYork\NewYork.mdb
и т. Д. Если вы можете каким-либо образом определить местоположение каждого серверного модуля, то выхорошо.
Теперь, поскольку у вас, скорее всего, будут «глобальные» интерфейсные таблицы, может быть, также некоторые «глобальные» связанные фоновые таблицы i.e. Common.mdb
и ваши фоновые таблицы для вашей компании, я бырекомендуем иметь внешнюю таблицу, которая определяет имя каждой из таблиц, которые включены только в файлы, относящиеся к конкретной компании.Таким образом, мы можем легко циклически проходить только по этим именам таблиц и вносить изменения в ссылки.
Для кода ссылки, скажем, вы запросилиПользователь, для какой компании он хочет, и вы передаете CompanyID
функции повторного связывания:
Public Function ChangeCompanyLinks(CompanyID As Long) As Boolean
Dim db As DAO.Database
Dim ldb As DAO.Database
Dim tdf As DAO.TableDef
Dim rstCompany As DAO.Recordset
Dim rstTables As DAO.Recordset
Dim mssql As String
Dim dbFullPath As String
Dim retVal As Boolean
Set db = CurrentDb()
retVal = False
mssql = "SELECT * FROM [tblCompany] WHERE [CompanyID] = " & CompanyID
Set rstCompany = db.OpenRecordset(mssql, dbOpenSnapshot)
If Not rstCompany.BOF Then
dbFullPath = rstCompany("DBLocation") & "\" & rstCompany("DBName")
If Dir(dbFullPath) = rstCompany("DBName") Then
'NOTE: By opening a temporary constant link to the back-end during
' relinking, the relinking runs faster
Set ldb = OpenDatabase(dbFullPath)
mssql = "SELECT * FROM [tblLinkedTables] WHERE [FileType] = ""Company"""
Set rstTables = db.OpenRecordset(mssql, dbOpenSnapshot)
Do While Not rstTables.EOF
Set tdf = db.TableDefs(rstTables("TableName"))
tdf.Connect = ";DATABASE=" & dbFullPath
tdf.RefreshLink
rstTables.MoveNext
Loop
rstTables.Close
ldb.Close
retVal = True
Else
MsgBox "Unable to Locate Company File"
End If
End If
rstCompany.Close
ChangeCompanyLinks = retVal
Set rstCompany = Nothing
Set rstTables = Nothing
Set ldb = Nothing
Set tdf = Nothing
db.Close
Set db = Nothing
End Function
Очевидно, что вы захотите добавить обработку ошибок и немного ее настроить в соответствии с вашей ситуацией,но этот код будет повторно связывать указанные таблицы с новым бэкэндом.
Обратите внимание, что если вы в конечном итоге измените использование своих бэкэнд-таблиц в SQL Server (что я настоятельно рекомендую),код ссылки должен быть немного изменен.См. этот ответ для более подробной информации.