在Microsoft Dynamics AX 销售订单窗体、销售报价单窗体、采购订单窗体,订单头和订单行中有很多一样的字段,比如销售订单头上的“销售税组、维度、站点和仓库、港口、交货方式”等等。Dynamics AX 提供了一个统一的框架用来处理当用户更改订单头字段后,系统是否自动更新订单行上对应的字段。
字段更新动作可以通过“应收账款-设置-应收账款参数-更新-更新订单行”窗体进行设置,系统提供三种更新方式:
- 从不(订单头字段更新时不更新订单行字段)
- 提示(订单头字段更新时系统弹出对话框询问用户是否更新订单行字段)
- 始终(订单头字段更新时自动更新订单行字段)
如果我们有类似的扩展需求,比如在销售订单头和行上分别添加“目的港口”字段,当用户在订单头更改“目的港口”字段值时,实现标准系统的更新订单行上对应“目的港口”字段值的功能,可以参照下面的步骤进行开发。
1.在SalesTable表创建名为“Port_DP”的字段
2.将“Port_DP”的字段添加到SalesTable表的“HeaderToLineUpdate”字段组
2.在SalesLine表创建名为“Port_DP”的字段
3.将“Port_DP”的字段添加到SalesLine表的“HeaderToLineUpdate”字段组
4.将新添加的两个字段分别添加到“SalesTable”窗体相应的位置
5.在“AOT-Class-SalesTable2LineField-lineUpdateDescription”方法中添加如下代码:
case fieldnum(SalesTable, Port_DP): return fieldid2pname(tableNum(SalesLine), fieldNum(SalesLine, Port_DP));
6.在“AOT-Class-AxSalesTable”中添加如下方法:
public IntrastatPortId parmPort_DP(IntrastatPortId _port_DP = '') { if (!prmisdefault(_port_DP)) //判断传递参数是否为默认值 { this.setField(fieldnum(SalesTable, Port_DP), _port_DP); } return salesTable.Port_DP; }
7.在“AOT-Class-AxSalesLine”中添加如下方法:
public IntrastatPortId parmPort_DP(IntrastatPortId _port_DP = '') { if (!prmisdefault(_port_DP )) { this.setField(fieldnum(SalesLine, Port_DP), _port_DP ); } return salesLine.Port_DP; }
8.修改“AOT-Class-AxSalesLine”中添加如下方法:
protected void setPort_DP() { if (this.isMethodExecuted(funcname(), fieldnum(SalesLine, Port_DP))) { return; } this.setAxSalesTableFields(); if (this.isAxSalesTableFieldsSet() || this.axSalesTable().isFieldModified(fieldnum(SalesTable, Port_DP))) { this.parmPort_DP(this.axSalesTable().parmPort_DP()); } }
9.修改“AOT-Class-AxSalesLine-setTableFields”方法,添加如下代码:
this.setPort_DP();
10.在“AOT-Table-SalesTable2LineParameters-表浏览器” 删除“SalesTable2LineParameters”表的所有记录,然后通过“应收账款-设置-应收账款参数-更新-更新订单行”菜单再次打开窗体,让系统重建参数表。
//如果再次打开“更新订单行”窗体时,系统报错“cannot edit a record in order line update parameters(salestable2lineparameters).” 找到“SalesTable2LineParametersForm”类,重写一下这个类的New方法,成功运行窗体后删除代码就OK了。
void new() { super(); SalesTable2LineParameters::initiate(); this.initSalesTable2LineParameterFields(); }
11.打开销售订单窗体,修改订单头“港口”字段,保存记录时系统就会弹出对话框询问是否更新所有订单行上的对应字段。
其他几个模块也可以照葫芦画瓢开发就行了,涉及到的类和表分别如下:
销售报价单:SalesQuotationTable、SalesQuotationLine、SalesQuotationToLineParameters表;SalesQuotationToLineField、SalesQuotationToLineParametersForm、SalesQuotationToLineUpdate、AxSalesQuotationTable、AxSalesQuotationLine类
采购订单:PurchTable、PurchLine、PurchTable2LineParameters表;PurchTable2LineField、PurchTable2LineParametersForm、PurchTable2LineUpdate、AxPurchTable、AxPurchLine类
转载请注明:ww12345678 的部落格 | AX Helper » 扩展 Microsoft Dynamics AX 从订单头更新到订单行字段框架(SalesTable2Line)