ZMM_M5MB – Lagerbestandswert zum Stichtag

Listen, die den Lagerbestandswert zum Stichtag ausgeben, haben eines der folgenden Probleme:

Kein Stichtag möglich

Nur Vorperiode

Nur Vorjahr

Keine aktuelle Bewertung

Unvollständig

Nur Summen

Fehler bei Verdichtung

Von SAP bei Verdichtung nicht zugelassen

Das Programm löst all diese Probleme.

Angemerkt sei, dass SAP bei steuerrechtlichen Werten (Hier 2) keine Historie kennt. Wird sie aus dem Stamm genommen, dann handelt es sich um die letzte Speicherung.

Steuerrechtliche Werte können mit MRN2 und MRN9 erzeugt werden.

Zusätzlich wird der Gesamtwert und der Bilanzwert ausgegeben.

Der Bilanzwert nimmt den steuerrechtlichen Wert bzw. den gleitenden Durchschnittspreis.

Der neue Gesamtwert ergibt sich aus Bilanzwert * mal Gesamtbestand.

Um die Differenz sind die Vorratskonten niedriger mit 31.12. zu bewerten, die Bewertung ist mit 1.1. wieder zu stornieren.

REPORT zmm_m5mb.

*Programm zur Anzeige Bestände MBEW und MBEWH und QBEW und QBEWH und EBEW und EBEWH
*Offen
* Abwertung über V_NIW6 und nicht fix programmiert
* Q Bestände nicht abwerten
*Version 006 HST20190802
* Steuerwert neu berechnen
* Korrektur Nachkommastellen bei niedrigen Preisen über Gesamtwert
*Version 005 HST20190801
* Materialtext ergänzt
* SteuerPreis1-3 Bewertungskreis verkleinern
* Bewertungsklasse statt Bewertungskreis in Anzeige
* Bewertungsklasse merken
*Version 004 HST20190730
* Korrektur PEINH
*Version 003 HST20190729
* ABWKZ eingefügt
*Version 002 HST20190717
* Materialklasse Selektion
* Warengruppe Selektion
* Steuerrechtlicher Wert
* Bilanzwert
* Normalbestand Umbau
* Sonderbestand Umbau
*Version 001 HST20190701
* Ausgabe als ALV List
* Analyse Flag
* Auslesen aller Dateien
* ALV Variant
* Umbau auf OO

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

TABLES: mseg, mara, mbew, makt.


SELECTION-SCREEN BEGIN OF BLOCK all WITH FRAME.

SELECTION-SCREEN BEGIN OF BLOCK aus WITH FRAME TITLE text-010.
SELECT-OPTIONS so_matnr FOR mseg-matnr DEFAULT '1050871007'.
"'0010011074'.
"'12-780-071-Z2'.  "'7227775030' DEFAULT '800000004*'. " '7277771163-2'.
SELECT-OPTIONS so_mtart FOR mara-mtart.                           "Materialart
SELECT-OPTIONS so_matkl FOR mara-matkl.                           "Warengruppe
SELECT-OPTIONS so_bklas FOR mbew-bklas.                           "Bewertungsklasse
PARAMETERS p_bwkey TYPE mbew-bwkey DEFAULT '1000' NO-DISPLAY.     "Bewertungskreis
"SELECT-OPTIONS so_bwart FOR mseg-bwart NO-DISPLAY.               "Bewegungsart
SELECT-OPTIONS so_budat FOR mseg-budat_mkpf. " NO-DISPLAY.        "Buchungsdatum
"SELECT-OPTIONS so_aufnr FOR mseg-aufnr NO-DISPLAY.               "Auftragsnummer

SELECTION-SCREEN SKIP.
"SELECT-OPTIONS so_saknr FOR mseg-sakto NO-DISPLAY.               "Sachkonten
SELECTION-SCREEN END OF BLOCK aus.

