业务场景:销售订单行的交货计划,可以按订单行进行拆分交货,系统的拆分计划,在销售订单没有关联项目Id时,可以使用,有项目ID的销售订单行是不可以使用交货计划的。
我主要分享下下面两个知识点,也可能是大家经常遇到的;
1.交货计划的可编辑性:
一般的按钮编辑都是在Form下写方法控制,但部分Form的可编辑性是在类中实现的,销售订单就是个例子:
控制销售订单按钮可编辑性的类:SalesTableInteractionHelper
比如行上的交货计划按钮就是在SalesTableInteractionHelper类中的isOpenOrderNotReturnNotProjectRelatedSalesLine中控制:
private boolean isOpenOrderNotReturnNotProjectRelatedSalesLine() { return (salesTable.SalesType == SalesType::Sales || salesTable.SalesType == SalesType::Journal) && salesLine.SalesStatus == SalesStatus::Backorder // Open order status && salesLine.SalesQty >= 0 ; // No negative qty //当销售订单上的项目号有值时,也可以使用订单行上的交货计划按钮--Sunny Add start /* && !salesTable.ProjId; // not part of a project */ //Sunny Add end }
2.交货计划拆分行时,其新行上的字段从原行中复制而来,即会执行SalesLine上的InitFromSalesline方法,和initFromOrderLineWithMultipleDeliveries方法,一般新加的字段可在这两个方法中进行初始化;
但例外的是,部分字段会被清空,比如项目Id,跟代码可以看到,这是因为系统再init方法中执行后,在后面的SalesLineType_Project类的初始化时会清空,如果需要带出项目类别,则我们可以重写此类下的初始化方法。当然这是一个字段,要是有其他字段也可类似找方法:
//交货计划拆分时带出项目类别-- [ExtensionOf(classstr(SalesLineType_Project))] final class SalesLineType_Project_Extension { void initValue() { SalesLine saleslineOrig; ProjCategoryId projCategoryId; saleslineOrig = this.salesLine; projCategoryId = saleslineOrig.ProjCategoryId; next initValue(); if(!saleslineOrig.ProjCategoryId) { saleslineOrig.ProjCategoryId = projCategoryId; } } }
一周没更新了。。。