cancel
Showing results for 
Search instead for 
Did you mean: 

Dynamic Table UI Element with different data type for each cell

Former Member
0 Kudos

Hi Experts,

I have a problem with a dynamic Table UI Element in Web Dynpro ABAP. I have the following coding:

METHOD set_col_row .

TYPE-POOLS: icon.

DATA:

lv_node TYPE REF TO if_wd_context_node,

lv_node_info TYPE REF TO if_wd_context_node_info,

lv_element TYPE REF TO if_wd_context_element,

lt_attributes TYPE wdr_context_attr_info_map,

lv_table TYPE REF TO cl_wd_table,

lv_table_column TYPE REF TO cl_wd_table_column,

lv_text_view TYPE REF TO cl_wd_text_view,

lv_image TYPE REF TO cl_wd_image,

lv_text_edit TYPE REF TO cl_wd_text_edit,

lv_header TYPE REF TO cl_wd_caption,

attribute LIKE LINE OF lt_attributes,

lv_index TYPE string,

lv_cur_row TYPE i,

path TYPE string,

lv_value TYPE string,

attr_name TYPE string,

l_trc_point_id TYPE string,

l_num_cols TYPE string,

l_num_rows TYPE string,

lv_text TYPE string,

lv_index2 TYPE i,

lr_ress_selections TYPE REF TO /its/di_2_cpr_ress_selections,

lt_comp_tab TYPE cl_abap_structdescr=>component_table,

ls_comp_tab LIKE LINE OF lt_comp_tab,

lv_count TYPE i,

lv_col_count TYPE i,

lv_col_count_read TYPE i,

lv_index_read TYPE i,

lv_num_cols_minus_1 TYPE i,

lv_bind_lv_value TYPE string,

wd_standard_cell TYPE REF TO cl_wd_table_standard_cell,

lv_data_count TYPE i,

lv_data_count_str TYPE string,

wd_table_column TYPE REF TO cl_wd_table_column,

lv_column_id TYPE string.

FIELD-SYMBOLS:

TYPE ANY.

  • Instanz der Klasse /ITS/DI_2_CPR_RESS_SELECTIONS

lr_ress_selections = /its/di_2_cpr_ress_selections=>factory( ).

ASSIGN lr_ress_selections->gr_table->* TO gt_comp_tab.

ls_comp_tab-name = 'SUMME'.

  • APPEND ls_comp_tab TO lt_comp_tab.

  • ls_comp_tab-name = 'CELL_VARIANT'.

APPEND ls_comp_tab TO lt_comp_tab.

CLEAR ls_comp_tab.

l_num_rows = num_rows + 1.

CONDENSE l_num_rows.

l_num_cols = num_columns + 1.

CONDENSE l_num_cols.

  • UI-Element 'TABLE'

lv_table ?= wd_this->m_view->get_element( 'TBL_TABLE' ).

lv_table->remove_all_columns( ).

  • Kontext-Knoten 'TABLE'

lv_node = wd_context->get_child_node( 'TABLE' ).

lv_node_info = lv_node->get_node_info( ).

lv_node_info->remove_dynamic_attributes( ).

attribute-type_name = 'STRING'.

lv_num_cols_minus_1 = num_columns - 1.

  • Für jede Spalte einmal tun

DO lv_num_cols_minus_1 TIMES.

lv_index = sy-index + 1.

CONDENSE lv_index.

lv_table_column = cl_wd_table_column=>new_table_column( ).

lv_column_id = lv_table_column->id.

  • Spaltenüberschriften setzen

IF lv_index EQ 1. "Beim ersten Durchlauf --> erste Spalte = "Ressourcen"

lv_text = text-010.

sy-index = 0.

ELSE. "Danach für jede weitere Spalte eine Zeile aus der gt_comp_tab nehmen

lv_index_read = lv_index - 1.

READ TABLE lt_comp_tab INDEX lv_index_read INTO ls_comp_tab.

lv_text = ls_comp_tab-name.

lv_header = cl_wd_caption=>new_caption( text = lv_text ).

lv_table_column->set_header( lv_header ).

ENDIF.

CONCATENATE 'TABLE.A' lv_index INTO path.

lv_text_view = cl_wd_text_view=>new_text_view( bind_text = path ).

lv_table_column->set_table_cell_editor( lv_text_view ).

lv_table_column->bind_selected_cell_variant( 'TABLE.CELL_VARIANT' ).

lv_table->add_column( lv_table_column ).

wd_table_column ?= wd_this->m_view->get_element( lv_column_id ).

*****************Test Cell Variant*************************************************

IF lv_index GT 1.

LOOP AT .

IF sy-tabix EQ lv_cur_row.

  • Name zuweisen

ASSIGN COMPONENT 'NAME' OF STRUCTURE .

  • Zuweisen ob Blatt oder nicht

