2011年4月22日

將文字以指定的輸出長度分段

在報表輸出時,中文字佔了二個文字的長度,而Unicode系統的SAP中文字只算1個長度
報表格式上有長度限制時,就需要另外處理讓文字可以分段:
FUNCTION Z_STRING_SPLIT_TO_TABLE .
*"----------------------------------------------------------------
*"*"區域介面:
*" IMPORTING
*" REFERENCE(PI_STRING) TYPE STRING
*" REFERENCE(PI_SIZE) TYPE I DEFAULT 20
*" EXPORTING
*" VALUE(PE_LINECOUNT) TYPE I
*" TABLES
*" PT_STRING STRUCTURE UPS_YS_STRING_TABLE OPTIONAL
*"----------------------------------------------------------------


DATA: LV_CHAR(4096),
LV_STRLEN TYPE I, "輸入字串長度
LV_STRCOUNT TYPE I VALUE 0, "字串計數器
LV_COUNTER TYPE I, "長度計數器
LV_LEN TYPE I. "長度變數

*****計算出字串長度
LV_STRLEN = STRLEN( PI_STRING ).
*****將String轉成char
LV_CHAR = PI_STRING.
*****利用CL_ABAP_LIST_UTILITIES=>DYNAMIC_OUTPUT_LENGTH
*****計算出顯示長度後依條件分割
WHILE LV_STRCOUNT < LV_STRLEN.
LV_COUNTER = 1.
WHILE LV_COUNTER <= PI_SIZE.
CALL METHOD CL_ABAP_LIST_UTILITIES=>DYNAMIC_OUTPUT_LENGTH
EXPORTING
FIELD = LV_CHAR+LV_STRCOUNT(LV_COUNTER)
RECEIVING
LEN = LV_LEN.
IF LV_LEN = PI_SIZE.
PT_STRING-LINE = LV_CHAR+LV_STRCOUNT(LV_COUNTER).
APPEND PT_STRING.
LV_STRCOUNT = LV_STRCOUNT + LV_COUNTER - 1.
EXIT.
ELSE.
LV_LEN = LV_STRCOUNT + LV_COUNTER.
IF LV_LEN = LV_STRLEN.
PT_STRING-LINE = LV_CHAR+LV_STRCOUNT(LV_COUNTER).
APPEND PT_STRING.
LV_STRCOUNT = LV_STRCOUNT + LV_COUNTER - 1.
ENDIF.
LV_COUNTER = LV_COUNTER + 1.
ENDIF.
ENDWHILE.
LV_STRCOUNT = LV_STRCOUNT + 1.
ENDWHILE.

*****計算分割後的字串數
DESCRIBE TABLE PT_STRING LINES PE_LINECOUNT.
ENDFUNCTION.