Transaktionshistorie manipulieren

Das folgende Programm demonstriert die Manipulation der OK-Code-Historie mittels ABAP. Hierfür werden Registry-Einträge auf dem Frontend manipuliert.

Kurzbeschreibung

Beim Aufruf des Programms wird die Historie aus der Registry eingelesen und direkt in der Select-Option OK_CODE angezeigt, hier können die Codes bearbeitet werden (Einfügen/Ändern/Löschen) nach dem Start und der Sicherheitsabfrage werden die neuen Werte in die Registry geschrieben, ein neuer Modus gestartet, damit die neuen Codes aktiviert werden und der aktuelle Modus beendet.

Wichtig: vor dem Zurückschreiben wird versucht die Anzahl offener Modi zu
ermitteln. Das beschränkt sich aber nur auf die Modi in einem System! Sind noch Modi in anderen Systemen offen (Produktion/Integration) müssen diese vorher
geschlossen werden, sonst wird die Historie unter Umständen aus diesen
Modi wieder überschrieben.

Getestet mit SAP R6.20(4.70), Sap-Gui 6.20/6.40

Quelltext

Bitte im Quelltext die “Slashes” durch “Backslashes” ersetzen!!!

*&———————————————————————*
*& Report  Z_SET_OK_CODE_HIST                                          *
*&         FREEWARE                                                    *
*&———————————————————————*
*& (c) Edwin Leippi Software-Entwicklung                               *
*& Email : info@leippi.de                                              *
*& Datum : 01.05.2005                                                  *
*&                                                                     *
*&                                                                     *
*& Der Autor übernimmt keine Haftung für Schäden,                      *
*& die durch den Einsatz dieses Programmes entstehen können            *
*&———————————————————————*
*& Beschreibung:                                                       *
*&                                                                     *
*& Bearbeiten der OK-Code-History in der Registry                      *
*& ROOT : HKEY_CURRRENT_USER                                           *
*& KEY  :’Software/SAP/SAPGUI Front/SAP Frontend Server/Code’          *
*& VALUE: Code0,Code1,Code2,….                                       *
*&                                                                     *
*& In das Select-option Feld OK_CODE werden alle aktuellen Werte       *
*& aus der Registry übertragen und können hier bearbeitet werden       *
*& Löschen/Ändern/Einfügen                                             *
*& Nur Einzelwerte (I) sind erlaubt                                    *
*&                                                                     *
*& Diese Tabelle der neuen Werte wird mit der aktuellen abgeglichen,   *
*& geänderte Einträge werden modifiziert, neue Einträge werden         *
*& eingefügt und nicht mehr vorhandene Einträge werden gelöscht        *
*& danach wird ein neuer Modus erzeugt und der in dem das Programm     *
*& gestartet wurde beendet, um die neuen Einträge aus der Registry     *
*& zu laden                                                            *
*&                                                                     *
*& Achtung:                                                            *
*&  es sollte alle SAP-Modi bis auf den rufenden geschlossen sein      *
*&———————————————————————*

REPORT  z_set_ok_code_hist MESSAGE-ID z000.

*&——————————————————————–*
*&      SELECT-OPTIONS
*&——————————————————————–*
SELECT-OPTIONS ok_code FOR sy-ucomm NO INTERVALS LOWER CASE.

*&——————————————————————–*
*&      TYPES
*&——————————————————————–*
TYPES: BEGIN OF t_value,
       value_nr(4)   TYPE n,
       value_name    TYPE string,
       value         TYPE string.
TYPES: END   OF t_value.

*&——————————————————————–*
*&      DATA
*&——————————————————————–*

* Tabelle der gefunden Registry Einträge
DATA it_values            TYPE STANDARD TABLE OF t_value.
FIELD-SYMBOLS <fs_values> TYPE t_value.
DATA wa_values            TYPE t_value.
DATA reg_value            TYPE string.
DATA value                TYPE string.
DATA rc                   TYPE i.
DATA num_char(4)          TYPE c.

*&——————————————————————–*
*&      INITIALIZATION
*&——————————————————————–*

