l 问题
下面有一个简化的超市的库存管理系统内的一些表,为考察进货策略是否合适,需要算出6月内累计断货时间最长的商品,超市在早上8点钟开门,晚上9点半结束营业,非营业时间内的断货不计算在内。需要的表如下:
下面是进货记录表,超市在每天早上5点钟进货,下表记录了每次进货每种商品的进货数量:
下面是5月底最后的剩余库存表,记录在5月底最后一天所有商品的剩余库存:
最后是超市的销售记录详表:
l 思路
大致思路:首先要创建一个统计剩余库存和断货情况的表,而后将进销表都按日期分组,循环每天,遍历每条进销记录,即时统计断货情况,累计断货时间,最后汇总断货时间,就可以找出断货时间最长的商品了。
1. 创建一个本月所有日期的序列,用于让进货表和销售表跟它对齐,这样做的目的是保证进货表和销售表完全对齐,避免出现某一天没有进货的情况。
2. 将进货表和销售表都跟日期序列对齐,得到两个按日期分组的序列。
3. 创建一个用户统计剩余库存和断货情况的序表,包括商品、剩余库存、断货起始时间、断货时间字段,这里记该表为A。
4. 设置此表的主键为商品字段,以便后面查找。
5. 将上个月最后的剩余库存数据写入A表,作为初始数据。
6. 循环这个月的日期序列,即循环每天。
7. 循环体内,先提取出这一天早上的进货数据,累计到A表内。
8. 在A表中找出剩余库存已经为0的商品,记录断货起始时间为早上开门时间,即8点。
9. 进一步循环这一天的所有销售记录。
10. 循环体内,在A表中找出该商品,累计其库存变化。
11. 检查该商品库存是否变为0了,如果是则说明断货了,则在A表中记下断货时间为当前起始时间。
12. 这一层循环结束后,在A表中选出当天所有断货商品,以关门时间为结束时间,算出它们的断货时间,并累计入A表的断货时间字段。
13. 日期也循环结束后,A表就已经累计完毕,从中直接选出断货时间最长的商品即可。
l 代码
|
A |
B |
C |
D |
|
1 |
=file("C:\\txt\\Stock.txt").import@t().select(month(Datetime)==6) |
|
|
|
6月的进货表 |
2 |
=file("C:\\txt\\Sale.txt").import@t().select(month(Datetime)==6) |
|
|
|
6月的销售表 |
3 |
=file("C:\\txt\\Storage.txt").import@t().select(month(Date)==5) |
|
|
|
5月底的剩余库存量表 |
4 |
=file("C:\\txt\\Commodity.txt").import@t() |
|
|
|
商品表 |
5 |
'08:00:00 |
|
'21:30:00 |
|
超市开关门时间 |
6 |
=periods@d(date("2009-6-1"), date("2009-6-30"), 1) |
|
|
|
创建一个本月所有日期的序列 |
7 |
=A1.align@a(A6:~,date(Datetime)) |
|
|
|
将进货表按日期对齐,得到按天分组的记录 |
8 |
=A2.align@a(A6:~,date(Datetime)) |
|
|
|
再将销售表按日期对齐 |
9 |
=A4.new(ID:Commodity,0:Stock,:OosTime,0:TotalOosTime) |
|
|
|
创建一个用于统计剩余库存和断货情况的表 |
10 |
>A9.keys(Commodity) |
|
|
|
设置此表的主键 |
11 |
=A3.run(A9.find(Commodity).Stock=Stock) |
|
|
|
先将5月底的库存情况写入表中作为初始库存 |
12 |
for A6 |
=A7(#A12).run(A9.find(Commodity).run(Stock=Stock+Volume)) |
|
|
循环每天;先汇总每天早上的进货数量 |
13 |
|
=A9.select(Stock<=0).run(OosTime=string(A12)+" "+A5) |
|
|
找出无货的商品,记录其断货起始时间为早上开门时间 |
14 |
|
for A8(#A12) |
=A9.find(B14.Commodity) |
|
进一步循环每天的每条销售记录 |
15 |
|
|
>C14.run(Stock=Stock-B14.Volume) |
|
累计库存变化 |
16 |
|
|
if C14.Stock<=0 |
>C14.OosTime=B14.Datetime |
如果交易后断货了,记下当前时间为断货起始时间 |
17 |
|
=A9.select(Stock<=0) |
|
|
选出今天所有断货商品 |
18 |
|
>B17.run(TotalOosTime=TotalOosTime+interval@s (OosTime,string(A12)+" "+C5)) |
|
|
以关门时间为结束点,累计断货时间 |
19 |
=A9.maxp(TotalOosTime).Commodity |
|
|
|
选出断货时间最大的商品 |
l 结果