Nextlevel-Icon

Helfen Sie uns ein Level weiter. Nehmen Sie an unserer Umfrage teil.

Dateinamen-Ermittlung in SAP BW4 Transformation - Flatfile Datasource

Argy Fidanidis

Geschrieben von: Argy Fidanidis - 19 Mai 2022
(Aktualisiert am: 21 Juni 2022)

Häufig ist es bei Flatfile Schnittstellen erwünscht, dass Dateien nicht doppelt verarbeitet werden sollen. Im Idealfall werden die Dateien einmalig nach dem Schreibvorgang auf den Anwendungsserver von SAP BW verarbeitet. Im Folgenden erläutere ich Ihnen eine Methode, wie dies zu bewerkstelligen ist.

Das Vorgehen zur dynamischen Ermittlung von zu ladenden Dateien kann durch Routinen erreicht werden. Diese Routinen ändern anhand einer gewissen Logik die Dateinamen in der Adapter-Einstellung im DTP, so dass verschiedene Dateien im Anwendungsserver durch den DTP geladen werden können.

In der Regel wird eine Logik genutzt, in der die Routine erkennt, ob eine Datei schon geladen wurde. Hierfür speichern wir über eine Transformations-Routine die schon geladenen Dateinamen im Ziel-aDSO. Anhand dieser Einträge können wir erkennen, ob eine Datei schon geladen wurde und dementsprechend die nicht geladene Datei laden.

Speichern der Dateinamen im aDSO

Um die Dateinamen der schon geladenen Dateien im Ziel-aDSO zu speichern, nutzen wir die SAP-Tabelle RSFILENAMEDONE. In dieser werden die Dateinamen zu ihrer dazugehörigen Request-IDs hinterlegt.Filename Extraktion DE

Dadurch kann in der Startroutine der Transformation eine Variable mit dem Dateinamen der geladenen Datei gefüllt werden. Dies ist möglich, indem man den ‘filename’ (Dateiname) aus der Tabelle RSFILENAMEDONE mittels ‘Request-Nummer’ (Request-ID) selektiert.

Jetzt muss nur noch über eine Feldroutine diese Variable dem Feld übergeben werden.

if g_filename is initial.
Select Single filename from RSFILENAMEDONE
where request = @request into @g_filename.
endif.

Ein Vergleich von SAP BW, HANA Native und SAP DW-Cloud - Laden Sie hier das Whitepaper herunter! 

SAP BW Vergleich WP DE


Dynamischer Fileupload

Haben wir die Dateinamen im aDSO abgespeichert, können wir anhand dieser bei der DTP Ausführung jeweils prüfen, ob ein File schon verarbeitet wurde. Wir vergleichen hierzu die Dateinamen aus dem Verzeichnis des Anwendungsservers mit den Dateinamen aus dem aDSO und laden nur Dateien, die noch nicht im aDSO aufgeführt werden.

Im zweiten Schritt überprüfen wir, ob die gefundene Datei noch in den Anwendungsserver hochgeladen wird, indem die Dateigröße im Abstand von fünf Sekunden abgeglichen wird. Ist die Dateigröße identisch, bedeutet es, dass die Datei vollständig auf dem Anwendungsserver hinterlegt wurde und wir diese laden können.

Do 2 times.
      IF sy-index = 1.
        LOOP AT it_files ASSIGNING FIELD-SYMBOL(<ls_files>).
          p_filename = |{ lv_dir_name }{ <ls_files>-name }|.
          SELECT SINGLE filename
            FROM /bic/afilnatest2
            WHERE filename EQ @p_filename
            INTO @DATA(l_filename).
          IF sy-subrc NE 0. " File has not been transferred yet
            ls_files = <ls_files>.
            EXIT. " consider first filename, that is not found in target yet.
          ENDIF.
        ENDLOOP.

        WAIT UP TO 5 SECONDS.
      ELSE. " Second part of logic
        LOOP AT it_files ASSIGNING <ls_files>
          WHERE name = ls_files-name.
          IF ls_files-size = <ls_files>-size. " file size has not changed in last 5 seconds, therefore it is considered not being transferred anymore

            p_filename = |{ lv_dir_name }{ ls_files-name }|.
            p_subrc = 0.

          ELSE.
            CLEAR p_filename.
          ENDIF.

        ENDLOOP.
      ENDIF.
    ENDIF.
enddo.

Haben Sie Fragen zu diesem oder anderen Themen? Versuchen Sie das nötige Know-How in Ihrer Abteilung aufzubauen oder benötigen Sie Unterstützung bei einer konkreten Fragestellung? Wir helfen Ihnen gerne dabei. NextLytics steht Ihnen stets als erfahrener Projektpartner zur Seite.

Erfahren Sie mehr über SAP BW

Themen: SAP BW

Beitrag teilen

Sie haben eine Frage zum Blog?
Fragen Sie den/die Autor*in Argy Fidanidis