База знаний

Номер статьи: 1456 | Категория: Настройка проекта | Тип: Задача – Решение | Последнее обновление: 27.08.2015

Сборка документа с взаимоисключающими обязательными разделами

Описание

Как настроить сборку для следующей структуры документа:

При этом один из разделов: раздел 2 или раздел 3 – должен всегда обязательно присутствовать в документе. При этом разделы 2 и 3 взаимоисключающие, т.е. если в документе присутствует раздел 2, то раздела 3 быть не должно, и наоборот. Если присутствуют оба этих раздела – ошибка сборки.

Решение

Реализация этого сценария очень проста. На закладке Сборка свойств определения документа необходимо задать нужные значения для максимального и минимального чисел повторений каждого раздела и, помимо использования стандартных правил сборки документа (они нужны для проверки порядка разделов в документе), нужно добавить скрипт сборки, который будет проверять условия для разделов 2 и 3:

 

Скрипт сборки на языке C#.Net(подробнее о скриптах сборки можно прочитать в этой статье):

using System;

// Число разделов Receipt в документе
int receiptCount = 0; 
// Число разделов Agreement в документе
int agreementCount = 0;

for (int i = 0; i < Documents.Count; i++)
{
    for (int j = 0; j < Documents[i].Pages.Count; j++) 
    {
        IMatchedSectionInfo section = Documents[i].Pages[j].MatchedSection;

        // Считаем в документе все «первые» страницы раздела Receipt
        if (section.Name == "Receipt" && section.SectionDefinitionPageNumber == 0)
            receiptCount++;

        // Считаем в документе все «первые» страницы раздела Agreement 
        else if (section.Name == "Agreement" && section.SectionDefinitionPageNumber == 0)
            agreementCount++;
    }
}

int excessWeight = Math.Min( receiptCount, agreementCount)

// Считаем раздел, встречающийся в документе меньшее число раз, лишним
if (excessWeight > 0)
    AssemblingErrors.AddCustomError
        ("Document can't contain both Receipt and Agreement sections", excessWeight);

// Выводим ошибку, если в документе нет ни раздела Receipt, ни Agreement
if (receiptCount == 0 && agreementCount == 0)
    AssemblingErrors.AddCustomError
        ("Document must contain either Receipt or Agreement section", 0);

В случае, когда необязательными будут не жесткие, а гибкие разделы, скрипт должен немного видоизмениться. Это связано с тем, что у гибких секций не определено свойство SectionDefinitionPageNumber. Для того чтобы посчитать число гибких разделов в документе, необходимо использовать свойство FlexibleInstanceId, которое представляет собой индекс гибкого раздела. Множество страниц с одинаковым FlexibleInstanceId образуют один гибкий раздел. Таким образом, количество гибких разделов в документе равно количеству разных индексов FlexibleInstanceId, в этом документе встречающихся.

using System;
using System.Collections.Generic;

int receiptCount = 0;
int agreementCount = 0;

// Cписок идентификаторов всех разделов Receipt в документе
List<int> flexibleSectionReceipt = new List<int>(); 
// Cписок идентификаторов всех разделов Agreement в документе
List<int> flexibleSectionAgreement = new List<int>();

for (int i=0; i < Documents.Count; i++)
{
    for(int j = 0; j < Documents[i].Pages.Count; j++)      
    {
        IMatchedSectionInfo section = Documents[i].Pages[j].MatchedSection;
        if (section.Name == "Receipt")
            Operations.UpdateSectionList
                (flexibleSectionReceipt, section.FlexibleInstanceId, receiptCount)
        
        else if (section.Name == "Agreement")
            Operations.UpdateSectionList
                (flexibleSectionAgreement, section.FlexibleInstanceId, agreementCount)
    }
}

int excessWeight = Math.Min(receiptCount, agreementCount);

if (excessWeight > 0)
    AssemblingErrors.AddCustomError
        ("Document can't contain both Receipt and Agreement sections", excessWeight);

if (receiptCount == 0 && agreementCount == 0)
    AssemblingErrors.AddCustomError
        ("Document must contain either Receipt or Agreement section", 0);

Operations.UpdateSectionList() – функция из глобального модуля Rule Global Script Module:

public class Operations
{
    public static void 
        UpdateSectionList
            (System.Collections.Generic.List<int>sectionList, int sectionId, int SectionCount)
    {
        int count = 0;
        
        for (int r = 0; r < sectionList.Count; r++)
        {
            if(sectionId == sectionList[r])
                count++;
        }
       
        if (count == 0)
        {
            sectionList.Add(sectionId);
            sectionCount++;
        }
    }
}

 

357 считают это полезным.
Была ли эта информация вам полезна?