Как выгрузить xml файл sap

Обновлено: 05.07.2024

Цель абстракции не быть расплывчатой, а создать новый семантический уровень, который будет совершенно прозрачным.

Новое

  • Получение инстанции cl_gui_alv_grid для SALV 11.09.2021
  • Introduction to ABAP in the Cloud 18.08.2021
  • Getting Started with FPM BOPF Integration 01.06.2021
  • 30. How to Use Authority Checks in Business Object Processing Framework 29.05.2021
  • 29. BOPF Extensibility 29.05.2021
  • 28. BOPF Enterprise Procurement Model (EPM) 29.05.2021
  • 27. BOPF Integration 29.05.2021
  • 26. BOPF Business Configuration Objects 29.05.2021
  • 25. BOPF Performance 29.05.2021
  • 24. BOPF Supportability 29.05.2021

Последние комментарии

Дмитрий 16.11.2021 в 00:39 на Введение в Debugger Scripting Делаю скрипт + точку прерывания на строку в коде Записываю данные к-е есть в этом месте программы в журнал для SAS Запускаю и скрипт и у меня каждый раз заходит в точку прерывания Как сделать чтобы скрипт отработал и записал данные в журнал - не проваливаясь каждый раз в отладчик Дмитрий 12.11.2021 в 14:07 на Secure store and forward Добрый день! подскажите, можно ли используя SSF выполнять подписание с помощью внешнего крипто провайдера, расположенного на отдельном сервере? при этом закрытая часть у пользователя на флешке, а сертификат может быть установлен предварительно на сервер. Спасибо! Николай 27.10.2021 в 15:19 на Внутренние таблицы как источник в SQL запросах Спасибо за статью. Если нужно сделать агрегацию внутренней таблицы то агрегация через передачу во временную таблицу на БД тоже будет работать медленней чем через loop/collect? Например таблица 100к записей, которая становится 5к после агрегации. Аноним 14.10.2021 в 13:50 на Декоратор (Decorator, Wrapper) Так поведение Decorator не надо будет повторно описывать повторно в других Component. Но это возможно при изменении типа mo_component, например, на object.

Задача: результат работы стандартного отчёта необходимо выгрузить в XML файл, с применением определенных правил построения XML (заданной схемой).


Выгрузив файл через стандартный шаблон в Excel, мы получим лишь электронную таблицу без возможности выгрузки в нужном нам XML формате.

Для того чтобы иметь возможность сохранить в нужном формате, необходимо использовать возможности Excel по выгрузке XML, а именно XML карты. В excel карты выглядят примерно следующим образом:


Открыть этот инструмент можно через панель – разработчик. Карта представляет собой структуру XML файла, элементы карты можно присваивать полям Excel документа. Предположим, что нам необходимо на выходе получать следующий формат:

Поговорим о выгрузке данных из SAP ERP или S/4 HANA с использованием механизма SAP RFC.

Такая выгрузка может служить для наполнения аналитического хранилища данных или для интеграции с другой системой.

Интерфейс SAP RFC (remote function call) позволяет вызывать различные функции SAP из стороннего приложения.

Преимущества этого интерфейса:

прямое и быстрое подключение с SAP.

возможность менять параметры запроса, запрашивая данные частями.

отсутствие промежуточных звеньев в обмене данными и, как следствие, высокая надежность.

Установка

Для работы через RFC вам потребуется установить следующее:

Установить переменную окружения, указав каталог с библиотекой SAP NW RFC: SAPNWRFC_HOME=C:\NWRFC\nwrfcsdk\

Поиск уже имеющихся в системе функций

В системе SAP можно поискать уже готовые функциональные модули.

Сделать это можно следующим образом:

Запустить транзакцию SE16 (просмотр таблиц).

Указать имя таблицы TFDIR.

Задать фильтры для поиска:

FUNCNAME=*MATERIAL* (задать маску поиска)

FMODE=R (возможность вызова функции через механизм RFC)

Чтение таблиц через RFC_READ_TABLE

RFC_READ_TABLE позволяет выгружать данные из таблицы SAP, ограничивая выборку фильтрами.

Несмотря на то, что SAP позиционирует эту функцию как тестовую и не предназначенную для использования в продуктивной среде, она вполне работоспособна.

Следует сказать, что RFC_READ_TABLE часто неудобна, т.к. она позволяет читать только одну таблицу (не поддерживает JOIN).

В этой статье я не буду подробно описывать работу с этой функцией, т.к. в интернете существует множество примеров ее использования. Вместо этого приведу пример вызова функции стандартной функции BAPI_MATERIAL_GETLIST, выдающий список материалов по заданным критериям поиска.

