Sage CR10:Crystal Reports Ninja PowerShell传参报字段兼容错误
运行PowerShell脚本调用Crystal Reports生成报表时,首次触发报错:
参数字段与参数字段当前值的类型不兼容。
涉及的报表共包含3个参数:
BeginDate EndDate Owner
其中Owner为固定静态参数,无需动态调整。
原脚本中用于计算上月首日、上月末日的变量定义如下:
$FirstDayMonth = (Get-Date -Day 1).AddMonths(-1).ToString("MM/dd/yyyy") $LastDayMonth = (Get-Date -Day 1).AddDays(-1).ToString("MM/dd/yyyy")
原传参代码段(适用于PowerShell/Crystal Reports Ninja向Crystal Reports传递参数场景):
-a "BeginDate:($FirstDayMonth)" -a "EndDate:($LastDayMonth)" -a "Owner:3001"
尝试移除日期变量外层的括号后,触发新的报错:
异常:
文件LSFMoveReport 25544_25504_{6ED7AB69-4987-4705-8854-0C3CE21FC7B5}.rpt出错:
对链接参数执行了非法操作。
内部异常:System.Runtime.InteropServices.COMException (0x80000290):
文件LSFMoveReport 25544_25504_{6ED7AB69-4987-4705-8854-0C3CE21FC7B5}.rpt出错:
对链接参数执行了非法操作。
位于 CrystalDecisions.ReportAppServer.Controllers.ReportSourceClass.Export(ExportOptions pExportOptions, RequestContext pRequestContext)
位于 CrystalDecisions.ReportSource.EromReportSourceBase.ExportToStream(ExportRequestContext reqContext)
- 先修复日期类型不匹配问题:Crystal Reports的日期类参数默认优先接收DateTime类型值,提前将日期转为
MM/dd/yyyy格式字符串,很容易因运行环境的区域日期格式差异导致解析失败,触发类型不兼容报错。优先直接传递日期类型对象,修改变量定义:
$FirstDayMonth = (Get-Date -Day 1).AddMonths(-1).Date $LastDayMonth = (Get-Date -Day 1).AddDays(-1).Date
- 修正传参写法:Crystal Reports Ninja传递参数时不需要用括号包裹变量值,同时必须严格按照报表文件中定义的参数顺序传值,顺序错乱会直接触发链接参数非法报错,传参段调整为:
-a "BeginDate:$FirstDayMonth" -a "EndDate:$LastDayMonth" -a "Owner:3001"
- 排查链接参数报错:打开对应rpt报表文件,检查参数面板的参数排列顺序,确认不存在和现有参数绑定的隐藏级联参数,所有需要传值的参数都已覆盖,再严格按照面板从上到下的顺序排列传参代码即可。
- 如果直接传日期对象依然报类型错误,可将日期转为无区域歧义的ISO标准格式字符串传递,避免格式解析冲突:
$FirstDayMonth = (Get-Date -Day 1).AddMonths(-1).ToString("yyyy-MM-dd") $LastDayMonth = (Get-Date -Day 1).AddDays(-1).ToString("yyyy-MM-dd")
补充:如果Owner参数在报表中定义为字符串类型,需要给参数值加转义引号,写成-a "Owner:\"3001\"",避免数字/字符串类型不匹配。
内容的提问来源于stack exchange,提问作者WarehouseProgrammer

