我使用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>
非常感谢任何想法或建议。
亲切的问候 迈克尔
答案 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
...