经常有用户来找我导出一些如成本中心、利润中心、科目等主数据给他们。给用户导出一次两次感觉还好,但要经常导出的话感觉还是很麻烦的。但也不方便把SE16N这个事务代码分配给用户。所以我稍稍琢磨了一下,开发了一个程序给用户实用,让用户可以自定导出他们所需要的主数据。
这个程序用到了动态选择屏幕、动态ALV的、动态SQL的高级ABAP编程技术,程序整体看起很简洁。我在这里记录一下,顺便分享给大家。这个程序代码直接copy就可以使用了。
程序界面界效果如下图:
屏幕的选择字段根据单选按钮变化而变化。
结果界面下面所示:
ALV会根据用户选择的数据表变化而变化
代码分享如下:
REPORT zse16n_view.
*&---------------------------------------------------------------------*
*& Report Z403_TEST11 *
*& *
*&---------------------------------------------------------------------*
TABLES: dd03l, ztvf01_log, csks , ska1 ,cepct.
"TYPE-POOLS slis.
FIELD-SYMBOLS: <fs_itab> TYPE STANDARD TABLE.
FIELD-SYMBOLS: <fs_itab_tmp> TYPE STANDARD TABLE.
DATA: itab_field TYPE slis_t_fieldcat_alv,
str_layout TYPE slis_layout_alv.
DATA: ref_itab TYPE REF TO data.
DATA : str_sql TYPE string.
DATA : pa_tab TYPE tabname VALUE 'ZTVF01_LOG' . "用户要查看的表
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
SELECT-OPTIONS: s_kostl FOR csks-kostl MODIF ID m1,
s_bukrs FOR csks-bukrs MODIF ID m1 .
SELECT-OPTIONS: s_saknr FOR ska1-saknr MODIF ID m2.
SELECT-OPTIONS: s_prctr FOR cepct-prctr MODIF ID m3.
" s_bukrs FOR SKA1-bukrs MODIF ID m2 .
SELECTION-SCREEN END OF BLOCK b1.
SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE text-003.
PARAMETERS: r1 RADIOBUTTON GROUP gr01 DEFAULT 'X' USER-COMMAND kk_01,
r2 RADIOBUTTON GROUP gr01,
r3 RADIOBUTTON GROUP gr01 . "利润中心
SELECTION-SCREEN END OF BLOCK b3.
AT SELECTION-SCREEN OUTPUT. " 动态选择界面
LOOP AT SCREEN.
IF screen-group1 IS NOT INITIAL.
CASE 'X'.
WHEN r1. "
IF 'M1 ' CS screen-group1.
else.
screen-active = 0.
ENDIF.
WHEN r2. "
IF 'M2' CS screen-group1.
else.
screen-active = 0.
ENDIF.
WHEN r3. "
IF 'M3' CS screen-group1.
else.
screen-active = 0.
ENDIF.
ENDCASE.
ENDIF.
MODIFY SCREEN.
ENDLOOP.
START-OF-SELECTION .
IF r1 = 'X'.
pa_tab = 'CSKS'. "成本中心主数据
str_sql = ' KOSTL IN s_KOSTL AND BUKRS IN s_BUKRS'.
ELSEIF r2 = 'X'.
pa_tab = 'SKA1'.
str_sql = ' KTOPL = 1000 AND SAKNR IN s_SAKNR'.
ELSEIF r3 = 'X'.
pa_tab = 'CEPCT'.
str_sql = ' SPRAS = 1 and KOKRS = 1000 AND PRCTR IN s_PRCTR'.
ENDIF.
CREATE DATA ref_itab TYPE TABLE OF (pa_tab). " 利用动态SQL语句来实现灵活查询
ASSIGN ref_itab->* TO <fs_itab>.
ASSIGN ref_itab->* TO <fs_itab_tmp>.
SELECT * "UP TO PA_LINE ROWS
INTO TABLE <fs_itab>
FROM (pa_tab)
WHERE (str_sql) .
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE' " 根据表结构构造ALV显示字段
EXPORTING
i_structure_name = pa_tab
CHANGING
ct_fieldcat = itab_field
EXCEPTIONS
inconsistent_interface = 0
program_error = 0
OTHERS = 0.
"DELETE ITAB_FIELD WHERE FIELDNAME NOT IN SO_FIELD.
"取部门定位
SELECT * INTO TABLE @DATA(it_zfi_cc_type) FROM zfi_cc_type WHERE zdelete = '' . " 自定义部门定位
SORT it_zfi_cc_type BY prctr.
FIELD-SYMBOLS : <fc> TYPE any.
str_layout-colwidth_optimize = 'X'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
is_layout = str_layout
it_fieldcat = itab_field
TABLES
t_outtab = <fs_itab_tmp>
EXCEPTIONS
program_error = 0
OTHERS = 0.