• Select_Options的引用

在使用 SELECT_OPTIONS 组件时应先在程序内先引用 WDR_SELECT_OPTIONS 组件

在视图中创建 ViewContainerUIElement 控件

创建相应窗口,在 Properties 中,点击 Create Controller Usage 将组件引用过来,随后在相应窗口的视图的ViewContainerUIElement 控件下进行 嵌套视图 的操作。

Select options 由此引入到相应的窗口-视图-控件内,接下来要进行Select_Options的初始化。

为便捷操作,通常会在 COMPONENTCONTROLLER 中 Attributes 创建 IF_WD_SELECT_OPTIONS 和 IWCI_WDR_SELECT_OPTIONS 类型的 Attribute。此例中创建 M_HANDLER RefTo IF_WD_SELECT_OPTIONS 以及 M_WD_SELECT_OPTIONS RefTo IWCI_WDR_SELECT_OPTIONS。注意,记得勾选Public哦!

  • Select_Options的初始化
DATA: RT_RANGE_TABLE TYPE REF TO DATA,
  LV_TOOLTIP TYPE STRING VALUE 'SEARCH FOR ID',
  LR_CMP_USAGE TYPE REF TO IF_WD_COMPONENT_USAGE.
  LR_CMP_USAGE = WD_THIS->WD_CPUSE_SELECT_OPTIONS( ).
  
IF LR_CMP_USAGE->HAS_ACTIVE_COMPONENT( ) IS INITIAL.
  LR_CMP_USAGE->CREATE_COMPONENT( ).
ENDIF.

DATA: LR_VALUE TYPE REF TO DATA.            "用于设置初始值"
FIELD-SYMBOLS <VALUE> TYOE DATA.
DATA LV_VALUE TYPE STRING.

WD_THIS->M_WD_SELECT_OPTIONS = WD_THIS->WD_CPFIC_SELECT_OPTIONS( ).
WD_THIS->M_HANDLER = WD_THIS->M_WD_SELECT_OPTIONS->INIT_SELECTION_SCREEN( ).
WD_THIS->M_HANDLER->REMOVE_ALL_SEL_SCREEN_ITEMS( ). "用于清空选择界面上的全部元素,通常情况下可以不进行该操作"
****** 设置有 初始化值 的元素举例 ADD_PARAMETER_FIELD*******  
****** I_VALUE 为 DATA 类型,因此需要进行一下类型转换 使用 FIELD-SYMBOLS *******
SELECT SINGLE ZDOC_ID INTO LV_VALUE FROM YAST_LOG WHERE ZCZR = SY-UNAME.

CREATE DATA LR_VALUE TYPE ZDOC_ID.
ASSIGN LR_VALUE->* TO <VALUE>.
<VALUE> = LV_VALUE.

WD_THIS->M_HANDLER->ADD_PARAMETER_FIELD(
  I_ID = 'S_ID'   "自定义元素名称  后续获取数值时会用到"
  I_DESCRIPTION = '文档分类'
  I_VALUE = LR_VALUE    "通常情况下不用"
  I_TOOLTIP = LV_TOOLTIP
  I_AS_DROPDOWN = ABAP_TRUE    "设置是否为下拉列表形式"
  I_VALUE_HELP_TYPE = IF_WD_VALUE_HELP_HANDLER=>CO_PREFIX_SEARCHHELP
"其他详细PARAMETER可以通过 ADD_PARAMETER_FIELD 查看"
).

*****设置 常用 选择屏幕元素 *****
RT_RANGE_TABLE = WD_THIS->M_HANDLER->CREATE_RANGE_TABLE( I_TYPENAME = 'ZDOC_PXH' )."类型"
WD_THIS->M_HANDLER->ADD_SELECTION_FIELD(
  I_ID = 'S_PXH'
  I_DESCRIPTION = '文档号'
  I_OBLIGATORY = ABAP_FALSE
  IT_RESULT = RT_RANGE_TABLE
  I_TOOLTIP = LV_TOOLTIP
  I_VALUE_HELP_TYPE = IF_WD_VALUE_HELP_HANDLER=>CO_PREFIX_SEARCHHELP
).