SELECTION-SCREEN BEGIN OF BLOCK opt WITH FRAME TITLE text-020.
"SELECT-OPTIONS so_buda2 FOR mseg-budat_mkpf. "NO-DISPLAY.        "Datum kritisch
PARAMETERS p_date TYPE sydats  DEFAULT '20181231'. "sy-datum NO-DISPLAY.    "Stichtagsdatum
PARAMETERS p_normal TYPE xfeld AS CHECKBOX DEFAULT abap_true.
PARAMETERS p_sonder TYPE xfeld AS CHECKBOX DEFAULT abap_true.     "Nur Sonderbestände
SELECT-OPTIONS so_sobkz FOR mseg-sobkz  MATCHCODE OBJECT h_t148.  "Sonderbestand
SELECTION-SCREEN SKIP.
PARAMETERS p_analys TYPE xfeld AS CHECKBOX DEFAULT abap_false.    "Analyse sichtbar (Keine Datenlöschung)
PARAMETERS p_visibl TYPE xfeld AS CHECKBOX DEFAULT abap_true.     "Zusatzinfo sichtbar


SELECTION-SCREEN END OF BLOCK opt.
SELECTION-SCREEN BEGIN OF BLOCK ausg WITH FRAME TITLE text-040.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(75) text-041.
SELECTION-SCREEN END OF LINE.
PARAMETERS p_steuer TYPE c DEFAULT '2'.                                       "Steuerr. Wert Auaswahl 1/2/3
PARAMETERS: p_orig   RADIOBUTTON GROUP g2,
            p_neuber RADIOBUTTON GROUP g2 DEFAULT 'X'.
SELECTION-SCREEN END OF BLOCK ausg.

SELECTION-SCREEN BEGIN OF BLOCK alv WITH FRAME TITLE text-015.

SELECTION-SCREEN COMMENT 1(60)  text-030 .
PARAMETERS p_var TYPE  slis_vari. "rsvar-variant. "slis_vari
SELECTION-SCREEN END OF BLOCK alv.
SELECTION-SCREEN END OF BLOCK all.

TYPES: BEGIN OF ty_alv,
         bemer(30) TYPE c,           "Bemerkung
         origi     TYPE c,           "Origin
         matnr     TYPE mbewh-matnr, "Materialnummer
         sobkz     TYPE mseg-sobkz,  "Sonderbestandskennzeichen
         pspnr     TYPE ps_psp_pnr,  "PSP Element
         "pspnr     type n length 8,
         "pspnr     type n,
         bwkey     TYPE mbewh-bwkey, "Bewertungskreis "HST20190801
         lbkum     TYPE mbewh-lbkum, "Menge
         salk3     TYPE mbewh-salk3, "Gesamtwert
         vprsv     TYPE mbewh-vprsv, "Preissteuerung
         peinha    TYPE mbewh-peinh, "Preiseinheit Historisch
         verpr     TYPE mbewh-verpr, "Gleitender Preis
         stprs     TYPE mbewh-stprs, "Standard Preis
         bklas     TYPE mbewh-bklas, "Bewertungsklasse
         lfgja     TYPE mbewh-lfgja, "Jahr
         lfmon     TYPE mbewh-lfmon, "Monat
         lvkey     TYPE i,           "Jahr Monat zusammen
         mtart     TYPE mara-mtart,  "Materialart
         matkl     TYPE mara-matkl,  "Warengruppe
         bwprs     TYPE mbew-bwprs,  "Steuerrechtlicher Preis 1
         bwps1     TYPE mbew-bwps1,  "Steuerrechtlicher Preis 2
         vjbws     TYPE mbew-vjbws,  "Steuerrechtlicher Preis 3
         bwprsa    TYPE mbew-bwprs,  "Steuerrechtlicher Preis ausgewählt
         bwprsas   TYPE mbew-salk3,  "Steuerrechtlicher Preis ausgewählt
         bwprsad   TYPE mbew-salk3,  "Differenz zu Steuerr. Wert
         bwprsb    TYPE mbew-bwprs,  "Bilanzwert Preis ausgewählt
         bwprsbs   TYPE mbew-salk3,  "Bilanzwert Preis ausgewählt
         bwprsbd   TYPE mbew-salk3,  "Differenz zu Bilanz Wert
         abwkz     TYPE mbew-abwkz,  "Abwertungskennziffer HST20190729
         peinh     TYPE mbew-peinh,  "Preiseinheit MBEW HST20190730
         maktx     TYPE makt-maktx,  "Kurztext HST20190801

         ampel(4)  TYPE c,           "Ampel

       END OF ty_alv.
