*---------------------------------------------------------------------*
*                          Z _ B J H _ A L V                          *
*                                                                     *
*                  Autor: Bernd Haase (BJH Software)                  *
*---------------------------------------------------------------------*
* ALV = ABAP List Viewer. Struktur und Funktionsbausteine für das     *
* einfache Anzeigen von Reporting-Liststrukturen, ohne den Aufbau     *
* über Write-Anweisung und Berechnung der Position durchführen zu     *
* müssen.                                                             *
*---------------------------------------------------------------------*
* Beispielprogramm zur Anzeige von Bestellköpfen und deren Positionen,*
* ergänzt um ein grafisches Element. Hotspot auf die Bestellnummer    *
* Anmerkung: objektorientiertes ALV im Programm z_bjh_alv_oo          *
*---------------------------------------------------------------------*
* (A) Inner Join(2), FS, ALV                                          *
*---------------------------------------------------------------------*
* 22.12.2003 BHaa: Programm erstellt                                  *
* 14.01.2004 BHaa: Ampel eingebaut, wahlweise GRID oder LIST          *
* 15.01.2004 BHaa: Parameter in der LayOut-Gestaltung                 *
* 04.11.2004 BHaa: Variante für ALV abhängig vom Transaktionscode     *
* 17.05.2005 BHaa: Verpointerung anstatt Zwischenvariablen            *
*---------------------------------------------------------------------*
REPORT  z_bjh_alv  .

INCLUDE <icon>.

TABLES:
 ekko,       "Einkaufsbelegkopf
 ekpo.       "Einkaufsbelegposition

DATA:
* interner Parameter
 anzahl(5) TYPE n.

*****************
* ALV Variablen *
*****************
* Type Pool, wo alle Tabellen und Strukturen definiert sind, welche für
* die Listanzeige über ALV (ABAP List Viewer) benötigt werden
TYPE-POOLS:
 slis.
* ALV typische Variablen
INCLUDE miolxtop.

DATA:
* Beschreibung der Attribute zu einem Feld
 gt_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE,
* Sortierfolge Feld
 gs_sort     TYPE slis_sortinfo_alv,
* Sortierfolge Tabelle (voreingestellt)
 gt_sort     TYPE slis_t_sortinfo_alv,
* Eigenschaften der Liste, Beschreibung des LayOuts
 gs_layout   TYPE slis_layout_alv,
* Vairiante zur Layoutgestaltung
 gs_variante TYPE disvariant,
* mögliche Aktionen im ALV-Standard-Bildschirm
 gs_event_exit_wa TYPE slis_event_exit,
* Name des Programmes
 prog_name   LIKE sy-repid.

**************
* Bestellung *
**************
* für das Beispiel dient die Bestellpositionstabelle
DATA:
* Werteinhalte für die auszugebende Liste. Achtung: anscheinend können
* geschachtelte Strukturen nicht ordnungsgemäß ausgegeben werden,
* deswegen der Umweg über ausw-Struktur und move-corresponding
 BEGIN OF wa_alv,
   ebeln LIKE ekko-ebeln,
   ebelp LIKE ekpo-ebelp,
   bstyp LIKE ekko-bstyp,
   lifnr LIKE ekko-lifnr,
   matnr LIKE ekpo-matnr,
   meins LIKE ekpo-meins,
   menge LIKE ekpo-menge,
   werks LIKE ekpo-werks,
   netwr LIKE ekpo-netwr,
* Zusatzfelder, die berechnet werden
   selected(1) TYPE c,
   ampel(20) TYPE c,
 END OF wa_alv,
 itab_alv LIKE TABLE OF wa_alv.

FIELD-SYMBOLS:
 <fs_alv> LIKE wa_alv.

*---------------------------------------------------------------------*
*                                                                     *
*                 A u s w a h l b i l d s c h i r m                   *
*                                                                     *
*---------------------------------------------------------------------*
* Auswahlbildschirm zur Eingrenzung der Bestellungen
SELECTION-SCREEN: BEGIN OF BLOCK a1 WITH FRAME TITLE text-901.
SELECT-OPTIONS:
* Lieferantennummer
 solifnr FOR ekko-lifnr,
