Einfacher systemübergreifender Versionsvergleich

Im SAP-Umfeld gibt es in der Regel eine Drei-System-Landschaft: Die Entwicklung und das Customizing finden im Entwicklungssystem statt. Zum Test wird die Programmierung in das Qualitätssicherungssystem (Q-System) transportiert. Dort finden weitere Tests mit produktionsnahen Daten statt. Dann wird das Programm eventuell noch einmal nachgebessert und es wird eine neue Version in das Q-System transportiert. Nach erfolgreichen Tests werden alle Transporte in das Produktionssystem transportiert.

Durch längere „Standzeiten“ im Q-System kann es dazu kommen, dass man den Überblick darüber verliert, welche Stände in welchem System vorhanden sind. Die manuelle Prüfung der einzelnen Objekte ist mehr als mühsam.

Versionsvergleich

Das untenstehende Programm kann einen Versionsvergleich zwischen dem aktuellen und einem anderen SAP-System durchführen. Folgende Eingaben sind möglich:

  • Transportauftrag
  • Klasse
  • Programm
  • Funktionsgruppe

Der Vergleich wird mit Hilfe des Funktionsbausteins SVRS_MASSCOMPARE_ACT_OBJECTS durchgeführt. Dieser Baustein hat eine sehr wichtige Funktion: Er ermittelt selbstständig die Unterobjekte zu einem Hauptobjekt. Für Programme bedeutet dies, dass alle Includes, Dynpros und sonstigen Programmobjekte ermittelt und verglichen werden. Bei Klassen werden alle Sections als auch die einzelnen Methoden berücksichtigt.

Ergebnisliste

Das Ergebnis des Vergleiches ist eine Liste, in der die Objekte rot markiert werden, die eine andere Version als im aktuellen System haben.

Mit einem Doppelklick auf eine Zeile gelangst du in den direkten Sourcecode-Vergleich des gewählten Objektes.

Vergleich von Klassenquellcode in Eclipse

Obwohl man in der SE24 von der Formularansicht auf die Ansicht Quelltextbasiert wechseln kann, ist ein kompletter Versionsvergleich der Klasse nicht möglich. Um herauszufinden, welche Methode in einem anderen System eventuell eine andere Version hat, muss für jede Methode separat ein Versionsvergleich durchgeführt werden. Hier spielt Eclipse wieder seine enormen Möglichkeiten aus, denn in Eclipse ist genau das mit der Tastenkombination Ctrl +Alt+C „Compare with <project>“ möglich.

Für das SAP-System, mit dem der Versionsvergleich durchgeführt werden soll, muss als ABAP-Project in Eclipse eingerichtet sein.

Code

REPORT zz_compare_versions.
DATA gs_vrs_compare TYPE vrs_compare_item.

PARAMETERS pa_req TYPE trkorr     DEFAULT ''.
PARAMETERS pa_cls TYPE seoclsname DEFAULT 'ZCL_DUMMY'.
PARAMETERS pa_rep TYPE syrepid    DEFAULT 'ZZDUMMY01'.
PARAMETERS pa_fgr TYPE syrepid    DEFAULT 'Z_DUMMY_01'.

PARAMETERS cb_req RADIOBUTTON GROUP mode DEFAULT 'X'.
PARAMETERS cb_cls RADIOBUTTON GROUP mode .
PARAMETERS cb_rep RADIOBUTTON GROUP mode .
PARAMETERS cb_fgr RADIOBUTTON GROUP mode .

PARAMETERS pa_rdt TYPE rfcdest DEFAULT 'Q01_100'.

START-OF-SELECTION.

  CASE 'X'.
    WHEN cb_req.
      PERFORM compare_request USING pa_req.
    WHEN cb_cls.
      PERFORM compare_object USING 'CLAS' pa_cls.
    WHEN cb_rep.
      PERFORM compare_object USING 'PROG' pa_rep.
    WHEN cb_fgr.
      PERFORM compare_object USING 'FUGR' pa_fgr.
  ENDCASE.

AT LINE-SELECTION.
  CHECK gs_vrs_compare IS NOT INITIAL.

  SUBMIT rsvrsrs3
          WITH log_dest = space
          WITH log_dst1 = pa_rdt
          WITH objnam2 = gs_vrs_compare-fragname
          WITH objname = gs_vrs_compare-fragname
          WITH objtyp1 = gs_vrs_compare-fragment
          WITH objtyp2 = gs_vrs_compare-fragment
          WITH versno1 = '99998'
          WITH versno2 = '99998' AND RETURN.

