Message: [OOoBase] Отсутствует подключение к базе данных..

Автор Kadet, 13 марта 2019, 17:20

0 Пользователи и 1 гость просматривают эту тему.

Kadet

Столкнулся с непонятным явлением. Может кто подскажет?
LO 6.2. OC Win 10 x64. Внешняя база Firebird 3.0, подключённая через ODBC.

Всё работает, "крутится вертится". Запросы выполняются, и SELECT и INSERT/UPDATE. В общем, как бы всё нормально.
Запускаю макрос, который сначала добавляет данные в таблицу (делает SQL поочерёдно delete, a затем insert). Этот шаг проходит без ошибок. А потом макрос должен открывать отчёт (report). И вот тут на строке oDoc.open сообщает, что нет подключения к базе данных.
Ошибка времени выполнения Basic.
Вызвано исключение
Type: com.sun.star.lang.WrappedTargetException
Message:
TargetException:
 Type: com.sun.star.sdbc.SQLException
 Message: [OOoBase] Отсутствует подключение к базе данных..


Код макроса:
Sub OpenReportZajavka(oEvent)
Dim oDoc
ON ERROR GOTO ErrRepZaj:
ZAKSaveNewPoz(oEvent)      'Процедура, где выполняются delete и insert
oDoc = ThisDatabaseDocument.ReportDocuments.GetByName("Заявка_на_производство")
oDoc.open                          'Тут выбрасывает ошибку
ErrRepZaj:
ON ERROR GOTO 0
End Sub

Не понятно почему и чего оно хочет. Вроде бы при работе с внешней базой имеется как бы две базы: внешняя Firebird и база LO .odb. Однако, SQL запросы говорят, что с подключением к FB всё нормально, а нормальное формирование oDoc говорит, что вроде бы и с  .odb всё нормально.
Причём появляется эта проблема не всегда, но часто.

Где копать?

Kadet

Вместо простого варианта открытия отчёта пришлось делать сложно. (Эти функции я подсмотрел где-то здесь, только переработал малость).
Пока работает, завтра основательно протестирую, но непонимание причин всё же осталось.
Sub OpenReportZajavka(oEvent)
Dim oDoc
Dim oForm
Dim oDocDB
ON ERROR GOTO ErrRepZaj:
ZAKSaveNewPoz(oEvent)
' oDoc = ThisDatabaseDocument.ReportDocuments.GetByName("Заявка_на_производство")
' oDoc.open
sRepName$="Заявка_на_производство"
OpenReportDB(sDBURL, sRepName$)

ErrRepZaj:
ON ERROR GOTO 0
End Sub

'********************************************
Function OpenReportDB(sDBURL$, sRepName$)
Dim oDBDoc
Dim oRepDef
Dim oRepDocs
Dim oRepDoc
Dim oCon
Dim oBaseContext
Dim oDataBase
Dim InteractionHandler

Dim oParms() As New com.sun.star.beans.PropertyValue

oDBDoc = ThisDatabaseDocument
oRepDocs = oDBDoc.getReportDocuments()
oRepDef = oDBDoc.getReportDocuments().getByName(sRepName)

oBaseContext = CreateUnoService("com.sun.star.sdb.DatabaseContext")

oDataBase = oBaseContext.getByName(sDBURL$)

InteractionHandler = createUnoService("com.sun.star.sdb.InteractionHandler")  
oCon = oDataBase.ConnectWithCompletion(InteractionHandler)

  AppendProperty(oParms(), "OpenMode", "open")
AppendProperty(oParms(), "ActiveConnection", oCon)

oRepDoc = oRepDocs.loadComponentFromURL(sRepName$, "", 0, oParms())

OpenReportDB() = oRepDoc

End Function

'*************************************************************
Function CreateProperty(sName$, oValue) As com.sun.star.beans.PropertyValue
Dim oProperty As New com.sun.star.beans.PropertyValue
oProperty.Name = sName
oProperty.Value = oValue
CreateProperty() = oProperty
End Function

'*********************************************************
Sub AppendProperty(oProperties(), sName As String, ByVal oValue)
AppendToArray(oProperties(), CreateProperty(sName, oValue))
End Sub

'*******************************************************
Sub AppendToArray(oData(), ByVal x)
Dim iUB As Integer 'The upper bound of the array.
Dim iLB As Integer 'The lower bound of the array.
iUB = UBound(oData()) + 1
iLB = LBound(oData())
ReDim Preserve oData(iLB To iUB)
oData(iUB) = x
End Sub