mehrere Dateien per Wildcard auf Server suchen

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV
9 Beiträge • Seite 1 von 1
9 Beiträge Seite 1 von 1

mehrere Dateien per Wildcard auf Server suchen

Beitrag von airwaver (Specialist / 134 / 0 / 1 ) »
Hallo zusammen,

ich möchte mehrere Dateien auf dem SAP-Server lesen, die alle mit einem bestimmte Präfix beginnen. In meinem Fall 'HY_'.

HY0001
HY0002
HY0003
...

Die Methode DIRECTORY_LIST_FILES der Klasse CL_GUI_FRONTEND_SERVICES machte genau das richtige, aber leider nur für das Frontend. :(

Ich habe nun eine Lösung geschrieben, sodass ein Zähler von 0000 bis 9999 hochzählt und zum Index eine Datei liest. Ist diese nicht da, gehts eben weiter.

Jetzt wäre es natürlich cool, wenn ich 'HY_' eingebe und mir ein Baustein alle Dateien in einem bestimmten Verzeichnis liefert, die mit 'HY_' anfangen.

Hat jemand eine Idee?

Gruß
Andy

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Beitrag von ewx (Top Expert / 4844 / 311 / 640 ) »
Versuch doch mal das "Externe Betriebssystemkommando" ls anzulegen (Transaktion SM49, SM69). Da müsstest du dann die Liste mit entpsrechenden Parametern einschränken können (so ähnlich wie bei "DIR HY*.txt").
Gruß, Enno

Re: mehrere Dateien per Wildcard auf Server suchen

Beitrag von JHM (Top Expert / 1197 / 1 / 197 ) »
airwaver hat geschrieben:Hat jemand eine Idee?
Es gibt noch den FuBa 'EPS_GET_DIRECTORY_LISTING'. Wobei der Probleme mit Wildcards hat und man bestimmte Berechtigungen braucht, die seit SOX bei uns nicht mehr vergeben werden.

Aus dem Grund habe ich mir damals einen FuBa selbst gebastelt. Das ganze geht über Systemcalls, ist also mit Vorsicht zu genießen:

Code: Alles auswählen.

FUNCTION z_get_dir_list_only_files .
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*"  IMPORTING
*"     VALUE(DIRECTORY) TYPE  EPSF-EPSDIRNAM OPTIONAL
*"     VALUE(FILE) TYPE  EPSF-EPSFILNAM OPTIONAL
*"  EXPORTING
*"     VALUE(FILE_COUNTER) TYPE  EPSF-EPSFILSIZ
*"  TABLES
*"      DIR_LIST STRUCTURE  EPSFILI OPTIONAL
*"  EXCEPTIONS
*"      INVALID_DIRECTORY_FILE
*"      EMPTY_DIRECTORY_LIST
*"      READ_ERROR
*"----------------------------------------------------------------------

* Initialize variables
  CLEAR: v_opsys, w_file.

* Default the ROOT Directory based on the Operating System
  IF directory IS INITIAL.
    v_opsys = sy-opsys.
    TRANSLATE v_opsys TO UPPER CASE.
    CASE v_opsys.
      WHEN 'WINDOWS NT'.
        directory = 'C:'.
      WHEN OTHERS.
        directory = '/'.
    ENDCASE.
  ENDIF.

* File must have a value.
  IF file IS INITIAL.
    file = '*'.
  ENDIF.

* Read all Directories and Files from Application Server
  CALL 'C_DIR_READ_FINISH'
      ID 'ERRNO'  FIELD w_file-errno
      ID 'ERRMSG' FIELD w_file-errmsg.

  CALL 'C_DIR_READ_START'
      ID 'DIR'    FIELD directory
      ID 'FILE'   FIELD '*'
      ID 'ERRNO'  FIELD w_file-errno
      ID 'ERRMSG' FIELD w_file-errmsg.

  IF sy-subrc <> 0.
    RAISE invalid_directory_file.
  ENDIF.

  DO .
    CLEAR w_file.
    CALL 'C_DIR_READ_NEXT'
      ID 'TYPE'   FIELD w_file-type
      ID 'NAME'   FIELD w_file-name
      ID 'LEN'    FIELD w_file-len
      ID 'OWNER'  FIELD w_file-owner
      ID 'MTIME'  FIELD w_file-mtime
      ID 'MODE'   FIELD w_file-file_mode
      ID 'ERRNO'  FIELD w_file-errno
      ID 'ERRMSG' FIELD w_file-errmsg.

    IF sy-subrc = 1.
      EXIT.
    ELSEIF sy-subrc = 5.
      IF w_file-type IS INITIAL.
        w_file-type = '???'.
      ELSEIF  w_file-owner  IS INITIAL.
        w_file-owner = '???'.
      ELSEIF w_file-file_mode IS INITIAL.
        w_file-file_mode = '???'.
      ENDIF.
    ELSE.
        RAISE read_error.
    ENDIF.

*   Only Files
    IF w_file-type(1) EQ 'F' OR w_file-type(1) EQ 'f'.
*   Only matching pattern
    CHECK w_file-name CP file.

      w_epsfili-name = w_file-name.
      w_epsfili-size = w_file-len.

      APPEND w_epsfili TO dir_list.
    ENDIF.
  ENDDO.

*   How many Files did we found?
  file_counter = LINES( dir_list ).
*   No Files -> Exception
  IF file_counter EQ 0.
    RAISE EMPTY_DIRECTORY_LIST.
  ENDIF.

ENDFUNCTION.
Gruß Hendrik

Beitrag von airwaver (Specialist / 134 / 0 / 1 ) »
Danke für die schnellen Antworten.

Habe es mit dem FuBa von JHM probiert. Der EPS-FuBa ging auch bei mir nicht.
Der JHM-FuBa macht bei mir leider nichts.
Bei:
CALL 'C_DIR_READ_START'
ID 'DIR' FIELD directory
ID 'FILE' FIELD '*'
ID 'ERRNO' FIELD w_file-errno
ID 'ERRMSG' FIELD w_file-errmsg.
steigt er bei mir schon aus.
Error = 3!

Wir sind auf Release 4.6c. Kann es daran liegen?
Hat noch jemand eine andere Idee?

Gruß
Andy

Beitrag von se80 (ForumUser / 21 / 0 / 0 ) »
Hallo Andy,

schau mal im Programm RSWATCH0 (TA AL11) nach. Dort werden die Kernel-Methoden auch verwendet.

Das funktioniert schon solange, wie ich ABAP denken kann (also bereits lange vor 4.6).

Gruß

Gerd

Beitrag von JHM (Top Expert / 1197 / 1 / 197 ) »
airwaver hat geschrieben:Wir sind auf Release 4.6c. Kann es daran liegen?
Hat noch jemand eine andere Idee?
Erst einmal muss ich mich für die unvollständige Codevorlage entschuldigen.
Es fehlen die Datendefinitonen aus dem TOP-INCLUDE des FuBas:

Hier kurz nachgereicht:

Code: Alles auswählen.

* Für 6.4
  TYPES: BEGIN OF zdirectory,
           name(100),
           type(20),
           len(16),
           owner(20),
           mtime(6),
           file_mode(9),
           errno(3),
            errmsg(40),
           mod_date(10),
           mod_time(8),
        END    OF zdirectory.

  DATA: v_opsys       TYPE sy-opsys,
        v_data        TYPE string,
        v_date        TYPE sy-datum,
        w_file        TYPE zdirectory,
        w_epsfili     TYPE epsfili.

* Für 4.6c
  TYPES: BEGIN OF zdirectory,
        name(260)   TYPE c,       " name of entry. (possibly truncated.)
        type(10)    TYPE c,            " type of entry.
        len(8)      TYPE p,            " length in bytes.
        owner(8)    TYPE c,            " owner of the entry.
        mtime(6)    TYPE p, " last modification date, seconds since 1970
        file_mode(9)  TYPE c, " like "rwx-r-x--x": protection mode.
        useable(1)    TYPE c,
        subrc(4)    TYPE c,
        errno(3)    TYPE c,
        errmsg(40)  TYPE c,
        mod_date    TYPE d,
        mod_time(8) TYPE c,            " hh:mm:ss
        END    OF zdirectory.

  DATA: v_opsys       TYPE sy-opsys,
        v_data        TYPE string,
        v_date        TYPE sy-datum,
        w_file        TYPE zdirectory,
        w_epsfili     TYPE epsfili.
Jetzt zu deinem 4.6c Problem: Ich habe den Fuba auf unsere alte 4.6c Maschine kopiert. Und läuft nicht: READ_ERROR.

Einwenig anpassen:

Code: Alles auswählen.

    CALL 'C_DIR_READ_NEXT'
      ID 'TYPE'   FIELD w_file-type
      ID 'NAME'   FIELD w_file-name
      ID 'LEN'    FIELD w_file-len
      ID 'OWNER'  FIELD w_file-owner
      ID 'MTIME'  FIELD w_file-mtime
      ID 'MODE'   FIELD w_file-file_mode
      ID 'ERRNO'  FIELD w_file-errno
      ID 'ERRMSG' FIELD w_file-errmsg.

    IF sy-subrc = 1.
      EXIT.
    ELSEIF sy-subrc = 5.
        IF w_file-type IS INITIAL.
          w_file-type = '???'.
        ELSEIF  w_file-owner  IS INITIAL.
          w_file-owner = '???'.
        ELSEIF w_file-file_mode IS INITIAL.
          w_file-file_mode = '???'.
        ENDIF.
*** Hier muss die Null ausgeschlossen werden
    ELSEIF sy-subrc <> 0.
      RAISE read_error.
    ENDIF.
Und es geht.
Gruß Hendrik

Beitrag von airwaver (Specialist / 134 / 0 / 1 ) »
Bei mir steigt er schon beim zweiten System-Call aus.

C_DIR_READ_FINISH wird schon mit RC 3 beendet.
Und dann kommt eben.....

Code: Alles auswählen.

                                               
           CALL 'C_DIR_READ_START'                          
               ID 'DIR'    FIELD directory                  
               ID 'FILE'   FIELD '*'                        
               ID 'ERRNO'  FIELD w_file-errno               
               ID 'ERRMSG' FIELD w_file-errmsg.             
                                                            
           IF sy-subrc <> 0.                                
             RAISE invalid_directory_file.                  
           ENDIF.                                           
                                                            
           DO .                                             
             CLEAR w_file.                                  
             CALL 'C_DIR_READ_NEXT'                         
               ID 'TYPE'   FIELD w_file-type                
                                                            
   Feldnamen                   1 - 4                        
   directory                      SV50070\TEST\A16NT        
   w_file-errno                    20                       
   w_file-errmsg                  opendir: Not a directory  
                                                            
SY-SUBRC 1                     SY-TABIX 1                   
Es will also nicht so richtig funktionieren....

Beitrag von airwaver (Specialist / 134 / 0 / 1 ) »
Eben guck ich mir die AL11 im Debugging an, wo ja genau derselbe Code durchlaufen wird, wie im FuBa.

Und siehe da, im Feld DIRECTORY steht "\\sv50070\......". Oh man, wenn man die führenden \\ weglässt, kanns ja nicht gehen!!!! :shock:

Nun gehts also...... SPITZEEEEEEE!!!!!!!!!!!!!
:D

Beitrag von JHM (Top Expert / 1197 / 1 / 197 ) »
airwaver hat geschrieben: C_DIR_READ_FINISH wird schon mit RC 3 beendet.
Das ist so kein Problem, da mit diesem Aufruf die Aufrufkette initialisiert wird. Bei sy-subrc war sie schon initialisiert.
airwaver hat geschrieben: Und dann kommt eben.....

Code: Alles auswählen.

                                               
           CALL 'C_DIR_READ_START'                          
               ID 'DIR'    FIELD directory                  
               ID 'FILE'   FIELD '*'                        
               ID 'ERRNO'  FIELD w_file-errno               
               ID 'ERRMSG' FIELD w_file-errmsg.             
                                                            
           IF sy-subrc <> 0.                                
             RAISE invalid_directory_file.                  
           ENDIF.                                           
                                                            
           DO .                                             
             CLEAR w_file.                                  
             CALL 'C_DIR_READ_NEXT'                         
               ID 'TYPE'   FIELD w_file-type                
                                                            
   Feldnamen                   1 - 4                        
   directory                      SV50070\TEST\A16NT        
   w_file-errno                    20                       
   w_file-errmsg                  opendir: Not a directory  
                                                            
SY-SUBRC 1                     SY-TABIX 1                   
Es will also nicht so richtig funktionieren....
Die Vormatierung ist schlecht zu lesen, wenn ich das richtig sehe versuchst du auf das Verzeichnis 'SV50070\TEST\A16NT' zu zu greifen. Das ist def. kein "valides" Verzeichnis. Für Unix fehlt das führende '\'. Du kannst mit der AL11 auch Browsen um die Ergebnisse zu prüfen. Von wo testes du? UNIX ist bei Verzeichnissen Case-Sensitive, darauf Achten.
Gruß Hendrik

Seite 1 von 1

Vergleichbare Themen

2
Antw.
2377
Views
Dateiinformationen für Dateien auf dem Server
von snooze » 11.03.2005 10:10 • Verfasst in ABAP® Core
1
Antw.
1200
Views
Funktion zum verschieben von Dateien auf dem Server
von dennsen » 06.02.2007 11:16 • Verfasst in ABAP® Core
0
Antw.
993
Views
PDF Dateien vom Server lesen und automatisch ausdrucken???
von eschi78 » 03.01.2006 11:56 • Verfasst in ABAP® Core
1
Antw.
2138
Views
ZIP-Datei aus mehreren .dat-Dateien auf dem Server erstellen
von Jura » 17.05.2006 13:35 • Verfasst in ABAP® für Anfänger
7
Antw.
4550
Views
Excel Import aus SAP-Server-Dateien möglich(statt Frontend)?
von eberhard » 21.11.2006 19:03 • Verfasst in ABAP® Core

Über diesen Beitrag


Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Unbeantwortete Forenbeiträge

Daten an Tabelle binden
Gestern von Bright4.5 1 / 511
aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 2146
Hilfe bei SWEC/SWE2
letzen Monat von retsch 1 / 8742