ZFI_FAELL02 – Analysetool für Fälligkeiten Debitoren

Dieses Programm zeigt per Ampelsystem die Fälligkeit von Debitoren auf.

Neben Skontofälligkeitsdatum, Nettofälligkeitsdatum wird der Verlust / Gewinn an Skonto per Tage, die zu früh oder spät gezahlt wurde, errechnet. Dieser Gewichtsfaktor zeigt an, wie schwerwiegend der Verstoß gegen die Zahlungsbedinungen war. Der Verlust berechet sich aus Gesamtbetrag mal Anzahl der Tage mal Prozent Zinssatz.

Will man die Summe wissen, die bei riguoser Einforderung von zu Unrecht abgezogenen Skonto möglich wäre, so kann dies über die Spalte Skonto erfolgen.

Skontosumme und Gewichtung sind also zwei unterschiedliche Ansätze.

Je höher die Gewichtung ist, desto höher ist der Verstoß gegen die Zahlungsbedingungen.

Ist der Verstoß gegen die Nettozahlung, dann ist die Gewichtung sogar das einzige und das geeignete Medium, den Verlust einzuschätzen.

REPORT zfi_faell02.


*Programm zur raschen Auswertung der Fälligkeit
*Auswahl der Kunden
*01 2018-12-10 Dipl.Ing.J.Stangl Erstversion inkl. Bewertung
*02 2018-12-11 Dipl.Ing.J.Stangl Name hinzugefügt, Überschriften angepaßt
*Test

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

TABLES:
  bkpf,
  bsad,
  bseg.
*  coas,
*  mseg.


SELECTION-SCREEN BEGIN OF BLOCK all WITH FRAME.

SELECTION-SCREEN BEGIN OF BLOCK ausw WITH FRAME TITLE text-011.
SELECT-OPTIONS so_kunnr FOR bsad-kunnr. " DEFAULT '20200'.
SELECT-OPTIONS so_budat FOR bsad-budat.

SELECTION-SCREEN SKIP.
SELECTION-SCREEN END OF BLOCK ausw.

SELECTION-SCREEN BEGIN OF BLOCK opt WITH FRAME TITLE text-012.
SELECT-OPTIONS so_augdt FOR bsad-augdt.
*PARAMETERS p_date   TYPE sy-datum DEFAULT sy-datum NO-DISPLAY.
*PARAMETERS p_detail TYPE xfeld AS CHECKBOX DEFAULT abap_true.
*PARAMETERS p_summe  TYPE xfeld AS CHECKBOX DEFAULT abap_true.
*PARAMETERS p_sumges TYPE xfeld AS CHECKBOX DEFAULT abap_true.
PARAMETERS p_posit TYPE xfeld AS CHECKBOX DEFAULT abap_true. "Nur positive Beträge
PARAMETERS p_negat TYPE xfeld AS CHECKBOX DEFAULT abap_false. "Nur negative Beträge
SELECTION-SCREEN SKIP.
PARAMETERS:  p_ausg  RADIOBUTTON GROUP b2 DEFAULT 'X',
             p_offen RADIOBUTTON GROUP b2,
             p_alle  RADIOBUTTON GROUP b2.
SELECTION-SCREEN SKIP.
SELECTION-SCREEN END OF BLOCK opt.

SELECTION-SCREEN BEGIN OF BLOCK optaus WITH FRAME TITLE text-013.
SELECT-OPTIONS so_blart FOR bkpf-blart.
SELECTION-SCREEN SKIP.
SELECTION-SCREEN END OF BLOCK optaus.


SELECTION-SCREEN BEGIN OF BLOCK ausg WITH FRAME TITLE text-014.
PARAMETERS : p_alv  RADIOBUTTON GROUP g1 DEFAULT 'X',
             p_list RADIOBUTTON GROUP g1.
*PARAMETERS p_zusatz TYPE xfeld AS  CHECKBOX DEFAULT abap_true.
SELECTION-SCREEN SKIP.
PARAMETERS: p_zusatz TYPE xfeld AS CHECKBOX DEFAULT abap_false.
SELECTION-SCREEN SKIP.
SELECTION-SCREEN END OF BLOCK ausg.

SELECTION-SCREEN BEGIN OF BLOCK bew WITH FRAME TITLE text-015.
SELECTION-SCREEN COMMENT /1(40) text-021.
PARAMETERS: p_bewert TYPE xfeld AS CHECKBOX DEFAULT abap_false. "Bewertung
PARAMETERS: p_proz TYPE bsad-zbd2p DEFAULT 2.
PARAMETERS: p_betrag TYPE bsad-dmbtr DEFAULT 0.
SELECTION-SCREEN SKIP.
SELECTION-SCREEN END OF BLOCK bew.

SELECTION-SCREEN END OF BLOCK all.





*DATA:
*
*  lv_kostv    LIKE mseg-kostl,
*  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.
*
TYPES: BEGIN OF ty_alv,
         bemer(30) TYPE c,
         kunnr     TYPE bsad-kunnr,
         name1     TYPE kna1-name1,
         belnr     TYPE bsad-belnr,
         gjahr     TYPE bsad-gjahr,
         shkzg     TYPE bsad-shkzg,
         dmbtr     TYPE bsad-dmbtr,
         sknto     TYPE bsad-sknto,
         blart     TYPE bsad-blart,
         budat     TYPE bsad-budat,
         bldat     TYPE bsad-bldat,
         "faedt     TYPE bsad-faedt,
         augdt     TYPE bsad-augdt,
         zfbdt     TYPE bsad-zfbdt,
         zbd1t     TYPE bsad-zbd1t,
         zbd2t     TYPE bsad-zbd2t,
         zbd1p     TYPE bsad-zbd1p,
         zbd2p     TYPE bsad-zbd2p,
         faed1     TYPE bsad-zfbdt, "FälligSkonto
         faed2     TYPE bsad-zfbdt, "FälligNetto
         meng1     TYPE bsad-zbd1t,
         meng2     TYPE bsad-zbd1t,
         bewer     TYPE mseg-menge, "Bewertung
         ampel(4)  TYPE c,
       END OF ty_alv.
DATA: gt_alv TYPE STANDARD TABLE OF ty_alv,
      gs_alv TYPE ty_alv.


RANGES: so_shkzg FOR bsad-shkzg.
*
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 = sy-datum.
  APPEND so_budat.

  so_augdt-sign = 'I'.
  so_augdt-option = 'BT'.
  so_augdt-low = '20150101'.
  so_augdt-high = sy-datum.
  APPEND so_augdt.

  so_blart-sign = 'I'.
  so_blart-option = 'NE'.
  so_blart-low = 'DZ'.
  APPEND so_blart.

  so_kunnr-sign = 'I'.
  so_kunnr-option = 'BT'.
  so_kunnr-low = '21000'.
  so_kunnr-high = '22000'.
  APPEND so_kunnr.

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


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.
    BREAK-POINT.
  ENDMETHOD.                    "on_double_click

  METHOD on_link_click.
     exit.
     break-point.

*    DATA:
*      lv_gjahr TYPE gjahr,
*      lv_belnr TYPE belnr.
*    lv_gjahr = '2015'.
*    lv_belnr = '90000000'.
*    SET PARAMETER ID: 'BLN' FIELD lv_belnr.
*    SET PARAMETER ID: 'GJR' FIELD lv_gjahr.




  TRY.
      gs_alv  = gt_alv[ row ].

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

*        DATA(html_tab) = VALUE cl_abap_browser=>html_table(
*
*
*
*      ( 'Picture with CL_ABAP_BROWSER<br><br>' )
*
*      ( 'Picture with CL_ABAP_BROWSER2<br><br>' )
*
*      ( '<img src="PICT.GIF">' )
*
*      ( '</body></html>' ) ).
*
*      cl_abap_browser=>show_html( html        = html_tab ).
*
    CATCH cx_sy_itab_line_not_found.
      BREAK-POINT.
      "Error message goes here
  ENDTRY.

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

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

    PERFORM on_link_click.

  ENDMETHOD.                    "on_link_click
ENDCLASS.                    "cl_event_handler IMPLEMENTATION


START-OF-SELECTION.

  CLEAR so_shkzg.
  IF p_posit EQ abap_true AND p_negat EQ abap_false.
    so_shkzg-sign = 'I'.
    so_shkzg-option = 'EQ'.
    so_shkzg-low = 'S'.
    so_shkzg-high = ''.
    APPEND so_shkzg.
  ENDIF.
  IF p_posit EQ abap_false AND p_negat EQ abap_true.
    so_shkzg-sign = 'I'.
    so_shkzg-option = 'EQ'.
    so_shkzg-low = 'H'.
    so_shkzg-high = ''.
    APPEND so_shkzg.
  ENDIF.

  IF NOT p_bewert IS INITIAL.
    "cl_demo_output=>display( 'Bewertung N/A' ).
  ENDIF.

*Selektion der Daten
  IF p_ausg EQ abap_true OR p_alle EQ abap_true.
    SELECT
      ' ' AS bemer, a~kunnr, b~name1, belnr, gjahr, shkzg, dmbtr, sknto, blart, budat, bldat, "faedt,
      augdt, zfbdt, zbd1t, zbd2t, zbd1p, zbd2p
*      CASE
*      WHEN budat_mkpf  = @so_buda2-low then 'KRIT'
*      else ' '
*      end as bemer,

      FROM bsad AS a INNER JOIN kna1 AS b ON a~kunnr = b~kunnr
      INTO TABLE @gt_alv
      WHERE a~kunnr IN @so_kunnr
      AND budat IN @so_budat
      AND budat IN @so_augdt
      AND blart IN @so_blart
      AND shkzg IN @so_shkzg
      "group by,
      .
  ELSE.
    cl_demo_output=>display( 'Offene Posten N/A (Info wenn gebraucht)' ).
  ENDIF.



*Ausgabe ALV
  IF p_alv EQ abap_true.

    LOOP AT gt_alv ASSIGNING FIELD-SYMBOL(<gs_alv>).
      "  ampel = '@08@'. Grün
      "  ampel = '@09@'. Gelb
      "  ampel = '@0A@'. Rot
      "  ampel = '@EB@'. Grau


      IF <gs_alv>-shkzg = 'H'.
        <gs_alv>-dmbtr = - <gs_alv>-dmbtr.
        <gs_alv>-sknto = - <gs_alv>-sknto.
        <gs_alv>-ampel = '@0A@'.
      ENDIF.
      <gs_alv>-faed1 = <gs_alv>-zfbdt + <gs_alv>-zbd1t. "FälligSkonto
      <gs_alv>-faed2 = <gs_alv>-zfbdt + <gs_alv>-zbd2t. "FälligNetto
      IF NOT <gs_alv>-augdt IS INITIAL.
        <gs_alv>-meng1 = <gs_alv>-augdt - <gs_alv>-faed1. "Skontotage größer 0 ist überfällig
        <gs_alv>-meng2 = <gs_alv>-augdt - <gs_alv>-faed2. "Fälligtage größer 0 ist überfällig

      ELSE.
      ENDIF.
      "Zahlt verfrüht mit Skonto --> (Netto - Skonto)  * Banktage * Bankproz Gewinnn
      "Zahlt verspätet mit Skonto --> Netto * Banktage * Bankproz Verlust
      "Zahlt verfrüht Netto --> Netto * Banktage * Bankproz Gewinn
      "Zahlt verspätet Netto --> Netto * Banktage * Bankproz Gewinn

      IF  <gs_alv>-sknto NE 0 AND <gs_alv>-meng1 < 0. "Gewichtet mit Tagen
        <gs_alv>-bewer = ( <gs_alv>-dmbtr  - <gs_alv>-sknto ) * p_proz * <gs_alv>-meng1 / 365 / 100.
        IF <gs_alv>-shkzg = 'S'. "Verfrüht und Skonto
          <gs_alv>-ampel = '@08@'.
          <gs_alv>-bemer = 'Gewinn: Verfrüht mit Skonto'.
        ELSE.
          <gs_alv>-ampel = '@0A@'.
          <gs_alv>-bemer = 'Verlust: Verfrüht mit Skonto'.
        ENDIF.
      ELSE. "Gewichtet mit Tagen
        <gs_alv>-bewer = ( <gs_alv>-dmbtr  ) * p_proz * <gs_alv>-meng2 / 365 / 100.
        IF <gs_alv>-meng2 LE 0. "Verfrüht
          IF <gs_alv>-shkzg = 'S' .
            <gs_alv>-ampel = '@08@'.
            <gs_alv>-bemer = 'Gewinn: Verfrüht Netto'.
          ELSE.
            <gs_alv>-ampel = '@0A@'.
            <gs_alv>-bemer = 'Verlust: Verfrüht Netto'.

          ENDIF.
        ELSE.
          IF <gs_alv>-shkzg = 'S' .
            <gs_alv>-ampel = '@0A@'.
            <gs_alv>-bemer = 'Verlust: Verspätet Netto'.
          ELSE.
            <gs_alv>-ampel = '@08@'.
            <gs_alv>-bemer = 'Gewinn: Verspätet Netto'.

          ENDIF.

        ENDIF.
      ENDIF.


    ENDLOOP.

    PERFORM show_alv.
*Ausgabe Liste
  ELSE.
    cl_demo_output=>display( 'List N/A (Info wenn gebraucht)' ).
  ENDIF.



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

  "Initialisierung
  DATA: gref_salv TYPE REF TO cl_salv_table,
        gr_layout TYPE REF TO cl_salv_layout,
        ls_key    TYPE salv_s_layout_key.
  DATA: lr_functions TYPE REF TO cl_salv_functions_list,
        lo_events    TYPE REF TO cl_salv_events_table.

* ALV aufbauen,
* gref_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 = gref_salv
        CHANGING
          t_table      = gt_alv.

      lo_events = gref_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.



    CATCH cx_salv_msg .
  ENDTRY.

  "Die Keydaten werden gefüllt
  ls_key-report = sy-repid.
  "gr_layout zeigt auf das Layout des ALV
  gr_layout  = gref_salv->get_layout( ).
  "Layout erhält Keydaten: Program Name
  gr_layout->set_key( ls_key ).
  "Layout Speichern erlaubt (3 Werte möglich) User can save
  gr_layout->set_save_restriction( cl_salv_layout=>restrict_none ).
* Layout auf Kundenspezifisches Layout einstellen
*  IF sy-slset = 'CUS&Z_PPMDT_01'.
*    gr_layout->set_initial_layout( value = '/Z_PPMDT_TEL' ).
*  ENDIF.
  "lr_functions zeigt auf die Funktionen des ALV
  lr_functions = gref_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 = gref_salv->get_columns( ).
