zoukankan      html  css  js  c++  java
  • 创建动态节点和动态Table

    创建一个组件:Y_DYNAMIC_CONTEXT_TABLE

                视图:V_MAIN

               窗口:V_MAIN

    视图中添加控件Group:GRP 设置参数参考图

    创建方法

    初始化

    METHOD wddoinit .
    
      create_context_inetab( )."创建动态节点和动态内表
      create_table( )."创建动态Table
      get_data( )."获取数据
    
    ENDMETHOD.

    创建动态节点和动态内表

    METHOD create_context_inetab .
    
    *★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    *创建动态内表
    *★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
      DATA:lt_fcat TYPE lvc_t_fcat,
           ls_fcat TYPE lvc_s_fcat.
    
      ls_fcat-col_pos         = 1.       " 顺序
      ls_fcat-fieldname       = 'CARRID'. " 列名-参考字段
      ls_fcat-ref_field       = 'CARRID'.     " 参考字段
      ls_fcat-ref_table       = 'SPFLI'.      " 参考表
      APPEND ls_fcat TO lt_fcat.
      CLEAR ls_fcat.
    
      ls_fcat-col_pos         = 1.       " 顺序
      ls_fcat-fieldname       = 'CONNID'. " 列名-参考字段
      ls_fcat-ref_field       = 'CONNID'.     " 参考字段
      ls_fcat-ref_table       = 'SPFLI'.      " 参考表
      APPEND ls_fcat TO lt_fcat.
      CLEAR ls_fcat.
    
      create_dynamic_intab( EXPORTING it_fcat = lt_fcat
                            IMPORTING tt_dat  = wd_this->lt_tab )."返回內表
    
    *★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    *创建动态节点
    *★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
      DATA:lt_components  TYPE cl_abap_structdescr=>component_table,
           ls_component   TYPE cl_abap_structdescr=>component,
           lr_type        TYPE REF TO cl_abap_datadescr.
    
      ls_component-name = 'CARRID'."为结构新增一个成员
      lr_type ?= cl_abap_typedescr=>describe_by_name( p_name = 'S_CARR_ID' ).
      ls_component-type = lr_type."新增成员的类型对象
      APPEND ls_component TO lt_components.
      CLEAR ls_component.
    
      ls_component-name = 'CONNID'."为结构新增一个成员
      lr_type ?= cl_abap_typedescr=>describe_by_name( p_name = 'S_CONN_ID' ).
      ls_component-type = lr_type."新增成员的类型对象
      APPEND ls_component TO lt_components.
      CLEAR ls_component.
    
      create_dynamic_context( EXPORTING node_name     = 'NODE_SPFLI'
                                        it_components = lt_components ).
    
    ENDMETHOD.

    方法:create_dynamic_intab

    参数

    METHOD create_dynamic_intab .
      DATA:wa_fcat TYPE lvc_s_fcat.
    
      TYPES:BEGIN OF ty_dyndata,
              fieldname TYPE fieldname,
              data_type TYPE string,
            END OF ty_dyndata,
            ty_t_dyndata TYPE STANDARD TABLE OF ty_dyndata.
      DATA:
        lt_dyndata     TYPE ty_t_dyndata,
        lo_structdescr TYPE REF TO cl_abap_structdescr,
        lo_typedescr   TYPE REF TO cl_abap_typedescr,
        lo_tabledescr  TYPE REF TO cl_abap_tabledescr,
        lr_data        TYPE REF TO data,
        lr_dyntable    TYPE REF TO data,
        lt_component   TYPE cl_abap_structdescr=>component_table.
      FIELD-SYMBOLS:
        <dyndata>   TYPE ty_dyndata,
        <component> TYPE LINE OF cl_abap_structdescr=>component_table,
        <dyntable>  TYPE table.
    
      LOOP AT it_fcat INTO wa_fcat.
        APPEND INITIAL LINE TO lt_dyndata ASSIGNING <dyndata>.
        <dyndata>-fieldname = wa_fcat-fieldname.
        <dyndata>-data_type = wa_fcat-ref_table && '-' &&  wa_fcat-ref_field.
      ENDLOOP.
    
      LOOP AT lt_dyndata ASSIGNING <dyndata>.
        TRY.
            CREATE DATA lr_data TYPE (<dyndata>-data_type).
            APPEND INITIAL LINE TO lt_component ASSIGNING <component>.
            <component>-type ?= cl_abap_datadescr=>describe_by_data_ref( lr_data ).
            <component>-name = <dyndata>-fieldname.
          CATCH cx_root.
        ENDTRY.
      ENDLOOP.
    
      lo_structdescr = cl_abap_structdescr=>create( lt_component ).
      lo_tabledescr = cl_abap_tabledescr=>create(
                      p_line_type  = lo_structdescr
                      p_table_kind = cl_abap_tabledescr=>tablekind_std
                      p_unique     = abap_false ).
    
    *    CREATE DATA lr_dyntable TYPE HANDLE lo_tabledescr.
      CREATE DATA tt_dat TYPE HANDLE lo_tabledescr.
    ENDMETHOD.

    方法create_dynamic_context:

    参数

    METHOD create_dynamic_context .
      DATA lr_root_info           TYPE REF TO if_wd_context_node_info.
      DATA lr_structdescr         TYPE REF TO   cl_abap_structdescr.
      DATA lv_init_lead_selection TYPE abap_bool.
      DATA lo_node_info           TYPE REF TO if_wd_context_node_info.
    
      lr_root_info = wd_context->get_node_info( ).
    
      CALL METHOD cl_abap_structdescr=>create
        EXPORTING
          p_components = it_components
        RECEIVING
          p_result     = lr_structdescr.
    
      IF iv_init_lead_selection IS NOT INITIAL."是否默认选中第一行
        lv_init_lead_selection = abap_true.
      ELSE.
        lv_init_lead_selection = abap_false.
      ENDIF.
    
      CALL METHOD lr_root_info->add_new_child_node
        EXPORTING
    *     static_element_type          = lv_table
          static_element_rtti          = lr_structdescr
          name                         = node_name  "context id
          is_multiple                  = abap_true
          is_singleton                 = abap_false
          is_initialize_lead_selection = lv_init_lead_selection
          is_static                    = abap_false
        RECEIVING
          child_node_info              = lo_node_info.
    ENDMETHOD

    创建动态Table

    METHOD create_table .
      DATA:lo_api_main TYPE REF TO if_wd_view_controller,
           lo_view     TYPE REF TO if_wd_view.
    
      lo_api_main = wd_this->wd_get_api( ).
      lo_view ?= lo_api_main.
    
    *★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    *创建Table
    *★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
      DATA:lr_table         TYPE REF TO cl_wd_table,
           lr_column        TYPE REF TO cl_wd_table_column,
           lr_input_field   TYPE REF TO cl_wd_input_field,
           lr_column_header TYPE REF TO cl_wd_caption,
           lr_group         TYPE REF TO cl_wd_group.
    
      DATA:lv_table_id TYPE string,
           lv_node_name TYPE string,
           lv_data_source TYPE string,
           lv_text_view_id TYPE string,
           lv_column_id    TYPE string,
           lv_field_id     TYPE string,
           lv_bind_value   TYPE string,
           lv_caption_text TYPE wdy_md_translatable_text.
    
      lv_table_id    = 'TBL_SPFLI'.
      lv_node_name   = 'NODE_SPFLI'.
      lv_data_source = 'NODE_SPFLI'.
    
      cl_wd_table=>new_table(
                EXPORTING
                  id                     = lv_table_id
                  design                 = cl_wd_table=>e_design-standard
                  first_visible_row      = 0
                  footer_visible         = 'X'
                  read_only              = abap_false
                  selection_mode         = cl_wd_table=>e_selection_mode-single
                  visible_row_count      = 18
                  enabled                = 'X'
    *                 column_resize_mode     = '01'
                  width                  = '100%'
                  grid_mode              = '00' "both
                  scrollable_col_count   = 7
                  visible                = cl_wd_uielement=>e_visible-visible
                  bind_data_source       = lv_data_source
                RECEIVING
                  control = lr_table ).
    
    *第一列:
      "-----添加列(航线代码)
      lv_column_id    = |{ lv_table_id }| && |_CARRID|.
      lv_field_id     = |{ lv_table_id }| && |_CARRID_EDITOR|.
      lv_bind_value   = |{ lv_node_name }| && |.CARRID|.
      lv_caption_text = |航线代码|.
    
      cl_wd_table_column=>new_table_column( EXPORTING id             = lv_column_id
                                                      width          = '120px'
                                                      fixed_position = '02'
                                            RECEIVING control        = lr_column )."left
    
      cl_wd_input_field=>new_input_field(  EXPORTING id         = lv_field_id
                                                     bind_value = lv_bind_value
                                                     no_history = 'X'
                                                     read_only  = 'X'
                                           RECEIVING control    = lr_input_field ).
    
      lr_table->add_column( the_column = lr_column ).
      lr_column_header ?= cl_wd_caption=>new_caption(  text = lv_caption_text ).
      lr_column->set_table_cell_editor( the_table_cell_editor = lr_input_field ).
      lr_column->set_header( lr_column_header ).
    
    *第二列:
      "-----添加列(航班连接 Id)
      lv_column_id    = |{ lv_table_id }| && |_CONNID|.
      lv_field_id     = |{ lv_table_id }| && |_CONNID_EDITOR|.
      lv_bind_value   = |{ lv_node_name }| && |.CONNID|.
      lv_caption_text = |航班连接 Id)|.
    
      cl_wd_table_column=>new_table_column( EXPORTING id             = lv_column_id
                                                      width          = '120px'
                                                      fixed_position = '02'
                                            RECEIVING control        = lr_column )."left
    
      cl_wd_input_field=>new_input_field(  EXPORTING id         = lv_field_id
                                                     bind_value = lv_bind_value
                                                     no_history = 'X'
                                                     read_only  = 'X'
                                           RECEIVING control    = lr_input_field ).
    
      lr_table->add_column( the_column = lr_column ).
      lr_column_header ?= cl_wd_caption=>new_caption(  text = lv_caption_text ).
      lr_column->set_table_cell_editor( the_table_cell_editor = lr_input_field ).
      lr_column->set_header( lr_column_header ).
    
    *★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    *将Table 放入Group中
    *★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
      cl_wd_grid_data=>new_grid_data( element = lr_table ).
    
      lr_group ?= lo_view->get_element( id = 'GRP' ).
      lr_group->add_child( lr_table ).
    ENDMETHOD.

     获取数据

    METHOD get_data .
      DATA:dy_wa TYPE REF TO data.
      FIELD-SYMBOLS:<lt_tab> TYPE STANDARD TABLE,
                    <ls_tab> TYPE any.
    
    *★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    *用表类型指针<lt_tab>指向数据对象的内容.
    *★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
      ASSIGN wd_this->lt_tab->* TO <lt_tab>.
      CREATE DATA dy_wa LIKE LINE OF <lt_tab>.
      ASSIGN dy_wa->* TO <ls_tab>.
    
    *★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    *获取数据
    *★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
      SELECT * INTO CORRESPONDING FIELDS OF TABLE <lt_tab>
               FROM spfli UP TO 10 ROWS.
    
    *★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    *绑定节点数据
    *★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
      DATA:lo_nd_table TYPE REF TO if_wd_context_node.
    
      lo_nd_table = wd_context->get_child_node( name = 'NODE_SPFLI' ).
      lo_nd_table->bind_table( <lt_tab> ).
    ENDMETHOD.

    结果展现

  • 相关阅读:
    ArrayList和LinkedList的底层代码实现思想
    ArrayList(顺序表)和LinkedList(链表)的区别联系,优劣取舍问题
    【AR】增强现实安卓编程
    【报错】"The constructor Notification(int, CharSequence, long) is deprecated
    【gradle报错】error: package org.apache.http does not exist
    【安卓面试题】多线程下载怎么实现?断点续传怎么实现?
    【安卓面试题】在一个Activity启动另一个Activity和在Service中启动一个Activity有什么区别
    java.lang.IllegalArgumentException: Service Intent must be explicit: Intent
    【Android Studio 小技巧】一键查看文件方法结构目录File Structure
    【安卓面试题】使用SQLiteOpenHelper的getReadableDatabase()获得的数据库能不能,做写的操作
  • 原文地址:https://www.cnblogs.com/SAPxiaox/p/9959209.html
Copyright © 2011-2022 走看看