Выгрузка в word abap

Время на прочтение
5 мин

Количество просмотров 1.4K

Привет, Хабр! Меня зовут Дарья Чувашова, я — руководитель группы отделения SAP-разработки. В процессе моей проектной деятельности мне приходилось сталкиваться с задачами выгрузки документов в .doc формат и делать это нужно было быстро. При этом эти документы могли быть с совершенно разным форматированием, кучей таблиц, реквизитов и т. д. В SAP для выгрузки в форматы pdf и excel есть удобные инструменты, возможность работать с формулярами и графическими редакторами форм. Для работы с форматом.doc инструментов меньше. В этой статье я расскажу о быстром и самом простом способе выгрузить документ любой сложности.

Почему я решила написать этот «how‑to»? Как я упомянула, задачи по выгрузке файлов в.doc мне приходилось выполнять часто. В какой‑то момент я собрала все лайфхаки и советы по ускорению работы в один материал, а сейчас хочу поделиться им с хабровской аудиторией. Надеюсь, для коллег записи будут полезными. Описанный вариант решения имеет свои особенности, поэтому я постараюсь на примерах продемонстрировать некоторые «узкие» моменты.

Пошаговая инструкция решения вопроса

Шаг 1

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

В качестве примера рассмотрим вот такой документ «Счёт‑фактура» в MS Word:

Этот и другие используемые здесь примеры были взяты из открытого источника: https://glavkniga.ru/situations/k505106

Этот и другие используемые здесь примеры были взяты из открытого источника: https://glavkniga.ru/situations/k505106

Шаблон необходимо заполнить тестовыми примерами, чтобы проверить, что при заполнении ничего не съезжает, и все реквизиты остаются на месте:

Шаг 2

Сохраним наш документ в формате XML: Файл — Сохранить как. Выбираем расширение .xml

Примечание: для большинства задач вполне достаточно формата.doc, он поддерживает ограничения редактирования, элементы управления и т. п.

Для того чтобы открыть данный файл, мне удобно использовать программу Altova XML Spy. Скорее всего нам потребуется проанализировать содержимое, а в данной программе выполнять анализ файла очень удобно за счёт подсветки синтаксиса. Вы, конечно, можете использовать любой другой редактор.

Открываем свой XML, видим примерно такую картину:

После применения команды PrettyPrinter:

Шаг 3

Переходим в SAP. В своём пакете разработки создадим Преобразование:

Выберем трансформацию XSLT:

Видим следующую картину:

Для того, чтобы наша трансформация верно работала, необходимо указать следующий код между тегами <xsl:template match=»/»> </xsl:template>:

<xsl:processing-instruction name="mso-application" progid="Word.Document">
      <xsl:text progid="Word.Document"/>
  </xsl:processing-instruction>

Теперь можно смело вставить весь XML‑код ниже из нашего документа:

Визуально просматриваю данный XML‑код, обнаруживаю, что часть тегов подсвечивается, как текст:

Вижу, что это произошло из‑за кавычек в наименовании компании (Company), смело их удаляю:

Теперь пытаемся активировать трансформацию. В 90% случаях активация пройдёт успешно.

Но если у вас появятся подобные ошибки,

Предлагаю стереть данные коды, так как они не имеют никакого смысла для генерации документа из SAP.

Удаляем:

После удаления всех кодов трансформация успешно активируется.

Шаг 4

Переходим в программу. Для вызова трансформации и выгрузки файла привожу для примера такой код:

Данный код максимально облегчён для простоты восприятия и предельной наглядности.

После запуска программы в папке C:TEMP сохранится файл точно в таком же виде, как наш подготовленный шаблон:

При открытии файла может возникнуть следующая ошибка:

Для того, чтобы от неё избавиться, переходим в трансформацию и ищем /word/settings.xml

Избавиться от ошибки мне помогло удаление всего блока <pkg:part … </pkg:part>. Это не повлияло на работоспособность, и файл стал открываться нормально. Без подсветки синтаксиса тяжело искать закрывающий тег, поэтому имеет смысл снова воспользоваться программой Altova XML Spy (в данной программе вы можете удалить лишний код, а затем вставить новую версию в нашу трансформацию).

Удаляем и активируем, проверяем, что ошибка ушла и с файлом всё в порядке.

Шаг 5

Переходим к выгрузке данных из контекста. Начнём с самого простого: выгрузим данные в поле «Продавец»:

Контекст представляет собой структуру c данными, например, вот такую:

Её мы заполняем и подаём в трансформацию как контекст. Далее копируем из файла, заполненного в качестве примера, текст из реквизита «Продавец» и ищем это место в нашей XML:

