[ABAP] Beliebige Dateien zu einer Zipdatei hinzufügen

TYPES: BEGIN OF bin_file,                          " Typ für Binärdatei mit Meta-Infos für das Zipfile
         name TYPE string,
         size TYPE i,
         data TYPE solix_tab,
       END OF bin_file.

DATA: lv_filename TYPE string.                     " Dateiname für FileOpen/FileSave
DATA: wa_file TYPE bin_file.                       " Binärdatei mit Meta-Infos für das Zipfile
DATA: it_binfiles TYPE STANDARD TABLE OF bin_file. " unkomprimierter Stream (Tabelle mit Dateien zum Zippen)
DATA: lv_path TYPE string.

START-OF-SELECTION.
* ZIP-Objekt erzeugen
  DATA(o_zip) = NEW cl_abap_zip( ).

  DATA: it_sel_filetab TYPE filetable.
  DATA: ret_code TYPE i.
  DATA: lv_action TYPE i.
* FileOpen-Dialog für Dateiauswahl anzeigen
* Mehrfachselektion möglich
  cl_gui_frontend_services=>file_open_dialog( EXPORTING
                                                window_title   = 'Dateien zum Komprimieren auswählen'
                                                multiselection = abap_true
                                              CHANGING
                                                file_table     = it_sel_filetab
                                                rc             = ret_code    " Anzahl ausgewählte Dateien, -1 bei Fehler
                                                user_action    = lv_action ).

  IF lv_action = cl_gui_frontend_services=>action_ok.

* Ausgewählte Dateien durchgehen
    LOOP AT it_sel_filetab INTO DATA(wa_sel_file).

      WRITE: / |Datei hinzugefügt: { wa_sel_file-filename }|.

* Dateien auf den Appl.-Server hochladen
      cl_gui_frontend_services=>gui_upload( EXPORTING
                                              filename   = |{ wa_sel_file-filename }|
                                              filetype   = 'BIN'
                                            IMPORTING
                                              filelength = wa_file-size
                                            CHANGING
                                              data_tab   = wa_file-data ).

* Pfad + Dateinamen aufsplitten
      CALL FUNCTION 'SO_SPLIT_FILE_AND_PATH'
        EXPORTING
          full_name     = wa_sel_file-filename
        IMPORTING
          file_path     = lv_path
          stripped_name = wa_file-name
        EXCEPTIONS
          x_error       = 1
          OTHERS        = 2.

* Datei zum Stream hinzufügen
      APPEND wa_file TO it_binfiles.

    ENDLOOP.

    ULINE.

    DATA: lv_xstring TYPE xstring.
* unkomprimierte Daten zum Zip-File hinzufügen
    LOOP AT it_binfiles INTO wa_file.

* jeden Datei-Stream binär zu xstring wandeln
      CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
        EXPORTING
          input_length = wa_file-size
        IMPORTING
          buffer       = lv_xstring
        TABLES
          binary_tab   = wa_file-data.

      o_zip->add( name    = wa_file-name
                  content = lv_xstring ).

    ENDLOOP.

* Daten komprimieren
    DATA(lv_zip) = o_zip->save( ).

    DATA: lv_zip_size TYPE i.
    DATA: it_zip_bin_data TYPE STANDARD TABLE OF raw255.

* xstring mit Zip-Daten zu binär rückwandeln
    CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
      EXPORTING
        buffer        = lv_zip
      IMPORTING
        output_length = lv_zip_size
      TABLES
        binary_tab    = it_zip_bin_data.

    DATA: lv_dest_filepath TYPE string.

* SaveFile-Dialog aufrufen
    cl_gui_frontend_services=>file_save_dialog( EXPORTING
                                                  window_title         = 'Zipdatei speichern'
                                                  file_filter          = '(*.zip)|*.zip|'
                                                CHANGING
                                                  filename             = lv_filename
                                                  path                 = lv_path
                                                  fullpath             = lv_dest_filepath ).

