-Поиск по дневнику

Поиск сообщений в rss_sql_ru_access_programming

 -Подписка по e-mail

 

 -Постоянные читатели

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 16.03.2006
Записей:
Комментариев:
Написано: 4


Форма теряет свойства Recordset и RecordsetClone

Понедельник, 10 Сентября 2018 г. 11:51 + в цитатник
Форма теряет свойства 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


 

Добавить комментарий:
Текст комментария: смайлики

Проверка орфографии: (найти ошибки)

Прикрепить картинку:

 Переводить URL в ссылку
 Подписаться на комментарии
 Подписать картинку