Работа с измерением источника данных

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

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

Описание

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

Исходный код

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

-(void)executeExample {
    // Получаем массив измерений куба
    SNArray allDimensions = [self allDimensions];
    if (allDimensions->count() > 0) {
        // Получаем первое измерение куба в массиве
        SNMutableDictionary description = dimensionDescription(allDimensions->objectAtIndex<PPLDimension>(0));
        SPPLDimension dimension = PPLDimension::dimension(description, m_olapReport->descriptor());
        // Получаем наименование текущего измерения
        SNString dimensionName = dimension->name();
        // Определяем тип полученного измерения
        SNString dimensionType = NStr("неизвестным");
        switch (dimension->type()) {
            case PPLDimension::kCalendarDimension: dimensionType = NStr("календарным");break;
            case PPLDimension::kCalendarPeriodDimension: dimensionType = NStr("календарным периодическим");break;
            case PPLDimension::kStandardDimension: dimensionType = NStr("стандартным");break;
            default:break;
        }
        // Выводим в консоль среды разработки наименование и тип текущего измерения
        printf("Измерение \"%s\" является %s измерением\n", dimensionName->UTF8String(), dimensionType->UTF8String());
        // Получаем ключ текущего измерения
        int dimensionKey = dimension->key();
        printf("Ключ измерения \"%s\": %d\n", dimensionName->UTF8String(), dimensionKey);
        // Получаем идентификатор текущего измерения
        SNString dimensionId = dimension->id();
        // Выводим в консоль среды разработки идентификатор измерения
        printf("Идентификатор измерения \"%s\": %s\n", dimensionName->UTF8String(), dimensionId->UTF8String());
        // Получаем атрибуты текущего измерения
        SPPLDimensionAttributes dimensionAttributes = dimension->attributes();
        // Получаем текстовое описание атрибутов текущего измерения
        SNString attributesDescription = dimensionAttributes->description();
        // Выводим в консоль среды разработки описание атрибутов текущего измерения
        printf("Описание атрибутов измерения:\n%s\n", attributesDescription->UTF8String());
        
        // Получаем массив атрибутов
        SNArray attributesArray = dimensionAttributes->items();
        // Создаем новые атрибуты на основе полученного массива атрибутов
        SPPLDimensionAttributes createdDimensionAttributes = new PPLDimensionAttributes(attributesArray);
        
        // Получаем справочник настроек последнего атрибута измерения из массива
        SNDictionary attributeDescriptor = dimensionAttributeDescription(attributesArray->objectAtIndex<PPLDimensionAttribute>(attributesArray->count() - 1));
        // Создаём атрибут измерения на основе справочника с настройками
        SPPLDimensionAttribute attribute = PPLDimensionAttribute::attribute(attributeDescriptor);
        // Получаем идентификатор атрибута
        SNString attributeID = attribute->id();
        // Находим в созданном массиве атрибут по заданному идентификаторуs
        SPPLDimensionAttribute attributeToFind = createdDimensionAttributes->getAttributeById(attributeID);
        // Получаем наименование атрибута
        SNString attributeName = attributeToFind->name();
        // Получаем тип атрибута
        SNString attributeType = attributeToFind->type();
        // Получаем признак видимости атрибута
        bool attributeIsVisible = attributeToFind->isVisible();
        // Создаем строку для хранения описания видимости атрибута
        SNString attributeVisibility = NStr("нет");
        // Изменяем описание, если атрибут видимый
        if(attributeIsVisible)attributeVisibility = NStr("да");
        // Выводим в консоль среды разработки наименование, тип и описание признака видимости полученного атрибута
        printf("Атрибут \"%s\", тип: %s, видимый: %s\n", attributeName->UTF8String(), attributeType->UTF8String(), attributeVisibility->UTF8String());
        // Получаем текстовое описание полученного атрибута
        SNString attributeDescription = attribute->description();
        // Выводим в консоль среды разработки описание полученного атрибута
        printf("Описание атрибута:\n%s\n", attributeDescription->UTF8String());
        // Получаем информацию о таблице, в которой хранятся данные текущего измерения
        SPPLDimensionTableInfo dataSourceDimensionTableInfo = dimension->tableInfo();
        // Получаем наименование таблицы
        printf("Наименование таблицы, в которой хранятся данные измерения: %s\n", dataSourceDimensionTableInfo->name()->UTF8String());
        // Получаем текстовое описание таблицы измерения
        SNString dataSourceDimensionTableDescription = dataSourceDimensionTableInfo->description();
        // Выводим в консоль среды разработки описание таблицы измерения
        printf("Описание таблицы измерения:\n%s\n", dataSourceDimensionTableDescription->UTF8String());
        // Получаем первичный ключ таблицы
        SNString dataSourceDimensionTablePrimaryKey = dataSourceDimensionTableInfo->primaryKey();
        printf("Первичный ключ таблицы: %s\n", dataSourceDimensionTablePrimaryKey->UTF8String());
        // Получаем родительский ключ таблицы
        SNString dataSourceDimensionTableParentKey = dataSourceDimensionTableInfo->parentKey();
        printf("Родительский ключ таблицы: %s\n", dataSourceDimensionTableParentKey->UTF8String());
        // Создаем справочник, в котором содержится описание новой таблицы данных измерения
        SNMutableDictionary tableDescription = NMutableDictionary::mutableDictionary();
        // Добавляем в справочник название таблицы
        tableDescription->setObjectForKey(NStr("Таблица Данных"), NStr("name"));
        // Создаем новую таблицу данных
        SPPLDimensionTableInfo createdTable = PPLDimensionTableInfo::tableInfo(tableDescription);
        // Получаем наименование новой таблицы
        printf("Наименование новой таблицы данных: %s\n", createdTable->name()->UTF8String());
        
        // Получаем информацию об используемых полях в таблице
        SPPLDimensionFields dataSourceDimensionFields = dimension->fields();
        // Получаем массив полей таблицы
        SNArray dataSourceDimensionFieldsItems = dataSourceDimensionFields->items();
        // Извлекаем первое поле таблицы из массива полей
        SPPLDimensionField dataSourceDimensionField= dataSourceDimensionFieldsItems->objectAtIndex<PPLDimensionField>(0);
        // Получаем наименование первого поля таблицы
        printf("Поле таблицы: %s\n", dataSourceDimensionField->name()->UTF8String());
        if (dimension->elements() != NULL) {
            printf("Количество элементов измерения: %d\n", dimension->elements()->itemsCount());
            } else {
            printf("Измерение не содержит элементов");
        }
    }
}
// Возвращает справочник с описанием указанного измерения
SNMutableDictionary dimensionDescription (SPPLDimension dimension) {
    SNMutableDictionary dimensionDictionary = NMutableDictionary::mutableDictionary();
    // Устанавливаем массив справочников с настройками атрибутов измерения
    SNMutableArray attributeDescriptions = NMutableArray::mutableArray();
    N_FOREACH(SPPLDimensionAttribute, attribute, dimension->attributes()->items()) {
        attributeDescriptions->addObject(dimensionAttributeDescription(attribute));
    }
    dimensionDictionary->setObjectForKey(attributeDescriptions, NStr("Attributes"));
    // Устанавливаем справочник с настройками таблицы измерения
    dimensionDictionary->setObjectForKey(dimensionTableInfoDescription(dimension->tableInfo()), NStr("TableInfo"));
    // Устанавливаем массив справочников с настройками полей измерения
    SNMutableArray fieldDescriptions = NMutableArray::mutableArray();
    N_FOREACH(SPPLDimensionField, field, dimension->fields()->items()) {
        fieldDescriptions->addObject(dimensionFieldDescription(field));
    }
    dimensionDictionary->setObjectForKey(fieldDescriptions, NStr("Fields"));
    // Устанавливаем справочник с настройками измерения
    dimensionDictionary->setObjectForKey(dimensionInfoDescription(dimension), NStr("DimInfo"));
    return dimensionDictionary;
}
// Возвращает справочник с настройками измерения
SNMutableDictionary dimensionInfoDescription(SPPLDimension dimension) {
    SNMutableDictionary dimensionInfoDescription = NMutableDictionary::mutableDictionary();
    dimensionInfoDescription->setObjectForKey(dimension->id(), NStr("id"));
    dimensionInfoDescription->setObjectForKey(dimension->name(), NStr("name"));
    SNString key = NString::stringWithFormat(NStr("%lld"), dimension->key());
    dimensionInfoDescription->setObjectForKey(key, NStr("key"));
    SNString type;
    switch (dimension->type()) {
        case PPLDimension::kCalendarDimension:
        type = NStr("calendar");
        break;
        case PPLDimension::kStandardDimension:
        type = NStr("std");
        break;
        default:break;
    }
    dimensionInfoDescription->setObjectForKey(type, NStr("type"));
    return dimensionInfoDescription;
}
// Возвращает справочник с настройками указанной таблицы измерения
SNMutableDictionary dimensionTableInfoDescription(SPPLDimensionTableInfo tableInfo) {
    SNMutableDictionary tableInfoDescription = NMutableDictionary::mutableDictionary();
    tableInfoDescription->setObjectForKey(tableInfo->name(), NStr("name"));
    tableInfoDescription->setObjectForKey(tableInfo->primaryKey(), NStr("primarykey"));
    tableInfoDescription->setObjectForKey(tableInfo->parentKey(), NStr("parentkey"));
    return tableInfoDescription;
}
// Возвращает справочник с настройками указанного атрибута измерения
SNMutableDictionary dimensionAttributeDescription(SPPLDimensionAttribute attribute) {
    SNMutableDictionary attributeDescription = NMutableDictionary::mutableDictionary();
    attributeDescription->setObjectForKey(attribute->id(), NStr("id"));
    attributeDescription->setObjectForKey(attribute->name(), NStr("name"));
    attributeDescription->setObjectForKey(attribute->type(), NStr("type"));
    attributeDescription->setObjectForKey(NString::stringWithFormat(NStr("%d"),
    attribute->isVisible()), NStr("visible"));
    return attributeDescription;
}
// Возвращает справочник с настройками указанного поля измерения
SNMutableDictionary dimensionFieldDescription(SPPLDimensionField field) {
    SNMutableDictionary fieldDescription = NMutableDictionary::mutableDictionary();
    fieldDescription->setObjectForKey(field->name(), NStr("name"));
    fieldDescription->setObjectForKey(field->type(), NStr("type"));
    fieldDescription->setObjectForKey(field->attribute(), NStr("attr"));
    return fieldDescription;
}

