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 .
DATA: gcl_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.
DATA: lt_node_table TYPE treev_ntab,
lt_item_table TYPE item_table_type.
DATA: lw_node TYPE treev_node,
lw_item TYPE mtreeitm.
DATA: l_cont TYPE i,
l_cont_h TYPE i.
CLEAR: gt_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 1 TO l_cont.
CLEAR: lw_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 1 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 1 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.
TYPES: item_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.
Assinar:
Postar comentários (Atom)
Olá Administrador do Blog,
ResponderExcluirQuero apenas deixar esta mensagem aqui no seu blogue para dar a conhecer a alguém um apoio financeiro que o Sr. Pedro me oferece durante a época do covid-19 porque essa época foi muito má e difícil para mim depois do confinamento do país quase perdi o o meu negócio perante Pedro Jerome, um agente de crédito que me ajudou com um empréstimo à taxa de 2% em troca de financiar o meu negócio, estou muito grato e mostrar gratidão ao seu apoio testemunhará o quanto estou grato ao seu serviço e à sua equipa de trabalho como bem, depois de visitar o seu escritório na minha localidade, soube que era um bom homem com um coração agradecido.
Gostaria que qualquer pessoa aqui com condições financeiras contactasse o Sr Pedro Jerome no seu email pedroloanss@gmail.com e WhatsApp: +393510140339 ele irá ajudá-lo com qualquer tipo de crédito, crédito habitação, crédito automóvel, crédito construção, crédito empresarial, pessoal empréstimo, desde que seja honesto o suficiente para fazer um retorno.