[ABAP] Einfache Charts anzeigen mit cl_time_chart_simple

* Kapselt: cl_gui_chart_engine
* Demo: RSORA_TCS_DEMO
* Vorteil: einfache Handhabung
* Nachteil: nur eingeschränktes Chart-Customizing (Einstellungen)
CONSTANTS: co_graph_id TYPE tcs_graph_id VALUE 'S_GRAPH1'.

CLASS lcl_events DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS:
      on_click FOR EVENT click OF cl_time_chart_simple
        IMPORTING
            element
            series_nr
            point_nr
            clicked_entry
            clicked_series
            sender.
    CLASS-METHODS:
      on_property_change FOR EVENT property_change OF cl_time_chart_simple
        IMPORTING
            element
            name
            value
            sender.
ENDCLASS.

CLASS lcl_events IMPLEMENTATION.

  METHOD on_click.
    MESSAGE |{ element } { series_nr } { point_nr } { clicked_entry-yvalue } { clicked_series }| TYPE 'S'.
  ENDMETHOD.

  METHOD on_property_change.
    MESSAGE |{ element } { name } { value }| TYPE 'S'.
  ENDMETHOD.

ENDCLASS.

* Dummy-Screen für cl_gui_container=>default_screen deklarieren
SELECTION-SCREEN BEGIN OF SCREEN 100.
SELECTION-SCREEN END OF SCREEN 100.

START-OF-SELECTION.
  TRY.
      DATA(o_tcs) = NEW cl_time_chart_simple( i_container = cl_gui_container=>default_screen ).

* Customizing, leider nur vier Parameter einstellbar
* erweitertes Customizing nur über die Methoden load_customizing... möglich (s.u.)
      DATA(lv_cust) = VALUE tcs_s_customizing( charttype  = 'TimeScatter'
                                               charttitle = 'Time Chart Simple Demo'
                                               yaxistext  = 'Höhe'
                                               yaxisunit  = '[mm]'
                                             ).

      o_tcs->set_customizing( lv_cust ).

* Daten
      DATA(it_data) = VALUE tcs_t_data( ( series    = 'Series 1'
                                          timestamp = cl_time_chart_simple=>create_timestamp( i_date  = '20190101' i_time  = '100000' i_milli = '000' )
                                          yvalue    = '1.2'
                                        )
                                        ( series    = 'Series 1'
                                          timestamp = cl_time_chart_simple=>create_timestamp( i_date  = '20190101' i_time  = '110000' i_milli = '100' )
                                          yvalue    = '1.5'
                                        )
                                        ( series    = 'Series 1'
                                          timestamp = cl_time_chart_simple=>create_timestamp( i_date  = '20190101' i_time  = '120000' i_milli = '200' )
                                          yvalue    = '1.9'
                                        )

                                        ( series    = 'Series 2'
                                          timestamp = cl_time_chart_simple=>create_timestamp( i_date  = '20190101' i_time  = '100000' i_milli = '500' )
                                          yvalue    = '1.0'
                                        )
                                        ( series    = 'Series 2'
                                          timestamp = cl_time_chart_simple=>create_timestamp( i_date  = '20190101' i_time  = '110000' i_milli = '700' )
                                          yvalue    = '1.2'
                                        )
                                        ( series    = 'Series 2'
                                          timestamp = cl_time_chart_simple=>create_timestamp( i_date  = '20190101' i_time  = '120000' i_milli = '800' )
                                          yvalue    = '1.6'
                                        )
                                      ).

      o_tcs->set_data( it_data ).

* Events
      SET HANDLER lcl_events=>on_click FOR o_tcs.
      SET HANDLER lcl_events=>on_property_change FOR o_tcs.

* Einstellungen anzeigen
      o_tcs->toggle_customizing_mode( ).

