[ABAP] Excel-Daten mit XCO API (xco_cp_xlsx) lesen

TYPES: BEGIN OF ty_xl_sheet,
         col1 TYPE string,
         col2 TYPE string,
         col3 TYPE string,
       END OF ty_xl_sheet.

TYPES: ty_it_users TYPE STANDARD TABLE OF ty_xl_sheet WITH DEFAULT KEY.

TRY.

    DATA: lv_rc TYPE i.
    DATA: it_files TYPE filetable.
    DATA: lv_action TYPE i.

* FileOpen-Dialog aufrufen
    cl_gui_frontend_services=>file_open_dialog( EXPORTING file_filter = |xlsx (*.xlsx)\|*.xlsx\|{ cl_gui_frontend_services=>filetype_all }|
                                                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
        DATA: lv_filesize TYPE w3param-cont_len.
        DATA: lv_filetype TYPE w3param-cont_type.
        DATA: it_bin_data TYPE w3mimetabtype.

* Excel-Datei auf Appl. Server hochladen (binary)
        cl_gui_frontend_services=>gui_upload( EXPORTING filename   = |{ it_files[ 1 ]-filename }|
                                                        filetype   = 'BIN'
                                              IMPORTING filelength = lv_filesize
                                              CHANGING  data_tab   = it_bin_data ).

* solix -> xstring
        DATA(lv_xsts_xlsx) = cl_bcs_convert=>solix_to_xstring( it_solix = it_bin_data ).

* Excel-Dokument
        DATA(o_xl) = xco_cp_xlsx=>document->for_file_content( lv_xsts_xlsx )->read_access( ).

* Sheet
        DATA(o_sheet) = o_xl->get_workbook( )->worksheet->at_position( 1 ).

        IF abap_true = o_sheet->exists( ).

* komplette Sheet auswählen
          DATA(o_sel_pattern) = xco_cp_xlsx_selection=>pattern_builder->simple_from_to( )->get_pattern( ).

          DATA: it_sheet_data TYPE ty_it_users.

* Daten aus Sheet als Strings in interne Tabelle schreiben
          DATA(o_result) = o_sheet->select( o_sel_pattern
                                          )->row_stream(
                                          )->operation->write_to( REF #( it_sheet_data )
                                          )->set_value_transformation( xco_cp_xlsx_read_access=>value_transformation->string_value
                                          )->execute( ).

          IF abap_true = o_result->succeeded.
* Datenausgabe
            cl_demo_output=>write_data( it_sheet_data ).

*             HTML-Code vom Demo-Output holen
            DATA(lv_html) = cl_demo_output=>get( ).

*             Daten im Inline-Browser im SAP-Fenster anzeigen
            cl_abap_browser=>show_html( EXPORTING title       = 'Excel'
                                                  html_string = lv_html
                                                  container   = cl_gui_container=>default_screen ).

*             cl_gui_container=>default_screen erzwingen
            WRITE: space.
          ENDIF.

        ELSE.

* Fehlerbehandlung
          LOOP AT o_result->messages INTO DATA(o_msg).
            WRITE: / o_msg->get_text( ).
          ENDLOOP.

        ENDIF.
      ENDIF.
    ENDIF.

  CATCH cx_root INTO DATA(e_text).
    MESSAGE e_text->get_text( ) TYPE 'S' DISPLAY LIKE 'E'.
ENDTRY.

Links

[ABAP] Daten einer internen Tabelle als Excel-Datei speichern (xco_cp_xlsx)

TYPES: BEGIN OF ty_xl_sheet,
         col1 TYPE string,
         col2 TYPE string,
         col3 TYPE string,
       END OF ty_xl_sheet.

TYPES: ty_it_users TYPE STANDARD TABLE OF ty_xl_sheet WITH DEFAULT KEY.

TRY.
* leeres Excel-Dokument
    DATA(o_xl) = xco_cp_xlsx=>document->empty( )->write_access( ).

* 1. Sheet holen
    DATA(o_sheet) = o_xl->get_workbook( )->worksheet->at_position( 1 ).

    IF abap_true = o_sheet->exists( ).

* neuen Namen für Sheet setzen
      o_sheet->set_name( 'Test1' ).

* Daten
      DATA(it_sheet_data) = VALUE ty_it_users( ( col1 = 'Name' col2 = 'Adr.' col3 = 'Age' )
                                               ( col1 = 'Ulf'  col2 = 'Str. 1' col3 = '22' )
                                               ( col1 = 'Ida'  col2 = 'Str. 2' col3 = '21' ) ).

* komplette Sheet auswählen
      DATA(o_sel_pattern) = xco_cp_xlsx_selection=>pattern_builder->simple_from_to( )->get_pattern( ).

* Daten einfügen
      DATA(o_result) = o_sheet->select( o_sel_pattern
                                      )->row_stream(
                                      )->operation->write_from( REF #( it_sheet_data )
                                      )->execute( ).

      IF abap_true = o_result->succeeded.
* Daten als XSTRING (Excel-Datei holen)
        DATA(lv_xl_xtsr) = o_xl->get_file_content( ).

* xstring -> itab (bytes)
        DATA: lv_size TYPE i.
        DATA: it_raw_data TYPE xml_rawdata.

* xstring (Bytes) -> RAW (iTab)
        cl_scp_change_db=>xstr_to_xtab( EXPORTING im_xstring = lv_xl_xtsr
                                        IMPORTING ex_size    = lv_size
                                                  ex_xtab    = it_raw_data ).

        IF lines( it_raw_data ) > 0.
          DATA: lv_action TYPE i.
          DATA: lv_filename TYPE string.
          DATA: lv_fullpath TYPE string.
          DATA: lv_path TYPE string.

* SaveDialog aufrufen
          cl_gui_frontend_services=>file_save_dialog( EXPORTING default_extension   = 'xlsx'
                                                                default_file_name   = 'export.xlsx'
                                                                file_filter         = |Excel-Datei (*.xlsx)\|*.xlsx\|{ cl_gui_frontend_services=>filetype_all }|
                                                                prompt_on_overwrite = abap_true
                                                      CHANGING  filename            = lv_filename
                                                                path                = lv_path
                                                                fullpath            = lv_fullpath
                                                                user_action         = lv_action ).

          IF lv_action EQ cl_gui_frontend_services=>action_ok.
* iTab (bytes) -> lokale Datei
            cl_gui_frontend_services=>gui_download( EXPORTING filename     = lv_fullpath
                                                              filetype     = 'BIN'
                                                              bin_filesize = lv_size " Size ist wichtig für das korrekte Schreiben der Excel-Datei
                                                    CHANGING  data_tab     = it_raw_data ).
* lokale Datei im Excel aufrufen
* parameter muss wegen möglicher Leerzeichen im Pfad mit "" quotiert werden
            cl_gui_frontend_services=>execute( application = 'excel.exe'
                                               parameter   = |"{ lv_fullpath }"| ).
          ENDIF.

        ELSE.

* Fehlerbehandlung
          LOOP AT o_result->messages INTO DATA(o_msg).
            WRITE: / o_msg->get_text( ).
          ENDLOOP.

        ENDIF.
      ENDIF.
    ENDIF.

  CATCH cx_root INTO DATA(e_text).
    MESSAGE e_text->get_text( ) TYPE 'S' DISPLAY LIKE 'E'.
ENDTRY.

Links

[ABAP] ABAP2XLSX: CSV-Datei schreiben

TRY.
* Daten holen
    SELECT * FROM sflight INTO TABLE @DATA(it_sflight).

* ABAP2XLSX-Objekt
    DATA: o_xl TYPE REF TO zcl_excel.

* Converter itab->ABAP2XLSX
    DATA(o_xl_conv) = NEW zcl_excel_converter( ).
    o_xl_conv->convert( EXPORTING it_table = it_sflight
                        CHANGING  co_excel = o_xl ).

* CSV-Writer-Objekt erzeugen
    DATA(o_csv) = NEW zcl_excel_writer_csv( ).
    o_csv->set_delimiter( ip_value = ';' ).
    o_csv->set_enclosure( ip_value = '''' ).
    o_csv->set_endofline( ip_value = cl_abap_char_utilities=>cr_lf ).
    o_csv->set_active_sheet_index( i_active_worksheet = 1 ).

* Excel-Writer-Objekt erzeugen
    DATA(o_writer) = CAST zif_excel_writer( o_csv ).
* Excel-Writer-Objekt->xstring
    DATA(lv_xstr) = o_writer->write_file( o_xl ).

* xstring -> solix
    DATA(it_solix_data) = cl_bcs_convert=>xstring_to_solix( iv_xstring = lv_xstr ).

* CSV-Daten lokal speichern (binär übertragen)
    cl_gui_frontend_services=>gui_download( EXPORTING filename     = 'Test.csv'
                                                      filetype     = 'BIN'
                                                      bin_filesize = xstrlen( lv_xstr )
                                            CHANGING  data_tab     = it_solix_data ).

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

[ABAP] ABAP2XLSX: XLSX-Datei schreiben

TRY.
* Daten holen
    SELECT * FROM sflight INTO TABLE @DATA(it_sflight).

* ABAP2XLSX-Objekt
    DATA: o_xl TYPE REF TO zcl_excel.

* Converter itab->ABAP2XLSX
    DATA(o_xl_conv) = NEW zcl_excel_converter( ).
    o_xl_conv->convert( EXPORTING it_table = it_sflight
                        CHANGING  co_excel = o_xl ).

* XLSX-Writer-Objekt erzeugen
    DATA(o_writer) = CAST zif_excel_writer( NEW zcl_excel_writer_huge_file( ) ).

* Excel-Writer-Objekt->xstring
    DATA(lv_xstr) = o_writer->write_file( o_xl ).

* xstring -> solix
    DATA(it_solix_data) = cl_bcs_convert=>xstring_to_solix( iv_xstring = lv_xstr ).

* CSV Daten lokal speichern (binär übertragen)
    cl_gui_frontend_services=>gui_download( EXPORTING filename     = 'Test.xlsx'
                                                      filetype     = 'BIN'
                                                      bin_filesize = xstrlen( lv_xstr )
                                            CHANGING  data_tab     = it_solix_data ).

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

[ABAP] SAP-Workdir ermitteln

Variante 1 (cl_gui_frontend_services)

PARAMETERS: p_path TYPE string OBLIGATORY LOWER CASE.

INITIALIZATION.

TRY.
  cl_gui_frontend_services=>get_sapgui_workdir( CHANGING sapworkdir = p_path ).

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

Variante 2 (IW_C_GET_SAPWORKDIR)

DATA: lvsapworkdir TYPE sdok_chtrd.
DATA: lverror_msg	TYPE iwerrormsg.

* SAP Workdir aus der Registry bestimmen (Temporär)
CALL FUNCTION 'IW_C_GET_SAPWORKDIR'
  IMPORTING
    sapworkdir = lvsapworkdir
    error_msg  = lverror_msg.

WRITE: / lvsapworkdir.
WRITE: / lverror_msg.

[ABAP] Datei-Upload

Variante 1 (cl_gui_frontend_services)

DATA: lv_rc TYPE i.
DATA: it_files TYPE filetable.
DATA: lv_action TYPE i.

* FileOpen-Dialog aufrufen
TRY.
        cl_gui_frontend_services=>file_open_dialog( EXPORTING file_filter    = |pdf (*.pdf)\|*.pdf\|{ 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
        DATA(lv_filename) = it_files[ 1 ]-filename.

        DATA: lv_filesize TYPE i.
        DATA: it_bin_data TYPE STANDARD TABLE OF raw255.

* Bild auf Appl. Server hochladen (binary)
        cl_gui_frontend_services=>gui_upload( EXPORTING filename   = |{ lv_filename }|
														filetype   = 'BIN'
										      IMPORTING filelength = lv_filesize
										      CHANGING  data_tab   = it_bin_data ).														

        DATA: lv_xstr TYPE xstring.

* RAW (binary) nach xstring
        CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
          EXPORTING
            input_length = lv_filesize
          IMPORTING
            buffer       = lv_xstr
          TABLES
            binary_tab   = it_bin_data
          EXCEPTIONS
            failed       = 1
            OTHERS       = 2.

        ...
      ENDIF.
    ENDIF.

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

Variante 2 (cl_secxml_helper)

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


    IF lv_xfile IS NOT INITIAL.
      cl_secxml_helper=>upload_file( EXPORTING filename = lv_xfile
                                     IMPORTING bindata  = DATA(lv_data_xstr) ).
      
      ...
    ENDIF.

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

[ABAP] Datei-Download

Variante 1 (cl_gui_frontend_services)

TRY.
* beliebiger Stream
    DATA: lv_xdata TYPE xstring.
    
    ...
    
* xstring -> solix
    DATA(it_solix_data) = cl_bcs_convert=>xstring_to_solix( iv_xstring = lv_xdata ).

* Daten lokal speichern
    cl_gui_frontend_services=>gui_download( EXPORTING
                                              filename     = |Bild.png|
                                              filetype     = 'BIN'
                                              bin_filesize = xstrlen( lv_xdata )
                                            CHANGING
                                              data_tab     = it_solix_data ).
CATCH cx_root INTO DATA(e_txt).
  WRITE: / e_txt->get_text( ).
ENDTRY.

Variante 2 (cl_gui_frontend_services)

* Inhalt einer internen Tabelle als Datei (CSV) auf den lokalen Rechner speichern:
* http://help.sap.com/saphelp_nw70ehp2/helpdata/de/c7/5ab8ec178c44a8aacd1dcac3460db8/content.htm  

* CSV-Daten
DATA: itab TYPE STANDARD TABLE OF string.
* Dateipfad + Dateiname
DATA: lv_file TYPE string VALUE 'c:\temp\test.txt'.

...

TRY.
  cl_gui_frontend_services=>gui_download( EXPORTING
                                            filename = lv_file
                                            filetype = 'DAT'  " mögliche Filetypen: BIN, ASC, DAT, DBF, WK1, VSS, IBM
                                            codepage = '4110' " UTF-8 Encoding: 4110, UTF-16 Big Endian : 4102, UTF-16 Little Endian : 4103.
                                          CHANGING
                                            data_tab = itab ).
      
    WRITE: / |Datei erfolgreich unter { lv_file } gespeichert.|.
  CATCH cx_root INTO DATA(e_text).
    MESSAGE e_text->get_text( ) TYPE 'I'.
ENDTRY.

Variante 3 (cl_secxml_helper)

TRY.
* Daten als Stream
    DATA: lv_xdata TYPE xstring.

    ...

* File lokal speichern auf dem Frontend
    cl_secxml_helper=>save_file( EXPORTING default_file_name = ''
                                           initial_directory = ''
                                           window_title      = 'Datei speichern'
                                           bindata           = lv_xdata ).
  CATCH cx_root INTO DATA(e_txt).
    WRITE: / e_txt->get_text( ).
ENDTRY.

[ABAP] DMS: Dateien an Dokumenteninfosätze anhängen (CVAPI_DOC_CREATE)

TYPES: BEGIN OF bin_file,
         name TYPE string,
         size TYPE i,
         data TYPE solix_tab,
       END OF bin_file.

* Dokumentart (TA DC10, Tabelle TDWA)
PARAMETERS: p_type TYPE bapi_doc_aux-doctype OBLIGATORY.
* Teildokument
PARAMETERS: p_part TYPE bapi_doc_aux-docpart OBLIGATORY DEFAULT '000'.
* Dokumentversion
PARAMETERS: p_ver TYPE bapi_doc_aux-docversion OBLIGATORY DEFAULT '00'.
* Beschreibung
PARAMETERS: p_desc TYPE bapi_doc_drat-description DEFAULT 'Test 123'.
* Ablagekategorie (TA OACT, Tabelle SDOKSTCAE, View V_SDOKSTCA)
PARAMETERS: p_stor TYPE bapi_doc_files2-storagecategory OBLIGATORY.
* Logisches Dokument/Workstation Application (TA S_ALR_87008829, Tabelle TDWP, Bild -> JPG)
PARAMETERS: p_appl TYPE bapi_doc_files2-application_id OBLIGATORY DEFAULT 'JPG'.
* Objekttyp (Material -> MARA)
PARAMETERS: p_otype TYPE bapi_doc_drad-objecttype OBLIGATORY DEFAULT 'MARA'.
* Objektkey (Material -> MATNR)
PARAMETERS: p_okey TYPE bapi_doc_drad-objectkey OBLIGATORY DEFAULT '000000001122334455'.

START-OF-SELECTION.
  TRY.
      DATA: lv_rc TYPE i.
      DATA: it_files TYPE filetable.
      DATA: lv_action TYPE i.

* FileOpen-Dialog aufrufen
      cl_gui_frontend_services=>file_open_dialog( EXPORTING file_filter = |jpg (*.jpg)\|*.jpg\|{ cl_gui_frontend_services=>filetype_all }|
                                                  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.
* Dateien auf den Appl.-Server hochladen
          DATA: lv_file TYPE bin_file.
          cl_gui_frontend_services=>gui_upload( EXPORTING filename   = CONV #( it_files[ 1 ]-filename )
                                                          filetype   = 'BIN'
                                                IMPORTING filelength = lv_file-size
                                                CHANGING  data_tab   = lv_file-data ).

          DATA: lv_xstring TYPE xstring.

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

* Dokumentinformationssatz
          DATA(lv_draw) = VALUE draw(
                                      dokar = p_type
                                      doktl = p_part
                                      dokvr = p_ver
                                    ).

* DVS: Steuerung für APIS
          DATA(lv_api_control) = VALUE cvapi_api_control(
                                                            no_update_task = abap_true
                                                        ).

* Kurztexte für Dokuinfosätze
          DATA: it_drat TYPE STANDARD TABLE OF dms_db_drat WITH DEFAULT KEY.
          it_drat = VALUE #( (
                                langu = sy-langu
                                dktxt = p_desc
                             )
                           ).

* Verknüpfung Dokument-Objekt
          DATA: it_drad TYPE STANDARD TABLE OF dms_db_drad WITH DEFAULT KEY.

          it_drad = VALUE #( (
                               dokob = p_otype
                               objky = p_okey
                             )
                           ).

* Originale für Dokumente (Dateianhang)
          DATA: it_bin_content TYPE STANDARD TABLE OF drao WITH DEFAULT KEY.

          DATA: lv_data_length TYPE i.
          DATA: it_content_raw TYPE STANDARD TABLE OF orblk WITH DEFAULT KEY.

* xstring --> ORBLK (Binärformat mit Zeilenlänge 2550 Bytes)
          CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
            EXPORTING
              buffer        = lv_xstring
            IMPORTING
              output_length = lv_data_length
            TABLES
              binary_tab    = it_content_raw.

* Datenaufbereitung
          LOOP AT it_content_raw ASSIGNING FIELD-SYMBOL(<raw>).

            APPEND VALUE #(
                            zaehl = sy-tabix
                            appnr = '1'
                            dokar = p_type
                            orln  = lv_data_length
*                            orbkl = 2550
                            orblk = <raw>
                          ) TO it_bin_content.
          ENDLOOP.

* DVS: Originale zu einem Dokument
          DATA: it_doc_files TYPE STANDARD TABLE OF cvapi_doc_file WITH DEFAULT KEY.

          it_doc_files = VALUE #( ( updateflag  = 'I'
                                    appnr       = '1'
                                    dappl       = p_appl
                                    filename    = it_files[ 1 ]-filename
                                    storage_cat = p_stor
                                    description = p_desc ) ).

          DATA(lv_message) = VALUE messages( ).
          DATA(lv_pfx_dokar) = VALUE draw-dokar( ).
          DATA(lv_pfx_doknr) = VALUE draw-doknr( ).
          DATA(lv_pfx_dokvr) = VALUE draw-dokvr( ).
          DATA(lv_pfx_doktl) = VALUE draw-doktl( ).

* DVS: Dokument anlegen
          CALL FUNCTION 'CVAPI_DOC_CREATE'
            EXPORTING
              ps_draw            = lv_draw
              ps_api_control     = lv_api_control
              pf_content_provide = 'TBL' " Binärdaten des Files als Tabelle übergeben
            IMPORTING
              psx_message        = lv_message
              pfx_dokar          = lv_pfx_dokar
              pfx_doknr          = lv_pfx_doknr
              pfx_dokvr          = lv_pfx_dokvr
              pfx_doktl          = lv_pfx_doktl
            TABLES
              pt_drad_x          = it_drad
              pt_drat_x          = it_drat
              pt_files_x         = it_doc_files
              pt_content         = it_bin_content.

          IF lv_message-msg_type CA 'EA'.
* Rollback bei Fehler
            CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
          ELSE.
* Daten verbuchen
            CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
              EXPORTING
                wait = abap_true.

            cl_demo_output=>write_data( lv_message ).
            cl_demo_output=>write_data( lv_pfx_dokar ).
            cl_demo_output=>write_data( lv_pfx_doknr ).
            cl_demo_output=>write_data( lv_pfx_dokvr ).
            cl_demo_output=>write_data( lv_pfx_doktl ).

* HTML-Code vom Demo-Output holen
            DATA(lv_html) = cl_demo_output=>get( ).

* Daten im Inline-Browser im SAP-Fenster anzeigen
            cl_abap_browser=>show_html( EXPORTING title       = 'CVAPI_DOC_CREATE'
                                                  html_string = lv_html
                                                  container   = cl_gui_container=>default_screen ).

* cl_gui_container=>default_screen erzwingen
            WRITE: space.
          ENDIF.
        ENDIF.
      ENDIF.
    CATCH cx_root INTO DATA(e_text).
      MESSAGE e_text->get_text( ) TYPE 'S' DISPLAY LIKE 'E'.
  ENDTRY.

[ABAP] DMS: Dateien an Dokumenteninfosätze anhängen (BAPI_DOCUMENT_CREATE2)

* Dokumentart (TA DC10, Tabelle TDWA)
PARAMETERS: p_dtype TYPE bapi_doc_aux-doctype OBLIGATORY.
* Teildokument
PARAMETERS: p_dpart TYPE bapi_doc_aux-docpart OBLIGATORY DEFAULT '000'.
* Dokumentversion
PARAMETERS: p_dver TYPE bapi_doc_aux-docversion OBLIGATORY DEFAULT '00'.
* Beschreibung
PARAMETERS: p_desc TYPE bapi_doc_drat-description DEFAULT 'Test 123'.
* Ablagekategorie (TA OACT, Tabelle SDOKSTCAE, View V_SDOKSTCA)
PARAMETERS: p_stor TYPE bapi_doc_files2-storagecategory OBLIGATORY.
* Logisches Dokument/Workstation Application (TA S_ALR_87008829, Tabelle TDWP, Bild -> JPG)
PARAMETERS: p_appl TYPE bapi_doc_files2-application_id OBLIGATORY DEFAULT 'JPG'.
* Objekttyp (Material -> MARA)
PARAMETERS: p_otype TYPE bapi_doc_drad-objecttype OBLIGATORY DEFAULT 'MARA'.
* Objektkey (Material -> MATNR)
PARAMETERS: p_okey TYPE bapi_doc_drad-objectkey OBLIGATORY DEFAULT '000000001122334455'.

START-OF-SELECTION.

  TRY.
      DATA: lv_rc TYPE i.
      DATA: it_files TYPE filetable.
      DATA: lv_action TYPE i.

* FileOpen-Dialog aufrufen
      cl_gui_frontend_services=>file_open_dialog( EXPORTING file_filter = |jpg (*.jpg)\|*.jpg\|{ cl_gui_frontend_services=>filetype_all }|
                                                  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.

          DATA(lv_bapi_doc_draw2) = VALUE bapi_doc_draw2(
                                                          documenttype    = p_dtype
                                                          documentversion = p_dver
                                                          documentpart    = p_dpart
                                                        ).

          DATA: lv_documenttype TYPE bapi_doc_aux-doctype.
          DATA: lv_documentnumber TYPE bapi_doc_aux-docnumber.
          DATA: lv_documentpart TYPE bapi_doc_aux-docpart.
          DATA: lv_documentversion TYPE bapi_doc_aux-docversion.
          DATA: lv_return TYPE bapiret2.

          DATA: it_documentdescriptions TYPE STANDARD TABLE OF bapi_doc_drat WITH DEFAULT KEY.
          it_documentdescriptions = VALUE #( (
                                                description  = p_desc
                                                language     = 'D'
                                                language_iso = 'DE'
                                             )
                                           ).

          DATA: it_documentfiles TYPE STANDARD TABLE OF bapi_doc_files2 WITH DEFAULT KEY.

          it_documentfiles = VALUE #( (
                                        originaltype      = '1'
*                                        sourcedatacarrier = 'SAP-SYSTEM' " oder 'DEFAULT'
                                        created_by        = sy-uname
                                        storagecategory   = p_stor
                                        docfile           = it_files[ 1 ]-filename
                                        wsapplication     = p_appl
*                                        checkedin         = abap_true
                                      )
                                    ).

          DATA: it_objectlinks TYPE STANDARD TABLE OF bapi_doc_drad WITH DEFAULT KEY.

          it_objectlinks = VALUE #( (
                                      objecttype    = p_otype
                                      objectkey     = p_okey
                                    )
                                  ).

* Create Document
          CALL FUNCTION 'BAPI_DOCUMENT_CREATE2'
            EXPORTING
              documentdata         = lv_bapi_doc_draw2
            IMPORTING
              documenttype         = lv_documenttype
              documentnumber       = lv_documentnumber
              documentversion      = lv_documentversion
              documentpart         = lv_documentpart
              return               = lv_return
            TABLES
              documentdescriptions = it_documentdescriptions
              documentfiles        = it_documentfiles
              objectlinks          = it_objectlinks.

          IF lv_return-type CA 'EA'.
* Rollback bei Fehler
            CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
          ELSE.
* Daten verbuchen
            CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
              EXPORTING
                wait = abap_true.

            cl_demo_output=>write_data( lv_documenttype ).
            cl_demo_output=>write_data( lv_documentnumber ).
            cl_demo_output=>write_data( lv_documentversion ).
            cl_demo_output=>write_data( lv_documentpart ).
            cl_demo_output=>write_data( lv_return ).

* HTML-Code vom Demo-Output holen
            DATA(lv_html) = cl_demo_output=>get( ).

* Daten im Inline-Browser im SAP-Fenster anzeigen
            cl_abap_browser=>show_html( EXPORTING title       = 'BAPI_DOCUMENT_CREATE2'
                                                  html_string = lv_html
                                                  container   = cl_gui_container=>default_screen ).

* cl_gui_container=>default_screen erzwingen
            WRITE: space.
          ENDIF.
        ENDIF.
      ENDIF.
    CATCH cx_root INTO DATA(e_text).
      MESSAGE e_text->get_text( ) TYPE 'S' DISPLAY LIKE 'E'.
  ENDTRY.

Links