[ABAP] Benutzerparameter lesen/setzen

* Benutzerparameter
DATA: lv_parid TYPE memoryid VALUE 'ME_USE_GRID'.
* Parameterwert
DATA: lv_parvalue TYPE xuvalue.

* Benutzerparameter lesen
CALL FUNCTION 'ACC_USER_PARAMETER_GET'
  EXPORTING
    i_param_id    = lv_parid
  IMPORTING
    e_param_value = lv_parvalue.

WRITE: / lv_parvalue.

* Benutzerparameter setzen
CALL FUNCTION 'ACC_USER_PARAMETER_SET'
  EXPORTING
    i_param_id          = lv_parid
    i_param_value       = lv_parvalue.

Links

[ABAP] CDS-View zur Anzeige von Änderungsbelegen

TRY.
* CDS-View I_INVGCSMCHANGELOG (ICM Change Log),
* JOIN aus CDHDR + CDPOS
    SELECT FROM i_invgcsmchangelog
      FIELDS *
      WHERE invgcsmchangelogcreatedbyid EQ @sy-uname
      INTO TABLE @DATA(it_cd).

    IF sy-subrc = 0.
* SALV-Table
      DATA: o_salv TYPE REF TO cl_salv_table.

      cl_salv_table=>factory( IMPORTING r_salv_table = o_salv
                              CHANGING  t_table      = it_cd ).

* Grundeinstellungen
      o_salv->get_functions( )->set_all( abap_true ).
      o_salv->get_columns( )->set_optimize( abap_true ).
      o_salv->get_display_settings( )->set_list_header( 'Änderungsbelege' ).
      o_salv->get_display_settings( )->set_striped_pattern( abap_true ).
      o_salv->get_selections( )->set_selection_mode( if_salv_c_selection_mode=>row_column ).

      o_salv->display( ).
    ENDIF.

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

[ABAP] ABAP-Sprache aus T002, T002T und T002TX lesen (xco_cp_language)

DATA(lv_lang) = xco_cp=>language( 'D' ).
* DE
WRITE: / lv_lang->value.
* DE
WRITE: / lv_lang->as( xco_cp_language=>format->iso_639 ).
* Deutsch
WRITE: / lv_lang->get_name( ).
* Deutsch, Deutschland
WRITE: / lv_lang->get_long_text_description( ).

Links

[ABAP] Workflow: Inhalt (Workitems) der MyInbox eines Users auflisten

PARAMETERS: p_user TYPE sy-uname DEFAULT sy-uname.

START-OF-SELECTION.

  DATA: it_worklist TYPE STANDARD TABLE OF swr_wihdr WITH DEFAULT KEY.
  DATA: it_worklist_attributes TYPE STANDARD TABLE OF swr_wiaddattr WITH DEFAULT KEY.
  DATA: it_message_lines TYPE STANDARD TABLE OF swr_messag WITH DEFAULT KEY.
  DATA: it_message_struct TYPE STANDARD TABLE OF swr_mstruc WITH DEFAULT KEY.

* Workflow-Schnittstellen: Worklist für Benutzer aufbauen
  CALL FUNCTION 'SAP_WAPI_CREATE_WORKLIST'
    EXPORTING
      user                = p_user
*     LANGUAGE            = SY-LANGU
*     TRANSLATE_WI_TEXT   = ' '
      read_task_text      = abap_true
*     IM_TASK_FILTER      =
*     IM_STATUS_FILTER    =
*     PASSIVE_SUBSTITUTION = ' '
*     READ_LATEST_END     = ' '
*     TIME_ZONE           =
*     IM_WITEXT_FILTER    =
*     IM_WILED_FILTER     =
*     IM_WIPRIO_FILTER    =
*     IM_WICREA_FILTER    =
*     IM_OBJECT_FILTER    =
*     DO_COMMIT           = 'X'
* IMPORTING
*     RETURN_CODE         =
*     WORKITEMS_TRANSLATED       =
    TABLES
      worklist            = it_worklist
      worklist_attributes = it_worklist_attributes
      message_lines       = it_message_lines
      message_struct      = it_message_struct.

  cl_demo_output=>write_data( it_message_lines ).
  cl_demo_output=>write_data( it_message_struct ).
  cl_demo_output=>write_data( it_worklist ).
  cl_demo_output=>write_data( it_worklist_attributes ).

*   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       = 'MyInbox'
                                        html_string = lv_html
                                        container   = cl_gui_container=>default_screen ).

*   cl_gui_container=>default_screen erzwingen
  WRITE: space.

Links

[ABAP] SAP-Office: Emails und Attachements lesen

* Anhänge lesen mit Funktionsbaustein: SO_ATTACHMENT_READ

CLASS lcl_salv DEFINITION FINAL.

  PUBLIC SECTION.

    CLASS-DATA: o_salv TYPE REF TO cl_salv_table.
    CLASS-DATA: it_sood TYPE STANDARD TABLE OF sood WITH DEFAULT KEY.

    CLASS-METHODS on_double_click FOR EVENT double_click OF cl_salv_events_table
      IMPORTING
        row
        column
        sender.
