ABAP 动态控制选择屏幕 / Free Selection

43 篇文章 7 订阅

常规实现方式:

        1. 动态控制属性,使用如下语句代码控制。

        2. 标准模块实现的free selection

        3. 结合逻辑数据库的动态选择屏幕

具体实现:

        第一种大致通过如下代码实现

AT SELECTION-SCREEN OUTPUT.
  LOOP AT SCREEN.

  ENDLOOP.

        第三种结合逻辑数据库,自定义逻辑数据库场景稀见,这里主要说明第二种        

        SAP 提供了function FREE_SELECTIONS_INIT和FREE_SELECTIONS_DIALOG来实现基于用户自由调整的选择屏幕。

demo实现效果如下:

        执行程序页面如下

        点击新字段选择可自由添加旋转屏幕字段

         执行输出结果        

Demo代码:

DATA: where_clauses           TYPE rsds_twhere,
      expressions             TYPE rsds_texpr,
      field_ranges            TYPE rsds_trange,
      number_of_active_fields TYPE sy-tfill,
      tables_tab              TYPE STANDARD TABLE OF rsdstabs,
      tabfields_not_display   TYPE STANDARD TABLE OF rsdsfields,
      fields_tab              TYPE STANDARD TABLE OF rsdsfields,
      field_desc              TYPE STANDARD TABLE OF fldconvert,
      field_texts             TYPE STANDARD TABLE OF rsdstexts,
      events                  TYPE STANDARD TABLE OF rsdsevents,
      event_fields            TYPE STANDARD TABLE OF rsdsevflds,
      fields_not_selected     TYPE STANDARD TABLE OF rsdsfields,
      no_int_check            TYPE STANDARD TABLE OF rsdstabs,
      alv_qinfo               TYPE STANDARD TABLE OF lvc_s_qinf,
      selection_id            TYPE rsdynsel-selid.


DATA: dbtab TYPE string VALUE 'T001',
      dref  TYPE REF TO data.

FIELD-SYMBOLS: <table> TYPE STANDARD TABLE,
               <where> LIKE LINE OF where_clauses.

TRY.
    DATA(checked_dbtab) = cl_abap_dyn_prg=>check_table_name_str(
                    val = dbtab
                    packages = 'FBZCORE' ).

  CATCH cx_abap_not_a_table.
    MESSAGE 'Database table not found' TYPE 'I' DISPLAY LIKE 'E'.
    LEAVE PROGRAM.
  CATCH cx_abap_not_in_package.
    MESSAGE 'Only tables from the flight data model are allowed'
             TYPE 'I' DISPLAY LIKE 'E'.
    LEAVE PROGRAM.
ENDTRY.

tables_tab = VALUE #( ( prim_tab = checked_dbtab ) ).

fields_tab = VALUE #( ( tablename = 'T001' fieldname = 'BUKRS' ) ).

CALL FUNCTION 'FREE_SELECTIONS_INIT'
  EXPORTING
    kind                     = 'T'
*    FIELD_RANGES_INT         = " 选择屏幕初始值
  IMPORTING
    selection_id             = selection_id
  TABLES
    tables_tab               = tables_tab "如果kind为T,则定义选择屏幕字段来源表
    tabfields_not_display    = tabfields_not_display
    fields_tab               = fields_tab"如果kind为T,则为默认选择字段,为F则为可选选择字段清单
    field_desc               = field_desc
    field_texts              = field_texts
    events                   = events " 选择屏幕事件进行逻辑处理
    event_fields             = event_fields
    fields_not_selected      = fields_not_selected
    no_int_check             = no_int_check
    alv_qinfo                = alv_qinfo
  EXCEPTIONS
    fields_incomplete        = 1
    fields_no_join           = 2
    field_not_found          = 3
    no_tables                = 4
    table_not_found          = 5
    expression_not_supported = 6
    incorrect_expression     = 7
    illegal_kind             = 8
    area_not_found           = 9
    inconsistent_area        = 10
    kind_f_no_fields_left    = 11
    kind_f_no_fields         = 12
    too_many_fields          = 13
    dup_field                = 14
    field_no_type            = 15
    field_ill_type           = 16
    dup_event_field          = 17
    node_not_in_ldb          = 18
    area_no_field            = 19
    OTHERS                   = 20.
IF sy-subrc <> 0.
  MESSAGE 'Error in initialization' TYPE 'I' DISPLAY LIKE 'E'.
  LEAVE PROGRAM.
ENDIF.

CALL FUNCTION 'FREE_SELECTIONS_DIALOG'
  EXPORTING
    selection_id  = selection_id
    title         = 'Free Selection'
    status        = '1' "选择屏幕状态
    as_window     = ' ' " 是否弹窗
    tree_visible  = ' ' "选择树是否可见
  IMPORTING
    where_clauses = where_clauses"选择屏幕返回的选择条件,自动处理的where条件表,可直接使用
  TABLES
    fields_tab    = fields_tab
  EXCEPTIONS
    internal_error  = 1
    no_action       = 2
    selid_not_found = 3
    illegal_status  = 4
    OTHERS          = 5.
IF sy-subrc <> 0.
  MESSAGE 'No free selection created' TYPE 'I'.
  LEAVE PROGRAM.
ENDIF.

START-OF-SELECTION.

  ASSIGN where_clauses[ tablename = checked_dbtab ] TO <where>.

  CREATE DATA dref TYPE TABLE OF (checked_dbtab).
  ASSIGN dref->* TO <table>.

  TRY.
      IF <where> IS ASSIGNED AND <where>-where_tab IS NOT INITIAL.
        SELECT *
          FROM (checked_dbtab)
          WHERE (<where>-where_tab)
          INTO TABLE @<table>.
      ELSE.
        SELECT *
          FROM (checked_dbtab)
          INTO TABLE @<table>.
      ENDIF.
    CATCH cx_sy_dynamic_osql_error.
      MESSAGE 'Error in dynamic Open SQL' TYPE 'I' DISPLAY LIKE 'E'.
      LEAVE PROGRAM.
  ENDTRY.

  TRY.
      cl_salv_table=>factory(
        IMPORTING r_salv_table = DATA(alv)
        CHANGING  t_table      = <table> ).
      alv->display( ).
    CATCH cx_salv_msg.
      MESSAGE 'Error in ALV display' TYPE 'I' DISPLAY LIKE 'E'.
  ENDTRY.

简介:

        1. 可弹窗,可一般选择屏幕效果

        2. 根据表自动带出所需选择字段(可多表,可排除部分字段)

        3. 可自定义字段清单,灵活组合

        4. 可设置选择屏幕字段默认值

        5. 可填充选择屏幕逻辑流事件逻辑

 应用场景:

        1. 取值表中字段均为选择屏幕字段,实现如demo即可

        2. 程序执行过程中需要弹窗交互输入筛选条件,FREE_SELECTIONS_DIALOG 中参数as_window设置为'X'且status设置为0即可

        3. 选择屏幕字段过多,构成可选字段池,允许用户自由选择所需字段,通过参数FREE_SELECTIONS_INIT中参数kind = 'F' 表参数中field_tab实现

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值