TYPES:        ty_alv_table TYPE STANDARD TABLE OF ty_alv.
DATA: gt_alv  TYPE ty_alv_table, "Tabelle
      gs_alv  TYPE ty_alv,       "Struktur
      gt_alv2 TYPE ty_alv_table. "Zwischentabelle
DATA  gv_titel(50) TYPE c.        "Auswertungsüberschrift



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_mm03 TABLES gt_alv USING row column.
  ENDMETHOD.                    "on_double_click

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

CLASS application DEFINITION CREATE PRIVATE.

  PUBLIC SECTION.
    CLASS-METHODS f4_alv_variant.

    CLASS-METHODS init.

    CLASS-METHODS run.

    CLASS-METHODS collect_alv
      CHANGING gt_alv TYPE ty_alv_table.

    CLASS-METHODS show_alv
      CHANGING gt_alv TYPE ty_alv_table.


ENDCLASS.

CLASS application IMPLEMENTATION.


*&---------------------------------------------------------------------*
*&      FORM f4_alv_variant
*&---------------------------------------------------------------------*
*  Show all existing variants for alv grid
*----------------------------------------------------------------------*

  METHOD f4_alv_variant. "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.
  ENDMETHOD. "ENDFORM.                    " f4_alv_variant


*&---------------------------------------------------------------------*
*&      FORM init
*&---------------------------------------------------------------------*
*  Initialization before first screen
*----------------------------------------------------------------------*
  METHOD init.

    "CLEAR so_matnr[].
    "so_matnr-sign = 'I'.
    "so_matnr-option = 'CP'.
    "so_matnr-low = '40*'.
    "APPEND so_matnr TO so_matnr. "apppend so_matnr

    APPEND INITIAL LINE TO so_budat ASSIGNING FIELD-SYMBOL(<so_budat>).
    <so_budat>-sign = 'I'.
    <so_budat>-option = 'BT'.
    <so_budat>-low = '20150101'.
    <so_budat>-high = '20181231'.
*
*    APPEND INITIAL LINE TO so_buda2 ASSIGNING FIELD-SYMBOL(<so_buda2>).
*    <so_buda2>-sign = 'I'.
*    <so_buda2>-option = 'BT'.
*    <so_buda2>-low = '20180101'.
*    <so_buda2>-high = '20181231'.
*
*    "p_date = sy-datum - 60.

  ENDMETHOD.


*&---------------------------------------------------------------------*
*&      FORM run
*&---------------------------------------------------------------------*
*  Main Programm
*----------------------------------------------------------------------*

  METHOD run.
    application=>collect_alv( CHANGING gt_alv = gt_alv ).
    application=>show_alv( CHANGING gt_alv = gt_alv ).
  ENDMETHOD.