ENDCLASS.

CLASS lcl_salv IMPLEMENTATION.

  METHOD on_double_click.
    IF o_salv IS BOUND.

* Wert in der geklickten Zelle holen
      DATA(it_sel) = o_salv->get_selections( )->get_selected_cells( ).

      IF lines( it_sel ) > 0.
* Schlüsselwerte der selektierten Zeile holen
        DATA(lv_soodk) = VALUE soodk( objtp = it_sood[ it_sel[ 1 ]-row ]-objtp
                                      objyr = it_sood[ it_sel[ 1 ]-row ]-objyr
                                      objno = it_sood[ it_sel[ 1 ]-row ]-objno ).

        DATA: it_sood5 TYPE STANDARD TABLE OF sood5 WITH DEFAULT KEY.

* SAPoffice: Ermitteln aller Anlagen zu einem Dokument
        CALL FUNCTION 'SO_ATTACHMENT_LIST_READ'
          EXPORTING
            object_id             = lv_soodk
          TABLES
            objects               = it_sood5
          EXCEPTIONS
            system_failure        = 1
            communication_failure = 2
            OTHERS                = 3.

        IF sy-subrc = 0.

          TRY.
              DATA: o_pop TYPE REF TO cl_salv_table.

              cl_salv_table=>factory( IMPORTING r_salv_table = o_pop
                                      CHANGING  t_table      = it_sood5 ).

              o_pop->get_functions( )->set_all( abap_true ).
              o_pop->get_columns( )->set_optimize( abap_true ).
              o_pop->get_display_settings( )->set_list_header( 'Attachements' ).
              o_pop->get_display_settings( )->set_striped_pattern( abap_true ).
              o_pop->get_selections( )->set_selection_mode( if_salv_c_selection_mode=>row_column ).

              o_pop->set_screen_popup( start_column = 1
                                       end_column   = 140
                                       start_line   = 1
                                       end_line     = 20 ).
              o_pop->display( ).
            CATCH cx_root INTO DATA(e_txt).
              WRITE: / e_txt->get_text( ).
          ENDTRY.

        ENDIF.
      ENDIF.
    ENDIF.
  ENDMETHOD.

ENDCLASS.

DATA: lv_obj_type TYPE sood-objtp.
DATA: lv_user TYPE usr02-bname.

SELECT-OPTIONS: so_type FOR lv_obj_type.
SELECT-OPTIONS: so_user FOR lv_user.
PARAMETERS: p_title TYPE sood-objdes DEFAULT ''.

INITIALIZATION.

* Emails: Typ "RAW"
  so_type[] = VALUE #( ( sign   = 'I'
                         option = 'EQ'
                         low    = 'RAW' ) ).

* Benutzer
  so_user[] = VALUE #( ( sign   = 'I'
                         option = 'EQ'
                         low    = sy-uname ) ).

START-OF-SELECTION.

* unscharfe Suche nach Email-Titel (Subject) mit "%"
  DATA(lv_title) = CONV sood-objdes( |%{ p_title }%| ).

* SAPoffice: Objektdefinition
  SELECT FROM sood AS s
    FIELDS *
    WHERE s~objtp IN @so_type
      AND s~ownnam IN @so_user
      AND s~objdes LIKE @lv_title
    INTO TABLE @lcl_salv=>it_sood.

  IF sy-subrc = 0.

    TRY.
* SALV-Table
        DATA: o_salv TYPE REF TO cl_salv_table.

        cl_salv_table=>factory( IMPORTING r_salv_table = lcl_salv=>o_salv
                                CHANGING  t_table      = lcl_salv=>it_sood ).

* Grundeinstellungen
        lcl_salv=>o_salv->get_functions( )->set_all( abap_true ).
        lcl_salv=>o_salv->get_columns( )->set_optimize( abap_true ).
        lcl_salv=>o_salv->get_display_settings( )->set_list_header( 'Mails' ).
        lcl_salv=>o_salv->get_display_settings( )->set_striped_pattern( abap_true ).
        lcl_salv=>o_salv->get_selections( )->set_selection_mode( if_salv_c_selection_mode=>row_column ).

* Spaltenüberschriften: technischer Name und Beschreibungstexte, Short Text und Medium Text leer lassen für Autosize
        LOOP AT lcl_salv=>o_salv->get_columns( )->get( ) ASSIGNING FIELD-SYMBOL(<c>).
          DATA(o_col) = <c>-r_column.
          o_col->set_short_text( || ).
          o_col->set_medium_text( || ).
          o_col->set_long_text( |{ o_col->get_columnname( ) } [{ o_col->get_long_text( ) }]| ).
        ENDLOOP.

* Event-Hanlder für Link-Klick
        SET HANDLER lcl_salv=>on_double_click FOR lcl_salv=>o_salv->get_event( ).

        lcl_salv=>o_salv->display( ).

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

[ABAP] Datumskonvertierung: String zu internem SAP-Datums-Format

* DD.MM.YYYY
* MM/DD/YYYY
* MM-DD-YYYY
* YYYY.MM.DD
* YYYY/MM/DD
* YYYY-MM-DD
DATA(lv_date_in) = |12-01-2025|.
DATA(lv_date_out) = ||.

* Convert Date to Internal Format
CALL FUNCTION 'CONVERSION_EXIT_RSDAT_INPUT'
  EXPORTING
    input        = lv_date_in
  IMPORTING
    output       = lv_date_out
  EXCEPTIONS
    invalid_date = 1
    OTHERS       = 2.

IF sy-subrc = 0.
  WRITE: / lv_date_out.
ELSE.
  WRITE: / 'Fehler'.
ENDIF.

[ABAP] Workflow: Workitems zu Objekt

* Einkaufsbelegnummer
PARAMETERS: p_po TYPE ekko-ebeln.
* Typ von Objekten in Persistenten Objektreferenzen, hier z.B. Klasse für Bestellungen
PARAMETERS: p_type TYPE sibftypeid DEFAULT 'CL_MM_PUR_WF_OBJECT_PO'.
* Kategorie von Objekten in Persistenten Objektreferenzen, hier z.B. Typ "Klassen"
PARAMETERS: p_catid TYPE sibfcatid DEFAULT 'CL'.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_type.

* Sucht Objekttypen zu einem Muster
  DATA(it_objtypes) = cl_swf_utl_def_services=>query_objects( EXPORTING im_objcateg = p_catid
                                                                        im_objtype  = '*' ).

  DATA: it_return TYPE TABLE OF ddshretval.

* eigene Suchhilfe für Auswahl der Objekte anzeigen
  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      retfield        = 'TYPEID'      " Spalte der internen Tabelle bei value_tab
      dynpprog        = sy-repid
      dynpnr          = sy-dynnr
      dynprofield     = 'P_TYPE'      " Name des Dynpro-Feldes für die automatische Werterückgabe
      value_org       = 'S'           " Werteübergabe: C: zellenweise, S: strukturiert
      window_title    = 'Auswahl'
    TABLES
      value_tab       = it_objtypes   " Übergabe-Tabelle mit Werten für die Anzeige und Auswahl
      return_tab      = it_return     " Rückgabe-Tabelle mit den ausgewählten (geklickten) Elementen
    EXCEPTIONS
      parameter_error = 1
      no_values_found = 2
      OTHERS          = 3.

  IF sy-subrc = 0.
    IF lines( it_return ) > 0.
      MESSAGE it_return[ 1 ]-fieldval TYPE 'S'.
    ENDIF.
  ENDIF.

START-OF-SELECTION.

  DATA(lv_object_por) = VALUE sibflporb( instid = CONV #( p_po )
                                         typeid = p_type
                                         catid  = p_catid ).
  DATA: lv_return_code TYPE sy-subrc.
  DATA: it_task_filter TYPE STANDARD TABLE OF swr_task WITH DEFAULT KEY.
  DATA: it_worklist    TYPE STANDARD TABLE OF swr_wihdr WITH DEFAULT KEY.

* Workflow-Schnittstellen: Workitems zu Objekt
  CALL FUNCTION 'SAP_WAPI_WORKITEMS_TO_OBJECT'
    EXPORTING
      object_por  = lv_object_por
    IMPORTING
      return_code = lv_return_code
    TABLES
      task_filter = it_task_filter
      worklist    = it_worklist.

  cl_demo_output=>write_data( lv_object_por ).
  cl_demo_output=>write_data( lv_return_code ).
  cl_demo_output=>write_data( it_task_filter ).
  cl_demo_output=>write_data( it_worklist ).

* 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       = 'Workflow'
                                        html_string = lv_html
                                        container   = cl_gui_container=>default_screen ).

* cl_gui_container=>default_screen erzwingen
  WRITE: space.

[ABAP] OLE2-Objekt ‚SAPINFO‘ aufrufen

DATA: o_ole2 TYPE ole2_object.

* OLE2-Objekt vom Typ 'SAPINFO' erzeugen
CREATE OBJECT o_ole2 'SAPINFO'.

IF sy-subrc = 0.
  WRITE: / 'Header', o_ole2-header.
  WRITE: / 'Type', o_ole2-type.
  WRITE: / 'Handle', o_ole2-handle.
  WRITE: / 'CB-Index', o_ole2-cb_index.
  WRITE: / 'CLSID', o_ole2-clsid.

  DATA: lv_file_name TYPE char255 VALUE 'c:\\Test1.txt'.
  DATA: lv_file_size TYPE i.

* Methode aufrufen -> Filesize zu Filename holen
* weitere Methoden zu Objekt 'SAPINFO' in Funktionsgruppe SI72
  CALL METHOD OF o_ole2 'GetFileSize' = lv_file_size
    EXPORTING #1 = lv_file_name.

  IF sy-subrc = 0.
    WRITE: / lv_file_name.
    WRITE: / lv_file_size.
  ENDIF.

* OLE2-Objekt freigeben
  FREE OBJECT o_ole2.

ENDIF.

[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