Вместо данного текста вставляем:

Не забываем указать нужную структуру контекста и сделать выборку данных. Для примера прописываю хардкодом наименование продавца:

Результат трансформации:

Остальные реквизиты заполняем аналогично.

Как видим, заполненный на Шаге 1 пример нам помогает выполнять быструю навигацию по XML и искать нужные места для доработки.

Отдельную сложность может представлять собой заполнение табличных данных. В структуре контекста имеем вложенную таблицу с данными T_INVOICE. Для вывода данных используем цикл for each. Начнём с 1 строки 1 столбца. Ищем поиском пример «Яблоки» и вставляем код, приведённый чуть ниже.

Теги описания таблицы довольно понятны: <w:tc> </w:tc> — стоблец, <w:tr </w:tr> — соответственно строка, ну и сам текст <w:t> </w:t>.

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

Конец цикла будет обозначен тут:

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

Результат:

Видим, что строка автоматически добавилась. Так как нам не нужны старые данные из примера, удалим эти строки из таблицы. Ищем так же по тегам.

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

Если необходимо вывести данные из таблицы контекста не в каждой строке таблицы, а текстом с переносом, то можем воспользоваться тегом переноса строки <w:br/>, например,

Получим вот такой результат:

Ещё немного полезных рекомендаций

Мы разобрали основные шаги, как сделать выгрузку любого реквизита и заполнить таблицу. При этом необязательно думать о размере шрифта или форматировании, достаточно изначально выстроить необходимые настройки и правки в исходном документе.

Что ещё записано в моих заметках?

Как поменять шрифт быстро, если он перестал подходить? Допустим, мы желаем заменить Arial на Calibri. Для этого в трансформации выполняем поиск Arial — «Заменить все» и вставляем название нового шрифта Calibri.

Как сделать защиту листа и позволить редактировать лишь некоторые реквизиты в выгруженном файле?

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

Примеры исходного кода из статьи можно увидеть в репозитории github.

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

There are several ways to generate Microsoft Word docx documents using ABAP.

All of them have a number of disadvantages:

  • some require a lot of manual actions and saving structures in the ABAP dictionary
  • some require the Microsoft Office package installed on the user’s computer for their work

The advantage of my development:

  • requires a minimum of manual actions
  • works on the server side (does not require the presence of Microsoft Office)

If you know easier way to generate Microsoft Word docx documents – please, notify me.

Metrics for measuring the simplicity (lower is better):

  • mouse click: single click / double click / select = 2 points
  • keyboard type: one word / tab / enter = 1 point
  • switch application / alt + tab = 3 points
  • + cost of change (add 2 fields + remove 2 fields + rename 2 fields)

Source, readme: https://github.com/AntonSikidin/zcl_docx
Video (watch in 1080p):

Instruction and video complement each other.

Installation Install package via ABAPGIT https://docs.abapgit.org/guide-install.html

For example, the following document should be created:

At first toggle developer toolbar in Microsoft Word.
File -> Options -> Customize ribbon.

Go to developer tab, turn on “design mode”.

Select text that will be replaced.

Make tag.

Enter tag name.

Repeat for all variable.

For repeated rows or text fragment – select row or text fragment, make repeated control.

To enter properties of repeated control place cursor in the begin or end control.

Tag all variables and repeated part.

Save document. Go to transaction smw0 Select Binary data, enter.

Go to se38 Program ZDOCX_GET_TYPES.

Navigate to your template.

Run.

Program generate data types, based on your document structure.

Copy to your program.

Define variable.

Data
: gs_templ_data TYPE t_data
.

Fill structure with your data.

Then get document.

zcl_docx3=>get_document(
    iv_w3objid    = 'ZDOCX_EXAMLE' " name of our template, obligatory
*      iv_on_desktop = 'X'           " by default save document on desktop
*      iv_folder     = 'report'      " in folder by default 'report'
*      iv_path       = ''            " IF iv_path IS INITIAL  save on desctop or sap_tmp folder
*      iv_file_name  = 'report.docx' " file name by default
*      iv_no_execute = ''            " if filled -- just get document no run office
*      iv_protect    = ''            " if filled protect document from editing, but not protect from sequence
                                   " ctrl+a, ctrl+c, ctrl+n, ctrl+v, edit
    iv_data       = gs_templ_data  " root of our data, obligatory
*      iv_no_save    = ''            " just get binary data not save on disk
    ).

Whole program “ZDOCX_EXAMPLE”:

*&---------------------------------------------------------------------*
*& Report ZDOCX_EXAMPLE
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zdocx_example.

