在做ALV&SmartForms输出时,如果执行Program并输出,那么在输出页面按F3返回一步,再次执行输出——就会发生循环错误。
此时,是因为在你的SmartForms中没有更新掉内表。
解决方法:1. 在SmartForms中,循环的最后,插入代码
CLEAR IT_DATA[].
CLEAR IT_PURNM[].
2. 在Program中,一般加在函数
CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
CLEAR : IT_SELS[],
IT_PURNM[],
IT_BLAK[].
最后的地方,插入以上代码。
分析:注意Refresh与Clear的区别。
(一) 当没有HEADER LINE时,
REFRESH IT_DATA.
CLEAR IT_DATA[].
CLEAR IT_DATA.
,这三者是相等的。
(二) 当存在HEADER LINE时,
REFRESH IT_DATA.
CLEAR IT_DATA[].
,这两者是相等的。清空内表数据存储空间,对HEADER LINE不影响。
这个
CLEAR IT_DATA.
仅仅清除了HEADER LINE,对内表数据存储空间不影响。
内表赋值——内表分有无HEADER LINE两种。对于有HEADER LINE的内表,可以通过两种方法:填充HEADER LINE或者通过外部的Work Area向内表存储空间追加数据;没有HEADER LINE的内表,只有一种方法,就是通过外部Work Area来传递数据。
苯方法: CLEAR : IT_SELS, IT_SELS[].
前者清空HEADER LINE里的内容,后者清空内表数据。
测试代码:
*&---------------------------------------------------------------------*
*& REPORT ZT_EXCEPTION_MSG
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT ZT_TEST.
DATA : C_X(1) TYPE C VALUE 'X'.
SELECTION-SCREEN BEGIN OF BLOCK BLK1.
PARAMETERS : P_1_RFSH RADIOBUTTON GROUP GRP4.
PARAMETERS : P_2_CLR1 RADIOBUTTON GROUP GRP4 DEFAULT 'X'.
PARAMETERS : P_3_CLR2 RADIOBUTTON GROUP GRP4.
PARAMETERS : P_4_NO RADIOBUTTON GROUP GRP4.
SELECTION-SCREEN END OF BLOCK BLK1.
TYPES : BEGIN OF TY_DATA,
DATA1,
DATA2,
END OF TY_DATA.
DATA : WA_DATA TYPE TY_DATA.
DATA : IT_DATA TYPE STANDARD TABLE OF TY_DATA WITH HEADER LINE.
START-OF-SELECTION.
WA_DATA-DATA1 = '1'.
WA_DATA-DATA2 = '2'.
APPEND WA_DATA TO IT_DATA.
*LOOP AT IT_DATA.
* WRITE : 'First write : ',
* IT_DATA-DATA1, IT_DATA-DATA2,
* WA_DATA-DATA1, WA_DATA-DATA2, /.
*ENDLOOP.
LOOP AT IT_DATA INTO WA_DATA.
WRITE : 'First write : ',
WA_DATA-DATA1, WA_DATA-DATA2, /.
ENDLOOP.
IF P_1_RFSH = C_X. "使用REFRESH
REFRESH IT_DATA.
ENDIF.
IF P_2_CLR1 = C_X. "使用CLEAR IT_DATA[],有方括号。
CLEAR IT_DATA[].
ENDIF.
IF P_3_CLR2 = C_X. "使用CLEAR IT_DATA,没有方括号。
CLEAR IT_DATA.
ENDIF.
*LOOP AT IT_DATA.
* WRITE : 'Second write : ',
* IT_DATA-DATA1, IT_DATA-DATA2,
* WA_DATA-DATA1, WA_DATA-DATA2, /.
*ENDLOOP.
LOOP AT IT_DATA INTO WA_DATA.
WRITE : 'Second write : ',
WA_DATA-DATA1, WA_DATA-DATA2, /.
ENDLOOP.
PERFORM LAYOUT.
FORM LAYOUT.
IF IT_DATA IS INITIAL.
WRITE : 'IT_DATA IS INITIAL'.
ELSE.
* LOOP AT IT_DATA.
* WRITE : 'Thrid write : ',
* IT_DATA-DATA1, IT_DATA-DATA2,
* WA_DATA-DATA1, WA_DATA-DATA2, /.
* ENDLOOP.
LOOP AT IT_DATA INTO WA_DATA.
WRITE : 'Thrid write : ',
WA_DATA-DATA1, WA_DATA-DATA2, /.
ENDLOOP.
ENDIF.
WRITE : / 'END'.
ENDFORM.