AX2012 - 找不到预处理的 RecId 参数
AX2012 - Pre-Processed RecId parameter not found
我在 AX2012 中制作了一个自定义报告,以替换 WHS 运输选择列表。自定义报告是基于 RDP 的。我直接 运行 没问题(使用参数对话框),但是当我尝试使用控制器 (WHSPickListShippingController) 时,我收到一条错误消息 "Pre-Processed RecId not found. Cannot process report. Indicates a development error."
错误是因为在classSrsReportProviderQueryBuilder(setArgs方法)中,映射变量reportProviderParameters为空。我不知道为什么会这样。我的数据提供程序中的代码运行正常。这是我的 运行 报告代码:
WHSWorkId id = 'LAM-000052';
WHSPickListShippingController controller;
Args args;
WHSShipmentTable whsShipmentTable;
WHSWorkTable whsWorkTable;
clWHSPickListShippingContract contract; //My custom RDP Contract
whsShipmentTable = WHSShipmentTable::find(whsWorkTable.ShipmentId);
args = new Args(ssrsReportStr(WHSPickListShipping, Report));
args.record(whsShipmentTable);
args.parm(whsShipmentTable.LoadId);
contract = new clWHSPickListShippingContract();
controller = new WHSPickListShippingController();
controller.parmReportName(ssrsReportStr(WHSPickListShipping, Report));
controller.parmShowDialog(false);
controller.parmLoadFromSysLastValue(false);
controller.parmReportContract().parmRdpContract(contract);
controller.parmReportContract().parmRdpName(classStr(clWHSPickListShippingDP));
controller.parmReportContract().parmRdlContract().parmLanguageId(CompanyInfo::languageId());
controller.parmArgs(args);
controller.startOperation();
我不知道我是否足够清楚...但我一直在寻找解决方案几个小时但没有成功,所以我想我会在这里问。这个变量(来自方法参数 AifQueryBuilderArgs)为空是否有原因?
我认为你的问题出在这些行上(尝试删除):
controller.parmReportContract().parmRdpContract(contract);
controller.parmReportContract().parmRdpName(classStr(clWHSPickListShippingDP));
controller.parmReportContract().parmRdlContract().parmLanguageId(CompanyInfo::languageId());
我希望在您的合同中看到的样式是这样的:
controller = new WHSPickListShippingController();
contract = controller.getDataContractObject();
contract.parmWhatever('ParametersHere');
controller.parmArgs(args);
而对于 DataProvider clWHSPickListShippingDP
,通常如果报表正在使用 DataProvider,您不会手动设置它,但 DP 扩展 SRSReportDataProviderBase
并具有属性 SRSReportParameterAttribute(...)
用这种风格装饰 class 声明:
[SRSReportParameterAttribute(classstr(MyCustomContract))]
class MyCustomDP extends SRSReportDataProviderBase
{
// Vars
}
你用的controller.parmReportContract().parmRdpContract(contract);
错了,因为这更多是为了运行次修改。它通常用于访问 preRunModifyContract
重载的合同。
在开发环境中构建您的交叉引用,然后右键单击 \Classes\SrsReportDataContract\parmRdpContract
并单击 Add-Ins>Cross-reference>Used By
以查看通常如何使用它。
好吧,现在我觉得花这么多时间在那个错误上很愚蠢,当它是这么小的事情时...
错误的那一行是:
controller.parmReportName(ssrsReportStr(WHSPickListShipping, Report));
因为WHSPickListShipping 是AX 报告的名称,但我将自定义报告重命名为clWHSPickListShipping。让我感到困惑的是我的 DataProvider class 正在按需要执行。
我在 AX2012 中制作了一个自定义报告,以替换 WHS 运输选择列表。自定义报告是基于 RDP 的。我直接 运行 没问题(使用参数对话框),但是当我尝试使用控制器 (WHSPickListShippingController) 时,我收到一条错误消息 "Pre-Processed RecId not found. Cannot process report. Indicates a development error."
错误是因为在classSrsReportProviderQueryBuilder(setArgs方法)中,映射变量reportProviderParameters为空。我不知道为什么会这样。我的数据提供程序中的代码运行正常。这是我的 运行 报告代码:
WHSWorkId id = 'LAM-000052';
WHSPickListShippingController controller;
Args args;
WHSShipmentTable whsShipmentTable;
WHSWorkTable whsWorkTable;
clWHSPickListShippingContract contract; //My custom RDP Contract
whsShipmentTable = WHSShipmentTable::find(whsWorkTable.ShipmentId);
args = new Args(ssrsReportStr(WHSPickListShipping, Report));
args.record(whsShipmentTable);
args.parm(whsShipmentTable.LoadId);
contract = new clWHSPickListShippingContract();
controller = new WHSPickListShippingController();
controller.parmReportName(ssrsReportStr(WHSPickListShipping, Report));
controller.parmShowDialog(false);
controller.parmLoadFromSysLastValue(false);
controller.parmReportContract().parmRdpContract(contract);
controller.parmReportContract().parmRdpName(classStr(clWHSPickListShippingDP));
controller.parmReportContract().parmRdlContract().parmLanguageId(CompanyInfo::languageId());
controller.parmArgs(args);
controller.startOperation();
我不知道我是否足够清楚...但我一直在寻找解决方案几个小时但没有成功,所以我想我会在这里问。这个变量(来自方法参数 AifQueryBuilderArgs)为空是否有原因?
我认为你的问题出在这些行上(尝试删除):
controller.parmReportContract().parmRdpContract(contract);
controller.parmReportContract().parmRdpName(classStr(clWHSPickListShippingDP));
controller.parmReportContract().parmRdlContract().parmLanguageId(CompanyInfo::languageId());
我希望在您的合同中看到的样式是这样的:
controller = new WHSPickListShippingController();
contract = controller.getDataContractObject();
contract.parmWhatever('ParametersHere');
controller.parmArgs(args);
而对于 DataProvider clWHSPickListShippingDP
,通常如果报表正在使用 DataProvider,您不会手动设置它,但 DP 扩展 SRSReportDataProviderBase
并具有属性 SRSReportParameterAttribute(...)
用这种风格装饰 class 声明:
[SRSReportParameterAttribute(classstr(MyCustomContract))]
class MyCustomDP extends SRSReportDataProviderBase
{
// Vars
}
你用的controller.parmReportContract().parmRdpContract(contract);
错了,因为这更多是为了运行次修改。它通常用于访问 preRunModifyContract
重载的合同。
在开发环境中构建您的交叉引用,然后右键单击 \Classes\SrsReportDataContract\parmRdpContract
并单击 Add-Ins>Cross-reference>Used By
以查看通常如何使用它。
好吧,现在我觉得花这么多时间在那个错误上很愚蠢,当它是这么小的事情时...
错误的那一行是:
controller.parmReportName(ssrsReportStr(WHSPickListShipping, Report));
因为WHSPickListShipping 是AX 报告的名称,但我将自定义报告重命名为clWHSPickListShipping。让我感到困惑的是我的 DataProvider class 正在按需要执行。