수색…


BQL 구문 분석 및 검증

모든 Acumatica 응용 프로그램 개발자는 BQL 코드 작성에 많은 시간을 할애합니다. 동시에 모든 사람들이 BQL 유형이 어떻게 작동하는지에 대한 기본 세부 사항을 알지 못합니다.

BQL의 핵심은 IBqlCreator 인터페이스에 의해 선언 된 Parse()Verify() 두 가지 주요 메서드입니다. Where<> , And<> , Or<> 등 일반적으로 사용되는 대부분의 BQL 유형은이 인터페이스에서 파생됩니다.

이 방법들이 역사적으로 붙어있는 이름은 그다지 설명이 쉽지 않다는 것을 인정해야합니다. 대체로 더 나은 대안 이름은 PrepareCommandTextEvaluate 입니다.

파싱

public void Parse(
    PXGraph graph, 
    List<IBqlParameter> pars, 
    List<Type> tables, 
    List<Type> fields, 
    List<IBqlSortColumn> sortColumns, 
    StringBuilder text, 
    BqlCommand.Selection selection)

Parse() 의 유일한 목적은 BQL을 SQL 명령으로 변환하여 DBMS로 전송하는 것입니다. 따라서이 메서드는 현재 생성 된 SQL 명령을 나타내는 StringBuilder 매개 변수를 받아들이며 BQL 작성자는이 SQL 명령을 사용하여 자체의 SQL 텍스트 표현을 추가합니다.

예를 들어, And<> 술어의 Parse() 메소드는 " AND " 를 명령 텍스트에 추가하고 모든 중첩 된 BQL 작성자의 변환을 반복적으로 요청합니다.

특히 And<ARRegister.docType, Equal<ARDocType.invoice>>"AND "ARRegister.DocType = 'AR'" 됩니다.

확인

public void Verify(
    PXCache cache, 
    object item, 
    List<object> pars, 
    ref bool? result, 
    ref object value)

Parse() 와 달리 Verify() 는 순수하게 응용 프로그램 수준에서 작동합니다.

주어진 레코드 (예 : ARRegister 오브젝트)는 공식 계산 및 조건 평가를 포함하여 레코드를 표현하는 데 사용될 수 있습니다.

result 매개 변수는 부울 조건 평가 결과를 저장하는 데 사용됩니다. Where<> 와 같은 술어 BQL 작성자가 주로 사용합니다.

value 매개 변수는 표현식 계산 결과를 저장하는 데 사용됩니다. 예를 들어, BQL Constant<string>value 은 해당 상수의 문자열 표현입니다.

대부분의 경우 BQL 작성자는 결과 또는 값에 영향을 미치지 만 거의 그렇지 않습니다.

Verify() 메서드의 주목할만한 사용법은 정적 BqlCommand.Meet() 메서드에 있습니다. PXCache 가 해당 항목이 BQL 명령을 충족하는지 확인하는 데 사용됩니다.

public bool Meet(PXCache cache, object item, params object[] parameters)
{
    List<object> pars = new List<object>(parameters);
    bool? result = null;
    object value = null;
    try {
        Verify(cache, item, pars, ref result, ref value);
    }
    catch (SystemException ex) {
        throw new PXException(String.Format("BQL verification failed! {0}", this.ToString()), ex);
    }
    return result == null || result == true;
}

결론

BQL 작성자의 진정한 힘과 아름다움은 데이터베이스와 응용 프로그램 수준에서 대부분을 사용할 수 있다는 것입니다. Acumatica의 캐시 병합 메커니즘을 사용하고 코드 재사용을위한 좋은 기회를 제공합니다.

예를 들어 데이터베이스에서 레코드를 선택할 때 BQL 명령의 Where<> 절은 다음과 같습니다.

  • 명령 준비 중 Parse() 를 사용하여 SQL 텍스트로 변환합니다.
  • 제공 할 것입니다 Verify() 항목이 이미 캐시에 거주하는 결정하기 위해 병합 캐시시 Meet() Where<> 결과 집합에 캐시 된 항목을 포함하도록 절 조건을.


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow