ZMM_BEW1 – Bewegungen eines Materials

Hier ist für Analysezwecke die Bewegungen eines Materials aufgeschlüsselt.

Dies ist notwendig, will man ein Material analysieren, die Einstellungen des Materials verändern etc.

REPORT zmm_bew1.


*Programm zur raschen Auswertung der Bewegungen
*Anzeige der Bewegungen und Summen
*Filtern der Bewegungen
*Anzeige von Zusatzinfo zu Bewegungen
*
"Version 003 HST 20190712
*Beleganzeige per Doppelklick/Link
*Sonderbestandskennzeichen eingefügt.
*Version 002 HST 20190301
*Materialbelegnummer in Detail plus Zusatz ergänzt
*Version 001 HST
*ALV Grid ergänzt
*Version 000 HST
*Ausgabe als ALV List

SELECTION-SCREEN COMMENT 01(80) text-001.
SELECTION-SCREEN SKIP.

TABLES:
  coas,
  mseg.


SELECTION-SCREEN BEGIN OF BLOCK all WITH FRAME.

SELECTION-SCREEN BEGIN OF BLOCK aus WITH FRAME TITLE text-011.
SELECT-OPTIONS so_matnr FOR mseg-matnr DEFAULT '12-780-071-Z2'. "'7227775030' DEFAULT '800000004*'. " '7277771163-2'.
SELECT-OPTIONS so_bwart FOR mseg-bwart. "default ''.
SELECT-OPTIONS so_budat FOR mseg-budat_mkpf.
SELECT-OPTIONS so_aufnr FOR mseg-aufnr NO-DISPLAY. "Future possibilities
SELECTION-SCREEN SKIP.
SELECT-OPTIONS so_saknr FOR mseg-sakto.
SELECTION-SCREEN END OF BLOCK aus.

SELECTION-SCREEN BEGIN OF BLOCK opt WITH FRAME TITLE text-012.
SELECT-OPTIONS so_buda2 FOR mseg-budat_mkpf.
PARAMETERS p_date TYPE sy-datum  DEFAULT sy-datum NO-DISPLAY.
SELECT-OPTIONS so_sobkz FOR mseg-sobkz  MATCHCODE OBJECT h_t148. "HST 20190712

PARAMETERS: alv_grid     RADIOBUTTON GROUP g1 DEFAULT 'X'.
SELECTION-SCREEN SKIP.
SELECTION-SCREEN BEGIN OF BLOCK alv WITH FRAME TITLE text-015.

SELECTION-SCREEN COMMENT 1(60)  text-016 .
PARAMETERS p_var TYPE  rsvar-variant. "LIKE p_alvvar.
SELECTION-SCREEN END OF BLOCK alv.

SELECTION-SCREEN SKIP.
PARAMETERS : p_list RADIOBUTTON  GROUP g1 ."DEFAULT 'X'.
SELECTION-SCREEN SKIP.
SELECTION-SCREEN BEGIN OF BLOCK det WITH FRAME TITLE text-013.
PARAMETERS p_detail TYPE xfeld AS CHECKBOX DEFAULT abap_true.
SELECTION-SCREEN SKIP.

SELECTION-SCREEN BEGIN OF BLOCK zus WITH FRAME TITLE text-014.
PARAMETERS: p_zusat0 RADIOBUTTON GROUP g2,
            p_zusat1 RADIOBUTTON GROUP g2 DEFAULT 'X',
            p_zusat2 RADIOBUTTON GROUP g2.
SELECTION-SCREEN END OF BLOCK zus.
PARAMETERS p_summe TYPE xfeld AS CHECKBOX DEFAULT abap_true.
PARAMETERS p_sumges TYPE xfeld AS CHECKBOX DEFAULT abap_true.
SELECTION-SCREEN END OF BLOCK det.




SELECTION-SCREEN END OF BLOCK opt.

SELECTION-SCREEN END OF BLOCK all.







TYPES: BEGIN OF ty_alv,
         bemer(30) TYPE c,
         beme2(30) TYPE c,
         matnr     TYPE mseg-matnr,
         bwart     TYPE mseg-bwart,
         shkzg     TYPE mseg-shkzg,
         sakto     TYPE mseg-sakto,
         dmbtr     TYPE mseg-dmbtr,
         "dmbtr TYPE betrag11,

         "menge     TYPE mseg-menge, HST20181219
         menge     TYPE p LENGTH 7 DECIMALS 0,
         tcode     TYPE mseg-tcode2_mkpf,
         aufnr     TYPE mseg-aufnr,
         kostl     TYPE mseg-kostl,
         budat     TYPE mseg-budat_mkpf,
         sobkz     TYPE mseg-sobkz, "HST 20190712
         mblnr     TYPE mseg-mblnr,
         mjahr     TYPE mseg-mjahr,
         ampel(4)  TYPE c,
       END OF ty_alv.
TYPES:        ty_alv_table TYPE STANDARD TABLE OF ty_alv.
DATA: gt_alv  TYPE ty_alv_table,
      gt_alv2 TYPE ty_alv_table,
      gs_alv  TYPE ty_alv.
TYPES: BEGIN OF ty_list,
         matnr TYPE mseg-matnr,
         bwart TYPE mseg-bwart,
         shkzg TYPE mseg-shkzg,
         sakto TYPE mseg-sakto,
         dmbtr TYPE mseg-dmbtr,
         "dmbtr TYPE betrag11,

         "menge     TYPE mseg-menge, HST20181219
         menge TYPE p LENGTH 7 DECIMALS 0,
         tcode TYPE mseg-tcode2_mkpf,
         aufnr TYPE mseg-aufnr,
         kostl TYPE mseg-kostl,
         budat TYPE mseg-budat_mkpf,
         sobkz TYPE mseg-sobkz,
         mblnr TYPE mseg-mblnr,
         mjahr TYPE mseg-mjahr,
       END OF ty_list.
TYPES: ty_list_table TYPE STANDARD TABLE OF ty_list.
DATA gt_list TYPE ty_list_table.
DATA gv_titel(50) TYPE c.


AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_var.
  PERFORM f4_alv_variant USING p_var.


INITIALIZATION.

*  CLEAR so_matnr.
*  so_matnr-sign = 'I'.
*  so_matnr-option = 'CP'.
*  so_matnr-low = '800000004*'.
*  APPEND so_matnr.

  so_budat-sign = 'I'.
  so_budat-option = 'BT'.
  so_budat-low = '20150101'.
  so_budat-high = '20181231'.
  APPEND so_budat.

  so_buda2-sign = 'I'.
  so_buda2-option = 'BT'.
  so_buda2-low = '20180101'.
  so_buda2-high = '20181231'.

  APPEND so_buda2.
  p_date = sy-datum - 60.

AT SELECTION-SCREEN OUTPUT.

  LOOP AT SCREEN.
    IF screen-name = 'P_DATE'.
      screen-input = 0.
      screen-invisible = abap_false.
      MODIFY SCREEN.
    ENDIF.
  ENDLOOP.


AT SELECTION-SCREEN.


  "HST 20190712 Beginn
CLASS cl_event_handler DEFINITION.

  PUBLIC SECTION.

    CLASS-METHODS on_before_salv_function         " BEFORE_SALV_FUNCTION
      FOR EVENT if_salv_events_functions~before_salv_function
                  OF cl_salv_events_table
      IMPORTING e_salv_function.

    CLASS-METHODS on_after_salv_function          " AFTER_SALV_FUNCTION
      FOR EVENT if_salv_events_functions~before_salv_function
                  OF cl_salv_events_table
      IMPORTING e_salv_function.

    CLASS-METHODS on_added_function               " ADDED_FUNCTION
      FOR EVENT if_salv_events_functions~added_function
                  OF cl_salv_events_table
      IMPORTING e_salv_function.

    CLASS-METHODS on_top_of_page                  " TOP_OF_PAGE
      FOR EVENT if_salv_events_list~top_of_page
                  OF cl_salv_events_table
      IMPORTING r_top_of_page
                  page
                  table_index.

    CLASS-METHODS on_end_of_page                  " END_OF_PAGE
      FOR EVENT if_salv_events_list~end_of_page
                  OF cl_salv_events_table
      IMPORTING r_end_of_page
                  page.

    CLASS-METHODS on_double_click                 " DOUBLE_CLICK
      FOR EVENT if_salv_events_actions_table~double_click
                  OF cl_salv_events_table
      IMPORTING row
                  column.

    CLASS-METHODS on_link_click                   " LINK_CLICK
      FOR EVENT if_salv_events_actions_table~link_click
                  OF cl_salv_events_table
      IMPORTING row
                  column.
