[ABAP] Interne Tabelle in XML wandeln und anzeigen

Variante 1 (Klassen)

DATA it_itab TYPE STANDARD TABLE OF mara.

SELECT * FROM mara INTO TABLE it_itab UP TO 10 ROWS.

DATA(o_writer_itab_xml) = cl_sxml_string_writer=>create( type = if_sxml=>co_xt_xml10 ).
CALL TRANSFORMATION id SOURCE values = it_itab RESULT XML o_writer_itab_xml.
DATA(itab_xml) = cl_abap_codepage=>convert_from( o_writer_itab_xml->get_output( ) ).

cl_abap_browser=>show_xml( xml_string = itab_xml
                           title      = 'Überschrift'
                           size       = cl_abap_browser=>large ).

Variante 2 (FuBa)

DATA lv_xml TYPE xstring.
DATA lo_dom TYPE REF TO if_ixml_document.
DATA it_itab TYPE STANDARD TABLE OF mara.

SELECT * FROM mara INTO TABLE it_itab UP TO 10 ROWS.

CALL TRANSFORMATION id SOURCE data_node = it_itab RESULT XML lv_xml.

CALL FUNCTION 'SDIXML_XML_TO_DOM'
  EXPORTING
    xml           = lv_xml
  IMPORTING
    document      = lo_dom
  EXCEPTIONS
    invalid_input = 1
    OTHERS        = 2.

IF sy-subrc = 0.
  CALL FUNCTION 'SDIXML_DOM_TO_SCREEN'
    EXPORTING
      document    = lo_dom
      title       = 'XML-Doc'
      encoding    = 'UTF-8'
    EXCEPTIONS
      no_document = 1
      OTHERS      = 2.

  IF sy-subrc = 0.

  ENDIF.
ENDIF.

[ABAP] HTML-Templates verwenden

* Pflege der HTML-Templates erfolgt in der Transaktion SMW0
DATA: it_merge_table TYPE swww_t_merge_table.
DATA: it_html_table TYPE swww_t_html_table.