*&---------------------------------------------------------------------*
*&      FORM collect_alv
*&---------------------------------------------------------------------*
*  Collect and sort data for alv
*----------------------------------------------------------------------*
  METHOD collect_alv. "FORM collect_alv.
    " MBEWH, MBEW, QBEWH, QBEW, EBEWH, EBEW
    CLEAR gt_alv2[].
    DATA: lv_stich TYPE i.

    lv_stich = p_date(4) * 100 + p_date+4(2).

    "SELECT SINGLE pspnr FROM prps AS b INTO @DATA(lv_dat).

    DATA lv_dat TYPE prps-pspnr VALUE IS INITIAL.

    IF p_normal EQ abap_true.

      SELECT ' ' AS bemer , 'M' AS origi, a~matnr, 'n' AS sobkz,
        @lv_dat AS pspnr,
        a~bwkey, a~lbkum, a~salk3, a~vprsv, a~peinh, a~verpr, a~stprs, a~bklas, a~lfgja , a~lfmon
        ,       ( CAST( a~lfgja AS DEC ) * 100 + CAST( a~lfmon AS DEC )  ) AS lvkey
      FROM mbewh AS a APPENDING TABLE @gt_alv2
        WHERE a~matnr IN @so_matnr AND a~bwkey EQ @p_bwkey.

      SELECT ' ' AS bemer , 'M' AS origi, a~matnr, 'n' AS sobkz,
        @lv_dat AS pspnr,
        a~bwkey, a~lbkum, a~salk3, a~vprsv, a~peinh, a~verpr, a~stprs, a~bklas, a~lfgja , a~lfmon,
         ( CAST( a~lfgja AS DEC ) * 100 + CAST( a~lfmon AS DEC )  ) AS lvkey
      FROM mbew AS a APPENDING TABLE @gt_alv2
        WHERE a~matnr IN @so_matnr AND a~bwkey EQ @p_bwkey.

    ENDIF.

    IF p_sonder EQ abap_true.

      SELECT ' ' AS bemer , 'Q' AS origi, a~matnr, a~sobkz,
        a~pspnr,
        a~bwkey, a~lbkum, a~salk3, a~vprsv, a~peinh, a~verpr, a~stprs, a~bklas, a~lfgja , a~lfmon,
         ( CAST( a~lfgja AS DEC ) * 100 + CAST( a~lfmon AS DEC )  ) AS lvkey
      FROM qbewh AS a APPENDING TABLE @gt_alv2
        WHERE a~matnr IN @so_matnr AND a~bwkey EQ @p_bwkey.

      SELECT ' ' AS bemer , 'Q' AS origi, a~matnr, a~sobkz,
        a~pspnr,
        a~bwkey, a~lbkum, a~salk3, a~vprsv, a~peinh, a~verpr, a~stprs, a~bklas, a~lfgja , a~lfmon,
         ( CAST( a~lfgja AS DEC ) * 100 + CAST( a~lfmon AS DEC )  ) AS lvkey
      FROM qbew AS a APPENDING TABLE @gt_alv2
        WHERE a~matnr IN @so_matnr AND a~bwkey EQ @p_bwkey.

      SELECT ' ' AS bemer , 'E' AS origi, a~matnr, a~sobkz,
        @lv_dat AS pspnr,
        a~bwkey, a~lbkum, a~salk3, a~vprsv, a~peinh, a~verpr, a~stprs, a~bklas, a~lfgja , a~lfmon,
         ( CAST( a~lfgja AS DEC ) * 100 + CAST( a~lfmon AS DEC )  ) AS lvkey
      FROM ebewh AS a APPENDING TABLE @gt_alv2
        WHERE a~matnr IN @so_matnr AND a~bwkey EQ @p_bwkey.

      SELECT ' ' AS bemer , 'E' AS origi, a~matnr, a~sobkz,
        @lv_dat AS pspnr,
        a~bwkey, a~lbkum, a~salk3, a~vprsv, a~peinh, a~verpr, a~stprs, a~bklas, a~lfgja , a~lfmon,
         ( CAST( a~lfgja AS DEC ) * 100 + CAST( a~lfmon AS DEC )  ) AS lvkey
      FROM ebew AS a APPENDING TABLE @gt_alv2
        WHERE a~matnr IN @so_matnr AND a~bwkey EQ @p_bwkey.

    ENDIF.

    SORT gt_alv2 BY matnr origi pspnr lfgja DESCENDING lfmon DESCENDING.


    IF p_analys EQ abap_false.
      DELETE gt_alv2 WHERE lvkey > lv_stich.


      "Sortierung absteigend um Maximalwert zu finden
      DATA lv_new TYPE boolean.
      lv_new = abap_false.
      LOOP AT gt_alv2 ASSIGNING FIELD-SYMBOL(<gs_alv>).

        AT NEW matnr.
          lv_new = abap_true.
        ENDAT.
        AT NEW origi.
          lv_new = abap_true.
        ENDAT.
        AT NEW pspnr.
          lv_new = abap_true.
        ENDAT.
        IF lv_new = abap_true.
          lv_new = abap_false.
        ELSE.
          DELETE gt_alv2. " FROM <gs_alv>.
          "DELETE TABLE gt_alv2 FROM <gs_alv>.
        ENDIF.
      ENDLOOP.
    ENDIF.
    DATA:
      lv_mtart TYPE mara-mtart,
      lv_matkl TYPE mara-matkl,
      lv_bwprs TYPE mbew-bwprs,
      lv_bwps1 TYPE mbew-bwps1,
      lv_vjbws TYPE mbew-vjbws,
      lv_peinh TYPE mbew-peinh, "HST20190730
      lv_maktx TYPE makt-maktx, "HST20190801
      lv_abwkz TYPE mbew-abwkz.

    "Anreichern mit Materialart mtart, Warengruppe matkl, Steuerr. Werte 1-3
    LOOP AT gt_alv2 ASSIGNING <gs_alv>.
      AT NEW matnr.
        "SELECT SINGLE mtart, matkl FROM mara INTO ( @lv_mtart, @lv_matkl ) WHERE matnr EQ @<gs_alv>-matnr.
        "HST20190801
        SELECT SINGLE mtart, matkl, maktx FROM mara AS a INNER JOIN makt AS b ON a~matnr = b~matnr
          INTO ( @lv_mtart, @lv_matkl, @lv_maktx ) WHERE b~matnr EQ @<gs_alv>-matnr AND b~spras = 'DE'.
        CHECK sy-subrc = 0.
        SELECT SINGLE bwprs, bwps1, vjbws, abwkz, peinh FROM mbew INTO ( @lv_bwprs, @lv_bwps1, @lv_vjbws, @lv_abwkz, @lv_peinh )
          WHERE matnr EQ @<gs_alv>-matnr.
        CHECK sy-subrc = 0.
      ENDAT.
      "Materialart und Warengruppe anreichern
      <gs_alv>-mtart = lv_mtart.
      <gs_alv>-matkl = lv_matkl.
      "Steuerr. Werte anreichern
      <gs_alv>-bwprs = lv_bwprs.
      <gs_alv>-bwps1 = lv_bwps1.
      <gs_alv>-vjbws = lv_vjbws.
      <gs_alv>-peinh = lv_peinh. "HST20190730 Überschreiben des vorher geladenen Wertes
      <gs_alv>-abwkz = lv_abwkz.
      <gs_alv>-maktx = lv_maktx. "HST20190801


      CASE p_steuer.
        WHEN '1'.
          <gs_alv>-bwprsa   = lv_bwprs.
        WHEN '2'.
          <gs_alv>-bwprsa   = lv_bwps1.
        WHEN '3'.
          <gs_alv>-bwprsa   = lv_vjbws.
        WHEN OTHERS.

          EXIT.
      ENDCASE.

      "Steuerwert Berechnung
      "Bessere Lösung über V_NIW6
      IF p_neuber = 'X'.
        IF <gs_alv>-salk3 > 0. "HST20190802 Steuerwert neu berechnen, wenn Bestand (Wert) größer als 0.
          <gs_alv>-bwprsa = <gs_alv>-salk3 / <gs_alv>-lbkum * <gs_alv>-peinh * 1.

        ELSE. "Bei V Preis und S Preis den Einzelpreis nehmen, wenn kein Bestand da ist.
          IF <gs_alv>-vprsv = 'V'.
            <gs_alv>-bwprsa = <gs_alv>-verpr / 1. "GLD_PREIS.
          ELSE.
            <gs_alv>-bwprsa = <gs_alv>-stprs / 1. "Standard_PREIS.
          ENDIF.
        ENDIF.
        IF <gs_alv>-sobkz <> 'Q'.
          CASE <gs_alv>-abwkz.
            WHEN '3' OR '4'. "50% Abwertung
              <gs_alv>-bwprsa = <gs_alv>-bwprsa * 5 / 10.
            WHEN '5' OR '6'. "80% Abwertung
              <gs_alv>-bwprsa = <gs_alv>-bwprsa * 2 / 10.
            WHEN '7' OR '8' OR '9' OR '10'. "100% Abwertung
              <gs_alv>-bwprsa = 0.
            WHEN OTHERS. "Keine Abwertung
              "<gs_alv>-bwprsa = <gs_alv>-bwprsa.
          ENDCASE.
        ENDIF.

      ENDIF.
      "bwprsa Steuerwert Stück

      IF <gs_alv>-vprsv = 'V'.
        "Steuerwert Summe
        <gs_alv>-bwprsas = <gs_alv>-bwprsa * <gs_alv>-lbkum / <gs_alv>-peinh. "Steuerr. Wert Summe
        IF <gs_alv>-verpr = <gs_alv>-bwprsa. "Rundungsdifferenz soweit wie möglich retten
          <gs_alv>-bwprsas = <gs_alv>-salk3. "Steuerr. Wert Summe
        ENDIF.
        "Bilanzwert Berechnung
        "Bilanzwert, wegen Rundung keine Rechnung, salk3 ist genauer, kleiner Wert wird für Bilanz genommen
        IF <gs_alv>-bwprsa < <gs_alv>-verpr.   "Steuer kleiner als Bestand --> Steuer nehmen
          <gs_alv>-bwprsb = <gs_alv>-bwprsa.   "Bilanzwert Stück
          <gs_alv>-bwprsbs = <gs_alv>-bwprsas. "Bilanzwert Summe
        ELSE.                                  "Steuer größer als Bestand --> Bestand nehmen
          <gs_alv>-bwprsb = <gs_alv>-verpr.    "Bilanzwert Stück
          <gs_alv>-bwprsbs = <gs_alv>-salk3.   "Bilanzwert Summe
        ENDIF.

      ELSE.
        "Steuerwert Summe
        <gs_alv>-bwprsas = <gs_alv>-bwprsa * <gs_alv>-lbkum / <gs_alv>-peinh. "Steuerr. Wert Summe
        IF <gs_alv>-stprs = <gs_alv>-bwprsa. "Rundungsdifferenz soweit wie möglich retten
          <gs_alv>-bwprsas = <gs_alv>-salk3. "Steuerr. Wert Summe
        ENDIF.
        "Bilanzwert Berechnung
        "Bilanzwert, wegen Rundung keine Rechnung, salk3 ist genauer, kleiner Wert wird für Bilanz genommen
        IF <gs_alv>-bwprsa < <gs_alv>-stprs.   "Steuer kleiner als Bestand --> Steuer nehmen
          <gs_alv>-bwprsb = <gs_alv>-bwprsa.   "Bilanzwert Stück
          <gs_alv>-bwprsbs = <gs_alv>-bwprsas. "Bilanzwert Summe
        ELSE.                                  "Steuer größer als Bestand --> Bestand nehmen
          <gs_alv>-bwprsb = <gs_alv>-stprs.    "Bilanzwert Stück
          <gs_alv>-bwprsbs = <gs_alv>-salk3.   "Bilanzwert Summe
        ENDIF.
      ENDIF.
      <gs_alv>-bwprsbd = <gs_alv>-bwprsbs - <gs_alv>-salk3 . "Diff. Bilanz - Bestandswert
      <gs_alv>-bwprsad = <gs_alv>-bwprsas - <gs_alv>-salk3 . "Diff. Steuer - Bestandswert


      APPEND <gs_alv> TO gt_alv.
    ENDLOOP.


