实用ABAP程序分享(2):利用动态ALV、动态SQL语句实现类似SE16N的数据表查询程序

博主分享了一段ABAP代码,用于创建一个动态选择界面,让用户能根据需求导出成本中心、利润中心、科目等主数据。程序使用了动态选择屏幕、动态ALV及动态SQL技术,简化了频繁导出数据的繁琐过程,且不需分配SE16N事务代码给用户。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      经常有用户来找我导出一些如成本中心、利润中心、科目等主数据给他们。给用户导出一次两次感觉还好,但要经常导出的话感觉还是很麻烦的。但也不方便把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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值