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