Massenkopie von Klassen
Im Standard gibt es keine Möglichkeit, eine Klasse massenhaft, also mit vielen verschiedenen Namen zu kopieren. Gerade für Schulungen kann es jedoch sinnvoll sein, eine Klasse für viele Benutzer zu kopieren. Besonders sinnvoll ist es zum Beispiel für das UnitTest Koan von Damir Majer. Bei diesem Koan geht es darum, die verschiedenen Techniken der Unit-Tests zu erlernen.
Mit dem folgenden Programm ist es möglich, eine Klasse auf verschiedene Klassen zu kopieren. Es werden alle Benutzer einer bestimmten Benutzergruppe ermittelt. Für jeden Benutzer wird eine Klasse mit dem Benutzernamen aus der zu kopierenden Klasse erstellt.
Zusätzlich kannst du entscheiden, ob für jeden Benutzer eine eigene Entwicklungsklasse angelegt wird.
Mit der Testoption kannst du dir die Klassen, die angelegt werden würden, ausgeben lassen.
Kopierte Klassen löschen
Möchtest du die kopierten Klassen später wieder löschen, um die nächste Schulung vorzubereiten, dann kannst du den Funktionsbaustein OO_CLASS_DELETE mit den Parametern COMMIT = X und FORCE = X verwenden. Der Baustein SEO_CLASS_DELETE löscht anscheinend nicht vollständig. Nach dem Löschen mit diesem Baustein und dem erneuten Versuch eine Klasse auf die gelöscht Klasse zu kopieren, gibt es den Kurzdump TMDIR_CLASS_ALREADY_EXISTS.
Aktivierung
Zur Aktivierung der kopierten Klasse verwende ich den Funktionsbaustein SEO_CLASS_ACTIVATE. Dieser funktioniert jedoch eventuell (abhängig vom SAP-Release?) nicht korrekt und hinterlässt die Bestandteile der kopierten Klasse als nicht aktiviert zurück. Versuche stattdessen den Funktionsbaustein CLAS_OBJECT_ACTIVATE.
Code
REPORT zt9r_copy_class.
PARAMETERS p_test AS CHECKBOX DEFAULT 'X'.
PARAMETERS p_crdev AS CHECKBOX DEFAULT 'X'.
PARAMETERS p_class TYPE seoclskey DEFAULT 'ZCL_KOANS_ABOUT_ABAPUNIT'.
PARAMETERS p_newcl TYPE seoclskey DEFAULT 'ZCL_KOANS_<USER>'.
PARAMETERS p_usrcls TYPE usr02-class DEFAULT 'DEV'.
SELECT-OPTIONS so_user FOR sy-uname.
START-OF-SELECTION.
PERFORM copy.
FORM copy.
DATA ls_newcls TYPE seoclskey.
DATA lt_class_keys TYPE seoc_class_keys.
DATA lv_save TYPE sap_bool.
DATA lv_devclass TYPE devclass.
SELECT bname
FROM usr02
INTO TABLE @DATA(lt_users)
WHERE bname IN @so_user
AND class = @p_usrcls. "do not change DDIC, SAP*, etc
LOOP AT lt_users INTO DATA(ls_user)
WHERE bname <> 'DDIC'
AND bname <> 'SAP*'.
IF p_crdev = abap_true.
PERFORM create_devclass USING ls_user-bname.
ENDIF.
lv_devclass = |${ ls_user-bname }|.
ls_newcls-clsname = p_newcl.
REPLACE '<USER>' WITH ls_user-bname INTO ls_newcls-clsname.
WRITE: / ls_newcls-clsname.
CHECK p_test = space.
CALL FUNCTION 'SEO_CLASS_COPY'
EXPORTING
clskey = p_class
new_clskey = ls_newcls
save = abap_true
CHANGING
devclass = lv_devclass
EXCEPTIONS
not_existing = 1
deleted = 2
is_interface = 3
not_copied = 4
db_error = 5
no_access = 6
OTHERS = 7.
IF sy-subrc = 0.
WRITE: 'copied'.
lt_class_keys = VALUE #( ( ls_newcls ) ).
CALL FUNCTION 'SEO_CLASS_ACTIVATE'
EXPORTING
clskeys = lt_class_keys
EXCEPTIONS
not_specified = 1
not_existing = 2
inconsistent = 3
OTHERS = 4.
. IF sy-subrc = 0.
WRITE: 'und aktiviert'.
ENDIF.
ELSE.
WRITE: / ls_newcls-clsname, 'NOT copied'.
ENDIF.
ENDLOOP.
ENDFORM.
FORM create_devclass USING name.
DATA lv_devclass TYPE devclass.
DATA ls_devclass TYPE trdevclass.
DATA lv_changed TYPE c LENGTH 1.
DATA lv_text TYPE c LENGTH 80.
ls_devclass-devclass = |${ name }|.
CALL FUNCTION 'TRINT_DEVCLASS_GET'
EXPORTING
iv_devclass = ls_devclass-devclass
EXCEPTIONS
devclass_not_found = 1 " Package Does Not Exist
OTHERS = 2.
IF sy-subrc = 0.
RETURN.
ENDIF.
ls_devclass-ctext = |local package for { name }|.
ls_devclass-as4user = name.
ls_devclass-pdevclass = space.
ls_devclass-dlvunit = 'LOCAL'.
ls_devclass-component = space.
ls_devclass-comp_appr = space.
ls_devclass-comp_text = space.
ls_devclass-korrflag = 'X'.
ls_devclass-namespace = space.
ls_devclass-tpclass = space.
ls_devclass-type = 'N'.
ls_devclass-target = space.
ls_devclass-packtype = space.
ls_devclass-restricted = space.
ls_devclass-mainpack = space.
ls_devclass-created_by = 'COPYREPORT'.
ls_devclass-created_on = sy-datum.
CALL FUNCTION 'TRINT_MODIFY_DEVCLASS'
EXPORTING
iv_action = 'CREA'
iv_dialog = space
is_devclass = ls_devclass
iv_request = space
IMPORTING
es_devclass = ls_devclass
ev_something_changed = lv_changed
EXCEPTIONS
no_authorization = 1
invalid_devclass = 2
invalid_action = 3
enqueue_failed = 4
db_access_error = 5
system_not_configured = 6
OTHERS = 7.
IF sy-subrc > 0.
MESSAGE i000(oo) WITH 'error creating package' lv_devclass.
STOP.
ELSE.
WRITE: / 'Package created:', name, lv_text.
ENDIF.
ENDFORM. "create_devclass
- Automatisches Eingabefeld [SAPGUI] - 9. Oktober 2025
- So verhinderst du Jobstarts zur falschen Zeit - 15. September 2025
- [apple] iCloud-Photos herunterladen - 21. Juli 2025