ENDCLASS.                    "cl_event_handler DEFINITION

*----------------------------------------------------------------------*
*       CLASS cl_event_handler IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS cl_event_handler IMPLEMENTATION.

  METHOD on_before_salv_function.
    "BREAK-POINT.
  ENDMETHOD.                    "on_before_salv_function

  METHOD on_after_salv_function.
    "BREAK-POINT.
  ENDMETHOD.                    "on_after_salv_function

  METHOD on_added_function.
    "BREAK-POINT.
  ENDMETHOD.                    "on_added_function

  METHOD on_top_of_page.
    "BREAK-POINT.
  ENDMETHOD.                    "on_top_of_page

  METHOD on_end_of_page.
    "BREAK-POINT.
  ENDMETHOD.                    "on_end_of_page

  METHOD on_double_click.
    PERFORM display_document TABLES gt_alv USING row column.
  ENDMETHOD.                    "on_double_click

  METHOD on_link_click.
    PERFORM display_document TABLES gt_alv USING row column.
  ENDMETHOD.                    "on_link_click
ENDCLASS.                    "cl_event_handler IMPLEMENTATION

"HST 20190712 Ende



START-OF-SELECTION.




  IF p_list EQ 'X'.
    PERFORM collect_list.
    PERFORM show_list.
  ELSE.
    PERFORM collect_alv.
    PERFORM show_alv.
  ENDIF.

  EXIT.

FORM collect_list.
*Zwei Select je nach Infomenge
  IF p_zusat0 = abap_true.
    "Minimales Detail
    SELECT matnr, bwart, shkzg, sakto, "budat_mkpf,
      SUM( dmbtr ) AS dmbtr, SUM( menge ) AS menge, MIN( tcode2_mkpf ) AS tcode, MIN( aufnr ) AS aufnr, MIN( kostl ) AS kostl,
      @sy-datum AS budat,
      MIN( mblnr ) AS mblnr, MIN( mjahr ) AS mjahr
      FROM mseg INTO TABLE
      @gt_list
      WHERE matnr IN @so_matnr
       AND budat_mkpf IN @so_budat
       AND sakto IN @so_saknr
       AND bwart IN @so_bwart
      AND aufnr IN @so_aufnr
      AND sobkz IN @so_sobkz "HST 20190712
      GROUP BY
      matnr,
      shkzg,
      "budat_mkpf,
      sakto,
      bwart.
  ELSEIF p_zusat1 = abap_true.
    SELECT matnr, bwart, shkzg, sakto, "budat_mkpf,
      SUM( dmbtr ) AS dmbtr, SUM( menge ) AS menge, tcode2_mkpf AS tcode, aufnr, kostl,
      @sy-datum AS budat,
      sobkz, "HST 20190712
      MIN( mblnr ) AS mblnr, MIN( mjahr ) AS mjahr
      FROM mseg
      APPENDING TABLE @gt_list
      WHERE matnr IN @so_matnr
       AND budat_mkpf IN @so_budat
       AND sakto IN @so_saknr
       AND bwart IN @so_bwart
      AND aufnr IN @so_aufnr
      AND sobkz IN @so_sobkz "HST 20190712
      GROUP BY
      tcode2_mkpf,
      aufnr,
      kostl,
      matnr,
      shkzg,
      "budat_mkpf,
      sakto,
      sobkz, "HST 20190712
      bwart.
  ELSEIF p_zusat2 = abap_true.
    SELECT matnr, bwart, shkzg, sakto, "budat_mkpf,
      SUM( dmbtr ) AS dmbtr, SUM( menge ) AS menge, tcode2_mkpf AS tcode, aufnr, kostl, budat_mkpf AS budat,
      sobkz, "HST 20190712
      mblnr, mjahr
      FROM mseg
      APPENDING TABLE @gt_list
      WHERE matnr IN @so_matnr
       AND budat_mkpf IN @so_budat
       AND sakto IN @so_saknr
       AND bwart IN @so_bwart
      AND aufnr IN @so_aufnr
      AND sobkz IN @so_sobkz "HST 20190712
      GROUP BY
      tcode2_mkpf,
      aufnr,
      kostl,
      matnr,
      shkzg,
      "budat_mkpf,
      sakto,
      bwart,
      budat_mkpf,
      sobkz, "HST 20190712
      mblnr,
      mjahr.
  ENDIF.


  IF sy-subrc <> 0.
    MESSAGE i531(0u) WITH 'Keine Daten gefunden'.
    RETURN.
    BREAK-POINT.

  ENDIF.

  DATA:
                 lv_kostv    LIKE mseg-kostl.
