VBA / SQL迭代查询排列,直到返回记录

时间:2014-01-02 22:52:57

标签: sql vba ms-access ms-access-2007 access-vba

我创建了一个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中实现这一点,还是我应该以完全不同的方式接近它?

1 个答案:

答案 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

此方法的缺点是您希望此表位于特定于用户的前端数据库(或临时数据库)中。每次计算匹配时,您将更新多行,因此您不希望将表放在共享后端数据库中。此外,如果将其放在后端数据库中,则需要将整个操作包装在事务中。