Расширение класса по представлению данных внутренних таблиц для реализации поддержки вывода длинных текстовых данных
В своей статье Дэвид Данкомб описывает использование класса вывода данных внутренних таблиц для динамической генерации форматированного представления хранимых данных во время выполнения программы с поддержкой вывода данных в рабочую книгу Microsoft Excel. В результате пользователи получают более естественный способ форматирования выбранных данных.
Ключевое понятие
Библиотека iXML представляет собой API с базовыми сервисами Extensible Markup Language (XML). Эти сервисы могут использоваться для создания документов в формате XML в целях дальнейшего представления таких данных в рабочей книге Microsoft Excel.
В своей первой статье, посвященной созданию класса по форматированному представлению данных таблиц, автор описал возможность динамической генерации форматированного представления внутренней таблицы во время выполнения программы с поддержкой последующего вывода таких данных в разных форматах. Теперь рассмотрим расширение данного класса. Это расширение создается на основе исходной реализации путем предоставления поддержки вывода данных в рабочую книгу Microsoft Excel.
Рассмотрим, почему этот дополнительный формат вывода в рабочую книгу Microsoft Excel так полезен, а затем кратко сравним оба доступных варианта экспорта данных в Microsoft Excel из среды SAP NetWeaver. Далее в статье будет описана демонстрационная программа, основное внимание будет удалено новым возможностям класса. Кроме того, уделим внимание изменениям в реализации для класса. Внесенные изменения используются для предоставления расширенной функциональности.
Примечание.
Первая статья автора Generate a Formatted Representation of Internal Tables for Output (Динамическое создание форматированного представления внутренних таблиц) содержит подробные данные по реализации исходного класса, выполняющего форматированное представление данных таблицы. Поскольку основное внимание в этой статье уделено необходимым изменениям к исходной реализации, читателям важно иметь правильное представление об исходной реализации. Поэтому перед чтением данной статьи рекомендуется изучить первую статью автора, если вы этого еще не сделали.
Код реализованных программ можно получить по следующим ссылкам:
Нажмите здесь, чтобы просмотреть код для программы z_introspector_load_text, формирующей тестовую таблицу с длинным текстами.
Нажмите здесь, чтобы просмотреть исходный код для демонстрационной программы z_introspector_excel_demo, выгружающей тестовую таблицу с длинными текстами в формате Microsoft Excel.
Нажмите здесь, чтобы просмотреть исходный код для класса, выводящего данные внутренней таблицы в различных форматах представления zcl_bc_table_introspector_source.
Нажмите здесь, чтобы просмотреть общий файл описания (Readme) по реализации класса вывода таблиц в различных форматах.
Экспорт данных в Microsoft Excel
Распространенным бизнес-требованием является доступность вывода данных из SAP-системы в виде файла Microsoft Excel. Причины таких запросов различны. Некоторым пользователям просто удобнее работать в приложении для электронных таблиц. Другие предпочитают расширенные опции форматирования или обработки, которые доступны только в приложении для электронных таблиц. Например, многим пользователям требуется возможность сортировки данных или применения условного форматирования на основе каких-либо формул.
Во многих случаях эти разнообразные требования можно удовлетворить, предоставив функцию вывода данных в текстовые файлы с разделителем, например запятой (так называемый формат CSV). Формат файла CSV широко используется, данные в таком файле содержат произвольное количество записей, разделенных символами перевода строки или иногда двумя символами: перевод строки и возврат каретки. Каждая запись, в свою очередь, делится на поля, разделенные, как правило, символами табуляции или запятыми. После вывода данных в файле CSV этот файл можно открыть в приложении для электронных таблиц. Далее пользователь может обработать данные с применением расширенных функций.
Однако в некоторых ситуациях выполнить требования пользователей посредством простого файла CSV трудно или даже невозможно. Одним из наиболее распространенных требований, которое затруднительно удовлетворить с помощью файла CSV, является вывод данных подробных текстов. Несмотря на то, что представить подробный текст в формате CSV возможно, работать с таким текстом, занимающим большое число строк, попросту неудобно. В этом случае желательно представить данные в виде электронной таблицы, поскольку концепция ячеек позволяет хранить такой текст в удобном для представления и обработки виде.
Необходимость представлять данные подробных текстов является основной причиной расширения класса, описанного в первой статье. После добавления нового типа вывода для представления данных в виде рабочей книги Microsoft Excel вы сможете с легкостью работать с длинными текстами, находящимися в системе. Кроме того, новый тип вывода позволяет использовать другие возможности, доступные только в формате электронной таблицы. Эти функции рассматриваются ниже в соответствующих разделах данной статьи.
В следующих разделах кратко описаны некоторые доступные опции для создания файлов, которые могут использовать возможности форматирования и обработки Microsoft Excel. Всеобъемлющее описание релевантных опций выходит за рамки данной статьи. Для получения дополнительной информации о всех возможностях технологий SAP посетите веб-сайт http://help.sap.com.
Object Linking and Embedding Automation (OLE)
Технология OLE разработана в компании Microsoft для упрощения обмена данными между процессами. Этот механизм предоставляет сервер автоматизации для экспорта объектов автоматизации, которые далее могут быть обработаны клиентами автоматизации посредством свойств и методов. Таким образом, настольные приложения (в том числе Microsoft Excel) могут выступать в роли сервера автоматизации для предоставления своих функций сторонним приложениям.
Технология OLE поддерживается в ABAP с помощью набора специфичных для OLE языковых элементов. В этот набор входят команды CREATE OBJECT, CALL METHOD, GET PROPERTY, SET PROPERTY и FREE OBJECT. Для каждой команды необходимо выполнить мэппинг модулей OLE в SAPGUI, для вызова которых используется техники Remote Function Call (RFC). Таким образом, SAPGUI в данном случае представляет собой клиент автоматизации и может работать как промежуточное звено при обмене данными между ABAP-программой и сервером автоматизации.
Обратите внимание на то, что поскольку технология OLE работает на базе подключений из ABAP-программы к GUI-фронтэнду (где находятся клиент и сервер автоматизации), выполнить программу в фоновом рабочем процессе невозможно. Во многих случаях это может быть серьезным недостатком.
Desktop Office Integration (DOI)
Технология DOI предоставляет объектно-ориентированную оболочку для технологии автоматизации OLE. На высоком уровне в качестве промежуточных звеньев при обмене данными между SAP-системой и настольным приложением используются два специальных средства контроля. SAP Document Container Control находится в SAPGUI и осуществляет коммуникацию с настольным приложением посредством интерфейса OLE. SAP Data Provider отвечает за буферизацию данных SAP, которые можно вставить в документы с использованием ссылок.
Обработка на базе XML
Extensible Markup Language (XML) – это метаязык, предназначенный для моделирования произвольных форматов документов. Правила кодирования документов можно найти в схеме XML, которая отвечает за формальное определение ограничений по структуре и содержимому документов. Несмотря на то, что XML является, возможно, самым известным форматом для обмена данными по сети Интернет, он, помимо этого, используется во многих других приложениях. В частности, он используется во многих пакетах офисных программ для представления данных в форматах файлов документов.
Форматы XML Microsoft Office 2003 предлагают новый способ представления документов в Microsoft Office. Общедоступность схем дает разработчикам возможность воспользоваться преимуществами нового формата на базе XML для создания документов на лету. SpreadsheetML – это схема XML, которая используется в Microsoft Excel 2003.
С версии Microsoft Office 2007 используется формат файлов Office Open XML (OOXML). В отличие от более ранних схем, в которых форматы XML хранились в виде отдельных монолитных XML-файлов, OOXML хранит данные и метаданные в многокомпонентном архиве. Стандарт OOXML обеспечивает повышенную надежность, эффективность и безопасность.
По сравнению с технологиями OLE и DOI обработка на базе XML имеет ряд преимуществ:
- обработку можно выполнять с использованием фоновых рабочих процессов;
- можно оптимизировать производительность обработки;
- можно реализовать простой процесс вложения созданных файлов в сообщения электронной почты;
- доступны опции расширенного форматирования.
Далее рассматриваются некоторые технологии создания XML, подходящие для применения в Microsoft Excel.
iXML
Библиотека iXML предлагает три базовых сервиса:
- Синтаксический анализатор XML использует XML-документ в качестве ввода и создает в оперативной памяти его представление после проверки правильности синтаксиса. Для получения доступа к представлению используются модули обработки Simple API for XML (SAX) и Document Object Model (DOM).
- Реализация XML DOM обеспечивает представление структуры и содержимого XML-документа посредством классов и интерфейсов. Программист получает возможность манипулирования элементами, атрибутами и текстовыми данными.
- Рендерер XML записывает представление XML-документа в оперативной памяти в поток байтов.
Библиотека iXML реализована на C++ и выполняется в ABAP-ядре. Доступ к библиотеке iXML можно получить из версии SAP-базиса 4.6C. Для этой библиотеки определена оболочка, которая реализована в виде ряда классов и интерфейсов ABAP-объектов, что позволяет вызывать эту библиотеку напрямую из ABAP-программы.
Язык XSLT
Язык преобразования стилей XSLT (Extensible Stylesheet Language Transformations) позволяет преобразовать данные исходного объекта в данные целевого объекта, используя заданную таблицу стилей. Объектами данных могут быть XML-документ или структура данных ABAP. Для создания преобразования сначала в виде объекта репозитария создается программа, реализующая обработку XSLT. Далее она вместе с исходным объектом данных используется в качестве ввода для обработчика XSLT, который, в свою очередь, генерирует целевой объект данных. Для запуска программ XSLT в среде ABAP используется оператор преобразования вызовов.
Simple Transformation
Simple Transformation (ST) – собственный язык SAP, предназначенный для упрощения преобразования данных между ABAP и XML. Применяемый подход концептуально аналогичен методике работы с XSLT. Однако ST просто преобразует объекты данных ABAP в XML (и наоборот). Программы на ST являются симметричными: в одной программе закодированы инструкции по сериализации и десериализации. Оператор преобразования вызовов является универсальным и может использоваться для выполнения программ ST (как и программ XSLT).
ABAP2XLSX
ABAP2XLSX – это проект сообщества, который предлагает упрощенную объектно-ориентированную архитектуру для создания документов OOXML напрямую из ABAP. В отличие от предыдущих технологий, которые предоставляют общие возможности обработки XML, ABAP2XLSX ориентирован именно на работу с документами Microsoft Excel. По сути, этот инструмент обеспечивает уровень абстракции, который скрывает подробные данные, обрабатываемые с использованием библиотек нижних уровней. Абстракция упрощает работу с функциями, связанными с электронными таблицами, и снимает проблему внешнего вида рабочих книг XML. Доступны расширенные функции: формулы, множественные листы, условное форматирование, формат ячеек данных и графики.
В пакет распределения для ABAP2XLSX входит набор демонстрационных программ. По коду в этой программе видно, насколько просто создать новую рабочую книгу, определить ее заголовок и затем заполнить ячейки.
На этом обзор опций экспорта данных в формат Excel завершен. Ниже описано создание файла SpreadsheetML расширенным классом вывода данных внутренней таблицы с помощью библиотеки iXML. Формат SpreadsheetML предоставляет многие возможности, доступные в формате OOXML, но предлагает компромисс для упрощения обработки (создается только один файл). С помощью библиотеки iXML можно динамически создавать требуемые XML-элементы из информации, которая становится известной только во время выполнения.
перед тем, как подробно рассказать о реализации, сначала я представлю демонстрационную программу.
Демонстрационная программа для расширенного самоанализа таблиц
Я изменил простую демонстрационную программу, использованную в предыдущей статье, чтобы показать расширенные возможности нового класса вывода данных таблиц. Как и раньше, данные для заполнения внутренней таблицы во время выполнения относятся к универсальной модели данных авиарейсов, которая часто используется в примерах от SAP. Однако поскольку в модели не хранятся подробные тексты, необходимые для демонстрации расширенных возможностей класса, требуется немного дополнить модель.
Основная идея заключается в сохранении обзорного описания каждой авиакомпании в модели. Для этого необходимо создать пользовательский текстовый объект и идентификатор текста. После этого следует загрузить собственно текстовые строки. Перед запуском демонстрационной программы изучите ознакомительный файл описания (Readme) для расширенной утилиты самоанализа таблиц, в котором содержатся инструкции по ее настройке.
Обратите внимание на то, что по сравнению с предыдущей версией демонстрационной программы на экране выбора доступны опции, связанные с новыми функциями, которые предлагает формат SpreadsheetML (Рис. 1). На экране выбора отображаются доступные опции для указания автора документа и имени листа. Кроме того, опция заморозки заголовка позволяет пользователю запросить отображение строки заголовка во время прокрутки остальных разделов листа.
Рис. 1
Экран выбора демонстрационной программы
Основной метод, показанный на Рис. 2, отличается от исходной демонстрационной программы. Несмотря на то, что применяется аналогичная базовая конструкция, требуются изменения в трех основных областях. Во-первых, подробные данные рейсов, извлеченные из базы данных, требуется дополнить подробным текстом, описывающим каждую авиакомпанию. Во-вторых, теперь необходимо передать в стандартный метод другой набор опций для инициализации объекта реализующего класс и получения преимуществ формата SpreadsheetML. В-третьих, необходимо вызвать новый метод-получатель для возврата представления SpreadsheetML для последующего представления данных.
Рис. 2
Демонстрационная программа
Эти изменения более подробно рассматриваются ниже. После создания инстанции локального класса вызовите следующие методы.
1. Первым вызывается метод load_data, который, как и раньше, вызывает функцию BAPI bapi_flight_getlist для заполнения требуемой внутренней таблицы (Рис. 3). Кроме того, данные списка рейсов, возвращенные из функции BAPI, дополняются подробными текстами. Ключ текста создается с использованием объекта текста, идентификатора текста, языка и идентификатора авиакомпании. Этот ключ итерационно передается в метод read_text для возврата строк текста по каждой авиакомпании. Внутренняя таблица сохраняется в виде атрибута инстанции в локальном классе.
Рис. 3
Заполнение внутренней таблицы данными списка рейсов (с текстовыми строками)
2. Второй метод отвечает за инициализацию класса по работе с данными таблицы с использованием соответствующего стандартного метода. Помимо передаваемых в этот метод данных рейсов предоставляются также специфичные для пользователей опции форматирования. Некоторые новые опции связаны с форматированием и важны только при работе с форматом SpreadsheetML. Три из таких опций уже были представлены на экране выбора в демонстрационной программе (см. Рис. 1): "Author" (Автор), "Sheet Name" (Имя листа) и "Freeze Header Line" (Зафиксировать строку заголовка). Эти опции относятся к параметрам стандартного метода im_author, im_sheet_name и im_freeze_header соответственно.
Помимо этих опций существует еще три полезных для программиста опции на нижнем уровне. Параметр im_header_color устанавливает цвет строки заголовка в соответствии с перечислимой константой. Параметр im_string_cell_width устанавливает ширину символа для ячейки строки. Параметр im_points_factor устанавливает число точек на отображаемый символ.
После завершения работы метода класса объект обработки таблицы возвращается и сохраняется в качестве атрибута инстанции локального класса. Подробно это можно представить в виде кода, показанного на Рис. 4.
Рис. 4
Вызов класса вывода данных внутренних таблиц
3. Третий вызов метода относится к методу выгрузки. К этому этапу выполнения программы уже проделана большая работа по анализу прочитанных данных, и теперь требуется только вызвать соответствующий метод-получатель. В данном случае требуется выгрузить файл на диск с использованием формата SpreadsheetML. Просто вызовите метод-получатель get_xml_rendition. Таблица, возвращаемая после этого вызова, подходит для немедленной передачи в стандартный метод cl_gui_frontend_services=>gui_download (Рис. 5).
Если хотите прочитать статью полностью и оставить свои комментарии присоединяйтесь к sapland
ЗарегистрироватьсяУ вас уже есть учетная запись?
Войти
Обсуждения 7
Комментарий от
Валерий Заузолков
| 14 мая 2015, 11:19
Комментарий от
Олег Башкатов
| 14 мая 2015, 14:44
Валерий Заузолков 14 мая 2015, 11:19
В качестве дополнения: XLSX Workbench (sites.google.com/site/sapxlwb) мне представляется более удачным чем ABAP2XLSX.
Комментарий от
Игорь Бородин
| 23 июня 2015, 15:18
Олег Башкатов 14 мая 2015, 14:44
XLSX Workbench может делать файлы только XLSX или книгу с поддержкой макросов (xlsm) тоже может? не знаете?
Комментарий от
Олег Башкатов
| 23 июня 2015, 18:19
Игорь Бородин 23 июня 2015, 15:18
Нет, макросы принципиально не поддерживаются, т.к. процесс формирования книги проходит без использования приложения MS Excel.
но и дальнейшего использования.
Комментарий от
Игорь Бородин
| 23 июня 2015, 21:32
Олег Башкатов 23 июня 2015, 18:19
Макросы могут использоваться не только для формирования :-)
но и дальнейшего использования.
Комментарий от
Игорь Бородин
| 29 мая 2017, 20:01
Олег Башкатов 23 июня 2015, 18:19
Макросы могут использоваться не только для формирования :-)
но и дальнейшего использования.
Комментарий от
Игорь Бородин
| 29 мая 2017, 20:03
Игорь Бородин 29 мая 2017, 20:01
В новой версии XLSX Workbench VBA-макросы поддерживаются. Вместо XLSX будет формат XLSM. Подробности здесь: sites.google.com/site/sapxlwb