INITIALIZATION.
  PERFORM get_ok_code_history.

*&——————————————————————–*
*&      START-OF-SELECTION
*&——————————————————————–*

START-OF-SELECTION.

* Prüfung ist dies der letzte SAP-Modus
  PERFORM check_session_count CHANGING rc.
  IF rc NE 0. EXIT. ENDIF.

  PERFORM set_ok_code_history.

END-OF-SELECTION.

*&——————————————————————–*
*&      Form  close_all_sessions
*&——————————————————————–*
*       Öffne neuen Modus, schliesse akttuellen
*———————————————————————*
FORM close_session.

* Neuen Modus erzeugen, dieser bekommt die neue History
  CALL FUNCTION ‘TH_CREATE_MODE’.
* Warte, warte nur ein Weilchen
* ohne, gab es schon Probleme, der neue Modus wurde nicht
* erzeugt
  WAIT UP TO 2 SECONDS.
* Schliesse den eigenen Modus
  CALL FUNCTION ‘TH_DELETE_MODE’.

ENDFORM.                    “close_all_sessions

*&——————————————————————–*
*&      Form  check_session_number
*&——————————————————————–*
*       Prüfe Anzahl offene Modi im System
*———————————————————————*

FORM check_session_count CHANGING p_rc.

  DATA user_info     TYPE STANDARD TABLE OF uinfo2.
  DATA sess_count    TYPE i.
  DATA antwort.
  p_rc = 0.
  REFRESH user_info.
* Hole alle SAP-Modi dieses Systems
  CALL FUNCTION ‘TH_LONG_USR_INFO’
    TABLES
      user_info = user_info.

  DESCRIBE TABLE user_info LINES sess_count.
* Falls noch mehrere Modi offen nichts tun
  IF sess_count > 1.
    MESSAGE i000 WITH ‘Bitte bis auf diesen alle SAP-Modi schliessen’.
    p_rc = 1.
    EXIT.
  ENDIF.
* Sicherheitsabfrage
  CALL FUNCTION ‘POPUP_TO_CONFIRM’
    EXPORTING
      text_question         =
              ‘Wirklich alle Ok Code Einträge überschreiben ?’
      text_button_1         = ‘Ja'(001)
      text_button_2         = ‘Nein'(002)
      display_cancel_button = ‘ ‘
    IMPORTING
      answer                = antwort
    EXCEPTIONS
      text_not_found        = 1
      OTHERS                = 2.

  IF sy-subrc <> 0.
    p_rc = 2.
    EXIT.
  ENDIF.

  IF antwort NE ‘1’.
    p_rc = 2.
  ENDIF.

ENDFORM.                    “check_session_number

*&———————————————————————*
*&      Form  get_ok_code_history
*&———————————————————————*
*       Lese Ok_Code Histrory aus der Registry
*———————————————————————-*
FORM get_ok_code_history .

  num_char = ‘0’.
  REFRESH it_values.

* Alle Registry Werte holen
  wa_values-value_nr  = 0.
  DO 30 TIMES.
    SHIFT num_char LEFT DELETING LEADING ‘ 0’.
    IF num_char IS INITIAL. num_char = ‘0’. ENDIF.
    CONCATENATE ‘Code’ num_char INTO value.
    cl_gui_frontend_services=>registry_get_value(
      EXPORTING
        root      = cl_gui_frontend_services=>hkey_current_user
        key       = ‘Software/SAP/SAPGUI Front/SAP Frontend Server/Code’
        value     = value
      IMPORTING
        reg_value = reg_value
      EXCEPTIONS
        get_regvalue_failed  = 1
        cntl_error           = 2
        error_no_gui         = 3
        not_supported_by_gui = 4
        OTHERS               = 5 ).
    cl_gui_cfw=>flush( ).
    IF sy-subrc <> 0.        EXIT. ENDIF.
* Eintrag in Selektion
    IF NOT reg_value IS INITIAL.
      ok_code-low    = reg_value.
      ok_code-sign   = ‘I’.
      ok_code-option = ‘EQ’.
      APPEND ok_code.
    ENDIF.