*describe types

TYPES
: begin of t_TABLE3
,       PERSON type string
,       SALARY type string
, end of t_TABLE3

, tt_TABLE3 type table of t_TABLE3 with empty key


, begin of t_T2
,       F1 type string
,       F2 type string
,       F3 type string
, end of t_T2

, tt_T2 type table of t_T2 with empty key


, begin of t_T1
,       H1 type string
, T2 type tt_T2
, end of t_T1

, tt_T1 type table of t_T1 with empty key


, begin of t_LINE1
,       FIELD1 type string
,       FIELD2 type string
,       FIELD3 type string
,       FIELD4 type string
, end of t_LINE1

, tt_LINE1 type table of t_LINE1 with empty key


, begin of t_TAB1
,       TITLE1 type string
, LINE1 type tt_LINE1
, end of t_TAB1

, tt_TAB1 type table of t_TAB1 with empty key


, begin of t_LINE2
,       FIELD1 type string
,       FIELD2 type string
,       FIELD3 type string
, end of t_LINE2

, tt_LINE2 type table of t_LINE2 with empty key


, begin of t_TAB2
,       TITLE2 type string
, LINE2 type tt_LINE2
, end of t_TAB2

, tt_TAB2 type table of t_TAB2 with empty key


, begin of t_data
,       SH01 type string
,       DATE type string
,       TIME type string
,       USER type string
, TABLE3 type tt_TABLE3
, T1 type tt_T1
, TAB1 type tt_TAB1
, TAB2 type tt_TAB2
, end of t_data

, tt_data type table of t_data with empty key


.



*some variable
DATA
      : gs_templ_data TYPE t_data
      , lv_index TYPE i
      , lv_index2 TYPE i
      , lv_index3 TYPE i
      .


*fill data

gs_templ_data-DATE = |{ sy-datum date = environment }|.
gs_templ_data-TIME = |{ sy-uzeit   TIME = ENVIRONMENT }|.
gs_templ_data-USER  = sy-uname.


*1.  Lurch Schpellchek: 1200 usd
*2.  Russell Sprout: 1300 usd
*3.  Fergus Douchebag: 3000 usd
*4.  Bartholomew Shoe: 100 usd

APPEND INITIAL LINE TO gs_templ_data-table3 ASSIGNING FIELD-SYMBOL(<ls_3>).
<ls_3>-person = 'Lurch Schpellchek'.
<ls_3>-salary = '1200'.

APPEND INITIAL LINE TO gs_templ_data-table3 ASSIGNING <ls_3>.
<ls_3>-person = 'Russell Sprout'.
<ls_3>-salary = '1300'.

APPEND INITIAL LINE TO gs_templ_data-table3 ASSIGNING <ls_3>.
<ls_3>-person = 'Fergus Douchebag'.
<ls_3>-salary = '3000'.

APPEND INITIAL LINE TO gs_templ_data-table3 ASSIGNING <ls_3>.
<ls_3>-person = 'Bartholomew Shoe'.
<ls_3>-salary = '100'.



gs_templ_data-sh01 = 'test aaa'.

DO 3 TIMES.
  lv_index = sy-index.

  APPEND INITIAL LINE TO gs_templ_data-tab1 ASSIGNING FIELD-SYMBOL(<ls_tab1>).
  <ls_tab1>-title1 = |table 1 subtable { lv_index }|.


  DO 3  TIMES.
    lv_index2 = sy-index.
    APPEND INITIAL LINE TO <ls_tab1>-line1 ASSIGNING FIELD-SYMBOL(<ls_line1>).

    DO 4 TIMES.
      lv_index3 = sy-index.

      ASSIGN COMPONENT lv_index3 OF STRUCTURE <ls_line1> TO FIELD-SYMBOL(<fs_any>).

      <fs_any> = |Line { lv_index2  } field { lv_index3 }|.

    ENDDO.


  ENDDO.


ENDDO.


DO 3 TIMES.
  lv_index = sy-index.

  APPEND INITIAL LINE TO gs_templ_data-tab2 ASSIGNING FIELD-SYMBOL(<ls_tab2>).
  <ls_tab2>-title2 = |Table 2 subtable { lv_index }|.


  DO 3  TIMES.
    lv_index2 = sy-index.
    APPEND INITIAL LINE TO <ls_tab2>-line2 ASSIGNING FIELD-SYMBOL(<ls_line2>).

    DO 3 TIMES.
      lv_index3 = sy-index.

      ASSIGN COMPONENT lv_index3 OF STRUCTURE <ls_line2> TO <fs_any>.

      <fs_any> = |Line { lv_index2  } field { lv_index3 }|.

    ENDDO.


  ENDDO.