* Nachbereitung der Daten
  CLEAR lv_kostv.
  SORT gt_list BY aufnr.
  LOOP AT gt_list INTO DATA(gs_list) WHERE NOT aufnr IS INITIAL.
    AT NEW aufnr.
      SELECT kostv FROM coas INTO lv_kostv WHERE aufnr = gs_list-aufnr.
      ENDSELECT.
    ENDAT.
    gs_list-kostl = lv_kostv.
    MODIFY gt_list FROM gs_list.
  ENDLOOP.

ENDFORM.
FORM show_list.
  DATA:

    lv_text(30) TYPE c,
    lv_menge    LIKE mseg-menge,
    lv_dmbtr    LIKE mseg-dmbtr,
    lv_mengeges LIKE mseg-menge,
    lv_dmbtrges LIKE mseg-dmbtr.

* Ausgabe Berichtsparameter
  WRITE: / 'Buchungszeitraum: ', so_budat-low, '-', so_budat-high.
  ULINE.
  "WRITE: /.
  WRITE: / 'Zugang/Abgang'.
  WRITE: / '101   /201'.
  WRITE: / '102   /202'.
  WRITE: / '561   /562'.
  WRITE: / '      /261'.
  WRITE: / '501'.
  WRITE: / '      /601'.
  WRITE: / '      /711'.
  WRITE: / '912'.
  ULINE.
* Ausgabe Tabellenüberschrift
  WRITE: 'MATNR'.
  IF p_detail EQ abap_true.
    WRITE: 20 'BWA'.
    IF p_zusat1 EQ abap_true OR p_zusat2 EQ abap_true.
      WRITE: 31 'TCODE', 41 'KOSTL', 51 'AUFNR'.
      IF p_zusat2 EQ abap_true.
        WRITE: 61 'MBLNR', 72 'MJAHR', 81 'BUDAT'.
      ENDIF.
    ENDIF.
  ENDIF.

  WRITE: 100  'Wert', 114 'Menge'.

  ULINE.

* Ausgabe Tabelle
  CLEAR: lv_menge, lv_dmbtr, lv_text, lv_mengeges, lv_dmbtrges.
  lv_text = 'Summe'.

  SORT gt_list BY matnr budat bwart.

  LOOP AT gt_list INTO DATA(gs_list).
    IF gs_list-shkzg = 'H'.
      gs_list-dmbtr = - gs_list-dmbtr.
      gs_list-menge = - gs_list-menge.

    ENDIF.
    lv_dmbtr = lv_dmbtr + gs_list-dmbtr.
    lv_menge = lv_menge + gs_list-menge.
    lv_dmbtrges = lv_dmbtrges + gs_list-dmbtr.
    lv_mengeges = lv_mengeges + gs_list-menge.

    IF p_detail EQ abap_true.

      WRITE: /  gs_list-matnr, gs_list-bwart, gs_list-shkzg, 26 gs_list-sakto, 92 gs_list-dmbtr, gs_list-menge.
      IF p_zusat1 EQ abap_true OR p_zusat2 EQ abap_true.
        SHIFT gs_list-kostl LEFT DELETING LEADING '0'.
        SHIFT gs_list-aufnr LEFT DELETING LEADING '0'.
        "shift gs_list-menge right deleting trailing '0'.

        WRITE: 31 gs_list-tcode.
        WRITE: 41 gs_list-kostl.
        WRITE: 51 gs_list-aufnr.
        IF p_zusat2 EQ abap_true.
          WRITE: 61 gs_list-mblnr.
          WRITE: 72 gs_list-mjahr.
          "WRITE: 81 gs_list-budat(4), gs_list-budat+4(2), gs_list-budat+6(2).
          WRITE: 81 gs_list-budat DD/MM/YYYY.
        ENDIF.

      ENDIF.
    ENDIF.
    AT NEW matnr.

    ENDAT.

    AT END OF matnr.
      IF p_summe EQ abap_true.
        WRITE: / gs_list-matnr, lv_text, (39) '', lv_dmbtr, (15) lv_menge.
      ENDIF.
      CLEAR: lv_menge, lv_dmbtr.
      ULINE.
    ENDAT.
  ENDLOOP.

