Требования к операционной системе: 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
См. также: