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

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

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ALV 中添加状态栏下拉框按钮的实现步骤如下: 1. 在函数模块中使用 FM REUSE_ALV_GRID_DISPLAY 调用 ALV 控件。 2. 在该函数模块中使用 FM REUSE_ALV_COMMENTARY_WRITE 向状态栏添加注释。 3. 在注释中添加 DROPDOWN_LIST ,并设置其属性和选项。 4. 在用户选择下拉列表选项时,处理用户选项并更新 ALV 数据。 以下是示例 ABAP 代码: ``` FUNCTION z_alv_dropdown. DATA: lt_fieldcat TYPE lvc_t_fcat, lt_layout TYPE lvc_s_layo, lt_sflight TYPE TABLE OF sflight, lt_ddl TYPE ddshretval. FIELD-SYMBOLS: <fs_sflight> TYPE sflight. *-- 1. 调用 ALV CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING i_callback_program = sy-repid i_callback_top_of_page = 'TOP-OF-PAGE' it_fieldcat = lt_fieldcat i_save = 'A' TABLES t_outtab = lt_sflight CHANGING it_layout = lt_layout. *-- 2. 添加注释和下拉框 CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE' EXPORTING it_list_commentary = VALUE #( ( comment = 'Select Status:' ) ) i_logo = ' ' i_logo2 = ' ' i_type = 'S' i_width = 20. CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE' EXPORTING it_list_commentary = VALUE #( ( comment = ' ' ) ) i_logo = ' ' i_logo2 = ' ' i_type = 'S' i_width = 20. CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE' EXPORTING it_list_commentary = VALUE #( ( comment = 'DROPDOWN_LIST' ) ) i_logo = ' ' i_logo2 = ' ' i_type = 'S' i_width = 20. *-- 3. 设置下拉框选项 CALL FUNCTION 'DD_DOMVALUES_GET' EXPORTING domname = 'STATUS' TABLES ddshretval = lt_ddl. *-- 4. 处理用户选项并更新数据 LOOP AT lt_sflight ASSIGNING <fs_sflight>. IF sy-tabix > lt_layout-top_lines. IF <fs_sflight>-carrid = 'LH'. <fs_sflight>-status = lt_ddl[ 1 ]-domvalue_l. ELSEIF <fs_sflight>-carrid = 'UA'. <fs_sflight>-status = lt_ddl[ 2 ]-domvalue_l. ELSE. <fs_sflight>-status = lt_ddl[ 3 ]-domvalue_l. ENDIF. ENDIF. ENDLOOP. ENDFUNCTION. ``` 在上述代码中,我们使用了 DD_DOMVALUES_GET 函数获取了一个名为 STATUS 的域的所有可能值,并将这些值添加到一个名为 lt_ddl 的内部表中。然后,我们在 ALV 状态栏中添加了一个下拉框,以显示这些选项。当用户选择下拉框中的选项时,我们处理用户选项并更新 ALV 数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值