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.
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.