• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 446
  • Last Modified:

Subreports

We are trying to use a subreport, but now in Crystal Reports 10 we cannot use the Load() method or the SetParameterValue() method.  How am I supposed to get the DataSource and Parameters set for the subreport if I can't even load it!

TIA

Mike
0
jeshbr
Asked:
jeshbr
  • 4
  • 4
1 Solution
 
ebolekCommented:
You can get a reference to the subreport from the main report by using

Opensubreport methoid then

You can use following code to set the parameetrs of the subreport. The report document is the referenced subreport from the open method

//sets the parameter values for main report and sub reports if any
                  CrystalDecisions.CrystalReports.Engine.ParameterFieldDefinition ParameterFieldDefinition;
                  CrystalDecisions.Shared.ParameterDiscreteValue  ParameterDiscreteValue;
                  CrystalDecisions.Shared.ParameterValues  ParameterValues;                              
                  int paramcount;
                  paramcount = this.MyParameterValues.Count;
                  ParameterFieldDefinition = null;
                  string ConversionVariable;
                  ConversionVariable = null;                  
                  for (int i = 0; i != paramcount; i++)//have to put paramcount otherwise hard code it .works
                  {
                        ConversionVariable = Convert.ToString(MyReport.DataDefinition.ParameterFields[i].ParameterType);  
                        if (ConversionVariable == "StoreProcedureParameter")       
                        {
                              ParameterFieldDefinition = MyReport.DataDefinition.ParameterFields[i];  
                              ParameterValues = new CrystalDecisions.Shared.ParameterValues();
                              ParameterDiscreteValue = new CrystalDecisions.Shared.ParameterDiscreteValue();      
                              ParameterDiscreteValue.Value = this.MyParameterValues[i];      
                              ParameterValues.Add(ParameterDiscreteValue);
                              ParameterFieldDefinition.CurrentValues.Clear();
                              ParameterFieldDefinition.DefaultValues.Clear();  
                              ParameterFieldDefinition.ApplyCurrentValues(ParameterValues);
                        }
                  }
                  return ParameterFieldDefinition;
0
 
jeshbrAuthor Commented:
This is the code I currently have.

//      Set the data source for the sub reports
for (int liSubReport = 0; liSubReport < SubReports.Count; liSubReport++)
{
      lcSubReport = SubReports[liSubReport].ToString();
      Report.OpenSubreport(lcSubReport).Load(this.GetReportPath() + "rptFeeReportSub1.rpt");

      //      Set the data source
      if (SubReportDataSources != null)
            Report.Subreports[lcSubReport].SetDataSource(SubReportDataSources[liSubReport]);

      //      Load the parameters for this sub report
      if (SubReportParameters != null)
      {
            for (int liSRParameter = 0;
                  liSRParameter < SubReportParameters[liSubReport].GetLength(0);
                  liSRParameter++)
            {
                  lcParameter = SubReportParameters[liSubReport][liSRParameter, 0].ToString();

                  ParameterValues lpvValues = new ParameterValues();
                  ParameterDiscreteValue lpdvParameter = new ParameterDiscreteValue();
                  lpdvParameter.Value = SubReportParameters[liSubReport][liSRParameter, 1];

                  lpvValues.Add(lpdvParameter);

                  Report.Subreports[lcSubReport].DataDefinition.
                        ParameterFields[lcParameter].ApplyCurrentValues(lpvValues);
            }
      }
}

But after it's all said and done the parameter values and data source for the main and subreport are wrong.
0
 
jeshbrAuthor Commented:
The Load() fails by the way!
0
Get expert help—faster!

Need expert help—fast? Use the Help Bell for personalized assistance getting answers to your important questions.

 
ebolekCommented:
it fails because when you open the sub report, you try to load
Create a reportdocument variable mysubreport and write this
MySubReport = MyReport.OpenSubreport(MySubReportObject.SubreportName)
0
 
jeshbrAuthor Commented:
Even if I do that though it won't let me load it, it gives me this error...Not supported in subreports
0
 
ebolekCommented:
Look at this code. This code works.I have done this , You have to cast the object first

CrystalDecisions.CrystalReports.Engine.ReportDocument MySubReport;
                  CrystalDecisions.CrystalReports.Engine.SubreportObject MySubReportObject;
                  foreach (CrystalDecisions.CrystalReports.Engine.ReportObject MyReportObject in MyReport.ReportDefinition.ReportObjects)
                  {
                        if (MyReportObject.Kind == CrystalDecisions.Shared.ReportObjectKind.SubreportObject)
                        {
                              MySubReportObject = (CrystalDecisions.CrystalReports.Engine.SubreportObject)MyReportObject;
                              
                              if (MySubReportObject.SubreportName != _subreportname)
                              {
                                    if (this.ReportName == "InvestigationReport_CoverPage")
                                    {
                                          int i;
                                          MySubReport = MyReport.OpenSubreport(MySubReportObject.SubreportName);                               
                                          setlogoninfo(MySubReport);
                                          SubReportName = MySubReportObject.SubreportName;
                                          //this.SubReportDocument.Add(MySubReport);
                                          if (MySubReportObject.SubreportName == "InvestigationReport_Vehicles.rpt")
                                          {
                                                i = 1;
                                          }
                                          else
                                          {
                                                i = 0;
                                                
                                          }
                                          SetReportParameters_InvestigationReport(MySubReport,i);
0
 
jeshbrAuthor Commented:
What does the code behind SetReportParameters_InvestigationReport() look like?
0
 
ebolekCommented:
SetReportParameters_InvestigationReport()  is the twisted version of the code that I posted

That code should help your problem

Regards
Emre
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Cloud Class® Course: Microsoft Exchange Server

The MCTS: Microsoft Exchange Server 2010 certification validates your skills in supporting the maintenance and administration of the Exchange servers in an enterprise environment. Learn everything you need to know with this course.

  • 4
  • 4
Tackle projects and never again get stuck behind a technical roadblock.
Join Now