* Ausgabe Gesamt
  IF p_sumges EQ abap_true.
    lv_text = 'Gesamt'.
    WRITE: /20 lv_text, 91 lv_dmbtrges, (15) lv_mengeges.
  ENDIF.


ENDFORM.
FORM collect_alv.
* Ausgabe ALV

  DATA: lv_buda2_low TYPE d.

  lv_buda2_low = so_buda2-low.
  CLEAR gs_alv.
  SELECT
    'VOR' AS bemer,
    'Zugang' AS beme2,
*      CASE
*      WHEN budat_mkpf  = @so_buda2-low then 'KRIT'
*      else ' '
*      end as bemer,
    matnr, bwart, shkzg, sakto, "budat_mkpf,
    SUM( dmbtr ) AS dmbtr, SUM( menge ) AS menge, tcode2_mkpf AS tcode, aufnr, kostl,
    budat_mkpf AS budat,
    sobkz, "HST 20190712
    mblnr, mjahr

    "case budat_mkpf when @p_date then '@EBQ' else '@EB@' end as ampel

    FROM mseg
    INTO TABLE @gt_alv2
    WHERE matnr IN @so_matnr
    AND budat_mkpf IN @so_budat
    "AND budat_mkpf < @so_buda2-low
    AND sakto IN @so_saknr
    AND bwart IN @so_bwart
    AND aufnr IN @so_aufnr
    AND sobkz IN @so_sobkz "HST 20190712
    GROUP BY
    tcode2_mkpf,
    aufnr,
    kostl,
    matnr,
    shkzg,
    "budat_mkpf,
    sakto,
    bwart,
    budat_mkpf,
    sobkz, "HST 20190712
    mblnr,
    mjahr.


*letzter eintrag auslesen

  "  ampel = '@08@'. Grün
  "  ampel = '@09@'. Gelb
  "  ampel = '@0A@'. Rot
  "  ampel = '@EB@'. Kein Licht


  LOOP AT gt_alv2 ASSIGNING FIELD-SYMBOL(<gs_alv>).
    IF <gs_alv>-budat < so_buda2-low.
      <gs_alv>-bemer = '1VOR'.
    ELSEIF <gs_alv>-budat > so_buda2-high.
      <gs_alv>-bemer = '3NACH'.
    ELSE.
      <gs_alv>-bemer = '2KRIT'.
    ENDIF.
    <gs_alv>-ampel = '@EB@'.
    IF <gs_alv>-shkzg = 'H'.
      <gs_alv>-beme2 = 'Abgang'.
      <gs_alv>-dmbtr = - <gs_alv>-dmbtr.
      <gs_alv>-menge = - <gs_alv>-menge.
      <gs_alv>-ampel = '@0A@'.
      "MODIFY gt_alv FROM gs_alv.
    ELSE.
      <gs_alv>-beme2 = 'Zugang'.
    ENDIF.
    APPEND <gs_alv> TO gt_alv.

  ENDLOOP.



  SORT gt_alv BY matnr budat bwart.



ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  SHOW_ALV
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
FORM show_alv.

  "Initialisierung
  DATA: lref_salv TYPE REF TO cl_salv_table,
        lr_layout TYPE REF TO cl_salv_layout,
        ls_key    TYPE salv_s_layout_key.
  DATA: lr_functions TYPE REF TO cl_salv_functions_list.
  DATA: lr_display TYPE REF TO cl_salv_display_settings.
* Titel
  DATA: lv_titel TYPE lvc_title.
* Sortierung und Aggregation
  DATA: lr_sorts TYPE REF TO cl_salv_sorts.
  DATA: lr_aggs TYPE REF TO cl_salv_aggregations.
* Feldkatalog ändern
  DATA: lr_columns TYPE REF TO cl_salv_columns_table,
        lr_column  TYPE REF TO cl_salv_column_table.

  DATA: lf_variant TYPE slis_vari.
  DATA: lo_events    TYPE REF TO cl_salv_events_table. "HST 20190712

