X++ 2012实现Bank Reconciliation Summary PDF打印及弹窗隐藏问题
问题:Dynamics AX 2012 中通过X++自动生成Bank Reconciliation Summary报表PDF并隐藏参数弹窗
初始尝试与问题
我尝试用X++ 2012代码将Bank Reconciliation Summary报表导出为PDF,初始代码如下:
#define.ParamCheckingDate ('CheckingDate') #define.ParamSummary ('ReconciliationSummary') #define.ParamClearedDetails ('ClearedTransactionDetails') #define.ParamUnclearedDetails ('UnClearedTransactionDetails') SrsReportRunController controller = new BankReconciliationSummaryController(); SRSPrintDestinationSettings settings; BankReconciliationSummaryRdlContract rdlContract; controller.parmReportName("BankReconciliationSummary.Report"); controller.parmExecutionMode(SysOperationExecutionMode::ScheduledBatch); controller.parmShowDialog(false); rdlContract.setValue(#ParamCheckingDate,mkDate(27,05,2024)); rdlContract.setValue(#ParamClearedDetails,true); rdlContract.setValue(#ParamSummary,true); rdlContract.setValue(#ParamUnclearedDetails,false); controller.parmReportContract().parmRdpContract(rdlContract); settings = controller.parmReportContract().parmPrintSettings(); settings.printMediumType(SRSPrintMediumType::File); settings.fileFormat(SRSReportFileFormat::PDF); settings.fileName(@'C:\Users\spineda\Desktop\reporteTest.pdf'); controller.startOperation();
此时遇到的问题是合同类为私有,无法设置报表参数,需求是通过代码设置参数和文件路径,模拟手动点击打印、填写参数并确认的流程。
更新后的状态与新问题
已找到设置参数的方法,现在可以生成PDF文件,但已通过代码设置好参数,仍会弹出参数确认弹窗,需要隐藏该弹窗。更新后的代码如下:
void clicked() { #define.ParamCheckingDate ('CheckingDate') #define.ParamSummary ('ReconciliationSummary') #define.ParamClearedDetails ('ClearedTransactionDetails') #define.ParamUnclearedDetails ('UnClearedTransactionDetails') SrsReportRunController controller = new BankReconciliationSummaryController(); SRSPrintDestinationSettings settings; SRSReportParameter checkingDateParam = new SRSReportParameter(); SRSReportParameter clearedTransactionDetailsParam = new SRSReportParameter(); SRSReportParameter reconciliationSummaryParam = new SRSReportParameter(); SRSReportParameter unClearedTransactionDetailsParam = new SRSReportParameter(); SrsReportRdlDataContract rdlContract; Map reportParametersMap = new Map(Types::String, Types::Class); Map rdlReportParamMap; checkingDateParam.name(#ParamCheckingDate); checkingDateParam.dataType("DateTime"); clearedTransactionDetailsParam.name(#ParamClearedDetails); clearedTransactionDetailsParam.dataType("Boolean"); reconciliationSummaryParam.name(#ParamSummary); reconciliationSummaryParam.dataType("Boolean"); unClearedTransactionDetailsParam.name(#ParamUnclearedDetails); unClearedTransactionDetailsParam.dataType("Boolean"); reportParametersMap.insert("CheckingDate", checkingDateParam); reportParametersMap.insert("ClearedTransactionDetails", clearedTransactionDetailsParam); reportParametersMap.insert("ReconciliationSummary", reconciliationSummaryParam); reportParametersMap.insert("UnClearedTransactionDetails", unClearedTransactionDetailsParam); rdlReportParamMap = SrsReportRunUtil::createClonedParameters(reportParametersMap); rdlContract = SrsReportRdlDataContract::newContract("BankReconciliationSummaryRdlContract", rdlReportParamMap); controller.parmReportName("BankReconciliationSummary.Report"); controller.parmExecutionMode(SysOperationExecutionMode::Synchronous); controller.parmShowDialog(false); rdlContract.setValue(#ParamCheckingDate,DateTimeUtil::newDateTime(mkDate(27,05,2024), 0)); rdlContract.setValue(#ParamClearedDetails,true); rdlContract.setValue(#ParamSummary,true); rdlContract.setValue(#ParamUnclearedDetails,false); controller.parmReportContract().parmRdlContract().setValue(#ParamCheckingDate,DateTimeUtil::newDateTime(mkDate(27,05,2024), 0)); controller.parmReportContract().parmRdlContract().setValue(#ParamClearedDetails,true); controller.parmReportContract().parmRdlContract().setValue(#ParamSummary,true); controller.parmReportContract().parmRdlContract().setValue(#ParamUnclearedDetails,false); settings = controller.parmReportContract().parmPrintSettings(); settings.printMediumType(SRSPrintMediumType::File); settings.fileFormat(SRSReportFileFormat::PDF); settings.fileName(@'C:\Users\spineda\Desktop\reporteTestExitoso.pdf'); controller.startOperation(); }
解决方案
要彻底隐藏参数弹窗,需确保以下几点并简化代码:
- 提前调用
controller.parmShowDialog(false);,确保控制器初始化时就禁用弹窗,避免后续逻辑触发弹窗。 - 直接使用控制器自带的RDL合同对象,无需手动创建新合同,避免冗余代码导致的参数校验异常。
- 移除重复的参数设置逻辑,统一通过控制器的合同对象配置参数。
简化后的完整代码:
void clicked() { #define.ParamCheckingDate ('CheckingDate') #define.ParamSummary ('ReconciliationSummary') #define.ParamClearedDetails ('ClearedTransactionDetails') #define.ParamUnclearedDetails ('UnClearedTransactionDetails') SrsReportRunController controller = new BankReconciliationSummaryController(); SRSPrintDestinationSettings settings; SrsReportRdlDataContract rdlContract; // 先禁用弹窗,确保控制器初始化时不触发弹窗逻辑 controller.parmShowDialog(false); controller.parmReportName("BankReconciliationSummary.Report"); controller.parmExecutionMode(SysOperationExecutionMode::Synchronous); // 获取控制器自带的RDL合同对象 rdlContract = controller.parmReportContract().parmRdlContract(); // 设置报表参数 rdlContract.setValue(#ParamCheckingDate, DateTimeUtil::newDateTime(mkDate(27,05,2024), 0)); rdlContract.setValue(#ParamClearedDetails, true); rdlContract.setValue(#ParamSummary, true); rdlContract.setValue(#ParamUnclearedDetails, false); // 配置PDF导出设置 settings = controller.parmReportContract().parmPrintSettings(); settings.printMediumType(SRSPrintMediumType::File); settings.fileFormat(SRSReportFileFormat::PDF); settings.fileName(@'C:\Users\spineda\Desktop\reporteTestExitoso.pdf'); controller.startOperation(); }
额外检查点:如果弹窗仍存在,需确认BankReconciliationSummaryController类是否重写了parmShowDialog或相关方法强制显示弹窗,若有需确保代码设置的parmShowDialog(false)能覆盖默认逻辑。
内容的提问来源于stack exchange,提问作者Sam Pineda
相关产品推荐
相关产品推荐