Просмотр функции через SE37

Параметры вызова функции присутствуют на следующих вкладках:

Importing - входные параметры простого типа (не табличные)

Exporting - выходные параметры простого типа

Tables - как входные, так и выходные параметры в виде таблиц

Рассмотрим использование SE37 на примере BAPI_MATERIAL_GETLIST.

Для того, чтобы посмотреть состав полей таблиц нужно дважды кликнуть на поле с типом данных.

SE37 - вкладка Tables Просмотр полей таблицы

Эта функция выдает не слишком много полезных данных: Номер материала и описание.

Другие таблицы нужны для передачи на вход параметров выборки.

Например поиск по коду материала (MATNRSELECTION):

Таблица входных значений

Подключаемся к SAP

Подключение к SAP с использованием библиотеки pyrfc делается не сложно. (Настройки подключения можно посмотреть в SAP GUI.)

import pandas as pd

conn = pyrfc.Connection(user='', passwd='',

mshost='111.111.11.11', msserv='3600', sysid='010',

group='NN', saprouter='', lang='EN',client='')

Вызываем необходимую функцию

Рассмотрим вызов функции на примере BAPI_MATERIAL_GETLIST.

Сначала зададим входные параметры.

В данном случае для каждого параметра в таблице будет по одной строке.

Строка таблицы задается как python dictionary, а вся таблица задается как list, состоящий из строк.

В нашем примере укажем фильтр на код материала: '' (т.е. все значения), а также укажем значение для Plant.

Для выборки используем SIGN="I" (Includes),

Варианты для OPTION:

BT Between (требует задать значение для для LOW и HIGH)

GE Greater Equal

CP Contains Pattern

Далее вызываем функцию с этими параметрами.

MATNRSELECTION = matnrselection, PLANTSELECTION = plantselection)

Преобразуем результат в DataFrame

DataFrame можно получить в одну строку:

Где MATNRLIST, это имя результирующей таблицы, указанное в разделе Tables.

Итак, с помощью буквально нескольких строк кода, мы получили данные из SAP в DataFrame и можем дальше работать с этими данным используя все возможности языка Python.

В данной статье описывается создание pdf документов на основании XML схемы. Статья предназначена для тех, кто уже знаком с технологией формирования pdf документов средствами ABAP, так и для новичков.

В данной статье описывается создание pdf документов на основании XML схемы. Статья предназначена для тех, кто уже знаком с технологией формирования pdf документов средствами ABAP, так и для новичков. В SAP предоставлен инструмент для создания таких документов – транзакция «sfp». Транзакция представляет собой ABAP программу, которая «общается» с десктопным приложением «Adobe LiveCycle Designer» посредством OLE. Поэтому для создания pdf формуляров необходимо установить данную программу на PC. Соответствующий файл для инсталляции можно скачать с SAP Service Marketplace.

«Adobe LiveCycle Designer» (далее «LiveCycle») – программа, предоставляемая компанией Adobe, для создания pdf документов, использующая различные интерфейсы (XML схема, простой XML файл, модель данных Adobe, WSDL файл, OLEDB) описания данных для наполнения шаблона pdf файла.

При разработке сложных формуляров рекомендуется напрямую использовать программу. Путь к исполняемому файлу «C:\Program Files (x86)\Adobe\Designer «Version»\ FormDesigner.exe». (Рис.1.) В этой статье версия программы «Version 10.4.0».


Рис. 1 Вид «Adobe LiveCycle Designer» при запуске исполняемого файла .exe

Основным преимуществом использования исполняемого файла программы является увеличение скорости разработки за счет отсутствия активации формуляра. При активации происходит перенос формуляра из программы на PC в SAP и проверка безопасности SAP GUI (например, доступ к файлам, необходимым программе - рис. 2).


Рис. 2 Безопасность SAP GUI при правке pdf формуляра в транзакции «sfp»

При этом установка флага «Запомнить мое решение» не помогает скрыть периодическое отображение диалогового окна. Проверку безопасности можно отключить («Настр. локал. формата(Alt+F12)» - «Опции…» - «Безопасность» - «Настройки безопасности» - «Статус: Деактивировано»), а вот скорость переноса формуляра из программы в SAP увеличить нельзя (OLE никогда не был быстрым). Поэтому в данной статье рассматривается создание формуляра через исполняемый файл программы «LiveCycle» на PC.

