ZFI_CHECKSKONTO Skonto von AP Kreditorenbelegen

Typischerweise wird im FI/AP bei Skontobuchungen von Lieferanten auf das Skontokonto gebucht.

Bei aktiver Anlagenbuchhaltung wird der Skonto aber nicht auf das Skontokonto, sondern auf das Anlagenkonto gebucht und vermindert den Anschaffungswert der Anlage.

Ähnlicher Effekt wird durch das Nettoverfahren erzielt, die bei der Belegart hinterlegt wird.

Für das Nettoverfahren sind neben der eigenen Belegart auch ein Konto für die Skontoverrechnung und ein Konto für Skontoverluste einzutragen und das System entsprechend zu konfigurieren.

Um herauszubekommen, welche Skontobeträge auf das Skonto beim Bruttoverfahren geflossen sind, muss die Zahlung der Rechnung auf das Konto des Skontos untersucht werden.

Untiges Analyseprogramm erledigt diese Aufgabe.

Mit Detail können die Detailinformationen angezeigt werden.

Mit Summe wird eine Summe pro Konto erzeugt und eine Gesamtsumme.

Mit Alle werden alle Belege eines Kontos angeführt, und angezeigt, bei welchen ein Skonto erfolgte. Ohne Alle werden nur die Belege eines Kontos angeführt, bei denen tatsächlich ein Skonto bei der Zahlung abgezogen wurde.

REPORT zfi_checkskonto.
CONSTANTS p_debug VALUE 0.  "0 Kein Debug 1 Debug
************************************************************************
* Dipl.Ing.J.Stangl
************************************************************************
* Version 002: 20191107 Grid
* Version 001: 20191030 First Version
* Anzeige aller Belege, die Anlagenkonten betreffen und mit Skonto gezahlt wurden.
* p_summe Nur bei ALV List
* p_detail Nur bei ALV List
* p_alle Alle Daten egal ob mit Skonto oder ohne
* p_grid ALV Grid / ALV List

TABLES: bseg, bkpf.

TYPES: BEGIN OF ty_alv,
         bukrs     TYPE bseg-bukrs,
         gjahr     TYPE bseg-gjahr,
         hkont     TYPE bseg-hkont,
         belnr     TYPE bseg-belnr,
         buzei     TYPE bseg-buzei,
         budat     TYPE bkpf-budat,
         blart     TYPE bkpf-blart,
         dmbtr     TYPE bseg-dmbtr,
         shkzg     TYPE bseg-shkzg,
         mwskz     TYPE bseg-mwskz, "MWSKZ Konto
         zbd1p     TYPE bseg-zbd1p,
         lifnr     TYPE bseg-lifnr,
         augdt     TYPE bseg-augdt, "Ausgleichsdatum
         augbl     TYPE bseg-augbl, "Ausgleichsbeleg
         gjahrz    TYPE bseg-gjahr,
         belnrz    TYPE bseg-belnr, "Zahlungsbeleg
         dmbtrz    TYPE bseg-dmbtr, "Kreditorsumme Brutto
         hkonts    TYPE bseg-hkont,
         shkzgs    TYPE bseg-shkzg,
         dmbtrs    TYPE bseg-dmbtr, "Skonto gesamt Netto
         mwskzs    TYPE bseg-mwskz, "MWSKZ Zahlung
         dmbtra    TYPE bseg-dmbtr, "Skonto anteilig Netto
         bemer(40) TYPE c,
       END OF ty_alv.

TYPES: ty_alv_t TYPE STANDARD TABLE OF ty_alv.
DATA: gt_alv TYPE ty_alv_t.
DATA: gs_alv TYPE ty_alv.

"DATA: gref_salv TYPE REF TO cl_salv_table.

