Работа с элементами заголовка таблицы

Требования к операционной системе: iOS 5.0 и выше.

Мобильное устройство: iPad.

Описание

В данном примере демонстрируется работа с итоговыми элементами заголовков таблицы. После запуска примера выполняются следующие операции:

Под итоговым элементом заголовка таблицы подразумевается элемент, соответствующий ячейке на пересечении столбца-заголовка и строки, содержащей итоговые данные, и наоборот.

Необходимые файлы

В базовый пример «Анализ данных» необходимо добавить следующий файл:

Исходный код

Для выполнения примера необходимо создать класс, содержащий метод для сортировки вершин дерева элементов таблицы, а также добавить заголовочный файл класса в исходный код класса ViewController (см. раздел «Анализ данных»). Далее необходимо разместить в теле метода executeExample класса ViewController следующий код:

-(void)executeExample {
    // Получаем верхний заголовок таблицы
    SPPLPivotTableHeader topPivotHeader = m_gridPivotTable->topHeader();
    // Выводим информацию о вычисляемом элементе заголовка
    [self printCalculatedElementInfo: topPivotHeader->elements() forHeaderElementWithIndex: 0];
    // Выводим информацию об итоговом элементе заголовка
    [self printTotalsElementsInfo: topPivotHeader->elements()];
    if (topPivotHeader->dimensions() > 0) {
        // Выводим информацию о вершинах дерева элементов для измерения с указанным индексом
        [self printTreeNodesInfo: topPivotHeader ForDimensionWithIndex: 0];
        // Выводим описания элементов заголовка, отсортированных по убыванию
        [self printSortedHeaderElementsDescriptions: topPivotHeader->elements()];
    }
}
// Выводит информацию о вычисляемых элементах заголовка
-(void)printCalculatedElementInfo: (SPPLPivotTableHeaderElements) pivotHeaderElements
forHeaderElementWithIndex: (int) elemIndex {
    if (pivotHeaderElements->elementsCount() > 0) {
        // Получаем элемент заголовка таблицы по индексу
        SPPLPivotTableHeaderElement parentElement = pivotHeaderElements->getElementByIndex(elemIndex);
        SPPLPivotTableCalculatorSetting calculatorSetting = new PPLPivotTableCalculatorSetting();
        // Создаём вычисляемый элемент на базе полученного элемента заголовка таблицы
        SPPLPivotTableHeaderElement calculatedElement = pivotHeaderElements->createCalculatedElement(parentElement, [self getCalculatorSetting]);
        // Проверяем, является ли элемент вычисляемым
        if (pivotHeaderElements->isElementCalculated(calculatedElement)) {
            printf("Элемент с индексом %d является вычисляемым\n", pivotHeaderElements->getIndexOfElement(calculatedElement));
            } else {
            printf("Новый элемент не является вычисляемым\n");
        }
    }
}
// Возвращает настройки вычисляемого элемента
-(SPPLPivotTableCalculatorSetting)getCalculatorSetting {
    // Создаём контейнер настроек вычисляемых рядов таблицы данных
    SPPLPivotTableCalculatorSettings calculatorSettings = new PPLPivotTableCalculatorSettings();
    // Добавляем новые настройки
    calculatorSettings->addSetting(new PPLPivotTableCalculatorSetting());
    calculatorSettings->addSetting(new PPLPivotTableCalculatorSetting());
    calculatorSettings->addSetting(new PPLPivotTableCalculatorSetting());
    printf("Исходное количество настроек вычисляемых рядов: %d\n", calculatorSettings->settingsCount());
    // Оставляем только последнюю настройку
    for (int i = 0; i < calculatorSettings->settingsCount(); i++) {
        calculatorSettings->removeSetting(calculatorSettings->setting(i));
    }
    printf("Полученное количество настроек вычисляемых рядов: %d\n", calculatorSettings->settingsCount());
    if (calculatorSettings->settingsCount() > 0) {
        return calculatorSettings->setting(0);
        } else {
        return NULL;
    }
}
// Выводит информацию об итоговом элементеы заголовка
-(void)printTotalsElementsInfo: (SPPLPivotTableHeaderElements) pivotHeaderElements {
    // Получаем все измерения
    SNArray dimensions = [self allDimensions];
    // Создаём новый элемент итогов
    SPPLPivotTableHeaderElement totalsElement =
    pivotHeaderElements->createTotalsElement(dimensions, NULL, PPLPivotTableTotalsTypes::kSum);
    // Проверяем, принадлежит ли созданный элемент текущему заголовку
    if (pivotHeaderElements->checkMembership(totalsElement)) {
        int currentIndex = pivotHeaderElements->getIndexOfElement(totalsElement);
        printf("Итоговый элемент принадлежит верхнему заголовку и имеет индекс %d \n", currentIndex);
        } else {
        printf("Новый итоговый элемент не принадлежит текущему заголовку \n");
    }
    for (int i = 0; i < pivotHeaderElements->elementsCount(); i++) {
        SPPLPivotTableHeaderElement element = pivotHeaderElements->getElementByIndex(i);
        // Проверяем, является ли элемент заголовка итоговым
        if (pivotHeaderElements->isElementInTotals(element)) {
            printf("Элемент заголовка с индексом %d является итоговым \n", i);
        }
    }
}
// Выводит информацию о вершинах дерева элементов для измерения с указанным индексом
-(void)printTreeNodesInfo: (SPPLPivotTableHeader) pivotTableHeader
ForDimensionWithIndex: (int) dimIndex {
    // Получаем первое измерение заголовка таблицы
    SPPLDimension dimension = pivotTableHeader->dimensions()->objectAtIndex<PPLDimension>(dimIndex);
    // Получаем дерево отмеченных элементов заголовка для данного измерения
    SPPLCommonTree tree = pivotTableHeader->elements()->getSelectedElementsTreeForDimension(dimension);
    printf("Количество вершин в дереве элементов для измерения %s: %d \n", dimension->name()->UTF8String(), tree->count());
    if (tree->count() > 0) {
        SPPLCommonTreeNode rootNode = tree->rootNodes()->objectAtIndex<PPLCommonTreeNode>(0);
        printf("Первая корневая вершина дерева: %s \n", rootNode->description()->UTF8String());
    }
}
// Выводит описания элементов заголовка, отсортированных по убыванию
-(void)printSortedHeaderElementsDescriptions: (SPPLPivotTableHeaderElements) pivotHeaderElements {
    if (pivotHeaderElements->elementsCount() > 0) {
        // Отсортируем элементы заголовка
        SortElementsManager *sort = new SortElementsManager();
        SNArraySortSelector sortSelector = new NSpecificSelectorMethod2Returns<SortElementsManager, NID, NID, NComparisonResult>(sort, &SortElementsManager::sortSelector);
        pivotHeaderElements->sortElementsUsingSelector(sortSelector);
        // Выведем в консоль среды разработки вершины дерева
        printf("Описания элементов заголовка, отсортированных по убыванию:\n");
        for (int i = 0; i < pivotHeaderElements->elementsCount(); i++) {
            printf("%s \n", pivotHeaderElements->getElementByIndex(i)->description()->UTF8String());
        }
    }
}

В результате выполнения примера в консоли среды разработки были выведены индексы всех вычисляемых и итоговых элементов верхнего заголовка таблицы, количество вершин в дереве элементов для первого измерения заголовка, описание первой корневой вершины и описания отсортированных по убыванию элементов заголовка:

Исходное количество настроек вычисляемых рядов: 3
Полученное количество настроек вычисляемых рядов: 1
Элемент с индексом 1 является вычисляемым

Итоговый элемент принадлежит верхнему заголовку и имеет индекс 7

Элемент заголовка с индексом 7 является итоговым

Количество вершин в дереве элементов для измерения Time: 7

Первая корневая вершина дерева: 2006 ,(8, parent: 0)

Описания элементов заголовка, отсортированных по убыванию:

PPLDataSourceMatrixKeyBase parts=1 (16033=>14 )

PPLDataSourceMatrixKeyBase parts=1 (16033=>13 )

PPLDataSourceMatrixKeyBase parts=1 (16033=>11 )

PPLDataSourceMatrixKeyBase parts=1 (120448481=>4294967295 )

PPLDataSourceMatrixKeyBase parts=1 (16033=>12 )

PPLDataSourceMatrixKeyBase parts=1 (16033=>10 )

PPLDataSourceMatrixKeyBase parts=1 (16033=>8 )

PPLDataSourceMatrixKeyBase parts=1 (16033=>9 )

См. также:

Примеры использования библиотеки pplib++