ENDDO.

gs_templ_data = VALUE #( BASE gs_templ_data
  t1 = VALUE #(
    ( h1 = |1| t2 = VALUE #(
        ( f1 = 'F1' f2 = 'F2' f3 = 'f3' )
        ( f1 = 'F1' f2 = 'F2' f3 = 'f3' )
      )
    )
    ( h1 = |2| t2 = VALUE #(
        ( f1 = 'F1' f2 = 'F2' f3 = 'f3' )
        ( f1 = 'F1' f2 = 'F2' f3 = 'f3' )
        ( f1 = 'F1' f2 = 'F2' f3 = 'f3' )
      )
    )
    ( h1 = |3| t2 = VALUE #(
        ( f1 = 'F1' f2 = 'F2' f3 = 'f3' )
        ( f1 = 'F1' f2 = 'F2' f3 = 'f3' )
        ( f1 = 'F1' f2 = 'F2' f3 = 'f3' )
        ( f1 = 'F1' f2 = 'F2' f3 = 'f3' )
      )
    )
  )
).


*get document

DATA
       : lv_document TYPE xstring  " variable to hold generated document, can be omitted
       .

*first case:  send document as attachment

lv_document = zcl_docx3=>get_document(
    iv_w3objid    = 'ZDOCX_EXAMLE'
    iv_data       = gs_templ_data
    iv_no_save    = 'X'   ).

PERFORM send_document_as_attachment USING lv_document.



*second case: save on desctop and open document

zcl_docx3=>get_document(
    iv_w3objid    = 'ZDOCX_EXAMLE' " name of our template, obligatory
*      iv_on_desktop = 'X'           " by default save document on desktop
*      iv_folder     = 'report'      " in folder by default 'report'
*      iv_path       = ''            " IF iv_path IS INITIAL  save on desctop or sap_tmp folder
*      iv_file_name  = 'report.docx' " file name by default
*      iv_no_execute = ''            " if filled -- just get document no run office
*      iv_protect    = ''            " if filled protect document from editing, but not protect from sequence
                                   " ctrl+a, ctrl+c, ctrl+n, ctrl+v, edit
    iv_data       = gs_templ_data  " root of our data, obligatory
*      iv_no_save    = ''            " just get binary data not save on disk
    ).


FORM send_document_as_attachment USING iv_doc TYPE xstring.

*  implement sending here
  MESSAGE 'Doc sended' TYPE 'S'.
ENDFORM.

How to interpret n as a new line?

No way

If you want several line use Repeating section content control

insert field inside table control

and make something like

if you want all lines be in single line then make field inside field. Twise use

and make this

program

REPORT  z_multiline_test.


TYPES
: begin of t_TABLE1
,       FIELD1 type string
, end of t_TABLE1

, tt_TABLE1 type table of t_TABLE1 with default key

, begin of t_data
, TABLE1 type tt_TABLE1
, end of t_data

, tt_data type table of t_data with default key
.

DATA
      : gs_templ_data TYPE t_data
      .

FIELD-SYMBOLS
               : <fs_line> TYPE t_TABLE1
               .

APPEND INITIAL LINE TO gs_templ_data-TABLE1 ASSIGNING <fs_line>.
<fs_line>-FIELD1 = 'asd'.

APPEND INITIAL LINE TO gs_templ_data-TABLE1 ASSIGNING <fs_line>.
<fs_line>-FIELD1 = 'fffff'.

APPEND INITIAL LINE TO gs_templ_data-TABLE1 ASSIGNING <fs_line>.
<fs_line>-FIELD1 = 'hhhhh'.


zcl_docx3=>get_document(
    iv_w3objid    = 'ZDOCX_EXAMLE_LINE'   " name of our template
*      iv_template   = ''            " you can feed template as xstring instead of load from smw0
*      iv_on_desktop = 'X'           " by default save document on desktop
*      iv_folder     = 'report'      " in folder by default 'report'
*      iv_path       = ''            " IF iv_path IS INITIAL  save on desctop or sap_tmp folder
      iv_file_name  = 'multiline.docx' " file name by default
*      iv_no_execute = ''            " if filled -- just get document no run office
*      iv_protect    = ''            " if filled protect document from editing, but not protect from sequence
                                   " ctrl+a, ctrl+c, ctrl+n, ctrl+v, edit
    iv_data       = gs_templ_data  " root of our data, obligatory
*      iv_no_save    = ''            " just get binary data not save on disk
    ).

result

Conclusion:

  • Using this development in your daily work you will save your working time.
  • Freed up time you can spend on legacy code refactoring.
  • After reading this post you can think of a way to generate reports better than this.
  • Your boss will notice your progress.
  • You can ask for a bigger salary.
  • Your hair will become clean and silky.
  • Your dog will stop do bad things.
  • You can play the piano again even if you didn’t.
  • People will populate Mars and there will be apple orchards on Mars.

https://sapboard.ru/forum/viewtopic.php?f=13&t=4880

Вывод данных R/3 в шаблоны Word и Excel.

ZWWW303

Для создания программы с выгрузкой данных в шаблон, необходимо:

  1. Создать шаблон Word (Excel).

Шаблон имеет вид конечной формы (WYSIWYG — What You See Is What You Get).

Необходимо только пометить места вставки данных из R/3 при помощи закладки (например закладка «Дата», см. приложение 1) и (или) метки (уникального слова, фразы, например «[кто]», см. приложение 1).

Для подстановки многострочных данных  необходимо создать одну строку таблицы и присвоить всей строке имя закладки (переменной Excel), например «Строка» (см. приложение 1). В ячейках строки необходимо вписать уникальные метки, например [1], [2]… и т.д.

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

  1. Загрузить шаблон в R/3 при помощи стандартной транзакции SMW

— на 1-м экране выбрать «Двоичные данные для WebRFC-приложений»;

— на 2-м экране задать необходимый класс разработок ($TMP для локальной);

— на 3-м экране, используя меню «Создать», загрузить файл шаблона, как двоичный (BIN), присвоив «Имя объекта» и «Описание».

  1. Создать АБАП-программу, формирующую данные для подстановки в шаблон.

3.1 Данные необходимо поместить во внутреннюю таблицу, имеющую структуру типа ZWWW_VALUES, где:

VAR_NAME Имя закладки (переменной Excel), пусто для всего документа (активного листа Excel)
VAR_NUM Порядковый номер строки (только для табличной части)
FIND_TEXT Метка, уникальный текст для поиска/замены (пусто, для присвоения всей закладке)
VAL_TYPE Тип присваиваемого значения VALUE:

пусто — обычный текст;

 ‘V’ – (Variable) имя другой закладки (переменной Excel), которая скопируется в эту и потом удалится;

 ‘M’ – (Macros) имя макроса для обработки закладки  (переменной Excel). Макросу передается параметр типа Range, обозначающий текущую обрабатываемую закладку (Sub MyMacros(R as Range));

 ‘D’ – (Delete) удаление закладки (переменной Excel)

Следующие типы только для Excel:

R’ – (Row) строка целиком, с символом табуляции (09) для разделения полей (для ускорения выгрузки);

T’ – (Table) таблица целиком, с символом табуляции (09) для разделения полей и возвратом каретки (0D,0A) для разделения строк (для ускорения выгрузки);

VALUE Значение в соответствии с типом VAL_TYPE

Общая формула ее заполнения такова:

В пределах закладки VAR_NAME ищется метка FIND_TEXT и заменяется значением VALUE типа VAL_TYPE. Если поле закладки VAR_NAME не заполнено, поиск метки производится в пределах всего документа (листа Excel). Если поле метки FIND_TEXT не заполнено, производится замена всей закладки (переменной Excel);

— При заполнении табличной части, закладка VAR_NAME используется для обозначения всей строки таблицы, полю VAR_NUM  присваивается порядковый номер строки таблицы, а  метка FIND_TEXT для обозначения части строки (столбца, ячейки, части текста в ячейке).

К одной закладке (VAR_NAME) можно одновременно применить несколько значений (VALUE) разного типа (VAL_TYPE), например:

V’ – для изменения вида (стиля, шрифта, цвета…) закладки, затем пусто – для ее заполнения текстовым значением и M’ для ее последующей обработки макросом. Порядок исполнения типов именно такой и не зависит от порядка заполнения внутренней таблицы.

Типы M’ и V’ применяются только для всей закладки, поэтому поле  метки FIND_TEXT должно быть пустым.

  • Вызвать функциональный модуль ZWWW_OpenForm.

Модуль предназначен для выгрузки файла шаблона на рабочую станцию и заполнения его данными.

Обязательные параметры модуля:

FORM_NAME имя объекта, присвоенное шаблону в транзакции SMW0

Необязательные параметры модуля:

