Checkpoint-Gruppe – Die Fahrkarten bitte!

Heute stand ich vor der Frage, wie man im Programm eine Abfrage einbaut, die man in jedem System ohne extra Parametertabelle oder ähnlichem an- oder ausschalten kann. Normalerweise gibt es dafür Parameter-Tabellen oder man könnte auch Benutzerparameter verwenden. Ersteres war jedoch zu aufwändig und die zweite Variante passte nicht, da für beliebige Benutzer (auch RFC-User) gesteuert werden sollte, ob eine Protokollierung statt findet oder nicht.

Da ich für die Protokollierung einiger Aktionen bereits die Checkpoint-Gruppen verwendet habe, kam ich auf die Idee, diese abzufragen. Eigentlich funktioniert der Befehl LOG-POINT anders: Die Anweisung wird eingebaut und wenn in der Transaktion SAAB die Protokollierung zum aktuellen Zeitpunkt aktiviert wurde, dann wird das Protokoll geschrieben:

LOG ID ztricktresor SUBKEY 'CHECK1' FIELDS subrc.

Transaktion SAAB

In der Transaktion Checkpoint-Gruppe ändern SAAB kannst du einstellen, wie sich die einzelnen Befehle LOG-POINT, ASSERT, BREAK-POINT verhalten sollen.

2015-02-04_18-25-01

Andersherum wird ein Schuh draus

Die Aktivierungsdaten werden in die Tabelle AAB_ID_ACT geschrieben. Zusätzlich wird gespeichert, wann die Aktivierung abläuft und welche Kontrollpunkte aktiv sind (Breakpoints, Logpoints, Assertions). Diese Tabelle lese ich aus, um zu prüfen, ob das Logging zu einer Checkpoint-Gruppe aktiv ist.

Welche Kontrollpunkte aktiv sind, wird im Feld ACTMODE bitweise gespeichert. Die Bits haben dabei folgende Bedeutung:

Bit 1Bit 2Bit 3Bit 4Bit 5Bit 6Bit 7Bit 8
ohne FunktionLoggingAssertions
Hintergrund
abbrechen
Assertions
Hintergrund
protokollieren
Assertions
abbrechen
Assertions
protokollieren
Assertions
anhalten
Breakpoints

Mithilfe des Befehls GET BIT 2 OF ACTMODE bekomme ich heraus, ob das Logging eingeschaltet ist.

Der Wert ist dann 64, Du kannst die Konstante CL_ABAP_AAB_UTILITIES=>BITMASK_LOGPOINT verwenden.

Globale Checkpoint-Aktivierungen

In der Transaktion SAAB legt man in der Regel die Einstellungen für sich selbst an. Du kannst jedoch über Alle Aktivierungen [_Benutzer_] auch globale Einstellungen vornehmen. Diese sind dann für alle Benutzer gültig. Das Feld AAB_ID_ACT-USERNAME ist in dem Fall initial.

Ebenso kann eine Einschränkung auf Server vorgenommen werden. Ist das der Fall, dann steht im Feld AAB_ID_ACT-SERVER der Name des Applicationservers.

Coding

REPORT zz_checkpoint.

CLASS lcl_saab DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS check_active IMPORTING name          TYPE clike
                                         user          TYPE clike OPTIONAL
                               RETURNING VALUE(active) TYPE boolean.
ENDCLASS.

CLASS lcl_saab IMPLEMENTATION.
  METHOD check_active.
*== local data
    DATA ls_aabact  TYPE aab_id_act.
    DATA lv_tstamp  TYPE timestamp.
    DATA lv_actmode TYPE x.

    active = abap_false.

*== check checkpoint
    SELECT SINGLE * FROM aab_id_act INTO ls_aabact
     WHERE name     = name 
       AND username = user.
    IF sy-subrc = 0.
*== Checkpoint active
      GET TIME STAMP FIELD lv_tstamp.

      IF lv_tstamp <= ls_aabact-exp_tstamp. 
*== checkpoint is valid at the moment     
        lv_actmode = ls_aabact-actmode. 
*== check if logging is active         
        GET BIT 2 OF lv_actmode INTO DATA(lv_logging).         
        IF lv_logging = 1. 
*== yes, active           
          active = abap_true.         
        ENDIF.      
      ENDIF. 
    ENDIF.   
  ENDMETHOD. 
ENDCLASS. 

PARAMETERS p_name TYPE progname DEFAULT 'ZTRICKTRESOR'. 

START-OF-SELECTION.   
  IF lcl_saab=>check_active( p_name ) = abap_true.
    MESSAGE i000(oo) WITH 'Checkpoint-Gruppe' p_name ' Logging ist aktiv'.
  ELSE.
    MESSAGE i000(oo) WITH 'Checkpoint-Gruppe' p_name 'Logging ist NICHT aktiv'.
  ENDIF.

Update

In der Zwischenzeit habe ich die Klasse CL_ABAP_AAB_UTILITIES gefunden mit der du die Aktivierung einfach prüfen kannst:

DATA(logpoint_active) = cl_abap_aab_utilities=>is_active(
  EXPORTING
    id            = 'ZTRICKTRESOR'
    mode_logpoint = abap_true ).
Enno Wulff

COMMENTS

  • <cite class="fn">django56</cite>

    Hallo Enno,
    nicht schlecht! Ich habe nur einen Hinweis. Der Parameter Name ist optional. Daher sollte der SQL so aussehen:
    *== check checkpoint
    IF NOT user IS INITIAL.
    SELECT SINGLE * FROM aab_id_act INTO ls_aabact
    WHERE name = name
    AND username = user.
    ELSE.
    SELECT SINGLE * FROM aab_id_act INTO ls_aabact
    WHERE name = name.
    ENDIF.

Comments are closed.