Описание проблемы.
Рассмотрим ниже случай, когда нам все-таки нужно передать через переменную текст длиной более 255 символов.
Длинные текстовые строки. Решение.
В случае длинных текстовых полей в ZWWW предусмотрен механизм, позволяющий передавать длинную строку путем разбивания специальным образом этой строки на подстроки длиной не более 255 символов. Разбиение строк нужно производить в таблице структуры zwww_values_t непосредственно перед вызовом функционального модуля 'ZWWW_OPENFORM' на вход которого в качестве параметра эта таблица и подается. Функционал ZWWW самостоятельно соберет эти строки обратно в одну и выведет на шаблоне документа как значение одной переменной.
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’ и получаем результат с учетом длинных строк.
Результат работы алгоритма может выглядеть как на картинке ниже.
На картинке выше длинный текст в ячейке в MS Excel не умещается на отображаемой части ячейки листа MS EXCEL 2013 т.к. максимальная высота ячейки в MS EXCEL 2013 составляет 546 пикселей. Кроме этого имеется ограничение на количество выводимых символов внутри одной ячейки - 1024 символа. Эти особенности редактора MS Excel нужно иметь ввиду и учитывать при выводе таблиц с полями, содержащими очень длинные строки. В некоторых случаях, на этапе проектирования шаблона, возможно, имеет смысл сделать выбор в пользу MS Word, который позволяет выводить в ячейку таблицы строки с существенно большим количеством символов. |
Комментариев нет:
Отправить комментарий