IT_VALUES Имя внутренней таблицы типа ZWWW_VALUES. Если не задано, то выгрузится незаполненный шаблон.
FILE_NAME Имя файла (включая путь), куда будет выгружен заполненный шаблон. Если не задан, то будет сгенерировано случайное уникальное имя в папке для временных файлов Windows.
PRINTDIALOG По умолчанию ‘X’. Будет показан диалог печати (выбор принтера и его параметров), при выходе из которого, после печати или отмены, заполненный шаблон будет закрыт и удален с диска.
OPTIMIZE По умолчанию 300. Используется для указания количества записей таблицы IT_VALUES, при превышении которого будет использован VBA-макрос для ускорения заполнения шаблона.
PROTECT Защита выходного документа от изменения.
  • При необходимости использовать функциональный модуль ZWWW_Prepare_Table.

Модуль предназначен для облегчения формирования табличной части шаблона из данных произвольной внутренней таблицы. Используется до вызова ZWWW_OpenForm, можно неоднократно для формирования нескольких табличных частей в шаблоне.

Обязательные параметры модуля:

LINE_NAME Имя закладки строки табличной части
IT_ANY_TABLE Имя произвольной внутренней таблицы с данными
IT_VALUES Имя внутренней таблицы типа ZWWW_VALUES, куда будут данные из IT_ANY_TABLE в необходимой для модуля ZWWW_OpenForm форме.

Необязательные параметры модуля:

IT_FIELDS_CATALOG Имя внутренней таблицы типа ZWWW_FIELD_CATALOG с описанием полей таблицы IT_ANY_TABLE, где:

— FIELD_NAME = имя поля таблицы IT_ANY_TABLE;

— FIND_TEXT = метка в закладке LINE_NAME, которая будет заменена значением поля (FIELD_NAME) таблицы IT_ANY_TABLE;

— FIELD_HEADER = заголовок, текстовое описание поля FIELD_NAME в заголовке таблицы, если задан параметр HEADER_NAME.

HEADER_NAME Имя закладки заголовка табличной части. Строка, в которой вместо имен полей таблицы IT_ANY_TABLE (или их заменителей FIND_TEXT, заданных в IT_FIELDS_CATALOG), будут подставлены их описания FIELD_HEADER из таблицы IT_FIELDS_CATALOG.
VAL_TYPE Пусто для текста (R’ или T’ для ускорения вывода в Excel, см. п. 3.1).

Приложение 1. Пример шаблона WORD.

Кто: [кто]

Дата:

Кто: [кто]

Список кредиторов:

LIFNR LAND1 NAME1 SORTL TELF1

Приложение 1.2 Пример макроса в шаблоне WORD.

Sub MacrosExample(R As Range)

With R.Cells(4).Range

.Text = «Пример отработки макроса шаблона MacrosExample»

.Font.Color = wdColorRed

End With

End Sub
Приложение 2. Пример отчета в WORD:

REPORT ZWWW_SAMPLE .

Data:

it_Val  type standard table of ZWWW_VALUES with header line,

SysDate(10).

Write sy-datum to SysDate. «Системная дата в текстовый формат

********************************************************************

* Заполним нетабличную часть

********************************************************************

******************************

* Метод поиска-замены

it_Val-Var_Name = ». «будет производиться поиск во всем документе,

it_Val-Var_Num = 0.   «номер строки, для нетабличных частей заполнять

«не надо

it_Val-Find_Text = ‘[кто]’. «уникальный текст, который будет найден и

«заменен на следующее значение

it_Val-Value = sy-uname. «значение в текстовой форме (имя пользователя)

Append it_Val.

«Достоинства метода:

«- наглядность шаблона

«- уникальный текст будет заменен везде, где найдется (см. [кто] вверху

»  и внизу листа)

»

******************************

* Метод присвоения переменной

Clear it_Val.

it_Val-Var_Name = ‘Дата’. «Имя закладки

it_Val-Find_Text = ».    »

it_Val-Value = SysDate.   «Системная дата

Append it_Val.

«Недостатки:

«- шаблон получается менее наглядным

********************************************************************

* Заполним табличную часть

********************************************************************

Define SetLine.

Clear it_Val.

it_Val-Var_Name  = &1. «имя закладки строки таблицы

it_Val-Var_Num   = &2. «номер строки таблицы

it_Val-Find_Text = &3. «искомый текст

it_Val-Val_Type  = &4. «тип значения

it_Val-Value     = &5. «значение

Append it_Val.

End-of-Definition.

SetLine ‘Строка’ 1 ‘[1]’ » ‘Мыло’.

SetLine ‘Строка’ 1 ‘[2]’ » ’10’.

*для 2-й строки используем закладку СтрокаКурсив в качестве шаблона

SetLine ‘Строка’ 2 »    ‘V’ ‘СтрокаКурсив’.

