程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

163 动态数组建模《多工序自动转换排程表》-03

balukai 2025-04-27 12:28:19 文章精选 1 ℃


161 动态数组建模《多工序自动转换排程表》-01

162 动态数组建模《多工序自动转换排程表》-02


接上文,已经设计好表3的工单号根据表1的输入的工艺流转卡的项数自动展开的层级,接下来就是需要通过零件对应的工艺数展开并堆积。这个过程可以理解为把工艺流转卡从二维形态转成一维的数据形态。

引用工单信息

已知工单号是唯一项,所以可以通过工单号引用表2中生产计划待排订单中的相关信息过来。分别录入函数:

零件:=XLOOKUP(S3#,'2.计划'!B:B,'2.计划'!C:C)

数量:=XLOOKUP(S3#,'2.计划'!B:B,'2.计划'!D:D)

工艺顺序:=MAP(T3#,LAMBDA(X,COUNTIFS(T3:X,X))) ,动态数组公式,判定工艺的顺序,生成一个顺序数组1,2,3,……;

工艺二维转一维

上面已经把工单的信息引用过来了,现在需要把工艺流转卡的二维数据转成一维数据,为了方便理解思路,这里继续用分步写公式的步骤告诉大家,全自动动态数组的应该如何写函数。

使用工艺:=TOCOL(E3#)

工艺名称:=TOCOL(E2#&EXPAND("",ROWS(D3#),,"")),这个公式是筛选TOCOL连接空单单元格的思路,是一个经典的思路.ROWS是判断有多少行,D3#也是一个动态数组,有3行,返回数字3,通过Expand 展开3行空单元格的数组;

用函数HSTACK合并两列后再通过筛选第二列不为0来返回工艺名称。

合并两列公式:

=HSTACK(TOCOL(E2#&EXPAND("",ROWS(D3#),,"")),TOCOL(E3#))

筛选第二列不为0的公式:

=LET(B,TOCOL(E3#),A,HSTACK(TOCOL(E2#&EXPAND("",ROWS(D3#),,"")),B),FILTER(INDEX(A,,1),B<>0))

公式释义:

为了避免公式多次引用,用了两个定义名称,其中B,代表合并后的使用工艺,A代表合并了两列的结果。最后用FILTER(INDEX(A,,1),B<>0),来筛选B不为0的结果,显示A的第1列;

得到结果:

其中合理的利用LET函数定义名称,可以有效的减少公式的长度,同时也能够使得公式运算的效率得到大大的提升。


工艺的交期拉动

费了这样多功夫把工序分解,就是希望精细化排程,每一道的工序时间都需要预留一定的前置期,这里假设以拉动式的排程作为基准来判断各个工序的交期。

首先先定义好各工序的前置期时间,这里假设都为1天,也就是每道工序都预留1天。如交期是T天的话,有5道工序,从第1道开始就是T-1,第2道就是T-2,一直类推,效果如下图所示:

交期拉动公式设置

为了实现交期拉动的效果,就需要生成一组逆向的工艺数组,从原来的1,2,3……5;变成5,4,3……1;有了这样的逆向数组,就可以通过引用交期减去这个数组得到工序的拉动交期。

录入函数:

=DROP(REDUCE("",D3#,LAMBDA(X,Y,VSTACK(X,SEQUENCE(Y,,Y,-1)))),1)

通过工艺数得到工艺逆向数组;

交期:

=XLOOKUP(S3#,'2.计划'!B:B,'2.计划'!E:E)-Z3#

合并公式:

=XLOOKUP(S3#,'2.计划'!B:B,'2.计划'!E:E)-DROP(REDUCE("",D3#,LAMBDA(X,Y,VSTACK(X,SEQUENCE(Y,,Y,-1)))),1)

表3 已经完全设计完成了,通过表2的待排计划排程表,自动生成右边的一维排程表,同时兼顾了二维数据与一维数据,为方便后面按工序排程做好了数据基础;

未完待续……

我是古哥:

从事制造行业18年,在企业运营、供应链管理、智能制造系统等方面具有丰富的实战经验。企业智能化,柔性化计划运营管理专家,擅长通过企业流程优化规范,企业管理、导入计划运营提升企业效率;对提高企业准时交货率,降低企业库存,输出智能制造人才有丰富的经验。学习PMC生产计划,关注古哥计划!

最近发表
标签列表