segunda-feira, 25 de novembro de 2013

ALV - Utilizando classe CL_GUI_LIST_TREE









Os ALV-Tree comuns geralmente utilizam colunas para detalhar mais as linhas do ALV, para isso é criado um fieldcat especifico para os campos das colunas. No meu caso optei por utilizar a classe CL_GUI_LIST_TREE pela simplicidade de montar apenas a árvore com dados básicos, sem a necessidade de criar colunas com o fieldcat




ALV com 3 níveis na mesma tela.
- ALV  tree - Superior esquerdo
- ALV simples - Superior direito - Cabeçalho
- ALV simples - Inferior - Itens

Criei uma tela normal.
O Container eu criei dinamicamente no programa, para dar mais flexibilidade a resolução da tela.
Declaração das classes .

DATAgcl_splitter    TYPE REF TO cl_gui_splitter_container,
      gcl_cont_tree   TYPE REF TO cl_gui_container,
      gcl_cont_alv    TYPE REF TO cl_gui_container,
      gcl_cont_alv_it TYPE REF TO cl_gui_docking_container,
      gcl_tree_ev_rec TYPE REF TO cl_tree_event_rec,
      gcl_tree        TYPE REF TO cl_gui_list_tree.








Criando objeto ALV TREE
* create tree control
  CREATE OBJECT gcl_tree
    EXPORTING
      parent                      gcl_cont_tree
      node_selection_mode         cl_gui_list_tree=>node_sel_mode_single
      item_selection              'X'
      with_headers                space
    EXCEPTIONS
      cntl_system_error           2
      create_error                3
      lifetime_error              4
      illegal_node_selection_mode 5
      failed                      6.


 Criando Hierarquia.
*  DATA: l_zebra     TYPE i.

  DATAlt_node_table   TYPE treev_ntab,
        lt_item_table   TYPE item_table_type.

  DATAlw_node TYPE treev_node,
        lw_item TYPE mtreeitm.

  DATAl_cont TYPE i,
        l_cont_h TYPE i.

  CLEARgt_node_idx[].

  "Nó principal
  CLEAR lw_node.
  lw_node-node_key c_node_root.
  lw_node-isfolder 'X'.
  APPEND lw_node TO lt_node_table.

  "Características do nó principal
  CLEAR lw_item.
  lw_item-node_key c_node_root.
  lw_item-item_name '1'.
  lw_item-class cl_gui_list_tree=>item_class_text" Text Item
  lw_item-alignment cl_gui_list_tree=>align_auto.
  lw_item-font cl_gui_list_tree=>item_font_prop.
  lw_item-text text-t00.
  APPEND lw_item TO lt_item_table.

  CLEAR lw_item.
  lw_item-node_key c_node_root.
  lw_item-item_name '2'.
  lw_item-class cl_gui_list_tree=>item_class_checkbox.
  lw_item-editable 'X'.
  APPEND lw_item TO lt_item_table.

  PERFORM node_idx USING lw_node-node_key
                         0
                         0.

  LOOP AT gt_pin ASSIGNING <fsw_pin>.

    ADD TO l_cont.

    CLEARlw_node.
    lw_node-relatkey c_node_root.
    lw_node-node_key l_cont.
    lw_node-isfolder 'X'.                 " a folder.
    APPEND lw_node TO lt_node_table.

    CLEAR lw_item.
    lw_item-node_key l_cont.
    lw_item-item_name '1'.
    lw_item-class cl_gui_list_tree=>item_class_checkbox.
    lw_item-editable 'X'.
    APPEND lw_item TO lt_item_table.

    CLEAR lw_item.
    lw_item-node_key  l_cont.
    lw_item-item_name '2'.

    PERFORM icon_status_tree USING <fsw_pin>-statu
                          CHANGING lw_item-t_image.

    APPEND lw_item TO lt_item_table.

    CLEAR lw_item.
    lw_item-node_key  l_cont.
    lw_item-item_name '3'.
    lw_item-class     cl_gui_list_tree=>item_class_text" Text Item
    lw_item-alignment cl_gui_list_tree=>align_auto.
    lw_item-font      cl_gui_list_tree=>item_font_prop.
    CONCATENATE text-003 <fsw_pin>-lotid '-' <fsw_pin>-name1 INTO lw_item-text.
    APPEND lw_item TO lt_item_table.

    PERFORM node_idx USING lw_node-node_key
                           <fsw_pin>-lotid
                           0.

    l_cont_h l_cont.

    LOOP AT gt_pin_it ASSIGNING <fsw_pin_it>
                      WHERE lotid EQ <fsw_pin>-lotid.

      ADD TO l_cont.

      CLEAR lw_node.
      lw_node-node_key l_cont.
      lw_node-relatkey l_cont_h.
      lw_node-relatship cl_gui_list_tree=>relat_last_child.
      APPEND lw_node TO lt_node_table.

      PERFORM node_idx USING lw_node-node_key
                             <fsw_pin_it>-lotid
                             <fsw_pin_it>-docnum.

      CLEAR lw_item.
      lw_item-node_key l_cont.
      lw_item-item_name '1'.
      lw_item-class cl_gui_list_tree=>item_class_text" Text Item
      lw_item-alignment cl_gui_list_tree=>align_auto.
      lw_item-font cl_gui_list_tree=>item_font_prop.

      IF <fsw_pin_it>-nfe 'X'.
        CONCATENATE text-004 <fsw_pin_it>-nfenum
               INTO lw_item-text.
      ELSE.
        CONCATENATE text-004 <fsw_pin_it>-nfnum
               INTO lw_item-text.
      ENDIF.

      APPEND lw_item TO lt_item_table.

    ENDLOOP.

  ENDLOOP.

  CALL METHOD gcl_tree->add_nodes_and_items
    EXPORTING
      node_table                     lt_node_table
      item_table                     lt_item_table
      item_table_structure_name      'MTREEITM'
    EXCEPTIONS
      failed                         1
      cntl_system_error              3
      error_in_tables                4
      dp_error                       5
      table_structure_name_not_found 6.

  IF sy-subrc <> 0.
    MESSAGE a000.
  ENDIF.
 