* lr_columns->set_optimize( abap_true ).

  TRY.

      lr_column ?= lr_columns->get_column( 'KUNNR' ).
      lr_column->set_output_length( '5' ).

      lr_column ?= lr_columns->get_column( 'NAME1' ).
      lr_column->set_output_length( '20' ).

      lr_column ?= lr_columns->get_column( 'FAED1' ).
      lr_column->set_short_text( 'Fäll.Sk.').
      lr_column->set_medium_text( 'Fällig Skonto').
      lr_column->set_long_text( 'Fällig Skonto').

      lr_column ?= lr_columns->get_column( 'FAED2' ).
      lr_column->set_short_text( 'Fäll.N.').
      lr_column->set_medium_text( 'Fällig Netto').
      lr_column->set_long_text( 'Fällig Netto').

      lr_column ?= lr_columns->get_column( 'BUDAT' ).
      lr_column->set_short_text( 'Buch.D.').
      lr_column->set_medium_text( 'Buchungsd.').
      lr_column->set_long_text( 'Buchungsdatum').

      lr_column ?= lr_columns->get_column( 'ZBD1T' ).
      lr_column->set_short_text( 'T.Skonto').
      lr_column->set_medium_text( 'Tage Skonto').
      lr_column->set_long_text( 'Tage Skonto').

      lr_column ?= lr_columns->get_column( 'ZBD2T' ).
      lr_column->set_short_text( 'T.Netto').
      lr_column->set_medium_text( 'Tage Netto').
      lr_column->set_long_text( 'Tage Netto').


      lr_column ?= lr_columns->get_column( 'BLDAT' ).
      lr_column->set_short_text( 'Bel.D.').
      lr_column->set_medium_text( 'Belegd.').
      lr_column->set_long_text( 'Belegdatum').

      lr_column ?= lr_columns->get_column( 'AUGDT' ).
      lr_column->set_short_text( 'Ausgl.D.').
      lr_column->set_medium_text( 'Ausgleichsd.').
      lr_column->set_long_text( 'Ausgleichsdatum').

      lr_column ?= lr_columns->get_column( 'MENG1' ).
      lr_column->set_short_text( 'Abw.Tg.S.').
      lr_column->set_medium_text( 'Abw.Tg.Skonto').
      lr_column->set_output_length( '10' ).
      lr_column->set_sign( abap_true ).

      lr_column ?= lr_columns->get_column( 'MENG2' ).
      lr_column->set_short_text( 'Abw.Tg.N.').
      lr_column->set_medium_text( 'Abw.Tg.Netto').
      lr_column->set_output_length( '10' ).
      lr_column->set_sign( abap_true ).


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

      lr_column ?= lr_columns->get_column( 'SKNTO' ).
      lr_column->set_short_text( 'Skonto').
      lr_column->set_medium_text( 'Skonto').
      lr_column->set_long_text( 'Skonto').
      lr_column->set_output_length( '10' ).
      lr_column->set_sign( abap_true ).

      lr_column ?= lr_columns->get_column( 'BEMER' ).
      lr_column->set_short_text( 'Bemerk.').
      lr_column->set_medium_text( 'Bemerkung').
      lr_column->set_long_text( 'Bemerkung').
      lr_column->set_output_length( '25' ).

      lr_column ?= lr_columns->get_column( 'BEWER' ).
      IF p_bewert IS INITIAL.
        lr_column->set_visible( '' ).
      ELSE.
        lr_column->set_short_text( 'Bew.').
        lr_column->set_medium_text( 'Bewertung').
        lr_column->set_long_text( 'Bewertung').
        lr_column->set_sign( abap_true ).

      ENDIF.


* Zusatzinfo ausblenden
      IF p_zusatz IS INITIAL.
        lr_column ?= lr_columns->get_column( 'ZFBDT' ).
        lr_column->set_visible( '' ).
        lr_column ?= lr_columns->get_column( 'ZBD1T' ).
        lr_column->set_visible( '' ).
        lr_column ?= lr_columns->get_column( 'ZBD2T' ).
        lr_column->set_visible( '' ).
        lr_column ?= lr_columns->get_column( 'ZBD1P' ).
        lr_column->set_visible( '' ).
        lr_column ?= lr_columns->get_column( 'ZBD2P' ).
        lr_column->set_visible( '' ).
      ENDIF.

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


      lr_columns->set_column_position( columnname = 'FAED1' position = 1 ).
      lr_columns->set_column_position( columnname = 'FAED2' position = 1 ).
      lr_columns->set_column_position( columnname = 'MENG1' position = 1 ).
      lr_columns->set_column_position( columnname = 'MENG2' position = 1 ).
      lr_columns->set_column_position( columnname = 'BEMER' position = 1 ).
      lr_columns->set_column_position( columnname = 'AUGDT' position = 1 ).
      lr_columns->set_column_position( columnname = 'BLDAT' position = 1 ).
      lr_columns->set_column_position( columnname = 'BUDAT' position = 1 ).
      lr_columns->set_column_position( columnname = 'BLART' position = 1 ).
      lr_columns->set_column_position( columnname = 'SKNTO' position = 1 ).
      lr_columns->set_column_position( columnname = 'DMBTR' position = 1 ).
      lr_columns->set_column_position( columnname = 'SHKZG' position = 1 ).
      lr_columns->set_column_position( columnname = 'BELNR' position = 1 ).
      lr_columns->set_column_position( columnname = 'NAME1' position = 1 ).
      lr_columns->set_column_position( columnname = 'KUNNR' position = 1 ).
      lr_columns->set_column_position( columnname = 'AMPEL' position = 1 ).


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


      "lr_columns->get_count_column


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

* Ausgabe
  gref_salv->display( ).
ENDFORM.

*  call method gt_grid-grid->get_current_cell
*    importing
*      es_row_id = ls_row_id
*      es_col_id = ls_col_id
*      e_value   = l_value.


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

ENDFORM.