최적화 조언자에 대한 규칙 만들기

이 문서에서는 최적화 어드바이저에 대한 새 규칙을 만드는 방법을 설명합니다. 예를 들어 빈 제목이 있는 견적 요청(RFQ) 사례를 식별하는 새 규칙을 생성할 수 있습니다. 케이스에 제목을 사용하면 케이스를 쉽게 식별하고 검색할 수 있습니다. 매우 간단하지만 이 예는 최적화 규칙으로 달성할 수 있는 것을 보여줍니다.

규칙은 응용 프로그램 데이터에 대한 검사입니다. 규칙이 평가하는 조건이 충족되면 프로세스를 최적화하거나 데이터를 개선할 수 있는 기회가 생성됩니다. 기회에 따라 조치를 취할 수 있으며 선택적으로 조치의 영향을 측정할 수 있습니다.

최적화 어드바이저에 대한 새 규칙을 만들려면 SelfHealingRule추상 클래스를 확장 하고, IDiagnosticsRule 인터페이스를 구현 하고, DiagnosticRule 특성으로 데코레이팅되는 새 클래스를 추가합니다. 클래스에는 DiagnosticsRuleSubscription 특성으로 데코레이팅된 메서드도 있어야 합니다. 규칙에 따라 이 작업은 opportunityTitle 메서드에서 완료되며, 이에 대해서는 나중에 설명합니다. 이 새 클래스는 SelfHealingRules 모델에 종속 된 사용자 지정 모델에 추가할 수 있습니다. 다음 예제에서는 구현되는 규칙을 RFQTitleSelfHealingRule 이라고 합니다.

[DiagnosticsRule] 
public final class RFQTitleSelfHealingRule extends SelfHealingRule implements IDiagnosticsRule 
{ 
… 
} 

SelfHealingRule 추상 클래스에는 상속 클래스에서 구현해야 하는 추상 메서드가 있습니다. 핵심은 규칙에 의해 식별된 기회 목록을 반환하는 evaluate 메서드입니다. 기회는 법인별로 제공되거나 전체 시스템에 적용될 수 있습니다.

protected List evaluate() 
{ 
    List results = new List(Types::Record); 
    
    DataArea dataArea; 

    while select id from dataArea 
        where !dataArea.isVirtual 
    { 
        changecompany(dataArea.id) 
        { 
            container result = this.findRFQCasesWithEmptyTitle(); 

            if (conLen(result) > 0) 
            { 
                SelfHealingOpportunity opportunity = this.getOpportunityForCompany(dataArea.Id); 
                opportunity.EvaluationState = SelfHealingEvaluationState::Evaluated; 
                opportunity.Data = result; 
                opportunity.OpportunityDate = DateTimeUtil::utcNow(); 
                
                results.addEnd(opportunity); 
            } 
        } 
    } 
    
    return results; 
} 

위에 표시된 메서드는 회사를 반복하고 findRFQCasesWithEmptyTitle 메서드에서 제목이 비어 있는 RFQ 사례를 선택합니다. 이러한 사례가 하나 이상 발견되면 getOpportunityForCompany 메서드를 사용하여 회사별 영업 기회가 만들어집니다. SelfHealingOpportunity 테이블의 Data 필드 는 Container 형식이므로 이 규칙과 관련된 논리와 관련된 모든 데이터를 포함할 수 있습니다. OpportunityDate 를 현재 타임스탬프로 설정하면 영업 기회의 최신 평가 시간이 등록됩니다.

기회는 회사 간일 수도 있습니다. 이 경우 회사에 대한 루프가 필요하지 않으며 getOpportunityAcrossCompanies 메서드를 사용하여 영업 기회를 만들어야 합니다.

다음 코드에서는 제목이 비어 있는 RFQ 사례의 ID를 반환하는 findRFQCasesWithEmptyTitle 메서드를 보여 줍니다.

private container findRFQCasesWithEmptyTitle() 
{ 
    container result; 

    PurchRFQCaseTable rfqCase; 
    while select RFQCaseId from rfqCase 
        where rfqCase.Name == '' 
    { 
        result += rfqCase.RFQCaseId; 
    } 
    
    return result; 
} 