SetLine ‘Строка’ 2 ‘[1]’ »  ‘Порошок’.

SetLine ‘Строка’ 2 ‘[2]’ »  ‘4’.

SetLine ‘Строка’ 3 ‘[1]’ » ‘Щетка’.

SetLine ‘Строка’ 3 ‘[2]’ » ‘1’.

********************************************************************

* Использование вспомогательного модуля ‘ZWWW_PREPARE_TABLE’ для

* облегчения вывода данных из внутренних таблиц

********************************************************************

«Примечание:

«Все данные внутренней таблицы конвертируются в текстовый формат в

«соответствии с их типами. Числовые данные представляются с разделителем

«десятичной части в соответствии с текущей настройкой Windows.

Data:

Begin of it_LFA1 occurs 10,

*    MANDT type LFA1-MANDT,

LIFNR type LFA1-LIFNR,

LAND1 type LFA1-LAND1,

NAME1 type LFA1-NAME1,

SORTL type LFA1-SORTL,

ANRED type LFA1-ANRED,

ERDAT type LFA1-ERDAT,

ERNAM type LFA1-ERNAM,

TELF1 type LFA1-TELF1,

End of it_LFA1.

* Выберем 10 записей кредиторов

Select *

into corresponding fields of table it_LFA1

from LFA1

up to 10 rows.

Call function ‘ZWWW_PREPARE_TABLE’

EXPORTING

LINE_NAME    = ‘Строка2’  «имя строки таблицы в шаблоне

VAL_TYPE     = »

TABLES

IT_ANY_TABLE = it_LFA1  «внутренняя таблица с данными

IT_VALUES    = it_Val. «таблица для ‘ZWWW_OPENFORM’

SetLine ‘Строка2’ 3 » ‘M’ ‘MacrosExample’.

*

********************************************************************

* Заполнение шаблона подготовленными данными и вывод на экран

********************************************************************

Call function ‘ZWWW_OPENFORM’

EXPORTING

FORM_NAME   = ‘ZWWW_SAMPLE_WORD’

PrintDialog = »

TABLES

IT_VALUES   = it_Val.

четверг, 3 октября 2013 г.

ZWWW Выгрузка данных в формуляр Excel/Word

На замечательном форуме давно существует творение гениального участника с ником Parazit, которое позволяет быстро выгружать данные из SAP в различные формуляры WORD или EXCEL. Имя этому творению — ZWWW. Ниже ссылки на ресурсы с исходниками, описанием, мануалом и обсуждениями названной разработки.

 — Тема на sapboard с обсуждениями
 — Исходники здесь или здесь


Автор:

Unknown




на

05:18






Ярлыки:
ABAP,
Excel,
Word,
ZWWW

Комментариев нет:

Отправить комментарий

Всем привет!

Сегодня я расскажу о том, как довольно легко сделать выгрузку файла из Web Dynpro приложения.

Предположим, что вы создали программу, которая выгружает документ Word или Excel в SAP GUI. Для выгрузки вы использовали инструмент ZWWW. Через некоторое время к вам поступает требование от бизнеса реализовать возможность выгрузки этих документов через личный кабинет руководителя. Личный кабинет построен на некогда популярной технологии Web Dynpro (сократим до WD).

Общая часть.

Для выгрузки из WD приложения создадим в нашем отчете новую подпрограмму execute_from_web.

FORM execute_from_web USING iv_pernr TYPE pernr_d
                            iv_date TYPE datum
                            iv_format TYPE char1.
  DATA: lv_filenm_pdf TYPE fpname.

  p_pernr = iv_pernr.
  p_date = iv_date.
  p_format = iv_format.

* Заполняем выходную структуру gs_outstruc и преобразовываем ее в таблицу gtd_values
  PERFORM get_data.

  CASE iv_format.
    WHEN 1.
      PERFORM print_file USING gc_invoice_word. " имя шаблона Word в smw0
    WHEN 2.
      PERFORM print_file USING gc_payment_order_excel. " имя шаблона Excel в smw0
    WHEN 3.
      PERFORM call_pdf USING gc_payment_order_pdf. " имя Pdf-формуляра в sfp .
    WHEN OTHERS.
  ENDCASE.

ENDFORM.

Эту подпрограмму будем вызывать в методе-обработчике событий WD приложения (будет рассмотрен ниже).

Инструмент ZWWW умеет выгружать документ через web. Поэтому, в данном случае, нам нет необходимости тем или иным способом получать xstring чтобы выгрузить файл. Это есть хорошо.