В результате выполнения примера в консоли среды разработки был выведена информация о выбранном измерении, а также информация об атрибутах, элементах и таблице данных измерения:

Измерение "Календарь" является календарным измерением

Ключ измерения "Календарь": 533

Идентификатор измерения "Календарь": CALENDAR_Y_ENG_533

Описание атрибутов измерения:

<NMutableArray:

id: BLOCK_TYPE

name: Тип блока календаря

type: INTEGER

is visible: NO

id: START_DATE

name: Дата начала периода

type: DATETIME

is visible: NO

id: NAME

name: Имя элемента календаря

type: TEXT

is visible: YES

id: ID

name: Идентификатор

type: TEXT

is visible: NO

id: ORDER

name: Порядок

type: INTEGER

is visible: NO

>

Атрибут "Порядок", тип: INTEGER, видимый: нет

Описание атрибута:

id: ORDER

name: Порядок

type: INTEGER

is visible: NO

Наименование таблицы, в которой хранятся данные измерения: CALENDAR_Y_ENG_533

Описание таблицы измерения:

name: CALENDAR_Y_ENG_533

primary key: KEY

parent key: PARENT_KEY

Первичный ключ таблицы: KEY

Родительский ключ таблицы: PARENT_KEY

Наименование новой таблицы данных: Таблица Данных

Поле таблицы: KEY

Количество элементов измерения: 11

См. также:

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