*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.



    "ENDFORM.                              "collect_alv


  ENDMETHOD.


*&---------------------------------------------------------------------*
*&      Form  SHOW_ALV
*&---------------------------------------------------------------------*
* Show and filter alv
*----------------------------------------------------------------------*
  METHOD show_alv. "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 = .
    CONCATENATE 'Bestandswerte - Zeitraum:   ' so_budat-low ' - ' so_budat-high ': Stichtag ' p_date
    INTO lv_titel RESPECTING BLANKS.
    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 ).
    lr_columns->set_key_fixation( ).

    TRY.

*    "Sort einstellen
        lr_sorts = lref_salv->get_sorts( ).
        lr_sorts->add_sort( columnname = 'MATNR' subtotal = abap_true ).
**
*    "Aggregation einstellen
        lr_aggs = lref_salv->get_aggregations( ).
        "lr_aggs->add_aggregation( 'DMBTR' ).
        "lr_aggs->add_aggregation( 'MENGE' ).

        lr_aggs->set_aggregation_before_items( 'X' ).

        "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( '' ).
*
*         bwprs     type mbew-bwprs,  "Steuerrechtlicher Preis 1
*         bwps1     type mbew-bwps1,  "Steuerrechtlicher Preis 2
*         vjbws     type mbew-vjbws,  "Steuerrechtlicher Preis 3
*         bwprsa    type mbew-bwprs,  "Steuerrechtlicher Preis ausgewählt
*         bwprsb    type mbew-bwprs,  "Bilanzwert Preis ausgewählt

