Odoo中文社区可以通过以下三个域名访问:shine-it.net , odoocn.org,odoo.net.cn

原论坛用户的基本信息和发帖这里都予以保留,请注意:原论坛用户无需重新注册新用户,但是您的密码需要重置

开发人员可以登录gitter讨论组: http://gitter.im/odoo-china/Talk, 需要github账号

如果您登录系统碰到问题,请在微信公众号留言:

OpenERP MRP运算中的小数精度若干Bug修正



  • 1)BoM表的参数及其应用<br />Manufacturing Efficiency:成品率<br />Product Rounding:数量精度<br />Quantity:数量<br /><br />应用举例:<br />BoM表中,有些原料用量精度要求很高,有些精度要求低。<br />例如A原料BoM表中的单位是千克,精度要求是0.001千克,<br />B原料单位是克,精度要求是0.1克。<br />系统可以设置BoM上原料用量的小数位数(参数“Product Unit of Measure”),<br />但该参数适用于所有原料,它不能按不同原料分别设置小数位数。<br />Product Rounding正是用于解决BoM上不同原料的不同精度要求问题。<br /><br />2)变量值<br />成品BoM上数量(Quantity)为Q1,精度(Product Rounding)为R1, 成品率(Manufacturing Efficiency)为E1<br />MO上生产数量为Q2,BoM Line上某原料数量为Q3,精度为R2,成品率为E2<br /><br />3)MRP计算步骤<br />a. 先计算产量因子:F = Q2 / Q1, 如果MO上和BoM上单位不同,这个步骤还会先单位换算。<br />b. 再考虑成品损耗率: F = F / E1<br />c. 再考虑成品数量及精度: Q = Rounding(F*Q1),这里的精度计算步骤是,取BoM的精度R1和单位上的精度两者较大者,“上抛”到精度值的整数倍。<br />d. 之后开始计算原料数量因子,F =  F / E2<br />e. 再考虑原料数量及精度: Q = Rounding(Q3 * F), 这里的计算也是,取精度R2和BoM Line单位上的精度,两者较大者,“上抛”到精度值的整数倍。<br /><br />4)注意,上述MRP计算步骤是经过Bug修正后(修正点:mrp.py中方法_bom_explode)的步骤,OpenERP本来的计算步骤如下(其精度计算方式某些情况下误差非常大!):<br />a. 先计算产量因子:F = Q2 / Q1, 如果MO上和BoM上单位不同,这个步骤还会先单位换算。<br />b. 再考虑成品损耗率: F = F / E1<br />c. 再考虑成品精度: F = Rounding(F),这里的精度计算步骤是,取BoM的精度R1和单位上的精度两者较大者,“上抛”到精度值的整数倍。<br />d. 之后开始计算原料数量因子,F =  F / E2<br />e. 再考虑原料精度值: F = Rounding(F), 这里的计算也是,取精度R2和BoM Line单位上的精度,两者较大者,“上抛”到精度值的整数倍。<br />f. 最后计算原料数量:Q = Q3 * F<br /><br />5)MO报工时候的小数问题<br />假设MO上的成品数量是Q1,根据BoM计算出来的某原料,需要消耗的总数量为Q2,某次报工数量Q3。<br />则系统自动计算需要消耗原料数量为:Q3/Q1 * Q2。<br /><br />假设某MO单,其成品数量为9,需要消耗的原料也是9。该MO分3次生产,每次生产3个。<br />当9个都生产完工后,系统计算的消耗原料数量为:<br />第一次:3/9 = 0.33333333 * 9<br />第二次:3/9 = 0.33333333 * 9<br />第三次:3/9 = 0.33333333 * 9<br />三次消耗的总原料数为:0.99999999 * 9,总数量不等于9。<br />因此MO单上的待消耗原料行,仍会显示尚有0.00000(实际是0.00000001)的原料待消耗,从而该MO单不能变为Done状态。<br /><br />该Bug修正方法(修正点:mrp.py中方法action_produce):MO上每次原料消耗时候,如果剩余原料数量不足以生产一个成品需要消耗的数量(小于Q2/Q1),则一次性消耗掉所有原料,而不是消耗原料Q3/Q1 * Q2。<br />



  • 1)BoM表的参数及其应用<br />Manufacturing Efficiency:成品率<br />Product Rounding:数量精度<br />Quantity:数量<br /><br />应用举例:<br />BoM表中,有些原料用量精度要求很高,有些精度要求低。<br />例如A原料BoM表中的单位是千克,精度要求是0.001千克,<br />B原料单位是克,精度要求是0.1克。<br />系统可以设置BoM上原料用量的小数位数(参数“Product Unit of Measure”),<br />但该参数适用于所有原料,它不能按不同原料分别设置小数位数。<br />Product Rounding正是用于解决BoM上不同原料的不同精度要求问题。<br /><br />2)变量值<br />成品BoM上数量(Quantity)为Q1,精度(Product Rounding)为R1, 成品率(Manufacturing Efficiency)为E1<br />MO上生产数量为Q2,BoM Line上某原料数量为Q3,精度为R2,成品率为E2<br /><br />3)MRP计算步骤<br />a. 先计算产量因子:F = Q2 / Q1, 如果MO上和BoM上单位不同,这个步骤还会先单位换算。<br />b. 再考虑成品损耗率: F = F / E1<br />c. 再考虑成品数量及精度: Q = Rounding(F*Q1),这里的精度计算步骤是,取BoM的精度R1和单位上的精度两者较大者,“上抛”到精度值的整数倍。<br />d. 之后开始计算原料数量因子,F =  F / E2<br />e. 再考虑原料数量及精度: Q = Rounding(Q3 * F), 这里的计算也是,取精度R2和BoM Line单位上的精度,两者较大者,“上抛”到精度值的整数倍。<br /><br />4)注意,上述MRP计算步骤是经过Bug修正后(修正点:mrp.py中方法_bom_explode)的步骤,OpenERP本来的计算步骤如下(其精度计算方式某些情况下误差非常大!):<br />a. 先计算产量因子:F = Q2 / Q1, 如果MO上和BoM上单位不同,这个步骤还会先单位换算。<br />b. 再考虑成品损耗率: F = F / E1<br />c. 再考虑成品精度: F = Rounding(F),这里的精度计算步骤是,取BoM的精度R1和单位上的精度两者较大者,“上抛”到精度值的整数倍。<br />d. 之后开始计算原料数量因子,F =  F / E2<br />e. 再考虑原料精度值: F = Rounding(F), 这里的计算也是,取精度R2和BoM Line单位上的精度,两者较大者,“上抛”到精度值的整数倍。<br />f. 最后计算原料数量:Q = Q3 * F<br /><br />5)MO报工时候的小数问题<br />假设MO上的成品数量是Q1,根据BoM计算出来的某原料,需要消耗的总数量为Q2,某次报工数量Q3。<br />则系统自动计算需要消耗原料数量为:Q3/Q1 * Q2。<br /><br />假设某MO单,其成品数量为9,需要消耗的原料也是9。该MO分3次生产,每次生产3个。<br />当9个都生产完工后,系统计算的消耗原料数量为:<br />第一次:3/9 = 0.33333333 * 9<br />第二次:3/9 = 0.33333333 * 9<br />第三次:3/9 = 0.33333333 * 9<br />三次消耗的总原料数为:0.99999999 * 9,总数量不等于9。<br />因此MO单上的待消耗原料行,仍会显示尚有0.00000(实际是0.00000001)的原料待消耗,从而该MO单不能变为Done状态。<br /><br />该Bug修正方法(修正点:mrp.py中方法action_produce):MO上每次原料消耗时候,如果剩余原料数量不足以生产一个成品需要消耗的数量(小于Q2/Q1),则一次性消耗掉所有原料,而不是消耗原料Q3/Q1 * Q2。<br />


登录后回复
 

与 Odoo 中文社区 的连接断开,我们正在尝试重连,请耐心等待