Закрытие объекта DAO.DBEngine.Workspaces(0)

Nebo
Дата: 04.12.2009 05:09:36
Вызываю функцию. В ней открываю объект wrkCurrent
Далее идёт транзакция.

Мне вот что непонятно.
Когда закрываю wrkCurrent,

    wrkCurrent.Close
    Set wrkCurrent = Nothing

то потом, после завершения функции и возврата в основную процедуру открытые рекордсеты в ней отваливаются.
Я так понял, что wrkCurrent закрывать не нужно (тогда всё нормально работает). Так? А почему?

wrkCurrent ссылается на текущую рабочую область.
Получается что, нельзя делать wrkCurrent.Close?

Не будут ли накапливаться объекты wrkCurrent?

Функция работает в цикле.


Private Function InsertStorage() As Boolean
On Error GoTo Err_Handle

    InsertStorage = False
    
    Dim LogBeginTrans As Boolean
    LogBeginTrans = False
    
    Dim wrkCurrent As DAO.Workspace
    Set wrkCurrent = DAO.DBEngine.Workspaces(0) 'Это из Гетца
    
    wrkCurrent.BeginTrans
    LogBeginTrans = True

    Dim dbs As DAO.Database
    Set dbs = CurrentDb()

    Dim rst As DAO.Recordset
    Set rst = dbs.OpenRecordset("tblStorage", , dbAppendOnly)
    
    rst.AddNew
    
    rst("DateStart") = Me.StartStorage
    rst("DateEnd") = Me.EndStorage    
    rst("QtyDays") = (Me.EndStorage- Me.StartStorage ) + 1

    rst.Update
    
    rst.Close
    Set rst = Nothing
    dbs.Close
    Set dbs = Nothing
    
    
    wrkCurrent.CommitTrans
    LogBeginTrans = False
    
    'Если мы здесь, нет ошибки, значит хранение добавлено
    InsertStorage = True  'хранение рассчитано
        

Exit_Handle:
    
    If Not rst Is Nothing Then
        rst.Close
        Set rst = Nothing
    End If
    
    If Not dbs Is Nothing Then
        dbs.Close
        Set dbs = Nothing
    End If

'Этот объект нельзя закрывать. Иначе дальше возникают ошибки.
'    wrkCurrent.Close
'    Set wrkCurrent = Nothing


    Exit Function

Err_Handle:

    
    If LogBeginTrans = True Then
        wrkCurrent.Rollback
        LogBeginTrans = False
    End If

    MsgBox Err.Source & vbCrLf & Err.Description, vbExclamation, "Сообщение об ошибке"
    Resume Exit_Handle

End Function
Ёжик`
Дата: 04.12.2009 09:59:33
Set wrkCurrent = DAO.DBEngine.Workspaces(0) 'Это из Гетца
'текущий воркспейс, зачем закрывать?

'можно так
Set wrkCurrent = DAO.DBEngine.CreateWorkspace.... 'Создаем новый, который можно потом закрыть

'или так
Static wrkCurrent As DAO.Workspace
If wrkCurrent Is Nothing then 
    Set wrkCurrent = DAO.DBEngine.Workspaces(0) 
    'или Set wrkCurrent = DAO.DBEngine.CreateWorkspace....
end if
Nebo
Дата: 04.12.2009 11:17:49
Ёжик`,

Спасибо за помощь:)

Set wrkCurrent = DAO.DBEngine.Workspaces(0) 'Это из Гетца
'текущий воркспейс, зачем закрывать

Я вот с этим текущим воркспейс не до конца понимаю. Что-то не врублюсь.
Объясните мне пожалуйста:)
Просто впервые это применяю. Раньше делал просто: DbEngine.BeginTrans

Также привык закрывать объектные переменные. Всякие там dbs, qdf, rst.

dbs.Close
Set dbs = Nothing

Ну и по аналогии вроде как надо закрыть wrkCurrent.
Так вот нельзя оказывается.

Что получается? Когда покидаю функцию, то куда девается объектная переменная wrkCurrent?
Правилом хорошего тона считается закрытие переменных.

А может просто можно делать так:

 DAO.DBEngine.Workspaces(0).BeginTrans
Nebo
Дата: 04.12.2009 14:16:48
Up:)
Ламер Ламерович
Дата: 04.12.2009 15:07:21
Ёжик` же все объяснил: вы не открывали новый Workspace, а присвоили переменной тwrkCurrent текущий Workspace. Так зачем его тогда закрывать? Просто сбросьте переменную Set wrkCurrent = Nothing и ошибки не будет.
Ёжик`
Дата: 04.12.2009 15:13:13
    
Dim wrkCurrent As DAO.Workspace
'объект не создаем, а получаем на него ссылку
Set wrkCurrent = DAO.DBEngine.Workspaces(0)    
'...
'уничтожаем ссылку
Set wrkCurrent = Nothing

    
Dim wrkCurrent As DAO.Workspace
'объект создаем
Set wrkCurrent = DAO.DBEngine.CreateWorkspace 'дальше через хелп, можно от другого пользователя - админа например    
'...
'попользовались - теперь прикроем
wrkCurrent.close
'уничтожаем ссылку
Set wrkCurrent = Nothing

DateBase аналогично - взяли текущую, или открыли новую:
set dbs=CurrentDB или Set dbs= wrkCurrent.OpenDataBase
Nebo
Дата: 04.12.2009 17:01:35
[quot Ёжик`]
    
Dim wrkCurrent As DAO.Workspace
'объект не создаем, а получаем на него ссылку
Set wrkCurrent = DAO.DBEngine.Workspaces(0)    
'...
'уничтожаем ссылку
Set wrkCurrent = Nothing


Вот теперь ПОНЯЛ, что объект не создаём, а получаем ссылку:) Теперь понятно.
Спасибо за терпение.
Nebo
Дата: 04.12.2009 17:12:15
Про Workspace наконец-то понял. Ёжик спасибо тебе и здоровья по полной программе:)

Теперь хочется лучше прояснить для себя про Database

Я всё время делаю так (в той или иной функции):

    Dim dbs As DAO.Database
    Set dbs = CurrentDb()

Закрываю dbs при выходе из функции:

    dbs.Close
    Set dbs = Nothing

Проблем никаких не возникало.

А какие могут быть проблемы, если делаю так: dbs.Close?

Закрытие Workspace повлияло на другие обеъкты. Это я увидел.


А вот закрытие dbs (Database), на что может влиять закрытие этого объекта (после выхода из функции)?
Ламер Ламерович
Дата: 05.12.2009 00:10:51
Nebo
А вот закрытие dbs (Database), на что может влиять закрытие этого объекта (после выхода из функции)?

Help пробовали читать?
Help
The CurrentDb method creates another instance of the current database, while the DBEngine(0)(0) syntax refers to the open copy of the current database.

Поэтому закрытие ни на что не повлияет. Просто закроете "another instance of the current database"
Nebo
Дата: 05.12.2009 04:42:47
Ламер Ламерович
Nebo
А вот закрытие dbs (Database), на что может влиять закрытие этого объекта (после выхода из функции)?

Help пробовали читать?
Help
The CurrentDb method creates another instance of the current database, while the DBEngine(0)(0) syntax refers to the open copy of the current database.

Поэтому закрытие ни на что не повлияет. Просто закроете "another instance of the current database"


Help читаю, вчитываюсь:)) Но иногда до меня упорно не доходят некоторые моменты:)
Может сказывается отсутствие опыта в объектном программировании.
Поэтому пишу сюда. И здесь РЕАЛЬНО помогают.

Теперь вообще всё понятно стало. Благодарю всех от Души:))