c# - Crystal Report: Missing Parameter Values -


i new crystal report, application in asp.net 3.5 , mysql 5.1, going develop report between dates date , date, first page of report shown when tried navigate on page got error missing parameter values same error got in printing , export action in advance

public partial class bookingstatement : system.web.ui.page {

//dal data access layer class 

//book reportclass

dal obj = new dal(); book bkstmt = new book(); protected void page_load(object sender, eventargs e) {      if (!ispostback)     {        //crvbooking crystal report viewer        //reportfill method fill report           reportfill();         crvbooking.enableviewstate = true;         crvbooking.enableparameterprompt = false;     }      /* try reportfill() out side !ispostback didn't work */       //check if parmeters have been shown.  /*   if ((viewstate["parametersshown"] != null) && (viewstate["parametersshown"].tostring() == "true"))     {         bkstmt.setparametervalue(0, "20/04/2010");         bkstmt.setparametervalue(1, "20/04/2010");     }*/  }   protected void crvbooking_navigate(object sender, crystaldecisions.web.navigateeventargs e) {    // reportfill(); }  protected void reportfill() {      //bkstmt.rpt report file     //bookingstatment view     //bkstmt reportclass object of book      string rptpath = "bkstmt.rpt";      string query = "select * bookingstatment";       crvbooking.refreshreport();     crvbooking.height = 600;     crvbooking.width = 900;        bkstmt.resourcename = rptpath;       string dtfrm = bkstmt.parameterfields[0].currentvalues.tostring();      obj.setcommandtype(commandtype.text);     obj.commtext = query;     datatable dtst = obj.getdatatable();      crvbooking.parameterfieldinfo.clear();        parameterdiscretevalue discretevalue = new parameterdiscretevalue();     discretevalue.value = "20/04/2010"; // assign parameter     parametervalues values = new parametervalues();     values.add(discretevalue);      bkstmt.setdatasource(dtst);      viewstate["parametersshown"] = "true";     crvbooking.enableviewstate = true;      bkstmt.datadefinition.parameterfields[0].applycurrentvalues(values);     bkstmt.datadefinition.parameterfields[1].applycurrentvalues(values);       crvbooking.reportsource = bkstmt; } 

}

the problem seems occur because crystal reports not persist parameter values in viewstate when postback occurs. when crystalreportviewer attempts load reportclass used reportsource again, parameter values no longer there.

a solution we've used save reportclass (i.e. crystal report object) session after parameter values have been set & load crystalreportviewer upon each postback in page_init event. example:

// instantiate crystal report var report = new deliverylabelssingle();  // set required parameters report.datasourceconnections[0].setconnection("dbserver", "databasename", "databaseuser", "databasepassword"); report.setparametervalue("@param1", "val1"); report.setparametervalue("@param2", "val2");  // set data source of viewer crvlabels.reportsource = report;  // save report object in session postback binding session["rptdeliverylabels"] = report; 

then page_init event page looks following:

protected void page_init(object sender, eventargs e) {     if (ispostback) {         if (session["rptdeliverylabels"] != null) {             // cast report object reportclass can set crystalreportviewer reportsource             // (all crystal reports inherit reportclass, serves acceptable data type through polymorphism)             crvlabels.reportsource = (reportclass)session["rptdeliverylabels"];         }     } } 

in way, set report object viewer, has been initialized appropriate values.

something keep in mind approach potentially fill server memory quickly, if have lots of users generating lots of different reports. housekeeping in order. we've done through implementing base class our asp.net pages contain report (and report loading code). in base class, set possible session variables reports null. so:

// class definition asp.net page containing crystalreportviewer & associated report(s) public partial class deliverylabelprint : basereport 

then definition basereport follows:

public class basereport : system.web.ui.page {     protected override void onload(eventargs e)     {         if (!ispostback) {             (var = 0; < session.count; i++) {                 var sv = session[i];                 // if session variable contains crystal report, destroy                 if (sv reportclass) {                     sv = null;                 }             }              base.onload(e);         }     } } 

in way, ensure user ever has 1 report in memory @ given time.

if memory concern, approach, alternative store individual variable values in session & instantiate new report in page_init & repopulate saved values before assigning crystalreportviewer.reportsource. in our case, 40 users pulling 50+ different reports on daily basis, implementation of storing of reportclass object & accompanying housekeeping, haven't run memory problems since application went live 3 years ago. still suggest doing appropriate load testing & monitoring before pushing solution production, results may vary depending on specific implementation.


Comments

Popular posts from this blog

javascript - Enclosure Memory Copies -

php - Replacing tags in braces, even nested tags, with regex -