PARAMETERS: p_bukrs LIKE bseg-bukrs DEFAULT '1000'.
SELECT-OPTIONS: so_budat FOR bkpf-budat. "DEFAULT '20180101'.
SELECT-OPTIONS: so_hkont FOR bseg-hkont.
SELECT-OPTIONS: so_gjahr FOR bseg-gjahr. "DEFAULT '2018'.
"PARAMETERS: p_gjahr LIKE bseg-gjahr DEFAULT '2018'.
SELECT-OPTIONS: so_hkon2 FOR bseg-hkont DEFAULT '5800'. "Skontokonto
PARAMETERS: p_grid AS CHECKBOX DEFAULT 'X'.
PARAMETERS: p_alle AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN SKIP.
PARAMETERS: p_detail AS CHECKBOX DEFAULT 'X'.
PARAMETERS: p_summe AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN SKIP.
PARAMETERS p_var TYPE  slis_vari DEFAULT '/DEFAULT'. "rsvar-variant. "slis_vari

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_document TABLES gt_alv USING row column.
  ENDMETHOD.                    "on_link_click
ENDCLASS.                    "cl_event_handler IMPLEMENTATION


INITIALIZATION.
  so_hkont-sign = 'I'.
  so_hkont-option = 'BT'.
  so_hkont-low = '1'.
  so_hkont-high = '699'.
  APPEND so_hkont.
  so_hkont-sign = 'I'.
  so_hkont-option = 'BT'.
  so_hkont-low = '701'.
  so_hkont-high = '999'.
  APPEND so_hkont.
  so_budat-sign = 'I'.
  so_budat-option = 'BT'.
  so_budat-low = '20150101'.
  so_budat-high = '20191231'.
  APPEND so_budat.
  so_gjahr-sign = 'I'.
  so_gjahr-option = 'BT'.
  so_gjahr-low = '2015'.
  so_gjahr-high = '2019'.
  APPEND so_gjahr.

AT SELECTION-SCREEN.

START-OF-SELECTION.

  PERFORM collect_data.
  PERFORM show_data.

  EXIT.
FORM collect_data.


  "1 Suchen der passenden Sachkontenzeilen betreffend Anlagen (ausgegl. und nicht ausgeglichen)
  "2 Suchen der passenden Kreditorenzeilen über Belegnummer (hier sind die ausgeglichenen von Belang)
  "3 Suchen der passenden Sachkontenzeilen über Ausgleichsbelegnummer (hier sind die ausgeglichenen Kreditoren wichtig)
  "4 Suchen der passenden Hauptbuchzahlung über Belegnummer (hier sind die Skonto nicht ausgeglichenen von Belang)

  "1
  SELECT a~belnr, a~buzei, a~gjahr, a~bukrs, a~hkont, a~budat, a~shkzg, a~dmbtr, a~blart, a~mwskz FROM bsis AS a INNER JOIN
    bkpf AS b
  ON
    a~belnr = b~belnr AND
    a~gjahr = b~gjahr AND
    a~bukrs = b~bukrs
    INTO CORRESPONDING FIELDS OF TABLE  @gt_alv WHERE
  a~bukrs = @p_bukrs AND
  a~gjahr IN @so_gjahr AND
  a~hkont IN @so_hkont AND
  a~budat IN @so_budat
  "and exists ( select 1 from bkpf as b where a~belnr = b~belnr and a~gjahr = b~gjahr )
  .

  SELECT a~belnr, a~buzei, a~gjahr, a~bukrs, a~hkont, a~budat, a~shkzg, a~dmbtr FROM bsas AS a INNER JOIN
    bkpf AS b
  ON
    a~belnr = b~belnr AND
    a~gjahr = b~gjahr AND
    a~bukrs = b~bukrs
    APPENDING CORRESPONDING FIELDS OF TABLE  @gt_alv WHERE
  a~bukrs = @p_bukrs AND
  a~gjahr IN @so_gjahr AND
  a~hkont IN @so_hkont AND
  a~budat IN @so_budat
  .


  DATA: lv_lifnr LIKE bsak-lifnr,
        lv_augbl LIKE bsak-augbl.




  "2
  LOOP AT gt_alv ASSIGNING FIELD-SYMBOL(<wa_alv>).
    SELECT SINGLE lifnr,  augbl, augdt, zbd1p FROM bsak "Ausgeglichene Kreditoren
    INTO ( @<wa_alv>-lifnr, @<wa_alv>-augbl, @<wa_alv>-augdt, @<wa_alv>-zbd1p )
    WHERE
    gjahr = @<wa_alv>-gjahr AND
    belnr = @<wa_alv>-belnr AND
    bukrs = @<wa_alv>-bukrs.
  ENDLOOP.


  IF p_debug EQ 1.
    WRITE: 'GJ   BELNR      BUDAT      HKONT                   HW    LIFNR      AUSGLBELNR ZAHL BELNR'.
    LOOP AT gt_alv ASSIGNING <wa_alv>.
      WRITE : / <wa_alv>-gjahr,  <wa_alv>-belnr, <wa_alv>-budat, <wa_alv>-hkont, <wa_alv>-dmbtr, <wa_alv>-shkzg(1), <wa_alv>-lifnr, <wa_alv>-augbl.
    ENDLOOP.

    WRITE: /.
  ENDIF.


  "3
  LOOP AT gt_alv ASSIGNING <wa_alv> WHERE augbl IS NOT INITIAL.
    SELECT SINGLE belnr, gjahr, dmbtr FROM bsas "Zahlungen
      INTO ( @<wa_alv>-belnrz, @<wa_alv>-gjahrz, @<wa_alv>-dmbtrz )
      WHERE
      "gjahr = @<wa_alv>-gjahr AND
      augbl = @<wa_alv>-augbl AND
      augdt = @<wa_alv>-augdt AND
      bukrs = @<wa_alv>-bukrs AND
      belnr NE @<wa_alv>-belnr. "Zahlungsbeleg, nicht den zu zahlenden Beleg

*    CHECK sy-subrc EQ 4.
*    SELECT SINGLE hkont, dmbtr, shkzg FROM bsas "Zahlungen
*      INTO ( @<wa_alv>-hkonts, @<wa_alv>-dmbtrs, @<wa_alv>-shkzgs )
*      WHERE
*      "gjahr = @<wa_alv>-gjahr AND
*      augbl = @<wa_alv>-augbl AND
*      augdt = @<wa_alv>-augdt and
*      bukrs = @<wa_alv>-bukrs AND
*      hkont IN @so_hkon2.
  ENDLOOP.


  "4
  LOOP AT gt_alv ASSIGNING <wa_alv> WHERE augbl IS NOT INITIAL.
    SELECT SINGLE hkont, dmbtr, shkzg, mwskz FROM bsis "Zahlungen
      INTO ( @<wa_alv>-hkonts, @<wa_alv>-dmbtrs, @<wa_alv>-shkzgs, @<wa_alv>-mwskzs  )
      WHERE
      "gjahr = @<wa_alv>-gjahr AND
      belnr = @<wa_alv>-belnrz AND
      gjahr = @<wa_alv>-gjahrz AND
      bukrs = @<wa_alv>-bukrs AND
      hkont IN @so_hkon2.
*    CHECK sy-subrc EQ 4.
*    SELECT SINGLE hkont, dmbtr, shkzg FROM bsas "Zahlungen
*      INTO ( @<wa_alv>-hkonts, @<wa_alv>-dmbtrs, @<wa_alv>-shkzgs )
*      WHERE
*      "gjahr = @<wa_alv>-gjahr AND
*      augbl = @<wa_alv>-augbl AND
*      augdt = @<wa_alv>-augdt AND
*      bukrs = @<wa_alv>-bukrs AND
*      hkont IN @so_hkon2.
    IF sy-subrc EQ 0.
      CASE <wa_alv>-mwskzs.
        WHEN 'V0' OR 'E2' OR 'E1' OR 'E0'.
          <wa_alv>-dmbtra = <wa_alv>-dmbtr / <wa_alv>-dmbtrz * <wa_alv>-dmbtrs.
        WHEN 'V9' OR 'R2'.
          <wa_alv>-dmbtra = <wa_alv>-dmbtr / <wa_alv>-dmbtrz * <wa_alv>-dmbtrs.
          <wa_alv>-bemer = 'Kontrollieren'.
        WHEN 'V1'.
          <wa_alv>-dmbtra = <wa_alv>-dmbtr / <wa_alv>-dmbtrz * <wa_alv>-dmbtrs * '1.1' .
        WHEN 'V2'.
          <wa_alv>-dmbtra = <wa_alv>-dmbtr / <wa_alv>-dmbtrz * <wa_alv>-dmbtrs * '1.2'.
        WHEN OTHERS.
          <wa_alv>-dmbtra = 0.
          <wa_alv>-bemer = 'Kontrollieren'. "dmbtr / <wa_alv>-dmbtrz * <wa_alv>-dmbtrs.

      ENDCASE.
    ENDIF.
    "Haben Buchungen mit Minus versehen
    IF <wa_alv>-shkzg = 'H'.
      <wa_alv>-dmbtr = - <wa_alv>-dmbtr.
      <wa_alv>-dmbtrz = - <wa_alv>-dmbtrz.
    ENDIF.
    IF <wa_alv>-shkzgs = 'H'.
      <wa_alv>-dmbtrs = - <wa_alv>-dmbtrs.
      <wa_alv>-dmbtra = - <wa_alv>-dmbtra.
    ENDIF.
  ENDLOOP.

  "Sort / Filter  / Delete
  SORT gt_alv BY gjahr hkont belnr buzei.
  DELETE gt_alv WHERE augbl IS INITIAL.
  IF p_alle IS INITIAL.
    DELETE gt_alv WHERE hkonts IS INITIAL.
  ENDIF.

ENDFORM.

FORM show_list. "ALV List


  "DATA: lv_summe TYPE decfloat34.
  "DATA: lv_summe2 TYPE decfloat34.
  DATA: lv_summe TYPE p DECIMALS 2.
  DATA: lv_summe2 TYPE p DECIMALS 2.
  DATA: lv_summe3 TYPE p DECIMALS 2.
  DATA: lv_summe4 TYPE p DECIMALS 2.

  lv_summe = 0.
  lv_summe2 = 0.
  lv_summe3 = 0.
  lv_summe4 = 0.
  IF p_detail EQ 'X'.
    WRITE: 'GJ   BELNR      POS BUDAT      BL HKONT              HW              LIFNR BELNRA     DATUM      GJZ  BELNRZ                  HW  HKONT                   HW                    HW    '.
  ENDIF.

  LOOP AT gt_alv ASSIGNING FIELD-SYMBOL(<wa_alv>). " WHERE augbl IS NOT INITIAL.
    "IF ( <wa_alv>-hkont IS NOT INITIAL OR p_alle = 'X' ).
    IF p_detail = 'X'.
      WRITE : / <wa_alv>-gjahr,  <wa_alv>-belnr, <wa_alv>-buzei, <wa_alv>-budat, (2) <wa_alv>-blart,
      (5) <wa_alv>-hkont, <wa_alv>-dmbtr, <wa_alv>-shkzg(1), (2) <wa_alv>-mwskz, <wa_alv>-zbd1p,
      (5) <wa_alv>-lifnr, <wa_alv>-augbl, <wa_alv>-augdt, <wa_alv>-gjahrz, <wa_alv>-belnrz, <wa_alv>-dmbtrz,
      <wa_alv>-hkonts, <wa_alv>-dmbtrs, <wa_alv>-shkzgs(1), <wa_alv>-mwskzs, <wa_alv>-dmbtra, (30) <wa_alv>-bemer.
    ENDIF.
    IF <wa_alv>-shkzg = 'S'.
      lv_summe = lv_summe + <wa_alv>-dmbtr.
    ELSE.
      lv_summe = lv_summe - <wa_alv>-dmbtr.
    ENDIF.
    "ENDIF.
    AT END OF belnr.
      "IF ( <wa_alv>-hkont IS NOT INITIAL OR p_alle = 'X' ).

      IF <wa_alv>-shkzgs = 'S'.
        lv_summe2 = lv_summe2 + <wa_alv>-dmbtra.
      ELSE.
        lv_summe2 = lv_summe2 - <wa_alv>-dmbtra.
      ENDIF.
      "ENDIF.
      AT END OF hkont.
        "IF ( lv_summe2 NE 0 ).
        IF p_summe = 'X'.
          WRITE: /'                        Summe:   ', <wa_alv>-hkont, (11) lv_summe, (122) lv_summe2.
          lv_summe3 = lv_summe3 + lv_summe.
          lv_summe4 = lv_summe4 + lv_summe2.
          lv_summe = 0.
          lv_summe2 = 0.
        ENDIF.
        "ENDIF.
      ENDAT.


    ENDAT.
  ENDLOOP.
  IF p_summe = 'X'.
    WRITE: /'                        Summe:    ', (21) lv_summe3, (122) lv_summe4.
  ENDIF.