FORM print_file USING uv_form_name TYPE wwwdatatab-objid.

  CALL FUNCTION 'ZWWW_OPENFORM'
    EXPORTING
      form_name   = uv_form_name
      protect     = ''
    TABLES
      it_values   = gtd_values
    EXCEPTIONS
      printcancel = 1
      OTHERS      = 2.
  IF sy-subrc <> 0.
    MESSAGE ID 'ZHR_TEST' TYPE 'E' NUMBER 001.
  ENDIF.  " sy-subrc <> 0. 'ZWWW_OPENFORM'

ENDFORM. " print_file.

Таблица gtd_values в моем случае была заполнена в подпрограмме get_data.

PDF.

Для получение pdf-файла создадим форму call_pdf.

FORM call_pdf USING uv_filenm TYPE fpname.
  DATA: lv_fname        TYPE funcname,
        ls_outputparams TYPE sfpoutputparams,
        ls_formoutput   TYPE fpformoutput,
        lo_cx_fp_api    TYPE REF TO cx_fp_api,
        lv_msg          TYPE string.

  CHECK gs_outstruc IS NOT INITIAL.

  TRY.
      CALL FUNCTION 'FP_FUNCTION_MODULE_NAME'
        EXPORTING
          i_name     = uv_filenm
        IMPORTING
          e_funcname = lv_fname.
    CATCH cx_fp_api_internal
          cx_fp_api_repository
          cx_fp_api_usage
     INTO lo_cx_fp_api.

      lv_msg = lo_cx_fp_api->get_text( ).
      MESSAGE lv_msg TYPE wctpm_msgtyp-error.
  ENDTRY.

* Обратите внимание!
  ls_outputparams-nodialog = 'X'.
  ls_outputparams-getpdf = 'X'.

  CALL FUNCTION 'FP_JOB_OPEN'
    CHANGING
      ie_outputparams = ls_outputparams
    EXCEPTIONS
      usage_error     = 1
      system_error    = 2
      internal_error  = 3
      OTHERS          = 4.
  CHECK sy-subrc = 0.

  CALL FUNCTION lv_fname
    EXPORTING
      is_data            = gs_outstruc
    IMPORTING
      /1bcdwb/formoutput = ls_formoutput
    EXCEPTIONS
      usage_error        = 1
      system_error       = 2
      internal_error     = 3
      OTHERS             = 4.
  CHECK sy-subrc = 0.

  CALL FUNCTION 'FP_JOB_CLOSE'
    EXCEPTIONS
      usage_error    = 1
      system_error   = 2
      internal_error = 3
      OTHERS         = 4.
  CHECK sy-subrc = 0.

  cl_wd_runtime_services=>attach_file_to_response( i_filename  = |{ uv_filenm }_{ sy-timlo }.pdf'|
  i_content   = ls_formoutput-pdf
  i_mime_type = 'application/pdf' ) ##NO_TEXT.

ENDFORM. " call_pdf.

Самое интересное. 

В методе do_operations на событии «PRINT» вызываем подпрограмму печати документа execute_from_web, созданную нами выше.

METHOD if_hrasr00gen_service~do_operations.
  DATA: lo_fpm   TYPE REF TO cl_fpm,
        lv_event TYPE fpm_event_id,
        lv_pernr TYPE  pernr_d,
        lv_date   TYPE  dats,
        lv_format TYPE char1.

* Получаем параметры из полей в браузере
   lv_pernr  =  ctd_service_dataset[  fieldname  =  'PERNR'  ]-fieldvalue.
   lv_date  =  ctd_service_dataset[  fieldname  =  'DATE'  ]-fieldvalue.
   lv_format  =  ctd_service_dataset[  fieldname  =  'FORMAT'  ]-fieldvalue. "Формат файла(1-word,2-excel,3-pdf)

* Получаем событие
  lo_fpm ?= cl_fpm=>get_instance( ).
  IF lo_fpm IS BOUND.
    lv_event = lo_fpm->mo_current_event->mv_event_id.
    CASE lv_event.
      WHEN 'PRINT'.
        PERFORM  execute_from_web  IN  PROGRAM  zhr_test  USING  lv_pernr  lv_date lv_format. 
    ENDCASE.
  ENDIF.
ENDMETHOD.

Результат:

Ниже приведен скриншот выгрузки файла pdf.

Для Word и Excel файлов результат такой же.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Понравилась статья? Поделить с друзьями:

А вот еще интересные статьи:

  • Выделение картинки в word
  • Выгрузка банковской выписки в excel
  • Выделение информации в ячейке excel
  • Выгрузка sql отчетов в excel
  • Выделение интервалов в excel

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии