Работа с источником данных таблицы

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

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

Описание

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

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

В базовый пример «Отображение экспресс-отчёта» необходимо добавить следующий файл:

Исходный код

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

// Получаем массив контроллеров представлений данных
NSArray *controllers =[m_controller dataViewControllers];
// Перебираем в цикле контроллеры представлений данных
for(NSObject *controller in controllers)
{
    // Проверяем, является ли текущий контроллер контроллером представления данных в виде таблицы
    if([controller isMemberOfClass:[MAGridDataViewController class]])
    {
        // Получаем объект контроллера представления данных в виде таблицы
        MAGridDataViewController *gridController = (MAGridDataViewController *)controller;
        // Получаем источник данных таблицы
        GridDataViewDatasource *grid = [gridController gridDatasource];
        // Получаем объект-основу для построения таблиц с данными
        SPPLPivot pivot = [grid pivot];
        // Получаем источник данных объекта-основы для построения таблиц с данными
        SPPLDataSource datasource = pivot->dataSource();
        // Получаем массив измерений источника данных
        SNArray dimensions = datasource->dimensions();
        // Выводим в консоль среды разработки наименования измерений в источнике данных
        NSLog(@"Измерения, содержащиеся в источнике данных объекта-основы для построения таблиц с данными:");
        for(int i = 0; i < dimensions->count(); i++)
        {
            SPPLDimension dimension = dimensions->objectAtIndex<PPLDimension>(i);
            NSLog(@"%@", dimension->name()->nsString());
        }
        // Получаем таблицу данных
        SPPLPivotTable pivotTable = [grid pivotTable];
        // Проверяем, не является ли источник данных таблицы пустым
        if([grid isEmpty] == NO)
        {
            // Получаем представление контроллера
            UIView *view = [gridController view];
            // Получаем массив вложенных представлений
            NSArray *subviews = [view subviews];
            // Перебираем в цикле вложенные представления
            for(NSObject *subview in subviews)
            {
                // Проверяем, является ли текущее представление табличным представлением
                if([subview isMemberOfClass:[NuGridView class]])
                {
                    // Получаем объект табличного представления
                    NuGridView *gView = (NuGridView *)subview;
                    // Проверяем наличие в таблице необходимого количества столбцов
                    if(pivotTable->columnCount() > 1)
                    {
                        // Получаем отступ и выводим в консоль среды разработки отступ заголовка для столбца с индексом 1
                        NSInteger indentForHeader = [grid gridView:gView indentForHeaderForColumn:1 number:0];
                        NSLog(@"Отступ заголовка для столбца с индексом 1: %i", indentForHeader);
                        // Получаем постоянный ключ столбца
                        MAGridDataSourcePersistentKey *columnPersistentKey = [grid columnPersistentKeyByNumber:1];
                        // Получаем постоянный ключ родительского столбца
                        MAGridDataSourcePersistentKey *parentColumn = [grid parentColumnOfColumn:columnPersistentKey];
                        // Проверяем результат получения родительского столбца
                        if(parentColumn != nil)
                        {
                            // Выводим в консоль среды разработки номер родительского столбца, полученный по его постоянному ключу
                            NSLog(@"Номер родительского столбца для столбца 1: %i", [grid columnNumberByPersistentKey: parentColumn]);
                        }
                        else
                        {
                            NSLog(@"Родительский столбец для столбца %d отсутствует", [grid columnNumberByPersistentKey:columnPersistentKey]);
                        }
                    }
                    else
                    {
                        NSLog(@"Не удалось получить столбец");
                    }
                    // Проверяем наличие в таблице необходимого количества строк
                    if(pivotTable->rowCount() > 1)
                    {
                        // Получаем отступ и выводим в консоль среды разработки отступ заголовка для строки с индексом 1
                        NSInteger indentForHeader = [grid gridView:gView indentForHeaderForRow:1 number:0];
                        NSLog(@"Отступ заголовка для строки с индексом 1: %i", indentForHeader);
                        // Получаем постоянный ключ строки
                        MAGridDataSourcePersistentKey *rowPersistentKey = [grid rowPersistentKeyByNumber:1];
                        // Получаем постоянный ключ родительской строки
                        MAGridDataSourcePersistentKey *parentRow = [grid parentRowOfRow:rowPersistentKey];
                        // Проверяем результат получения родительской строки
                        if(parentRow != nil)
                        {
                            // Выводим в консоль среды разработки номер родительской строки, полученный по ее постоянному ключу
                            NSLog(@"Номер родительской строки для строки 1: %i", [grid rowNumberByPersistentKey: parentRow]);
                        }
                        else
                        {
                            NSLog(@"Родительская строка для строки %d отсутствует", [grid rowNumberByPersistentKey:rowPersistentKey]);
                        }
                    }
                    else
                    {
                        NSLog(@"Не удалось получить строку");
                    }
                    break;
                }
            }
            // Получаем постоянный ключ для столбца со спарклайнами
            MAGridDataSourcePersistentKey *sparklineColumnKey = [grid sparklineColumnPersistentKey];
            // Выводим в консоль среды разработки описание постоянного ключа для столбца со спарклайнами
            NSLog(@"Описание постоянного ключа для столбца со спарклайнами: %@",[sparklineColumnKey description]);
        }
        // Обновляем источник данных таблицы
        [grid updateAsync];
        break;
    }
}

Также необходимо заменить код в файле статичного примера MAExpressAnalysisReportViewControllerDelegateImpl.mm в методе initWithOlapReport: в блоке:

if (self.isGridEnabled)

на следующий код:

// Получаем настройки отчета
SNDictionary gridOlapPlist = m_olapReport->storageDictionary()->objectForKey<NDictionary>(GRID_OLAP_KEY);
// Создаем отчет
SPPLOlapReport gridOlapReport = NULL;
if (gridOlapPlist != NULL) {
    gridOlapReport = PPLOlapReport::olapReport(m_olapReport->descriptor(), gridOlapPlist);
}
// Создаем объект-основу для построения таблицы данных
m_gridPivot = (gridOlapReport != NULL) ? PPLPivot::pivot(gridOlapReport) : PPLPivot::pivot(m_olapReport);
// Создаем таблицу данных
m_gridPivotTable = PPLPivotTable::pivotTable(m_gridPivot);
// Получаем настройки таблицы данных
SNDictionary gridPivotTablePlist = m_olapReport->storageDictionary()->objectForKey<NDictionary>(GRID_PIVOT_TABLE_KEY);
// Проверяем, является ли объект настроек таблицы пустым
if (gridPivotTablePlist != NULL)
{
    // Устанавливаем настройки таблицы
    m_gridPivotTable->setupFromPlist(gridPivotTablePlist);
}
else
{
    // Применяем настройки таблицы
    [self applyGridSettings];
}
// Создаем источник данных на основе таблицы данных
m_gridDatasource = [[GridDataViewDatasource alloc] initWithPivotTable:m_gridPivotTable];

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

Измерения, содержащиеся в источнике данных объекта-основы для построения таблиц с данными:

Calendar

World

Indicators

Отступ заголовка для столбца с индексом 1: 0

Родительский столбец для столбца 1 отсутствует

Отступ заголовка для строки с индексом 1: 1

Номер родительской строки для строки 1:  0

Описание постоянного ключа для столбца со спарклайнами: <MAGridDataSourcePersistentKey=nil>

 

Далее необходимо создать класс делегата источника данных таблицы, в котором реализована обработка событий таблицы, добавить заголовочный файл класса в исходный код класса ViewController, а также разместить в теле метода executeExample после блока

if([grid isEmpty] == NO)

следующий код:

// Создаем объект-наблюдатель событий источника данных таблицы
DataViewDatasourceExample *exampleDelegate = [[DataViewDatasourceExample alloc] initWithName: @"gridDatasource"];
// Подписываем объект-наблюдатель на события источника данных
[grid addEventObserver:exampleDelegate];
// Вызываем событие обновления данных
[grid pivotTableUpdated];

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

gridDatasource: Cобытие обновления данных, код события: 1

См. также:

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