怎样用 esProc 从合计值倒推出初始日期
某库表记录了特定日期计划的入库量和入库后的库存,比如 2 月 26 日计划入库 0.6,入库后库存为 3。
ITEM |
LOC |
NEEDDATE |
QTY |
CUSTQTY |
ABC |
XYZ |
2024-02-13 00:00:00 |
4.8 |
3 |
ABC |
XYZ |
2024-02-14 00:00:00 |
0.6 |
3 |
ABC |
XYZ |
2024-02-15 00:00:00 |
0.6 |
3 |
ABC |
XYZ |
2024-02-16 00:00:00 |
0.6 |
3 |
ABC |
XYZ |
2024-02-19 00:00:00 |
0.6 |
3 |
ABC |
XYZ |
2024-02-20 00:00:00 |
0.6 |
3 |
ABC |
XYZ |
2024-02-21 00:00:00 |
0.6 |
3 |
ABC |
XYZ |
2024-02-22 00:00:00 |
0.6 |
3 |
ABC |
XYZ |
2024-02-23 00:00:00 |
0.6 |
3 |
ABC |
XYZ |
2024-02-26 00:00:00 |
0.6 |
3 |
ABC |
XYZ |
2024-02-27 00:00:00 |
0.6 |
3 |
ABC |
XYZ |
2024-02-28 00:00:00 |
0.6 |
3 |
ABC |
XYZ |
2024-02-29 00:00:00 |
0.6 |
3 |
现在要根据指定的日期,用计划的入库量和入库后的库存倒推出初始日期,也就是零库存或负库存的那一天,并补上这期间每一天入库前的库存UPDATED_CUSTQTY,最后返回完整数据。比如给定 2 月 26 日,可知当日入库前的库存是 3-0.6=2.4;倒推到上一条记录,2 月 23 日入库前的库存是 2.4-0.6=1.8;直到 2 月 20 日为止,当日原库存是 0。
ITEM |
LOC |
NEEDDATE |
QTY |
CUSTQTY |
UPDATED_CUSTQTY |
ABC |
XYZ |
2024-02-29 00:00:00 |
0.6 |
3 |
|
ABC |
XYZ |
2024-02-28 00:00:00 |
0.6 |
3 |
|
ABC |
XYZ |
2024-02-27 00:00:00 |
0.6 |
3 |
|
ABC |
XYZ |
2024-02-26 00:00:00 |
0.6 |
3 |
2.4 |
ABC |
XYZ |
2024-02-23 00:00:00 |
0.6 |
3 |
1.8 |
ABC |
XYZ |
2024-02-22 00:00:00 |
0.6 |
3 |
1.2 |
ABC |
XYZ |
2024-02-21 00:00:00 |
0.6 |
3 |
0.6 |
ABC |
XYZ |
2024-02-20 00:00:00 |
0.6 |
3 |
0.0 |
ABC |
XYZ |
2024-02-19 00:00:00 |
0.6 |
3 |
|
ABC |
XYZ |
2024-02-16 00:00:00 |
0.6 |
3 |
|
ABC |
XYZ |
2024-02-15 00:00:00 |
0.6 |
3 |
|
ABC |
XYZ |
2024-02-14 00:00:00 |
0.6 |
3 |
|
ABC |
XYZ |
2024-02-13 00:00:00 |
4.8 |
3 |
SQL缺乏天然序号,没有方便的语法表达相对位置,要用多个窗口函数间接实现,代码很难写。SPL 可以直接表示相对位置或绝对位置: https://try.esproc.com/splx?2Nq
A |
|
1 |
$select *, null as UPDATED_CUSTQTY from table_name.txt order by NEEDDATE desc |
2 |
=A1.select(NEEDDATE<=date("2024-02-26")) |
3 |
=A2.(UPDATED_CUSTQTY=round(if(#==1,CUSTQTY-QTY,if((t=UPDATED_CUSTQTY[-1]-QTY)>=0,t)),1)) |
4 |
return A1 |
A1:加载数据,按日期逆序排序,新增计算列入库前的库存 UPDATED_CUSTQTY,初值为 null。
A2:过滤出指定日期之前的记录,这些记录引用了 A1 的记录,修改这些记录会影响 A1。
A3:循环修改 A2 的每条记录:如果当前是第 1 条记录,则入库前的库存等于”入库后的库存 - 入库量”,否则等于”上一条入库前的库存 - 入库量”,直到这个值小于 0 为止,结果保留一位小数。 [-1] 表示上一条记录。修改后的 A2 如下:
A4:返回完整数据 A1,其中红框部分是 A2。
英文版 https://c.esproc.com/article/1745132423023