* Eintrag in interne Tabelle der Werte
    wa_values-value      = reg_value.
    wa_values-value_name = value.
    APPEND wa_values TO it_values.
    num_char = sy-index.
    wa_values-value_nr  = sy-index.
  ENDDO.
  SORT it_values BY value_nr.

ENDFORM.                    “get_ok_code_history

*&——————————————————————–*
*&      Form  set_ok_code_history
*&——————————————————————–*
*       setze eingegebene Werte in die Registry
*———————————————————————*
FORM set_ok_code_history.

  DATA indx TYPE i.
  DATA indx_nr(4) TYPE n.

* Überarbeiten der OK_CODE Tabelle nur ‘I’ ‘EQ’ sind erlaubt.
  LOOP AT ok_code.
* Leerer Ok-Code nicht zulassen
    IF ok_code-low IS INITIAL.
      DELETE ok_code.
      CONTINUE.
    ENDIF.
* Nur Include kein Ausschliessen
    IF ok_code-sign NE ‘I’.
      DELETE ok_code.
      CONTINUE.
    ENDIF.
* Nur Einzelwerte erlaubt
    IF ok_code-option NE ‘EQ’.
      DELETE ok_code.
      CONTINUE.
    ENDIF.
  ENDLOOP.

* Jetzt noch die Ok_CODES mit der eingelesene Tabelle abgleichen
  LOOP AT ok_code.
* Codes fangen mit 0 an Code0,Code1,….
    indx_nr = sy-tabix – 1.
    READ TABLE it_values ASSIGNING <fs_values>
               WITH KEY value_nr = indx_nr.
* Keinen Eintrag gefunden -> erzeuge neuen
    IF sy-subrc NE 0.
      num_char = indx_nr.
      SHIFT num_char LEFT DELETING LEADING ‘ 0’.
      IF num_char IS INITIAL. num_char = ‘0’. ENDIF.
      CONCATENATE ‘Code’ num_char INTO value.
      wa_values-value_nr   = indx_nr.
      wa_values-value      = ok_code-low.
      wa_values-value_name = value.
      APPEND wa_values TO it_values.
    ENDIF.
  ENDLOOP.

* Einträge vornehmen
  LOOP AT it_values INTO wa_values.
    indx = wa_values-value_nr + 1.
* Lese OK_CODE aus Select-options
    READ TABLE ok_code INDEX indx.
* Falls nicht gefunden -> Lösche
    IF sy-subrc NE 0.
      cl_gui_frontend_services=>registry_delete_value(
        EXPORTING
          root      = cl_gui_frontend_services=>hkey_current_user
          key       =
             ‘Software/SAP/SAPGUI Front/SAP Frontend Server/Code’
          value     = wa_values-value_name
        IMPORTING
          rc        = rc
        EXCEPTIONS
          cntl_error                   = 1
          registry_delete_value_failed = 2
          error_no_gui                 = 3
          not_supported_by_gui         = 4
          OTHERS                       = 5 ).
* Flush nicht vergessen
      cl_gui_cfw=>flush( ).
    ELSE.
* Setze neuen Code aus der Select-Option
      wa_values-value = ok_code-low.
      IF NOT ok_code-low IS INITIAL.
        cl_gui_frontend_services=>registry_set_value(
          EXPORTING
            root                 = 
                     cl_gui_frontend_services=>hkey_current_user
            key                  = 
              ‘Software/SAP/SAPGUI Front/SAP Frontend Server/Code’
            value_name           = wa_values-value_name
            value                = wa_values-value
         IMPORTING
            rc                   = rc
         EXCEPTIONS
            registry_error       = 1
            cntl_error           = 2
            error_no_gui         = 3
            not_supported_by_gui = 4
            OTHERS               = 5 ).
      ENDIF.
* Flush nicht vergessen
      cl_gui_cfw=>flush( ).
    ENDIF.
  ENDLOOP.
* Einen neuen Modus öffnen und den eigenen beenden
  PERFORM close_session.

ENDFORM.                    “set_ok_code_history

Enno Wulff