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

阅读(565) 标签: 创建序列, 分组, file, import, periods, align, keys, for,

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  结果