[ABAP] Dateien auf dem Applikationsserver lesen / schreiben / löschen

* http://sap4tech.net/handling-files-on-application-server-in-sap/
* http://abap-blog.ru/files/fajlovyj-interfejs-operacii-s-fajlami/

DATA: it_mara TYPE TABLE OF mara.
DATA: wa_mara LIKE LINE OF it_mara.
DATA: lv_string TYPE string.

PARAMETERS: p_file TYPE string DEFAULT '/usr/sap/tmp/testmara.csv' .
PARAMETERS: p_mtart TYPE mara-mtart DEFAULT 'DIEN'.

START-OF-SELECTION.
* Daten lesen
  SELECT * FROM mara INTO TABLE @it_mara UP TO 50 ROWS WHERE mtart = @p_mtart.

TRY.
* Datei im Textmode zum Schreiben öffnen
* In einem Unicode-System entspricht die Angabe DEFAULT der Angabe UTF-8 und in einem Nicht-Unicode-System der Angabe NON-UNICODE
    OPEN DATASET p_file FOR OUTPUT IN TEXT MODE ENCODING UTF-8 IGNORING CONVERSION ERRORS.

* Daten in die Datei schreiben
    LOOP AT it_mara INTO wa_mara .
      lv_string = |{ wa_mara-matnr };{ wa_mara-ersda };{ wa_mara-matkl }|.
      TRANSFER lv_string TO p_file.
    ENDLOOP.

* Datei schließen
    CLOSE DATASET p_file.

* Datei im Textmode zum lesen öffnen
* In einem Unicode-System entspricht die Angabe DEFAULT der Angabe UTF-8 und in einem Nicht-Unicode-System der Angabe NON-UNICODE
    OPEN DATASET p_file FOR INPUT IN TEXT MODE ENCODING UTF-8 IGNORING CONVERSION ERRORS.

* Daten lesen bis Dateiende
    DO.
      READ DATASET p_file INTO lv_string.
      IF sy-subrc <> 0.
        EXIT.
      ELSE.
        WRITE: / lv_string.
      ENDIF.
    ENDDO.

* Datei schließen
    CLOSE DATASET p_file.

* Datei löschen
    DELETE DATASET p_file.
  CATCH cx_root INTO DATA(e_txt).
    WRITE: / e_txt->get_text( ).
ENDTRY.

[ABAP] Dateien und Verzeichnisse des lokalen Systems auflisten

DATA: it_file_table TYPE filetable.
DATA: s_file_table TYPE file_table.
DATA: lv_file_count TYPE i.
DATA: lv_folder TYPE string VALUE 'C:\'.

cl_gui_frontend_services=>directory_list_files(
    EXPORTING
      directory                   = lv_folder  " Verzeichnis
      filter                      = '*.*'      " Dateifilter
      files_only                  = abap_false " nur Dateien listen
      directories_only            = abap_false " nur Verzeichnisse listen
    CHANGING
      file_table                  = it_file_table
      count                       = lv_file_count
    EXCEPTIONS
      cntl_error                  = 1
      directory_list_files_failed = 2
      wrong_parameter             = 3
      error_no_gui                = 4
      not_supported_by_gui        = 5
      OTHERS                      = 6 ).

IF sy-subrc = 0.
  WRITE: / 'Anzahl Directory + Files: ', lv_file_count.
  WRITE: /.
  WRITE: / 'Directory:'.
  WRITE: / '----------'.

  LOOP AT it_file_table INTO s_file_table.
    WRITE: / s_file_table-filename.
  ENDLOOP.
ELSE.
  MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

[ABAP] DirectoryBrowser-Dialog aufrufen

DATA: fldr TYPE string.

TRY.
    cl_gui_frontend_services=>directory_browse(
        EXPORTING
          initial_folder  = 'c:\'
        CHANGING
          selected_folder = fldr ).

    WRITE: / fldr.

  CATCH cx_root INTO DATA(e_txt).          " Oberklasse für Exceptions abfangen und Kurztext übergeben
    MESSAGE e_txt->get_text( ) TYPE 'I'.   " Exception Kurztext ausgeben
ENDTRY.

[ABAP] SaveFile-Dialog anzeigen

Variante 1 (cl_gui_frontend_services)

PARAMETERS: p_fname TYPE file_table-filename OBLIGATORY DEFAULT 'c:\test.xlsx'.

* wenn die F4-Hilfe für den Dateinamen aufgerufen wird
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_fname.
  DATA: lv_action TYPE i.
  DATA: lv_filename TYPE string.
  DATA: lv_fullpath TYPE string.
  DATA: lv_path TYPE string.

* FileSave-Dialog aufrufen
  TRY.
      cl_gui_frontend_services=>file_save_dialog( EXPORTING
                                                    default_extension   = 'xlsx'        " default Dateinnamenerweiterung
                                                    default_file_name   = |{ p_fname }| " default Dateiname
                                                    file_filter         = |xlsx (*.xlsx)\|*.xlsx\|{ cl_gui_frontend_services=>filetype_all }|
                                                    prompt_on_overwrite = abap_true
                                                  CHANGING
                                                    filename          = lv_filename     " Dateiname
                                                    path              = lv_path         " Pfad
                                                    fullpath          = lv_fullpath     " Pfad + Dateiname
                                                    user_action       = lv_action ).    " Benutzeraktion

      IF lv_action EQ cl_gui_frontend_services=>action_ok.
        p_fname = lv_fullpath.
      ENDIF.

    CATCH cx_root INTO DATA(e_text).          " Oberklasse für Exceptions abfangen und Kurztext übergeben
      MESSAGE e_text->get_text( ) TYPE 'I'.   " Exception Kurztext ausgeben
  ENDTRY.

Variante 2 (cl_openxml_helper)

DATA(lv_default_filename) = |Excelfile.xlsx|.
DATA(lv_filterpattern) = |Excel-Datei (*.xlsx)\|*.xlsx\|{ cl_gui_frontend_services=>filetype_all }|.

DATA(lv_savefile) = cl_openxml_helper=>browse_local_file_save( iv_title      = 'Datei speichern'
                                                               iv_filename   = lv_default_filename
                                                               iv_extpattern = lv_filterpattern ).

WRITE: / lv_savefile.

[ABAP] OpenFile-Dialog anzeigen

Variante 1 (cl_gui_frontend_services)

PARAMETERS: p_fname TYPE file_table-filename OBLIGATORY.

* wenn die F4-Hilfe für den Dateinamen aufgerufen wird
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_fname.
  
  DATA: lv_rc TYPE i.
  DATA: it_files TYPE filetable.
  DATA: lv_action TYPE i.
    
* File-Tabelle leeren, da hier noch alte Einträge von vorherigen Aufrufen drin stehen können  
  CLEAR it_files.

* FileOpen-Dialog aufrufen
  TRY.
      cl_gui_frontend_services=>file_open_dialog( EXPORTING
                                                    file_filter    = |txt (*.txt)\|*.txt\|{ cl_gui_frontend_services=>filetype_all }|
                                                    multiselection = abap_false
                                                  CHANGING
                                                    file_table  = it_files
                                                    rc          = lv_rc
                                                    user_action = lv_action ).

      IF lv_action = cl_gui_frontend_services=>action_ok.
* wenn Datei ausgewählt wurde
        IF lines( it_files ) > 0.
* ersten Tabelleneintrag lesen
          p_fname = it_files[ 1 ]-filename.
        ENDIF.
      ENDIF.
      
    CATCH cx_root INTO DATA(e_text).
      MESSAGE e_text->get_text( ) TYPE 'I'.
  ENDTRY.

Variante 2 (cl_openxml_helper)

DATA(lv_default_filename) = ||.
DATA(lv_filterpattern) = |Excel-Datei (*.xlsx)\|*.xlsx\|{ cl_gui_frontend_services=>filetype_all }|.

DATA(lv_selected_file) = cl_openxml_helper=>browse_local_file_open( iv_title      = 'Dateiauswahl'
                                                                    iv_filename   = lv_default_filename
                                                                    iv_extpattern = lv_filterpattern ).

WRITE: / lv_selected_file.

Variante 3 (cl_rsan_ut_files)