** interessante Funktionen (sollten durch Buttons getriggert werden):
** Drucken
*  o_tcs->print_chart( ).
** Grafik speichern
*  o_tcs->save_chart( ).
** Filter
*  o_tcs->filter_data_top_n( 3 ).
*  o_tcs->filter_data_top_n( 0 ).
** Zoom
*  o_tcs->zoom_in( 40 ).
*  o_tcs->zoom_out( 40 ).
** Scroll
*  o_tcs->scroll_left_border(  ).
*  o_tcs->scroll_left( 100 ).
*  o_tcs->scroll_left( 25 ).
*  o_tcs->scroll_right( 25 ).
*  o_tcs->scroll_right( 100 ).
*  o_tcs->scroll_right_border( ).
** Customizing als Datei laden/speichern
*  o_tcs->load_customizing_frontend( ).
*  o_tcs->save_customizing_frontend( ).
** Customizing auf DB laden/speichern/löschen
*  o_tcs->load_customizing_db( co_graph_id ).
*  o_tcs->save_customizing_db( co_graph_id ).
*  o_tcs->delete_customizing_db( co_graph_id ).

* cl_gui_container=>default_screen erzwingen
      CALL SCREEN 100.

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

[SAP] Detaillierte Fehlersuche im ABAP-Code bei Fehlermeldungen (z.B. im Bestellformular)

Variante 1 (Suche über die ME22N direkt)

ME22N

  • Button “Meldungen anzeigen” oder “Prüfen” klicken
  • entsprechenden Meldungstext mit Fehlermeldung (meißt ist die letzte in der Liste relevant) doppelklicken
  • Button “Technische Informationen” klicken
  • Nachrichtennummer markieren
  • Button “Navigieren” klicken
  • Nachrichtenpflege -> Nachrichtennummer markieren
  • Button “Verwendungsnachweis” klicken
  • entspr. Klassen, Programme usw. durchsuchen

Variante 2 (Suche über die ME22N und SE91)

ME22N

  • Button “Meldungen anzeigen” oder “Prüfen” klicken
  • entsprechenden Meldungstext mit Fehlermeldung (meißt ist die letzte in der Liste relevant) doppelklicken
  • Button “Technische Informationen” klicken
  • Arbeitsgebiet und Nachrichtennummer merken

SE91

  • Nachrichtenklasse (Arbeitsgebiet) aus techn. Info eintragen
  • Teilobjekte -> Nachrichten -> Nummer aus techn. Info
  • Button “Anzeigen” klicken
  • Nachrichtenpflege -> Reiter “Nachrichten” -> Nachrichtennummer markieren
  • Button “Verwendungsnachweis” klicken
  • entspr. Klassen, Programme usw. durchsuchen

Variante 3 (Arbeitsgebiet aus T100 ermitteln, Suche über die SE91)

SE16H

  • Tabelle: T100
  • Sprache: DE
  • Nachricht: Nachrichtennummer
  • im ALV-Gitter: Button “Suchen…” (Fernglas)
  • Suchbegriff eingeben und Button “OK” (Enter)
  • Wenn Wert gefunden, dann Wert des Feldes “Arbeitsgebiet” merken

SE91

  • Nachrichtenklasse (Arbeitsgebiet) eintragen
  • Teilobjekte -> Nachrichten -> Nachrichtennummer eintragen
  • Button “Anzeigen”
  • Nachrichtenpflege -> Reiter “Nachrichten” -> Nachrichtennummer markieren
  • Button “Verwendungsnachweis” klicken
  • entspr. Klassen, Programme usw. durchsuchen

[ABAP] SAP Release Information lesen

TYPES: ty_it_supp_db TYPE STANDARD TABLE OF thllines WITH DEFAULT KEY.

DATA(lv_kern_rel) = VALUE thllines-thline( ).
DATA(lv_kern_dblib) = VALUE thllines-thline( ).
DATA(lv_kern_comp_on) = VALUE thllines-thline( ).
DATA(lv_kern_comp_time) = VALUE thllines-thline( ).
DATA(lv_kern_patchlevel) = VALUE thllines-thline( ).
DATA(lv_kern_supportlevel) = VALUE thllines-thline( ).
DATA(lv_kern_patchnumber) = VALUE thllines-thline( ).
DATA(lv_kern_sourceid) = VALUE thllines-thline( ).