* Zipdatei vom Appl-Server auf den lokalen Pfad speichern
    cl_gui_frontend_services=>gui_download( EXPORTING
                                              filename                = lv_dest_filepath
                                              filetype                = 'BIN'
                                              bin_filesize            = lv_zip_size
                                            CHANGING
                                              data_tab                = it_zip_bin_data ).

    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ELSE.
      WRITE: / |Zipdatei erfolgreich unter { lv_dest_filepath } gespeichert.|.
    ENDIF.
  ENDIF.

[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] Angemeldete Benutzer eines Application-Servers auflisten

DATA: it_uinfo TYPE TABLE OF uinfo.
DATA: it_usrinfo TYPE TABLE OF usrinfo.

CALL FUNCTION 'TH_USER_LIST'
  TABLES
    list = it_uinfo       " wenn auskommentiert, dann wird usrlist zurückgegeben, sonst nur list
    usrlist = it_usrinfo.

LOOP AT it_uinfo INTO DATA(wa_uinfo).
  WRITE: / wa_uinfo-tid,
          wa_uinfo-mandt,
          wa_uinfo-bname,
          wa_uinfo-tcode,
          wa_uinfo-term,
          wa_uinfo-zeit,
          wa_uinfo-master,
          wa_uinfo-hostadr,
          wa_uinfo-trace,
          wa_uinfo-extmodi,
          wa_uinfo-intmodi,
          wa_uinfo-type,
          wa_uinfo-stat,
          wa_uinfo-protocol,
          wa_uinfo-guiversion,
          wa_uinfo-rfc_type.
ENDLOOP.

LOOP AT it_usrinfo INTO DATA(wa_usrinfo).
  WRITE: / wa_usrinfo-tid,
          wa_usrinfo-mandt,
          wa_usrinfo-bname,
          wa_usrinfo-tcode,
          wa_usrinfo-term,
          wa_usrinfo-zeit,
          wa_usrinfo-master,
          wa_usrinfo-trace,
          wa_usrinfo-extmodi,
          wa_usrinfo-intmodi,
          wa_usrinfo-type,
          wa_usrinfo-stat,
          wa_usrinfo-protocol,
          wa_usrinfo-guiversion,
          wa_usrinfo-rfc_type,
          wa_usrinfo-hostaddr.
ENDLOOP.

[ABAP] Popup zur Auswahl von Monat und Jahr anzeigen

DATA: lv_actmonth TYPE isellist-month.
DATA: lv_sel_month TYPE isellist-month.
DATA: lv_subrc TYPE sy-subrc.
  
lv_actmonth = |{ 2016 }{ 06 }|. " Eingabemonat: 06/2016

CALL FUNCTION 'POPUP_TO_SELECT_MONTH'
  EXPORTING
    actual_month               = lv_actmonth
*     factory_calendar           = 'X'
*     holiday_calendar           = 'X'
    language                   = sy-langu
    start_column               = 8
    start_row                  = 5
  IMPORTING
    selected_month             = lv_sel_month
    return_code                = lv_subrc
  EXCEPTIONS
    factory_calendar_not_found = 1
    holiday_calendar_not_found = 2
    month_not_found            = 3
    OTHERS                     = 4.
    
IF sy-subrc NE 0.
  MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
  IF lv_subrc EQ 0.
    " ...
  ENDIF.
ENDIF.

[ABAP] Tag, Monat, Jahr zu Datumswert zusammenfügen

DATA: lv_date TYPE sy-datum.
DATA: lv_i_day TYPE cms_dte_oms_day.
DATA: lv_i_month TYPE cms_dte_oms_month.
DATA: lv_i_year TYPE cms_dte_oms_year.

lv_i_day = 01.
lv_i_month = 06.
lv_i_year = 2016.

CALL FUNCTION 'CMS_API_GENERAL_DDMMYY_TO_DATE'
  EXPORTING
    i_day   = lv_i_day
    i_month = lv_i_month
    i_year  = lv_i_year
  IMPORTING
    e_date  = lv_date.