ENDFORM.

FORM show_grid. "ALV Grid

  "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: lo_events    TYPE REF TO cl_salv_events_table. "HST 20190712

* Sortierung und Aggregation
  DATA: lr_sorts TYPE REF TO cl_salv_sorts.
  DATA: lr_aggs TYPE REF TO cl_salv_aggregations.


* ALV aufbauen,
* lref_salv zeigt danach auf das Objekt,
* gt_alv_pers 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 .
      cl_demo_output=>display('Error' ).
  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
*  IF sy-slset = 'CUS&Z_PPMDT_01'.
  lr_layout->set_initial_layout( value = p_var )."Kein Zusammenziehen und Optimierung über Layoutvariante
*  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

* Feldkatalog ändern
  DATA: lr_columns TYPE REF TO cl_salv_columns_table,
        lr_column  TYPE REF TO cl_salv_column_table.

  lr_columns = lref_salv->get_columns( ).
  "lr_columns->set_optimize( abap_true )."Nicht in Kombination mit Outputlength

  TRY.

*         bukrs     TYPE bseg-bukrs,
*         gjahr     TYPE bseg-gjahr,
*         hkont     TYPE bseg-hkont,
*         belnr     TYPE bseg-belnr,
*         buzei     TYPE bseg-buzei,
*         budat     TYPE bkpf-budat,
*         blart     type bkpf-blart,
*         dmbtr     TYPE bseg-dmbtr,
*         shkzg     TYPE bseg-shkzg,
*         mwskz     TYPE bseg-mwskz, "MWSKZ Konto
*         zbd1p     type bseg-zbd1p,
*         lifnr     TYPE bseg-lifnr,
*         augdt     TYPE bseg-augdt, "Ausgleichsdatum
*         augbl     TYPE bseg-augbl, "Ausgleichsbeleg
*         gjahrz    TYPE bseg-gjahr,
*         belnrz    TYPE bseg-belnr, "Zahlungsbeleg
*         dmbtrz    TYPE bseg-dmbtr, "Kreditorsumme Brutto
*         hkonts    TYPE bseg-hkont,
*         shkzgs    TYPE bseg-shkzg,
*         dmbtrs    TYPE bseg-dmbtr, "Skonto gesamt Netto
*         mwskzs    TYPE bseg-mwskz, "MWSKZ Zahlung
*         dmbtra    TYPE bseg-dmbtr, "Skonto anteilig Netto
*         bemer(40) TYPE c,


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

      lr_aggs->set_aggregation_before_items( 'X' ).


      lr_column ?= lr_columns->get_column( 'BUKRS' ).
      lr_column->set_short_text( 'BU').
      lr_column->set_output_length('04').
      lr_column ?= lr_columns->get_column( 'BELNR' ).
      lr_column->set_short_text( 'BELNR').
      lr_column->set_output_length('05').
      lr_column ?= lr_columns->get_column( 'GJAHR' ).
      lr_column->set_short_text( 'GJ').
      lr_column->set_output_length('04').
      lr_column->set_cell_type( if_salv_c_cell_type=>hotspot ).
      lr_column ?= lr_columns->get_column( 'HKONT' ).
      lr_column->set_short_text( 'KTO').
      lr_column->set_output_length('04').
      lr_column ?= lr_columns->get_column( 'BELNR' ).
      lr_column->set_short_text( 'BELNR').
      lr_column->set_output_length('10').
      lr_column->set_cell_type( if_salv_c_cell_type=>hotspot ).
      lr_column ?= lr_columns->get_column( 'BUZEI' ).
      lr_column->set_short_text( 'P').
      lr_column->set_output_length('01').
      lr_column ?= lr_columns->get_column( 'BLART' ).
      lr_column->set_short_text( 'BA').
      lr_column->set_output_length('02').
      lr_column ?= lr_columns->get_column( 'SHKZG' ).
      lr_column->set_short_text( 'V').
      lr_column->set_output_length('01').
      lr_column ?= lr_columns->get_column( 'MWSKZ' ).
      lr_column->set_short_text( 'MW').
      lr_column->set_output_length('02').
      lr_column ?= lr_columns->get_column( 'MWSKZS' ).
      lr_column->set_short_text( 'MW').
      lr_column->set_output_length('02').
      lr_column ?= lr_columns->get_column( 'AUGBL' ).
      lr_column->set_short_text( 'BEL.A').
      lr_column->set_output_length('10').
      lr_column->set_cell_type( if_salv_c_cell_type=>hotspot ).
      lr_column ?= lr_columns->get_column( 'AUGDT' ).
      lr_column->set_cell_type( if_salv_c_cell_type=>hotspot ).
      lr_column ?= lr_columns->get_column( 'LIFNR' ).
      lr_column->set_short_text( 'LIFNR').
      lr_column->set_medium_text( 'Lieferant').
      lr_column->set_long_text( 'Lieferant').
      lr_column->set_output_length('3').
      lr_column->set_alignment( if_salv_c_alignment=>right ). "salv_de_alignment->right ).
      lr_column ?= lr_columns->get_column( 'BELNRZ' ).
      lr_column->set_short_text( 'BEL.Z').
      lr_column->set_medium_text( 'Belegnr.Zahlung').
      lr_column->set_long_text( 'Belegnummer Zahlung').
      lr_column->set_output_length('10').
      lr_column ?= lr_columns->get_column( 'GJAHRZ' ).
      lr_column->set_short_text( 'GJ').
      lr_column->set_output_length('04').
      lr_column->set_cell_type( if_salv_c_cell_type=>hotspot ).
      lr_column ?= lr_columns->get_column( 'BELNRZ' ).
      lr_column->set_cell_type( if_salv_c_cell_type=>hotspot ).
      lr_column ?= lr_columns->get_column( 'DMBTRZ' ).
      lr_column->set_short_text( 'Betr.HW.Z.').
      lr_column->set_medium_text( 'Betrag HW Zahlung').
      lr_column->set_long_text( 'Betrag Hauswährung Zahlung').
      lr_column->set_sign( abap_true ).
      lr_column ?= lr_columns->get_column( 'HKONTS' ).
      lr_column->set_short_text( 'KTO').
      lr_column->set_output_length('4').
      lr_column ?= lr_columns->get_column( 'SHKZGS' ).
      lr_column->set_short_text( 'V').
      lr_column->set_output_length('1').
      lr_column ?= lr_columns->get_column( 'DMBTRS' ).
      lr_column->set_short_text( 'Betr.HW.S.').
      lr_column->set_medium_text( 'Betrag HW Skonto').
      lr_column->set_long_text( 'Betrag Hauswährung Skonto').
      lr_column->set_sign( abap_true ).
      lr_column ?= lr_columns->get_column( 'DMBTRA' ).
      lr_column->set_short_text( 'Betr.HW.A.').
      lr_column->set_medium_text( 'Betrag HW Anteilig').
      lr_column->set_long_text( 'Betrag Hauswährung Anteilig').
      lr_column->set_sign( abap_true ).
      "lr_column->set_cell_type( if_salv_c_cell_type=>hotspot ).
      "lr_column->set_icon( abap_true ).

      lr_columns->set_column_position( columnname = 'MWSKZS' position = 12 ).
      lr_columns->set_column_position( columnname = 'DMBTRA' position = 13 ).


      "PERFORM visible USING lr_columns 'PERSK' p_visibl.  "Personenkreis/Mitarbeitergruppe
      "PERFORM visible USING lr_columns 'PERSG' p_visibl.  "Personengruppe/Mitarbeitergruppe
      "PERFORM visible USING lr_columns 'ABKRS' p_visibl.  "Abrechnungskreis
      "PERFORM visible USING lr_columns 'BTRTL' p_visibl.  "Teilbereich
      "PERFORM visible USING lr_columns 'TEILK' p_visibl.  "Teilzeitkennzeichen


    CATCH cx_salv_not_found cx_salv_data_error cx_salv_existing. "#EC NO_HANDLER
      cl_demo_output=>display('Error' ).


