计算行数量在总数量中的占比原创
56人赞赏了该文章
246次浏览
编辑于2024年05月27日 20:26:13
客户要求每行录入重量, 得出该重量在总重量中的占比,然后再用这个占比值,去参与其它运算。
简化成公式: 行占比 = 行重量 / 总重量。占比之和 =100
分享下思路:
① 获取行重量 weight, 每次修改重量都需重新计算占比
② 汇总重量 total_weight
③ 行占比r ate = weight/ total_weight * 100
④ 因为有精度损失,每行直接求占比,它们的和可能不为100。 所以最后一行的占比做了变通: 100 - 前N-1 t行占比和
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")
推荐阅读