访问查询以分配行李号码

时间:2013-10-24 08:59:33

标签: ms-access

我使用Microsoft Access进行邮件转发,其中地址通过邮政编码与分拣办公室匹配并分配代码(邮件代码)。

然后以mailsort代码顺序导出数据以进行打印。除了打印带有地址的信件外,还印有邮袋标签,这样当信件被封入信封时,它们就可以放入邮袋中(即所有的12345代码都放在同一个包里等)。

我现在要做的是为数据添加行李编号。因此所有12345编码的字母都是包1,所有67890编码的字母都是包2.这将使字母的装袋更容易。

皇家邮政只接受重达10公斤的行李,这样会增加复杂性。因此,需要考虑字母的重量(已经输入我的形式)。例如,如果字母重50克并且有1000条记录具有相同的代码,那么每200个字母需要一个新的包号(1000个字母的重量为50克的5个包)。

我可以通过在Access中使用VBA循环遍历每条记录并将mailsort代码与前一条记录进行比较来实现此目的。如果它是相同的,那么它将获得相同的袋号,除非已经足够填充10kg袋。

然而这很慢。目前在10000条记录上进行mailsort大约需要5-10秒,但是我的VBA循环增加了大约3分钟!

是否可以通过查询获取行李号码,从而加快流程?

我想如果我可以为每个mailsort代码添加一个'Sub ID'(例如,如果第一个代码有150个记录,那么这些将具有1到150的Sub ID,如果第二个代码有50个字母,那么这些将Sub ID为1到50等。然后,我可以使用Sub ID来确定给定代码是否需要多个包,方法是将Sub ID除以最大记录数(由字母的权重确定),将其四舍五入为0位小数并添加1. / p>

非常感谢任何想法或建议。

亲切的问候 迈克尔

1 个答案:

答案 0 :(得分:1)

我们应该能够在不诉诸循环代码的情况下完成您的需求。

(我假设您的临时表名为[mailsort],其主键名为[ID]。

要分配[sub_id]值,我们可以使用好的旧自连接技巧。此查询将创建一个名为[tmpSub_IDs]的临时表,其值为

SELECT t1.mailsort_code, t1.ID, COUNT(*) AS sub_id
INTO tmpSub_IDs
FROM 
    mailsort t1
    INNER JOIN
    mailsort t2
        ON t2.mailsort_code = t1.mailsort_code
            AND t2.ID <= t1.ID
GROUP BY t1.mailsort_code, t1.ID

并且此查询会将这些值复制到[mailsort]表

UPDATE 
    mailsort 
    INNER JOIN
    tmpSub_IDs
        ON tmpSub_IDs.ID = mailsort.ID
SET mailsort.sub_id = tmpSub_IDs.sub_id

所以现在我们的[mailsort]表看起来像

ID   mailsort_code  sub_id  bag_no
---  -------------  ------  ------
  1          12345       1        
  2          12345       2        
  3          12345       3        
...
450          12345     450
451          23456       1
...

现在我们需要计算每个包的字母数。假设我们有相关的表[mailsort_codes]包含

mailsort_code  weight_g  letters_per_bag
-------------  --------  ---------------
        12345        55                 
        23456        65                 

mailsort_code = 12345的每个字母重55克,并将其除以10公斤给出

10000 / 55 = 181.81

我们必须截断(而不是舍入),所以我们可以

Int(10000 / 55) = 181

mailsort_code的每个包的字母。让我们在[mailsort_codes]

中更新该列
UPDATE mailsort_codes
SET letters_per_bag = Int(10000 / weight_g)

给我们

mailsort_code  weight_g  letters_per_bag
-------------  --------  ---------------
        12345        55              181
        23456        65              153

现在,要分配行李号,我们可以将(sub_id - 1)除以letters_per_bag并向上舍入到下一个最高整数(Int(x + 1)

UPDATE 
    mailsort
    INNER JOIN
    mailsort_codes
        ON mailsort_codes.mailsort_code = mailsort.mailsort_code
SET mailsort.bag_no = Int(((mailsort.sub_id - 1) / mailsort_codes.letters_per_bag) + 1)

我们已经

ID   mailsort_code  sub_id  bag_no
---  -------------  ------  ------
  1          12345       1       1
  2          12345       2       1
  3          12345       3       1
...
181          12345     181       1
182          12345     182       2
...
362          12345     362       2
363          12345     363       3
...
450          12345     450       3
451          23456       1       1
...