* ALV aufbauen,
* lref_salv zeigt danach auf das Objekt,
* gt_alv ist die Tabelle, die als Info mitgegeben wird, wo die Daten zukünftig gespeichert werden.
  TRY.
      CALL METHOD cl_salv_table=>factory
        IMPORTING
          r_salv_table = lref_salv
        CHANGING
          t_table      = gt_alv.

      "HST 20190712 Beginn
      lo_events = lref_salv->get_event( ).

      SET HANDLER cl_event_handler=>on_before_salv_function FOR lo_events.
      SET HANDLER cl_event_handler=>on_after_salv_function FOR lo_events.
      SET HANDLER cl_event_handler=>on_added_function FOR lo_events.
      SET HANDLER cl_event_handler=>on_top_of_page FOR lo_events.
      SET HANDLER cl_event_handler=>on_end_of_page FOR lo_events.
      SET HANDLER cl_event_handler=>on_double_click FOR lo_events.
      SET HANDLER cl_event_handler=>on_link_click FOR lo_events.
      "HST 20190712 Ende

    CATCH cx_salv_msg .
  ENDTRY.

  "Die Keydaten werden gefüllt
  ls_key-report = sy-repid.
  "lr_layout zeigt auf das Layout des ALV
  lr_layout  = lref_salv->get_layout( ).
  "Layout erhält Keydaten: Program Name
  lr_layout->set_key( ls_key ).
  "Layout Speichern erlaubt (3 Werte möglich) User can save
  lr_layout->set_save_restriction( cl_salv_layout=>restrict_none ).
* Layout auf Kundenspezifisches Layout einstellen
  lr_layout->set_initial_layout( value = '/STANGL1' ).

*  IF sy-slset = 'CUS&Z_PPMDT_01'.
*    lr_layout->set_initial_layout( value = '/Z_PPMDT_TEL' ).
*  ENDIF.
  "lr_functions zeigt auf die Funktionen des ALV
  lr_functions = lref_salv->get_functions( ).
  "lr_functions einschalten
  "  lr_functions->set_default( ).      "minimal
  lr_functions->set_all( abap_true ). "Standard

  "Überschrift des Display einstellen
  gv_titel = 'Bewegungen'.
  CONCATENATE gv_titel ` - Zeitraum:   ` so_budat-low ' - ' so_budat-high INTO lv_titel.
  lr_display = lref_salv->get_display_settings( ).
  lr_display->set_list_header( lv_titel ).
  lr_display->set_striped_pattern( abap_true ).


  lr_columns = lref_salv->get_columns( ).
  lr_columns->set_optimize( abap_true ).

  TRY.

*    "Sort einstellen
*    lr_sorts = lref_salv->get_sorts( ).
*    lr_sorts->add_sort( columnname = 'NACHN' subtotal = abap_true ).
**
*    "Aggregation einstellen
*    lr_aggs = lref_salv->get_aggregations( ).
*    lr_aggs->add_aggregation( 'ZTAGE' ).
*    lr_aggs->add_aggregation( 'ZSTUN' ).

      lr_column ?= lr_columns->get_column( 'MENGE' ).
      lr_column->set_short_text( 'Menge').
      lr_column->set_medium_text( 'Menge').
      lr_column->set_long_text( 'Menge').
      "lr_column->set_output_length( '20' ).
      lr_column->set_sign( abap_true ).


      lr_column ?= lr_columns->get_column( 'DMBTR' ).
      "lr_column->set_output_length( '20' ).
      lr_column->set_sign( abap_true ).

*      lr_column ?= lr_columns->get_column( 'FAVOR' ).
*      lr_column->set_short_text( 'Not.Vorn').
*      lr_column->set_medium_text( 'Not.Vorname').
*      lr_column->set_long_text( 'Not.Vorname').
*      lr_column->set_output_length( '10' ).
*
*
*      lr_column ?= lr_columns->get_column( 'WERKS' ).
*      lr_column->set_visible( '' ).
*
*      lr_column ?= lr_columns->get_column( 'ORGEH' ).
*      lr_column->set_visible( '' ).
*
      lr_column ?= lr_columns->get_column( 'AMPEL' ).
      lr_column->set_short_text( 'Status').
      lr_column->set_medium_text( 'Status').
      lr_column->set_long_text( 'aktueller Status').
      lr_column->set_icon( abap_true ).

      "HST 20190712 Beginn
      lr_column ?= lr_columns->get_column( 'MBLNR' ).
      lr_column->set_cell_type( if_salv_c_cell_type=>hotspot ).

      lr_column ?= lr_columns->get_column( 'BWART' ).
      lr_column->set_cell_type( if_salv_c_cell_type=>hotspot ).

      lr_column ?= lr_columns->get_column( 'SOBKZ' ).
      lr_column->set_cell_type( if_salv_c_cell_type=>hotspot ).
      "HST 20190712 Ende

      lr_columns->set_column_position( columnname = 'AMPEL' position = 1 ).

