- 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' ) ).