* !USERID! im Template mit Benutzernamen ersetzen
DATA(lv_merge_item1) = VALUE swww_t_merge_item( name = '!USERID!' command = 'R' html = VALUE #( ( |{ sy-uname }| ) ) ).
APPEND lv_merge_item1 TO it_merge_table.
* !DATE! im Template mit Systemdatum ersetzen
DATA(lv_merge_item2) = VALUE swww_t_merge_item( name = '!DATE!' command = 'R' html = VALUE #( ( |{ sy-datum }| ) ) ).
APPEND lv_merge_item2 TO it_merge_table.

CALL FUNCTION 'WWW_HTML_MERGER'
  EXPORTING
    template           = 'ZZ_HTML_TEMPLATE_TEST' " Name des Templates
  IMPORTING
    html_table         = it_html_table
  CHANGING
    merge_table        = it_merge_table
  EXCEPTIONS
    template_not_found = 1
    OTHERS             = 2.

IF sy-subrc = 0.
  LOOP AT it_html_table INTO DATA(lv_line).
    WRITE / lv_line-line.
  ENDLOOP.
ENDIF.

Links

[ABAP] Excel-Daten in interne Tabelle einlesen

* alternative Funktionsbausteine:
* ALSM_EXCEL_TO_INTERNAL_TABLE -> nur Zellen mit 32 Zeichen Länge
* KCD_EXCEL_OLE_TO_INT_CONVERT -> nur Zellen mit 50 Zeichen Länge
* UPLOAD_XLS_FILE_2_ITAB
* FILE_READ_AND_CONVERT_SAP_DATA
* IMPORT_FROM_SPREADSHEET

TYPES: BEGIN OF ty_data,
         name    TYPE char255,
         gewicht TYPE f,
       END OF ty_data.

DATA: it_raw TYPE truxs_t_text_data.

PARAMETERS: p_file TYPE file_table-filename OBLIGATORY.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
  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\|XLS (*.xls)\|*.xls\|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
          p_file = it_files[ 1 ]-filename.
        ENDIF.
      ENDIF.

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

START-OF-SELECTION.

  DATA: it_datatab TYPE STANDARD TABLE OF ty_data.

* Import von Excel-Daten in interne Tabelle über die Ole-Schnittstelle
* Format der Tabelle ist in ty_data definiert
* Unterstützte Dateiformate: *.csv (*.txt), *.xls, *.xlsx
* Das Format der Fließkommazahlen bei CSV muß dem Gebietsschema
* von Excel entsprechen: 1,23 (Dezimalseparator = ',')
  CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
    EXPORTING
      i_field_seperator    = ';'                            " Trennzeichen für CSV-Datei
      i_line_header        = abap_true                      " Überschrift in der Tabelle
      i_tab_raw_data       = it_raw
      i_filename           = CONV rlgrap-filename( p_file ) " i_filename -> nur 128 Zeichen für Dateinamenlänge erlaubt
    TABLES
      i_tab_converted_data = it_datatab
    EXCEPTIONS
      conversion_failed    = 1
      OTHERS               = 2.

  IF sy-subrc = 0.
    LOOP AT it_datatab ASSIGNING FIELD-SYMBOL(<fs_line>).
      WRITE: / <fs_line>-name, <fs_line>-gewicht.
    ENDLOOP.
  ELSE.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

Weiterführende Infos: Link

[ABAP] Prüfen, ob System ActiveX unterstützt

Variante 1 (GUI_HAS_OBJECTS)

DATA: lv_obj_model_available TYPE abap_bool.

* Konstanten für object_model (Typgruppe SFES)
*  SFES_OBJ_ACTIVEX   = 'ACTX'
*  SFES_OBJ_JAVABEANS = 'JBEAN'
*  SFES_OBJ_OLE       = 'OLE'
*  SFES_OBJ_SAP       = 'SAP'
*  SFES_OBJ_HTML      = 'HTML'
* Test, ob Objekte des gegebenen Modells unterstuezt werden
CALL FUNCTION 'GUI_HAS_OBJECTS'
  EXPORTING
    object_model         = sfes_obj_activex
  IMPORTING
    return               = lv_obj_model_available
  EXCEPTIONS
    invalid_object_model = 1
    OTHERS               = 2.

IF sy-subrc = 0.
  WRITE: / 'Model available:', lv_obj_model_available.
ENDIF.

Variante 2 (GUI_HAS_ACTIVEX)

DATA: lv_has_activex TYPE abap_bool.

* Test, ob ActiveX Controls unterstuetzt werden
* Nutzt FuBa GUI_HAS_OBJECTS
CALL FUNCTION 'GUI_HAS_ACTIVEX'
  IMPORTING
    return  = lv_has_activex.

WRITE: / lv_has_activex.

[ABAP] String (Char) nach Datum konvertieren

* Datum wandeln, siehe auch cl_abap_datfm=>conv_date_ext_to_int
DATA: lv_value_in TYPE string VALUE '01.01.2016'. " Eingabetyp und Wert
DATA: lv_value_out TYPE sy-datum.                 " Ausgabetyp

DATA(lv_tabfield) = VALUE tabfield( tabname   = 'SYST'
                                    fieldname = 'DATUM' ).
                                    
CALL FUNCTION 'RS_CONV_EX_2_IN'
  EXPORTING
    input_external               = CONV char30( condense( val = lv_value_in ) )
    table_field                  = lv_tabfield
  IMPORTING
    output_internal              = lv_value_out
  EXCEPTIONS
    input_not_numerical          = 1
    too_many_decimals            = 2
    more_than_one_sign           = 3
    ill_thousand_separator_dist  = 4
    too_many_digits              = 5
    sign_for_unsigned            = 6
    too_large                    = 7
    too_small                    = 8
    invalid_date_format          = 9
    invalid_date                 = 10
    invalid_time_format          = 11
    invalid_time                 = 12
    invalid_hex_digit            = 13
    unexpected_error             = 14
    invalid_fieldname            = 15
    field_and_descr_incompatible = 16
    input_too_long               = 17
    no_decimals                  = 18
    invalid_float                = 19
    conversion_exit_error        = 20
    OTHERS                       = 21.

IF sy-subrc = 0.
  WRITE: / lv_value_out.
ENDIF.

[ABAP] String (Char) nach Float konvertieren

Variante 1 (CL_ABAP_CONTAINER_UTILITIES mit Float)

* String
DATA(lv_str_val) = |123.45|.
* Float
DATA: lv_float TYPE f.

* String -> Float
cl_abap_container_utilities=>read_container_c( EXPORTING
                                                 im_container = lv_str_val
                                               IMPORTING
                                                 ex_value     = lv_float ).

WRITE: / lv_float.

Variante 2 (CL_ABAP_CONTAINER_UTILITIES mit decfloat34)

* String
DATA(lv_str_val) = |123.45|.
* Float
DATA: lv_float TYPE decfloat34.

* String -> Float
cl_abap_container_utilities=>read_container_c( EXPORTING
                                                 im_container = lv_str_val
                                               IMPORTING
                                                 ex_value     = lv_float ).

WRITE: / lv_float.

Variante 3 (RS_CONV_EX_2_IN)

* Währungsbetrag wandeln
DATA: lv_value_in TYPE string VALUE '31,60'. " Eingabetyp und Wert
DATA: lv_value_out TYPE konp-kbetr.          " Ausgabetyp

DATA(lv_tabfield) = VALUE tabfield( tabname   = 'KONP'
                                    fieldname = 'KBETR' ).

CALL FUNCTION 'RS_CONV_EX_2_IN'
  EXPORTING
    input_external               = CONV char30( condense( val = lv_value_in ) )
    table_field                  = lv_tabfield
  IMPORTING
    output_internal              = lv_value_out
  EXCEPTIONS
    input_not_numerical          = 1
    too_many_decimals            = 2
    more_than_one_sign           = 3
    ill_thousand_separator_dist  = 4
    too_many_digits              = 5
    sign_for_unsigned            = 6
    too_large                    = 7
    too_small                    = 8
    invalid_date_format          = 9
    invalid_date                 = 10
    invalid_time_format          = 11
    invalid_time                 = 12
    invalid_hex_digit            = 13
    unexpected_error             = 14
    invalid_fieldname            = 15
    field_and_descr_incompatible = 16
    input_too_long               = 17
    no_decimals                  = 18
    invalid_float                = 19
    conversion_exit_error        = 20
    OTHERS                       = 21.

IF sy-subrc = 0.
  WRITE: / lv_value_out.
ENDIF.

[ABAP] Popup zur Wert-Eingabe von Datenbankfeldern anzeigen

TYPES: ty_it_fields TYPE STANDARD TABLE OF sval WITH DEFAULT KEY.

DATA: lv_ret TYPE char1.

* field_attr:
*
* space - normale Helligkeit, eingabebereit
* 01     - hell, eingabebereit
* 02     - normale Helligkeit, nicht eingabebereit
* 03     - hell, nicht eingabebereit
* 04     - nicht anzeigen

* Eingabefelder
DATA(it_fields) = VALUE ty_it_fields( ( tabname = 'BKPF' fieldname = 'BUDAT' value = sy-datum field_obl = abap_true )
                                      ( tabname = 'BKPF' fieldname = 'BLART' field_obl = abap_true )
                                      ( tabname = 'MARA' fieldname = 'MATNR' fieldtext = 'MarNr' field_attr = '01' value = '00001' ) ).

* Eingabedialog
CALL FUNCTION 'POPUP_GET_VALUES'
  EXPORTING
    popup_title     = 'Werteeingabe'
  IMPORTING
    returncode      = lv_ret
  TABLES
    fields          = it_fields
  EXCEPTIONS
    error_in_fields = 1
    OTHERS          = 2.

* Auswertung
IF sy-subrc = 0.
  CASE lv_ret.
    WHEN space.
      LOOP AT it_fields ASSIGNING FIELD-SYMBOL(<fs_line>).
        WRITE: / <fs_line>-tabname, <fs_line>-fieldname, <fs_line>-fieldtext, <fs_line>-field_obl, <fs_line>-value.
      ENDLOOP.
    WHEN 'A'.
      WRITE: / 'Abbruch.'.
    WHEN OTHERS.
      WRITE: / 'Fehler.'.
  ENDCASE.
ELSE.
  WRITE: / sy-subrc.
ENDIF.

[ABAP] Alle ungesperrten Dialoguser auflisten

DATA: it_sel_range TYPE STANDARD TABLE OF bapiussrge.
DATA: it_users TYPE STANDARD TABLE OF bapiusname.
DATA: it_ret TYPE STANDARD TABLE OF bapiret2.

* ungesperrte Dialoguser ermitteln
INSERT VALUE #( parameter = 'LOGONDATA'
                field = 'USTYP'
                sign = 'I'
                option = 'EQ'
                low = 'A'
                high = '' ) INTO TABLE it_sel_range.

INSERT VALUE #( parameter = 'LOGONDATA'
                field = 'UFLAG'
                sign = 'I'
                option = 'EQ'
                low = '0'
                high = '' ) INTO TABLE it_sel_range.

CALL FUNCTION 'BAPI_USER_GETLIST'
  EXPORTING
    with_username   = abap_true
  TABLES
    selection_range = it_sel_range
    userlist        = it_users
    return          = it_ret.

LOOP AT it_users ASSIGNING FIELD-SYMBOL(<fs_line>).
  WRITE: / <fs_line>-username, <fs_line>-firstname, <fs_line>-lastname, <fs_line>-fullname.
ENDLOOP.