* Bestellnummern
 soebeln FOR ekko-ebeln,
* Materialnummern
 somatnr FOR ekpo-matnr.
SELECTION-SCREEN: END OF BLOCK a1.

* Anzeigeform / Aufbereitung des ALV
SELECTION-SCREEN: BEGIN OF BLOCK a2 WITH FRAME TITLE text-902.
PARAMETERS:
* Anzeigeform.
 pmx_grid RADIOBUTTON GROUP grp2 DEFAULT 'X',
 pmx_list RADIOBUTTON GROUP grp2.
SELECTION-SCREEN: END OF BLOCK a2.

INITIALIZATION.
 MOVE sy-repid TO prog_name.

***********************************************************************
*                                                                     *
*                     P R O G R A M M S T A R T                       *
*                                                                     *
***********************************************************************
START-OF-SELECTION.

* Selektion der Datensätze auf Basis der Vorabauswahl
 SELECT
   ij_ekko~ebeln
   ij_ekpo~ebelp
   ij_ekko~bstyp
   ij_ekko~lifnr
   ij_ekpo~matnr
   ij_ekpo~meins
   ij_ekpo~menge
   ij_ekpo~werks
   ij_ekpo~netwr
 FROM       ekko AS ij_ekko
 INNER JOIN ekpo AS ij_ekpo
 ON    ij_ekko~ebeln = ij_ekpo~ebeln
 INTO TABLE itab_alv
 WHERE ij_ekko~ebeln IN soebeln
 AND   ij_ekko~lifnr IN solifnr
 AND   ij_ekko~loekz =  ' '
 AND   ij_ekpo~matnr IN somatnr
 AND   ij_ekpo~loekz =  ' '.

 LOOP AT itab_alv ASSIGNING <fs_alv>.
* zu Beispielzwecken Ampel einblenden, die an den Preis gekoppelt ist
   IF <fs_alv>-netwr > 10000.
     MOVE icon_red_light TO <fs_alv>-ampel.
   ELSE.
     IF <fs_alv>-netwr > 300.
       MOVE icon_yellow_light TO <fs_alv>-ampel.
     ELSE.
       MOVE icon_green_light  TO <fs_alv>-ampel.
     ENDIF.
   ENDIF.
 ENDLOOP.

 DESCRIBE TABLE itab_alv LINES anzahl.
* es wurden Datensätze selektiert
 IF anzahl > 0.
* Ausgabeformat bestimmen
   PERFORM upro-alv_init_layout.
* die Ausgabetabelle aufbauen
   PERFORM upro-alv_init_fieldcat.
* Sortierfolge festlegen
*    PERFORM upro-alv_init_sort.
* Standardfunktionscodes besetzen
   PERFORM upro-alv_event_exit_tab.

* Liste nach Bestellnummer sortieren
   SORT itab_alv BY ebeln ebelp ASCENDING.

* aufbereitete Liste ausgeben (Tabelle mit Werten und Layout sind
* gefüllt und definiert, keine weiteren Aktionen nötig)

* Layoutdefinition über Grid- oder List-Variante
   IF pmx_grid = 'X'.
     PERFORM upro-alv_ausgabe_grid.
   ELSE.
     PERFORM upro-alv_ausgabe_list.
   ENDIF.
 ENDIF.

END-OF-SELECTION.
 EXIT.

*---------------------------------------------------------------------*
*                    A L V _ I N I T _ L A Y O U T                    *
*---------------------------------------------------------------------*
* allgemeines Layout für die Aufbereitung im ALV bestimmen und para-  *
* metrisieren.                                                        *
*---------------------------------------------------------------------*
FORM upro-alv_init_layout.

* Format der Ausgabe definieren. Es sind nur die Attribute besetzt, die
* nicht dem Initialisierungszustand entsprechen
 gs_layout-zebra                = 'X'.  "Zeilen straffiert darstellen
 gs_layout-detail_popup         = 'X'.  "Extra-Pop-Up für Detail-Info
 gs_layout-detail_initial_lines = 'X'.
 gs_layout-no_colhead           = ' '.  "Überschriften nicht anzeigen
 gs_layout-no_vline             = ' '.  "keine vertikalen Linien

* Merge von Zellen ausschalten. Ohne Zusammenfassen von Einträgen bei
* Sortierung. Achtung: FB=REUSE_ALV_TRANSFER_DATA Wert=N setzen
 gs_layout-cell_merge           = 'N'.

 gs_layout-get_selinfos         = 'X'.
*  gs_layout-box_fieldname        = 'SELECTED'.

* Aktionscode beim Doppelklick, bei Attributen, wo Hotspot gesetzt ist
* F2 sollte im Gui-Status auch mit ANZ belegt sein (Variante LIST)
 gs_layout-f2code = 'ANZ'.

ENDFORM.

*---------------------------------------------------------------------*
*                  A L V _ I N I T _ F I E L D C A T                  *
*---------------------------------------------------------------------*
* Ausgabereihenfolge der anzuzeigenden Liste definieren. Falls Aufbau *
* nicht dem Standard entsprechen sollte oder mehrzeilig dargestellt   *
* wird, dann sind die Parameter row_pos und col_pos auch zu setzen    *
* im Beispiel: 1-stufig, 1-zeilig, Bildchen (Icon) + 7 Elemente       *
*---------------------------------------------------------------------*
FORM upro-alv_init_fieldcat.

 gt_fieldcat-fieldname   = 'AMPEL'.
* Überschrift zu diesen Feld, da keinem Data Dictionary zugeordnet ist
 gt_fieldcat-reptext_ddic = 'Ampel'.
* Ampel als Bildchen ausgeben
 gt_fieldcat-icon        = 'X'.
 APPEND gt_fieldcat. CLEAR gt_fieldcat.

 gt_fieldcat-fieldname   = 'LIFNR'.
 gt_fieldcat-ref_tabname = 'EKKO'.
 APPEND gt_fieldcat. CLEAR gt_fieldcat.

 gt_fieldcat-fieldname   = 'EBELN'.
 gt_fieldcat-ref_tabname = 'EKKO'.
* gt_fieldcat-row_pos     = 1. "Positionierung : in welcher Reihe Feld
* gt_fieldcat-col_pos     = 1. "Pos.der Spalte : ausgeben wird
* Bestellnummer, Doppelklick für Extra-Aktionen zulassen
 gt_fieldcat-hotspot     = 'X'.
 APPEND gt_fieldcat. CLEAR gt_fieldcat.

 gt_fieldcat-fieldname   = 'EBELP'.
 gt_fieldcat-ref_tabname = 'EKPO'.
* gt_fieldcat-row_pos     = 1.
* gt_fieldcat-col_pos     = 2.
 APPEND gt_fieldcat. CLEAR gt_fieldcat.

 gt_fieldcat-fieldname   = 'MATNR'.
 gt_fieldcat-ref_tabname = 'EKPO'.
* gt_fieldcat-row_pos     = 2.
* gt_fieldcat-col_pos     = 1.
 APPEND gt_fieldcat. CLEAR gt_fieldcat.

 gt_fieldcat-fieldname   = 'WERKS'.
 gt_fieldcat-ref_tabname = 'EKPO'.
* gt_fieldcat-row_pos     = 1.
* gt_fieldcat-col_pos     = 3.
 APPEND gt_fieldcat. CLEAR gt_fieldcat.

 gt_fieldcat-fieldname   = 'MENGE'.
 gt_fieldcat-ref_tabname = 'EKPO'.
* gt_fieldcat-row_pos     = 2.
* gt_fieldcat-col_pos     = 2.
* Wertefeld / Zahl, rechtbündig ausgeben
 gt_fieldcat-just        = 'R'.
 APPEND gt_fieldcat. CLEAR gt_fieldcat.

 gt_fieldcat-fieldname   = 'MEINS'.
 gt_fieldcat-ref_tabname = 'EKPO'.
