需求:把行数据按照一定格式拼接,形成列。
举例:
有一个内表it_send,内表中有字段A,B,C,D,E,F,G,H。 另外一个内表ct_bom ,有字段A1,B1,C1,D1,E1,F1,G1,H1类推至A24,B24,C24,D24,E24,F24,G24,H24. 请把内表IT_MATNR中数据转换到ct_bom 中,it_send中每24行数据转换到内表ct_bom 中的一行,循环转换,直到数据转换结束。
代码:
FORM frm_mapping_data USING it_send TYPE tt_send
CHANGING cs_head TYPE cn_d0311_order
ct_bom TYPE tt_bom.
CLEAR ls_row.
ls_row-index = 1.
ls_row-fieldname = text-t01.
APPEND ls_row TO gt_row.
CLEAR ls_row.
ls_row-index = 2.
ls_row-fieldname = text-t02.
APPEND ls_row TO gt_row.
CLEAR ls_row.
ls_row-index = 3.
ls_row-fieldname = text-t03.
APPEND ls_row TO gt_row.
CLEAR ls_row.
ls_row-index = 4.
ls_row-fieldname = text-t04.
APPEND ls_row TO gt_row.
CLEAR ls_row.
ls_row-index = 5.
ls_row-fieldname = text-t05.
APPEND ls_row TO gt_row.
CLEAR ls_row.
ls_row-index = 6.
ls_row-fieldname = text-t06.
APPEND ls_row TO gt_row.
CLEAR ls_row.
ls_row-index = 7.
ls_row-fieldname = text-t07.
APPEND ls_row TO gt_row.
CLEAR ls_row.
ls_row-index = 8.
ls_row-fieldname = text-t08.
APPEND ls_row TO gt_row.
CONSTANTS lc_symbol TYPE char1 VALUE '_'.
DATA lv_fiename TYPE fieldname.
DATA lv_char2 TYPE char2.
DATA lv_index TYPE sy-index.
DATA lv_sindex TYPE sy-index.
FIELD-SYMBOLS <ls_newline> TYPE d0311_bom.
DATA ls_bom TYPE d0311_bom.
"Mapping BOM data
LOOP AT it_send ASSIGNING FIELD-SYMBOL(<ls_data>).
"Get the current line number
lv_index = lv_index + 1.
lv_char2 = lv_index.
"Int transfer char2.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = lv_char2
IMPORTING
output = lv_char2.
IF lv_index = 1.
"Create new line
CLEAR ls_bom.
INSERT ls_bom INTO TABLE ct_bom ASSIGNING <ls_newline>.
ENDIF.
* WHILE .
DO 8 TIMES.
"Convert the 8 fields in the BOM table to their corresponding columns in sequence
lv_sindex = lv_sindex + 1.
READ TABLE gt_row INTO DATA(ls_row) INDEX lv_sindex.
IF sy-subrc EQ 0.
ASSIGN COMPONENT ls_row-fieldname OF STRUCTURE <ls_data> TO FIELD-SYMBOL(<lv_fieldvalue>).
IF sy-subrc EQ 0.
CLEAR lv_fiename.
lv_fiename = ls_row-fieldname && lc_symbol && lv_char2.
ASSIGN COMPONENT lv_fiename OF STRUCTURE <ls_newline> TO FIELD-SYMBOL(<lv_newfield>).
IF sy-subrc EQ 0.
<lv_newfield> = <lv_fieldvalue>.
ENDIF.
ENDIF.
ENDIF.
ENDDO.
CLEAR lv_sindex.
"Every 24 lines clear the index
IF lv_index = 24.
CLEAR lv_index.
ENDIF.
ENDLOOP.
ENDFORM.
测试效果: