Форма теряет свойства
Recordset и
RecordsetCloneУ меня есть маленькая программка (модуль), которая облегчает подключение таблиц из других баз Access. Всё было хорошо до тех пор пока не пришлось работать с базами, закрытыми паролем.
Для демонстрации проблемы я сделал пример: сама база с программой и две базы с таблицами, одна - с паролем, другая - без
Программка состоит из 3 форм, 3 запросов, 3 таблиц. 3 модулей.
Основная форма -
frmSystemBases. При её запуске высвечивается сформированный список баз для подключения.
Внизу есть поле "Путь к базе". Для изменения пути справа от поля есть специальная кнопка.
Установите пути под Ваше размещение файлов баз.
Справа от поля с описанием базы находится чекбокс, который показывает, произведено подключение базы или нет, и две кнопки для подключения и отключения таблиц. После выполнения действий с таблицами вызывается подпрограмма
subBookmark которая находится в
Module1. Она обновляет информацию на форме (типа Requery) и устанавливает указатель на ту запись, где он был до этого. Для этого используется свойство формы
Recordset.
Но как только Вы попробуете подключить запароленные таблицы, то подпрограмма
subBookmark вылетает по ошибке
Error 3420 - недопустимый объект или объект более не задан
При просмотре под отладчиком оказывается что форма
frmSystemBases теряет свои свойства
Recordset и
RecordsetClone. Они становятся неопределёнными.
Сами таблицы подключаются. Я думаю, что всё дело в подпрограмме подключения таблиц.
Подключение таблицы незапероленной базы
'---------------------------------------------------------------------------------------
' Procedure : SetTableRefBaseFull
' DateTime : 22.01.2007 14:54
' Author : DSonnyh
' Purpose : Подключение таблиц с полной проверкой существования таблиц
'---------------------------------------------------------------------------------------
'
Public Sub SetTableRefBaseFull(TName As String, NewTName As String, strBase As String)
On Error GoTo SetTableRefBaseFull_Error
Dim strCurrentDB As String
strCurrentDB = CurrentProject.FullName
' проверка наличия таблицы в подключаемой базе
If IsTable(TName, strBase) = 1 Then
' проверка наличия таблицы в текущей базе
If IsTable(NewTName, strCurrentDB) <> 1 Then
DoCmd.TransferDatabase acLink, "Microsoft Access", _
strBase, acTable, TName, NewTName, False, False
Else
Call MsgBox("В базе " & strCurrentDB _
& vbCrLf & "уже существует таблица " & NewTName _
& vbCrLf & "Подключение данной таблицы не проведено!" _
, vbExclamation, "Подключение таблиц")
End If
Else
Call MsgBox("В базе " & strBase _
& vbCrLf & "отсутствует таблица " & TName _
& vbCrLf & "Подключение данной таблицы не проведено!" _
, vbExclamation, "Подключение таблиц")
End If
On Error GoTo 0
Exit_SetTableRefBaseFull:
Exit Sub
SetTableRefBaseFull_Error:
MsgBox "Ошибка " & Err.Number & " (" & Err.Description & ") в процедуре SetTableRefBaseFull в Module modConnect"
Resume Exit_SetTableRefBaseFull
End Sub
Подключение таблицы незапероленной базы
'---------------------------------------------------------------------------------------
' Procedure : SetTableRefBasePassFull
' DateTime : 07.09.2018 14:54
' Author : DSonnyh
' Purpose : Подключение запароленных таблиц с полной проверкой существования таблиц
'---------------------------------------------------------------------------------------
'
Public Sub SetTableRefBasePassFull(TName As String, NewTName As String, _
strBase As String, strPassword As String)
On Error GoTo SetTableRefBasePassFull_Error
Dim strCurrentDB As String
strCurrentDB = CurrentProject.FullName
Dim db As DAO.Database
Dim wRs1 As DAO.Workspace
Set wRs1 = DBEngine.Workspaces(0)
Set db = wRs1.OpenDatabase(strBase, False, False, ";PWD=" & strPassword)
' проверка наличия таблицы в подключаемой базе
If IsTable(TName, strBase) = 1 Then
' проверка наличия таблицы в текущей базе
If IsTable(NewTName, strCurrentDB) <> 1 Then
DoCmd.TransferDatabase acLink, "Microsoft Access", _
"" & db.Name & "", acTable, TName, NewTName, False, False
Else
Call MsgBox("В базе " & strCurrentDB _
& vbCrLf & "уже существует таблица " & NewTName _
& vbCrLf & "Подключение данной таблицы не проведено!" _
, vbExclamation, "Подключение таблиц")
End If
Else
Call MsgBox("В базе " & strBase _
& vbCrLf & "отсутствует таблица " & TName _
& vbCrLf & "Подключение данной таблицы не проведено!" _
, vbExclamation, "Подключение таблиц")
End If
db.Close
wRs1.Close
Set db = Nothing
Set wRs1 = Nothing
On Error GoTo 0
Exit_SetTableRefBasePassFull:
Exit Sub
SetTableRefBasePassFull_Error:
MsgBox "Ошибка " & Err.Number & " (" & Err.Description & ") в процедуре SetTableRefBaseFull в Module modConnect"
Resume Exit_SetTableRefBasePassFull
End Sub
Для подключения запароленных таблиц мне приходится создавать рабочую область и открывать в ней запароленную базу. Возможно здесь что-то и портится.
Может кто-то что-то посоветует?
-------------------------------------------------------------
А ты вложил уже свой кровный рубль в 50-ти миллиардное состояние Билла Гейтса?
http://www.sql.ru/forum/1302222/forma-teryaet-svoystva-recordset-i-recordsetclone