lv_element->set_attribute( name = 'NAME' value = lv_value ).

ASSIGN COMPONENT 'IS_LEAF' OF STRUCTURE set_attribute( name = attr_name value = lv_value ).

ENDIF.

ENDLOOP.

Now my problem is, that I need for every ROW of my table UI Element a different cell editor. I know how to change it for the column. But is not my issue. I want to have images (traffic lights red and green) in some rows. The other rows should have numbers. The coding works, so that I have all the data at the right place in my table, only the images are shown as a string, because the cells of these rows have the cell editor Text_View. I tried something with cell variants (with cl_wd_table_standard_cell), but it was not possible for me to get a cell variant "image" in these cells/rows were I need it.

I hope you understand my problem and now what to do here.

Thanks a lot in advance.

Best Regards,

Ingmar

Accepted Solutions (0)

Answers (2)

Answers (2)

Former Member
0 Kudos
Hi Experts, I have a problem with a dynamic Table UI Element in Web Dynpro ABAP. I have the following coding: METHOD set_col_row . TYPE-POOLS: icon. DATA: lv_node TYPE REF TO if_wd_context_node, lv_node_info TYPE REF TO if_wd_context_node_info, lv_element TYPE REF TO if_wd_context_element, lt_attributes TYPE wdr_context_attr_info_map, lv_table TYPE REF TO cl_wd_table, lv_table_column TYPE REF TO cl_wd_table_column, lv_text_view TYPE REF TO cl_wd_text_view, lv_image TYPE REF TO cl_wd_image, lv_text_edit TYPE REF TO cl_wd_text_edit, lv_header TYPE REF TO cl_wd_caption, attribute LIKE LINE OF lt_attributes, lv_index TYPE string, lv_cur_row TYPE i, path TYPE string, lv_value TYPE string, attr_name TYPE string, l_trc_point_id TYPE string, l_num_cols TYPE string, l_num_rows TYPE string, lv_text TYPE string, lv_index2 TYPE i, lr_ress_selections TYPE REF TO /its/di_2_cpr_ress_selections, lt_comp_tab TYPE cl_abap_structdescr=>component_table, ls_comp_tab LIKE LINE OF lt_comp_tab, lv_count TYPE i, lv_col_count TYPE i, lv_col_count_read TYPE i, lv_index_read TYPE i, lv_num_cols_minus_1 TYPE i, lv_bind_lv_value TYPE string, wd_standard_cell TYPE REF TO cl_wd_table_standard_cell, lv_data_count TYPE i, lv_data_count_str TYPE string, wd_table_column TYPE REF TO cl_wd_table_column, lv_column_id TYPE string. FIELD-SYMBOLS:  LIKE LINE OF lt_attributes,  TYPE ANY TABLE,  TYPE ANY,  TYPE ANY,  TYPE ANY. * Instanz der Klasse /ITS/DI_2_CPR_RESS_SELECTIONS lr_ress_selections = /its/di_2_cpr_ress_selections=>factory( ). ASSIGN lr_ress_selections->gr_table->* TO . lt_comp_tab = lr_ress_selections->gt_comp_tab. ls_comp_tab-name = 'SUMME'. * APPEND ls_comp_tab TO lt_comp_tab. * ls_comp_tab-name = 'CELL_VARIANT'. APPEND ls_comp_tab TO lt_comp_tab. CLEAR ls_comp_tab. l_num_rows = num_rows + 1. CONDENSE l_num_rows. l_num_cols = num_columns + 1. CONDENSE l_num_cols. * UI-Element 'TABLE' lv_table ?= wd_this->m_view->get_element( 'TBL_TABLE' ). lv_table->remove_all_columns( ). * Kontext-Knoten 'TABLE' lv_node = wd_context->get_child_node( 'TABLE' ). lv_node_info = lv_node->get_node_info( ). lv_node_info->remove_dynamic_attributes( ). attribute-type_name = 'STRING'. lv_num_cols_minus_1 = num_columns - 1. * Für jede Spalte einmal tun DO lv_num_cols_minus_1 TIMES. lv_index = sy-index + 1. CONDENSE lv_index. lv_table_column = cl_wd_table_column=>new_table_column( ). lv_column_id = lv_table_column->id. * Spaltenüberschriften setzen IF lv_index EQ 1. "Beim ersten Durchlauf --> erste Spalte = "Ressourcen" lv_text = text-010. sy-index = 0. ELSE. "Danach für jede weitere Spalte eine Zeile aus der gt_comp_tab nehmen lv_index_read = lv_index - 1. READ TABLE lt_comp_tab INDEX lv_index_read INTO ls_comp_tab. lv_text = ls_comp_tab-name. lv_header = cl_wd_caption=>new_caption( text = lv_text ). lv_table_column->set_header( lv_header ). ENDIF. CONCATENATE 'TABLE.A' lv_index INTO path. lv_text_view = cl_wd_text_view=>new_text_view( bind_text = path ). lv_table_column->set_table_cell_editor( lv_text_view ). lv_table_column->bind_selected_cell_variant( 'TABLE.CELL_VARIANT' ). lv_table->add_column( lv_table_column ). wd_table_column ?= wd_this->m_view->get_element( lv_column_id ). ******************Test Cell Variant************************************************** IF lv_index GT 1. LOOP AT  ASSIGNING . ASSIGN COMPONENT 'TYPE' OF STRUCTURE  TO . ADD 1 TO lv_data_count. lv_data_count_str = lv_data_count. CONCATENATE 'A' lv_index lv_data_count_str INTO path. wd_standard_cell = cl_wd_table_standard_cell=>new_table_standard_cell( view = wd_this->m_view variant_key = 'FLDATE' ). IF  = '01' OR  = '04'. lv_image = cl_wd_image=>new_image( bind_source = path view = wd_this->m_view ). wd_standard_cell->set_editor( lv_image ). wd_standard_cell->set_cell_design( '01' ). ELSE. lv_text_view = cl_wd_text_view=>new_text_view( bind_text = path view = wd_this->m_view ). wd_standard_cell->set_editor( lv_text_view ). wd_standard_cell->set_cell_design( '02' ). ENDIF. wd_table_column->add_cell_variant( wd_standard_cell ). ENDLOOP. ENDIF. ************************************************************************************* CONCATENATE 'A' lv_index INTO attribute-name. lv_node_info->add_attribute( attribute ). ENDDO. DO num_rows TIMES." Für jede Zeile einmal tun lv_cur_row = sy-index. lv_element = lv_node->create_element( ). lv_node->bind_element( new_item = lv_element set_initial_elements = abap_false ). DO l_num_cols TIMES. ADD 1 TO lv_col_count. IF lv_count LT 1. LOOP AT  ASSIGNING . IF sy-tabix EQ lv_cur_row. * Name zuweisen ASSIGN COMPONENT 'NAME' OF STRUCTURE  TO . "NAME lv_value = . * Zuweisen ob Blatt oder nicht lv_element->set_attribute( name = 'NAME' value = lv_value ). ASSIGN COMPONENT 'IS_LEAF' OF STRUCTURE  TO . "NAME lv_value = . lv_element->set_attribute( name = 'IS_LEAF' value = lv_value ). ENDIF. ENDLOOP. ENDIF. IF lv_count GT 0. lv_col_count_read = lv_col_count - 1. lv_index = sy-index. LOOP AT  ASSIGNING . IF sy-tabix EQ lv_cur_row. CLEAR ls_comp_tab. READ TABLE lt_comp_tab INDEX lv_col_count_read INTO ls_comp_tab. ASSIGN COMPONENT ls_comp_tab-name OF STRUCTURE  TO . lv_value = . CONDENSE lv_index. CONCATENATE 'A' lv_index INTO attr_name. lv_element->set_attribute( name = attr_name value = lv_value ). ENDIF. ENDLOOP. ENDIF. lv_count = lv_count + 1. ENDDO. CLEAR lv_col_count. CLEAR lv_count. ENDDO. ENDMETHOD. I definied my table in Layout Tab of the View and create here in thos method dynamicly my columns. lv_table_column = cl_wd_table_column=>new_table_column( ). . . lv_table->add_column( lv_table_column ). In  I have my data that should be shown later in my table. So I create for each row in this fieldsymbol in a loop: lv_element = lv_node->create_element( ). lv_node->bind_element( new_item = lv_element set_initial_elements = abap_false ). Later I fill every cell in my table with a different value with this loop: LOOP AT  ASSIGNING . IF sy-tabix EQ lv_cur_row. CLEAR ls_comp_tab. READ TABLE lt_comp_tab INDEX lv_col_count_read INTO ls_comp_tab. ASSIGN COMPONENT ls_comp_tab-name OF STRUCTURE  TO . lv_value = . CONDENSE lv_index. CONCATENATE 'A' lv_index INTO attr_name. lv_element->set_attribute( name = attr_name value = lv_value ). ENDIF. ENDLOOP. Now my problem is, that I need for every ROW of my table UI Element a different cell editor. I know how to change it for the column. But is not my issue. I want to have images (traffic lights red and green) in some rows. The other rows should have numbers. The coding works, so that I have all the data at the right place in my table, only the images are shown as a string, because the cells of these rows have the cell editor Text_View. I tried something with cell variants (with cl_wd_table_standard_cell), but it was not possible for me to get a cell variant "image" in these cells/rows were I need it. I hope you understand my problem and now what to do here. Thanks a lot in advance. Best Regards, Ingmar

Former Member
0 Kudos

.