*        lr_column ?= lr_columns->get_column( 'BWPRS' ).
*        lr_column->set_output_length( '1' ).
*
*        lr_column ?= lr_columns->get_column( 'BWPRS' ).
*        lr_column->set_output_length( '1' ).
*
*        lr_column ?= lr_columns->get_column( 'BWPRS' ).
*        lr_column->set_output_length( '1' ).
*

        PERFORM visible USING lr_columns 'BWPRS' p_visibl.  "
        PERFORM visible USING lr_columns 'BWPS1' p_visibl.  "
        PERFORM visible USING lr_columns 'VJBWS' p_visibl.  "
        PERFORM visible USING lr_columns 'MAKTX' p_visibl.  "
        PERFORM visible USING lr_columns 'BWKEY' p_visibl.  "

        "lr_column ?= lr_columns->get_column( 'BKLAS' ).

        lr_column ?= lr_columns->get_column( 'MATNR' ).
        lr_column->set_key( ).
        lr_column->set_key_presence_required( abap_true ).

        lr_column ?= lr_columns->get_column( 'BWPRSA' ).
        lr_column->set_short_text( 'Steuerr.W.').
        lr_column->set_medium_text( 'Steuerr.Wert').
        lr_column->set_long_text( 'Steuerrechtlicher Wert').

        lr_column ?= lr_columns->get_column( 'PEINHA' ).
        lr_column->set_short_text( '/ Hist.').
        lr_column->set_medium_text( 'Preiseinh. Hist.').
        lr_column->set_long_text( 'Preiseinheit Hist.').

        lr_column ?= lr_columns->get_column( 'BWPRSAD' ).
        lr_column->set_short_text( 'Diff.').
        lr_column->set_medium_text( 'Differenz').
        lr_column->set_long_text( 'Differenz').


        lr_column ?= lr_columns->get_column( 'BWPRSB' ).
        lr_column->set_short_text( 'Bilanzw.').
        lr_column->set_medium_text( 'Bilanzwert').
        lr_column->set_long_text( 'Bilanzwert').

        lr_column ?= lr_columns->get_column( 'BWPRSBD' ).
        lr_column->set_short_text( 'Diff.').
        lr_column->set_medium_text( 'Differenz').
        lr_column->set_long_text( 'Differenz').
        DATA: lv_color TYPE lvc_s_colo.
        lv_color-col = 3.
        lr_column->set_color( lv_color ).


        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( 'MATNR' ).
        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( p_var ).


      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.

    "Filter setzen
    DATA:
      lr_filters TYPE REF TO cl_salv_filters,
      lr_filter  TYPE REF TO cl_salv_filter,
      lv_low     TYPE salv_de_selopt_high,
      lv_high    TYPE salv_de_selopt_low,
      lv_sign    TYPE salv_de_selopt_sign,
      lv_option  TYPE salv_de_selopt_option.
    TRY.

*SELECT-OPTIONS so_mtart FOR mara-mtart.                           "Materialart
*SELECT-OPTIONS so_matkl FOR mara-matkl.                           "Warengruppe
*SELECT-OPTIONS so_bklas FOR mbew-bklas.                           "Bewertungsklasse


        lr_filters = lref_salv->get_filters( ).
        "Filter mtart
        IF so_mtart IS NOT INITIAL.
          lv_low = so_mtart-low.
          lv_high = so_mtart-high.
          lv_sign = so_mtart-sign.
          lv_option = so_mtart-option.
          lr_filter = lr_filters->add_filter(
            columnname = 'MTART'
            sign       = lv_sign
            option     = lv_option
            low        = lv_low
            high       = lv_high ).
        ENDIF.
        "Filter matkl
        IF so_matkl IS NOT INITIAL.
          lv_low = so_matkl-low.
          lv_high = so_matkl-high.
          lv_sign = so_matkl-sign.
          lv_option = so_matkl-option.
          lr_filter = lr_filters->add_filter(
            columnname = 'MATKL'
            sign       = lv_sign
            option     = lv_option
            low        = lv_low
            high       = lv_high ).
        ENDIF.
        "Filter bklas
        IF so_bklas IS NOT INITIAL.
          lv_low = so_bklas-low.
          lv_high = so_bklas-high.
          lv_sign = so_bklas-sign.
          lv_option = so_bklas-option.
          lr_filter = lr_filters->add_filter(
            columnname = 'BKLAS'
            sign       = lv_sign
            option     = lv_option
            low        = lv_low
            high       = lv_high ).
        ENDIF.


        "lr_filter = lr_filters->get_filter( 'SHKZG' ).
        "lr_filter->add_selopt( low = 'S' ).
      CATCH cx_salv_not_found cx_salv_data_error cx_salv_existing. "#EC NO_HANDLER
        cl_demo_output=>display('Error' ).
    ENDTRY.


