Большое спасибо
Parazit, эксплуатирую твою разработку - работает замечательно
Для заполнения таблицы значений написал свой ФМ, вот решил опубликовать (на мой взгляд удачное решение получилось)
Для связывания переменных программы и текстовых "меток"шаблона я сделал настоечную таблицу ZWWW_FASSIGN и ФМ ZWWW_FILL_VALUES для сбора значений из программы которая его вызвала и заполнения таблицы значений на основе настроечной таблицы
Структура таблицы:
Code:
OBJID W3OBJID ключь Имя объекта
NUM NUMC3 ключь Номер по порядку (практического смысла не имеет, просто чтоб размножить записи)
FGROUP ZWWW_FGROUP Группа полей используется в подпрограммах заполнения шаблона
VAR_NAME ZWWW_VAR_NAME Имя закладки
FIND_TEXT ZWWW_FIND_TEXT текстовая метка из шаблона например «[ИМЯ_КЛИЕНТА]»
FNAMES TEXT255 макрос для формирования строки которой будет заменена метка.
поле FNAMES – предназначен для упрощения формирования строки для замены метки
Пример заполнения: «[ADRC-POST_CODE1] [ADRC-REGION] {г. [ADRC-CITY1],} [ADRC-STREET],} [ADRC-HOUSE_NUM1]»
В квадратных скобках указаны имена полей заполняющей программы из которых должно быть взято значение, перед и после квадратных скобок могут быть указаны соотв. фигурные скобки значение которое указано между фигурной и квадратной скобкой будет внесено в текст если значение поля в квадратных скобках не пустое
т.е. в нашем примере если поле программы ADRC-CITY1 (город) заполнено (не пустое) то перед ним будет выведено «г.» а после него «,».
внутри квадратных скобок перед именем поля программы может быть указана подпрограмма преобразования через разделитель «|» например [D1|VEDA-VBEGDAT] – в данном случае «D1» -это имя стандартной подпрограммы преобразования подпрограммы начинающиеся на «Z» должны быть закодированы в программе формирующей формуляр. У таких подпрограмм два параметра – входящая переменная и исходящая строка.
поле FGROUP – это поле является одним из параметров ФМ ZWWW_FILL_VALUES и служит для единовременного заполнение строк значений для нескольких текстовых меток шаблона.
Code:
FUNCTION zwww_fill_values.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*" IMPORTING
*" VALUE(PROGRAM) TYPE SY-REPID OPTIONAL
*" REFERENCE(OBJID) TYPE ZWWW_FASSIGN-OBJID
*" REFERENCE(FGROUP) TYPE ZWWW_FASSIGN-FGROUP DEFAULT '*'
*" REFERENCE(VAR_NUM) TYPE ZWWW_VAR_NUM OPTIONAL
*" TABLES
*" IT_VALUES
*"----------------------------------------------------------------------
STATICS itfassign TYPE zwww_fassign OCCURS 0 WITH HEADER LINE.
DATA: index TYPE sy-index.
DATA: field(100) TYPE c.
DATA: wa_values TYPE zwww_values.
DATA: tail(50) TYPE c.
DATA: len TYPE i.
DATA: ch TYPE c.
DATA: tabix TYPE sy-tabix.
DATA: prg(20) TYPE c.
DATA: str(100) TYPE c.
DATA: BEGIN OF itw OCCURS 0,
pch TYPE c,
nch TYPE c,
str(100) TYPE c,
END OF itw.
DATA: wx LIKE LINE OF itw.
FIELD-SYMBOLS <fs>.
READ TABLE itfassign WITH KEY objid = objid.
IF sy-subrc <> 0.
SELECT * APPENDING TABLE itfassign
FROM zwww_fassign
WHERE objid = objid.
IF sy-subrc <> 0.
MESSAGE x398(00) WITH 'Данные для объекта' objid 'не найдены'.
ENDIF.
ENDIF.
IF program IS INITIAL.
CALL 'AB_GET_CALLER' ID 'PROGRAM' FIELD program.
ENDIF.
LOOP AT itfassign WHERE objid = objid
AND fgroup CP fgroup.
len = STRLEN( itfassign-fnames ).
CHECK len > 0.
ASSIGN itfassign-fnames(len) TO <fs>.
TRANSLATE <fs> USING ' #'.
CLEAR: itw[], itw, index.
DO len TIMES.
ch = itfassign-fnames+index(1).
IF ch CA '{}[]'.
itw-nch = ch.
APPEND itw.
CLEAR itw.
itw-pch = ch.
ELSE.
CONCATENATE itw-str ch INTO itw-str.
ENDIF.
ADD 1 TO index.
ENDDO.
LOOP AT itw WHERE nch = ']'.
tabix = sy-tabix.
TRANSLATE itw-str TO UPPER CASE.
IF itw-str CA '|'.
SPLIT itw-str AT '|' INTO prg itw-str.
ELSE.
CLEAR prg.
ENDIF.
CONCATENATE '(' program ')' itw-str INTO field.
ASSIGN (field) TO <fs>.
CLEAR str.
IF NOT <fs> IS INITIAL.
IF prg IS INITIAL.
WRITE <fs> TO str LEFT-JUSTIFIED.
ELSE.
IF prg(1) = 'Z'.
PERFORM (prg) IN PROGRAM (program) IF FOUND
USING <fs> str.
ELSE.
CONCATENATE 'CONVERT_' prg INTO prg.
PERFORM (prg) IN PROGRAM (sy-repid) IF FOUND
USING <fs> str.
ENDIF.
IF str IS INITIAL.
WRITE <fs> TO str LEFT-JUSTIFIED.
ENDIF.
ENDIF.
ADD 1 TO tabix.
READ TABLE itw INDEX tabix INTO wx.
IF wx-nch = '}'.
CONCATENATE str wx-str INTO str.
ENDIF.
SUBTRACT 2 FROM tabix.
IF tabix > 0.
READ TABLE itw INDEX tabix INTO wx.
IF wx-pch = '{'.
CONCATENATE wx-str str INTO str.
ENDIF.
ENDIF.
ADD 1 TO tabix.
ENDIF.
itw-str = str.
MODIFY itw INDEX tabix TRANSPORTING str.
ENDLOOP.
CLEAR wa_values.
LOOP AT itw WHERE NOT str IS INITIAL.
IF itw-pch = '{' AND itw-nch = '['
OR itw-pch = ']' AND itw-nch = '}'.
CONTINUE.
ENDIF.
CONCATENATE wa_values-value itw-str INTO wa_values-value.
ENDLOOP.
TRANSLATE wa_values-value USING '# '.
wa_values-var_name = itfassign-var_name.
wa_values-var_num = var_num.
wa_values-find_text = itfassign-find_text.
* wa_values-val_type = .
APPEND wa_values TO it_values.
ENDLOOP.
ENDFUNCTION.
*&---------------------------------------------------------------------*
*& Form CONVERT_d1
*&---------------------------------------------------------------------*
* Подпрограмма преобразования D1
*----------------------------------------------------------------------*
* -->D text
* -->STR text
*----------------------------------------------------------------------*
FORM convert_d1 USING ad str.
DATA: d TYPE d.
DATA: month(15) TYPE c.
d = ad.
CASE d+4(2).
WHEN '01'. month = 'января'.
WHEN '02'. month = 'февраля'.
WHEN '03'. month = 'марта'.
WHEN '04'. month = 'апреля'.
WHEN '05'. month = 'майя'.
WHEN '06'. month = 'июня'.
WHEN '07'. month = 'июля'.
WHEN '08'. month = 'августа'.
WHEN '09'. month = 'сентября'.
WHEN '10'. month = 'октября'.
WHEN '11'. month = 'ноября'.
WHEN '12'. month = 'декабря'.
ENDCASE.
CONCATENATE '«' d+6(2) '»#' month '#' d(4) '#года' INTO str.
TRANSLATE str USING '# '.
ENDFORM. "CONVERT_d1
Данный ФМ позволяет упростить программу формирования шаблона, сделать её более наглядной и настраиваемой,
отделяет названия текстовых меток шаблона от программы формирования шаблона