超市一个月内累计断货时间最长的商品
问题
下面有一个简化的超市的库存管理系统内的一些表,为考察进货策略是否合适,需要算出 6 月内累计断货时间最长的商品,超市在早上 8 点钟开门,晚上 9 点半结束营业,非营业时间内的断货不计算在内。需要的表如下:
下面是进货记录表,超市在每天早上 5 点钟进货,下表记录了每次进货每种商品的进货数量:
下面是 5 月底最后的剩余库存表,记录在 5 月底最后一天所有商品的剩余库存:
最后是超市的销售记录详表:
思路
大致思路:首先要创建一个统计剩余库存和断货情况的表,而后将进销表都按日期分组,循环每天,遍历每条进销记录,即时统计断货情况,累计断货时间,最后汇总断货时间,就可以找出断货时间最长的商品了。
-
创建一个本月所有日期的序列,用于让进货表和销售表跟它对齐,这样做的目的是保证进货表和销售表完全对齐,避免出现某一天没有进货的情况。
-
将进货表和销售表都跟日期序列对齐,得到两个按日期分组的序列。
-
创建一个用户统计剩余库存和断货情况的序表,包括商品、剩余库存、断货起始时间、断货时间字段,这里记该表为 A。
-
设置此表的主键为商品字段,以便后面查找。
-
将上个月最后的剩余库存数据写入 A 表,作为初始数据。
-
循环这个月的日期序列,即循环每天。
-
循环体内,先提取出这一天早上的进货数据,累计到 A 表内。
-
在 A 表中找出剩余库存已经为 0 的商品,记录断货起始时间为早上开门时间,即 8 点。
-
进一步循环这一天的所有销售记录。
-
循环体内,在 A 表中找出该商品,累计其库存变化。
-
检查该商品库存是否变为 0 了,如果是则说明断货了,则在 A 表中记下断货时间为当前起始时间。
-
这一层循环结束后,在 A 表中选出当天所有断货商品,以关门时间为结束时间,算出它们的断货时间,并累计入 A 表的断货时间字段。
-
日期也循环结束后,A 表就已经累计完毕,从中直接选出断货时间最长的商品即可。
代码
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 | 选出断货时间最大的商品 |
英文版
数据文件
Commodity.txt
Sale.txt
Stock.txt
Storage.txt