【问题标题】:VBA/SQL iterate through query permutations until record is returnedVBA/SQL 遍历查询排列,直到返回记录
【发布时间】:2014-01-02 22:52:57
【问题描述】:

我创建了一个 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 中实现这一点,还是我应该完全不同地处理这个问题?

【问题讨论】:

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


    【解决方案1】:

    我这样做的方法是为每个卡车司机使用一个临时表,并计算他们匹配的规则数。

    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
    

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

    【讨论】:

    • 这是一个解决方案的好主意,但我认为可以通过查询来完成,而不是将数据写入临时表。或者更改临时表名称以包含用户的 ID 或当前时间或其他可能使其唯一的东西,以便多人同时运行它。
    • 您的解决方案最终完美运行,非常感谢。您和 Johnny Bones 提到的限制应该不是问题。我主要是想为我们的小团队拼凑一些东西,看看它是否有用,并解决这个过程中的问题。再次感谢!
    猜你喜欢
    • 2021-03-13
    • 1970-01-01
    • 1970-01-01
    • 2013-10-31
    • 1970-01-01
    • 2016-04-24
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    相关资源
    最近更新 更多