DATA(it_supp_db_sap) = VALUE ty_it_supp_db( ).
DATA(it_supp_db_vendor) = VALUE ty_it_supp_db( ).
DATA(it_supp_op_sys) = VALUE ty_it_supp_db( ).
DATA(it_patchcomment) = VALUE ty_it_supp_db( ).

* ruft ThSysInfo
CALL FUNCTION 'TH_SAPREL3'
  IMPORTING
    kern_rel          = lv_kern_rel
    kern_dblib        = lv_kern_dblib
    kern_comp_on      = lv_kern_comp_on
    kern_comp_time    = lv_kern_comp_time
    kern_patchlevel   = lv_kern_patchlevel
    kern_supportlevel = lv_kern_supportlevel
    kern_patchnumber  = lv_kern_patchnumber
    kern_sourceid     = lv_kern_sourceid
  TABLES
    supp_db_sap       = it_supp_db_sap
    supp_db_vendor    = it_supp_db_vendor
    supp_op_sys       = it_supp_op_sys
    patchcomment      = it_patchcomment.

cl_demo_output=>write_data( lv_kern_rel ).
cl_demo_output=>write_data( lv_kern_dblib ).
cl_demo_output=>write_data( lv_kern_comp_on ).
cl_demo_output=>write_data( lv_kern_comp_time ).
cl_demo_output=>write_data( lv_kern_patchlevel ).
cl_demo_output=>write_data( lv_kern_supportlevel ).
cl_demo_output=>write_data( lv_kern_patchnumber ).
cl_demo_output=>write_data( lv_kern_sourceid ).
cl_demo_output=>write_data( it_supp_db_sap ).
cl_demo_output=>write_data( it_supp_db_vendor ).
cl_demo_output=>write_data( it_supp_op_sys ).
cl_demo_output=>write_data( it_patchcomment ).
cl_demo_output=>display( ).

[ABAP] Popupfenster mit Eingabefeldern (cl_gui_combobox, cl_gui_input_field)

CLASS lcl_events DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS:
      on_close FOR EVENT close OF cl_gui_dialogbox_container
        IMPORTING sender.

    CLASS-METHODS:
      on_select FOR EVENT selected OF cl_gui_combobox
        IMPORTING
            key
            sender.

    CLASS-METHODS:
      on_submit FOR EVENT submit OF cl_gui_input_field
        IMPORTING
            input
            sender.

    CLASS-METHODS:
      on_auto_submit FOR EVENT auto_submit OF cl_gui_input_field
        IMPORTING
            input
            sender.
ENDCLASS.

CLASS lcl_events IMPLEMENTATION.
  METHOD on_close.
    IF sender IS NOT INITIAL.
      sender->free( ).
    ENDIF.
  ENDMETHOD.

  METHOD on_select.

    MESSAGE key && ' -> ' && sender->get_selected_item( ) TYPE 'S'.

    cl_gui_cfw=>flush( ).
  ENDMETHOD.

  METHOD on_submit.

    MESSAGE 'Submit:' && input && ' -> ' && sender->get_text( ) TYPE 'S'.

    cl_gui_cfw=>flush( ).
  ENDMETHOD.

  METHOD on_auto_submit.

    MESSAGE 'Auto-Submit:' &&  input && ' -> ' && sender->get_text( ) TYPE 'S'.

    cl_gui_cfw=>flush( ).
  ENDMETHOD.
ENDCLASS.

SELECTION-SCREEN: PUSHBUTTON 2(20) btn1 USER-COMMAND cmd_show.

AT SELECTION-SCREEN.
* wenn Button-Kommando 'CMD_SHOW'
  IF sy-ucomm = 'CMD_SHOW'.
