Wozu dienen Aufbewahrungsregeln?
Im Rahmen der EU-DSGVO werden Unternehmen unter anderem dazu verpflichtet Informationen, die sich auf identifizierbare oder identifizierte Personen beziehen nur so lange aufzubewahren, solange eine rechtliche Grundlage zur Aufbewahrung besteht.
In SAP Systemen können mit dem ILM (Information Lifecycle Management) Aufbewahrungsregeln definiert werden, die dazu dienen Informationen zu Personen, nach festgelegten Regeln zu löschen.
Im Standard des SAP ILM sind für die Aufbewahrungsregeln eines jeden ILM-Objekts Konstanten definiert, die sich auf bestimmte Felder einer Datenbanktabelle beziehen. Über diese kann das Löschdatum für die entsprechenden Datensätze bestimmt werden.
In unserem Beispiel aus dem SAP CRM für das ILM Objekt „CRM_ACT_ON“ (Aktivitäten) ist es das Vertragsendedatum. Dieses verweist auf das Feld DATE_2 der Tabelle CRMD_ORDER_INDEX. Da es sich bei dem Vertragsendedatum nicht um ein Pflichtfeld handelt, kann es vorkommen, dass für Aktivitäten dieser Wert nicht gefüllt ist. Kann für den Zeitbezug einer Aufbewahrungsregel kein Datum ermittelt werden, führt das im einem Löschlauf des ILM zu einem Fehler und die entsprechende Aktivität kann nicht gelöscht werden.
Aus diesem Grund kann es erforderlich werden eigene Konstanten für Zeitbezüge zu erstellen.
Erstellen einer IRM-Konstante für den Zeitbezug
Zunächst rufen wir die Transaktion „IRM_CUST“ (Einstellungen für ILM Objekte vornehmen) auf.
Nun führen wir einen Doppelklick auf den Ordner Zeitbezüge für Beginnermittlung aus.
Neue Einträge auswählen und einen Variablennamen (hier: Z_CED_LCD) nebst Bezeichner für die neue IRM Konstante eingeben.
Wir speichern unsere Änderung. Gegebenenfalls muss nun noch ein Transportauftrag angelegt oder angegeben werden
Konstante für Zeitbezug dem ILM-Objekt zuordnen
Um jetzt eine geeignete Zeitversetzung zuordnen zu können müssen wir unsere neue Konstante markieren und in den Unterordner verfügbare Zeitversätze. Hier kann wieder mit der Wertehilfe gearbeitet werden um den passenden Zeitraum auszuwählen. In unserem Beispiel benötigen wir „END_OF_MONTH“, „END_OF_QUARTER“ und „END_OF_YEAR“.
Wertermittlung der Konstante für Zeitbezug festlegen
Wir müssen nun wieder zum Ordner ILM-Objekte navigieren und sicherstellen, dass das richtige ILM-Objekt, hier „CRM_ACT_ON“, selektiert ist.
Danach einen Doppelklick auf den Ordner „Objektkategoriespezifische Einstellungen“ ausführen.
In dem neuen Bildschirm der sich öffnet, erneut unser ILM-Objekt selektieren.
Im folgenden Schritt legen wir über die Wertermittlung für Zeitbezüge fest, wie wir den Wert ermitteln möchten. Es stehen uns die indirekte oder die direkte Wertermittlung zur Verfügung. Die direkte Wertermittlung können wir verwenden, wenn der Wert des Feldes unserer Datenbanktabelle direkt übernommen werden kann.
In unserem Fall möchten wir die indirekte Wertermittlung verwenden. Dafür muss später noch das BADI „BADI_IRM_OT_STT“ mit der Methode „GET_START_DATE“ implementiert werden. Die indirekte Wertermittlung macht Sinn, wenn wir Werte berechnen müssen oder wie in unserem Fall initiale Werte vermieden werden müssen, da dies zu Fehlern beim Löschvorgang führen würde.
ILM Aufbewahrungsregel anpassen
Jetzt kümmern wir uns um die eigentliche ILM Aufbewahrungsregel. Hierzu starten wir die Transaktion „IRMPOL“ zur Definition der ILM Regelwerke. Es öffnet sich im Browser eine WebUI Transaktion.
Dort müssen wir zunächst einmal als Regelkategorie „Aufbewahrungsregeln“, als Objektkategorie „SAP Business Suite“, das für unser System definierte Prüfgebiet und das ILM-Objekt auswählen.
Wenn wir schon Regeln angelegt hatten, wovon wir in diesem Fall ausgehen, werden im folgenden Bildschirm alle Regeln für das ILM Objekt angezeigt. Dort wählen wir „Bearbeiten“ klicken danach auf „Status ändern“. Es öffnet sich ein Popup, ob der Status wirklich auf „nicht produktiv“ gesetzt werden soll, das wir mit „Ja“ bestätigen. Danach werden wir per Popup aufgefordert einen Transportauftrag auszuwählen oder neu anzulegen. Nachdem wir dies getan haben, können wir unser im Customizing angelegtes Feld „Vertragsende mit Fallback falls initial für die definierten Zeitbezüge auswählen.
Implementierung „BADI_IRM_OT_STT“, Methode „GET_START_DATE“
Nachfolgend unser Beispielcoding aus einem SAP CRM System. In diesem Fall wird bei initialem Wert in der Tabelle CRMD_ORDER_INDEX für das Feld DATE_2 als Fallback ein Wert aus der Tabelle CRMD_ORDERADM_H aus dem Feld CHANGED_AT verwendet.
DATA: lr_data TYPE REF TO data,
lv_date TYPE comt_changed_at_usr,
lv_zonlo TYPE sy-zonlo.
FIELD-SYMBOLS:
<lt_source_fields> TYPE if_lrm_bs_types=>ty_th_tabname_fieldname_values,
<ls_source_fields> TYPE if_lrm_bs_types=>ty_s_tabname_fieldname_values,
<lv_guid> TYPE crmt_object_guid.
CASE iv_start_time_type.
WHEN 'Z_CED_LCD'.
ASSIGN ir_source_fields->* TO <lt_source_fields>.
IF sy-subrc <> 0.
RAISE EXCEPTION TYPE cx_irm_callback_int_error
EXPORTING
textid = cx_irm_callback_int_error=>callback_fieldvalue_missing
mv_class = 'ZCL_IM_BADI_IRM_OT_STT_ACT_ON' "#EC NOTEXT
mv_method = 'GET_START_DATE' "#EC NOTEXT
mv_object_type = 'CRM_ACT_ON' "#EC NOTEXT
mv_field_name = 'Z_CED_LCD'. "#EC NOTEXT
ENDIF.
READ TABLE <lt_source_fields> ASSIGNING <ls_source_fields>
WITH KEY v_table_name = 'CRMD_ORDERADM_H' v_field_name = 'GUID'.
IF sy-subrc IS INITIAL.
READ TABLE <ls_source_fields>-t_field_value INDEX 1 INTO lr_data.
IF sy-subrc = 0.
ASSIGN lr_data->* TO <lv_guid>.
ELSE.
RAISE EXCEPTION TYPE cx_irm_callback_int_error
EXPORTING
textid = cx_irm_callback_int_error=>callback_fieldvalue_missing
mv_class = 'ZCL_IM_BADI_IRM_OT_STT_ACT_ON' "#EC NOTEXT
mv_method = 'GET_START_DATE' "#EC NOTEXT
mv_object_type = 'CRM_ACT_ON' "#EC NOTEXT
mv_field_name = 'Z_CED_LCD'. "#EC NOTEXT
ENDIF.
ELSE.
RAISE EXCEPTION TYPE cx_irm_callback_int_error
EXPORTING
textid = cx_irm_callback_int_error=>callback_fieldvalue_missing
mv_class = 'ZCL_IM_BADI_IRM_OT_STT_ACT_ON' "#EC NOTEXT
mv_method = 'GET_START_DATE' "#EC NOTEXT
mv_object_type = 'CRM_ACT_ON' "#EC NOTEXT
mv_field_name = 'Z_CED_LCD'. "#EC NOTEXT
ENDIF.
SELECT SINGLE date_2 FROM crmd_order_index
INTO lv_date
WHERE header EQ <lv_guid>.
IF sy-subrc NE 0.
"should not happen
ENDIF.
IF lv_date IS INITIAL.
SELECT SINGLE changed_at FROM crmd_orderadm_h
INTO lv_date
WHERE guid EQ <lv_guid>.
IF sy-subrc NE 0.
"should not happen.
ENDIF.
ENDIF.
ev_start_date = lv_date.
ENDCASE.
Ich hoffe es hat Spaß gemacht und Ihr schaut mal wieder vorbei.