* Ausgabe
    lref_salv->display( ).
    "ENDFORM.                              "show_alv
  ENDMETHOD.

ENDCLASS.


"Unterprogramm von show_alv
FORM visible
   USING
         lr_columns TYPE REF TO cl_salv_columns_table
         lv_column
         lv_visibl .
  DATA lr_column  TYPE REF TO cl_salv_column_table.

  TRY.
      lr_column ?= lr_columns->get_column( lv_column ).
      IF lv_visibl IS INITIAL.
        lr_column->set_visible( '' ).
      ELSE."Zusatzinfo / Spalte sichtbar
        lr_column->set_visible( abap_true ).
      ENDIF.
    CATCH cx_salv_not_found.
      cl_demo_output=>display('Error' ).
  ENDTRY.
ENDFORM.

*&---------------------------------------------------------------------*
*&      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


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


  TRY.
      gs_alv  = gt_alv[ row ].

      SET PARAMETER ID: 'MAT' FIELD gs_alv-matnr.

      PERFORM call_transaction USING 'MM03'.
      "BREAK-POINT.
    CATCH cx_sy_itab_line_not_found.

      cl_demo_output=>display('Einzelzeile MATNR auswählen' ).
      "cl_abap_browser=>show_html( html = VALUE #( ( 'Einzelzeile MATNR auswählen' ) ) ).
  ENDTRY.
ENDFORM.



AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_var.
  application=>f4_alv_variant( ). "PERFORM f4_alv_variant USING p_var.

INITIALIZATION.
  application=>init( ). "  PERFORM init.


AT SELECTION-SCREEN OUTPUT.

  LOOP AT SCREEN.
    IF screen-name = 'P_DATE'.
      "      screen-input = 1.
      "      screen-invisible = 1.
      "      screen-active = 1.
      MODIFY SCREEN.
    ENDIF.
  ENDLOOP.


AT SELECTION-SCREEN.
*  IF p_steuer NE '0'.
*    p_sonder = ' '.
*    "modify screen.
*  ENDIF.

START-OF-SELECTION.
  application=>run( ).
  EXIT.