基本版内容点击此处,或者打开该链接:https://vip.kingdee.com/article/504335995177939712
需求场景:
铝材入库或发货时,件数是确定的,但是重量数据只有整车称重的总数,需要先按照颜色分配总重,再按各分录行铝材颜色及理论重量的比例,分摊不同颜色总重量,作为各行的实际重量;
相对于上文提到的基础版内容,此处增加了按照颜色分配总重的部分;
难点:
从一个表格逐行取数,再逐一按指定比例分摊到另一个表格符合条件的对应行;
因为要按不同颜色分配总重,意味着要另一个记录有各行颜色对应重量的表格逐行取数,再分配到主单据体对应颜色的分录行;
解决方案:
1、 按行分配总重及处理差异的方法见基础版,此处只需多加一个按颜色区分的条件即可;
2、 从指定表格逐行取数的方法:
单据体标识符.TargetObjects[行号].字段标识符;注意,行号从0开始,不是从1开始;
示例:
F_dao_Decimal = F_dao_Entity.TargetObjects[ F_dao_Integer -1].F_dao_Integer1
F_dao_Text1 = F_dao_Entity.TargetObjects[ F_dao_Integer -1].F_dao_Text
FDescription = F_dao_Entity.TargetObjects[ F_dao_Integer -1].F_dao_Base.FSpecification
上式中:F_dao_Integer用于记录单据体的总行数,并按1递减;
3、 从表格逐行取数的方法:
在两个单据头字段的值更新事件中,互相调用对方的值更新事件,用表格的总行数作为循环终止的判断条件,每循环一次,总行数减一;也就是从表格的最后一行开始取数,直到第一行;
4、 最终的界面如下图:用单据头菜单调用【实际总重】值更新事件,实现按颜色分配重量到下方单据体对应颜色的分录行,并获取右上角表格的总行数写入单据头【下一行】字段;
上图字段说明:
右上角单据体:记录不同颜色的重量,以便按颜色分配到下方的单据体;
实际总重:记录右上单据体当前行的重量数据;
颜色H:记录右上角单据体当前行的颜色;
理论总重:记录下方单据体中【颜色E】等于【颜色H】的各行【理论重量】的合计数;
计算总重:记录下方单据体中【颜色E】等于【颜色H】的各行【实际重量】的合计数;
下一行:记录右上角单据体的行数,每读取并分配一行重量数据后自动减1;
末行:记录按颜色分配重量到下方单据体时,最后一次分配重量数据时的行号,以方便区分颜色进行重量数据的差额调整处理;
5、 值更新事件说明
下图为单据头上【实际总重】字段的值更新事件,是解决方案中的关键内容,各值更新事件的执行顺序不能错乱;
取得指定行数据:按行获取右上角表中的重量和颜色数据,写入单据头的【实际总重】和【颜色H】字段,作为按颜色分配重量到下方单据体的数据源;
取数公式如下:
F_dao_Decimal = F_dao_Entity.TargetObjects[ F_dao_Integer -1].F_dao_Integer1
F_dao_Text1 = F_dao_Entity.TargetObjects[ F_dao_Integer -1].F_dao_Text
上式中:F_dao_Decimal时单据头【实际总重】字段,F_dao_Entity是右上角单据体的标识符,F_dao_Integer是单据头的【下一行】字段,初始数据是右上角单据体的总行数,F_dao_Text1是单据头【颜色H】字段,F_dao_Text是右上角单据体的【颜色】字段;
前提条件:
F_dao_Integer>0
计算理论总重(按颜色):获取下方单据体中【颜色E】等于【颜色H】的各行【理论重量】的合计数,写入单据头的【理论总重】;
取数公式如下:
F_dao_Decimal1 = sum(map(lambda x:(x.F_dao_Decimal3 if x.F_dao_Yanse == F_dao_Text1 else 0), FBATCHADJUSTENTRY ))
上式中:F_dao_Decimal1是单据头上的【理论重量】字段,F_dao_Decimal3是单据体的【理论重量】字段,F_dao_Yanse是单据体的【颜色E】字段;F_dao_Text1是单据头上的【颜色H】字段,FBATCHADJUSTENTRY是下方单据体的标识符;
调用【理论重量】字段值更新服务:调用单据体的【理论重量】字段,进行实际重量的分配计算,并记录分配重量数据时的行号,到单据头的【末行】字段;
注意:必须先计算单据头的【理论总重】
更新计算重量(按颜色):获取下方单据体中【颜色E】等于【颜色H】的各行【实际重量】的合计数,写入单据头的【计算重量】字段
取数公式如下:
F_dao_Decimal11 = sum(map(lambda x:(x.F_dao_Decimal2 if x.F_dao_Yanse == F_dao_Text1 else 0), FBATCHADJUSTENTRY ))
上式中:F_dao_Decimal11是单据头上的【计算总重】字段,F_dao_Decimal2是单据体的【实际重量】字段,F_dao_Yanse是单据体的【颜色E】字段;F_dao_Text1是单据头上的【颜色H】字段,FBATCHADJUSTENTRY是下方单据体的标识符;
注意:必须先执行前面的实际重量分配过程;
调用【】字段值更新服务更新第一行:此处调用的是单据体字段的值更新事件,用于差额调整,防止各行实际重量的合计数与实际总重不符,更新的是下方单据体中,单据头【末行】字段所指行的【实际重量】字段
注意:必须先计算单据头的【计算总重】;
递减总行数:将单据头的【下一行】字段值减1,准备获取下一行数据;
调用【理论总重】字段值更新服务:单据头字段【理论总重】的值更新事件只有一项,那就是调用单据头【实际总重】的值更新事件,用以实现循环获取右上角单据体各行的数据;
前提条件:
F_dao_Integer>0
上式中:F_dao_Integer是单据头的【下一行】字段,初始数据是右上角单据体的总行数;
注意:必须先递减总行数,也就是将【下一行】字段值减1,取下一行数据,否则会出现死循环;
6、 总结
用方法:单据体标识符.TargetObjects[行号].字段标识符 获取单据体指定行的数据;
用两个单据头字段互相调用值更新事件实现循环取数,注意设置循环终止条件;
用方法:sum(map(lambda 数据获取方法,单据体标识符)) 汇总指定分录行指定列的数据
推荐阅读