**   set initial Layout

      lf_variant = 'DEFAULT'.
      lr_layout->set_initial_layout( lf_variant ).


    CATCH cx_salv_not_found.
      cl_demo_output=>display('Error' ).
    CATCH cx_salv_existing.
      cl_demo_output=>display('Error: Existence' ).
    CATCH cx_salv_data_error.
      cl_demo_output=>display('Error: Data' ).




  ENDTRY.

* Ausgabe
  lref_salv->display( ).
ENDFORM.

FORM f4_alv_variant  CHANGING p_var TYPE  rsvar-variant. "LIKE p_alvvar.
  DATA:variant  TYPE disvariant.

  variant-report = sy-repid.
  "variant-handle = '0001'.
  variant-username = sy-uname.
  CALL FUNCTION 'REUSE_ALV_VARIANT_F4'
    EXPORTING
      is_variant    = variant
      i_save        = 'A'
    IMPORTING
      es_variant    = variant
    EXCEPTIONS
      not_found     = 1
      program_error = 2
      OTHERS        = 3.
  CHECK sy-subrc = 0.
  p_var = variant-variant.
ENDFORM.                    " f4_alv_variant


*&---------------------------------------------------------------------*
*&      FORM call_transaction
*&---------------------------------------------------------------------*
*  Call standard transactions with authority check and progress indicator
*----------------------------------------------------------------------*
"HST 20190712
FORM call_transaction USING trx TYPE tcode.
  DATA: lv_message TYPE string.
  CONCATENATE 'Opening transaction' trx '...' INTO lv_message SEPARATED BY space. "#EC NOTEXT
  CALL FUNCTION 'AUTHORITY_CHECK_TCODE'
    EXPORTING
      tcode  = trx
    EXCEPTIONS
      ok     = 0
      not_ok = 1
      OTHERS = 2.
  IF sy-subrc NE 0.
    MESSAGE e172(00) WITH trx.
  ELSE.
    CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
      EXPORTING
        text = lv_message.
    CALL TRANSACTION trx AND SKIP FIRST SCREEN.
  ENDIF.
ENDFORM.  "call transaction

"HST 20190712
FORM display_document_fb03 TABLES gt_alv USING row TYPE salv_de_row column TYPE salv_de_column.

  gs_alv  = gt_alv[ row ].

  "SET PARAMETER ID: 'BLN' FIELD gs_alv-belnr.
  "SET PARAMETER ID: 'GJR' FIELD gs_alv-gjahr.

  PERFORM call_transaction USING 'FB03'.
  "BREAK-POINT.

ENDFORM.
"HST 20190712
FORM display_document TABLES gt_alv USING row TYPE salv_de_row column TYPE salv_de_column.
  "HST 20190712
  IF column EQ 'SOBKZ'.
    FIELD-SYMBOLS: <lv_sobkz> TYPE mseg-sobkz.
    ASSIGN COMPONENT column OF STRUCTURE gt_alv[ row ] TO <lv_sobkz>.
    PERFORM display_document_mb03 TABLES gt_alv USING row column.

  ELSEIF column EQ 'BWART'.
    PERFORM display_document_mb03 TABLES gt_alv USING row column.

  ELSE.
    PERFORM display_document_migo TABLES gt_alv USING row column.

  ENDIF.

ENDFORM.
FORM display_document_mb03 TABLES gt_alv USING row TYPE salv_de_row column TYPE salv_de_column.

  gs_alv  = gt_alv[ row ].

  SET PARAMETER ID: 'MBN' FIELD gs_alv-mblnr.
  SET PARAMETER ID: 'MJA' FIELD gs_alv-mjahr.

  PERFORM call_transaction USING 'MB03'.
  "BREAK-POINT.

ENDFORM.

