*&---------------------------------------------------------------------* *& Report ZCMS_VERSIMONGER *& *&---------------------------------------------------------------------* *& *& Author: Sikidin A.P. *&---------------------------------------------------------------------* REPORT zcms_versimonger. TABLES : dd02l , dd03l . TYPES : char60(60) TYPE c . SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE aaa1. PARAMETERS : p_sv TYPE char60 LOWER CASE OBLIGATORY , p_sr TYPE rollname OBLIGATORY . SELECTION-SCREEN END OF BLOCK b1 . SELECTION-SCREEN ULINE . SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE aaa2. PARAMETERS : p_dv TYPE char60 LOWER CASE OBLIGATORY , p_dr TYPE rollname OBLIGATORY . SELECTION-SCREEN END OF BLOCK b2 . PARAMETERS : p_m_join TYPE i DEFAULT 3 , p_m_solu TYPE i DEFAULT 1 . SELECT-OPTIONS : s_exclud FOR dd02l-tabname , s_ex_fna FOR dd03l-fieldname . *----------------------------------------------------------------------* * Selection Screen Class definition *----------------------------------------------------------------------* CLASS lcl_selscr DEFINITION. PUBLIC SECTION. CLASS-METHODS: set_text IMPORTING if_name TYPE char8 if_type TYPE char1 if_text TYPE char30, change_screen. PRIVATE SECTION. CLASS-DATA: t_text TYPE STANDARD TABLE OF rsseltexts. ENDCLASS. "lcl_selscr DEFINITION *----------------------------------------------------------------------* * CLASS lcl_event_handler DEFINITION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS lcl_event_handler DEFINITION. PUBLIC SECTION. METHODS : button_click FOR EVENT button_click OF cl_gui_alv_grid IMPORTING es_col_id es_row_no, close FOR EVENT close OF cl_gui_dialogbox_container. ENDCLASS. "lcl_event_handler DEFINITION TYPES: BEGIN OF t_tabname_fieldname, clnt TYPE mandt, tabname LIKE dd02l-tabname , fieldname LIKE dd03l-fieldname , rollname TYPE rollname, domname TYPE domname, datatype TYPE datatype_d, field_count TYPE i, value TYPE char60, END OF t_tabname_fieldname, BEGIN OF t_tabname, tabname LIKE dd02l-tabname, line_count TYPE i, value TYPE TABLE OF t_tabname_fieldname WITH NON-UNIQUE DEFAULT KEY, END OF t_tabname , BEGIN OF t_join , jjoin TYPE tabname , left TYPE tabname , right TYPE tabname , END OF t_join , BEGIN OF t_join_c , jjoin TYPE tabname , left_table TYPE tabname , left_field TYPE fieldname , right_table TYPE tabname , right_field TYPE fieldname , END OF t_join_c , BEGIN OF t_where , tabname TYPE tabname , fieldname TYPE fieldname , rollname TYPE rollname , value TYPE string , END OF t_where , BEGIN OF t_solution , id TYPE i , tjoin TYPE TABLE OF t_join WITH NON-UNIQUE DEFAULT KEY , tjoin_c TYPE TABLE OF t_join_c WITH NON-UNIQUE DEFAULT KEY , twhere TYPE TABLE OF t_where WITH NON-UNIQUE DEFAULT KEY , left TYPE tabname , right TYPE tabname , count TYPE i , END OF t_solution , BEGIN OF t_solution_screen , id TYPE i , show(5) TYPE c , check(5) TYPE c , left TYPE tabname , right TYPE tabname , join_count TYPE i , count TYPE i , cellstyles TYPE lvc_t_styl , END OF t_solution_screen . RANGES : r_datatype_ex FOR dd01l-datatype . DATA : lt_tabname_fieldname_source TYPE TABLE OF t_tabname_fieldname , lt_tabname_fieldname_destinati TYPE TABLE OF t_tabname_fieldname , gt_table TYPE TABLE OF t_tabname , gt_solution TYPE TABLE OF t_solution , gt_solution_1 TYPE TABLE OF t_solution , gt_solution_2 TYPE TABLE OF t_solution , gv_solution_count TYPE i , gt_solution_screen TYPE TABLE OF t_solution_screen , ls_solution TYPE t_solution , gv_table_exists TYPE c , gv_dest_domname TYPE domname , lv_total TYPE i , lv_i TYPE i , lv_progrss_message TYPE string , lv_progrss_message_2 TYPE string , lv_str_1 TYPE string , lv_str_2 TYPE string , lv_m_join TYPE i , gt_alredy_extended TYPE HASHED TABLE OF tabname WITH UNIQUE KEY table_line , alv_grid TYPE REF TO cl_gui_alv_grid , lt_fcat TYPE lvc_t_fcat , gs_layout TYPE lvc_s_layo , ls_style TYPE lvc_s_styl , popup TYPE REF TO cl_gui_dialogbox_container , text_editor TYPE REF TO cl_gui_textedit , lt_texttab TYPE soli_tab , handler TYPE REF TO lcl_event_handler . FIELD-SYMBOLS : TYPE t_tabname_fieldname , TYPE t_tabname_fieldname , TYPE t_where , TYPE t_solution , TYPE t_solution_screen , TYPE t_join , TYPE soli . *.... Initialization DEFINE add_text. append initial line to lt_texttab assigning . = &1. END-OF-DEFINITION. DEFINE add_field. r_datatype_ex-sign = 'I'. r_datatype_ex-option = 'EQ'. r_datatype_ex-low = &1. append r_datatype_ex. END-OF-DEFINITION. INITIALIZATION. add_field 'TIMS'. add_field 'DATS'. add_field 'DEC'. add_field 'CLNT'. add_field 'CURR'. add_field 'CUKY'. CREATE OBJECT handler. SET HANDLER : handler->button_click FOR ALL INSTANCES, handler->close FOR ALL INSTANCES. aaa1 = 'Source'. aaa2 = 'Destination'. sy-title = 'некачественная замена консультант в условиях дефицита конс. на проекте'. SELECT COUNT( * ) FROM dd03l WHERE tabname = 'ZCMS_VERSIMONGER'. IF sy-subrc = 0. gv_table_exists = 'X'. ELSE. add_text 'to increase speed of use program create 2 tables with folowing configuration'. add_text ' '. add_text 'ZCMS_VERSIMONGER'. add_text 'key fieldname type '. add_text '----------------------'. add_text 'X CLNT MANDT'. add_text 'X TABNAME TABNAME'. add_text 'X FIELDNAME FIELDNAME'. add_text ' ROLLNAME ROLLNAME'. add_text ' DOMNAME DOMNAME'. add_text ' DATATYPE DATATYPE_D'. add_text ' FIELD_COUNT INT4'. add_text ' VALUE char 60'. add_text ''. add_text '========================='. add_text ''. add_text 'ZCMS_VERSIMONGE1'. add_text 'key fieldname type '. add_text '----------------------'. add_text 'X CLNT MANDT'. add_text 'X TABNAME TABNAME'. add_text ' LINE_COUNT INT4'. CHECK popup IS NOT BOUND. CREATE OBJECT popup EXPORTING width = '1000' height = '200' top = '100' left = '100' caption = 'ZCMS_VERSIMONGER'. CREATE OBJECT text_editor EXPORTING parent = popup wordwrap_mode = '2' wordwrap_position = '250'. text_editor->set_text_as_r3table( EXPORTING table = lt_texttab[] ). ENDIF. *.... At Selection-Screen Output AT SELECTION-SCREEN OUTPUT. * text for Radiobuttons lcl_selscr=>set_text( if_name = 'P_SV' if_type = 'P' if_text = 'Value' ). lcl_selscr=>set_text( if_name = 'P_SR' if_type = 'P' if_text = 'Rollname' ). lcl_selscr=>set_text( if_name = 'P_DV' if_type = 'P' if_text = 'Value' ). lcl_selscr=>set_text( if_name = 'P_DR' if_type = 'P' if_text = 'Rollname' ). lcl_selscr=>set_text( if_name = 'P_M_JOIN' if_type = 'P' if_text = 'Max Join nesting' ). lcl_selscr=>set_text( if_name = 'P_M_SOLU' if_type = 'P' if_text = 'Stop at solution count' ). lcl_selscr=>set_text( if_name = 'S_EXCLUD' if_type = 'S' if_text = 'Tables to not use in join' ). lcl_selscr=>set_text( if_name = 'S_EX_FNA' if_type = 'S' if_text = 'Fields to not use in join cond' ). * Change the Selection Screen lcl_selscr=>change_screen( ). *.... Start of selection START-OF-SELECTION. lv_m_join = p_m_join - 3 . IF s_exclud[] IS INITIAL. s_exclud-sign = 'I'. s_exclud-option = 'EQ'. s_exclud-low = '1'. APPEND s_exclud. ENDIF. IF s_ex_fna[] IS INITIAL. s_ex_fna-sign = 'I'. s_ex_fna-option = 'EQ'. s_ex_fna-low = '1'. APPEND s_ex_fna. ENDIF. PERFORM get_table_for_value TABLES lt_tabname_fieldname_source USING p_sv p_sr . PERFORM get_table_for_value TABLES lt_tabname_fieldname_destinati USING p_dv p_dr . DESCRIBE TABLE lt_tabname_fieldname_source LINES lv_i. DESCRIBE TABLE lt_tabname_fieldname_destinati LINES lv_total. lv_total = lv_i * lv_total. lv_str_2 = lv_total. lv_i = 0. SELECT SINGLE domname INTO gv_dest_domname FROM dd03l WHERE rollname = p_dr. LOOP AT lt_tabname_fieldname_source ASSIGNING . LOOP AT lt_tabname_fieldname_destinati ASSIGNING . CLEAR ls_solution. ADD 1 TO lv_i. lv_str_1 = lv_i. IF LINES( gt_solution ) >= p_m_solu. CONTINUE. ENDIF. CONCATENATE lv_str_1 '/' lv_str_2 '--' -tabname '-' -fieldname '-=-' -tabname '-' -fieldname INTO lv_progrss_message. CALL FUNCTION 'PROGRESS_INDICATOR' EXPORTING i_text = lv_progrss_message i_processed = lv_i i_total = lv_total i_output_immediately = 'X'. APPEND INITIAL LINE TO ls_solution-twhere ASSIGNING . -tabname = -tabname. -fieldname = -fieldname. -value = -value. -rollname = -rollname. * IF -tabname = -tabname. * CONTINUE. * ENDIF. ls_solution-left = -tabname. ls_solution-right = -tabname. PERFORM get_solution USING ls_solution . ENDLOOP. ENDLOOP. IF lv_m_join >= 0. IF LINES( gt_solution ) < p_m_solu. LOOP AT lt_tabname_fieldname_source ASSIGNING . CLEAR ls_solution. APPEND INITIAL LINE TO ls_solution-twhere ASSIGNING . -tabname = -tabname. -fieldname = -fieldname. -value = -value. -rollname = -rollname. ls_solution-left = -tabname. PERFORM extend_solution CHANGING ls_solution. ENDLOOP. ENDIF. ENDIF. DO lv_m_join TIMES. CHECK LINES( gt_solution ) < p_m_solu. gt_solution_1 = gt_solution_2. CLEAR gt_solution_2. DESCRIBE TABLE gt_solution_1 LINES lv_i. DESCRIBE TABLE lt_tabname_fieldname_destinati LINES lv_total. lv_total = lv_i * lv_total. lv_str_2 = lv_total. lv_i = 0. CHECK LINES( gt_solution ) < p_m_solu. LOOP AT gt_solution_1 ASSIGNING . PERFORM extend_solution CHANGING . ENDLOOP. ENDDO. SORT gt_solution BY count ASCENDING. IF gt_solution[] IS NOT INITIAL. LOOP AT gt_solution ASSIGNING . APPEND INITIAL LINE TO gt_solution_screen ASSIGNING . -id = -id. -count = -count. -show = 'show'. -check = 'check'. ls_style-fieldname = 'CHECK' . ls_style-style = cl_gui_alv_grid=>mc_style_button . APPEND ls_style TO -cellstyles . ls_style-fieldname = 'SHOW' . ls_style-style = cl_gui_alv_grid=>mc_style_button . APPEND ls_style TO -cellstyles . LOOP AT -tjoin ASSIGNING . ADD 1 TO -join_count. AT FIRST. -left = -left. ENDAT. AT LAST. -right = -right. ENDAT. ENDLOOP. ENDLOOP. WRITE: '1'. CREATE OBJECT alv_grid EXPORTING i_parent = cl_gui_custom_container=>screen0. PERFORM build_fcat CHANGING lt_fcat[]. alv_grid->set_table_for_first_display( EXPORTING is_layout = gs_layout CHANGING it_outtab = gt_solution_screen[] it_fieldcatalog = lt_fcat[] ). ENDIF. *----------------------------------------------------------------------* * Selection Screen Class definition *----------------------------------------------------------------------* CLASS lcl_selscr IMPLEMENTATION. METHOD set_text. DATA: la_text LIKE LINE OF t_text. la_text-name = if_name. la_text-kind = if_type. la_text-text = if_text. APPEND la_text TO t_text. ENDMETHOD. "set_text METHOD change_screen. CALL FUNCTION 'SELECTION_TEXTS_MODIFY' EXPORTING program = sy-cprog TABLES seltexts = t_text. ENDMETHOD. "change_screen ENDCLASS. "lcl_selscr IMPLEMENTATION *&---------------------------------------------------------------------* *& Form GET_TABLE_FOR_VALUE *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_P_SV text * -->P_P_SR text * -->P_LT_TABNAME_FIELDNAME_SOURCE text *----------------------------------------------------------------------* FORM get_table_for_value TABLES p_tabname_fieldname TYPE STANDARD TABLE USING p_value TYPE char60 p_rollname TYPE rollname . DATA : lv_tabix TYPE sy-tabix , lv_rc TYPE sysubrc , lv_error TYPE string , lv_total TYPE i , lv_i TYPE i , str_i TYPE string , str_total TYPE string . CONCATENATE 'Searching tables for' p_rollname 'rollname' INTO lv_progrss_message SEPARATED BY space. CALL FUNCTION 'PROGRESS_INDICATOR' EXPORTING i_text = lv_progrss_message i_processed = 1 i_total = 1 i_output_immediately = 'X'. SELECT dd02l~tabname dd03l~fieldname dd03l~rollname dd03l~domname INTO CORRESPONDING FIELDS OF TABLE p_tabname_fieldname FROM dd02l INNER JOIN dd03l ON dd02l~tabname = dd03l~tabname WHERE dd02l~tabname NOT IN s_exclud AND dd02l~tabclass = 'TRANSP' AND dd02l~as4local = 'A' AND dd03l~rollname = p_rollname . lv_total = LINES( p_tabname_fieldname ). str_total = lv_total. LOOP AT p_tabname_fieldname ASSIGNING . ADD 1 TO lv_i. str_i = lv_i. CONCATENATE 'processing' str_i '/' str_total 'table, seerching value ' p_value INTO lv_progrss_message SEPARATED BY space. CALL FUNCTION 'PROGRESS_INDICATOR' EXPORTING i_text = lv_progrss_message i_processed = lv_i i_total = lv_total i_output_immediately = 'X'. lv_tabix = sy-tabix. -value = p_value. PERFORM filter_table_by_value USING p_value CHANGING lv_rc. IF lv_rc NE 0. DELETE p_tabname_fieldname INDEX lv_tabix. ENDIF. ENDLOOP. IF p_tabname_fieldname[] IS INITIAL. CONCATENATE 'Something wrong: cann''t find any table with value ' p_value INTO lv_error . MESSAGE lv_error TYPE 'E'. ENDIF. ENDFORM. " GET_TABLE_FOR_VALUE *&---------------------------------------------------------------------* *& Form FILTER_TABLE_BY_VALUE *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_ text * -->P_P_DV text * <--P_LV_RC text *----------------------------------------------------------------------* FORM filter_table_by_value USING p_tabname_fieldname TYPE t_tabname_fieldname p_value TYPE char60 CHANGING c_rc. DATA : dref TYPE REF TO data , ls_where TYPE string , lv_string TYPE string . FIELD-SYMBOLS : TYPE ANY . CREATE DATA dref TYPE (p_tabname_fieldname-rollname) . ASSIGN dref->* TO . TRY . CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' EXPORTING input = p_value IMPORTING output = . CATCH cx_sy_dyn_call_illegal_type . = p_value. ENDTRY. lv_string = . CONCATENATE '''' lv_string '''' INTO ls_where. CONCATENATE p_tabname_fieldname-fieldname '=' ls_where INTO ls_where SEPARATED BY space. SELECT SINGLE (p_tabname_fieldname-fieldname) INTO FROM (p_tabname_fieldname-tabname) WHERE (ls_where). c_rc = sy-subrc. IF sy-subrc NE 0. CONCATENATE '''' p_value '''' INTO ls_where. CONCATENATE p_tabname_fieldname-fieldname '=' ls_where INTO ls_where SEPARATED BY space. SELECT SINGLE (p_tabname_fieldname-fieldname) INTO FROM (p_tabname_fieldname-tabname) WHERE (ls_where). c_rc = sy-subrc. ENDIF. ENDFORM. " FILTER_TABLE_BY_VALUE *&---------------------------------------------------------------------* *& Form GET_SOLUTION *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_ text * -->P_ text *----------------------------------------------------------------------* FORM get_solution USING p_solution TYPE t_solution . DATA : lt_source TYPE TABLE OF t_tabname_fieldname , lt_destination TYPE TABLE OF t_tabname_fieldname , lv_solution TYPE t_solution , lv_rc TYPE sy-subrc , ls_clear_tab_field TYPE t_tabname_fieldname , lv_solution_found TYPE c , lv_dummy TYPE i . FIELD-SYMBOLS : TYPE t_tabname_fieldname , TYPE t_tabname_fieldname . PERFORM get_domain_for_table TABLES lt_source USING p_solution-left. PERFORM get_domain_for_table TABLES lt_destination USING p_solution-right. LOOP AT lt_source ASSIGNING WHERE field_count > 1 AND datatype NOT IN r_datatype_ex AND fieldname NOT IN s_ex_fna . IF LINES( gt_solution ) >= p_m_solu. CONTINUE. ENDIF. LOOP AT lt_destination ASSIGNING WHERE domname = -domname. IF LINES( gt_solution ) >= p_m_solu. CONTINUE. ENDIF. * WRITE : / -tabname, -fieldname, -tabname, -fieldname. lv_solution = p_solution. PERFORM build_solution USING CHANGING lv_solution . PERFORM check_solution USING lv_solution ls_clear_tab_field CHANGING lv_rc lv_dummy. IF lv_rc = 0. PERFORM check_destinat USING lv_solution CHANGING lv_rc. IF lv_rc = 0. lv_solution_found = 'X'. ENDIF. ENDIF. ENDLOOP. ENDLOOP. ENDFORM. " GET_SOLUTION *&---------------------------------------------------------------------* *& Form get_domain_for_table *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->LT_T text * -->TABNAME text *----------------------------------------------------------------------* FORM get_domain_for_table TABLES lt_t TYPE STANDARD TABLE USING tabname TYPE tabname. TYPES : BEGIN OF zcms_versimonge1 , clnt TYPE mandt , tabname TYPE tabname , line_count TYPE int4 , END OF zcms_versimonge1 . DATA : lv_select TYPE string , tab_found TYPE c , ls_versimonger1 TYPE zcms_versimonge1 . FIELD-SYMBOLS : TYPE t_tabname , TYPE t_tabname_fieldname . tab_found = 'X'. READ TABLE gt_table ASSIGNING WITH KEY tabname = tabname. IF sy-subrc NE 0. APPEND INITIAL LINE TO gt_table ASSIGNING . IF gv_table_exists IS NOT INITIAL. SELECT SINGLE tabname line_count INTO (-tabname, -line_count) FROM ('ZCMS_VERSIMONGE1') WHERE tabname = tabname. IF sy-subrc NE 0. CLEAR tab_found . ELSE. SELECT * INTO CORRESPONDING FIELDS OF TABLE -value FROM ('ZCMS_VERSIMONGER') WHERE tabname = tabname. ENDIF. ENDIF. IF tab_found IS INITIAL. -tabname = tabname. SELECT COUNT( * ) INTO -line_count FROM (tabname). MOVE-CORRESPONDING TO ls_versimonger1. SELECT dd02l~tabname dd03l~fieldname dd03l~rollname dd03l~domname dd01l~datatype INTO CORRESPONDING FIELDS OF TABLE -value FROM dd02l INNER JOIN dd03l ON dd02l~tabname = dd03l~tabname INNER JOIN dd01l ON dd03l~domname = dd01l~domname WHERE dd02l~tabclass = 'TRANSP' AND dd02l~as4local = 'A' AND dd02l~tabname = tabname AND dd03l~fieldname NE '.INCLUDE' . LOOP AT -value ASSIGNING . CONCATENATE 'COUNT( DISTINCT' -fieldname ')' INTO lv_select SEPARATED BY space. SELECT (lv_select) INTO -field_count FROM (tabname). ENDSELECT. ENDLOOP. ENDIF. SORT -value[] BY field_count DESCENDING. IF gv_table_exists IS NOT INITIAL AND tab_found IS INITIAL. INSERT ('ZCMS_VERSIMONGER') FROM TABLE -value[]. INSERT ('ZCMS_VERSIMONGE1') FROM ls_versimonger1. ENDIF. ENDIF. lt_t[] = -value[]. ENDFORM. "get_domain_for_table *&---------------------------------------------------------------------* *& Form BUILD_CHECK_SOLUTION *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_ text * -->P_ text * <--P_LV_SOLUTION text * <--P_LV_RC text *----------------------------------------------------------------------* FORM build_solution USING p_source TYPE t_tabname_fieldname p_destination TYPE t_tabname_fieldname CHANGING p_solution TYPE t_solution . DATA : lv_n TYPE n , join_name TYPE tabname , join_name_pred TYPE tabname . FIELD-SYMBOLS : TYPE t_join , TYPE t_join_c . LOOP AT p_solution-tjoin ASSIGNING . ADD 1 TO lv_n. ENDLOOP. IF lv_n = 0. join_name_pred = p_source-tabname. ELSE. lv_n = lv_n - 1. CONCATENATE 'JOIN' lv_n INTO join_name_pred. ADD 1 TO lv_n. ENDIF. CONCATENATE 'JOIN' lv_n INTO join_name. APPEND INITIAL LINE TO p_solution-tjoin ASSIGNING . -jjoin = join_name. -left = join_name_pred. -right = p_destination-tabname. APPEND INITIAL LINE TO p_solution-tjoin_c ASSIGNING . -jjoin = join_name. -left_table = p_source-tabname. -left_field = p_source-fieldname. -right_table = p_destination-tabname. -right_field = p_destination-fieldname. ENDFORM. " BUILD_CHECK_SOLUTION *&---------------------------------------------------------------------* *& Form CHECK_SOLUTION *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * <--P_P_RC text * -->P_P_SOLUTION text *----------------------------------------------------------------------* FORM check_solution USING p_solution TYPE t_solution p_destination TYPE t_tabname_fieldname CHANGING p_rc TYPE sy-subrc p_count TYPE i . DATA : dref TYPE REF TO data , ls_where_str TYPE string , ls_where_str_1 TYPE string , lt_where TYPE TABLE OF string , ls_where TYPE t_where , lt_join TYPE TABLE OF string , ls_join TYPE string , lv_str TYPE string , lv_right TYPE string , lv_left TYPE string , ls_what TYPE string , lv_string TYPE string . FIELD-SYMBOLS : TYPE ANY , TYPE ANY , TYPE t_join , TYPE t_join_c . CLEAR p_rc. READ TABLE p_solution-twhere INTO ls_where INDEX 1. CREATE DATA dref TYPE (ls_where-rollname) . ASSIGN dref->* TO . TRY . CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' EXPORTING input = ls_where-value IMPORTING output = . CATCH cx_sy_dyn_call_illegal_type . = ls_where-value. ENDTRY. lv_string = . CONCATENATE '''' lv_string '''' INTO ls_where_str. CONCATENATE ls_where-tabname '~' ls_where-fieldname INTO lv_left. CONCATENATE lv_left '=' ls_where_str INTO ls_where_str SEPARATED BY space. ls_where_str_1 = ls_where_str. CONCATENATE '''' ls_where-value '''' INTO ls_where_str. CONCATENATE ls_where-tabname '~' ls_where-fieldname INTO lv_left. CONCATENATE lv_left '=' ls_where_str INTO ls_where_str SEPARATED BY space. CONCATENATE '(' ls_where_str_1 'or' ls_where_str ')' INTO ls_where_str SEPARATED BY space. APPEND ls_where_str TO lt_where. IF p_destination IS NOT INITIAL. CREATE DATA dref TYPE (p_destination-rollname) . ASSIGN dref->* TO . TRY . CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' EXPORTING input = p_dv IMPORTING output = . CATCH cx_sy_dyn_call_illegal_type . = p_dv. ENDTRY. lv_string = . CONCATENATE '''' lv_string '''' INTO ls_where_str. CONCATENATE p_destination-tabname '~' p_destination-fieldname INTO lv_left. CONCATENATE lv_left '=' ls_where_str INTO ls_where_str SEPARATED BY space. ls_where_str_1 = ls_where_str. CONCATENATE '''' p_dv '''' INTO ls_where_str. CONCATENATE p_destination-tabname '~' p_destination-fieldname INTO lv_left. CONCATENATE lv_left '=' ls_where_str INTO ls_where_str SEPARATED BY space. CONCATENATE 'and (' ls_where_str_1 'or' ls_where_str ')' INTO ls_where_str SEPARATED BY space. APPEND ls_where_str TO lt_where. ENDIF. LOOP AT p_solution-tjoin ASSIGNING . IF sy-tabix = 1. IF -left NE -right . CONCATENATE -left 'inner join ' -right 'on' INTO lv_str SEPARATED BY space. ELSE. lv_str = -left. ENDIF. ELSE. CONCATENATE 'inner join ' -right 'on' INTO lv_str SEPARATED BY space. ENDIF. APPEND lv_str TO lt_join. LOOP AT p_solution-tjoin_c ASSIGNING WHERE jjoin = -jjoin. IF -left_table EQ -right_table. CONTINUE. ENDIF. CONCATENATE -left_table '~' -left_field INTO lv_left. CONCATENATE -right_table '~' -right_field INTO lv_right. CONCATENATE lv_left '=' lv_right INTO lv_str SEPARATED BY space. APPEND lv_str TO lt_join. ENDLOOP. ENDLOOP. CONCATENATE ls_where-tabname '~' ls_where-fieldname INTO ls_what. TRY . SELECT SINGLE (ls_what) INTO FROM (lt_join) WHERE (lt_where). CATCH cx_sy_dynamic_osql_semantics . sy-subrc = 1. ENDTRY. p_rc = sy-subrc. IF LINES( lt_where ) = 2. DELETE lt_where INDEX 2. CONCATENATE 'count(' ls_what ')' INTO ls_what SEPARATED BY space. TRY . SELECT (ls_what) INTO p_count FROM (lt_join) WHERE (lt_where). ENDSELECT. CATCH cx_sy_dynamic_osql_semantics. ENDTRY. ENDIF. ENDFORM. " CHECK_SOLUTION *&---------------------------------------------------------------------* *& Form CHECK_DESTINAT *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_P_SOLUTION text * <--P_LV_RC text *----------------------------------------------------------------------* FORM check_destinat USING p_solution TYPE t_solution CHANGING p_rc TYPE sy-subrc. p_rc = 4. DATA : lt_destination TYPE TABLE OF t_tabname_fieldname , lv_rc TYPE sy-subrc , ls_solution TYPE t_solution , lv_count TYPE i . FIELD-SYMBOLS : TYPE t_join , TYPE t_tabname_fieldname , TYPE t_where . LOOP AT p_solution-tjoin ASSIGNING . ENDLOOP. PERFORM get_domain_for_table TABLES lt_destination USING -right. LOOP AT lt_destination ASSIGNING WHERE domname = gv_dest_domname. PERFORM check_solution USING p_solution CHANGING lv_rc lv_count. IF lv_rc = 0 AND lv_count < 100. CLEAR p_rc. ls_solution = p_solution. APPEND INITIAL LINE TO ls_solution-twhere ASSIGNING . -tabname = -right. -fieldname = -fieldname. -rollname = -rollname. -value = p_dv. ADD 1 TO gv_solution_count. ls_solution-id = gv_solution_count. ls_solution-count = lv_count. APPEND ls_solution TO gt_solution. ENDIF. ENDLOOP. ENDFORM. " CHECK_DESTINAT *&---------------------------------------------------------------------* *& Form build_fcat *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->PT_FIELDCAT text *----------------------------------------------------------------------* FORM build_fcat CHANGING pt_fieldcat TYPE lvc_t_fcat . DATA ls_fcat TYPE lvc_s_fcat . REFRESH: pt_fieldcat. CLEAR ls_fcat. ls_fcat-fieldname = 'ID' . ls_fcat-inttype = 'I' . ls_fcat-outputlen = '5' . ls_fcat-coltext = 'ID' . APPEND ls_fcat TO pt_fieldcat . CLEAR ls_fcat. ls_fcat-fieldname = 'SHOW' . ls_fcat-inttype = 'C' . ls_fcat-outputlen = '5' . ls_fcat-coltext = 'SHOW' . APPEND ls_fcat TO pt_fieldcat . CLEAR ls_fcat. ls_fcat-fieldname = 'CHECK' . ls_fcat-inttype = 'C' . ls_fcat-outputlen = '5' . ls_fcat-coltext = 'CHECK' . APPEND ls_fcat TO pt_fieldcat . CLEAR ls_fcat. ls_fcat-fieldname = 'LEFT' . ls_fcat-inttype = 'C' . ls_fcat-outputlen = '30' . ls_fcat-coltext = 'LEFT' . ls_fcat-seltext = 'LEFT' . APPEND ls_fcat TO pt_fieldcat . CLEAR ls_fcat. ls_fcat-fieldname = 'RIGHT' . ls_fcat-inttype = 'C' . ls_fcat-outputlen = '30' . ls_fcat-coltext = 'RIGHT' . ls_fcat-seltext = 'RIGHT' . APPEND ls_fcat TO pt_fieldcat . CLEAR ls_fcat. ls_fcat-fieldname = 'COUNT' . ls_fcat-inttype = 'I' . ls_fcat-outputlen = '30' . ls_fcat-coltext = 'COUNT' . ls_fcat-seltext = 'COUNT' . APPEND ls_fcat TO pt_fieldcat . CLEAR ls_fcat. ls_fcat-fieldname = 'JOIN_COUNT' . ls_fcat-inttype = 'I' . ls_fcat-outputlen = '30' . ls_fcat-coltext = 'JOIN_COUNT' . ls_fcat-seltext = 'JOIN_COUNT' . APPEND ls_fcat TO pt_fieldcat . gs_layout-cwidth_opt = 'X'. gs_layout-grid_title = 'ZCMS_VERSIMONGER'. gs_layout-sel_mode = 'A'. gs_layout-no_rowmark = 'X'. gs_layout-zebra = 'X'. gs_layout-stylefname = 'CELLSTYLES' . ENDFORM. "build_fcat *----------------------------------------------------------------------* * CLASS lcl_event_handler IMPLEMENTATION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS lcl_event_handler IMPLEMENTATION. METHOD button_click. DATA : dref_input TYPE REF TO data , dref_output TYPE REF TO data , i_answer TYPE c , i_valueout TYPE as4text , output_string TYPE string . FIELD-SYMBOLS : TYPE ANY , TYPE ANY , TYPE soli . DATA : program(8) , message(128) , routine TYPE string , line TYPE i. IF es_col_id-fieldname = 'SHOW'. CHECK popup IS NOT BOUND. CREATE OBJECT popup EXPORTING width = '1000' height = '200' top = '100' left = '100' caption = 'ZCMS_VERSIMONGER'. CREATE OBJECT text_editor EXPORTING parent = popup wordwrap_mode = '2' wordwrap_position = '250'. READ TABLE gt_solution_screen ASSIGNING INDEX es_row_no-row_id. READ TABLE gt_solution ASSIGNING WITH KEY id = -id. PERFORM get_form TABLES lt_texttab USING CHANGING routine. text_editor->set_text_as_r3table( EXPORTING table = lt_texttab[] ). ENDIF. IF es_col_id-fieldname = 'CHECK'. READ TABLE gt_solution_screen ASSIGNING INDEX es_row_no-row_id. READ TABLE gt_solution ASSIGNING INDEX -id. PERFORM get_form TABLES lt_texttab USING CHANGING routine. INSERT INITIAL LINE INTO lt_texttab ASSIGNING INDEX 1. = 'program xz.'. GENERATE SUBROUTINE POOL lt_texttab NAME program MESSAGE message LINE line. IF sy-subrc = 0. CREATE DATA dref_input TYPE (p_sr) . ASSIGN dref_input->* TO . CREATE DATA dref_output TYPE (p_dr) . ASSIGN dref_output->* TO . CALL FUNCTION 'POPUP_TO_GET_VALUE' EXPORTING fieldname = 'DDTEXT' tabname = 'DD90T' titel = 'source value?' valuein = p_sv IMPORTING answer = i_answer valueout = i_valueout EXCEPTIONS fieldname_not_found = 1 OTHERS = 2. IF i_answer NE 'C'. TRY . CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' EXPORTING input = i_valueout IMPORTING output = . CATCH cx_sy_dyn_call_illegal_type . = i_valueout. ENDTRY. PERFORM (routine) IN PROGRAM (program) USING CHANGING . TRY . CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT' EXPORTING input = IMPORTING output = output_string. CATCH cx_sy_dyn_call_illegal_type. output_string = . ENDTRY. MESSAGE output_string TYPE 'I'. ENDIF. ELSE. MESSAGE message TYPE 'E' . ENDIF. ENDIF. ENDMETHOD. "hotspot_click METHOD close. popup->free( ). CLEAR popup. ENDMETHOD. "close ENDCLASS. "lcl_event_handler IMPLEMENTATION *&---------------------------------------------------------------------* *& Form GET_FORM *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_LT_TEXTTAB text * -->P_ text *----------------------------------------------------------------------* FORM get_form TABLES p_texttab TYPE soli_tab USING p_solution TYPE t_solution CHANGING routine_name . DEFINE add_line. append initial line to p_texttab assigning . = &1. translate using '$ '. END-OF-DEFINITION. DATA : lv_str TYPE string , str_1 TYPE string , str_2 TYPE string , str_3 TYPE string , str_4 TYPE string , lv_right TYPE string , lv_left TYPE string , char30(30) TYPE c . FIELD-SYMBOLS : TYPE soli , TYPE t_where , TYPE t_where , TYPE t_join_c . REFRESH p_texttab. READ TABLE p_solution-twhere ASSIGNING INDEX 1. READ TABLE p_solution-twhere ASSIGNING INDEX 2. CONCATENATE 'Get_' -fieldname '_by_' -fieldname INTO str_1. char30 = str_1. str_1 = char30. TRANSLATE str_1 TO UPPER CASE. routine_name = str_1. CONCATENATE 'c_' -fieldname INTO str_2. CONCATENATE 'u_' -fieldname INTO str_3. CONCATENATE 'Form' str_1 'using' str_3 'type' -rollname INTO lv_str SEPARATED BY space. add_line lv_str. CONCATENATE '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$changing' str_2 'type' -rollname '.' INTO lv_str SEPARATED BY space. add_line lv_str. add_line '* generated by ZCMS_VERSIMONGER' . add_line '' . CONCATENATE -tabname '~' -fieldname INTO str_1. CONCATENATE '$$$$select single ' str_1 'into' str_2 INTO lv_str SEPARATED BY space. add_line lv_str. add_line '$$$$from'. LOOP AT p_solution-tjoin ASSIGNING . IF sy-tabix = 1. IF -left ne -right. CONCATENATE '$$$$$$$$' -left 'inner join ' -right 'on' INTO lv_str SEPARATED BY space. else. CONCATENATE '$$$$$$$$' -left INTO lv_str SEPARATED BY space. ENDIF. ELSE. CONCATENATE '$$$$$$$inner join ' -right 'on' INTO lv_str SEPARATED BY space. ENDIF. add_line lv_str . LOOP AT p_solution-tjoin_c ASSIGNING WHERE jjoin = -jjoin. IF -left_table eq -right_table. continue. ENDIF. CONCATENATE '$$$$$$$$' -left_table '~' -left_field INTO lv_left. CONCATENATE -right_table '~' -right_field INTO lv_right. CONCATENATE lv_left '=' lv_right INTO lv_str SEPARATED BY space. add_line lv_str . ENDLOOP. ENDLOOP. add_line '$$$$where'. CONCATENATE -tabname '~' -fieldname INTO lv_left. CONCATENATE '$$$$$$$' lv_left '=' str_3 '.' INTO lv_str SEPARATED BY space. add_line lv_str. add_line 'endform.' . ENDFORM. " GET_FORM *&---------------------------------------------------------------------* *& Form EXTEND_SOLUTION *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * <--P_LS_SOLUTION text *----------------------------------------------------------------------* FORM extend_solution CHANGING p_solution TYPE t_solution. TYPES : BEGIN OF t_table_domname , tabname TYPE tabname , fieldname TYPE fieldname , domname TYPE domname , END OF t_table_domname . DATA : lt_tabname TYPE TABLE OF t_table_domname , ls_solution TYPE t_solution , lv_n TYPE n , join_name TYPE tabname , join_name_pred TYPE tabname , lt_source TYPE TABLE OF t_tabname_fieldname , clear_destination TYPE t_tabname_fieldname , lv_rc TYPE sy-subrc , dummy_count TYPE i , lv_i TYPE i , lv_i2 TYPE i , lv_str_1 TYPE string , lv_str_2 TYPE string , lv_str_3 TYPE string , lv_str_4 TYPE string . FIELD-SYMBOLS : TYPE tabname , TYPE t_table_domname , TYPE t_join , TYPE t_join , TYPE t_join_c , TYPE t_tabname_fieldname . READ TABLE gt_alredy_extended ASSIGNING WITH TABLE KEY table_line = p_solution-left. IF sy-subrc = 0. RETURN. ENDIF. IF LINES( gt_solution ) >= p_m_solu. RETURN. ENDIF. PERFORM get_domain_for_table TABLES lt_source USING p_solution-left. CONCATENATE 'Extending solution for table ' p_solution-left '...' INTO lv_progrss_message SEPARATED BY space. CALL FUNCTION 'PROGRESS_INDICATOR' EXPORTING i_text = lv_progrss_message i_processed = 1 i_total = 1 i_output_immediately = 'X'. SELECT dd2_dest~tabname dd3_dest~fieldname dd3_dest~domname INTO CORRESPONDING FIELDS OF TABLE lt_tabname FROM dd02l AS dd2_dest INNER JOIN dd03l AS dd3_dest ON dd2_dest~tabname = dd3_dest~tabname INNER JOIN dd03l AS dd3_source ON dd3_source~domname = dd3_dest~domname WHERE dd3_source~tabname = p_solution-left AND dd3_dest~as4local = 'A' AND dd3_dest~datatype NOT IN r_datatype_ex AND dd3_dest~domname NOT IN ('XFELD', '') AND dd3_dest~as4local = 'A' AND dd2_dest~as4local = 'A' AND dd2_dest~tabclass = 'TRANSP' . SORT lt_tabname BY tabname fieldname domname. DELETE ADJACENT DUPLICATES FROM lt_tabname COMPARING ALL FIELDS. DESCRIBE TABLE lt_tabname LINES lv_total. lv_str_1 = lv_total. LOOP AT lt_tabname ASSIGNING WHERE tabname NE p_solution-left AND tabname NOT IN s_exclud AND fieldname NOT IN s_ex_fna. IF LINES( gt_solution ) >= p_m_solu. CONTINUE. ENDIF. READ TABLE gt_alredy_extended ASSIGNING WITH TABLE KEY table_line = -tabname. IF sy-subrc = 0. CONTINUE. ENDIF. ADD 1 TO lv_i. lv_str_2 = lv_i. CONCATENATE lv_str_2 '/' lv_str_1 'finding extend solution for table ' p_solution-left INTO lv_progrss_message SEPARATED BY space. CALL FUNCTION 'PROGRESS_INDICATOR' EXPORTING i_text = lv_progrss_message i_processed = lv_i i_total = lv_total i_output_immediately = 'X'. LOOP AT lt_source ASSIGNING WHERE domname = -domname AND fieldname NOT IN s_ex_fna. IF LINES( gt_solution ) >= p_m_solu. CONTINUE. ENDIF. ls_solution = p_solution. ls_solution-left = -tabname. LOOP AT ls_solution-tjoin ASSIGNING . ADD 1 TO lv_n. ENDLOOP. IF lv_n = 0. join_name_pred = ls_solution-left. ELSE. lv_n = lv_n - 1. CONCATENATE 'JOIN' lv_n INTO join_name_pred. ADD 1 TO lv_n. ENDIF. CONCATENATE 'JOIN' lv_n INTO join_name. APPEND INITIAL LINE TO ls_solution-tjoin ASSIGNING . -jjoin = join_name. -left = join_name_pred. -right = -tabname. APPEND INITIAL LINE TO ls_solution-tjoin_c ASSIGNING . -jjoin = join_name. -left_table = ls_solution-left. -left_field = -fieldname. -right_table = -tabname. -right_field = -fieldname. PERFORM check_solution USING ls_solution clear_destination CHANGING lv_rc dummy_count. IF lv_rc = 0. APPEND ls_solution TO gt_solution_2. CLEAR lv_i2. DESCRIBE TABLE lt_tabname_fieldname_destinati LINES lv_total. lv_str_4 = lv_total. LOOP AT lt_tabname_fieldname_destinati ASSIGNING . ADD 1 TO lv_i2. lv_str_3 = lv_i2. IF LINES( gt_solution ) >= p_m_solu. CONTINUE. ENDIF. CONCATENATE lv_progrss_message lv_str_3 '/' lv_str_4 '--' -tabname '-' -fieldname INTO lv_progrss_message_2 SEPARATED BY space. CALL FUNCTION 'PROGRESS_INDICATOR' EXPORTING i_text = lv_progrss_message_2 i_processed = lv_i i_total = lv_total i_output_immediately = 'X'. LOOP AT ls_solution-tjoin ASSIGNING . ENDLOOP. ls_solution-left = -right. ls_solution-right = -tabname. PERFORM get_solution USING ls_solution . ENDLOOP. ENDIF. ENDLOOP. ENDLOOP. INSERT p_solution-left INTO TABLE gt_alredy_extended. ENDFORM. " EXTEND_SOLUTION