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.

1 則留言:

  1. 我發現哦~在這段有bug
    ====================
    *****計算出字串長度
    LV_STRLEN = STRLEN( PI_STRING ).
    ====================
    假如是中英文字的話,中文英文都算1個
    這樣長度會比原先的小,好像會導致接下來的
    IF LV_LEN = LV_STRLEN.
    會判斷錯誤
    改成
    LV_STRLEN = CL_ABAP_LIST_UTILITIES=>DYNAMIC_OUTPUT_LENGTH( PI_STRING ).
    就很正常的~

    回覆刪除