Code: Alles auswählen.
*&---------------------------------------------------------------------*
*& Report Y_PM_DELETE_FILE
*&
*&---------------------------------------------------------------------*
*& Löscht Dateien aus einem Zielverzeichnis.
*&
*&
*&
*& Author : ********
*& date : **.**.****
*& kind of p. : Report (x) Batch-Input ( ) Include ( )
*& Sonstiges/others ( ) Modulpool ( )
*&
*----------------------------------------------------------------------*
* Änderungshistorie *
* Datum Benutzer: Grund *
* ---------- ----------------- --------------------------------------- *
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
REPORT Y_PM_DELETE_FILE.
PARAMETERS: p_dir TYPE string LOWER CASE OBLIGATORY
DEFAULT '/usr/sap/tmp/GR55_Report_Painter'
VISIBLE LENGTH 80.
SELECTION-SCREEN BEGIN OF BLOCK file_block WITH FRAME TITLE TEXT-001.
PARAMETERS: p_file1 TYPE string LOWER CASE VISIBLE LENGTH 40,
p_file2 TYPE string LOWER CASE VISIBLE LENGTH 40,
p_file3 TYPE string LOWER CASE VISIBLE LENGTH 40,
p_file4 TYPE string LOWER CASE VISIBLE LENGTH 40,
p_file5 TYPE string LOWER CASE VISIBLE LENGTH 40.
SELECTION-SCREEN END OF BLOCK file_block.
DATA: lv_fullpath TYPE string,
lt_files TYPE TABLE OF string,
lv_file TYPE string.
START-OF-SELECTION.
* Sammle alle eingegebenen Dateien
IF p_file1 IS NOT INITIAL. APPEND p_file1 TO lt_files. ENDIF.
IF p_file2 IS NOT INITIAL. APPEND p_file2 TO lt_files. ENDIF.
IF p_file3 IS NOT INITIAL. APPEND p_file3 TO lt_files. ENDIF.
IF p_file4 IS NOT INITIAL. APPEND p_file4 TO lt_files. ENDIF.
IF p_file5 IS NOT INITIAL. APPEND p_file5 TO lt_files. ENDIF.
IF lt_files IS INITIAL.
MESSAGE 'Keine Dateien zum Löschen angegeben!' TYPE 'E'.
RETURN.
ENDIF.
* Für Server-Zugriff OPEN DATASET
LOOP AT lt_files INTO lv_file.
CONDENSE lv_file.
CONCATENATE p_dir '/' lv_file INTO lv_fullpath.
WRITE: / 'Prüfe Datei:', lv_fullpath.
" Prüfen ob Datei existiert
DATA(lv_exists) = abap_false.
OPEN DATASET lv_fullpath FOR INPUT IN TEXT MODE ENCODING DEFAULT.
IF sy-subrc = 0.
lv_exists = abap_true.
CLOSE DATASET lv_fullpath.
ENDIF.
IF lv_exists = abap_false.
WRITE: / '➤ Datei nicht gefunden:', lv_fullpath.
CONTINUE.
ENDIF.
" Datei löschen
DELETE DATASET lv_fullpath.
IF sy-subrc = 0.
WRITE: / '✓ Datei erfolgreich gelöscht:', lv_file.
ELSE.
WRITE: / '✗ Fehler beim Löschen:', lv_file, 'Subrc:', sy-subrc.
ENDIF.
SKIP.
ENDLOOP.
WRITE: / 'Löschvorgang abgeschlossen.'.- ich konnte keinen Frage oder einen Nährwert finden.
Dieser Bereich des Forums ist ja durchaus dafür da, um (Code-)Lösungen zu präsentieren und nicht um Fragen zu stellen. Die Einstiegshürde muss man dafür auch nicht zu hoch setzen, statt dessen würde ich mir hier einen konstruktiven und kollektiven Code-Review wünschen (wie hier bereits begonnen wurde) - daraus können alle viel mitnehmen.
Code: Alles auswählen.
IF sy-subrc <> 0.
WRITE: / '➤ Datei nicht gefunden:', lv_fullpath.
CONTINUE.
ENDIF.Geisteskranke Anforderung. Du sollst Dateien per ABAP löschen, darfst aber nicht den Befehl benutzen, den ABAP dafür bereitstellt. Kunden gibt's...msfox hat geschrieben:Ich hatte etwas ähnliches letztens beim Kunden. Dort sollte aber unbedingt über Systembefehle gelöscht werden.
Wirklich? Wenn Du eh den Aufwand treiben und einen Systembefehl benutzen musst, dann kannst Du Dir doch den Umstand zunutze machen, dass die Systembefehle Muster zu beherrschen pflegen. Unter Linux könntest Du z.B. einen rm -rf abc* absetzen.msfox hat geschrieben:Auch bestand bei mir die Anforderung, Dateien mit einem bestimmten Muster zu löschen. Dann wird's nämlich schwieriger, weil man erst das Verzeichnis lesen muss.
FULL ACKDeathAndPain hat geschrieben: ↑07.11.2025 20:04[...] denn ich denke, selbst die Verfechter davon werden mir recht geben, dass falsche ungarische Notation schlechter ist als gar keine (da sie dann gezielt in die Irre führt).
Könntest du erläutern warum genau das Verwenden von CONCATENATE hier "unschön" ist?DeathAndPain hat geschrieben: ↑07.11.2025 20:04&& wäre wesentlich schöner gewesen als dieser CONCATENATE. Das mag nicht für alle CONCATENATEs gelten, aber für die meisten und ganz besonders für diesen.
Code: Alles auswählen.
lv_fullpath = p_dir && `/` && lv_file.Code: Alles auswählen.
CONCATENATE p_dir '/' lv_file INTO lv_fullpath.Code: Alles auswählen.
lv_fullpath = |{p_dir}/{lv_file}|