我正在使用 Access 2003 VBA 处理制造 BOM 的递归数据。我构建了一个类模块来让我的主表具有静态范围。这似乎简化了递归——它使我在遍历 BOM 时不必再次向下和向上计数级别。我不会多余地打开同一个记录集;相反,我进行了很多过滤。

完成此操作后,我阅读了有关对象关系建模的内容,并决定实例化不是记录集,而是记录。那么该记录的字段就可以是属性。经过大量的工作和许多令人兴奋的胜利(大部分都是错误的)之后,我意识到这种方法没有任何好处,因为 Access 是基于表的。

我的课程模块仍然像以前一样有帮助。我的问题是关于下面两个替代版本。第一个使用两个实例(父级,子级)。第二个使用一个然后重复使用它。显然第一个是受 ORM 影响的。

有什么理由选择其中之一而不是另一个?另外,请注意末尾的斜体行:如果我不需要(因为我不需要有关家长的更多信息),这会改变答案吗?谁能帮助我解决我的一般想法?

(请注意,我关闭记录集,但不关闭类实例。我的理解是,VBA 实例会自行关闭,并让它们这样做是公认的做法。我似乎已经将伪代码提升到了伪代码的新水平......目标是清晰,希望它有效。)

    VERSION 1 
    Property Sub ReviewPart ( Parent_Part_ID )

    Get Parent_Part_ID
    Create instance of Class --> Get recordset
    Filter Class recordset ( Parent_Part_ID )
    Exploit Class recordset
    See if Parent_Part_ID has Childs
    If it does:
       Open recordset of Childs
       For each Child
         Get Child_Part_ID
         创建类的实例 --> 获取记录集
         Filter Class recordset ( Child_Part_ID )
         Exploit Class recordset
         See if Child_Part_ID has Childs
         If it does:  
           Instance New ReviewPart ( Child_Part_ID )
         Otherwise:
         Nothing; Move On
       Next Child
       Close recordset of Childs
    Otherwise:
       Move On
    利用类记录集(仍然指向父级)
 
VERSION 2 Property Sub ReviewPart ( Parent_Part_ID ) Get Parent_Part_ID Create instance of Class --> Get recordset Filter Class recordset ( Parent_Part_ID ) Exploit Class recordset See if Parent_Part_ID has Childs If it does: Open recordset of Childs For each Child Get Child_Part_ID 创建类的实例 --> 获取记录集 Filter Class recordset ( Child_Part_ID ) Exploit Class recordset See if Child_Part_ID has Childs If it does: Instance New ReviewPart ( Child_Part_ID ) Otherwise: Nothing; Move On Next Child Close recordset of Childs Otherwise: Move On 过滤器类记录集(Parent_Part_ID) 利用类记录集(仍然指向父级)
有帮助吗?

解决方案

从程序员的角度来看,前者似乎为您提供了更好的易用性,因为人们可以简单地从您感兴趣的记录开始,并且只需访问您开始使用的记录的属性即可轻松扎根到关联记录。

另一方面,后者似乎更有效,因为它不会悲观地加载可能与当前记录相关的每条记录。

对第一种方法的一些潜在优化可能有助于它接近第二种方法的效率,同时保持易用性:

  • 仅在需要时加载子记录。使用 Get/Set 访问器将允许您及时加载它们,而不是在从数据库中提取父记录时一次性加载它们。
  • 或者,使用 JOIN 作为单个查询的一部分一次性检索所有子数据。这仍然会为您提供预加载的所有数据,但会减少您为获取数据而必须运行的查询数量。

希望这有一些帮助。

其他提示

你有没有使用MSDataShape提供和形状语法产生分层ADO记录集的考虑的?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top