На сегодняшний день, ZWWW для выгрузки в WORD и EXCEL используется практически повсеместно. Однако, как выяснилось, не все знают про одну возможность. А именно копирование метки в область val_type = 'V'.
Все возможные варианты можно посмотреть в программе ZWWW_MANY_LIST. Тут же мы разберем простенький пример.
Задача такая: Необходимо вывести в одном документе некий приказ, и чтобы для каждого табельного номера он был на новом листе.
В ZWWW есть возможность копировать содержимое метки, в указанную область. Для этого в документе мы должны создать три Закладки:
1 - HEADER2 - закладка это наша основная область, в которой находится весь текст и метки.
2-NewPage - закладка служит для того чтобы создавать новые страницы
3- Line2 - данная закладка как раз является областью в которую мы будем вставлять две предыдущих по мере необходимости.
Общий алгоритм такой:
- Вставляем в область Line2 Данные из закладки HEADER2.
- После этого заменяем в области HEADER2 все метки.
- Вставляем в область Line2 Разрыв страницы, который находится в закладке NewPage
- Повторяем в цикле, пока не закончатся данные в таблице.
Замечание:
1. При этом необходимо учитывать var_num, как в случае таблиц. Т.е. каждая вставка области, будь то Line2 или HEADER2 является новой строкой в таблице.
2. Если область ни разу не была вставлена, то она не исчезает из шаблона и окажется в выходном формуляре в изначальном виде. У вас может быть несколько областей для вставки, и, скажем, для одних табельных номеров вы хотите использовать одну текстовку, а для других другую. И так получилось, что выбрались люди, подходящие только под первую из текстовок. При этом если мы, ни разу не использовали вторую, она останется в формуляре, ее надо будет удалить при помощи val_type = 'D' . Первая же исчезнет сама.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
METHOD on_user_command. DATA lv_i TYPE i VALUE '1'. "Счетчик для позиций DATA lt_val TYPE TABLE OF zwww_values. DATA lv_sum_retention_per TYPE pa0295-deduc. DATA lt_data LIKE mt_data. lt_data[] = mt_data[]. SORT lt_data BY employee_id grnum period ASCENDING . LOOP AT lt_data ASSIGNING FIELD-SYMBOL(<ls_tab>). IF lv_i <> 1. " На первом круге, новая страница не нужна "Вставка новой страницы APPEND VALUE #( var_name = 'LINE2' var_num = lv_i find_text = '' val_type = 'V' value = 'NewPage' ) TO lt_val. ADD 1 TO lv_i. ENDIF. "Вставляем область Header2 c текстовкой APPEND VALUE #( var_name = 'LINE2' var_num = lv_i find_text = '' val_type = 'V' value = 'HEADER2' ) TO lt_val. "Заменяем в ней метки APPEND VALUE #( var_name = 'LINE2' var_num = lv_i find_text = '[FIO]' val_type = '' value = <ls_tab>-employee_fio ) TO lt_val. APPEND VALUE #( var_name = 'LINE2' var_num = lv_i find_text = '[ROSP]' val_type = '' value = <ls_tab>-agency_name ) TO lt_val. APPEND VALUE #( var_name = 'LINE2' var_num = lv_i find_text = '[ADDRESS]' val_type = '' value = <ls_tab>-agency_address ) TO lt_val. APPEND VALUE #( var_name = 'LINE2' var_num = lv_i find_text = '[BUNIT]' val_type = '' value = <ls_tab>-company ) TO lt_val. APPEND VALUE #( var_name = 'LINE2' var_num = lv_i find_text = '[Period]' val_type = '' value = |с { pn-begda DATE = USER } по { pn-endda DATE = USER }| ) TO lt_val. APPEND VALUE #( var_name = 'LINE2' var_num = lv_i find_text = '[SUM_DOH]' val_type = '' value = <ls_tab>-sum_income ) TO lt_val. APPEND VALUE #( var_name = 'LINE2' var_num = lv_i find_text = '[IL]' val_type = '' value = <ls_tab>-order_id ) TO lt_val. APPEND VALUE #( var_name = 'LINE2' var_num = lv_i find_text = '[SUM_UD]' val_type = '' value = <ls_tab>-sum_retention_month ) TO lt_val. ADD 1 TO lv_i. ENDLOOP. "Если в таблице с данными была только одна строка "Закладка NewPage не исчезнет, ее надо удалить иначе документ начнется с пустой страницы "т.к. разрыв останется на ней "Если она использовалась, то удаление не нужно, исходная закладка удалится сама "Однако, это удаление не повредит в этом случае. Пусть будет всегда APPEND VALUE #( var_name = 'NewPage' var_num = '' find_text = '' val_type = 'D' value = '' ) TO lt_val. "Выводим документ CALL FUNCTION 'ZWWW_OPENFORM' EXPORTING form_name = CONV w3objid( sy-cprog ) * FILE_NAME = * FILE_LOCATION = '' * PRINTDIALOG = '' protect = '' * OPTIMIZE = 100 * DEBUG_MODE = '' * DECIMAL_SEPARATOR = '.' * CLOSE_FORM = '' * DELETE_FILE = 'X' * WITHOUT_OLE = '' * USE_JAR = '' * USE_UNICODE = '' TABLES it_values = lt_val * IT_FILES = EXCEPTIONS printcancel = 1 OTHERS = 2. IF sy-subrc <> 0. * Implement suitable error handling here ENDIF. ENDMETHOD. "on_user_command |
По такому же принципу можно работать и в EXCEl. Причем можно копировать любое количество меток в произвольном порядке, копируя как в рамках одного листа так и по разным, тем самым создавая довольно сложные документы.
Какая самая свежая версия zwww_openform?
Не знаю какая самая свежая. У нас 2.98.
Добрый день. Подскажите, пожалуйста, как создать документ вашим способом, когда закладка HEADER2 внутри себя содержит другие закладки (табличные части).Задача такова: есть список заказов, для каждого из них информацию нужно выводить в один и тот же документ с нового листа, для каждого заказа должна быть заполнена табличная часть с материалами из заказа.
И еще мне показалось, что в коде ошибка: для строк с 21 по 28 должна быть указана закладка HEADER2 вместо LINE2.
Добрый день.
Если я вас правильно понял, то ответ на ваш вопрос есть в программе ZWWW_MANY_LIST, там рассматривается похожая ситуация. По идее вам просто надо чуть больше меток, а именно дополнительные метки для шапки таблицы и для строки. Когда вы вставили новый лист, следом копируете шапку. После много раз вставляете строку. Для следующего заказа опять копируете метку с Разрывом страницы и шапку. А потом много раз строку таблицы. и т.д. Главное правильно создать метки, чтобы таблица не расползалась. Если мне память не изменяет, то там надо сделать две таблицы(одна просто шапка, вторая с одной строкой и метками в ней), после вставки они визуально объединятся.
Может быть объяснил немного непонятно, напишите мне в LinkedIn, обсудим в чате.
По поводу кода, должно быть все верно, т.к. обычно я делаю рабочий пример и уже его выкладываю в статью. Мы когда скопировали закладку, произошло копирование не закладки, а содержащихся в ней данных. Именно поэтому мы можем копировать закладку снова и снова. Метки находятся в области целевой закладки, а не исходной. Поэтому там и LINE2. Header2 где была там и осталась.