Динамическая генерация форматированного представления внутренних таблиц для вывода
Описанный в статье класс вывода данных внутренних таблиц обеспечивает возможность динамической генерации форматированного представления внутренней таблицы во время выполнения программы с поддержкой последующего вывода таких данных в разных форматах.
Ключевое понятие |
Библиотека ABAP Run Time Type Services (RTTS) представляет собой объектно-ориентированную архитектуру, которая позволяет выводить информацию по типам существующих объектов через инструмент Run Time Type Information (RTTI), а также определять новые типы данных с помощью средства Run Time Type Creation (RTTC). |
Как правило, внутренние таблицы требуется форматировать для вывода данных в плоском файле или во вложении к сообщению электронной почты. Однако для того, чтобы выполнить эту задачу корректно, программист во время разработки обычно должен статически определить релевантные структуры для хранения данных. Кроме того, программист вынужден тратить время на обработку данных (создание и форматирование строки заголовка, заключение значений строк в кавычки, преобразование внутренних форматов даты/времени в подходящий внешний формат представления и вставку разделителей между полями). Все это весьма распространенные операции.
В данной статье я хотел бы рассмотреть класс вывода данных внутренних таблиц, разработанный мной для формирования поведения, связанного с хранением, манипуляцией и форматированием внутренних таблиц в рамках подготовки к выводу данных. Структура выходной таблицы создается динамически во время выполнения, а строка заголовка с описанием полей формируется с использованием информации из словаря данных (Data Dictionary). Реализована поддержка последующего вывода данных в файле, сообщении электронной почты и формате SAP List Viewer (ALV). Коды программ можно загрузить по следующим ссылкам:
Пройдите по ссылке http://sapexperts.wispubs.com/-/media/SAP Experts/Downloads/2014/May/Dynamically Generate a Formatted Representation of Internal Tables for Outputn/z_introspector_demo_source.txt, чтобы просмотреть исходный код для демонстрационной программы z_introspector_demo_source.
Пройдите по ссылке http://sapexperts.wispubs.com/-/media/SAP Experts/Downloads/2014/May/Dynamically Generate a Formatted Representation of Internal Tables for Outputn/zcl_bc_table_introspector_source.txt, чтобы просмотреть исходный код для класса, выводящего данные внутренней таблицы в различных форматах представления zcl_bc_table_introspector_source.
Пройдите по ссылке http://sapexperts.wispubs.com/-/media/SAP Experts/Downloads/2014/May/Dynamically Generate a Formatted Representation of Internal Tables for Outputn/table_introspector_utility class readme.txt, чтобы просмотреть исходный код для класса вывода данных внутренних таблиц и файл описания (readme) с информацией о зависимых исключениях для класса вывода данных внутренних таблиц.
Демонстрационная программа для вывода данных внутренних таблиц
Для представления основных возможностей класса для вывода данных внутренних таблиц я разработал простую демонстрационную программу. Данные для заполнения внутренней таблицы во время выполнения относятся к универсальной модели данных авиарейсов, которая часто используется в примерах от SAP. На экране выбора (Рис. 1) можно ввести входные данные для выбора рейсов по аэропорту вылета, аэропорту прибытия и авиакомпании. Дополнительно представлены несколько вариантов вывода данных для демонстрации опций форматирования, доступных пользователям при работе с классом вывода внутренних таблиц.
Рис. 1. Экран выбора демонстрационной программы
Для получения представления о потоке управляющей информации на высоком уровне рассмотрим основной метод (Рис. 2), используемый в локальном классе программы.
Рис. 2. Демонстрационная программа
В рамках подготовки сначала создайте инстанцию локального класса. После выполнения этого шага вызовите следующие методы:
1) Первым вызывается метод load_data, который просто вызывает функцию BAPI bapi_flight_getlist для заполнения требуемой внутренней таблицы (Рис. 3). Внутренняя таблица сохраняется в виде атрибута инстанции в локальном классе.
Рис. 3. Заполнение внутренней таблицы данными по списку рейсов
2) Второй метод отвечает за загрузку собственно внутренней таблицы для вывода данных. Для класса вывода данных внутренних таблиц установлен контекст «private» (личный). Таким образом, требуется другой способ инициализации класса путем самозагрузки. Для этого можно использовать один из двух доступных методов. Поскольку вы работаете с внутренней таблицей, логично вызвать метод factory_using_table. Ниже, когда я буду описывать реализацию, вы увидите, что существует и второй подходящий метод. Помимо данных рейсов, переданных в этот метод, предоставляются и пользовательские опции форматирования. Далее возвращаемый объект по дальнейшей обработке данных сохраняется в виде атрибута инстанции локального класса. Подробно этот процесс показан на Рис. 4.
Рис. 4. Вызов класса вывода данных внутренних таблиц
3) Следующий вызов метода относится к методу выгрузки. Здесь для упрощения экспорта данных в файл вызывается стандартный метод cl_gui_frontend_services=>gui_download. В этом отношении реализация не выделяется какими-либо особенностями. А вот для вывода таблицы применяется нестандартный подход. Обратимся к инициализированному ранее объекту вывода данных внутренних таблиц. Общедоступный метод инстанций позволяет работать с различными доступными для запроса форматами, каждый из которых подходит для определенной цели. В данном случае целью является выгрузка таблицы в файл. Для объекта вывода данных внутренних таблиц вызывается метод get_file_rendition (Рис. 5).
Рис. 5. Вывод прочитанных данных в виде файла
Продолжаем работу с объектом вывода данных внутренних таблиц. Далее требуется просмотреть простую сетку ALV для вывода пользователю на экране визуального представления выгруженных данных. В данном случае метод просмотра локального класса реализован для вызова метода вывода данных внутренних таблиц get_alv_rendition. Экспортированный параметр является объектом для создания ALV-представления с использованием класса cl_salv_table. Этот объект используется стандартным образом для вывода данных на экран (Рис. 6).
Рис. 6. Вывод данных внутренней таблицы в представлении ALV
После выгрузки на диск файл, открытый в текстовом редакторе, выглядит следующим образом: Рис. 7.
Рис. 7. Внутренняя таблица в виде файла
На Рис. 8 показан вывод на экран в формате ALV-таблицы.
Рис. 8. Внутренняя таблица в виде ALV
Несмотря на трудности при реализации внутри утилитного класса, преимуществом является то, что при условии корректной разработки пользователь получает простой и гибкий интерфейс. Для класса вывода данных внутренних таблиц это подтверждает представленная выше демонстрационная программа. Этот класс несложно вызвать. Он предлагает возможности форматирования и визуализации для внутренних таблиц, структура которых считывается только во время выполнения. Теперь разработчики могут не волноваться по этому поводу и сосредоточиться на продумывании бизнес-логики приложения.
Далее обратимся к подробным данным реализации.
Подробные данные реализации класс для вывода данных внутренних таблиц
В демонстрационной программе видны базовые компоненты класса вывода данных внутренних таблиц на высоком уровне. Как уже было сказано, для инициализации класса используются стандартные методы. Эти методы выполняют инициализацию, связанную с выводом данных внутренних таблиц. Результаты пользователь может получить путем вызова общедоступных методов, которые возвращают одно из представлений.
Но как именно это происходит? Ответом является применение библиотеки ABAP Run Time Type Services (RTTS). Можно вывести информацию о типах существующих объектов с помощью Run Time Type Information (RTTI) и определить новые типы данных с помощью Run Time Type Creation (RTTC). Оба эти средства инфраструктуры используются стандартными методами для выполнения необходимых операций по преобразованию данной внутренней таблицы в подходящий для вывода формат.
В рамках подробного изучения реализации рассмотрим код, вызываемый в демонстрационной программе. Разумеется, описывать здесь каждую строку кода нецелесообразно. Вместо этого сосредоточимся на типе обработки, выполняемой посредством библиотеки RTTS, и на том, как изменяющиеся во время выполнения структуры приближают нас к цели – заполнению исходной внутренней таблицы в подходящем для вывода данных формате.
Начнем с процесса создания инстанции, что является непростой задачей. Класс для вывода данных внутренних таблиц инстанциируется со статусом private, поэтому создать ссылки на объекты напрямую невозможно. Вместо этого для инициализации класса можно использовать стандартные методы. Это дает целый ряд преимуществ. Например, можно жестко контролировать комплексные процессы инициализации для обеспечения их корректного выполнения. Кроме того, можно изменить подробные данные реализации без воздействия на зависимый код. Также можно предложить ряд способов для инициализации класса.
Оформите подписку sappro и получите полный доступ к материалам SAPPRO
Оформить подпискуУ вас уже есть подписка?
Войти