=================================================
A grande sacada desse objeto é o seguinte.. Na chamada do método ADD_NODES_AND_ITEMS é obrigatório a passagem dos parâmetros de tabela NODE_TABLE e ITEM_TABLE.
A tabela interna que contém o NODE_TABLE se refere a o que vc vai ter na hierarquia, e o ITEM_TABLE seria as características dessa linha.  Ou seja, como na linha abaixo

  "Nó principal
  CLEAR lw_node.
  lw_node-node_key c_node_root.
  lw_node-isfolder 'X'.
  APPEND lw_node TO lt_node_table.

  "Características do nó principal
  CLEAR lw_item.
  lw_item-node_key c_node_root.
  lw_item-item_name '1'.
  lw_item-class cl_gui_list_tree=>item_class_text" Text Item
  lw_item-alignment cl_gui_list_tree=>align_auto.
  lw_item-font cl_gui_list_tree=>item_font_prop.
  lw_item-text text-t00.
  APPEND lw_item TO lt_item_table.

  CLEAR lw_item.
  lw_item-node_key c_node_root.
  lw_item-item_name '2'.
  lw_item-class cl_gui_list_tree=>item_class_checkbox.
  lw_item-editable 'X'.
  APPEND lw_item TO lt_item_table.


Primeiro crio a linha principal denominado C_NODE_ROOT o valor da constante é "ROOT", e gravo na tabela interna LT_NODE_TABLE, em sequência em coloco as características desse primeiro nível, alinhando o campo NODE_KEY da tabela interna LT_ITEM_TABLE com o nome do nó principal C_NODE_ROOT. No campo ITEM_NAME nesse caso coloquei fixo o número "1", esse  "1" significa que é a primeira característica que defino para o nível C_NODE_ROOT, no caso estou colocando o texto TEXT-T00 de depois gravo na tabela interna, em sequência crio uma segunda característica para o nível, com o ITEM_NAME = "2". nesse caso coloquei um checkbox no inicio da linha. E assim sucessivamente vc pode criar mais características para o nível NODE_KEY que quiser.

Mais embaixo criei os itens da hierarquia, seguindo a mesma regra do nível e suas características, com um detalhe.

      ADD TO l_cont.

      CLEAR lw_node.
      lw_node-node_key l_cont.
      lw_node-relatkey l_cont_h.
      lw_node-relatship cl_gui_list_tree=>relat_last_child.
      APPEND lw_node TO lt_node_table.

      PERFORM node_idx USING lw_node-node_key
                             <fsw_pin_it>-lotid
                             <fsw_pin_it>-docnum.

      CLEAR lw_item.
      lw_item-node_key l_cont.
      lw_item-item_name '1'.
      lw_item-class cl_gui_list_tree=>item_class_text" Text Item
      lw_item-alignment cl_gui_list_tree=>align_auto.
      lw_item-font cl_gui_list_tree=>item_font_prop.



Coloquei um contador para fazer o meu nível no campo NODE_KEY, e por quê do contador em vez do número da chave DOCNUM, teoricamente poderia ser muito mais fácil colocar o DOCNUM pois seria única na minha chave. !!! O que acontece é que o docnum a sequência de números varia e eu não sei porque quando começa a colocar chaves aleatórias no NODE_KEY depois de um determinado número de itens o objeto se perde e gera um DUMP na inicialização da tela do ALV. Era estranho pq com um 10 items e hieraquias funcionava perfeito, e se adicionado mais dava DUMP, até q descobri que a chave node_key tem q ser uma chave sequencial.
Enfim assim funciona.

Detalhe do tipo da tabela interna LT_ITEM_TABLE.
TYPESitem_table_type LIKE STANDARD TABLE OF mtreeitm
     WITH DEFAULT KEY.


O outros ALV são objetos ALV comuns com alguns eventos que eu determinei, aí nem vou explicar pq cada um faz do seu jeito.

Nenhum comentário:

Postar um comentário