
BTP - Pakete und SWC bereinigen
Du möchtest ein Pakete im ABAP Environment löschen, doch es gibt noch Objekte die blockieren und vielleicht gar nicht mehr in Eclipse sichtbar sind? Schauen wir uns dazu einige Punkte zur Bereinigung an.
Inhaltsverzeichnis
In diesem Artikel schauen wir uns im Detail an, wie wir Objekte aus dem ABAP Environment und einer Software Komponente entfernen können, auch wenn es vielleicht nicht möglich ist.
Einleitung
In unserem Beispiel starten wir mit einem Paket innerhalb einer Software Komponente. Das zu löschende Paket enthält aktuell ein Objekt, welches für uns sichtbar ist. Diese Klasse wollen wir entfernen. Das Aufräumen und Reorganisieren von Paketen innerhalb von Software Komponenten ist eine gängige Praxis. Doch wie sieht es eigentlich aus, wenn das Löschen einmal schiefläuft oder es zu Informationen kommt, die uns nicht weiterbringen?
Bereinigung
Versuchen wir, das Paket direkt zu löschen, werden wir eine Fehlermeldung erhalten, dass das Paket noch Objekte enthält und ein Löschen nicht möglich ist. Grundsätzlich handelt es sich hierbei um den Standard. Wir müssen das Paket zuvor erst leeren, bevor wir dieses löschen können.
Dazu löschen wir die enthaltene Klasse und geben den Transport frei. Erst beim Freigeben des Transportes werden die Objekte komplett aus dem System entfernt. Normalerweise gibt es ein Lösch-Flag, welches markiert, dass ein Objekt gelöscht ist, und erst beim Transportieren dieses Objektes wird dann die Registrierung entfernt. In diesem Fall ist unser Paket erst einmal leer. Allerdings können wir das Paket immer noch nicht löschen, obwohl wir den Transport freigegeben haben.
TADIR
Der Grund ist in den meisten Fällen dann, dass es noch Objekte auf Datenbankebene gibt, die das Löschen des Paketes blockieren. In einem klassischen System würden wir dazu auf die Datenbank gehen und in die Tabelle TADIR schauen, die uns dann Informationen gibt, welches Objekt noch unter dem Paket vorhanden ist. Allerdings befinden wir uns hier in einem Cloud-System, und SAP stellt einen Core Data Service zur Verfügung, nämlich den "I_CustABAPObjDirectoryEntry". Diesen können wir nutzen, um weitere Informationen zu Objekten eines Pakets zu erhalten.
Dazu stellen wir eine kleine Hilfsklasse zur Verfügung, die du ausführen kannst, um weitere Informationen zu bekommen, welche Objekte innerhalb einer Software Komponente zum Beispiel schon mit einem Lösch-Flag gekennzeichnet sind. Manchmal kann es auch vorkommen, dass ein Kollege ein gelöschtes Objekt direkt aus dem Transport entfernt hat. Damit wird die Löschung nicht transportiert, das Objekt bleibt mit dem Lösch-Flag auf der Datenbank stehen und hindert uns daran, das Paket zu löschen.
CLASS zcl_bs_demo_object_cleanup DEFINITION
PUBLIC FINAL
CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES if_oo_adt_classrun.
TYPES objects TYPE STANDARD TABLE OF I_CustABAPObjDirectoryEntry WITH EMPTY KEY.
METHODS read_objects
IMPORTING software_component TYPE I_CustABAPObjDirectoryEntry-ABAPSoftwareComponent
EXPORTING deleted_objects TYPE objects
objects_to_be_deleted TYPE objects.
PRIVATE SECTION.
METHODS output_line
IMPORTING !object TYPE I_CustABAPObjDirectoryEntry
!out TYPE REF TO if_oo_adt_classrun_out.
ENDCLASS.
CLASS zcl_bs_demo_object_cleanup IMPLEMENTATION.
METHOD if_oo_adt_classrun~main.
read_objects( EXPORTING software_component = 'ZBS_DMO'
IMPORTING deleted_objects = DATA(deleted_objects)
objects_to_be_deleted = DATA(objects_to_be_deleted) ).
out->write( `Deleted objects` ).
LOOP AT deleted_objects INTO FINAL(deleted_object).
output_line( object = deleted_object
out = out ).
ENDLOOP.
out->write( |
Active objects| ).
LOOP AT objects_to_be_deleted INTO FINAL(active_objects).
output_line( object = active_objects
out = out ).
ENDLOOP.
ENDMETHOD.
METHOD read_objects.
SELECT FROM I_CustABAPObjDirectoryEntry
FIELDS *
WHERE ABAPSoftwareComponent = @software_component
AND ABAPObjectType <> 'DEVC'
ORDER BY ABAPPackage, ABAPObject
INTO TABLE @DATA(package_objects).
LOOP AT package_objects ASSIGNING FIELD-SYMBOL(<package_object>).
IF <package_object>-ABAPObjectIsDeleted = abap_true.
APPEND <package_object> TO deleted_objects.
ELSE.
APPEND <package_object> TO objects_to_be_deleted.
ENDIF.
ENDLOOP.
ENDMETHOD.
METHOD output_line.
DATA(seperator) = ` - `.
out->write( |{ object-ABAPPackage }{ seperator }{ object-ABAPObjectType }{ seperator }{ object-ABAPObject }| ).
ENDMETHOD.
ENDCLASS.
Im Ergebnis erhalten wir zwei Listen: eine für die Objekte mit Lösch-Flag und in welchem Paket sich diese befinden, und eine für die verschiedenen aktiven Objekte, die ebenfalls zu dieser Software Komponente und anderen Paketen gehören. Die Informationen des Objekttyps und des Objektnamens benötigen wir dann im nächsten Schritt für das Löschen.
Löschen
Wie du oben siehst, gibt es ein Objekt im zu löschenden Paket, welches im Project Explorer nicht mehr sichtbar ist. Das liegt daran, dass ein Löschkennzeichen gesetzt wurde, aber der Eintrag nicht transportiert wurde. In diesem Fall gehen wir in die Aufgabe und können über den Hinzufügen-Button das Objekt angeben, welches wir dann in den Transportauftrag schreiben. So können wir die verschiedenen Objekte hinzufügen, was nur manuell funktioniert.
Geben wir dann den Transportauftrag frei. Um das Löschen zu transportieren, sollten nun keine Objekte mehr auf der Datenbank vorhanden sein, sondern nur noch ein Objekt, nämlich unser Paket. Starten wir dann das Löschen des Pakets, erhalten wir nur noch eine Warnmeldung, die auf sich selbst referenziert. Wir geben einen Transportauftrag an und können damit dann auch final das Paket aus dem System entfernen.
Hinweis: Wir hatten eigentlich auch versucht, einen automatischen Weg über die XCO-Klassen zu entwickeln. Allerdings unterstützen die XCO-Klassen aktuell kein Hinzufügen von Objektschlüsseln, womit wir die gelöschten Objekte nicht automatisiert per API hinzufügen können.
Fazit
Hast du Probleme beim Löschen eines Paketes? Dann solltest du als Erstes den Objekt-Explorer prüfen und im nächsten Schritt auf der Datenbank schauen, ob vielleicht noch Objekte mit Löschkennzeichen vorhanden sind. Das Entfernen von Objekten über das Freigeben einzelner Transporte ist immer etwas schmerzhaft, da so viele Schritte notwendig sind, um ein Paket am Ende zu löschen.






