WDA學習(6):Component Usage(Select Options)
1.6 Component Usage(Select Options)
本例項如何使用Component元件SELECT_OPTIONS。在實際應用都是多個Web Dynpro Component組成的。可以直接在之前基礎上操作,也可以新建一個專案。
1.Web Dynpro Component:Z_TEST_WDA2建立Component Use。
選擇FLIGHTLISTVIEW檢視元件,點選Create Controller Usage
選擇Component Use為SELECT_OPTIONS的
修改Context頁籤
建立FLIGHT上下文節點,
修改Attributes頁籤
建立變數M_HANDLER,型別:IF_WD_SELECT_OPTIONS;
建立變數M_WD_SELECT_OPTIONS,型別:IWCI_WDR_SELECT_OPTIONS;
修改Layout頁籤
建立GROUP型別檢視控制元件GROUP3;
建立ViewContianerUIElement型別檢視控制元件,這個控制元件可以用來顯示Compnent元件的檢視View。這裡用來顯示SELECTION_OPTION。
建立BUTTON按鈕型別檢視控制元件BTN1,點選按鈕獲取SELECTION_OPTION值,根據條件查詢flight。Action:FIND,自動生成Method:ONACTIONFIND方法。
建立TABLE型別檢視控制元件TABLE1,顯示查詢出來的flight資訊。
右鍵TABLE1控制元件->Creat Binding
修改Methods頁籤,
重寫WDDOINIT方法,初始化SELECT_OPTIONS。
method WDDOINIT . data:lt_range_table type ref to data, rt_range_table type ref to data, read_only type abap_bool, typename type string. data:lr_componentcontroller type ref to ig_componentcontroller, l_ref_cmp_usage type ref to if_wd_component_usage.View Code* create the used component l_ref_cmp_usage = wd_this->wd_cpuse_select_options( ). if l_ref_cmp_usage->has_active_component( ) is initial. l_ref_cmp_usage->create_component( ). endif. * get a pointer to the interface controller of the select options *component wd_this->m_wd_select_options = wd_this->wd_cpifc_select_options( ). * init the select screen wd_this->m_handler = wd_this->m_wd_select_options->init_selection_screen( ). * create a range table that consists of this new data element lt_range_table = wd_this->m_handler->create_range_table( i_typename = 'S_CARR_ID' ). * add a new field to the selection wd_this->m_handler->add_selection_field( i_id = 'S_CARR_ID' it_result = lt_range_table i_read_only = read_only ). * create a range table that consists of this new data element lt_range_table = wd_this->m_handler->create_range_table( i_typename = 'S_CONN_ID' ). * add a new field to the selection wd_this->m_handler->add_selection_field( i_id = 'S_CONN_ID' it_result = lt_range_table i_read_only = read_only ). endmethod.
重寫ONACTIONFIND方法,通過獲取SELECT_OPTIONS值,作為條件查詢flight資訊。
method ONACTIONFIND . data: node_flights type ref to if_wd_context_node. data: rt_carrid type ref to data. data: rt_connid type ref to data. data: t_flight type table of sflight. field-symbols: <fs_carrid> type table, <fs_connid> type table. * Retrieve the data from the select option rt_carrid = wd_this->m_handler->get_range_table_of_sel_field( i_id = 'S_CARR_ID' ). * Assign it to a field symbol assign rt_carrid->* to <fs_carrid>. * Retrieve the data from the select option rt_connid = wd_this->m_handler->get_range_table_of_sel_field( i_id = 'S_CONN_ID' ). * Assign it to a field symbol assign rt_connid->* to <fs_connid>. * Retrieve that data from the database. Normally it is suggested to * encapsulate the data retrieval in a separate class. * For simplicity, the SELECT statement has been implemented here. select * into corresponding fields of table t_flight from sflight where carrid in <fs_carrid> and connid in <fs_connid>. * Bind the data to the context node_flights = wd_context->get_child_node( name = `FLIGHT` ). node_flights->bind_elements( t_flight ). endmethod.View Code
2.設定Window,將SELECTION_OPTION元件檢視放入VIEW1
選擇點選F4幫助小方塊,找到SELECT_OPTIONS的VIEW螢幕
3.執行Web Dynpro Application,使用Selection options,點選find按鈕。
Select Options元件詳解
Select Options對應介面IF_WD_SELECT_OPTIONS物件select_handler,通過這個物件配置操作Select Options。
1.獲取IF_WD_SELECT_OPTIONS介面對應物件;
初始化component元件
data:lr_componentcontroller type ref to ig_componentcontroller, l_ref_cmp_usage type ref to if_wd_component_usage. * create the used component l_ref_cmp_usage = wd_this->wd_cpuse_select_options( ). if l_ref_cmp_usage->has_active_component( ) is initial. l_ref_cmp_usage->create_component( ). endif.
獲取IF_WD_SELECT_OPTIONS介面對應物件wd_this->m_handler;
* get a pointer to the interface controller of the select options *component wd_this->m_wd_select_options = wd_this->wd_cpifc_select_options( ). * init the select screen wd_this->m_handler = wd_this->m_wd_select_options->init_selection_screen( ).
2. IF_WD_SELECT_OPTIONS介面方法;
ADD_SELECTION_FIELD方法:新增select引數;
ADD_SELECTION_FIELDS方法:新增多個select引數;
GET_SELECTION_FIELD方法:獲取select引數;
GET_SELECTION_FIELDS方法:獲取select引數;
UPD_SELECTION_FIELD方法:更新select;
RESET_ALL_SELECTION_FIELDS方法:重置所有select引數;
RESET_SELECTION_FIELD方法:重置指定id的select引數;
CHECK_ALL_SELECTION_FIELDS方法:check所有select引數;
引數:
I_ID:select引數唯一識別標誌;
I_DESCRIPTION:select引數描述;
I_WITHIN_BLOCK:ID of Enclosing Block;
I_IS_AUTO_DESCRIPTION:是否自動描述,預設為True;
IT_RESULT:結果內表,用來儲存使用者選擇值,這個引數必須有;
I_OBLIGATORY:是否必輸,預設為False;
I_VALUE_HELP_TYPE:指定help型別,
IF_WD_VALUE_HELP_HANDLER=>CO_PREFIX_SEARCHHELP;
IF_WD_VALUE_HELP_HANDLER=>CO_PREFIX_OVS,OVS幫助型別;
IF_WD_VALUE_HELP_HANDLER=>CO_PREFIX_APPLDEV;
IF_WD_VALUE_HELP_HANDLER=>CO_PREFIX_AUTO;
IF_WD_VALUE_HELP_HANDLER=>CO_PREFIX_NONE;
IF_WD_VALUE_HELP_HANDLER=>CO_VH_TYPE_NO_HELP,no input help;
IF_WD_VALUE_HELP_HANDLER=>CO_VH_TYPE_BACKEND,型別DDIC、QVS;
IF_WD_VALUE_HELP_HANDLER=>CO_VH_TYPE_CLOCK,型別時鐘;
IF_WD_VALUE_HELP_HANDLER=>CO_VH_TYPE_CALENDAR,型別日曆;
IF_WD_VALUE_HELP_HANDLER=>CO_VH_TYPE_VALUESET,值集;
I_VALUE_HELP_ID:help幫助唯一標識;
I_VALUE_HELP_MODE:help幫助模式,
I_VALUE_HELP_STRUCTURE:f4 help幫助對應table;
I_VALUE_HELP_STRUCTURE_FIELD:f4 help幫助對應欄位;
I_HELP_REQUEST_HANDLER:handler for f4 help;
I_LOWER_CASE:是否允許小寫;
I_MEMORY_ID:Memory ID for Default Value;
I_NO_EXTENSION:No Multiple Selection,預設為False;
I_NO_INTERVALS: No Intervals (Single Values Only),預設為False;
I_AS_CHECKBOX:顯示為check box;
I_AS_DROPDOWN:顯示為下拉選擇;
IT_VALUE_SET:下拉選擇值內表,型別WDY_KEY_VALUE_TABLE,注意這是一個有序且key值唯一的內表;
I_READ_ONLY:是否只讀,預設False;
I_DONT_CARE_VALUE:忽略的初始值表;
I_EXPLANATION: Explanation;
I_TOOLTIP: Quick Info;
I_IS_NULLABLE:是否允許空值;
I_FORMAT_PROPERTIES:引數格式;
CREATE_RANGE_TABLE方法:建立Range Table
GET_RANGE_TABLE_OF_SEL_FIELD方法: 返回結果Range Table,選擇的select值內表;
SET_RANGE_TABLE_OF_SEL_FIELD:設定結果Range Table,select內表,可以用來重置結果表;
ADD_PARAMETER_FIELD方法:新增Parameter;
ADD_PARAMETER_FIELDS方法:新增多個Parameter;
GET_PARAMETER_FIELD方法:獲取Parameter;
GET_PARAMETER_FIELDS方法:獲取Parameter;
SET_VALUE_OF_PARAMETER_FIELD方法:設定parameter值;
GET_VALUE_OF_PARAMETER_FIELD方法:獲取parameter值;
RESET_PARAMETER_FIELD方法:重置Parameter值;
RESET_ALL_PARAMETER_FIELDS方法:重置所有Parameter值;
CHECK_ALL_PARAMETER_FIELD方法:Check所有Parameter值;
引數:
I_VALUE:Parameter值;
ADD_HORIZONTAL_DIVIDER方法:新增水平線;
ADD_HORIZONTAL_DIVIDERS方法:新增多個水平線;
GET_HORIZONTAL_DIVIDER方法:獲取水平線;
GET_HORIZONTAL_DIVIDERS方法:獲取水平線;
引數:
I_ID:唯一標識;
I_WITHIN_BLOCK:ID of Enclosing Block;
ADD_TEXT_LINE方法:新增文字線;
ADD_TEXT_LINES方法:新增多個文字線;
GET_TEXT_LINE方法;
GET_TEXT_LINES方法;
I_ID:唯一標識
I_WITHIN_BLOCK:ID of Enclosing Block;
I_TEXT:文字;
I_DESIGN:預設CL_WD_TEXT_VIEW=>E_DESIGN-STANDARD
IT_TEXT_LINES方法:新增多個文字線;
ADD_BLOCK方法:新增塊;
ADD_BLOCKS方法:新增多個塊;
GET_BLOCK方法;
GET_BLOCKS方法;
I_ID:唯一標識;
I_WITHIN_BLOCK:ID of Enclosing Block;
I_BLOCK_TYPE:預設MC_BLOCK_TYPE_GROUP;
I_TITLE:Block標題;
I_HIDE_IF_EMPTY:是否隱藏,如果block為空,預設False;
I_WIDTH:預設’100%’;
I_STRETCHED_HORIZONTALLY:預設為True;
ADD_SELECTION_SCREEN_ITEM方法:新增slection screen;
ADD_SELECTION_SCREEN_ITEMS方法;
GET_SELECTION_SCREEN_ITEM方法;
GET_SELECTION_SCREEN_ITEMS方法;
REMOVE_SELECTION_SCREEN_ITEM方法;
REMOVE_ALL_SEL_SCREEN_ITEMS方法;
CHECK_SELECTION_SCREEN方法;
SET_GLOBAL_OPTIONS方法:設定全域性功能;
引數:
I_DISPLAY_BTN_CANCEL:是否顯示Cancel按鈕;
I_DISPLAY_BTN_CHECK:是否顯示Check按鈕;
I_DISPLAY_BTN_RESET:是否顯示Reset按鈕;
I_DISPLAY_BTN_EXECUTE:是否顯示Execute按鈕;
3.建立Select option,下拉選擇框,Parameter,Checkbox等;
示例程式碼:
DATA:lt_range_table type ref to data. "建立range table lt_range_table = wd_this->m_handler->create_range_table( i_typename = 'S_CARR_ID' ). "建立select option wd_this->m_handler->add_selection_field( i_id = 'ID_CARR_ID' "id i_description = '航班ID' "描述 it_result = lt_range_table "結果內表 i_obligatory = abap_true "是否必輸 i_value_help_structure = 'SFLIGHT' "help表結構 i_value_help_structure_field = 'CARRID' "help航班欄位 ). "下拉選擇內表 DATA:lt_value_set TYPE wdy_key_value_table. DATA:ls_value_set LIKE LINE OF lt_value_set. "下拉值 ls_value_set-key = '0002'. ls_value_set-value = '0002'. APPEND ls_value_set TO lt_value_set. ls_value_set-key = '0005'. ls_value_set-value = '0005'. APPEND ls_value_set TO lt_value_set. ls_value_set-key = '0017'. ls_value_set-value = '0017'. APPEND ls_value_set TO lt_value_set. ls_value_set-key = '0555'. ls_value_set-value = '0555'. APPEND ls_value_set TO lt_value_set. "建立range table lt_range_table = wd_this->m_handler->create_range_table( i_typename = 'S_CONN_ID' ). "建立dropdown wd_this->m_handler->add_selection_field( i_id = 'ID_CONN_ID' i_description = 'Conn. ID' it_result = lt_range_table i_as_dropdown = abap_true it_value_set = lt_value_set i_read_only = abap_false ). "設定預設下拉預設值 TYPES:BEGIN OF s_range_default, sign TYPE char1, option TYPE char2, low TYPE S_CONN_ID, high TYPE S_CONN_ID, END OF s_range_default. FIELD-SYMBOLS:<fs_default> TYPE TABLE. DATA:lt_default TYPE REF TO DATA. DATA:wa_default TYPE s_range_default. "設定預設值 CREATE DATA lt_default TYPE TABLE OF s_range_default. ASSIGN lt_default->* TO <fs_default>. wa_default-low = '0002'. wa_default-option = 'EQ'. wa_default-sign = 'I'. APPEND wa_default TO <fs_default>. wd_this->m_handler->SET_RANGE_TABLE_OF_SEL_FIELD( I_ID = 'ID_CONN_ID' IT_RANGE_TABLE = lt_default ). "建立select option,no interval,no extension "PLANETYPE lt_range_table = wd_this->m_handler->create_range_table( i_typename = 'S_PLANETYE' ). wd_this->m_handler->add_selection_field( i_id = 'ID_PLANETYE' i_description = 'Plane type' it_result = lt_range_table i_read_only = abap_false i_no_extension = abap_true "是否多值輸入 i_no_intervals = abap_true "是否範圍輸入 i_value_help_structure = 'SFLIGHT' "help表結構 i_value_help_structure_field = 'PLANETYPE' "help欄位 ). "建立range table lt_range_table = wd_this->m_handler->create_range_table( i_typename = 'CHAR1' ). "建立checkbox wd_this->m_handler->add_selection_field( i_id = 'ID_CHECK' i_description = 'YES/NO' it_result = lt_range_table i_as_checkbox = abap_true ). DATA:lr_value TYPE REF TO DATA. CREATE DATA lr_value TYPE SFLIGHT-FLDATE. lt_range_table = wd_this->m_handler->create_range_table( i_typename = 'S_DATE' ). "建立Parameter,日期 wd_this->m_handler->add_parameter_field( i_id = 'ID_FLDATE' i_description = 'Flight Date' i_value_help_structure = 'SFLIGHT' i_value_help_structure_field = 'FLDATE' i_value = lr_value ). "建立橫線 wd_this->m_handler->add_horizontal_divider( i_id = 'ID_DIV1' ). "建立text line wd_this->m_handler->add_text_line( i_id = 'ID_TEXT_L1' i_text = 'text text text text text text text text' i_design = CL_WD_TEXT_VIEW=>E_DESIGN-HEADER1 ). "建立block "type:mc_block_type_group;mc_block_type_tray;mc_block_type_transp_container wd_this->m_handler->add_block( i_id = 'ID_BLK1' i_block_type = if_wd_select_options=>mc_block_type_group i_title = 'BLOCK1' i_hide_if_empty = abap_false i_width = '100%' i_stretched_horizontally = abap_true ). "Set the Global options "是否顯示cancel,check,reset,execute按鈕 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 ).View Code
4.點選find按鈕時,onactionfind方法,獲取選擇值;
示例程式碼:
data: node_flights type ref to if_wd_context_node. data: rt_table type ref to data. data: lv_fldate TYPE REF TO data. data: t_flight TYPE TABLE OF sflight. field-symbols: <fs_carrid> type table, <fs_connid> type table, <fs_planetype> TYPE table, <fs_fldate> TYPE SFLIGHT-FLDATE, <fs_value> TYPE table. "獲取carrid rt_table = wd_this->m_handler->get_range_table_of_sel_field( i_id = 'ID_CARR_ID' ). assign rt_table->* to <fs_carrid>. "獲取connid rt_table = wd_this->m_handler->get_range_table_of_sel_field( i_id = 'ID_CONN_ID' ). assign rt_table->* to <fs_connid>. "獲取planetype rt_table = wd_this->m_handler->get_range_table_of_sel_field( i_id = 'ID_PLANETYE' ). assign rt_table->* to <fs_planetype>. "獲取fldate,paramter獲取方式 lv_fldate = wd_this->m_handler->get_value_of_parameter_field( i_id = 'ID_FLDATE'). IF lv_fldate IS INITIAL. DATA:lv_date TYPE D. lv_date = sy-datum. GET REFERENCE OF lv_date INTO lv_fldate. assign lv_fldate->* to <fs_fldate>. ELSE. assign lv_fldate->* to <fs_fldate>. ENDIF. "獲取check box值 rt_table = wd_this->m_handler->get_range_table_of_sel_field( i_id = 'ID_CHECK' ). assign rt_table->* to <fs_value>. "根據選擇值作為條件,篩選資料 select * into corresponding fields of table t_flight from sflight where carrid in <fs_carrid> and connid in <fs_connid> and planetype in <fs_planetype> and fldate = <fs_fldate>. "context上下文繫結資料 node_flights = wd_context->get_child_node( name = `FLIGHT` ). node_flights->bind_elements( t_flight ).View Code
5.點選reset按鈕時,onactionreset方法,重置選擇值;
例項程式碼:
"重置方法 "重置所有select "wd_this->m_handler->RESET_ALL_SELECTION_FIELDS( ). "重置單個select wd_this->m_handler->RESET_SELECTION_FIELD( i_id = 'ID_CARR_ID' ). "select,重新設定結果表 DATA:lt_range_table TYPE REF TO data. lt_range_table = wd_this->m_handler->create_range_table( i_typename = 'S_CARR_ID' ). wd_this->m_handler->set_range_table_of_sel_field( i_id = 'ID_CARR_ID' it_range_table = lt_range_table ). "重置所有Parameter "wd_this->m_handler->RESET_ALL_PARAMETER_FIELDS( ). "重置單個Parameter "wd_this->m_handler->RESET_PARAMETER_FIELD( i_id = 'ID_FLDATE' ). DATA:lr_fldate TYPE REF TO data. CREATE DATA lr_fldate TYPE SFLIGHT-FLDATE. wd_this->m_handler->set_value_of_parameter_field( i_id = 'ID_FLDATE' i_value = lr_fldate ).View Code