* F4-Auswahldialog (PopUp) für Auswahl einer Datei auf dem Applikationsserver
PARAMETERS : p_filenm LIKE ibipparms-path OBLIGATORY.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_filenm.

  DATA: lv_canceled TYPE boolean.
  DATA: lv_file_name TYPE string.

  TRY.
      cl_rsan_ut_files=>f4( EXPORTING
                              i_applserv         = abap_true " Dateiauswahl vom Appl.-Server holen, sonst GUI
                              i_title            = 'Dateiauswahl auf dem Applikationsserver'
                              i_gui_extension    = ''
                              i_gui_ext_filter   = ''
                              i_applserv_logical = abap_false
                              i_applserv_al11    = abap_true
                            IMPORTING
                              e_canceled         = lv_canceled
                            CHANGING
                              c_file_name        = lv_file_name ).

      IF lv_canceled NE abap_true.
        p_filenm = lv_file_name.
      ENDIF.
    CATCH cx_root INTO DATA(e_text).
      MESSAGE e_text->get_text( ) TYPE 'I'.
  ENDTRY.

Variante 4 (cl_secxml_helper)

TRY.
    cl_secxml_helper=>file_f4( EXPORTING initial_directory = ''
                                         window_title      = 'Dateiauswahl'
                               IMPORTING filename          = DATA(lv_xfile) ).


  CATCH cx_root INTO DATA(e_txt).
    WRITE: / e_txt->get_text( ).
ENDTRY.

Variante 5 (F4_DXFILENAME_4_DYNP)

* Flexibles Dateiauswahl-Popup für die F4-Suchhilfe
PARAMETERS p_file TYPE dxfile-filename.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.

* F4-Hilfe für Dateien; Aufruf für Dynpro
  CALL FUNCTION 'F4_DXFILENAME_4_DYNP'
    EXPORTING
      dynpfield_filename = 'P_FILE' " Dynprofeld für Rückgabewert
      dyname             = sy-repid
      dynumb             = sy-dynnr
      filetype           = 'P'  " P -> Physical, L -> Logical
      location           = 'A'  " A -> Application Server, P -> Presentation Server
      server             = '?'. " leer -> Default-Anmeldeserver, ? -> Auswahl-Popup für Serverauswahl

Variante 6 (F4_DXFILENAME_TOPRECURSION)

* Auswahldialog für Dateien auf dem Applikationsserver
* siehe auch: cl_rsan_ut_files=>f4( ).
DATA: lv_location_flag TYPE dxfields-location.
DATA: lv_server TYPE msxxlist-name.
DATA: lv_path TYPE dxfields-longpath.
DATA: lv_abend_flag TYPE dxfields-abendflag.

* F4-Hilfe für Dateien
CALL FUNCTION 'F4_DXFILENAME_TOPRECURSION'
  EXPORTING
    i_location_flag       = 'A' " A - Applikationsserver, P - Presentationsserver
    i_server              = '?' " ? - Abfragedialog für Servername anzeigen, ' ' - akt. Anmeldeserver, sonst Servernamen eintragen
    i_path                = '/usr/sap' " Startpfad
  IMPORTING
    o_location_flag       = lv_location_flag
    o_server              = lv_server
    o_path                = lv_path
    abend_flag            = lv_abend_flag
  EXCEPTIONS
    communication_failure = 1
    system_failure        = 2
    rfc_error             = 3.

IF sy-subrc = 0.

  WRITE: / 'Location flag:', lv_location_flag.
  WRITE: / '       Server:', lv_server.
  WRITE: / ' Pfad + Datei:', lv_path.
  WRITE: / '   Abend Flag:', lv_abend_flag.

ENDIF.

Variante 7 (F4_FILENAME – Obsolet)

* Eingabefeld für Dateinamen auf dem Selektionsbild, Eingabe ist Pflicht
PARAMETERS : p_file LIKE ibipparms-path OBLIGATORY.

* wenn die F4-Hilfe für den Dateinamen aufgerufen wird
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
  CLEAR p_file.

* F4 for filename / Filemanager support to locate file in a directory
  CALL FUNCTION 'F4_FILENAME' " File-Dialog aufrufen
    EXPORTING
      field_name = 'P_FILE'
    IMPORTING
      file_name  = p_file.