计算行数量在总数量中的占比原创
金蝶云社区-RSi
RSi
56人赞赏了该文章 246次浏览 未经作者许可,禁止转载编辑于2024年05月27日 20:26:13

客户要求每行录入重量, 得出该重量在总重量中的占比,然后再用这个占比值,去参与其它运算。 

简化成公式: 行占比 = 行重量 / 总重量。占比之和 =100 


分享下思路: 

① 获取行重量 weight, 每次修改重量都需重新计算占比

② 汇总重量 total_weight

③ 行占比r ate = weight/ total_weight * 100 

④ 因为有精度损失,每行直接求占比,它们的和可能不为100。 所以最后一行的占比做了变通: 100 - 前N-1 t行占比和



image.png

     
import clr

clr.AddReference("Kingdee.BOS")
clr.AddReference("Kingdee.BOS.Core")


from Kingdee.BOS.Core import *
from Kingdee.BOS import *

'''
F_NB_Quantity  用量
F_NB_Rate  占比
F_NB_RawPrice  原料单价

'''
def DataChanged(e):
   #修改用量
   if e.Key=="F_NBDF_Quantity" :
       
        # 获取单据体行数
        cnt=this.View.Model.GetEntryRowCount("FEntity")
       
        sumValue=0

        #用量汇总
        for i in range(cnt):
             sumValue += this.View.Model.GetValue("F_NBDF_Quantity",i )
       
        #this.View.ShowMessage('''行数{0},总数:{1}'''.format(cnt,sumValue))

   
        rates=0   # 占比汇总
        rates_l =0  #前N-1 行占比汇总
        rows = []
        for i in range(cnt) :
            qty=this.View.Model.GetValue("F_NBDF_Quantity",i)    
            if qty !=0 :
                rows.append(i)        
            this.View.Model.SetValue("F_NBDF_Rate",qty / sumValue * 100, i )  
       
       
        # 序号列表中删除修改后重量为0的元素。 
        if e.NewValue==0 and rows.count(e.Row) > 0:
            rows.remove(e.Row)
       
        # 因为占比是重量除以总重量,类型是一个采用IEEEE754的浮点数, 只能近似的表示小数,
        # 故占比之和有可能不是100, 那么跟客户商量后, 最后一行占比 用100 - 前N-1 行占比和
        # 
        for i in range(len(rows)) :            
            if i == len(rows)-1:
                rates_l= rates
            rates += this.View.Model.GetValue("F_NBDF_Rate", rows[i] )  

       
        if rates != 100:
            this.View.Model.SetValue("F_NBDF_Rate", 100 - rates_l, rows[len(rows)-1] )
       
        this.View.UpdateView("F_NB_Rate")

赞 56