[ABAP] Varianten eines Reports lesen

* Suchhilfe PROGNAME einbinden
PARAMETERS: p_report TYPE varid-report MATCHCODE OBJECT progname DEFAULT sy-repid.
PARAMETERS: p_langu TYPE t002-spras DEFAULT sy-langu.

START-OF-SELECTION.

* Varianten des Reports in den Tabellen VARID (Variantenkatalog) und VARIT (Variantentexte) suchen
* die gefundenen Tabelleninhalte werden in der Ausgabetabelle it_variants als getrennte
* Strukturen V und VT gespeichert
  SELECT FROM varid AS v
    INNER JOIN varit AS vt ON ( v~report EQ vt~report AND v~variant EQ vt~variant )
    FIELDS v~*, vt~*
    WHERE v~mlangu = @p_langu
      AND vt~langu = @p_langu
      AND v~report = @p_report
    INTO TABLE @DATA(it_variants).

  IF sy-subrc = 0.
* Hier Objekte für die Ausgabe hinzufügen
    cl_demo_output=>write_data( it_variants ).

* 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       = |Varianten des Reports { p_report }|
                                          html_string = lv_html
                                          container   = cl_gui_container=>default_screen ).

* cl_gui_container=>default_screen erzwingen
    WRITE: space.
  ELSE.
    WRITE: / |Keine Varianten zu Report { p_report } gefunden.|.
  ENDIF.

[ABAP] SAP-Suchhilfe verwenden

Beispiel 1 (MATCHCODE OBJECT)

* Suchhilfen anlegen, ändern: SE11

* Tabellen
*
* DD30L - Suchhilfen
* DD30T - Texte zu Suchhilfen
* DD33S - Zuordnung von Suchhilfefeldern

* MATCHCODE OBJECT verknüpft das Eingabefeld des Parameters mit einer Suchhilfe aus dem ABAP Dictionary
* Beispiel: Suchhilfe /iwbep/sh_ddshlp_elem sucht nach Suchhilfen :)
PARAMETERS: p_dd03l TYPE shlpname MATCHCODE OBJECT /iwbep/sh_ddshlp_elem.

Beispiel 2 (Suche von Suchhilfen zu einer Tabelle in der Tabelle DD30L)

* Parameterwert für Tabellenname, um Suchhilfen zu einer Tabelle zu ermitteln
PARAMETERS: p_table TYPE selmethod DEFAULT 'USR02'.

START-OF-SELECTION.

  SELECT l~shlpname,
         l~as4local,
         l~selmethod,
         t~ddtext
    INTO TABLE @DATA(it_dd30l)
    FROM dd30l AS l
    INNER JOIN dd30t AS t ON l~shlpname = t~shlpname
    WHERE t~ddlanguage = @sy-langu
      AND l~selmethod = @p_table.

  IF sy-subrc = 0.
    TRY.
*   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_dd30l ).

*   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( |Suchhilfen zur Tabelle { p_table }| ).
        o_salv->get_display_settings( )->set_striped_pattern( abap_true ).
        o_salv->get_selections( )->set_selection_mode( if_salv_c_selection_mode=>row_column ).

*   Spaltenüberschriften: technischer Name und Beschreibungstexte
        LOOP AT 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.

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

[ABAP] Eigene SET/GET-Parameter-ID im Programm verwenden

Oft ist es hilfreich, wenn man sich eigene Parameter festlegen kann, über die man in einem Programm Funktionen steuert.

Anlegen eines Parameters

  • SE80 -> Paket -> Rechtsklick -> Anlegen -> Weitere (1) -> SET/GET-Parameter-ID
  • Parameter-ID (z.B. ‚ZADM_SHOW_PARAMS‘) und Kurzbeschreibung eingeben

Wert für Parameter setzen

  • SU3 -> Reiter „Parameter“
  • Set-/Get-Parameter-Id: zuvor angelegten Parameter (z.B. ‚ZADM_SHOW_PARAMS‘) auswählen
  • Parameterwert: beliebigen Wert zur späteren Auswertung eintragen, z.B. ‚X‘

Werte werden in folgenden Tabelle abgelegt

  • TPARA (Verzeichnis der Memory-Id’s (vorlaeufig))
  • TPARAT (Kurztexte zu den Memory-Id’s)
  • USR05 (Benutzerstamm Parameter-ID)

Variante 1 (GET PARAMETER ID)

* Konstante für angelegten Parameter 'Z_SHOW_PARAMS'
CONSTANTS: co_parameter_id TYPE usr05-parid VALUE 'Z_SHOW_PARAMS'.

