超市一个月内累计断货时间最长的商品

 

问题

下面有一个简化的超市的库存管理系统内的一些表,为考察进货策略是否合适,需要算出 6 月内累计断货时间最长的商品,超市在早上 8 点钟开门,晚上 9 点半结束营业,非营业时间内的断货不计算在内。需要的表如下:

imagepng

下面是进货记录表,超市在每天早上 5 点钟进货,下表记录了每次进货每种商品的进货数量:

imagepng

下面是 5 月底最后的剩余库存表,记录在 5 月底最后一天所有商品的剩余库存:

imagepng

最后是超市的销售记录详表:

imagepng

思路

大致思路:首先要创建一个统计剩余库存和断货情况的表,而后将进销表都按日期分组,循环每天,遍历每条进销记录,即时统计断货情况,累计断货时间,最后汇总断货时间,就可以找出断货时间最长的商品了。

  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 表就已经累计完毕,从中直接选出断货时间最长的商品即可。

代码

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 选出断货时间最大的商品

结果

imagepng