Я использую Access 2003 VBA для обработки рекурсивных данных для изготовления спецификаций. Я построил модуль класса, чтобы мои основные таблицы имели статическую область видимости. Кажется, это упрощает рекурсию - это освобождает меня от пересчета уровней вниз и снова, когда я пересекаю спецификацию. Я не открываю тот же набор записей излишне; Вместо этого я много фильтрую.
После этого я прочитал об объектно-реляционном моделировании и решил создать экземпляр не набора записей, а записи. Тогда поля этой записи могут быть свойствами. После большой работы и многих острых ощущений победы, которые были по большей части ошибочными, я понял, что этот подход не имеет преимуществ, потому что Access основан на таблицах.
Мои модули класса все еще помогают, как и раньше. Мой вопрос о двух альтернативных версиях ниже. Первый использует два экземпляра (Parent, Child). Второй использует один, а затем снова использует его. Очевидно, что первый находится под влиянием 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
<b>Create instance of Class --> Get recordset</b>
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
<em>Exploit Class recordset ( still points to parent )</em>
<hr>
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
<strike>Create instance of Class --> Get recordset</strike>
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
<b>Filter Class recordset ( Parent_Part_ID )</b>
<em>Exploit Class recordset ( still points to parent )</em>