- 欠料算法逻辑 (只做逻辑分析,高效的代码自己写,根据情况合适的来,递归是必要,好的算法更是必要)
- 最好是用vc 做成DLL 在其他语言直接调用!这是个反复思考和反复测试模拟的过程。
- k = 库存+累计出货 整体作为库存
- 第一周
- if k > 需1 then -------库存 大于 第一周需求
- 欠1 = 0 -------不欠数为0
- 剩1 = k-需1 -------第一周用料的剩余库存
- else
- 欠1 = 需1 - k ------需求量 大于 库存 得出第一周欠量
- 剩1 = 0 ------库存用完了
- end if
- 第二周
- if 剩1 > 需2 then -------第一周用料的剩余库存 大于 第二周需求
- 欠2 = 0 -------不欠数为0
- 剩2 = 剩1 - 需2 -------第二周用料的剩余库存
- else
- 欠2 = 需2 - 剩1 ------需求量 大于 第一周用料的剩余库存 得出第二周欠量
- 剩2 = 0 ------库存用完了
- end if
- 第三周
- if 剩2 > 需3 then -------第二周用料的剩余库存 大于 第二周需求
- 欠3 = 0 -------不欠数为0
- else
- 欠3 = 需3 - 剩2 ------需求量 大于 第二周用料的剩余库存 得出第三周欠量
- end if
- 父料-->子料 父欠==子需
- a.子料下有子料
- b.不同子料下有不同的子料,但有可能有共用同一个子料的的情况
- # 向上历遍,取第一个相同物号的计算后剩余库存算法
- l_current_index 向上历遍坐标
- g_cnt_index-1 当前坐标的上一个坐标
- FOR l_current_index = g_cnt_index-1 TO 1 STEP -1
- IF 当前坐标bom料号 = 向上历遍坐标 THEN
- LET 当前坐标的库存数量(周1) = 向上历遍坐标的库存数量(周1)
- LET 当前坐标的库存数量(周2) = 向上历遍坐标的库存数量(周2)
- LET 当前坐标的库存数量(周3) = 向上历遍坐标的库存数量(周3)
- LET 当前坐标的欠料数量(周1) = 当前坐标的需求数量(周1) - 当前坐标的库存数量(周1)
- LET 当前坐标的欠料数量(周2) = 当前坐标的需求数量(周2) - 当前坐标的库存数量(周2)
- LET 当前坐标的欠料数量(周3) = 当前坐标的需求数量(周3) - 当前坐标的库存数量(周3)
- END IF
- END IF
- #没有找到相同BOM料 欠料算法就等同与cmrt100的算法了
- #当前坐标的库存数量(周1) = -9999999 给个初始值
- IF 当前坐标的库存数量(周1) = -9999999 THEN
- LET 当前坐标的库存数量(周1) = 当前坐标库存数量+当前坐标在制量
- IF 当前坐标的库存数量(周1) > 当前坐标的需求数量(周1) THEN
- LET 当前坐标的欠料数量(周1) = 0
- LET 当前坐标的库存数量(周2) = 当前坐标的库存数量(周1) - 当前坐标的需求数量(周1) #剩余库存
- ELSE
- LET 当前坐标的欠料数量(周1) = 当前坐标的需求数量(周1) - 当前坐标的库存数量(周1)
- LET 当前坐标的库存数量(周2) = 0
- END IF
- IF 当前坐标的库存数量(周2) > 当前坐标的需求数量(周2) THEN
- LET 当前坐标的欠料数量(周2) = 0
- LET 当前坐标的库存数量(周3) = 当前坐标的库存数量(周2) - 当前坐标的需求数量(周2) #剩余库存
- ELSE
- LET 当前坐标的欠料数量(周2) = 当前坐标的需求数量(周2) - 当前坐标的库存数量(周2)
- LET 当前坐标的库存数量(周3) = 0
- END IF
- IF 当前坐标的库存数量(周3) > 当前坐标的需求数量(周3) THEN
- LET 当前坐标的欠料数量(周3) = 0
- ELSE
- LET 当前坐标的欠料数量(周3) = 当前坐标的需求数量(周3) - 当前坐标的库存数量(周3)
- END IF
- END IF
- 子料-->子料 父欠(子料)== 子需
- #向上历遍 寻找父欠作为子料的需求
- 变量1 共用料号标记 [Y,N]
- 变量2 标记料号
- 变量3 阶数
- 变量4 当前坐标
- 变量5 设置标记: 该父件已经被子件计算过
- IF 标记料号 != 当前料号 THEN
- LET 阶数 = -1
- FOR 向上历遍坐标 = 当前坐标 - 1 TO 1 STEP -1
- IF 向上历遍坐标阶数 = 当前坐标阶数 - 1 THEN
- LET 共用料号标记 = 'N'
- LET 阶数 = 向上历遍坐标阶数
- END IF
- IF 向上历遍坐标阶数 <= 向上历遍坐标阶数 - 2 THEN
- EXIT FOR --就是子料下面没有子料 退出循环 找不到
- END IF
- END FOR
- LET 标记料号 = 当前料号 #当前料号赋给标记料号
- END IF
- # 被子件选择作为父件的记录索引
- LET 设置标记 = -1
- FOR 向上历遍坐标 = 当前坐标 - 1 TO 1 STEP -1
- IF 当前坐标子料料号 = 向上历遍坐标子料料号 THEN
- IF 共用料号标记 = 'Y' THEN
- # 已经被下阶子件作为父件计算过
- EXIT FOR
- ELSE
- LET 子料需求数量1 = 向上历遍坐标子料料号欠料数量1
- LET 子料需求数量2 = 向上历遍坐标子料料号欠料数量2
- LET 子料需求数量3 = 向上历遍坐标子料料号欠料数量3
- LET 设置标记 = 向上历遍坐标
- END IF
- END IF
- END FOR
- IF 设置标记 > -1 THEN #该父件已经被子件计算过
- LET 设置标记共用料号标记 = 'Y'
- #计算欠料
- 和上面欠料的算法一样
- EDN IF
- //该片段来自于http://www.codesnippet.cn/detail/1105201512545.html
来源: http://www.codesnippet.cn/detail/1105201512545.html