[ABAP] Dateien eines Verzeichnises auf dem Applikationsserver auflisten

Variante 1 (EPS2_GET_DIRECTORY_LISTING)

PARAMETERS: p_fdir TYPE eps2filnam DEFAULT '/usr/sap/tmp'.
PARAMETERS: p_mask TYPE eps2filnam DEFAULT '*.xml'.

START-OF-SELECTION.

  DATA: it_files TYPE STANDARD TABLE OF eps2fili WITH DEFAULT KEY.

  DATA: lv_dir_name TYPE epsf-epsdirnam.
  DATA: lv_file_counter TYPE epsf-epsfilsiz.
  DATA: lv_error_counter TYPE epsf-epsfilsiz.

* Alle Dateien im Verzeichnis lesen
* file_mask ist fehlerhaft implementiert, daher muss im Nachgang manuell gefiltert werden, s.u.
  CALL FUNCTION 'EPS2_GET_DIRECTORY_LISTING'
    EXPORTING
      iv_dir_name            = p_fdir
*     file_mask              = ''
    IMPORTING
      dir_name               = lv_dir_name
      file_counter           = lv_file_counter
      error_counter          = lv_error_counter
    TABLES
      dir_list               = it_files
    EXCEPTIONS
      invalid_eps_subdir     = 1
      sapgparam_failed       = 2
      build_directory_failed = 3
      no_authorization       = 4
      read_directory_failed  = 5
      too_many_read_errors   = 6
      empty_directory_list   = 7
      OTHERS                 = 8.

  IF sy-subrc = 0.
    WRITE: / lv_dir_name, lv_file_counter, lv_error_counter.

* Dateiliste Filtern
    DELETE it_files WHERE NOT name CP p_mask.

    LOOP AT it_files ASSIGNING FIELD-SYMBOL(<f>).
      WRITE: / <f>-name, <f>-size, <f>-mtim, <f>-owner, <f>-rc.
    ENDLOOP.
  ENDIF.

Variante 2 (EPS_GET_DIRECTORY_LISTING)

* nicht mehr Verwenden, da Übergabeparameter zu kurze Datentypen haben

[ABAP] PopUp-Fenster für Datumsauswahl (Kalender) anzeigen

Variante 1 (Monatskalender, Monat und Jahr wählbar)

DATA: lv_dat TYPE sy-datum.
  
CALL FUNCTION 'F4_DATE'
  IMPORTING
    select_date                  = lv_dat
  EXCEPTIONS
    calendar_buffer_not_loadable = 1
    date_after_range             = 2
    date_before_range            = 3
    date_invalid                 = 4
    factory_calendar_not_found   = 5
    holiday_calendar_not_found   = 6
    parameter_conflict           = 7
    OTHERS                       = 8.

Variante 2 (Jahreskalender, scrollbar)

DATA: lv_dat TYPE sy-datum.
  
CALL FUNCTION 'POPUP_CALENDAR_SDB'
  EXPORTING
    sel_day    = abap_true
    focus_day  = sy-datum
  IMPORTING
    begin_date = lv_dat.

[ABAP] Datei vom Applikationsserver binär lesen

Variante 1 (xstring)

* Dateiinhalt (Binärdatenstrom) als xstring
DATA: lv_bytes_xstr TYPE xstring.
* Pfad + Dateiname auf dem Appl.-Server
DATA(lv_file) = '/usr/sap/tmp/file.bin'.

TRY.
* Datei zum binären Lesen öffnen
    OPEN DATASET lv_file FOR INPUT IN BINARY MODE.
    IF sy-subrc = 0.
* Daten bis Dateiende lesen
      READ DATASET lv_file INTO lv_bytes_xstr.

      IF sy-subrc = 0.
        WRITE: / xstrlen( lv_bytes_xstr ), 'bytes gelesen.'.
      ELSE.
        WRITE: / 'Fehler beim Lesen.'.
      ENDIF.

* Datei schließen
      CLOSE DATASET lv_file.
    ELSE.
      WRITE: / 'Konnte Datei nicht öffnen:', lv_file.
    ENDIF.

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

Variante 2 (byteweises Lesen in itab)

DATA: lv_byte TYPE x LENGTH 1.          " ein byte
DATA: it_file TYPE STANDARD TABLE OF x. " iTab mit Dateidaten
* Pfad + Dateiname auf dem Appl.-Server
DATA(lv_file) = '/usr/sap/tmp/file.bin'.

TRY.
* Datei zum binären Lesen öffnen
    OPEN DATASET lv_file FOR INPUT IN BINARY MODE.
    IF sy-subrc = 0.
* Daten bis Dateiende lesen
      DO.
* byteweise lesen
        READ DATASET lv_file INTO lv_byte.

        IF sy-subrc = 0.
* bytes an iTab anhängen, iTab kann anderweitig heruntergeladen werden
* z.B. mit cl_gui_frontend_services=>gui_download
          APPEND lv_byte TO it_file.
        ELSE.
          EXIT.
        ENDIF.
      ENDDO.

* Datei schließen
      CLOSE DATASET lv_file.
    ELSE.
      WRITE: / 'Konnte Datei nicht öffnen:', lv_file.
    ENDIF.

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

[ABAP] URL im SAP-Browser als PopUp-Fenster anzeigen

Beispiel 1

cl_abap_browser=>show_url( url          = 'www.google.de'
                           title        = 'ABAP-Browser'
                           size         = cl_abap_browser=>large
                           modal        = abap_true
                           printing     = abap_false
                           buttons      = abap_true
                           format       = cl_abap_browser=>landscape
                           position     = cl_abap_browser=>topleft
                           context_menu = abap_false ).

