Prüfung Datei im Pfad auf Existenz

Aus SAP-Wiki
Zur Navigation springenZur Suche springen

Siehe Schlüsselbefehl Select from table where Feld LIKE.

In diesem Coding wird geprüft, ob eine Datei basierend auf einem Selektionsparameter mit Uploadpfad bereits verarbeitet wurde. Der extrahierte Dateinamen wird mit einem Datenbankfeld abgeprüft, wo alle bereits vorgenommen Uploads mit ihrem vollständigen Pfad gespeichert sind.

Diese Prüfung ist nicht trivial, da der Pfad im Selektionsparameter ungleich dem Pfad im Feld der Datenbank sein kann, obwohl die gleiche Datei angesprochen wird, wenn z. B. verschiedene User eine Datei von ihrem jeweiligen PC hochgeladen haben.

Für diesen Vergleich extrahiert man den Dateinamen aus dem Selektionsparameter und vergleicht diesen dann mit LIKE mit dem entsprechenden Datenbankfeld.

Das resultierende Coding ist dabei recht spannend, weil es einige moderne ABAP-Befehle wie Inline-Deklarationen, Alternative zum "Read Table", Zeichenketten-Templates und anderes verwendet. Siehe Neues ABAP (ab Release 7.40).

Coding

*&---------------------------------------------------------------------*
*& Form CHECK_FILE_UPLOADED
*&---------------------------------------------------------------------*
*& Prüfe, ob der Dateiname schon importiert wurde
*& und ggf. Fehlermeldung
*&---------------------------------------------------------------------*
FORM check_file_uploaded  USING    iv_file  TYPE rlgrap-filename
                          CHANGING cv_error TYPE xfeld.

  DATA: lt_results TYPE STANDARD TABLE OF match_result,
        lv_laenge  TYPE i,
        lv_datei   type rlgrap-filename.

  DATA(lv_file) = iv_file.

* Der Dateiname muss aus dem Pfad extrahiert werden
  FIND ALL OCCURRENCES OF '\' IN lv_file RESULTS lt_results.


* Bestimme letzten Offset vom Zeichen '\'
* Beim Offset das Zeichen rechts vom letzten '\' bestimmen als Start String Dateinamen
  DESCRIBE TABLE lt_results LINES DATA(lv_anzahl).

  DATA(lv_offset) = lt_results[ lv_anzahl ]-offset.

  add 1 to lv_offset.


* Gesamtlänge bestimmen vom Pfad
  lv_laenge = strlen( lv_file ).

    
* Länge der Datei bestimmen
  lv_laenge = lv_laenge - lv_offset.


* Dateinamen ermitteln
  lv_datei = lv_file+lv_offset(lv_laenge).


* Für die Suche mit LIKE das Präfix '%' ergänzen, damit Datei gefunden
* werden kann in Pfad, der auf der Datenbank gespeichert ist.
  Data(lv_search) = '%' && lv_datei.


* Prüfen ob die Datei bereits in der Datenbanktabelle ZSD_UMFUHREN_K existiert
  Select single
    path
    into @data(lv_path)
    from ZSD_UMFUHREN_K
    where PATH like @lv_search.

  if sy-subrc = 0.
*   Für die Optik den Dateinamen mit ' .. ' umschließen
    lv_datei = |'{ lv_datei }'|.

    message i076(/FTI/WEBGUI_MSG) with lv_datei. "Dateiname &1 bereits angelegt
    cv_error = abap_true.
  endif.

ENDFORM.