* gt_fieldcat-row_pos     = 2.
* gt_fieldcat-col_pos     = 3.
 APPEND gt_fieldcat. CLEAR gt_fieldcat.

 gt_fieldcat-fieldname   = 'NETWR'.
 gt_fieldcat-ref_tabname = 'EKPO'.
* gt_fieldcat-row_pos     = 2.
* gt_fieldcat-col_pos     = 3.
* Wert der Position. In der Standardanzeige nicht anzeigen, aber im
* LayOut-Vorrat vorhalten
 gt_fieldcat-no_out      = 'X'.
* rechtbündig ausgeben
 gt_fieldcat-just        = 'R'.
 APPEND gt_fieldcat. CLEAR gt_fieldcat.

ENDFORM.

*---------------------------------------------------------------------*
*                      A L V _ I N I T _ S O R T                      *
*---------------------------------------------------------------------*
* standardisierte Sortierung der Anzeige definieren. Im Beispiel ist  *
* das Feld Materialnummer als aufsteigend angegeben.                  *
* Einstiegsvariante. Übersteuert Standard-Variante, wenn sie im ALV   *
* hinterlegt ist. Tabelle für die Speicherung der Varianten in den    *
* Programmen ist die LTDX                                             *
*---------------------------------------------------------------------*
FORM upro-alv_init_sort.
 CLEAR: gt_sort, gs_variante.

 CLEAR gs_sort.
 gs_sort-fieldname = 'MATNR'.
 gs_sort-spos      = 1.
 gs_sort-up        = 'X'.
 gs_sort-subtot    = 'X'.

 APPEND gs_sort TO gt_sort.

 MOVE prog_name TO gs_variante-report.
 MOVE '/BJH'    TO gs_variante-variant.

ENDFORM.

*---------------------------------------------------------------------*
*       FORM FILL_EVENT_EXIT_TAB_F14                                  *
* aus Include miolxf14                                                *
*---------------------------------------------------------------------*
* Standard Funktionscodes für den Listviewer mit Bezug zum lokalen    *
* Programm herstellen. Aus dem Include kopiert, deshalb keine Anpas-  *
* sung an Standardprogrammstyl BJH.                                   *
*---------------------------------------------------------------------*
FORM upro-alv_event_exit_tab.

 CLEAR: gs_event_exit_wa, g_event_exit_tab.

*--- fcode get acual Variant via Icon -------------------------------*
 gs_event_exit_wa-ucomm = g_ol0.
 gs_event_exit_wa-after = g_x.
 APPEND gs_event_exit_wa TO g_event_exit_tab.
*--- fcode select Variant -------------------------------------------*
 gs_event_exit_wa-ucomm = g_oad.
 gs_event_exit_wa-after = g_x.
 APPEND gs_event_exit_wa TO g_event_exit_tab.
*--- fcode change actual variant ------------------------------------*
 gs_event_exit_wa-ucomm = g_olx.
 gs_event_exit_wa-after = g_x.
 APPEND gs_event_exit_wa TO g_event_exit_tab.
*--- fcode show original list layout --------------------------------*
 gs_event_exit_wa-ucomm = g_lis.
 gs_event_exit_wa-after = g_x.
 APPEND gs_event_exit_wa TO g_event_exit_tab.
*--- pf2 used by salv and also by application (dobble-click) --------*
 gs_event_exit_wa-ucomm = g_ic1.
 gs_event_exit_wa-after = g_x.
 APPEND gs_event_exit_wa TO g_event_exit_tab.
*--- set/change filter on list --------------------------------------*
 gs_event_exit_wa-ucomm = g_ilt.
 gs_event_exit_wa-after = g_x.
 APPEND gs_event_exit_wa TO g_event_exit_tab.

*--- fcode show Quickinfo -------------------------------------------*
 CLEAR gs_event_exit_wa.
 gs_event_exit_wa-ucomm  = g_eta.
 gs_event_exit_wa-before = g_x.
 APPEND gs_event_exit_wa TO g_event_exit_tab.
