(升级版)根据实际总量按照理论数量及类别分摊到各行并调差原创
金蝶云社区-谁是我
谁是我
12人赞赏了该文章 162次浏览 未经作者许可,禁止转载编辑于2023年10月30日 15:20:10

基本版内容点击此处,或者打开该链接: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、  最终的界面如下图:用单据头菜单调用【实际总重】值更新事件,实现按颜色分配重量到下方单据体对应颜色的分录行,并获取右上角表格的总行数写入单据头【下一行】字段;

1698647882495.jpg

上图字段说明:

右上角单据体:记录不同颜色的重量,以便按颜色分配到下方的单据体;

实际总重:记录右上单据体当前行的重量数据;

颜色H:记录右上角单据体当前行的颜色;

理论总重:记录下方单据体中【颜色E】等于【颜色H】的各行【理论重量】的合计数;

计算总重:记录下方单据体中【颜色E】等于【颜色H】的各行【实际重量】的合计数;

下一行:记录右上角单据体的行数,每读取并分配一行重量数据后自动减1;

末行:记录按颜色分配重量到下方单据体时,最后一次分配重量数据时的行号,以方便区分颜色进行重量数据的差额调整处理;


5、  值更新事件说明

下图为单据头上【实际总重】字段的值更新事件,是解决方案中的关键内容,各值更新事件的执行顺序不能错乱;

1698648008487.jpg

取得指定行数据:按行获取右上角表中的重量和颜色数据,写入单据头的【实际总重】和【颜色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 数据获取方法,单据体标识符))  汇总指定分录行指定列的数据


赞 12