如何打开含子报表的BILLINGRBatch报表并自动赋值消除弹窗
VB调用带参Crystal Reports(含子报表)消除参数弹窗解决方案
核心解决步骤
1. 严格把控参数赋值的时机与范围
必须在报表加载后、显示/刷新前完成主报表+所有子报表的参数赋值,同时标记参数已被赋值:
' 初始化报表实例 Dim crReport As New BILLINGRBatch ' 先批量设置主/子报表的数据库登录信息 SetAllReportLogon(crReport, serverName, dbName, userId, pwd) ' 为主报表参数赋值并标记已完成 crReport.ParameterFields("insertquery").CurrentValues.AddValue(strSelect) crReport.ParameterFields("insertquery").HasCurrentValue = True crReport.ParameterFields("customername").CurrentValues.AddValue(customerName) crReport.ParameterFields("customername").HasCurrentValue = True ' 遍历所有子报表,同步参数赋值 For Each subObj As CrystalDecisions.CrystalReports.Engine.SubreportObject In crReport.ReportDefinition.ReportObjects If subObj.Kind = CrystalDecisions.Shared.ReportObjectKind.SubreportObject Then Dim subReportDoc As CrystalDecisions.CrystalReports.Engine.ReportDocument = subObj.OpenSubreport(subObj.SubreportName) ' 传递关联参数(确保子报表参数名与主报表一致) subReportDoc.ParameterFields("customername").CurrentValues.AddValue(customerName) subReportDoc.ParameterFields("customername").HasCurrentValue = True ' 若子报表也用到insertquery,同样赋值 ' subReportDoc.ParameterFields("insertquery").CurrentValues.AddValue(strSelect) ' subReportDoc.ParameterFields("insertquery").HasCurrentValue = True End If Next ' 绑定报表并禁用查看器的参数提示 CrystalReportViewer1.ReportSource = crReport CrystalReportViewer1.EnableParameterPrompt = False CrystalReportViewer1.ShowParameterPanelButton = False CrystalReportViewer1.Refresh()
2. 封装数据库登录设置(覆盖子报表)
单独写一个递归方法,确保主报表和所有子报表的表都应用正确的登录信息:
Private Sub SetAllReportLogon(crDoc As CrystalDecisions.CrystalReports.Engine.ReportDocument, server As String, db As String, uid As String, pwd As String) ' 设置当前报表的表登录 For Each crTable As CrystalDecisions.CrystalReports.Engine.Table In crDoc.Database.Tables Dim logOnInfo As CrystalDecisions.Shared.TableLogOnInfo = crTable.LogOnInfo logOnInfo.ConnectionInfo.ServerName = server logOnInfo.ConnectionInfo.DatabaseName = db logOnInfo.ConnectionInfo.UserID = uid logOnInfo.ConnectionInfo.Password = pwd crTable.ApplyLogOnInfo(logOnInfo) Next ' 递归设置子报表的表登录 For Each subObj As CrystalDecisions.CrystalReports.Engine.SubreportObject In crDoc.ReportDefinition.ReportObjects If subObj.Kind = CrystalDecisions.Shared.ReportObjectKind.SubreportObject Then Dim subReportDoc As CrystalDecisions.CrystalReports.Engine.ReportDocument = subObj.OpenSubreport(subObj.SubreportName) SetAllReportLogon(subReportDoc, server, db, uid, pwd) End If Next End Sub
3. 检查报表设计端的参数配置
打开Crystal Reports设计器,确认:
- 主报表和子报表的目标参数,其Prompting Behavior设置为
Do not prompt - 主报表与子报表的参数关联规则正确,子报表参数是通过主报表传递,而非独立的输入参数
- 参数名的大小写、拼写与代码中完全一致(Crystal Reports参数名区分大小写)
内容的提问来源于stack exchange,提问作者Raffy
相关产品推荐
相关产品推荐

