Member 13749262 Ответов: 1

Недопустимый индекс при передаче параметра в crystal report in VB.NET


Я создаю решение Windows forms в VS2017 с помощью VB.net-да. Бэк-энд-это БД Access 2010, которая сейчас находится на файловом сервере, но в конечном итоге будет развернута в другом месте. Я пытаюсь запустить отчет, передавая несколько параметров динамически. Я пытаюсь сделать это по одному параметру за раз, чтобы облегчить отладку во время построения отчета.

Однако я даже не могу запустить отчет, когда передаю первый параметр. Он запускает таблицу запросов в моей БД и без параметров показывает отчет, никаких проблем. Но как только я добавляю какой-либо параметр, я получаю ошибку "недопустимый индекс". (Системы.Во время выполнения.InteropServices.COMException: 'недопустимый индекс. (Исключение из HRESULT: 0x8002000B (DISP_E_BADINDEX))'

Я не программист (раньше был программистом VB много лет назад, и мне пришлось учиться .Сеть в считанные дни сделала этот проект, и вот уже четыре месяца он находится в стадии разработки.

Вот мой код ниже:

Imports CrystalDecisions.CrystalReports.Engine
Imports CrystalDecisions.Shared

Public Class frmViewReport

    Private Sub rptViewer_Load(sender As Object, e As EventArgs) Handles rptViewer.Load

        'On Error Resume Next

        Dim cryRpt As New ReportDocument
        Dim crConnectionInfo As New ConnectionInfo
        Dim CrTables As Tables
        Dim crtableLogoninfo As New TableLogOnInfo

        cryRpt.Load(Application.StartupPath & "\CrystalReport2.rpt")

        With crConnectionInfo
            .ServerName = ELTDocumentFolder
            .DatabaseName = "\" & ELTDatabase
        End With

        CrTables = cryRpt.Database.Tables
        For Each CrTable In CrTables
            crtableLogoninfo = CrTable.LogOnInfo
            crtableLogoninfo.ConnectionInfo = crConnectionInfo
            CrTable.ApplyLogOnInfo(crtableLogoninfo)
        Next

        Dim crParameterFieldDefinitions As ParameterFieldDefinitions
        Dim crParameterFieldDefinition As ParameterFieldDefinition
        Dim crParameterValues As New ParameterValues
        Dim crParameterDiscreteValue As New ParameterDiscreteValue
        Dim crParameterDiscreteValue1 As New ParameterDiscreteValue

        'cryRpt.SetParameterValue("@Deal_Date", frmSelectReport.DateTimePicker1.Value)

        crParameterDiscreteValue.Value = frmSelectReport.DateTimePicker1.Value
        crParameterDiscreteValue1.Value = frmSelectReport.DateTimePicker2.Value
        crParameterFieldDefinitions = cryRpt.DataDefinition.ParameterFields()
        crParameterFieldDefinition = crParameterFieldDefinitions.Item("Deal_Date") '<<<ERROR OCCURS HERE
        crParameterValues = crParameterFieldDefinition.CurrentValues

        crParameterValues.Clear()
        crParameterValues.Add(crParameterDiscreteValue)
        crParameterValues.Add(crParameterDiscreteValue1)
        crParameterFieldDefinition.ApplyCurrentValues(crParameterValues)

        Dim tbCurrent As CrystalDecisions.CrystalReports.Engine.Table
        Dim tliCurrent As CrystalDecisions.Shared.TableLogOnInfo

        For Each tbCurrent In cryRpt.Database.Tables

            tliCurrent = Nothing

            With tliCurrent.ConnectionInfo

                .ServerName = Application.StartupPath
                .DatabaseName = Application.StartupPath & "\" & ELTDatabase

            End With


        Next tbCurrent

        rptViewer.ReportSource = cryRpt
        rptViewer.Refresh()

    End Sub

End Class


Что я уже пробовал:

На прошлой неделе я читал решения по всей сети. Я копировал и вставлял код, проверял имена полей в базе данных, пробовал разные поля

Richard Deeming

Эта ошибка предполагает, что CrystalReport2.rpt не содержит вызываемого параметра Deal_Date.

Установите точку останова в строке, где произошла ошибка, и отладьте свой код. Изучить crParameterFieldDefinitions коллекция, и посмотрите на имена параметров. Имя должно точно совпадать со строкой, в которую вы переходите .Item(...).

На первый взгляд, вам, вероятно, нужно включить префикс "@" :

crParameterFieldDefinition = crParameterFieldDefinitions.Item("@Deal_Date")

1 Ответов

Рейтинг:
0

an0ther1

Согласно приведенному выше комментарию Ричарда, отчет не может найти параметр с именем "Deal_Date"
На мой взгляд, вам лучше пройтись по полям параметров и проверить имя перед заполнением, будет работать следующее;

If(crRpt.DataDefinition.ParameterFields.Count > 0) Then
    For Each rptParam As ParameterFieldDefinition in crRpt.DataDefinition.ParameterFields
    ' check the reportname is empty - this ensures we set parameters in the main report only
        If(rptParam.Reportname = "") Then
            ' get the parameter name
            Dim strName As String = rptParam.ParameterFieldName
            ' check name and set value if correct
            If(strName = "Correct Name") Then
                Dim objVal as object = "My Value"
                crRpt.SetparameterValue(rptParam.ParameterFieldName, objVal)
            End If
        End If
    Next
End If


Это также поможет при отладке, так как вы действительно можете увидеть, каково имя параметра отчета.

с уважением