* _______ _______ _______ _______ _______ _______ ______ _______ _______ ______ _______ * | _ | _ | _ | | | _ | || _ | _ | _ | | _ | * | |_| | |_| | |_| | _ | | |_| | _ | |_| | |_| | | || | |_| | * | | | | |_| | | | | | | | | |_||_| | * | | _ || | ___| _| | |_| | | _ || __ | | * | _ | |_| | _ | | | |_| _ | | _ | |_| | | | | _ | * |__| |__|_______|__| |__|___| |_______|__| |__|______||__| |__|_______|___| |_|__| |__| * www.abapcadabra.com * *------------------------------------------------------------------------------------------- * program : ZABAPCADABRA_TRANSPORT_VIEWER * title : Overview of release/imports for a set of transports * functional area : Cross modules * environment : 4.7 * program Function : This ALV report lists all released transports that are * specified on the selection screen. The sequence they * were released in is regarded as leading for the sequence * they should be imported. Reimports are highlighted (in * yellow) and sequence faults are shown in red. If a * transport of copies is used (to resolve issues) this * is also reported. * Documentation : Search for "transport landscape" on AbapcadabrA.com * Previous version : This is the initial version * Developer name : Wim Maasdam * Development date : 16/09/2014 * Version : 0.1 *--------------------------------------------------------------------- * Change list: * Date Description * 16/09/2014 Initial release * *--------------------------------------------------------------------- REPORT zabapcadabra_transport_viewer. TABLES: e070, syst, sscrfields. "Selection-screen purpose only TYPE-POOLS: strhi. CLASS lcl_event_manager DEFINITION DEFERRED. CLASS lcl_investigator DEFINITION DEFERRED. DATA: go_event_man TYPE REF TO lcl_event_manager. *----------------------------------------------------------------------* * CLASS lcl_event_manager DEFINITION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS lcl_event_manager DEFINITION. PUBLIC SECTION. METHODS: constructor IMPORTING r_object TYPE REF TO cl_salv_table, on_link_click FOR EVENT link_click OF cl_salv_events_table IMPORTING row column. PRIVATE SECTION. DATA: go_salv TYPE REF TO cl_salv_table. ENDCLASS. "lcl_event_manager DEFINITION *----------------------------------------------------------------------* * CLASS lcl_investigator DEFINITION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS lcl_investigator DEFINITION FINAL. PUBLIC SECTION. TYPES: BEGIN OF ty_import, system TYPE sy-sysid, client TYPE sy-mandt, trkorr TYPE e070-trkorr, trfunction TYPE e070-trfunction, date TYPE d, time TYPE t, result(35), reimported TYPE boolean, END OF ty_import, BEGIN OF ty_report, trkorr TYPE e070-trkorr, trfunction TYPE e070-trfunction, trfunction_txt TYPE val_text, as4text TYPE e07t-as4text, as4user TYPE e070-as4user, release_date TYPE d, release_time TYPE t, index(3) TYPE n, system1 TYPE sy-sysid, date1 TYPE d, time1 TYPE t, index1(3) TYPE n, result1(35), reimported1(1), system2 TYPE sy-sysid, date2 TYPE d, time2 TYPE t, index2(3) TYPE n, result2(35), reimported2(1), system3 TYPE sy-sysid, date3 TYPE d, time3 TYPE t, index3(3) TYPE n, result3(35), reimported3(1), system4 TYPE sy-sysid, date4 TYPE d, time4 TYPE t, index4(3) TYPE n, result4(35), reimported4(1), system5 TYPE sy-sysid, date5 TYPE d, time5 TYPE t, index5(3) TYPE n, result5(35), reimported5(1), system6 TYPE sy-sysid, date6 TYPE d, time6 TYPE t, index6(3) TYPE n, result6(35), reimported6(1), system7 TYPE sy-sysid, date7 TYPE d, time7 TYPE t, index7(3) TYPE n, result7(35), reimported7(1), system8 TYPE sy-sysid, date8 TYPE d, time8 TYPE t, index8(3) TYPE n, result8(35), reimported8(1), system9 TYPE sy-sysid, date9 TYPE d, time9 TYPE t, index9(3) TYPE n, result9(35), reimported9(1), system10 TYPE sy-sysid, date10 TYPE d, time10 TYPE t, index10(3) TYPE n, result10(35), reimported10(1), system11 TYPE sy-sysid, date11 TYPE d, time11 TYPE t, index11(3) TYPE n, result11(35), reimported11(1), system12 TYPE sy-sysid, date12 TYPE d, time12 TYPE t, index12(3) TYPE n, result12(35), reimported12(1), system13 TYPE sy-sysid, date13 TYPE d, time13 TYPE t, index13(3) TYPE n, result13(35), reimported13(1), system14 TYPE sy-sysid, date14 TYPE d, time14 TYPE t, index14(3) TYPE n, result14(35), reimported14(1), system15 TYPE sy-sysid, date15 TYPE d, time15 TYPE t, index15(3) TYPE n, result15(35), reimported15(1), colors TYPE lvc_t_scol, END OF ty_report, BEGIN OF ty_systemz, system TYPE sy-sysid, client TYPE sy-mandt, index(3) TYPE n, END OF ty_systemz. CLASS-DATA: gt_e070 TYPE STANDARD TABLE OF e070, gw_e070 TYPE e070, gt_import_details TYPE STANDARD TABLE OF ty_import, gw_import_detail TYPE ty_import, * go_alv TYPE REF TO zcl_easy_alv, go_salv TYPE REF TO cl_salv_table, gt_report TYPE STANDARD TABLE OF ty_report, gt_systemz TYPE STANDARD TABLE OF ty_systemz. CLASS-METHODS: selection IMPORTING so_trkor TYPE ANY TABLE so_systm TYPE ANY TABLE so_mandt TYPE ANY TABLE, compose_report, focus IMPORTING row TYPE sy-index column TYPE any. ENDCLASS. "lcl_investigator DEFINITION *----------------------------------------------------------------------* * CLASS lcl_event_manager IMPLEMENTATION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS lcl_event_manager IMPLEMENTATION. METHOD constructor. DATA: lo_events TYPE REF TO cl_salv_events_table. go_salv = r_object. lo_events = go_salv->get_event( ). SET HANDLER on_link_click FOR lo_events. ENDMETHOD. "constructor METHOD on_link_click. lcl_investigator=>focus( row = row column = column ). ENDMETHOD. "on_link_click ENDCLASS. "lcl_event_manager IMPLEMENTATION *----------------------------------------------------------------------* * CLASS lcl_investigator IMPLEMENTATION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS lcl_investigator IMPLEMENTATION. METHOD selection. DATA: lt_abaplist TYPE STANDARD TABLE OF abaplist, lt_lines TYPE STANDARD TABLE OF char200, lw_line TYPE char200, lw_systemz TYPE ty_systemz. FIELD-SYMBOLS: TYPE ty_import. * Fetch transports list and release dates: SELECT * FROM e070 INTO TABLE gt_e070 WHERE trkorr IN so_trkor AND * trfunction in r_trfunction and trstatus = 'R'. "Released only IF sy-subrc <> 0. MESSAGE 'No data found' TYPE 'S'. ELSE. LOOP AT gt_e070 INTO gw_e070. CLEAR: lt_lines[], lt_abaplist[]. * Clear the last list(s) from memory (to avoid picking up an old list) CALL FUNCTION 'LIST_FREE_MEMORY'. * Fetch the transport log - in readable form SUBMIT rddprott WITH pv_korr = gw_e070-trkorr EXPORTING LIST TO MEMORY AND RETURN. * List output from memory into ABAPLIST CALL FUNCTION 'LIST_FROM_MEMORY' TABLES listobject = lt_abaplist EXCEPTIONS not_found = 4 OTHERS = 4. IF sy-subrc = 4. DELETE gt_e070. ELSE. * Transform to more readable format CALL FUNCTION 'LIST_TO_ASCI' EXPORTING with_line_break = 'X' TABLES listasci = lt_lines listobject = lt_abaplist EXCEPTIONS OTHERS = 0. * We are only interested in specific details from the report: the Import data: * read table gt_LINES index 4 into gw_line. * write: / gw_e070-trkorr, gw_e070-as4date, gw_e070-as4time, GW_LINE+34(90). CLEAR: gw_import_detail. gw_import_detail-trkorr = gw_e070-trkorr. LOOP AT lt_lines INTO lw_line FROM 8. IF lw_line+12(3) CN '- '. gw_import_detail-system = lw_line+12(3). ENDIF. IF lw_line+23(10) = 'Import'. gw_import_detail-client = lw_line+19(3). CALL FUNCTION 'CONVERT_DATE_TO_INTERNAL' EXPORTING date_external = lw_line+64(10) IMPORTING date_internal = gw_import_detail-date EXCEPTIONS OTHERS = 0. CONCATENATE lw_line+75(2) lw_line+78(2) lw_line+81(2) INTO gw_import_detail-time. gw_import_detail-result = lw_line+87(35). IF NOT gw_import_detail-system IS INITIAL. IF gw_import_detail-system IN so_systm AND gw_import_detail-client IN so_mandt. APPEND gw_import_detail TO gt_import_details. ENDIF. ENDIF. ENDIF. ENDLOOP. ENDIF. ENDLOOP. * A bit of extra logic to separate import from re-import: SORT gt_import_details BY system client trkorr date time. CLEAR gw_import_detail. LOOP AT gt_import_details ASSIGNING . IF gw_import_detail-system = -system AND gw_import_detail-client = -client AND gw_import_detail-trkorr = -trkorr. -reimported = abap_true. ENDIF. gw_import_detail = . ENDLOOP. * Removal of the re-imports SORT gt_import_details BY system client trkorr date DESCENDING time DESCENDING. DELETE ADJACENT DUPLICATES FROM gt_import_details COMPARING system client trkorr. SORT gt_import_details BY system client date time trkorr. * Pivot the table into a transports listing - first compose a list of system/client combinations: LOOP AT gt_import_details INTO gw_import_detail. MOVE-CORRESPONDING gw_import_detail TO lw_systemz. APPEND lw_systemz TO gt_systemz. ENDLOOP. SORT gt_systemz. DELETE ADJACENT DUPLICATES FROM gt_systemz. ENDIF. ENDMETHOD. "selection METHOD compose_report. DATA: lt_e07t TYPE STANDARD TABLE OF e07t, lw_e07t TYPE e07t, lo_columns_table TYPE REF TO cl_salv_columns_table, lw_color_field TYPE lvc_s_scol, lv_fieldnr(2), lv_fieldname(40), BEGIN OF lw_fields, system TYPE string, date TYPE string, time TYPE string, index TYPE string, result TYPE string, reimported TYPE string, description TYPE string, END OF lw_fields, lv_is_unavailable TYPE boolean, lt_dd07v_function TYPE STANDARD TABLE OF dd07v, lw_dd07v TYPE dd07v, lw_report TYPE ty_report, lw_report_last TYPE ty_report, lv_tabix TYPE sy-tabix. DATA: lo_rf_display_settings TYPE REF TO cl_salv_display_settings, lo_rf_columns_table TYPE REF TO cl_salv_columns_table, lo_rf_functions_list TYPE REF TO cl_salv_functions_list, lo_rf_layout TYPE REF TO cl_salv_layout, lw_layout_key TYPE salv_s_layout_key, lo_rf_column_table TYPE REF TO cl_salv_column_table, lv_scrtext_s TYPE scrtext_s, lv_scrtext_m TYPE scrtext_m, lv_scrtext_l TYPE scrtext_l, lv_columnname TYPE LVC_FNAME. FIELD-SYMBOLS: TYPE ANY, TYPE ANY, TYPE ANY, TYPE d, TYPE t, TYPE ty_systemz. DEFINE alv_field. try. lv_columnname = &1. lo_rf_column_table ?= lo_rf_columns_table->get_column( lv_columnname ). case &2. when 'HIDE'. lo_rf_column_table->set_visible( abap_false ). when 'HOT'. lo_rf_column_table->set_cell_type( if_salv_c_cell_type=>hotspot ). when 'CHECKBOX'. lo_rf_column_table->set_cell_type( if_salv_c_cell_type=>checkbox ). when 'UNAVAILABLE'. lo_rf_column_table->set_technical( abap_true ). when others. lv_scrtext_s = lv_scrtext_m = lv_scrtext_l = &2. lo_rf_column_table->set_short_text( lv_scrtext_s ). lo_rf_column_table->set_medium_text( lv_scrtext_m ). lo_rf_column_table->set_long_text( lv_scrtext_l ). endcase. catch cx_salv_not_found cx_salv_data_error. endtry. END-OF-DEFINITION. CHECK NOT gt_e070[] IS INITIAL. SELECT * FROM e07t INTO TABLE lt_e07t FOR ALL ENTRIES IN gt_e070 WHERE trkorr = gt_e070-trkorr AND langu = sy-langu. * Fetch domain values => description of transport type: CALL FUNCTION 'GET_DOMAIN_VALUES' EXPORTING domname = 'TRFUNCTION' TABLES values_tab = lt_dd07v_function. LOOP AT gt_e070 INTO gw_e070. CLEAR lw_report. lw_report-trkorr = gw_e070-trkorr. lw_report-trfunction = gw_e070-trfunction. lw_report-as4user = gw_e070-as4user. READ TABLE lt_dd07v_function INTO lw_dd07v WITH KEY domvalue_l = lw_report-trfunction. IF sy-subrc = 0. lw_report-trfunction_txt = lw_dd07v-ddtext. ELSE. lw_report-trfunction_txt = lw_report-trfunction. ENDIF. lw_report-release_date = gw_e070-as4date. lw_report-release_time = gw_e070-as4time. READ TABLE lt_e07t INTO lw_e07t WITH KEY trkorr = gw_e070-trkorr. IF sy-subrc = 0. lw_report-as4text = lw_e07t-as4text. ENDIF. APPEND lw_report TO gt_report. ENDLOOP. * Now the pivoting action: LOOP AT gt_import_details INTO gw_import_detail. * Determine which reporting line the results should be linked to: READ TABLE gt_report INTO lw_report WITH KEY trkorr = gw_import_detail-trkorr. lv_tabix = sy-tabix. * Determine which fields to update with the Import date and time: READ TABLE gt_systemz WITH KEY system = gw_import_detail-system client = gw_import_detail-client ASSIGNING . IF sy-subrc = 0. WRITE sy-tabix TO lv_fieldnr LEFT-JUSTIFIED. CONCATENATE 'LW_REPORT-SYSTEM' lv_fieldnr INTO lv_fieldname. ASSIGN (lv_fieldname) TO . CONCATENATE gw_import_detail-system gw_import_detail-client INTO SEPARATED BY '/'. CONCATENATE 'LW_REPORT-DATE' lv_fieldnr INTO lv_fieldname. ASSIGN (lv_fieldname) TO . MOVE gw_import_detail-date TO . CONCATENATE 'LW_REPORT-TIME' lv_fieldnr INTO lv_fieldname. ASSIGN (lv_fieldname) TO . MOVE gw_import_detail-time TO . CONCATENATE 'LW_REPORT-INDEX' lv_fieldnr INTO lv_fieldname. ASSIGN (lv_fieldname) TO . ADD 1 TO -index. MOVE -index TO . CONCATENATE 'LW_REPORT-RESULT' lv_fieldnr INTO lv_fieldname. ASSIGN (lv_fieldname) TO . = gw_import_detail-result. CONCATENATE 'LW_REPORT-REIMPORTED' lv_fieldnr INTO lv_fieldname. ASSIGN (lv_fieldname) TO . = gw_import_detail-reimported. MODIFY gt_report INDEX lv_tabix FROM lw_report. ENDIF. ENDLOOP. SORT gt_report BY release_date release_time. TRY. cl_salv_table=>factory( IMPORTING r_salv_table = go_salv CHANGING t_table = gt_report ). CATCH cx_salv_msg. * The wrapper class does not raise the exception, to avoid having to * catch it. ENDTRY. lo_rf_display_settings = go_salv->get_display_settings( ). lo_rf_display_settings->set_striped_pattern( abap_true ). lo_rf_columns_table = go_salv->get_columns( ). lo_rf_columns_table->set_optimize( abap_true ). lo_rf_functions_list = go_salv->get_functions( ). lo_rf_functions_list->set_all( ). * Layout's are available for the end user to control lo_rf_layout = go_salv->get_layout( ). lw_layout_key-report = sy-cprog. lw_layout_key-logical_group = 'ABRA'. * The key for layouts needs to be set to enable it's functionality. lo_rf_layout->set_key( lw_layout_key ). lo_rf_layout->set_default( abap_true ). lo_rf_layout->set_save_restriction( if_salv_c_layout=>restrict_user_dependant ). * Field specifics: alv_field: 'TRKORR' 'HOT', 'TRFUNCTION_TXT' 'HOT', 'TRFUNCTION_TXT' 'Type', 'TRFUNCTION' 'HIDE', 'AS4USER' 'HIDE', 'AS4USER' 'User', 'RELEASE_DATE' 'Released', 'RELEASE_TIME' 'at', 'INDEX' 'Seq.'. * a bit of logic to inform the alv object which column is to be * used for color settings: TRY. lo_columns_table = go_salv->get_columns( ). lo_columns_table->set_color_column( value = 'COLORS' ). CATCH cx_salv_data_error. ENDTRY. * Set colors for certain columns, and also for certain field values CLEAR lw_report_last. LOOP AT gt_report INTO lw_report. lw_report-index = sy-tabix. CLEAR: lw_color_field. * Highlight the Transport of copies - transports (Type T) IF lw_report-trfunction = 'T'. lw_color_field-color-col = 3. lw_color_field-fname = 'TRKORR'. APPEND lw_color_field TO lw_report-colors. lw_color_field-fname = 'TRFUNCTION'. APPEND lw_color_field TO lw_report-colors. lw_color_field-fname = 'TRFUNCTION_TXT'. APPEND lw_color_field TO lw_report-colors. lw_color_field-fname = 'AS4TEXT'. APPEND lw_color_field TO lw_report-colors. lw_color_field-fname = 'AS4USER'. APPEND lw_color_field TO lw_report-colors. lw_color_field-fname = 'RELEASE_DATE'. APPEND lw_color_field TO lw_report-colors. lw_color_field-fname = 'RELEASE_TIME'. APPEND lw_color_field TO lw_report-colors. lw_color_field-fname = 'INDEX'. APPEND lw_color_field TO lw_report-colors. ENDIF. * Set the colors for the system/client (always the same value) and the * re-imported values. also check sequence issues DO 15 TIMES. WRITE sy-index TO lv_fieldnr LEFT-JUSTIFIED. CONCATENATE 'SYSTEM' lv_fieldnr INTO lw_color_field-fname. lw_color_field-color-col = 7. APPEND lw_color_field TO lw_report-colors. * Check for re-imports: CONCATENATE 'LW_REPORT-REIMPORTED' lv_fieldnr INTO lv_fieldname. ASSIGN (lv_fieldname) TO . * Check for sequence issues, they should be filled with a value * previous + 1, unless there was no previous value. exception: * the transport of copies sequence. * Check for re-imports: CONCATENATE 'LW_REPORT-INDEX' lv_fieldnr INTO lv_fieldname. ASSIGN (lv_fieldname) TO . IF IS INITIAL. "No value = transport not imported = Error lw_color_field-color-col = 6. CONCATENATE 'INDEX' lv_fieldnr INTO lw_color_field-fname. APPEND lw_color_field TO lw_report-colors. ELSEIF lw_report-trfunction <> 'T'. "Transport of copies get sequence clearance CONCATENATE 'LW_REPORT_LAST-INDEX' lv_fieldnr INTO lv_fieldname. ASSIGN (lv_fieldname) TO . ADD 1 TO . IF <> . lw_color_field-color-col = 6. CONCATENATE 'INDEX' lv_fieldnr INTO lw_color_field-fname. IF = abap_true. "Reimported entry lw_color_field-color-int = 1. ENDIF. APPEND lw_color_field TO lw_report-colors. CLEAR: lw_color_field-color-int. ENDIF. ENDIF. IF = abap_true. "Reimported entry * Note that when a field is assigned a color multiple times - only the first * assigned color will be used. lw_color_field-color-col = 3. CONCATENATE 'DATE' lv_fieldnr INTO lw_color_field-fname. APPEND lw_color_field TO lw_report-colors. CONCATENATE 'TIME' lv_fieldnr INTO lw_color_field-fname. APPEND lw_color_field TO lw_report-colors. CONCATENATE 'INDEX' lv_fieldnr INTO lw_color_field-fname. APPEND lw_color_field TO lw_report-colors. ENDIF. ENDDO. MODIFY gt_report FROM lw_report. lw_report_last = lw_report. ENDLOOP. * Set field labels on the columns, (which are in fact 15 sets of the same columns) DO 15 TIMES. WRITE sy-index TO lv_fieldnr LEFT-JUSTIFIED. IF sy-index <= LINES( gt_systemz ). lv_is_unavailable = abap_false. ELSE. lv_is_unavailable = abap_true. "Make the column unavailable - as it has no content ENDIF. CONCATENATE 'SYSTEM' lv_fieldnr INTO lw_fields-system. CONCATENATE 'DATE' lv_fieldnr INTO lw_fields-date. CONCATENATE 'TIME' lv_fieldnr INTO lw_fields-time. CONCATENATE 'INDEX' lv_fieldnr INTO lw_fields-index. CONCATENATE 'RESULT' lv_fieldnr INTO lw_fields-result. CONCATENATE 'REIMPORTED' lv_fieldnr INTO lw_fields-reimported. CONCATENATE 'Result - ' lv_fieldnr INTO lw_fields-description. alv_field: lw_fields-system 'Syst/Clnt', lw_fields-date 'Import', lw_fields-time 'at', lw_fields-index 'Seq.', lw_fields-result lw_fields-description, lw_fields-result 'HIDE', lw_fields-reimported 'Reimported', lw_fields-reimported 'CHECKBOX', lw_fields-reimported 'HIDE'. if lv_is_unavailable = abap_true. alv_field: lw_fields-system 'UNAVAILABLE', lw_fields-date 'UNAVAILABLE', lw_fields-time 'UNAVAILABLE', lw_fields-index 'UNAVAILABLE', lw_fields-result 'UNAVAILABLE', lw_fields-reimported 'UNAVAILABLE'. endif. ENDDO. ENDMETHOD. "compose_report METHOD focus. DATA: lw_report TYPE ty_report, lt_requests TYPE strhi_requests_wd, lw_request TYPE strhi_request_wd. READ TABLE gt_report INTO lw_report INDEX row. CASE column. WHEN 'TRKORR'. CLEAR: lt_requests[]. lw_request-h-trkorr = lw_report-trkorr. APPEND lw_request TO lt_requests. CALL FUNCTION 'TRINT_DISPLAY_REQUESTS' EXPORTING it_requests = lt_requests. WHEN 'TRFUNCTION_TXT'. SUBMIT rddprott WITH pv_korr = lw_report-trkorr AND RETURN. ENDCASE. ENDMETHOD. "focus ENDCLASS. "lcl_investigator IMPLEMENTATION SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN COMMENT (30) lbl_01 FOR FIELD so_trkor. SELECT-OPTIONS: so_trkor FOR e070-trkorr NO INTERVALS. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN COMMENT (30) lbl_02 FOR FIELD so_systm. SELECT-OPTIONS: so_systm FOR syst-sysid NO INTERVALS. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN COMMENT (30) lbl_03 FOR FIELD so_mandt. SELECT-OPTIONS: so_mandt FOR syst-mandt NO INTERVALS. SELECTION-SCREEN END OF LINE. SELECTION-SCREEN SKIP. SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN COMMENT (35) lbl_04. PARAMETERS pa_seek(25) DEFAULT '' LOWER CASE. SELECTION-SCREEN PUSHBUTTON (10) seekbut USER-COMMAND seeker. SELECTION-SCREEN END OF LINE. AT SELECTION-SCREEN. DATA: gv_seekstring TYPE string, gv_message TYPE c LENGTH 100, gv_count TYPE n LENGTH 3. IF sscrfields-ucomm = 'SEEKER'. CONCATENATE '%' pa_seek '%' INTO gv_seekstring. SELECT e070~trkorr INTO CORRESPONDING FIELDS OF TABLE lcl_investigator=>gt_e070 FROM e07t INNER JOIN e070 ON e070~trkorr = e07t~trkorr WHERE e070~trstatus = 'R' AND "Released only e07t~as4text LIKE gv_seekstring. IF sy-subrc <> 0. MESSAGE 'No requests found - nothing added' TYPE 'S'. ELSE. so_trkor = 'IEQ'. LOOP AT lcl_investigator=>gt_e070 INTO lcl_investigator=>gw_e070. so_trkor-low = lcl_investigator=>gw_e070-trkorr. APPEND so_trkor. ENDLOOP. gv_count = LINES( lcl_investigator=>gt_e070 ). CONCATENATE gv_count 'transport requests added' INTO gv_message SEPARATED BY space. SHIFT gv_message LEFT DELETING LEADING '0'. MESSAGE gv_message TYPE 'S'. ENDIF. ENDIF. INITIALIZATION. seekbut = 'Search'. lbl_01 = 'Transport numbers'. lbl_02 = 'System'. lbl_03 = 'Client'. lbl_04 = 'Propose transports with text:'. START-OF-SELECTION. IF so_trkor[] IS INITIAL. MESSAGE 'No (released) transports specified' TYPE 'S'. EXIT. ENDIF. * Perform selection and call the Transport logs report for every transport lcl_investigator=>selection( EXPORTING so_trkor = so_trkor[] so_systm = so_systm[] so_mandt = so_mandt[] ). * Compose a report from the selected details (perform a pivot) lcl_investigator=>compose_report( ). * Involve the events manager CREATE OBJECT go_event_man EXPORTING r_object = lcl_investigator=>go_salv. * Output the report as ALV lcl_investigator=>go_salv->display( ).