FORM compare_request USING iv_ta TYPE trkorr..

  DATA lt_request TYPE trwbo_request .

  CALL FUNCTION 'TR_READ_REQUEST'
    EXPORTING
      iv_read_e070      = 'X'
      iv_read_objs_keys = 'X'
      iv_trkorr         = pa_req
    CHANGING
      cs_request        = lt_request
    EXCEPTIONS
      error_occured     = 1
      no_authorization  = 2
      OTHERS            = 3.
  IF sy-subrc <> 0.
    CASE sy-subrc.
      WHEN 1.
        WRITE: 'Error "error_occured(1)" at TR_READ_REQUEST' COLOR COL_NEGATIVE.
      WHEN 2.
        WRITE: 'Error "no_authorization(2)" at TR_READ_REQUEST' COLOR COL_NEGATIVE.
    ENDCASE.
    RETURN.
  ENDIF.

  PERFORM compare USING lt_request-objects.

ENDFORM.

FORM compare USING it_objects TYPE trwbo_t_e071.

  DATA lt_cmp_result TYPE  vrs_compare_item_tab.

  CALL FUNCTION 'SVRS_MASSCOMPARE_ACT_OBJECTS'
    EXPORTING
      it_e071                 = it_objects
      iv_rfcdest_a            = space
      iv_rfcdest_b            = pa_rdt
      iv_filter_lang          = 'X'
      iv_delete_lang          = ' '
      iv_abap_ignore_case     = 'X'
      iv_abap_condense        = 'X'
      iv_abap_ignore_comments = 'X'
      iv_abap_equivalence     = 'X'
      iv_with_gui_progress    = 'X'
      iv_ignore_report_text   = ' '
    IMPORTING
      et_compare_items        = lt_cmp_result
    EXCEPTIONS
      rfc_error               = 1
      not_supported           = 2
      OTHERS                  = 3.
  IF sy-subrc <> 0.
    CASE sy-subrc.
      WHEN 1.
        WRITE: 'Error "rfc_error(1)" at SVRS_MASSCOMPARE_ACT_OBJECTS' COLOR COL_NEGATIVE.
      WHEN 2.
        WRITE: 'Error "not_supported(2)" at SVRS_MASSCOMPARE_ACT_OBJECTS' COLOR COL_NEGATIVE.
    ENDCASE.
    RETURN.
  ENDIF.

  LOOP AT lt_cmp_result INTO gs_vrs_compare.
    WRITE: /
      gs_vrs_compare-fragment,
      gs_vrs_compare-fragname.
    IF gs_vrs_compare-equal = abap_true.
      WRITE icon_led_green AS ICON HOTSPOT ON.
    ELSE.
      WRITE icon_led_red AS ICON HOTSPOT ON.
    ENDIF.

    DATA lt_ver_list TYPE STANDARD TABLE OF vrsn.
    DATA lt_versions TYPE STANDARD TABLE OF vrsd.
    DATA lv_obj_name TYPE versobjnam.

    lv_obj_name = gs_vrs_compare-fragname.
    CALL FUNCTION 'SVRS_GET_VERSION_DIRECTORY_46'
      EXPORTING
        objname      = lv_obj_name
        objtype      = gs_vrs_compare-fragment
      TABLES
        lversno_list = lt_ver_list
        version_list = lt_versions
      EXCEPTIONS
        no_entry     = 1
        OTHERS       = 2.

    TRY .
        WRITE lt_versions[ 2 ]-datum.
      CATCH cx_sy_itab_line_not_found.
    ENDTRY.

    CLEAR lt_ver_list.
    CLEAR lt_versions.
    CALL FUNCTION 'SVRS_GET_VERSION_DIRECTORY_46'
      DESTINATION pa_rdt
      EXPORTING
        objname      = lv_obj_name
        objtype      = gs_vrs_compare-fragment
      TABLES
        lversno_list = lt_ver_list
        version_list = lt_versions
      EXCEPTIONS
        no_entry     = 1
        OTHERS       = 2.
    TRY .
        WRITE lt_versions[ 2 ]-datum.
      CATCH cx_sy_itab_line_not_found.
    ENDTRY.

    HIDE gs_vrs_compare.
  ENDLOOP.

  CLEAR gs_vrs_compare.

ENDFORM.

FORM compare_object USING iv_type TYPE c iv_obj TYPE c.

  DATA(lt_objects) = VALUE trwbo_t_e071( 
               ( pgmid = 'R3TR' object = iv_type obj_name = iv_obj ) ).

  PERFORM compare USING lt_objects.

ENDFORM.