воскресенье, 8 января 2017 г.

Вывод длинных строк в поля документов MS WORD и MS EXCEL с помощью ABAP

Для создания/генерации документов MS WORD, MS EXCEL в SAP имеются несколько удобных (и не очень) инструментов таких как OLE, XML трансформация , ZWWW и другие. По опыту работы на различных проектах, заказчики очень часто используют метод вывода документов из SAP ZWWW.
 
  В этой заметке хотелось бы остановиться на некоторых аспектах работы с  ZWWW, а именно работой с длинными строками. (  Подразумевается, что читатель данной статьи уже обладает опытом  разработки отчетов с выгрузкой документов в ABAP для MS WORD, MS EXCEL через ZWWW. )

Описание проблемы.

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


 

















 
Если не предпринимать никаких дополнительных манипуляций, то при выводе в MS Excel или MS Word текста через переменную ABAP, она должна содержать в себе не более чем 255 символов иначе текст переданный через переменную не выведется на форму вовсе.

         Рассмотрим ниже случай, когда нам все-таки нужно передать через переменную текст длиной более 255 символов.

Длинные текстовые строки. Решение.

В случае длинных текстовых полей в ZWWW предусмотрен механизм, позволяющий передавать длинную строку путем разбивания специальным образом этой строки на подстроки длиной не более 255 символов. Разбиение строк нужно производить в таблице структуры zwww_values_t непосредственно перед вызовом функционального модуля 'ZWWW_OPENFORM' на вход которого в качестве параметра эта таблица и подается. Функционал ZWWW самостоятельно соберет эти строки обратно в одну и выведет на шаблоне документа как значение одной переменной.

 
Как это можно сделать.
 
Подадим, как обычно, на вход функционального модуля 'ZWWW_PREPARE_TABLE’ таблицу, содержащую данные бизнес-логики (в частности, таблицу содержащую поля со строками длинной более чем 255 символов, в нашем примере это таблица  lt_table ). Этот функциональный модуль на выходе вернет нам таблицу с нашими данными, но уже в формате zwww_values_t, необходимом для вывода данных на шаблон через 'ZWWW_OPENFORM’. В нашем примере это таблица  lt_val. 
 
CALL FUNCTION 'ZWWW_PREPARE_TABLE'
            EXPORTING
               line_name    = 'TAB_LINE'
               val_type     = ''
           TABLES
               it_any_table = it_table
               it_values    = lt_val
         EXCEPTIONS
           OTHERS       = 1.
         IF sy-subrc EQ 0.
*  вывод строки длиной больше чем 255 символов
           PERFORM wrap_text CHANGING lt_val.
         ELSE.
           CLEAR lt_val[].
         ENDIF."CALL FUNCTION 'ZWWW_PREPARE_TABLE
 

Далее, подстановкой полученной таблицы в подпрограмму ‘wrap_text’ проанализируем поля на предмет их длины и преобразуем сформированную таблицу структуры ‘zwww_values_t’ к виду с разбиением длинных строк на группу строк, отвечающих за одну переменную длиной не более чем 255 символов.

FORM wrap_text CHANGING ctd_zwww TYPE zwww_values_t.
           DATA:
                  ls_zwww  TYPE zwww_values,
                  lv_index TYPE sy-index.

   LOOP AT ctd_zwww ASSIGNING FIELD-SYMBOL(<ls_zwww>).
*    обработка вывода более 255 символов.
               lv_index = sy-tabix + 1.
               PERFORM word_wrap USING lv_index
                                                           CHANGING <ls_zwww>
                                                                                    ctd_zwww.
            ENDLOOP.
         ENDFORM.

 

В подпрограмме ‘word_wrap’ непосредственно и происходит разбиение строк на подстроки правильного формата для ZWWW.

FORM word_wrap USING iv_index TYPE sy-index
                                              CHANGING cs_zwww TYPE zwww_values
                                                                     ctd_zwww TYPE STANDARD TABLE.
            DATA:
                  lv_string          TYPE char3000,
                  ltd_text255     TYPE tttext255,
                  lv_tabix            LIKE sy-tabix,
                  lv_len               TYPE i,
                  lv_index         TYPE sy-tabix,
                  lv_first_leter TYPE c VALUE 'a'.


            FIELD-SYMBOLS <ls_zwww> TYPE zwww_values.

CHECK strlen( cs_zwww-value ) GT 255.
         lv_string = cs_zwww-value.
         lv_len  = 200.
         lv_index = iv_index.

CALL FUNCTION 'SDB_WORD_WRAP'
             EXPORTING
                  textline            = lv_string
                  outputlen           = lv_len
              TABLES
                  out_lines           = ltd_text255
              EXCEPTIONS
                  outputlen_too_large = 1
                  OTHERS              = 2.
           IF sy-subrc EQ 0.
                CLEAR cs_zwww-value.

    LOOP AT ltd_text255 ASSIGNING FIELD-SYMBOL(<lv_text255>).
                  lv_tabix = sy-tabix + 1.
                 INSERT INITIAL LINE INTO ctd_zwww INDEX lv_index ASSIGNING <ls_zwww>.
                  lv_index = lv_index + 1.
                 MOVE-CORRESPONDING cs_zwww TO <ls_zwww>.
                 <ls_zwww>-find_text = lv_first_leter && lv_tabix.
                 <ls_zwww>-value = <lv_text255>.
                 cs_zwww-value = |{ cs_zwww-value }{ <ls_zwww>-find_text }|.
            ENDLOOP.


             CONDENSE cs_zwww-value.
* Implement suitable error handling here
          ENDIF.


        ENDFORM.

Далее, подставляем полученную таблицу lt_val как обычно в 'ZWWW_OPENFORM’ и получаем результат с учетом длинных строк.

Результат работы алгоритма может выглядеть как на картинке ниже.

image 

На картинке выше длинный текст в ячейке в MS Excel не умещается на отображаемой части ячейки листа MS EXCEL 2013 т.к. максимальная высота ячейки в MS EXCEL 2013 составляет 546 пикселей. Кроме этого имеется ограничение на количество выводимых символов внутри одной ячейки - 1024 символа. Эти особенности редактора MS Excel нужно иметь ввиду и учитывать при выводе таблиц с полями, содержащими очень длинные строки.

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

image

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

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