* Container
    DATA(o_cnt) = NEW cl_gui_dialogbox_container( no_autodef_progid_dynnr = abap_true
                                                  caption                 = 'Werte'
                                                  top                     = 5
                                                  left                    = 5
                                                  width                   = 640
                                                  height                  = 240 ).

    SET HANDLER lcl_events=>on_close FOR o_cnt.

* Input
    DATA(o_input) = NEW cl_gui_input_field( parent               = o_cnt
                                            label_text           = 'InputLabel'
                                            label_width          = 10
                                            input_prompt_text    = 'Text'
                                            activate_find_button = abap_false
                                            activate_auto_submit = abap_true ).

    o_input->set_top( 30 ).
    o_input->set_text( '<default>' ).

    SET HANDLER lcl_events=>on_submit FOR o_input.
    SET HANDLER lcl_events=>on_auto_submit FOR o_input.

* Combobox
    DATA(o_combo) = NEW cl_gui_combobox( parent      = o_cnt
                                         label_text  = 'ComboLabel'
                                         label_width = 10 ).

    o_combo->set_items( VALUE vrm_values( ( key = 'A' text = 'Wert1' )
                                          ( key = 'B' text = 'Wert2' )
                                          ( key = 'C' text = 'Wert3' ) ) ).

    o_combo->set_selected_item( 'A' ).

    o_combo->activate_selection_event( ).

    o_combo->set_top( 10 ).

    SET HANDLER lcl_events=>on_select FOR o_combo.
  ENDIF.

[ABAP] XML-Datei einlesen und in String wandeln

TRY.
    DATA(o_doc) = NEW cl_xml_document( ).
* XML-Datei einlesen
    IF o_doc->import_from_file( 'c:\temp\temp.xml' ) = 0.
* Inhalt der XML-Document in String wandeln
      o_doc->render_2_string( EXPORTING
                                pretty_print = abap_true
                              IMPORTING
                                retcode = DATA(lv_rc)
                                size    = DATA(lv_size)
                                stream  = DATA(lv_xml_string) ).
      IF lv_rc = 0.
        WRITE: / lv_xml_string.
      ENDIF.
    ENDIF.
  CATCH cx_root INTO DATA(e_txt).
    WRITE: / e_txt->get_text( ).
ENDTRY.

[ABAP] IDoc: Basistyp lesen

TYPES: ty_it_pt_syntax TYPE STANDARD TABLE OF edi_iapi02 WITH DEFAULT KEY.
TYPES: ty_it_pt_extensions TYPE STANDARD TABLE OF edi_iapi04 WITH DEFAULT KEY.

* Segmenttyp
PARAMETERS: p_ityp TYPE edbas-idoctyp.

DATA(lv_pe_attributes) = VALUE edi_iapi01( ).
DATA(it_pt_syntax) = VALUE ty_it_pt_syntax( ).
DATA(it_pt_pre_syntax) = VALUE ty_it_pt_syntax( ).
DATA(it_pt_extensions) = VALUE ty_it_pt_extensions( ).

CALL FUNCTION 'IDOCTYPE_READ'
  EXPORTING
    pi_idoctyp       = p_ityp
  IMPORTING
    pe_attributes    = lv_pe_attributes
  TABLES
    pt_syntax        = it_pt_syntax
    pt_pre_syntax    = it_pt_pre_syntax
    pt_extensions    = it_pt_extensions
  EXCEPTIONS
    object_not_found = 1
    db_error         = 2
    no_authority     = 3
    OTHERS           = 4.

IF sy-subrc = 0.
  cl_demo_output=>write( lv_pe_attributes ).
  cl_demo_output=>write( it_pt_syntax ).
  cl_demo_output=>write( it_pt_pre_syntax ).
  cl_demo_output=>write( it_pt_extensions ).
  cl_demo_output=>display( ).
ENDIF.