说起来,已经好久都没有写过代码了,我怕自己忘记一些ABAP的东西,打算开一个专栏,来重新温习一下,ok,走着!
一个简单的AVL报表程序,可以调用REUSE_ALV_GRID_DISPLAY_LVC这个函数(有的人习惯用REUSE_ALV_GRID_DISPLAY,其实二者差别不大,LVC是对原有BAPI的升级,包含单元格处理之类的)。
下面来看一下REUSE_ALV_GRID_DISPLAY_LVC的几个重要的参数
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
* EXPORTING
* I_INTERFACE_CHECK = ' '
* I_BYPASSING_BUFFER =
* I_BUFFER_ACTIVE =
* I_CALLBACK_PROGRAM = ' '
* I_CALLBACK_PF_STATUS_SET = ' '
* I_CALLBACK_USER_COMMAND = ' '
* I_CALLBACK_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_END_OF_LIST = ' '
* I_STRUCTURE_NAME =
* I_BACKGROUND_ID = ' '
* I_GRID_TITLE =
* I_GRID_SETTINGS =
* IS_LAYOUT_LVC =
* IT_FIELDCAT_LVC =
* IT_EXCLUDING =
* IT_SPECIAL_GROUPS_LVC =
* IT_SORT_LVC =
* IT_FILTER_LVC =
* IT_HYPERLINK =
* IS_SEL_HIDE =
* I_DEFAULT = 'X'
* I_SAVE = ' '
* IS_VARIANT =
* IT_EVENTS =
* IT_EVENT_EXIT =
* IS_PRINT_LVC =
* IS_REPREP_ID_LVC =
* I_SCREEN_START_COLUMN = 0
* I_SCREEN_START_LINE = 0
* I_SCREEN_END_COLUMN = 0
* I_SCREEN_END_LINE = 0
* I_HTML_HEIGHT_TOP =
* I_HTML_HEIGHT_END =
* IT_ALV_GRAPHICS =
* IT_EXCEPT_QINFO_LVC =
* IR_SALV_FULLSCREEN_ADAPTER =
* IMPORTING
* E_EXIT_CAUSED_BY_CALLER =
* ES_EXIT_CAUSED_BY_USER =
TABLES
t_outtab =
* EXCEPTIONS
* PROGRAM_ERROR = 1
* OTHERS = 2
.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
EXPORTING
I_CALLBACK_PROGRAM : ALV返回程序,一般是原程序,可以写'SY-REPID',或者程序名
I_CALLBACK_PF_STATUS_SET:ALV的GUI状态
I_CALLBACK_USER_COMMAND:ALV的按钮功能
I_GRID_TITLE:ALV表头
IS_LAYOUT_LVC:ALV布局(等宽,对齐,是否有BOX等)
IT_FIELDCAT_LVC:ALV字段(ALV字段名,是否有前导零,字段颜色)
I_DEFAULT:ALV是否默认带出布局(设置为X则表示可以设置优先级)
I_SAVE:是否能保存变式(X:全部用户 U:仅针对特定用户 A:全部用户或特定用户)
TABLES
t_outtab:ALV最终输出数据
一般ALV就需要填写这些参数,下面来简单的写一个Demo程序
DATA:GT_FCAT TYPE LVC_T_FCAT,
GS_FCAT LIKE LINE OF GT_FCAT,
GT_LAYOUT TYPE TABLE OF LVC_S_LAYO,
GS_LAYOUT TYPE LVC_S_LAYO.
DATA:GT_ALV TYPE STANDARD TABLE OF SFLIGHT,
GS_ALV TYPE SFLIGHT.
"宏定义,用于快速设置ALV字段属性
DEFINE INIT_FIELDCAT.
CLEAR GS_FCAT.
GS_FCAT-FIELDNAME = &1.
GS_FCAT-COLTEXT = &2.
GS_FCAT-NO_ZERO = &3.
GS_FCAT-EMPHASIZE = &4.
APPEND GS_FCAT TO GT_FCAT.
END-OF-DEFINITION.
PARAMETERS: P_CARRID TYPE SFLIGHT-CARRID OBLIGATORY."OBLIGATORY为必输
START-OF-SELECTION.
PERFORM FRM_PROCESS_DATE."数据处理
PERFORM FRM_ALV_OUTPUT. "ALV显示设置
END-OF-SELECTION.
FORM ALV_PF_STATUS USING RT_EXTAB TYPE SLIS_T_EXTAB.
SET PF-STATUS 'ALV_TABLE_STANDARD'.
ENDFORM.
FORM USER_COMMAND USING R_UCOMM TYPE SLIS_T_EXTAB
RS_SELFIELD TYPE SLIS_SELFIELD.
ENDFORM.
FORM FRM_PROCESS_DATE.
SELECT *
FROM SFLIGHT
INTO TABLE GT_ALV.
ENDFORM.
FORM FRM_ALV_OUTPUT.
CLEAR:GS_LAYOUT.
GS_LAYOUT-CWIDTH_OPT = 'X'.
GS_LAYOUT-ZEBRA = 'X'.
INIT_FIELDCAT:
'CARRID' '航线' '' '',
'CONNID' '航班号' '' '',
'FLDATE' '日期' '' '',
'PRICE' '航空运费' '' '',
'CURRENCY' '航线货币' '' ''.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
* I_INTERFACE_CHECK = ' '
* I_BYPASSING_BUFFER =
* I_BUFFER_ACTIVE =
I_CALLBACK_PROGRAM = SY-REPID
I_CALLBACK_PF_STATUS_SET = 'ALV_PF_STATUS'
I_CALLBACK_USER_COMMAND = 'USER_COMMAND'
* I_CALLBACK_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_END_OF_LIST = ' '
* I_STRUCTURE_NAME =
* I_BACKGROUND_ID = ' '
* I_GRID_TITLE =
* I_GRID_SETTINGS =
IS_LAYOUT_LVC = GS_LAYOUT
IT_FIELDCAT_LVC = GT_FCAT[]
* IT_EXCLUDING =
* IT_SPECIAL_GROUPS_LVC =
* IT_SORT_LVC =
* IT_FILTER_LVC =
* IT_HYPERLINK =
* IS_SEL_HIDE =
I_DEFAULT = 'X'
I_SAVE = 'A'
* IS_VARIANT =
* IT_EVENTS =
* IT_EVENT_EXIT =
* IS_PRINT_LVC =
* IS_REPREP_ID_LVC =
* I_SCREEN_START_COLUMN = 0
* I_SCREEN_START_LINE = 0
* I_SCREEN_END_COLUMN = 0
* I_SCREEN_END_LINE = 0
* I_HTML_HEIGHT_TOP =
* I_HTML_HEIGHT_END =
* IT_ALV_GRAPHICS =
* IT_EXCEPT_QINFO_LVC =
* IR_SALV_FULLSCREEN_ADAPTER =
* IMPORTING
* E_EXIT_CAUSED_BY_CALLER =
* ES_EXIT_CAUSED_BY_USER =
TABLES
t_outtab = GT_ALV[]
* EXCEPTIONS
* PROGRAM_ERROR = 1
* OTHERS = 2
.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ENDFORM.
这个是一个简单的ALV的程序,不过这样的程序写着不快速。要想写一个ALV比较快的话,可以写一个SALV,这个就留到之后更新吧。