我创建了一个Access数据库,其中包含一个用户创建的路由规则表,用于决定下订单时应使用哪个卡车司机。规则至少必须有一个DEST_ST,但其他四个字段可以留空,以便根据需要保持宽泛或特定(空白与“ALL”同义):
DEST_ST PLNT PKNG_TYPE MODEL DEALER TRUCKER
-----------------------------------------------------------------------
PA 1 PALLET 25 SMITH BROS
PA 1 CONOVER
PA IDLEWILD
意图是对于给定的订单,我想返回适用的最具体的规则。例如,以下顺序将分配给CONOVER:
DEST_ST PLNT PKNG_TYPE MODEL DEALER
-------------------------------------------------------
PA 1 RACK 4AL 25
此订单将分配给SMITH BROS:
DEST_ST PLNT PKNG_TYPE MODEL DEALER
-------------------------------------------------------
PA 1 PALLET 5AL 25
最后,此订单将分配给IDLEWILD:
DEST_ST PLNT PKNG_TYPE MODEL DEALER
-------------------------------------------------------
PA 2 PALLET 5AL 25
从概念上讲,我的解决方案是按优先顺序运行最多16个SQL查询(每个排列一个),直到返回一条记录:
DEST_ST PLNT PKNG_TYPE MODEL DEALER
-------------------------------------------
1. MATCH MATCH MATCH MATCH MATCH
2. MATCH MATCH MATCH MATCH
3. MATCH MATCH MATCH MATCH
4. MATCH MATCH MATCH
5. MATCH MATCH MATCH MATCH
6. MATCH MATCH MATCH
7. MATCH MATCH MATCH
8. MATCH MATCH
9. MATCH MATCH MATCH MATCH
10. MATCH MATCH MATCH
11. MATCH MATCH MATCH
12. MATCH MATCH
13. MATCH MATCH MATCH
14. MATCH MATCH
15. MATCH MATCH
16. MATCH
根据我提出的解决方案,有没有一种直接的方法在VBA中实现这一点,还是我应该以完全不同的方式接近它?
答案 0 :(得分:0)
我这样做是为每个卡车司机使用一个临时表,并计算他们匹配的规则数量。
CREATE TABLE tblRuleMatchCount
(TRUCKER VARCHAR(50) PRIMARY KEY,
MATCH_COUNT INT)
INSERT INTO tblRuleMatchCount (TRUCKER, MATCH_COUNT)
SELECT TRUCKER, 0 FROM tblRoutingRules
然后,当您想要计算哪些规则匹配时,首先将所有MATCH_COUNT重置为0,然后对每个条件使用这样的查询。
UPDATE tblRuleMatchCount
INNER JOIN tblRoutingRules
ON tblRuleMatchCount.TRUCKER = tblRoutingRules.TRUCKER
SET MATCH_COUNT = MATCH_COUNT + 1
WHERE DEST_ST = pDestSt
注意这个查询是如何在DEST_ST上参数化的。您可以使用订单中的信息调用每个条件查询,然后选择具有最大匹配数的卡车司机。
SELECT TOP 1 TRUCKER FROM tblRuleMatchCount
ORDER BY MATCH_COUNT DESC
此方法的缺点是您希望此表位于特定于用户的前端数据库(或临时数据库)中。每次计算匹配时,您将更新多行,因此您不希望将表放在共享后端数据库中。此外,如果将其放在后端数据库中,则需要将整个操作包装在事务中。