Создать форме кнопку отвечающую за открытие ранее созданного отчета

Автор Dja, 26 января 2023, 16:14

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

sokol92

Цитата: Dja от 12 марта 2023, 08:50текущую директорию с файлом
Если имеется в виду файл, который содержит макрос, то можно так (для всех операционных систем):
Sub OpenReport3
  Dim oDBDoc, arr
  arr=Split(ThisComponent.URL, "/")  ' полный путь к данному документу, разбитый на части по символу "/"
  arr(Ubound(arr))="Celsius.odb"     ' заменяем имя файла
  oDBDoc = StarDesktop.LoadComponentFromUrl(Join(arr, "/"), "_blank", 0, Array())
  With oDBDoc.currentcontroller
    If  Not .isConnected Then .connect
  End With
  ODBDoc.ReportDocuments.getbyname("Temperature").open()   
End Sub
Владимир.


Dja

Цитата: sokol92 от 27 января 2023, 15:29Если документ базы данных не нужен, можем вообще его не показывать.
Sub OpenReport3
  Dim oDBDoc
  Dim props(0) As New com.sun.star.beans.PropertyValue
  props(0).Name="Hidden": props(0).Value=True
  oDBDoc = StarDesktop.LoadComponentFromUrl(ConvertToUrl("C:\temp\Celsius.odb"), "_blank", 0, props)
  With oDBDoc.CurrentController
    If  Not .isConnected Then .connect
  End With
  ODBDoc.ReportDocuments.getbyname("Temperature").open()   
  ODBDoc.Close False
End Sub


С этим макросом все также? прописываем вместо полного пути такой код?

Dim oDBDoc, arr
  arr=Split(ThisComponent.URL, "/")  ' полный путь к данному документу, разбитый на части по символу "/"
  arr(Ubound(arr))="Celsius.odb"    ' заменяем имя файла
  oDBDoc = StarDesktop.LoadComponentFromUrl(Join(arr, "/"), "_blank", 0, Array())


Kadet

Цитата: sokol92 от 27 января 2023, 15:29oDBDoc = StarDesktop.LoadComponentFromUrl(ConvertToUrl("C:\temp\Celsius.odb"), "_blank", 0, props)
Как-то вы из-через-вне пытаетесь добраться до того, что рядом, внутри.
Я шёл другим путём. Документ oDBDoc вылавливаю в глобальную переменную (DBDocument) просто при загрузке самой БД. Она мне всегда и везде нужна.
Но, даже если не вылавливать, то из любой кнопки её можно выловить по событию oEvent. Допустим так:
oDBDoc = oEvent.Source.Model.Parent.Parent.Parent.ParentЭто если кнопка лежит внутри формы.

В общем, вот мои макросы, которые открывают мои отчёты кнопкой.
По кнопке запускается макрос, в котором:
Sub KnopkaClick(oEvent)
oDBDoc = oEvent.Source.Model.Parent.Parent.Parent.Parent
sDBURL = oDBDoc.URL
sRepcName = "Отчёт_за_три_дня" 'Название отчёта
oDoc = OpenReportDB(sDBURL, sRepcName$)
End Sub

sDBURL - это URL базы данных, который ещё определяется так:  "sDBURL = oDBDoc.URL"
Имеет путь к БД, допустим
sDBURL = "file:///E:DataBase/Mydatabase.odb"
Из этого макроса запускается функция - "OpenReportDB".
Сделал её функцией, чтобы выловить и сохранить сам документ отчёта в переменной oDoc. Иногда полезно.
Function OpenReportDB(sDBURL$, sRepName$)
    Dim oDBDoc, oRepDef, oRepDocs, oRepDoc, oCon, oBaseContext, oDataBase, InteractionHandler, oBazy
ON LOCAL ERROR GOTO Error3:
    Dim oParms() As New com.sun.star.beans.PropertyValue
    If sDBname="" Then
        DBDocument = ThisComponent.Parent
        DBDocument.DataSource.Settings.RespectDriverResultSetType = false
        sDBname = DBDocument.DataSource.URL
        sDBURL=DBDocument.URL
    End If
    oDBDoc = DBDocument
    oRepDocs = oDBDoc.getReportDocuments()
    oRepDef = oDBDoc.getReportDocuments().getByName(sRepName)
'    oDummyRepDef = oRepDef

    connect_to_database()
    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

    DBDocument.CurrentController.Frame.ContainerWindow.setVisible(False)

Error3:
    ON LOCAL ERROR GOTO 0   
End Function
Он универсальный для всех моих отчётов (а их много).

sRepName$ - это название отчёта, допустим "Отчёт_за_три_дня".

Ну, ещё в этом макросе скрываются всякие меню LO. И т.п.

sokol92

Здравствуйте, @Kadet!

Цитата: Dja от 27 января 2023, 04:02Подскажите пожалуйста, как c помощью макроса открыть мне нужный(внешний, не в том в котором я работаю) документ БД.odb?
Цитата: Kadet от 28 августа 2023, 20:57Как-то вы из-через-вне пытаетесь добраться до того, что рядом, внутри.

В данном случае мы имеем дело с двумя разными документами баз данных (.odb).

Цитата: Kadet от 28 августа 2023, 20:57oDBDoc = oEvent.Source.Model.Parent.Parent.Parent.Parent

Количество вызовов Parent может быть разным для формы и ее вложенных (под)форм. Можно в цикле вычислять Parent и проверять поддержку интерфейсов (сервисов) нужного типа.
Владимир.

Kadet

Цитата: sokol92 от 29 августа 2023, 15:08Количество вызовов Parent может быть разным для формы и ее вложенных (под)форм
Согласен. Это критично, когда эти макросы универсальны для всех возможных кнопок. Но чаще - эти кнопки фиксированы в какой-нибудь форме или субформе, и можно для каждой кнопки сделать свой маленький макрос, в две строчки, с поиском "гловы", а потому найденную "голову" передать как переменную в рабочий макрос. Или её URL.
Можно и циклу проверяя тип получаемого объекта, пока не выйдем на самый верх.

Просто меня всегда напрягает путь к своему же документы, в котором работаешь, через вне, в частности через "StarDesktop". Как бы - "пройти на кухню, выйдя в окно спальни и зайдя в окно кухни, забыв, что есть коридор".
Мне кажется это не очень стабильно. StarDesktop может и не найти верхний документ, допустим когда головной выведен в фоновый режим, как это обычно делается у меня, чтобы спрятать от всех пользователей "опасную" и ненужную для них главную форму базы.