0
votes

I changed the title from: Error In File Temp: Operation illegal on linked parameter

To: Passing Parameters in Crystal report

I Think I know how to pass parameters from main report to subreport, I did something like this:

enter image description here

I can now check through crystal reports preview how my reports look like, and everything is OK.

However, when I need to call the report to VB.Net, I use this code.

Imports CrystalDecisions.CrystalReports.Engine
Imports CrystalDecisions.Shared
Imports System.Data.SqlClient
Imports System.Data


Public Class rptXbar

    Private Sub rptXbar_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        LoadXbar(PartNoRep, DimItmRep)

    End Sub

    Sub LoadXbar(ByVal PartNo As String, ByVal DimItem As String)
        Dim sqlcom As New SqlCommand
        Dim dt As New DataTable
        Dim dta As New SqlDataAdapter
        Dim crConnectionInfo As New ConnectionInfo
        Dim crtableLogoninfo As New TableLogOnInfo
        Dim repX As New XbarRchart
        Try
            repX.Load(System.AppDomain.CurrentDomain.BaseDirectory() & "XbarRchart.rpt")
            With sqlcom
                Me.Cursor = Cursors.WaitCursor
                conn.Open()
                .Connection = conn
                .CommandTimeout = 100
                .CommandType = CommandType.StoredProcedure
                .CommandText = "dbo.XBarRChart"
                .Parameters.AddWithValue("@PartNo", PartNo)
                .Parameters.AddWithValue("@DimItem", DimItem)
                .ExecuteNonQuery()
            End With
            dt.Clear()
            dta = New SqlDataAdapter(sqlcom)
            dta.Fill(dt)
            repX.SetDatabaseLogon(userid, password, dtsrc, initcat)
            repX.SetParameterValue("@PartNo", PartNo)
            repX.SetParameterValue("@DimItem", DimItem)

            repX.SetParameterValue("@PartNo", PartNo, "MIPIRHeader.rpt")
            repX.SetParameterValue("@DimItem", DimItem, "MIPIRHeader.rpt")

            repX.SetParameterValue("@PartNo", PartNo, "MIPIRDetails.rpt")
            repX.SetParameterValue("@DimItem", DimItem, "MIPIRDetails.rpt")

            repX.SetDataSource(dt)
            Me.CrystalReportViewer1.ReportSource = repX
            Me.CrystalReportViewer1.Refresh()
        Catch ex As Exception
            MsgBox(ex.Message)
        Finally
            Me.Cursor = Cursors.Default
        End Try
        conn.Close()
    End Sub
End Class

A error would pop up, it would say:

enter image description here

If I remove the links, the parameters would ask for input, If I remove this code

        repX.SetParameterValue("@PartNo", PartNo, "MIPIRHeader.rpt")
        repX.SetParameterValue("@DimItem", DimItem, "MIPIRHeader.rpt")

        repX.SetParameterValue("@PartNo", PartNo, "MIPIRDetails.rpt")
        repX.SetParameterValue("@DimItem", DimItem, "MIPIRDetails.rpt")

It would also ask for parameters, is there any suggestions on how I could fix this problem?

1

1 Answers

0
votes

I finally found the answer!

Sub LoadXbar(ByVal PartNo As String, ByVal DimItem As String)
        Dim sqlcom As New SqlCommand
        Dim dt As New DataTable
        Dim dta As New SqlDataAdapter
        Dim crConnectionInfo As New ConnectionInfo
        Dim crtableLogoninfo As New TableLogOnInfo
        Dim repX As New XbarRchart
        Try
            repX.Load(System.AppDomain.CurrentDomain.BaseDirectory() & "XbarRchart.rpt")
            With sqlcom
                Me.Cursor = Cursors.WaitCursor
                conn.Open()
                .Connection = conn
                .CommandTimeout = 100
                .CommandType = CommandType.StoredProcedure
                .CommandText = "dbo.XBarRChart"
                .Parameters.AddWithValue("@PartNo", PartNo)
                .Parameters.AddWithValue("@DimItem", DimItem)
                .ExecuteNonQuery()
            End With
            dt.Clear()
            dta = New SqlDataAdapter(sqlcom)
            dta.Fill(dt)
            repX.SetDatabaseLogon(userid, password, dtsrc, initcat)
            repX.SetParameterValue("@PartNo", PartNo)
            repX.SetParameterValue("@DimItem", DimItem)

            repX.SetParameterValue("@PartNo", PartNo, "MIPIRHeader.rpt")
            repX.SetParameterValue("@DimItem", DimItem, "MIPIRHeader.rpt")

            repX.SetParameterValue("@PartNo", PartNo, "MIPIRDetails.rpt")
            repX.SetParameterValue("@DimItem", DimItem, "MIPIRDetails.rpt")

            repX.SetDataSource(dt)
            Me.CrystalReportViewer1.ReportSource = repX
            Me.CrystalReportViewer1.Refresh()
        Catch ex As Exception
            MsgBox(ex.Message)
        Finally
            Me.Cursor = Cursors.Default
        End Try
        conn.Close()
    End Sub

This is the code where I populate my main report data and the subreports, if you would notice repX.SetDataSource(dt) is below the codes where I populate the subreports, I changed the code into the following:

Sub LoadXbar(ByVal PartNo As String, ByVal DimItem As String)
        Dim sqlcom As New SqlCommand
        Dim dt As New DataTable
        Dim dta As New SqlDataAdapter
        Dim crConnectionInfo As New ConnectionInfo
        Dim crtableLogoninfo As New TableLogOnInfo
        Dim repX As New XbarRchart
        Try
            repX.Load(System.AppDomain.CurrentDomain.BaseDirectory() & "XbarRchart.rpt")
            With sqlcom
                Me.Cursor = Cursors.WaitCursor
                conn.Open()
                .Connection = conn
                .CommandTimeout = 100
                .CommandType = CommandType.StoredProcedure
                .CommandText = "dbo.XBarRChart"
                .Parameters.AddWithValue("@PartNo", PartNo)
                .Parameters.AddWithValue("@DimItem", DimItem)
                .ExecuteNonQuery()
            End With
            dt.Clear()
            dta = New SqlDataAdapter(sqlcom)
            dta.Fill(dt)
            repX.SetDatabaseLogon(userid, password, dtsrc, initcat)
            'New Location
            repX.SetDataSource(dt)
            repX.SetParameterValue("@PartNo", PartNo)
            repX.SetParameterValue("@DimItem", DimItem)

            repX.SetParameterValue("@PartNo", PartNo, "MIPIRHeader.rpt")
            repX.SetParameterValue("@DimItem", DimItem, "MIPIRHeader.rpt")

            repX.SetParameterValue("@PartNo", PartNo, "MIPIRDetails.rpt")
            repX.SetParameterValue("@DimItem", DimItem, "MIPIRDetails.rpt")


            Me.CrystalReportViewer1.ReportSource = repX
            Me.CrystalReportViewer1.Refresh()
        Catch ex As Exception
            MsgBox(ex.Message)
        Finally
            Me.Cursor = Cursors.Default
        End Try
        conn.Close()
    End Sub

And my code worked! So please do be careful also when placing your commands in VB.net, you might have placed it somewhere wrong.