구현해야 하는 두 가지 메서드는 opportunityTitle opportunityDetails 입니다. 전자는 기회에 대한 짧은 제목을 반환하고 후자는 데이터를 포함할 수 있는 기회에 대한 자세한 설명을 반환합니다.

opportunityTitle에서 반환된 제목은 최적화 어드바이저 작업 영역의 최적화 기회 열 아래에 나타납니다. 또한 기회에 대한 추가 정보를 표시하는 측면 창의 헤더로 나타납니다. 규칙에 따라 이 메서드는 다음 인수를 사용하는 DiagnosticRuleSubscription 특성으로 데코레이팅됩니다.

  • Diagnostic area – 규칙이 속한 애플리케이션 영역을 설명하는 DiagnosticArea 유형의 열거형(예: DiagnosticArea::SCM)입니다.

  • Rule name(규칙 이름 ) – 규칙 이름이 포함된 문자열입니다. Dianostics 유효성 검사 규칙 양식( DiagnosticsValidationRuleMaintain )의 규칙 이름 열 아래에표시됩니다.

  • Run frequency – 규칙을 실행해야 하는 빈도를 설명하는 DiagnosticRunFrequency 유형의 열거형입니다(예: DiagnosticRunFrequency::Daily).

  • Rule description – 규칙에 대한 자세한 설명이 포함된 문자열입니다. Dianostics 유효성 검사 규칙 양식( DiagnosticsValidationRuleMaintain )의 규칙 설명 열 아래에표시됩니다.

메모

규칙이 작동하려면 DiagnosticRuleSubscription 특성이 필요합니다. 일반적으로 opportunityTitle 사용되지만 클래스의 모든 메서드를 데코레이팅할 수 있습니다.

다음은 구현 예입니다. 단순성을 위해 원시 스트링이 사용되지만 올바른 구현에는 레이블이 필요합니다.

[DiagnosticsRuleSubscription(DiagnosticsArea::SCM, 
                             'Assign titles to Request for Quotation cases', 
                             DiagnosticsRunFrequency::Daily,  
                             'This rule detects Requests for Quotation with empty titles.')] 
public str opportunityTitle() 
{ 
    return 'Assign titles to Request for Quotation cases'; 
} 

opportunityDetails 에서 반환된 설명이 측면 창에 나타나 영업 기회에 대한 자세한 정보를 보여 줍니다. 이렇게 하면 영업 기회에 대한 자세한 정보를 제공하는 데 사용할 수 있는 데이터 필드인 SelfHealingOpportunity 인수가 사용됩니다. 이 예시에서 메서드는 제목이 비어 있는 RFQ 사례의 ID를 반환합니다.

public str opportunityDetails(SelfHealingOpportunity _opportunity) 
{ 
    str details = ''; 
    container opportunityData = _opportunity.Data; 
    int affectedRFQCasesCount = conLen(opportunityData); 

    if (affectedRFQCasesCount != 0) 
    { 
        details = 'The following Request for Quotation cases have an empty title:\n'; 
        for (int i = 1; i <= affectedRFQCasesCount ; i++) 
        { 
            PurchRFQCaseId rfqCaseId = conPeek(opportunityData, i); 
            details += rfqCaseId + '\n'; 
        } 
    } 

    return details; 
}

구현할 나머지 두 개의 추상 메서드는 provideHealingAction securityMenuItem 입니다.

provideHealingAction 은 복구 작업이 제공되면 true를 반환하고, 그렇지 않으면 false를 반환합니다. true가 반환되면 performAction 메서드를 구현해야 하며, 그렇지 않으면 오류가 발생합니다. performAction 메서드는 작업에 데이터를 사용할 수 있는 SelfHealingOpportunity 인수를 사용합니다 . 이 예제에서 작업은 수동 수정을 위해 PurchRFQCaseTableListPage 엽니다.

public boolean providesHealingAction() 
{ 
    return true; 
} 

protected void performAction(SelfHealingOpportunity _opportunity) 
{ 
    new MenuFunction(menuItemDisplayStr(PurchRFQCaseTableListPage), MenuItemType::Display).run(); 
} 

