none
有關Crystal Report Postback問題 RRS feed

  • 問題

  • 小弟想請教個問題,各位前輩大大在Crystal Report ASP.NET  的報表

    區間查詢報表,各位大大會是怎麼去解決這部分,因為我在把報表相關資訊出

    來之後,因為Page_Load緣故,那我的作法是 把報表查詢程式寫成一個

    method,放置在Page_Load中,但想請教各位大大,還有其他相關更好

    的做法嗎??

    2014年9月15日 上午 04:05

解答

  • 您好,
    您可以在查詢Page先取得資料,判斷有資料,再開啟Report Viewer的Page,
    沒有資料就顯示訊息,不開Report Viewer的Page。

    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2014年9月15日 上午 11:37
  • 亂馬大大    我的想法是這樣,只是   我不知道要用什麼方式去儲存它

    因為我用Session儲存DataSet去判斷也是會Error,所以請大大再進一步

    指教,小弟是第一次用ASP.NET 寫CR報表~~

    我在Page_Load底下撰寫

             If dtDebitNote.Rows.Count > 0 Then
                objRptDoc.Load(Server.MapPath("~/CrystalReport/DebitNoteReport.rpt")) '
                objRptDoc.SetDataSource(DebitNoteDataSets)      
                CRV.ReportSource = objRptDoc
            End If

    我的想法是在當他按區間查詢,查詢的時候用ViewState或是Seesion去記錄這個DataSet

    只是這部分還不知道怎麼著手,只要他按匯出或是下一頁會有底下狀況,所以他每匯出,就會

    有PostBack,我不太希望用在Page_Load還要做Method Query副程式



    補充,小弟想到一個可行的做法了,小弟在他查詢的時候,用ViewState或是Session去儲存他輸入的條件,然後再把的條件字串  在原本的public sub QryReport()  改成 public sub QryReport(SDate,EDate) 那SDate,EDate就是用Seesion的值丟進查詢的QryReport程序裡面,這樣Page_Load的時候,我會先做Session("SDate") 有沒有值 有的話

    執行QryReport,不過小弟還是想聽各位大大有無更好的做法???


    2014年9月16日 上午 12:46

所有回覆

  • 2014年9月15日 上午 08:21
  • 小弟在ASP.NET 當中去做  查詢事件的時候。

            '指定報表物件的實體給ReportDocument物件
                If sDebitNote.HasRows = True Then
                    objRptDoc.Load(Server.MapPath("~/CrystalReport/DebitNoteReport.rpt")) '

                    objRptDoc.SetDataSource(DebitNoteDataSets)
                    '將報表物件丟給報表檢視器
                    CRV.ReportSource = objRptDoc
                    Session("myDataSet") = objRptDoc
     
                Else
                    msg.Text = "目前該期間:" & SDate & " ~ " & EDate & " 沒有資料"
                End If

     Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
            If Session("myDataSet") IsNot Nothing Then
                objRptDoc.Load(Server.MapPath("~/CrystalReport/DebitNoteReport.rpt")) '
                objRptDoc.SetDataSource(Session("myDataSet"))
                '將報表物件丟給報表檢視器
                CRV.ReportSource = objRptDoc    
            End If

       這邊會出問題,因為小弟目前只想到他在輸出的時候,做儲存,接者在輸出的時候判斷他有無資料

      有的話再載入一次報表檔案

       End Sub

    有大大還有更好的做法嗎???


    2014年9月15日 上午 10:47
  • 您好,
    您可以在查詢Page先取得資料,判斷有資料,再開啟Report Viewer的Page,
    沒有資料就顯示訊息,不開Report Viewer的Page。

    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2014年9月15日 上午 11:37
  • 亂馬大大    我的想法是這樣,只是   我不知道要用什麼方式去儲存它

    因為我用Session儲存DataSet去判斷也是會Error,所以請大大再進一步

    指教,小弟是第一次用ASP.NET 寫CR報表~~

    我在Page_Load底下撰寫

             If dtDebitNote.Rows.Count > 0 Then
                objRptDoc.Load(Server.MapPath("~/CrystalReport/DebitNoteReport.rpt")) '
                objRptDoc.SetDataSource(DebitNoteDataSets)      
                CRV.ReportSource = objRptDoc
            End If

    我的想法是在當他按區間查詢,查詢的時候用ViewState或是Seesion去記錄這個DataSet

    只是這部分還不知道怎麼著手,只要他按匯出或是下一頁會有底下狀況,所以他每匯出,就會

    有PostBack,我不太希望用在Page_Load還要做Method Query副程式



    補充,小弟想到一個可行的做法了,小弟在他查詢的時候,用ViewState或是Session去儲存他輸入的條件,然後再把的條件字串  在原本的public sub QryReport()  改成 public sub QryReport(SDate,EDate) 那SDate,EDate就是用Seesion的值丟進查詢的QryReport程序裡面,這樣Page_Load的時候,我會先做Session("SDate") 有沒有值 有的話

    執行QryReport,不過小弟還是想聽各位大大有無更好的做法???


    2014年9月16日 上午 12:46
  • 您好,
    跟您分享我們的做法有2種,
    1.設定報表參數給Report,並設定連線資訊給它,讓Report自行去取得資料,如「建立共用的Asp.NET Crystal Report 2008 Viewer程式!」,因為在換頁或是其他Action時,會再到DB中取得資料。
    2.程式中先到DB中取得資料後,再Assign給ReportDocument物件,然後再將它Assign給ReportViewer,並呼叫 ReportViewer 的 DataBind Method (如果您的ReportDocument是全域變數的話,在Page_Unload時要Dispose它),這樣CR就不用自行連到dbr取資料,如下, 請您再依您的需求調整吧!

    public partial class CRViewer : System.Web.UI.Page
    {
        private ReportDocument rptDoc = new ReportDocument();
    
        protected void Page_Load(object sender, EventArgs e)
        {
    		//取得report
    		string rptName = @"你的報表名稱(可能是Session的值或是其它來源)";
    		//取出Report
    		string rptPath = Path.Combine(Server.MapPath("~/RPT/"), rptName + @".rpt");
    		rptDoc.Load(rptPath);
    		string rptName_CR = rptName;
    		//Session[rptName_CR] 是程式中取得的資料 DataTable
    		rptDoc.SetDataSource(Session[rptName_CR]);
    		crRptViewer.ReportSource = rptDoc;
    		crRptViewer.DataBind();
    	}
    
    	protected void Page_UnLoad(object sender, EventArgs e)
    	{
    		try
    		{
    			rptDoc.Close();
    			rptDoc.Dispose();
    		}
    		catch (Exception ex)
    		{
    
    		}
    	}
    }  

     


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/


    • 已編輯 亂馬客 2014年9月16日 上午 02:31
    • 已標示為解答 IT小小菜鳥 2014年9月16日 上午 03:49
    • 已取消標示為解答 IT小小菜鳥 2014年9月16日 上午 05:42
    2014年9月16日 上午 02:31
  • 亂馬大大,因為像以往Winform 我們都是用DataSet去編輯DataTable的欄位

    我這次在ASP.NET當中也是在App_Code部分去加入DataSet然後再Query的時候

    丟到App_Code的DataSet裡DataTable中,小弟大概理解你的架構,在一個頁面中

    然後大家就是共用CRViewer,這樣大家在新的頁面中可以接收不同的報表程式,我好好

    思考一下這樣做法可不可行~~


    2014年9月16日 上午 02:44
  • 我還是會遇到這樣問題...因為只要匯出或是下一筆  都會遇到這種狀況產生


    2014年9月16日 上午 05:44
  • 我先用Seesion記錄下來,但是在Page_load中  不知道要怎麼去做判斷,這邊還是會出錯~~

    因為他只要匯出或是點選下一筆的時候就會出錯,那延伸出Page_Load的問題~~


    上方是在page_load中


    2014年9月16日 上午 06:23
  • 小弟再丟入報表的時候

    用了障眼法

                    If sDebitNote.HasRows = True Then
                        objRptDoc.Load(Server.MapPath("~/ReportPrint/DebitNoteReport.rpt")) '
                        objRptDoc.SetDataSource(dtDebitNote)
                        CRV.ReportSource = objRptDoc
                        lblCount.Text = "1"   <<<等於是按了查詢
                        CRV.Visible = True    <<<打開
                    Else
                        msg.Text = "目前該期間:" & SDate & " ~ " & EDate & " 沒有資料"
                        CRV.Visible = False   <<<關閉

    在Page_Load的時候

    雖然這不是一個很好解決方式

    關鍵字:asp.net crdb_adoplus object reference not set to an instance of an object postback

                國外常看到這類問題,有高手大大分享一下,是否有更好的方案呢???



    2014年9月16日 上午 07:12