FORM display_document_migo TABLES gt_alv USING row TYPE salv_de_row column TYPE salv_de_column.

  DATA: lv_mblnr TYPE mblnr,
        lv_mjahr TYPE mjahr.


  gs_alv  = gt_alv[ row ].

  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
    EXPORTING
      text = 'Opening transaction MIGO...'.             "#EC NOTEXT
  "Call MIGO in display mode; this contains the authorization checks
  lv_mblnr = gs_alv-mblnr. "to avoid type mismatch
  lv_mjahr = gs_alv-mjahr. "automatic cast here
  CALL FUNCTION 'MIGO_DIALOG'
    EXPORTING
      i_action            = 'A04'
      i_refdoc            = 'R02'
      i_notree            = 'X'
      i_no_auth_check     = ' '
      i_deadend           = 'X'
      i_skip_first_screen = 'X'
      i_okcode            = 'OK_GO'
      i_mblnr             = lv_mblnr
      i_mjahr             = lv_mjahr.



ENDFORM.


FORM display_document_div USING transaction TYPE ckmi1-awtyp
                            document TYPE ckmi1-awref
                            year TYPE ckmi1-aworg.
  DATA: lv_mblnr    TYPE mblnr,
        lv_mjahr    TYPE mjahr,
        lv_belnr    TYPE ck_belnr,
        lv_kjahr    TYPE ck_kjahr,
        lv_belnr_iv TYPE re_belnr, "invoice
        lv_belnr_am TYPE ko_belnr, "account maintenance
        lv_gjahr    TYPE gjahr,
        lv_belnr_s  TYPE aa_belnr. "settlement

  CASE transaction.
    WHEN 'MKPF'. "Material document
      "Progress bar for opening MIGO
      CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
        EXPORTING
          text = 'Opening transaction MIGO...'.             "#EC NOTEXT
      "Call MIGO in display mode; this contains the authorization checks
      lv_mblnr = document. "to avoid type mismatch
      lv_mjahr = year. "automatic cast here
      CALL FUNCTION 'MIGO_DIALOG'
        EXPORTING
          i_action            = 'A04'
          i_refdoc            = 'R02'
          i_notree            = 'X'
          i_no_auth_check     = ' '
          i_deadend           = 'X'
          i_skip_first_screen = 'X'
          i_okcode            = 'OK_GO'
          i_mblnr             = lv_mblnr
          i_mjahr             = lv_mjahr.
    WHEN 'RMRP'. "Invoice document
      DATA: lv_vgart TYPE vgart.
      lv_belnr_iv = document. "to avoid type mismatch
      lv_gjahr = year. "automatic cast here
      "Check the document type of the Invoice-Document
      SELECT SINGLE vgart FROM rbkp INTO lv_vgart
       WHERE belnr = lv_belnr_iv
         AND gjahr = lv_gjahr.
      IF sy-subrc <> 0. "Document has been archived
        MESSAGE e184(m8) WITH lv_belnr_iv lv_gjahr.
      ENDIF.
      "KP =	Account maintenance
      "KS = Account maintenance Reversal >> can be opened in MR11SHOW
      IF lv_vgart EQ 'KP' OR lv_vgart EQ 'KS'.
        lv_belnr_am = document.
        SET PARAMETER ID: 'KBN' FIELD lv_belnr_am,
                          'GJR' FIELD lv_gjahr.
        PERFORM call_transaction USING 'MR11SHOW'.
        "RS = credit memo
        "RD = logistisc invoice  >> can be opened in MR11SHOW
      ELSE.
        SET PARAMETER ID: 'RBN' FIELD lv_belnr_iv,
                          'GJR' FIELD lv_gjahr.
        PERFORM call_transaction USING 'MIR4'.
      ENDIF.
    WHEN 'PRCHG'. "Price change document
      lv_belnr = document. "to avoid type mismatch
      lv_kjahr = year. "automatic cast here
      SET PARAMETER ID: 'MLN' FIELD lv_belnr,
                        'MLJ' FIELD lv_kjahr.
      PERFORM call_transaction USING 'CKMPCD'.
    WHEN 'MLHD'. "Material ledger document
      lv_belnr = document. "to avoid type mismatch
      lv_kjahr = year. "automatic cast here
      SET PARAMETER ID: 'MLN' FIELD lv_belnr,
                        'MLJ' FIELD lv_kjahr.
      PERFORM call_transaction USING 'CKMB'.
    WHEN 'AUAK'. "Settlement document
      lv_belnr_s = document. "to avoid type mismatch
      SET PARAMETER ID: 'BLN' FIELD lv_belnr_s.
      PERFORM call_transaction USING 'KO8B'.
  ENDCASE.
ENDFORM.            "display_document