규칙의 세부 사항에 따라 기회 데이터를 사용하여 자동 작업을 수행할 수 있습니다. 이 예시에서 시스템은 RFQ 사례에 대한 제목을 자동으로 생성할 수 있습니다.

securityMenuItem 은 작업 메뉴 항목에 액세스할 수 있는 사용자에게만 규칙이 표시되도록 작업 메뉴 항목의 이름을 반환합니다. 보안을 위해 승인된 사용자만 특정 규칙과 기회에 액세스할 수 있어야 합니다. 이 예에서는 PurchRFQCaseTitleAction 에 대한 액세스 권한이 있는 사용자만 영업 기회를 볼 수 있습니다. 이 조치 메뉴 항목은 이 예제에 대해 작성되었으며 PurchRFQCaseTableMaintain 보안 권한에 대한 진입점으로 가리키다.

메모

보안이 제대로 작동하려면 메뉴 항목이 작업 메뉴 항목이어야 합니다. 메뉴 항목 표시와 같은 다른 메뉴 항목 유형은 제대로 작동하지 않습니다.

public MenuName securityMenuItem() 
{ 
    return menuItemActionStr(PurchRFQCaseTitleAction); 
}

규칙이 컴파일된 후 다음 작업을 실행하여 사용자 인터페이스(UI)에 표시되도록 합니다.

class ScanNewRulesJob 
{         
    public static void main(Args _args) 
    {         
        SysExtensionCache::clearAllScopes(); 
        var controller = new DiagnosticsRuleController(); 
        controller.runOperation(); 
    } 
} 

이 규칙은 시스템 관리 정기 작업 진단 유효성 검사 규칙 유지 관리에서 사용할 수 있는 진단 유효성 검사 규칙 양식에>표시됩니다>. 평가하려면 시스템 관리 정기 작업>진단 유효성 검사 규칙> 예약으로이동하여 규칙의 빈도(예: 매일)를 선택합니다. 확인을 클릭합니다. 시스템 관리 최적화 어드바이저> 이동하여 새 기회를 확인합니다.

다음 예시는 모든 필수 메서드와 속성을 포함하는 규칙의 골격이 있는 코드 조각입니다. 새로운 규칙 작성을 시작하는 데 도움이 됩니다. 예시에 사용된 레이블 및 작업 메뉴 항목은 데모용으로만 사용됩니다.

[DiagnosticsRuleAttribute]
public final class SkeletonSelfHealingRule extends SelfHealingRule implements IDiagnosticsRule
{
    [DiagnosticsRuleSubscription(DiagnosticsArea::SCM,
                                 "@SkeletonRuleLabels:SkeletonRuleTitle", // Label with the title of the rule
                                 DiagnosticsRunFrequency::Monthly,
                                 "@SkeletonRuleLabels:SkeletonRuleDescription")] // Label with a description of the rule
    public str opportunityTitle()
    {
        // Return a label with the title of the opportunity
        return "@SkeletonRuleLabels:SkeletonOpportunityTitle";
    }

    public str opportunityDetails(SelfHealingOpportunity _opportunity)
    {
        str details = "";

        // Use _opportunity.data to provide details on the opportunity

        return details;
    }

    protected List evaluate()
    {
        List results = new List(Types::Record);

        // Write here the core logic of the rule

        // When creating an opportunity, use:
        //     * this.getOpportunityForCompany() for company specific opportunities
        //     * this.getOpportunityAcrossCompanies() for cross-company opportunities

        return results;
    }

    public boolean providesHealingAction()
    {
        return true;
    }

    protected void performAction(SelfHealingOpportunity _opportunity)
    {
        // Place here the code that performs the healing action

        // To open a form, use the following:
        // new MenuFunction(menuItemDisplayStr(SkeletonRuleDisplayMenuItem), MenuItemType::Display).run();
    }

    public MenuName securityMenuItem()
    {
        return menuItemActionStr(SkeletonRuleActionMenuItem);
    }

}

자세한 내용은 짧은 YouTube 비디오: Dynamics 365 Finance의 최적화 어드바이저를 시청하세요.