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.
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.
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.
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.