Question

J'utilise VBA Access 2003 pour traiter des données récursive pour la fabrication BOM. Je construit un module de classe pour laisser mes tableaux principaux ont une portée statique. Cela semble simplifier récursion - il me affranchit des niveaux de comptage vers le bas et à nouveau que je traverse une nomenclature. Je ne suis pas d'ouvrir le même jeu d'enregistrements de manière redondante; Je filtrage beaucoup à la place.

Après avoir obtenu ce cours je lis au sujet de la modélisation objet-relation et a décidé de ne pas par exemple un jeu d'enregistrements, mais un record. Ensuite, les champs de cet enregistrement peuvent être des propriétés. Après beaucoup de travail et beaucoup de sensations fortes de la victoire qui étaient la plupart du temps trompé, j'ai réalisé cette approche n'a pas d'avantages, car l'accès est basée sur des tables.

Mes modules de classe aident encore comme avant. Ma question porte sur deux versions alternatives ci-dessous. La première utilise deux instances (parents, enfants). La seconde utilise un et réutilise ensuite. Il est évident que le premier est ORM influencé.

Y at-il raison de choisir l'un de ces sur l'autre? Notez également les italiques ligne à la fin: Si je ne ai pas besoin que (parce que je ne ai pas besoin de plus amples informations sur le parent), ce que ça change la réponse? Quelqu'un peut-il me aider à ma façon de penser en général?

(Notez que je ferme recordsets mais pas les instances de classe. Ma compréhension est que les instances VBA se fermer et de les laisser faire est une pratique acceptée. Il me semble avoir pris pseudo-code à de nouveaux niveaux de pseudo ... l'objectif est clarté, espérons que cela fonctionne.)

    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
         Create instance of Class --> Get recordset
         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
    Exploit Class recordset ( still points to parent )
 
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 Create instance of Class --> Get recordset 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 Filter Class recordset ( Parent_Part_ID ) Exploit Class recordset ( still points to parent )
Était-ce utile?

La solution

Il semble que le premier vous donne une meilleure facilité d'utilisation du point de vue du programmeur, comme on peut simplement commencer par le dossier qui vous intéresse et facilement racine dans les dossiers associés tout en accédant à des propriétés de l'enregistrement que vous avez commencé avec.

D'autre part, ce dernier semble être plus efficace, car il est pas pessimistement charger tous les enregistrements qui pourraient être liés à l'actuel.

Quelques optimisations potentielles à la première approche qui pourrait l'aider à approcher l'efficacité du second tout en conservant la facilité d'utilisation:

  • Charger uniquement les dossiers d'enfants comme ils sont nécessaires. L'utilisation Get / Set accesseurs vous permettra de charger ceux juste à temps, plutôt que tout à la fois lorsque l'enregistrement parent est tiré de la DB.
  • Vous pouvez également utiliser JOIN pour récupérer toutes les données de l'enfant à la fois dans le cadre d'une seule requête. Cela vous donne encore toutes les données préchargées, mais réduirait le nombre de requêtes que vous avez à courir pour l'obtenir de manière substantielle.

L'espoir qui est de l'aide.

Autres conseils

Avez-vous envisagé d'utiliser le fournisseur de MSDataShape et la syntaxe SHAPE pour produire ADO d'enregistrements hiérarchiques ?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top