В случае создания pdf формуляра через транзакцию «sfp» необходимо указать интерфейс данных и создать сам шаблон разметки расположения данных. Интерфейс может быть представлен как:

  • Интерфейс на основе ABAP-словаря;
  • Интерфейс на основе схемы XML;
  • Совместимый со смарт-формуляра интерфейс.

Например, при использовании интерфейса на основе ABAP-словаря, весь интерфейс будет переконвертирован внутри SAP из данных ABAP-словаря в XML схему с использованием библиотеки iXML. То есть, в конечном итоге любой интерфейс данных в SAP представляет собой XML схему, так как программа «LiveCycle» поддерживает такой тип интерфейса. Локальные таблицы с данными также будут переконвертированы в XML.

В этом разделе далее рассмотрен пример выгрузки стандартного тестового формуляра «FP_TEST_03» (программа «FP_TEST_03») и запуск его в «LiveCycle» на PC.

Данные в конечном итоге представляют собой XML файл. Сам формуляр состоит из интерфейса и формата разметки шаблона формуляра. Расширение файла формуляра «.XDP», интерфейса – «.XSD». В транзакции «sfp» можно загрузить/выгрузить интерфейс и шаблон формуляра (рис. 3). Для выгрузки интерфейса необходимо выбрать «Выгрузить схему данных». Откроется диалог с выбором директории сохранения файла с расширением «.XSD». Для выгрузки/загрузки шаблона разметки данных формуляра необходимо выбрать «Выгрузить/Загрузить формат», расширение «.XDP» (Рис.3.).


Рис. 3 Выгрузка интерфейса и формуляра

Для загрузки интерфейса на основе «.XSD» файла необходимо перейти в интерфейс, на вкладке «Свойства» указать тип интерфейса как «Интерфейс на основе схемы XML», XML-схема – источник – «Файл», Файл – путь к файлу «.XSD».

Выгруженные файлы можно открыть в программе «LiveCycle».

Открытие формуляра (Рис.4.):


Рис. 4 Вид и иерархия формуляра

Открытие интерфейса данных:

  • Для нового интерфейса: «File» - «New Data Connection…» - Выбор одного из типов интерфейса
  • Для импортированного формуляра: «Window» («Palettes») - «Data View» - Клик правой кнопкой мыши по родительскому узлу интерфейса данных - «Connection Properties…» - «Далее» - Выбор «.XSD» файла интерфейса – «Готово» (рис. 5).


Рис. 5 Открытие интерфейса данных в программе «LiveCycle»

Для просмотра конечного pdf файла необходим XML файл с данными. Также необходимо установить программу «Adobe Acrobat Reader», после установки которой появится дополнительная вкладка «Preview PDF». (Рис.6.) В статье используется версия 17.3072.


Рис. 6 Дополнительная вкладка «Preview PDF»

Управление отображением вкладок можно осуществить через клик правой клавиши на панели вкладок и проставить/убрать галку у требуемой вкладки.

Данные можно получить с помощью генерации тестовых данных в «LiveCycle» (кнопка «Generate Preview Data…» на рис. 9), либо взять из SAP (при условии существования реализации вывода pdf файла). Для этого нужно:

1. Выбрать «очень подробная трассировка» («Утилиты» - «Параметры настройки…») на первом экране редактора формуляров (транзакция «sfp») (рис. 7).


Рис. 7 Подробная трассировка pdf

2. Вывести pdf файл на просмотр. Выбрать файл с данными «XFD.xml» (рис. 8). Для включения панели «Вложенные файлы» нужно кликнуть в любом месте pdf файла правой кнопкой и нажать «Показать кнопки области навигации».


Рис. 8 XML файл с данными из SAP

Также данный XML файл можно выгрузить из отладки. Для этого необходимо поставить точку прерывания после вызова динамического ФМа, который генерируется для формуляра, и выгрузить данные из поля «XML» структуры «/1BCDWB/FORMOUTPUT» как двоичные (например, вызов ФМа «lv_fm_name» из листинга 6).

XML файл с данными необходимо подать на вход программе: «File» - «Form Properties…» - «Preview» - «Data File» - путь к XML файлу с данными (рис. 9).


Рис. 9 Добавление данных для «Preview PDF»

При нажатии «Preview PDF» отобразится конечный файл pdf с данными (Рис.10.):


Рис. 10 Конечный pdf файл

Для определенного вида задач удобнее использовать интерфейс формуляра на основании XML схемы, чем на основе ABAP-словаря. Например, при работе с данными в формате XML (например, возвращаемыми веб-сервисами) или формировании динамических таблиц, когда количество столбцов заранее неизвестно.

