繁体   English   中英

如何更改 FM 'FREE_SELECTIONS_INIT' 事件的值

[英]How to change values on events of FM 'FREE_SELECTIONS_INIT'

我创建了一些动态选择选项。 在我的桌子上,我希望有一个预定义且不可更改的参数 User 我在事件上使用回调表单所做的不可更改:

data: LS_EVENTS type RSDSEVENTS,
    LT_EVENTS type standard table of RSDSEVENTS.

LS_EVENTS-EVENT = 'O'. "at selection screen output §§§
LS_EVENTS-PROG = SY-REPID.
LS_EVENTS-FORM = 'AT_SELECTION_SCREEN_OUT'.
append LS_EVENTS to LT_EVENTS.

call function 'FREE_SELECTIONS_INIT'
 exporting
  KIND                     = 'F' "
importing
  SELECTION_ID             = GV_SELECTION_ID
tables
  TABLES_TAB               = GT_TABLE
  FIELDS_TAB               = GT_FIELDSTAB
  EVENTS                   = LT_EVENTS

exceptions
 ...
  others                   = 20.

现在回调表单如下所示:

form AT_SELECTION_SCREEN_OUT tables
      LT_RSSELDYN "selections
      LT_RSFLDNUM. "dynpro info

  field-symbols <FS_LINE> type ANY.
  field-symbols <FS_FIELD> type ANY.


  read table LT_RSFLDNUM  assigning <FS_LINE> with key
  ('TABLENAME') = 'MyTab' ('FIELDNAME') = 'MyField' .
  if <FS_LINE> is assigned.
    assign component 'GROUP1' of structure <FS_LINE> to <FS_FIELD>.
    if <FS_FIELD> is assigned. "Group1 ausgelesen
      loop at screen.
        if SCREEN-GROUP1 = <FS_FIELD>.
          "Eingabe deaktiviert
          SCREEN-INPUT = '0'.
          "Ausblenden unnötiger Felder
          if SCREEN-GROUP3 = 'TOT'
             or SCREEN-GROUP3 = 'HGH'
             or SCREEN-GROUP3 = 'VPU'.
            SCREEN-INVISIBLE = 1.
          endif.
          modify screen."änderungen auf Screen speichern
        endif.
      endloop.
    endif.
  endif.
  unassign: <FS_FIELD>, <FS_LINE>.

那行得通。 它将正确的值设置为不可更改。 在第一个表中,正如文档所说,当前值被保存。 但是如果我改变它们,那是行不通的。

  read table LT_RSSELDYN  assigning <FS_LINE> with key
  ('TABLENAME') = 'MyTab' ('FIELDNAME') = 'MyField' .
  if <FS_LINE> is assigned.
    "<>-low = 'MyValue', <>-sign = 'I', <>-option = 'EQ'
    assign component 'LOW' of structure <FS_LINE> to <FS_FIELD>.
    if <FS_FIELD> is assigned.
      <FS_FIELD> = 'MyValue'.
    endif.
    unassign <FS_FIELD>.

    assign component 'SIGN' of structure <FS_LINE> to <FS_FIELD>.
    if <FS_FIELD> is assigned.
      <FS_FIELD> = 'I'.
    endif.
    unassign <FS_FIELD>.

    assign component 'OPTION' of structure <FS_LINE> to <FS_FIELD>.
    if <FS_FIELD> is assigned.
      <FS_FIELD> = 'EQ'.
    endif.
    unassign <FS_FIELD>. 

  endif.
  unassign: <FS_FIELD>, <FS_LINE>.

endform.

是否有可能限制这些值的更改? 如果它们在那里,我只希望它们显示在 Selectoptions 中。

作为一个选项,您可以隐藏不想被用户更改的字段,然后手动填充表达式和位置选项卡。 对于此tabfields_not_display参数存在。

  DATA: table                      TYPE string,
        ev_expressions             TYPE rsds_texpr,
        ev_field_ranges            TYPE rsds_trange,
        ev_number_of_active_fields LIKE sy-tfill,
        lt_field_tab               TYPE TABLE OF rsdsfields,
        lt_tabfields_not_display   TYPE TABLE OF rsdsfields.

  DATA: table_tab TYPE TABLE OF rsdstabs,
        selid     TYPE  rsdynsel-selid,
        cond_tab  TYPE rsds_twhere.

  table = 'USR02'.

  table_tab = VALUE #( ( prim_tab = table ) ).

  APPEND VALUE rsdsfields( tablename = 'USR02' fieldname = 'BNAME' ) TO lt_tabfields_not_display.
  APPEND VALUE rsdsfields( tablename = 'USR02' fieldname = 'GLTGV' ) TO lt_tabfields_not_display.

  CALL FUNCTION 'FREE_SELECTIONS_INIT'
    EXPORTING
      kind                  = 'T'
    IMPORTING
      selection_id          = selid
    TABLES
      tables_tab            = table_tab
      tabfields_not_display = lt_tabfields_not_display
    EXCEPTIONS
      OTHERS                = 4.

  CALL FUNCTION 'FREE_SELECTIONS_DIALOG'
    EXPORTING
      selection_id            = selid
      title                   = 'Free Selection'
      as_window               = ' '
    IMPORTING
      where_clauses           = cond_tab
      expressions             = ev_expressions
      field_ranges            = ev_field_ranges
      number_of_active_fields = ev_number_of_active_fields
    TABLES
      fields_tab              = lt_field_tab
    EXCEPTIONS
      OTHERS                  = 4.

  APPEND VALUE rsds_expr( tablename = table
                          expr_tab = VALUE rsds_expr_tab(
                          ( logop = 'AND' arity = '2' )
                          ( arity = '0' fieldname = 'BNAME' option = 'EQ' low = 'my_user' )
                          ( arity = '0' fieldname = 'GLTGV' option = 'EQ' low = '20190503' ) )
                         ) TO ev_expressions.

  APPEND VALUE rsds_where( tablename = table
                          where_tab = VALUE rsds_where_tab(
                          ( line = `    ( BNAME EQ          'my_user'  ) ` )
                          ( line = ` AND ( GLTGV EQ         '20190503' )  `  ) )
                         ) TO cond_tab.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM