Список отчетов вместе с их описанием - PullRequest
2 голосов
/ 06 апреля 2011

Различные способы получения списка имен отчетов: Запрос

SELECT [Name] FROM MsysObjects
    WHERE ([Type] = -32764)

или VBA

Dim rpt As AccessObject
Dim dB As Object

On Error GoTo Error_Handler

Set dB = Application.CurrentProject
For Each rpt In dB.AllReports

   Debug.Print rpt.Name
Next rpt

Отчет может иметь описание в свойствах (щелчок правой кнопкой мыши по объекту отчета), но я не могу получить доступ с кодом.

Я бы хотел, чтобы в списке отображалось удобное имя отчета, связанное с фактическим именем отчета. Я пытаюсь избежать создания отдельной таблицы для управления этим на данный момент.

1 Ответ

1 голос
/ 07 апреля 2011

CurrentProject - это объект ADO, и я не знаю, как делать то, что вы хотите от ADO.Вы можете использовать DAO для извлечения свойства Description .

? CurrentDb.Containers("Reports").Documents("rptFoo").Properties("Description")
Foo Report

Поскольку Description является пользовательским свойством, оно не существует, пока вы не назначите значениедля этого.Поэтому следующая строка вызывает ошибку 3270 (свойство не найдено) для rptLinks, поскольку ей не назначено Описание .

? CurrentDb.Containers("Reports").Documents("rptLinks").Properties("Description")

Вы можете перехватить эту ошибку.Или посмотрите, можете ли вы использовать функцию HasProperty Аллена Брауна

Совершенно другой подход заключается в создании tblReports с полями report_name и friendly_name.Вам придется поддерживать эту таблицу, но рабочая нагрузка должна быть примерно эквивалентна поддержке свойств Description для объектов отчета.Затем вы можете использовать простой SELECT для таблицы в качестве RowSource для вашего списка.

Update : вы также можете выбрать SELECT из MSysObjects с пользовательской функцией, чтобы возвращать описание для каждого отчета.

Public Function ReportDescription(ByVal pName As String) As String
    Dim strReturn As String
    Dim strMsg As String

On Error GoTo ErrorHandler

    strReturn = _
        CurrentDb.Containers("Reports").Documents(pName).Properties("Description")

ExitHere:
    On Error GoTo 0
    ReportDescription = strReturn
    Exit Function

ErrorHandler:
    Select Case Err.Number
    Case 3270 'Property not found.'
        'strReturn = "(no Description)"'
        '* no Description -> just echo report name *'
        strReturn = pName
    Case Else
        strMsg = "Error " & Err.Number & " (" & Err.description _
            & ") in procedure ReportDescription"
        MsgBox strMsg
        strReturn = vbNullString
    End Select
    GoTo ExitHere
End Function

Пересмотрите исходный запрос, чтобы использовать функцию.

SELECT
    [Name] AS report_name,
    ReportDescription([Name]) AS friendly_name
FROM MsysObjects
WHERE ([Type] = -32764);
...