You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();
}

解决方案

要彻底隐藏参数弹窗,需确保以下几点并简化代码:

  1. 提前调用controller.parmShowDialog(false);,确保控制器初始化时就禁用弹窗,避免后续逻辑触发弹窗。
  2. 直接使用控制器自带的RDL合同对象,无需手动创建新合同,避免冗余代码导致的参数校验异常。
  3. 移除重复的参数设置逻辑,统一通过控制器的合同对象配置参数。

简化后的完整代码:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 08:14:55