abap 动态生成选择select-options

这个功能,还没想好在什么场景下使用,按需生成,的确好玩,以后有需求了,再好好改改

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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值