* Parameter mit einer Modifikationsgruppe namens 'ADM'
PARAMETERS: p_matnr TYPE matnr MODIF ID adm.
PARAMETERS: p_bukrs TYPE bukrs MODIF ID adm.

AT SELECTION-SCREEN OUTPUT.
  LOOP AT SCREEN INTO DATA(lv_scr).
* Name der Modifikationsgruppe ermitteln
    CASE lv_scr-group1.
* wenn in Modifikationsgruppe 'ADM'
      WHEN 'ADM'.
* Wert vorbelegen
        DATA(lv_show_params) = CONV usr05-parva( abap_false ).

* Benutzerparameter lesen, muss in Tabelle TPARA enthalten sein
        GET PARAMETER ID co_parameter_id FIELD lv_show_params.
* wenn Parameter vorhanden
        IF sy-subrc = 0.
* anhand des Benutzerparameters die Anzeige der Modifikationsgruppe namens 'ADM' aktivieren / deaktivieren
          lv_scr-active = COND #( WHEN lv_show_params = abap_true THEN '1' ELSE '0' ).
* Adminparameter zur Info als hervorgehoben darstellen
          lv_scr-intensified = 1.
        ENDIF.
    ENDCASE.

* geänderte Anzeigewerte setzen
    MODIFY screen FROM lv_scr.
  ENDLOOP.

Variante 2 (SELECT)

* Konstante für angelegten Parameter 'Z_SHOW_PARAMS'
CONSTANTS: co_parameter_id TYPE usr05-parid VALUE 'Z_SHOW_PARAMS'.

* Benutzerstamm Parameter-ID
SELECT SINGLE FROM usr05
  FIELDS parva
  WHERE bname = @sy-uname
    AND parid = @co_parameter_id
   INTO @DATA(lv_parva).

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

Links

[ABAP] Zugriff auf Elemente des Selektionsbildes (dirty assign)

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT (8) lbl1 FOR FIELD p_name.
PARAMETERS: p_name TYPE string LOWER CASE.
SELECTION-SCREEN END OF LINE.

INITIALIZATION.
* "dirty assign" über Namen in Großbuchstaben
  ASSIGN ('LBL1') TO FIELD-SYMBOL(<l>).
  <l> = 'Eingabe:'.

* "dirty assign" über Namen in Großbuchstaben
  ASSIGN ('P_NAME') TO FIELD-SYMBOL(<p>).
  <p> = 'Test'.

START-OF-SELECTION.
  WRITE: / <l>, <p>.

[ABAP] Werte an Dynpro-Elemente übergeben

Variante 1 (ein Wert mit SET_DYNP_VALUE)

PARAMETERS: p_test TYPE char32 DEFAULT ''.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_test.

  DATA: lv_value TYPE char32 VALUE 'Test123'.

  CALL FUNCTION 'SET_DYNP_VALUE'
    EXPORTING
      i_field = 'P_TEST'
      i_repid = sy-repid
      i_dynnr = sy-dynnr
      i_value = CONV dynpread-fieldvalue( lv_value ).

Variante 2 (mehrere Werte mit DYNP_UPDATE_FIELDS für Screens mit PBO/PAI-Event)

MODULE status_0100 OUTPUT.

  IF NOT sy-ucomm = 'QUIT'.
* nur durchlaufen, wenn Kommando 'QUIT' nicht getriggert wird
    DATA(it_dyn_update) = VALUE dynpread_tabtype( ( fieldname = 'P_TEST' fieldvalue = 'Testwert' ) ).

    CALL FUNCTION 'DYNP_UPDATE_FIELDS'
      EXPORTING
        dyname               = sy-repid
        dynumb               = sy-dynnr
      TABLES
        dynpfields           = it_dyn_update
      EXCEPTIONS
        invalid_abapworkarea = 1
        invalid_dynprofield  = 2
        invalid_dynproname   = 3
        invalid_dynpronummer = 4
        invalid_request      = 5
        no_fielddescription  = 6
        undefind_error       = 7
        OTHERS               = 8.

    IF sy-subrc = 0.

    ENDIF.
  
  ELSE.
* wenn Kommando "QUIT", dann Programmende
    LEAVE PROGRAM.
  ENDIF.

ENDMODULE.

Variante 3 (mehrere Werte mit DYNP_VALUES_UPDATE, funktioniert bei Screens ohne PBO/PAI-Event (z.B. Selektionsbild, F4-Hilfe))