*--- fcode delete all markings --------------------------------------*
 gs_event_exit_wa-ucomm  = g_sal.
 gs_event_exit_wa-before = g_x.
 APPEND gs_event_exit_wa TO g_event_exit_tab.

ENDFORM.

*---------------------------------------------------------------------*
*                    A L V _ A U S G A B E _ G R I D                  *
*---------------------------------------------------------------------*
* ALV als Grid ausgeben. Alle Variablen und internen Tabellen sind    *
* gefüllt, jetzt braucht nur noch der Funktionsbaustein aufgerufen    *
* werden. Beschreibungen Bedeutung einzelner Variablen s. Unterpro-   *
* gramm für die Listausgabe                                           *
*---------------------------------------------------------------------*
FORM upro-alv_ausgabe_grid.

 CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
   EXPORTING
*     I_INTERFACE_CHECK              = ' '
*     I_BYPASSING_BUFFER             =
*     I_BUFFER_ACTIVE                = ' '
     i_callback_program             = prog_name
     i_callback_pf_status_set       = 'UPRO-ALV_NACH_SET_PF'
     i_callback_user_command        = 'UPRO-ALV_NACH_USER_COMMAND'
*     I_CALLBACK_TOP_OF_PAGE         = ' '
*     I_CALLBACK_HTML_TOP_OF_PAGE    = ' '
*     I_CALLBACK_HTML_END_OF_LIST    = ' '
*     I_STRUCTURE_NAME               =
*     I_BACKGROUND_ID                = ' '
*     I_GRID_TITLE                   =
*     I_GRID_SETTINGS                =
     is_layout                      = gs_layout
     it_fieldcat                    = gt_fieldcat[]
*     IT_EXCLUDING                   =
*     IT_SPECIAL_GROUPS              =
     it_sort                        = gt_sort[]
*     IT_FILTER                      =
*     IS_SEL_HIDE                    =
     i_default                      = 'X'
     i_save                         = 'X'
     is_variant                     = gs_variante
*     IT_EVENTS                      =
     it_event_exit                  = g_event_exit_tab[]
*     IS_PRINT                       =
*     IS_REPREP_ID                   =
*     I_SCREEN_START_COLUMN          = 0
*     I_SCREEN_START_LINE            = 0
*     I_SCREEN_END_COLUMN            = 0
*     I_SCREEN_END_LINE              = 0
*     IT_ALV_GRAPHICS                =
*     IT_ADD_FIELDCAT                =
*     IT_HYPERLINK                   =
*     I_HTML_HEIGHT_TOP              =
*     I_HTML_HEIGHT_END              =
*     IT_EXCEPT_QINFO                =
*   IMPORTING
*     E_EXIT_CAUSED_BY_CALLER        =
*     ES_EXIT_CAUSED_BY_USER         =
   TABLES
     t_outtab           = itab_alv
   EXCEPTIONS
     program_error      = 1
     OTHERS             = 2.

 IF sy-subrc <> 0.
   MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
           WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
 ENDIF.

ENDFORM.

*---------------------------------------------------------------------*
*                    A L V _ A U S G A B E _ L I S T                  *
*---------------------------------------------------------------------*
* ALV als Liste ausgeben. Gleiches Spiel wie beim Grid, nur das der   *
* Funktionsbaustein ein anderer ist                                   *
*---------------------------------------------------------------------*
FORM upro-alv_ausgabe_list.

 CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
   EXPORTING
*     I_INTERFACE_CHECK              = ' '
*     I_BYPASSING_BUFFER             =
*     I_BUFFER_ACTIVE                = ' '
* Name Programm nach Verlassen des ALV
     i_callback_program             = prog_name
* Bildschirm setzen im ALV (Perform Routine)
     i_callback_pf_status_set       = 'UPRO-ALV_NACH_SET_PF'
* User Commands prüfen (Perform-Routine)
     i_callback_user_command        = 'UPRO-ALV_NACH_USER_COMMAND'
