1. 程式人生 > 實用技巧 >WDA學習(6):Component Usage(Select Options)

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.

* 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.
View Code

重寫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