* https://www.berater-wiki.de/Funktionsbaustein_DYNP_VALUES_UPDATE
PARAMETERS: p_test TYPE char32 DEFAULT ''.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_test.
* Tabelle mit Feldern / GUI-Elementen, deren Werte gesetzt werden sollen
  DATA(it_dyn_update) = VALUE dynpread_tabtype( ( fieldname = 'P_TEST' fieldvalue = 'Testwert' ) ).

  CALL FUNCTION 'DYNP_VALUES_UPDATE'
    EXPORTING
      dyname               = sy-repid " sy-cprog
      dynumb               = sy-dynnr
    TABLES
      dynpfields           = it_dyn_update
    EXCEPTIONS
      invalid_abapworkarea = 1
      invalid_dynprofield  = 2
      invalid_dynproname   = 3
      invalid_dynpronummer = 4
      invalid_request      = 5
      no_fielddescription  = 6
      undefind_error       = 7
      OTHERS               = 8.

  IF sy-subrc = 0.
* ggf. Screen-Update über Setzen eines Funktionscodes triggern
*    CALL FUNCTION 'SAPGUI_SET_FUNCTIONCODE'.
  ENDIF.

[ABAP] Werte von Dynpro-Elementen auslesen

Variante 1 (ein Wert mit GET_DYNP_VALUE)

PARAMETERS: p_test TYPE char32 DEFAULT 'Test123'.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_test.
  DATA(lv_value) = VALUE char255( ).

* sy-repid und sy-dynnr müssen beim Auslesevorgang auch im akt. Ereignis vorhanden sein, sonst Exception
  CALL FUNCTION 'GET_DYNP_VALUE'
    EXPORTING
      i_field = 'P_TEST'
      i_repid = sy-repid
      i_dynnr = sy-dynnr
    CHANGING
      o_value = lv_value.

  MESSAGE lv_value TYPE 'I'.

Variante 2 (mehrere Werte mit DYNP_VALUES_READ)

PARAMETERS: p_test TYPE char32 DEFAULT 'Test123'.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_test.
* Tabelle mit Feldern / GUI-Elementen, die ausgelesen werden sollen
  DATA(it_dyn_read) = VALUE dynpread_tabtype( ( fieldname = 'P_TEST' ) ).

* sy-repid und sy-dynnr müssen beim Auslesevorgang auch im akt. Ereignis vorhanden sein, sonst Exception
  CALL FUNCTION 'DYNP_VALUES_READ'
    EXPORTING
      dyname               = sy-repid " sy-cprog
      dynumb               = sy-dynnr
    TABLES
      dynpfields           = it_dyn_read
    EXCEPTIONS
      invalid_abapworkarea = 1
      invalid_dynprofield  = 2
      invalid_dynproname   = 3
      invalid_dynpronummer = 4
      invalid_request      = 5
      no_fielddescription  = 6
      invalid_parameter    = 7
      undefind_error       = 8
      double_conversion    = 9
      stepl_not_found      = 10
      OTHERS               = 11.

  IF sy-subrc = 0.
    IF lines( it_dyn_read ) > 0.
      MESSAGE it_dyn_read[ 1 ]-fieldvalue TYPE 'I'.
    ENDIF.
  ENDIF.

[ABAP] Zwei Editfelder mit Label in einer Zeile

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE title.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT (5) lbl1.
PARAMETERS: p_nr TYPE i.
SELECTION-SCREEN COMMENT (6) lbl2.
PARAMETERS: p_file TYPE localfile.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN END OF BLOCK b1.

INITIALIZATION.
  title = 'Auswahl'.
  lbl1 = 'Nr.:'.
  lbl2 = 'Name:'.

[ABAP] Einfacher Parameter (Labeled Edit)

PARAMETERS: p_mypar1 TYPE c LENGTH 2 DEFAULT 'AB'.        " einfacher Parameter mit Vorgabewert
PARAMETERS: p_mypar2 TYPE dicttype-var DEFAULT 'XY'.      " einfacher Parameter mit Dictionary-Type mit Suchhilfe, Langtext usw.
PARAMETERS: p_mypar3 TYPE string OBLIGATORY DEFAULT 'DE'. " einfacher Parameter mit Defaultwert und als Pflichteingabefeld
PARAMETERS: p_mypar4 TYPE i OBLIGATORY DEFAULT '1000'.

oder

PARAMETERS: p_mypar TYPE transparentetabelle-spalte DEFAULT 'XY'. " Spalte aus transparenter Tabelle (Dictionary Objekt) nutzen mit Suchhilfe, Langtext usw.