*    CATCH cx_salv_not_found.
*      cl_demo_output=>display('Error' ).
  ENDTRY.

* Ausgabe
  lref_salv->display( ).
ENDFORM.

"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.
        lr_column->set_visible( abap_true ).
      ENDIF.
    CATCH cx_salv_not_found.
      cl_demo_output=>display('Error' ).
  ENDTRY.
ENDFORM.
FORM show_data.
  IF p_grid = 'X'. "Dialog Output
    PERFORM show_grid.
  ELSE. "ALV Output
    PERFORM show_list.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*&      FORM call_transaction
*&---------------------------------------------------------------------*
*  Call standard transactions with authority check and progress indicator
*----------------------------------------------------------------------*
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_document TABLES gt_alv USING row TYPE salv_de_row column TYPE salv_de_column.

  TRY.
      gs_alv  = gt_alv[ row ].

*      IF p_zusatz EQ abap_true.
*
*        cl_abap_browser=>show_html( html = VALUE cl_abap_browser=>html_table(
*                                                    ( '<html><body><basefont face="arial">' )
*                                                    ( |Belegnummer: | && gs_alv-belnr && | </br>| )
*
*                                                    ( |Geschäftsjahr: | && gs_alv-gjahr )
*                                                    ( '</body></html>' )
*                                                     )
*                                    title = 'Ausgewählte Belegnummer'
*                                    printing = abap_true
*                                    size = cl_abap_browser=>small
*                                    "check_html = abap_true
*                                    "modal = abap_true
*                                                     ).
*      ENDIF.
    CATCH cx_sy_itab_line_not_found.
      BREAK-POINT.
      "Error message goes here
  ENDTRY.

  IF column EQ 'BELNR' OR column EQ 'GJAHR'.
    "gt_alv
    SET PARAMETER ID: 'BLN' FIELD gs_alv-belnr.
    SET PARAMETER ID: 'GJR' FIELD gs_alv-gjahr.
    PERFORM call_transaction USING 'FB03'.
  ELSEIF column EQ 'BELNRZ' OR column EQ 'GJAHRZ'.
    SET PARAMETER ID: 'BLN' FIELD gs_alv-belnrz.
    SET PARAMETER ID: 'GJR' FIELD gs_alv-gjahrz.
    PERFORM call_transaction USING 'FB03'.
  ELSEIF column EQ 'AUGBL' OR column EQ 'AUGDT'.
    SET PARAMETER ID: 'BLN' FIELD gs_alv-augbl.
    SET PARAMETER ID: 'GJR' FIELD gs_alv-augdt(4).
    SET PARAMETER ID: 'BUK' FIELD gs_alv-bukrs.
    PERFORM call_transaction USING 'FBRA'.
  ENDIF.


ENDFORM.