Beispiel 2

* HTML-Code generieren lassen
SELECT * FROM tnapr INTO TABLE @DATA(it_tnapr).
DATA(lv_html) = cl_demo_output=>get( it_tnapr ).

* HTML-Code anzeigen
cl_abap_browser=>show_html( html_string  = lv_html
                            size         = cl_abap_browser=>xlarge
                            format       = cl_abap_browser=>landscape
                            context_menu = abap_true
                            buttons       = cl_abap_browser=>navigate_html ).

[ABAP] RegEx – String auf White-Spaces testen

DATA: lv_txt TYPE string.
  
lv_txt = ...

* White-Spaces:
* - space
* - tab (\t)
* - carriage-return (\r)
* - newline (\n)
* - form-feed (\f)
IF abap_true = cl_abap_matcher=>create( pattern = '^\s*$'
                                        text = lv_txt
                                        ignore_case = abap_true )->match( ).
                                                    
  WRITE: / 'Der String besteht nur aus 0..n White-Spaces. Er ist im Grunde leer.'.
ELSE.
  WRITE: / 'Im String besteht nicht nur aus White-Spaces.'.
ENDIF.

[ABAP] Transienter Code / Dynamisch ABAP-Code generieren und ausführen

DATA: progname TYPE program.
DATA: msg TYPE string.
DATA: lin TYPE i.
DATA: wrd TYPE string.
DATA: off TYPE i.
DATA: mid TYPE trmsg_key.
DATA: sid TYPE string.

DATA(it_code) = VALUE stringtab( ( |PROGRAM SUBPOOL.| )
                                 ( |CLASS main DEFINITION.| )
                                 ( |  PUBLIC SECTION.| )
                                 ( |    CLASS-METHODS show| )
                                 ( |      IMPORTING| )
                                 ( |        i_txt TYPE string| )
                                 ( |      RETURNING VALUE(ret_val) TYPE string.| )
                                 ( |ENDCLASS.| )
                                 ( |CLASS main IMPLEMENTATION.| )
                                 ( |  METHOD show.| )
                                 ( |    WRITE: / i_txt.| )
                                 ( |    ret_val = \|\{ i_txt \} - Return value.\|.| )
                                 ( |  ENDMETHOD.| )
                                 ( |ENDCLASS.| ) ).

* Subroutinen-Pool im ABAP-Speicher des akt. Programms erzeugen
* it_code wird übergeben, Programmname wird temporär vom System vergeben
GENERATE SUBROUTINE POOL it_code NAME progname MESSAGE msg LINE lin WORD wrd OFFSET off MESSAGE-ID mid SHORTDUMP-ID sid.

CASE sy-subrc.
  WHEN 0. " ok
    TRY.
* dynamischen Klassennamen ermitteln
        DATA(lv_class) = |\\PROGRAM={ progname }\\CLASS=MAIN|.
        DATA: ret TYPE string.

        WRITE: / 'Programm:', progname.
        WRITE: / 'Class:', lv_class.
        SKIP.

* statischer Methodenaufruf
        CALL METHOD (lv_class)=>show
          EXPORTING
            i_txt   = 'Static call'
          RECEIVING
            ret_val = ret.

        WRITE: / ret.

* dynamischer Methodenaufruf
        DATA o_ref TYPE REF TO object.
        CREATE OBJECT o_ref TYPE (lv_class).
        CALL METHOD o_ref->('SHOW')
          EXPORTING
            i_txt   = 'Dynamic call'
          RECEIVING
            ret_val = ret.

        WRITE: / ret.

      CATCH cx_root INTO DATA(e_text).
        MESSAGE e_text->get_text( ) TYPE 'I'.
    ENDTRY.

  WHEN 4. " Syntaxfehler
    WRITE: / msg.
  WHEN 8. " Laufzeitfehler
    WRITE: / sid.
  WHEN OTHERS.
    MESSAGE 'Unbekannter Fehler.' TYPE 'I'.
ENDCASE.

Weiterführende Infos: Link

[ABAP] Textdatei auf den Appl.-Server schreiben

DATA: it_file_content TYPE rsanm_file_table.
DATA: lv_file TYPE string VALUE '/usr/sap/trans/EPS/SAL/Test1.txt'.
DATA: lv_lines_written TYPE i.

it_file_content = value #( ( |Testtext 1| )
                           ( |Testtext 2| )
                           ( |Testtext 3| ) ).

TRY.
  cl_rsan_ut_appserv_file_writer=>appserver_file_write( EXPORTING
                                                          i_filename = lv_file
                                                          i_data_tab = it_file_content
                                                          i_overwrite = abap_true       " abap_false -> append, abap_true -> overwrite
                                                        IMPORTING
                                                          e_lines_written = lv_lines_written ).

  WRITE: / 'Lines written: ', lv_lines_written.

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

[ABAP] Textdatei vom Appl.-Server lesen

DATA: it_file_content TYPE rsanm_file_table.
DATA: lv_file TYPE string VALUE '/usr/sap/Test.txt'.

TRY.
    cl_rsan_ut_appserv_file_reader=>appserver_file_read( EXPORTING
                                                           i_filename = lv_file
                                                         CHANGING
                                                           c_data_tab = it_file_content ).

    LOOP AT it_file_content ASSIGNING FIELD-SYMBOL(<fs_line>).
      WRITE: / <fs_line>.
    ENDLOOP.

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