*&---------------------------------------------------------------------* *& Report ZBOS_ALV_IVA *&---------------------------------------------------------------------* *& *&---------------------------------------------------------------------* REPORT zbos_alv_iva_v2. CLASS lcl_event_handler DEFINITION. PUBLIC SECTION. METHODS handle_hotspot_click FOR EVENT hotspot_click OF cl_gui_alv_grid IMPORTING e_column_id es_row_no. ENDCLASS. CLASS lcl_event_handler IMPLEMENTATION. METHOD handle_hotspot_click. PERFORM handle_hotspot_click USING es_row_no-row_id e_column_id-fieldname. ENDMETHOD. "handle_hotspot_click ENDCLASS. TYPES: BEGIN OF wy_alv_cima, regra(15) TYPE c, campos TYPE string, tabela(30) TYPE c, icon_det(4) TYPE c, END OF wy_alv_cima, BEGIN OF wy_alv_baixo, campo TYPE string, elemento TYPE string, END OF wy_alv_baixo, BEGIN OF wy_alv_componente, tipo(30) TYPE c, ""tipo do objeto nome(30) TYPE c, ""Nome do objeto existe(4) TYPE c, ""Se existe no ambiente icon_criar(4) TYPE c, ""icone de criar END OF wy_alv_componente, BEGIN OF wy_tadir, object TYPE trobjtype, obj_name TYPE sobj_name, END OF wy_tadir, ty_tadir TYPE TABLE OF wy_tadir, ty_alv_componente TYPE TABLE OF wy_alv_componente, ty_alv_baixo TYPE TABLE OF wy_alv_baixo, ty_alv_cima TYPE TABLE OF wy_alv_cima. DATA: gt_dados_baixo TYPE ty_alv_baixo. TYPES: BEGIN OF ty_dd03l, tabname(30) TYPE c, fieldname(30) TYPE c, END OF ty_dd03l, BEGIN OF wy_dados, regra(15) TYPE c, campos TYPE string, tabela(90) TYPE c, alv_campos LIKE gt_dados_baixo, END OF wy_dados. DATA: event_receiver TYPE REF TO lcl_event_handler. DATA: it_tab TYPE filetable, wa_tab TYPE LINE OF filetable, gt_tab TYPE TABLE OF string, gt_fieldcat TYPE lvc_t_fcat, ls_tab TYPE string, lv_pesquisa TYPE string, ctl_alv_moni_hi TYPE REF TO cl_gui_alv_grid, ctl_alv_moni_po_eq TYPE REF TO cl_gui_alv_grid, ctl_alv_moni_po_dr TYPE REF TO cl_gui_alv_grid. DATA: o_splitter_1 TYPE REF TO cl_gui_splitter_container, o_splitter_2 TYPE REF TO cl_gui_splitter_container, attach_container TYPE REF TO cl_gui_container, o_parent_cima TYPE REF TO cl_gui_container, o_parent_baixo_dir TYPE REF TO cl_gui_container, o_parent_baixo_esq TYPE REF TO cl_gui_container. DATA: gd_subrc TYPE i, gt_dados TYPE TABLE OF wy_dados, """tabela todos os dados gt_dados_cima TYPE TABLE OF wy_alv_cima . """tabela alv de cima os dados DATA: gr_object TYPE RANGE OF tadir-object, gs_object LIKE LINE OF gr_object. SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001. *PARAMETERS: p_tab(13) TYPE c NO-DISPLAY. " Nome da tabela PARAMETERS: p_l_ini TYPE i DEFAULT '1'. " Número de linhas que vai ser ignoradas PARAMETERS: p_file TYPE string. " File Name DEFAULT 'c:\test.csv', SELECTION-SCREEN END OF BLOCK b1. AT SELECTION-SCREEN. * IF p_tab IS INITIAL. * MESSAGE 'Favor informar o numero da condição' TYPE 'S' DISPLAY LIKE 'E'. * LEAVE SCREEN . * IF p_l_ini IS INITIAL. * MESSAGE 'Favor informar o numero de linhas de cabeçalho' TYPE 'S' DISPLAY LIKE 'E'. * LEAVE SCREEN . * ELSEIF p_file IS INITIAL. * MESSAGE 'Favor informar o arquivo' TYPE 'S' DISPLAY LIKE 'E'. * LEAVE SCREEN . * ENDIF. *----------------------------------------------------------------------* AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file. *----------------------------------------------------------------------* * Localizar o diretório com os arquivos XLS PERFORM f_busca_arquivo CHANGING p_file. START-OF-SELECTION. *Busca arquivos excel. PERFORM cria_range_tadir. CALL SCREEN 100. * PERFORM f_upload_excel_file. END-OF-SELECTION. * CHECK NOT gt_msg IS INITIAL. * PERFORM f_alv_msg. REFRESH gt_tab. FORM f_busca_arquivo CHANGING p_p_file. REFRESH: it_tab. CALL METHOD cl_gui_frontend_services=>file_open_dialog EXPORTING window_title = 'Select File' default_filename = '*.csv' multiselection = ' ' CHANGING file_table = it_tab rc = gd_subrc. READ TABLE it_tab INTO wa_tab INDEX 1. IF sy-subrc IS INITIAL. p_file = wa_tab-filename. ENDIF. ENDFORM. FORM f_upload_excel_file. REFRESH gt_tab. DATA:ls_linha TYPE wy_dados, ls_dados_cima TYPE wy_alv_cima, ls_dados_baixo TYPE wy_alv_baixo. CALL METHOD cl_gui_frontend_services=>gui_upload EXPORTING filename = p_file filetype = 'ASC' read_by_line = 'X' codepage = space CHANGING data_tab = gt_tab EXCEPTIONS file_open_error = 1 file_read_error = 2 no_batch = 3 gui_refuse_filetransfer = 4 invalid_type = 5 no_authority = 6 unknown_error = 7 bad_data_format = 8 header_not_allowed = 9 separator_not_allowed = 10 header_too_long = 11 unknown_dp_error = 12 access_denied = 13 dp_out_of_memory = 14 disk_full = 15 dp_timeout = 16 not_supported_by_gui = 17 error_no_gui = 18 OTHERS = 19. IF NOT p_l_ini IS INITIAL. DO p_l_ini TIMES. DELETE gt_tab INDEX 1. ENDDO. ENDIF. LOOP AT gt_tab INTO ls_tab. CLEAR ls_linha. SPLIT ls_tab AT ';' INTO ls_linha-regra ls_linha-campos. PERFORM valida_tabela USING ls_linha. APPEND ls_linha TO gt_dados. MOVE-CORRESPONDING ls_linha TO ls_dados_cima. ls_dados_cima-icon_det = '@90@'. APPEND ls_dados_cima TO gt_dados_cima. CLEAR: ls_linha, ls_dados_cima. ENDLOOP. PERFORM monta_alv. ENDFORM. FORM valida_tabela USING p_linha TYPE wy_dados. DATA:lt_campos TYPE TABLE OF string, lv_campo TYPE string, lt_campos_tab TYPE TABLE OF string, lv_campos_tab TYPE wy_alv_baixo, lt_colunas TYPE TABLE OF string, lv_coluna TYPE string. SPLIT p_linha-campos AT '/' INTO TABLE lt_campos. "converter LOOP AT lt_campos INTO lv_campo. *** de/para dos campos *** Form com case entra nome sai prefixo, campo e elemento CONDENSE lv_campo NO-GAPS. PERFORM busca_campo CHANGING lv_campo lv_campos_tab. IF lv_campo IS NOT INITIAL. APPEND lv_campo TO lt_colunas. APPEND lv_campos_tab TO p_linha-alv_campos. ENDIF. ENDLOOP. DATA: lt_dd03l TYPE TABLE OF ty_dd03l, ls_dd03l TYPE ty_dd03l, lt_cond TYPE TABLE OF fieldname, lt_fields TYPE TABLE OF string, lt_table_unique TYPE TABLE OF ty_dd03l, ls_unique TYPE ty_dd03l, lv_table_name(25) TYPE c. ""tablename. ** CHECK lv_pesquisa IS NOT INITIAL. * PARAMETERS campos TYPE string DEFAULT 'Exemplo: MATNR,LIFNR,WERKS'. ** SPLIT lv_pesquisa AT ',' INTO TABLE lt_fields. SELECT tabname fieldname FROM dd03l INTO TABLE lt_dd03l WHERE keyflag = 'X' AND tabname LIKE '/VTIVA/COND%' AND fieldname NOT IN ('MANDT', '.INCLUDE', 'VTIVA_DET'). SORT lt_dd03l BY tabname. lt_table_unique = lt_dd03l. DELETE ADJACENT DUPLICATES FROM lt_table_unique COMPARING tabname. SORT lt_table_unique BY tabname. LOOP AT lt_table_unique INTO ls_unique. LOOP AT lt_dd03l INTO ls_dd03l WHERE tabname = ls_unique-tabname. IF ls_dd03l-fieldname+2(1) = '_'. APPEND ls_dd03l-fieldname+3 TO lt_cond. ELSE. APPEND ls_dd03l-fieldname TO lt_cond. ENDIF. ENDLOOP. SORT lt_cond. SORT lt_colunas. "lt_fields. **comparar tabelas IF lt_cond = lt_colunas. "lt_fields. lv_table_name = ls_unique-tabname. IF p_linha-tabela IS INITIAL. p_linha-tabela = lv_table_name. ELSE. p_linha-tabela = p_linha-tabela && ` - ` && lv_table_name. ENDIF. ENDIF. CLEAR lt_cond. ENDLOOP. *** IF lv_table_name IS INITIAL. ** "Sugestao de tabela *** WRITE: / 'Nenhuma tabela encontrada com todos os campos necessários.REGRA: ', p_linha-regra . *** LOOP AT p_linha-alv_campos INTO lv_campos_tab. *** WRITE: / lv_campos_tab-campo, ' ', lv_campos_tab-elemento. *** *** ENDLOOP. *** WRITE: /. *** WRITE: /. *** ENDIF. ENDFORM. FORM monta_alv. DATA: lt_fieldcat TYPE lvc_t_fcat. DATA: lt_exit_events TYPE slis_t_event_exit. DATA: ls_layout TYPE lvc_s_layo. * DATA: event_receiver TYPE REF TO lcl_event_handler. "Geral dividido ao meio cima e baixo CREATE OBJECT o_splitter_1 EXPORTING parent = cl_gui_container=>default_screen rows = 2 columns = 1. "Cria o conteiner de cima CALL METHOD o_splitter_1->get_container EXPORTING row = 1 column = 1 RECEIVING container = o_parent_cima. "Conteiner de Baixo attach_container = o_splitter_1->get_container( row = 2 column = 1 ). "pega a segunda linha "Splitar o conteiner de baixo. CREATE OBJECT o_splitter_2 EXPORTING parent = attach_container "cl_gui_container=>default_screen conteiner de baixo rows = 1 columns = 2. CALL METHOD o_splitter_2->get_container EXPORTING row = 1 column = 1 RECEIVING container = o_parent_baixo_esq. CALL METHOD o_splitter_2->get_container EXPORTING row = 1 column = 2 RECEIVING container = o_parent_baixo_dir. * "mesma coisa de cima * o_parent_baixo_dir = o_splitter_2->get_container( row = 1 column = 2 ) CALL METHOD o_splitter_1->set_row_height EXPORTING id = 1 height = 50. CREATE OBJECT ctl_alv_moni_hi EXPORTING i_parent = o_parent_cima. CREATE OBJECT ctl_alv_moni_po_eq EXPORTING i_parent = o_parent_baixo_esq. CREATE OBJECT ctl_alv_moni_po_dr EXPORTING i_parent = o_parent_baixo_dir. PERFORM get_layout CHANGING lt_fieldcat. ls_layout-zebra = abap_true. ls_layout-cwidth_opt = abap_true. CREATE OBJECT event_receiver. SET HANDLER event_receiver->handle_hotspot_click FOR ctl_alv_moni_hi. * Send data to ALV grid CALL METHOD ctl_alv_moni_hi->set_table_for_first_display EXPORTING is_layout = ls_layout ""wa_layout i_structure_name = 'WY_ALV_CIMA' * is_variant = wa_variant * i_save = 'A' * it_toolbar_excluding = t_exclude_fcode CHANGING it_fieldcatalog = lt_fieldcat it_outtab = gt_dados_cima. "'t_nfe. ENDFORM. FORM get_layout CHANGING pt_fieldcat TYPE lvc_t_fcat. DATA: ls_fcat TYPE lvc_s_fcat. ls_fcat-fieldname = 'REGRA'. ls_fcat-scrtext_m = 'Regra'. ls_fcat-col_pos = 1. APPEND ls_fcat TO pt_fieldcat. ls_fcat-fieldname = 'CAMPOS'. ls_fcat-scrtext_m = 'Campos'. ls_fcat-col_pos = 2. APPEND ls_fcat TO pt_fieldcat. ls_fcat-fieldname = 'TABELA'. ls_fcat-scrtext_m = 'Tabela'. ls_fcat-col_pos = 3. APPEND ls_fcat TO pt_fieldcat. ls_fcat-fieldname = 'ICON_DET'. ls_fcat-scrtext_m = 'det.'. ls_fcat-hotspot = 'X'. ls_fcat-just = 'C'. ls_fcat-col_pos = 4. APPEND ls_fcat TO pt_fieldcat. *** APPEND INITIAL LINE TO pt_fieldcat ASSIGNING . *** -fieldname = 'ICON'. *** ls_fcat-scrtext_m = 'Tabela'. *** ls_fcat-col_pos = 3. *** -icon = 'X'. *** -outputlen = 3. *** -hotspot = 'X'. *** -just = 'C'. ENDFORM. FORM handle_hotspot_click USING p_row_id TYPE lvc_s_roid-row_id p_fieldname TYPE lvc_s_col-fieldname. * DATA: lt_dados TYPE ty_alv_baixo. * DATA: lt_fieldcat TYPE lvc_t_fcat. * DATA: ls_fcat TYPE lvc_s_fcat. * DATA: ls_layout TYPE lvc_s_layo. * DATA: ls_dados TYPE wy_dados. CASE p_fieldname . WHEN 'ICON_DET'. PERFORM display_esquerdo USING p_row_id. PERFORM display_direito USING p_row_id. WHEN 'ICON_CRIAR'. PERFORM criar_objetos USING p_row_id. WHEN OTHERS. ENDCASE. ENDFORM. FORM display_esquerdo USING p_row_id TYPE lvc_s_roid-row_id. DATA: lt_fieldcat TYPE lvc_t_fcat. DATA: ls_fcat TYPE lvc_s_fcat. DATA: ls_layout TYPE lvc_s_layo. DATA: ls_dados TYPE wy_dados. READ TABLE gt_dados INTO ls_dados INDEX p_row_id. * ls_dados-alv_campos ls_fcat-fieldname = 'CAMPO'. ls_fcat-scrtext_m = 'Campo'. ls_fcat-col_pos = 1. APPEND ls_fcat TO lt_fieldcat. ls_fcat-fieldname = 'ELEMENTO'. ls_fcat-scrtext_m = 'Elemento de dados'. ls_fcat-col_pos = 2. APPEND ls_fcat TO lt_fieldcat. ls_layout-zebra = abap_true. ls_layout-cwidth_opt = abap_true. CALL METHOD ctl_alv_moni_po_eq->set_table_for_first_display EXPORTING is_layout = ls_layout ""wa_layout i_structure_name = 'WY_ALV_BAIXO' * is_variant = wa_variant * i_save = 'A' * it_toolbar_excluding = t_exclude_fcode CHANGING it_fieldcatalog = lt_fieldcat it_outtab = ls_dados-alv_campos. "'t_nfe. ENDFORM. MODULE status_0100 OUTPUT. SET PF-STATUS 'S0100'. SET TITLEBAR 'ALV_EXAMPLES'. PERFORM f_upload_excel_file. ENDMODULE. MODULE display_grid OUTPUT. PERFORM f_upload_excel_file. ENDMODULE. MODULE user_command_0100 INPUT. * to react on oi_custom_events: CALL METHOD cl_gui_cfw=>dispatch. CASE sy-ucomm. WHEN 'BACK'. CLEAR sy-ucomm. LEAVE TO SCREEN 0. WHEN 'EXIT'. LEAVE PROGRAM. WHEN 'CANCEL'. CLEAR sy-ucomm. LEAVE TO SCREEN 0. ENDCASE. ENDMODULE. FORM busca_campo CHANGING p_campo TYPE string p_campo_tab TYPE wy_alv_baixo. CASE p_campo. WHEN 'Util.Material'. p_campo = 'J_1BMATUSE'. p_campo_tab-campo = 'IT_J_1BMATUSE'. p_campo_tab-elemento = 'J_1BMATUSE '. WHEN 'Material'. p_campo = 'MATNR'. p_campo_tab-campo = 'IT_MATNR'. p_campo_tab-elemento = 'MATNR'. WHEN 'Fornecedor'. p_campo = 'LIFNR'. p_campo_tab-campo = 'LF_LIFNR'. p_campo_tab-elemento = 'LIFNR'. WHEN OTHERS. ""COLOCAR MSG de ERRO CLEAR p_campo. ENDCASE. ENDFORM. FORM display_direito USING p_row_id TYPE lvc_s_roid-row_id. ** BEGIN OF wy_alv_componentes, ** tipo(30) TYPE c, ""tipo do objeto ** nome(30) TYPE c, ""Nome do objeto ** existe(4) TYPE c, ""Se existe no ambiente ** icon(4) TYPE c, ""icone de criar ** END OF wy_alv_componentes, **ty_alv_componente TYPE TABLE OF wy_alv_componentes, DATA: lt_fieldcat TYPE lvc_t_fcat, lt_componentes TYPE ty_alv_componente. DATA: ls_layout TYPE lvc_s_layo. DATA: ls_dados TYPE wy_dados. READ TABLE gt_dados INTO ls_dados INDEX p_row_id. PERFORM cria_fieldcat_componentes CHANGING lt_fieldcat. PERFORM preenche_tab_componentes USING ls_dados-tabela CHANGING lt_componentes. ls_layout-zebra = abap_true. ls_layout-no_toolbar = abap_true. ls_layout-grid_title = 'Componentes'. * ls_layout-cwidth_opt = abap_true. READ TABLE gt_dados INTO ls_dados INDEX p_row_id. SET HANDLER event_receiver->handle_hotspot_click FOR ctl_alv_moni_po_dr. CALL METHOD ctl_alv_moni_po_dr->set_table_for_first_display EXPORTING is_layout = ls_layout ""wa_layout i_structure_name = 'WY_ALV_BAIXO' * is_variant = wa_variant * i_save = 'A' * it_toolbar_excluding = t_exclude_fcode CHANGING it_fieldcatalog = lt_fieldcat it_outtab = lt_componentes. "'t_nfe. * CALL METHOD ctl_alv_moni_po_dr->set_too ENDFORM. FORM preenche_tab_componentes USING p_tab TYPE wy_dados-tabela CHANGING pt_componentes TYPE ty_alv_componente. DATA: ls_componentes TYPE wy_alv_componente. DATA: lt_tadir TYPE ty_tadir. DATA: ls_tadir TYPE wy_tadir. DATA: lv_objeto(11) TYPE c. DATA: lv_nuntab(3) TYPE c. "Numero da tabela encontrado IF p_tab IS NOT INITIAL. * FIND REGEX '\d{3}' IN p_tab MATCH OFFSET lv_nuntab. lv_nuntab = p_tab+12. lv_objeto = '/VTIVA/%' && lv_nuntab. SELECT object obj_name FROM tadir INTO TABLE lt_tadir WHERE object IN gr_object AND obj_name LIKE lv_objeto. ENDIF. * '@0V@'." OK; Continue; Choose