[Last Call] Learn how to a build a cloud-first strategyRegister Now

x
?
Solved

Crystal Report.NET loading slow - how to monitor its loading progress?

Posted on 2004-11-17
5
Medium Priority
?
550 Views
Last Modified: 2012-05-05
Hi everybody. I am using VB.NET 2003 and the embeddd Crystal Reports to view data. So, I have a report which is long, and contains five subqueries. I need to keep it as it is, I do not want to split it into five reports. The report is more than 1000 pages long and it takes 20 min. to load. How can I accelerate it? Is there a trick to make Crystal Reports load faster? Is there a way to display (say in a progress bar) how much time will take more, or how much the report has progressed etc?

Thanks
jason
0
Comment
Question by:lamprianou
3 Comments
 
LVL 101

Accepted Solution

by:
mlmcc earned 500 total points
ID: 12615333
When you say 5 subqueries do you mean subreports?

>>How can I accelerate it?
Are you using Page N on M?  If so the report has to fully generate to get the total number of pages.  Eliminate the total page count.

>>Is there a trick to make Crystal Reports load faster?
There are some tricks that might work but essentially they only delay the wait time.  For instance if you have subreports you can make them ON DEMAND which means they aren't built until a user clicks on them.

>>Is there a way to display (say in a progress bar) how much time will take more, or how much the report has progressed etc?
   No.  Crystal provides a progress bar but it has never worked correctly.

mlmcc
0
 

Author Comment

by:lamprianou
ID: 12651889
thanks,
so, there is no hope to improve the speed of my code? Lets see if there are any other opinions
0
 

Expert Comment

by:camoh
ID: 25517389
Here is some helpful information that I found on the SAP Community Network that helped me come up with a work around to show that it is still working on generating my report.

The info below is what I copied from https://forums.sdn.sap.com/thread.jspa?threadID=1112190 

********  Start of copied info  *******The following sample code demonstrates how to retrieve the number of pages from your 'ReportDocument' object. Assuming that your 'ReportDocument object' is called 'crReport', use the following VB.NET code to return the number of pages in a report:
  ====================
 
 NOTE:
 
 Logon and parameter field values must be provided prior to executing this code.
 
 ====================
 
 Dim nPages as Integer
 
 nPages = crReport.FormatEngine.GetLastPageNumber(New CrystalDecisions.Shared.ReportPageRequestContext)

********  End of copied info  *******


Below is an example of my code in a vb.net application:

'****** Code for frmReportViewer Class (My Windows form that contains the CrystalReportViewer1 control)******
Imports CrystalDecisions.CrystalReports.Engine
Imports CrystalDecisions.Shared

Public Class frmReportViewer
    Private WithEvents rs As New clsReportStatus
    Private Delegate Sub BarUpdate(ByVal val As Integer)
    Private Delegate Sub ChangeCursor(ByVal myCursor As Windows.Forms.Cursor)
    Private Delegate Sub ctrlVisible(ByVal meVisible As Boolean)

    Private Sub Report_ProgressBarValue(ByVal val As Integer) Handles rs.ProgressBarValue
        Try
            If Me.InvokeRequired Then
                Dim bu As New BarUpdate(AddressOf Me.Report_ProgressBarValue)
                Me.Invoke(bu, New Object() {val})
            Else
                ProgressBar1.Value = val
            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub

    Private Sub Report_ctrlVisible(ByVal meVisible As Boolean) Handles rs.ctrlVisible
        Try
            If Me.InvokeRequired Then
                Dim lv As New ctrlVisible(AddressOf Me.Report_ctrlVisible)
                Me.Invoke(lv, New Object() {meVisible})
            Else
                lblWait.Visible = meVisible
                ProgressBar1.Visible = meVisible
            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub

    Private Sub Report_mCursor(ByVal myCursor As Windows.Forms.Cursor) Handles rs.mCursor
        Try
            If Me.InvokeRequired Then
                Dim mc As New ChangeCursor(AddressOf Me.Report_mCursor)
                Me.Invoke(mc, New Object() {myCursor})
            Else
                Cursor = myCursor
            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub

    Private Sub frmReportViewer_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Try
            If Not rs.Running Then
                rs.StartThread()
            End If
            Application.DoEvents()

            Dim nPages As Integer

            Dim rep As New ReportDocument

            rep = Me.CrystalReportViewer1.ReportSource

            Me.Show()
            Application.DoEvents()
          'Here is where I inserted the line from the SAP Community Network forum            nPages = rep.FormatEngine.GetLastPageNumber(New CrystalDecisions.Shared.ReportPageRequestContext)
            rs.StopThread()
        Catch ex As Exception
            rs.StopThread()
            MessageBox.Show(ex.Message)
        End Try
    End Sub
End Class
 
 
 
 
'****** Code for clsReportStatus Class ******
Public Class clsReportStatus
    Public Event ProgressBarValue(ByVal val As Integer)
    Public Event ctrlVisible(ByVal v As Boolean)
    Public Event mCursor(ByVal myCursor As Windows.Forms.Cursor)
    Private t As System.Threading.Thread
    Private aborting As Boolean = True

    Public ReadOnly Property Running() As Boolean
        Get
            Return Not aborting
        End Get
    End Property

    Public Sub StartThread()
        If aborting Then
            aborting = False
            t = New System.Threading.Thread(AddressOf ReportStatus)
            t.Start()
        End If
    End Sub

    Public Sub StopThread()
        aborting = True
    End Sub

    Private Sub ReportStatus()
        Try
            Dim intPos As Integer = 0
            RaiseEvent mCursor(Cursors.WaitCursor)
            RaiseEvent ProgressBarValue(intPos)
            RaiseEvent ctrlVisible(True)

            Do Until Not Me.Running
                'Do Until intPos = 100
                RaiseEvent ProgressBarValue(intPos)
                System.Threading.Thread.Sleep(300)
                If intPos < 100 Then
                    intPos = intPos + 1
                Else
                    intPos = 1
                End If
                Application.DoEvents()
            Loop

            RaiseEvent ProgressBarValue(100)
            System.Threading.Thread.Sleep(1000)
            RaiseEvent ctrlVisible(False)
            RaiseEvent mCursor(Cursors.Default)

        Catch ex As Exception
            RaiseEvent mCursor(Cursors.Default)
            MessageBox.Show(ex.Message)
            RaiseEvent ctrlVisible(False)
            Me.StopThread()
        End Try
    End Sub
End Class


0

Featured Post

Vote for the Most Valuable Expert

It’s time to recognize experts that go above and beyond with helpful solutions and engagement on site. Choose from the top experts in the Hall of Fame or on the right rail of your favorite topic page. Look for the blue “Nominate” button on their profile to vote.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Computer science students often experience many of the same frustrations when going through their engineering courses. This article presents seven tips I found useful when completing a bachelors and masters degree in computing which I believe may he…
Q&A with Course Creator, Mark Lassoff, on the importance of HTML5 in the career of a modern-day developer.
Simple Linear Regression
Progress

834 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question