1

我使用 Microsoft Access 进行邮件分类,其中按地址与按邮政编码的分类办公室匹配并分配一个代码(邮件分类代码)。

然后以邮件排序代码顺序导出数据以供打印。除了打印带有地址的信件外,还打印了邮袋标签,以便当信件被装入信封后,它们可以放入邮袋(即所有 12345 代码都放在同一个袋子中等)。

我现在想做的是在数据中添加一个包号。这样所有 12345 个编码字母都是 bag 1,所有 67890 个编码字母都是 bag 2。这将使字母的 bagging 更容易。

更复杂的是,皇家邮政只接受重量不超过 10 公斤的行李。因此,需要考虑字母的重量(已经输入到我的表格中)。例如,如果字母重 50 克,并且有 1000 条具有相同代码的记录,那么每 200 个字母就需要一个新的行李编号(1000 个重 50 克的字母需要 5 个袋子)。

我可以通过在 Access 中使用 VBA 循环遍历每条记录并将邮件排序代码与前一条记录进行比较来实现这一点。如果相同,则获得相同的袋号,除非已经有足够的袋子装满 10 公斤的袋子。

然而,这非常缓慢。目前对 10000 条记录进行邮件排序大约需要 5-10 秒,但是使用我的 VBA 循环它增加了大约 3 分钟!

是否可以通过查询获得行李编号,从而加快处理速度?

我想如果我可以为每个邮件分类代码添加一个“子 ID”(例如,如果第一个代码有 150 条记录,那么这些代码的子 ID 为 1 到 150,如果第二个代码有 50 个字母,那么这些将有一个子ID 为 1 到 50 等)。然后,我可以使用 Sub ID 来确定给定代码是否需要多个袋子,方法是将 Sub ID 除以最大记录数(由字母的重量决定),将其四舍五入到小数点后 0 位并加 1。

任何想法或建议将不胜感激。

亲切的问候迈克尔

4

1 回答 1

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
...
于 2013-10-24T14:22:10.767 回答