Далее рассмотрен пример по отображение курсов валют ЦБ РФ в таблице pdf файла. В зависимости от выбранных валют динамически формируется таблица с данными.

Схема данных представляет собой «.XSD» файл (XML Schema Definition – язык описания структуры XML документа).


Рис. 11 Котировки валют на заданный день

На основе данного XML файла можно сформировать схему данных без обработки (парсинга и создания нового файла) XML. Но для упрощения понимания формирования pdf на основании XML схемы, упростим модель данных до вида:


где «TABLE» – отдельная таблица, «ROW» – отдельная строка данной таблицы, «VALUE» - множественный набор значений (динамические столбцы). Первая запись c тегом «ROW» будет являться заголовком таблицы, последующие записи – телом таблицы. Например, вид таблицы для данной модели из трех строк и шести столбцов в формате XML (Рис.12.):


Рис. 12 Таблица с данными в формате XML (3 строки, 6 столбцов)

Для данной модели данных схема имеет вид (Листинг 1, Листинг 2):

<?xml version="1.0" encoding="UTF-8"?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">

<xs:element name="DOCUMENT">

<xs:element name="TABLE" minOccurs="0" maxOccurs="unbounded">

<xs:element name="ROW" minOccurs="0" maxOccurs="unbounded">

<xs:element ref="VALUE" minOccurs="0" maxOccurs="unbounded" />

<xs:element name="VALUE" type="xs:string" />

Листинг. 1 XML схема данных в виде дерева

Также схему можно представить через отдельно стоящий узел, ссылающий на другие нижестоящие:

<?xml version="1.0" encoding="UTF-8"?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">

<xs:element name="DOCUMENT">

<xs:element ref="TABLE" minOccurs="0" maxOccurs="unbounded" />

<xs:element name="TABLE">

<xs:element ref="ROW" minOccurs="0" maxOccurs="unbounded" />

<xs:element name="ROW">

<xs:element ref="VALUE" minOccurs="0" maxOccurs="unbounded" />

<xs:element name="VALUE" type="xs:string" />

Листинг. 2 XML схема данных в виде отдельных узлов, соединенных через ссылки

На основе модели и схемы данных, необходимо сформировать XML файл с данными как на рис. 12, используя данные рис. 11.


Для этого получаем данные котировок валют из ЦБ РФ на заданный период (Листинг 3):

TABLES: tcurr.

TYPES: BEGIN OF ts_table,

date TYPE char10,

char_code TYPE string,

nominal TYPE string,

curr_name TYPE string,

curr_value TYPE string,

END OF ts_table,

tt_table TYPE TABLE OF ts_table.

gv_xxml TYPE xstring,

gv_full_xml TYPE string,

gv_url TYPE string,

gv_rfcoptions TYPE rfcdes-rfcoptions,

gv_date TYPE dats,

gv_url_date TYPE string,

gv_code TYPE sy-subrc,

gt_table TYPE tt_table,

gv_xml TYPE xstring.

PARAMETERS: p_url TYPE flag DEFAULT 'X',

p_date TYPE dats DEFAULT sy-datum,

p_days TYPE i DEFAULT 7.

SELECT-OPTIONS: s_curr FOR tcurr-fcurr.

IF p_url = 'X'.

EXPORTING

url = gv_url

IMPORTING

client = go_client

EXCEPTIONS

OTHERS = 99

ELSE.

EXPORTING

IMPORTING

client = go_client

EXCEPTIONS

OTHERS = 99

ENDIF.

CHECK go_client IS BOUND.

gv_date = p_date.

DO p_days TIMES.

CLEAR gv_xxml.

CONCATENATE gv_url '?date_req= ' gv_date+6(2) '/' gv_date+4(2) '/' gv_date(4) INTO gv_url_date.

gv_date = gv_date + 1.

go_client->request->set_content_type( 'text/xml' ).

