Pergunta

Eu estou usando Access 2003 VBA para processar dados recursiva para a fabricação de BOMs. Eu construí um módulo de classe para deixar minhas principais mesas têm escopo estático. Este parece simplificar recursão - ele define me libertar níveis contagem regressiva e de novo como eu percorrer uma lista de materiais. Não estou abrindo o mesmo conjunto de registros de forma redundante; Eu estou filtrando muita vez.

Depois de obter isso eu andamento ler sobre relação de objeto Modelagem e decidiu não instância um conjunto de registros, mas um registro. Em seguida, os campos desse registro poderia ser propriedades. Depois de muito trabalho e muitas emoções da vitória que eram em sua maioria enganado, eu percebi essa abordagem não tem benefícios porque o acesso é baseada em tabela.

As minhas módulos de classe ainda ajuda como antes. Minha pergunta é sobre duas versões alternativas abaixo. O primeiro usa duas instâncias (pais, filhos). A segunda usa um e depois a reutiliza. Obviamente, o primeiro é influenciado-ORM.

Existe alguma razão para escolher um deles sobre o outro? Além disso, observe o itálico linha no final: Se eu não preciso disso (porque eu não preciso de mais informações sobre o Pai), isso muda a resposta? Alguém pode me ajudar com o meu pensamento em geral?

(Note que eu registos perto, mas não instâncias de classe. O meu entendimento é que as instâncias VBA fechar-se e deixá-los fazer isso é prática aceita. Parece que tenho pseudo-código levado a novos níveis de pseudo ... o objetivo é clareza, espero que funcione.)

    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 )
Foi útil?

Solução

Parece que o ex-dá-lhe uma melhor facilidade de utilização do ponto de vista do programador, como se pode simplesmente começar com o registro que você está interessado e facilmente raiz em registros associados apenas ao acessar propriedades do registro que você começou com.

Por outro lado, este último parece ser mais eficiente, como não é pessimista carregar cada registro que pode estar relacionado com a atual.

Um par de potenciais otimizações para a primeira abordagem que pode ajudá-lo a aproximar-se a eficiência do segundo, mantendo a facilidade de uso:

  • Coloque apenas os registros filho como eles são necessários. Usando get / set assessores lhe permitirá carregar os até just-in-time, em vez de tudo de uma vez, quando o registro pai é puxado do DB.
  • Como alternativa, use um JOIN para recuperar todos os dados da criança ao mesmo tempo como parte de uma única consulta. Isto ainda iria dar-lhe todos os dados pré-carregado, mas iria reduzir o número de consultas que você tem que correr para obtê-lo substancialmente.

Hope isso é alguma ajuda.

Outras dicas

Você já pensou em usar o provedor MSDataShape e a sintaxe SHAPE para produzir hierárquica ADO conjuntos de registros ?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top