***** 隐藏 一堆 乱七八糟的 按钮 *****
WD_THIS->M_HANDLER->SET_GLOBAL_OPTIONS(
  I_DISPLAY_BTN_CANCEL = ABAP_FALSE
  I_DISPLAY_BTN_CHECK = ABAP_FALSE
  I_DISPLAY_BTN_RESET = ABAP_FALSE
  I_DISPLAY_BTN_EXECUTE = ABAP_FALSE
  ).
  • Select_Options的获取界面输入数据
***** 对应的两种取值 *****

DATA: RT_RANGE_TABLE TYPE REF TO DATA,
  P_ID TYPE REF TO ZDOC_ID,
  LR_PXH TYPE RANGE OF ZDOC_PXH,
  LS_PXH LIKE LINE OF LR_PXH.
DATA: GDY_LINE TYPE REF TO DATA.
FIELD-SYMBOLS: <GDYN_TABLE> TYPE STANDARD TABLE,
  <GDYN_LINE> TYPE ANY.
***** ADD_PARAMETER_FIELD *****
P_ID ?= WD_THIS->M_HANDLER->GET_VALUE_OF_PARAMETER_FIELD( I_ID = 'S_ID' ).
LS_ID-OPTION = 'EQ'.
LS_ID-SIGN = 'I'.
LS_ID-LOW = P_ID->*.
APPEND LS_ID TO LR_ID.
***** ADD_SELECTION_FIELD *****
RT_RANGE_TABLE = WD_THIS->M_HANDLER->GET_RANGE_TABLE_OF_SEL_FIELD( I_ID = 'S_PXH' ).
IF RT_RANGE_TABLE IS NOT INITIAL.
  ASSIGN RT_RANGE_TABLE->* TO <GDYN_TABLE>.
  CREATE DATA GDY_LINE LIKE LINE OF <GDYN_TABLE>.
  ASSIGN GDY_LINE->* TO <GDYN_LINE>.
  LOOP AT <GDYN_TABLE> ASSIGNING <GDYN_LINE>.
    MOVE <GDYN_LINE> TO LS_PXH.
    APPEND LS_PXH TO LR_PXH.
    CLEAR LS_PXH.
  ENDLOOP.
ENDIF.

当然,通常情况下,选择屏幕不止一个 SELECT-OPTIONS ,所以可以通过 FIELD-SYMBOLS 的方式巧妙的封装一下。

CRD_TT_BP_RANGE_WD & CRD_S_BP_RANGE_WD  比较好用的 RANGE 表类型和 RANGE 结构。

通常情况下,SELECT-OPTIONS会在很多地方使用,所以会将相应的R_RANGE设置成为全局RANGE,不然的话,也可以省略 LOOP 等一系列步骤,在 SELECT  时,可以直接

SELECT ... FROM ... INTO ... WHERE .... IN <GDYN_TABLE>.

**************************************************************
入参 出参的设置   METHOD 上方 ·

I_DATA IMPORTING REFTO DATA
R_RANGE RETURNING CRD_TT_BP_RANGE_WD        "RANGETABLE FOR BP"
**************************************************************

METHOD OBJECT_TO_RANGE.
  FIELD-SYMBOLS: <GDYN_TABLE> TYPE STANDARD TABLE,
    <GDYN_LINE> TYPE ANY.
  DATA WA_AREA TYPE CRD_S_BP_RANGE_WD.     "RANGESTRUCTURE FOR BP"
  IF I_DATA IS NOT INITIAL.
    ASSIGN I_DATA->* TO <GDYN_TABLE>.
    LOOP AT <GDYN_TABLE> ASSIGNING <GDYN_LINE>.
      MOVE <GDYN_LINE> TO WA_AREA.
      APPEND WA_AREA TO R_RANGE.
      CLEAR WA_AREA.
    ENDLOOP.
  ENDIF.
ENDMETHOD.
***** 调用时 ******
WD_COMP_CONTROLLER->OBJECT_TO_RANGE( WD_COMP_CONTROLLER->M_HANDLER->GET_RANGE_TABLE_OF_SEL_FIELD( I_ID = 'S_PXH' ) ).