Ms access 访问查询以分配行李编号

Ms access 访问查询以分配行李编号,ms-access,Ms Access,我使用Microsoft Access进行邮件排序,其中按地址按邮政编码匹配到排序办公室,并分配一个代码(邮件排序代码) 然后以邮件排序代码顺序导出数据以进行打印。除了打印带有地址的信件外,还打印了一个邮袋标签,以便信件装入信封后,可以放入邮袋(即所有12345代码都放在同一个邮袋中等) 我现在想做的是在数据中添加一个行李编号。因此,所有12345个编码字母都是包1,所有67890个编码字母都是包2。这将使信件的装袋更容易 英国皇家邮政只接受重量达10公斤的邮袋,这又增加了一个复杂性。因此,需要

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

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

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

英国皇家邮政只接受重量达10公斤的邮袋,这又增加了一个复杂性。因此,需要考虑信件的重量(已经输入到我的表格中)。例如,如果字母重量为50g,且有1000条记录具有相同的代码,则每200个字母需要一个新的袋号(5袋1000个字母重量为50g)

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

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

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

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

如有任何想法或建议,将不胜感激

问候
Michael

我们应该能够在不使用循环代码的情况下完成您需要的任务

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

要分配[sub_id]值,我们可以使用传统的自连接技巧。此查询将创建一个名为[tmpSub_id]的临时表,其中包含

选择t1.mailsort\u code、t1.ID、COUNT(*)作为子\u ID
进入tmpSub_id
从…起
邮件排序t1
内连接
邮件分拣t2
关于t2.mailsort\u代码=t1.mailsort\u代码

和t2.ID我们应该能够在不使用循环代码的情况下完成您需要的任务

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

要分配[sub_id]值,我们可以使用传统的自连接技巧。此查询将创建一个名为[tmpSub_id]的临时表,其中包含

选择t1.mailsort\u code、t1.ID、COUNT(*)作为子\u ID
进入tmpSub_id
从…起
邮件排序t1
内连接
邮件分拣t2
关于t2.mailsort\u代码=t1.mailsort\u代码

和t2.ID执行此“邮件排序”操作时,是否将信息写入临时表,然后将其导出(到CSV或其他格式)?如果是,临时表是否有自动编号主键字段?您好,谢谢您的回复。是的,数据存储在一个带有自动编号主键的表中。好的,很好。您是否已经使用了一些循环代码来填充临时表(您可以对其进行调整以添加新的[Sub_ID]值),或者添加[Sub_ID]是流程中的一个新步骤?这将是流程中的一个新步骤。该表由查询填充。谢谢当您执行此“邮件排序”操作时,是否将信息写入临时表,然后将其导出(到CSV或其他格式)?如果是,临时表是否有自动编号主键字段?您好,谢谢您的回复。是的,数据存储在一个带有自动编号主键的表中。好的,很好。您是否已经使用了一些循环代码来填充临时表(您可以对其进行调整以添加新的[Sub_ID]值),或者添加[Sub_ID]是流程中的一个新步骤?这将是流程中的一个新步骤。该表由查询填充。谢谢你。非常感谢你。我将添加代码并发回,让您知道结果。再次感谢您!你真是个天才!非常感谢你详细而周密的回答。它工作得很好@用户2863528不客气。这种方法是否在某种程度上加快了过程?太棒了。非常感谢你。我将添加代码并发回,让您知道结果。再次感谢您!你真是个天才!非常感谢你详细而周密的回答。它工作得很好@用户2863528不客气。这种方法是否在某种程度上加快了过程?
10000 / 55 = 181.81
Int(10000 / 55) = 181