*     I_STRUCTURE_NAME               =
* allgemeine Einstellungen zum Layouts
     is_layout                      = gs_layout
* Feldattribute der anzuzeigenden Felder
     it_fieldcat                    = gt_fieldcat[]
*     IT_EXCLUDING                   =
*     IT_SPECIAL_GROUPS              =
* Sortierfolge
     it_sort                        = gt_sort[]
*     IT_FILTER                      =
*     IS_SEL_HIDE                    =
     i_default                      = 'X'
* Sicherung neuer Lay-outs zulassen
     i_save                         = 'X'
     is_variant                     = gs_variante
*     IT_EVENTS                      =
     it_event_exit                  = g_event_exit_tab[]
*     IS_PRINT                       =
*     IS_REPREP_ID                   =
*     I_SCREEN_START_COLUMN          = 0
*     I_SCREEN_START_LINE            = 0
*     I_SCREEN_END_COLUMN            = 0
*     I_SCREEN_END_LINE              = 0
*   IMPORTING
*     E_EXIT_CAUSED_BY_CALLER        =
*     ES_EXIT_CAUSED_BY_USER         =
   TABLES
     t_outtab           = itab_alv
   EXCEPTIONS
     program_error      = 1
     OTHERS             = 2.

 IF sy-subrc <> 0.
   MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
           WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
 ENDIF.

ENDFORM.

*---------------------------------------------------------------------*
*                    A L V _ N A C H _ S E T _ P F                    *
*---------------------------------------------------------------------*
* Bildschirm und welche Tasten abzufragen gehen, setzen, sollte keiner*
* definiert sein, wird ein Standardbildschirm eingespielt             *
*---------------------------------------------------------------------*
* Der Name dieser Statusroutine wie auch der Name für das Unterpro-   *
* gramm bei Tastendruck sind Export-Parameter der ALV-Bausteine       *
*---------------------------------------------------------------------*
FORM upro-alv_nach_set_pf USING rt_extag TYPE slis_t_extab.

 SET TITLEBAR '500' WITH sy-datum.

 SET PF-STATUS '9000' OF PROGRAM sy-repid EXCLUDING rt_extag.

ENDFORM.

*---------------------------------------------------------------------*
*              A L V _ N A C H _ U S E R _ C O M M A N D              *
*---------------------------------------------------------------------*
* Abfrage, welche Aktionen ausgeführt werden müssen, wenn im ALV eine *
* Taste gedrückt wurde. Beachten, ob vorher oder nachher Ausführung,  *
* Flag muß gesetzt sein und wird bei der Tastenbehandlung zugeordnet. *
*---------------------------------------------------------------------*
FORM upro-alv_nach_user_command
    USING nach_alv_ucomm    LIKE sy-ucomm
          nach_alv_selfield TYPE slis_selfield.

 CASE nach_alv_ucomm.
* Felder mit Hotspot-gesetzt, weitere Aktionen möglich
   WHEN 'ANZ'.
* Feld abfragen, auf welches geklickt wurde
     CASE nach_alv_selfield-sel_tab_field.
* Bestellung anzeigen, Position in der Tabelle bestimmen und dann mit
* den Werten dazu abspringen. Wichtig ist, das vor dem abzufragenden
* Feld die "1-" steht als Referenz zur Tabelle
       WHEN '1-EBELN'.
         READ TABLE itab_alv INTO wa_alv
         INDEX nach_alv_selfield-tabindex.

         CALL FUNCTION 'ME_DISPLAY_PURCHASE_DOCUMENT'
              EXPORTING
                   i_ebeln = wa_alv-ebeln
                   i_enjoy = 'X'
                   i_bstyp = wa_alv-bstyp
              EXCEPTIONS
                   OTHERS  = 1.
         IF sy-subrc <> 0.
           MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno
                   WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
         ENDIF.
     ENDCASE.
 ENDCASE.

ENDFORM.

***** Ende *****
* Copyright BJH Software, Datei überarbeitet am: 23.7.2005