문제

저는 Access 2003 VBA를 사용하여 BOM 제조를 위한 재귀 데이터를 처리하고 있습니다.나는 메인 테이블이 정적 범위를 가질 수 있도록 클래스 모듈을 만들었습니다.이는 재귀를 단순화하는 것처럼 보입니다. BOM을 탐색할 때 레벨을 세고 다시 세는 일이 없도록 해줍니다.동일한 레코드 세트를 중복해서 열지는 않습니다.대신 필터링을 많이 하고 있어요.

이 작업을 진행한 후 객체 관계 모델링에 대해 읽었고 레코드세트가 아닌 레코드를 인스턴스화하기로 결정했습니다.그러면 해당 레코드의 필드가 속성이 될 수 있습니다.많은 작업과 대부분의 실수가 있었던 승리의 전율을 겪은 후에 저는 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
         클래스 인스턴스 생성 -> 레코드 세트 가져오기
         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 접근자를 사용하면 상위 레코드를 DB에서 가져올 때 한꺼번에 로드하는 것이 아니라 적시에 로드할 수 있습니다.
  • 또는 JOIN을 사용하여 단일 쿼리의 일부로 모든 하위 데이터를 한 번에 검색합니다.이렇게 하면 미리 로드된 모든 데이터가 제공되지만 이를 가져오기 위해 실행해야 하는 쿼리 수가 크게 줄어듭니다.

도움이 되었기를 바랍니다.

다른 팁

msdatashape 공급자와 SHAPE 구문을 사용하여 생성하는 것을 고려해 보셨나요? 계층적 ADO 레코드세트?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top