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
Post a Comment