go_client->request->set_header_field(

EXPORTING

name = '

value = 'GET'

go_client->send( EXCEPTIONS OTHERS = 99 ).

CHECK sy-subrc = 0.

go_client->receive( EXCEPTIONS OTHERS = 99 ).

CHECK sy-subrc = 0.

go_client->response->get_status( IMPORTING code = gv_code ).

IF gv_code = 200.

gv_xxml = go_client->response->get_data( ).

PERFORM parse_xml USING gv_xxml

CHANGING gt_table.

ENDIF.

go_client->close( ).

ENDDO.

PERFORM create_xml USING gt_table

CHANGING gv_xml.

PERFORM create_pdf USING gv_xml.

Листинг. 3 Получение данных котировок валют из ЦБ РФ

Парсим данные в таблицу gt_table (Листинг 4):

FORM parse_xml USING pv_xxml TYPE xstring

pv_date TYPE dats

CHANGING ct_table TYPE tt_table.

DATA: lo_ixml TYPE REF TO if_ixml,

lo_streamfactory TYPE REF TO if_ixml_stream_factory,

lo_parser TYPE REF TO if_ixml_parser,

lo_istream TYPE REF TO if_ixml_istream,

lo_document TYPE REF TO if_ixml_document,

lo_filter TYPE REF TO if_ixml_node_filter,

lo_node TYPE REF TO if_ixml_node,

lo_item TYPE REF TO if_ixml_node,

lv_name TYPE string,

lv_value TYPE string,

lo_iterator TYPE REF TO if_ixml_node_iterator,

lo_iterator_child TYPE REF TO if_ixml_node_iterator,

lv_sxml TYPE string,

lo_nodes TYPE REF TO if_ixml_node_list,

ls_table TYPE ts_table,

lv_date TYPE dats.

lv_date = pv_date - 1.

lo_ixml = cl_ixml=>create( ).

lo_streamfactory = lo_ixml->create_stream_factory( ).

lo_istream = lo_streamfactory->create_istream_xstring( string = pv_xxml ).

lo_document = lo_ixml->create_document( ).

lo_parser = lo_ixml->create_parser(

stream_factory = lo_streamfactory

istream = lo_istream

document = lo_document ).

lo_parser->parse( ).

IF lo_parser->is_dom_generating( ) EQ 'X'.

lo_node ?= lo_document.

CHECK lo_node IS NOT INITIAL.

lo_filter = lo_document->create_filter_name( name = 'Valute' ).

lo_iterator = lo_node->create_iterator_filtered( lo_filter ).

lo_node = lo_iterator->get_next( ).

WHILE lo_node IS NOT INITIAL.

lo_nodes = lo_node->get_children( ).

lo_iterator_child = lo_nodes->create_iterator( ).

Пользователю должно быть удобно и понятно.

CALL METHOD cl_gui_frontend_services = > file_save_dialog file_filter = zcl_excel_common = > c_xlsx_file_filter CHECK lv_user_action NE cl_gui_frontend_services = > action_cancel .

А имя файла можно задать понятное до деталей:

Это совсем не сложно, не стоит этого бояться.

Во-вторых, полномочия на стороне пользователя.

В моём случае show_document встречает две проверки:

А) Проверка на выгрузку файла в папку:

Word security 1

Б) Проверка на открытие файла:

Word security 2

Если метод cl_gui_frontend_services=>show_document заставляет SAP GUI искать программу, ассоциированную с данным типом файлов, то метод cl_gui_frontend_services=>execute работает хитрее. Он просто предоставляет операционной системе самой разобраться что к чему.

Вот такой маленький proof-of-concept:

DATA : lv _ template TYPE string VALUE 'ZR_CA001.DOCX' .

Метод SHOW реализован отдельно:

CALL METHOD cl _ bcs _ convert = > xstring _ to _ xtab cl _ gui _ frontend _ services = > get_temp_directory ( temp _ dir = lv _ temp _ dir "D:\Users\<username>\AppData\Local\SAP\SAP GUI\tmp "D:\Users\<username>\AppData\Local\SAP\SAP GUI\tmp\Order AA 123 15.06.2018 Ivanov Ivan.docx cl _ gui _ frontend _ services = > execute ( EXPORTING document = lv _ fullname ) . "access_denied = файл уже открыт в приложении, дописываем счетчик пока не достигнем успеха "D:\Users\<username>\AppData\Local\SAP\SAP GUI\tmp\Order AA 123 15.06.2018 Ivanov Ivan (2).docx

PS. И это не конец истории. Не забыть бы про мусор во временной папке, а то мало ли что.

Метод SHOW_DOCUMENT выгружает файл во вторую папку и там есть параметр KEEP_FILE. Очевидно тогда, что если флаг специально не выставить, то файл будет подчищен автоматически; вопрос только в какой момент.

В нашем новом методе EXECUTE данный параметр отсутствует. Что это значит? Интересно, чистит ли папку кто-нибудь и когда-нибудь?

Documents in the temporary directory will be deleted, when SAP GUI is closed. You can configure the deletion of files also in other directories. For information on this, refer to the security guide.

Читайте также: