ALV-Liste Fubau

www.4AP.de - Syntaxbeispiel ALV Listausgabe mit Funktionsbaustein

Beispielcoding: ALV-Listausgabe über objektorientierte Funktionen (kopieren erlaubt aber auf eigene Gefahr :-))

 



Am Anfang ist das unheimlich schwer, sich in die objektorientierte Welt einzufinden. Dummerweise sind auch die ALV-Beispiele der SAP entweder zu komplex, oder sie bieten nicht das was man gerade braucht. Zur Programmierung des ALVs gibt es in der Transktion SE83 SAP Basis > Controls > Grundlagen > ALV Grid Control jede Menge Beispielprogramme.

 

Eine wichtige undokumentierte Funktion: wie kann man den klassischen ALV refreshen, also veränderte Werte auch anzeigen: es muss in der Form user_command folgendes eingefügt werden:

*   um das Auffrischen anzustoßen Flag setzen
    rs_selfield-refresh = 'X'.
*   'Festhalten' der aktuellen Position
    rs_selfield-col_stable = 'X'.
    rs_selfield-row_stable = 'X'.



ALV-Ausgabe Demoprogramm

REPORT z_alv_1 .
*
* z_alv_1_TN als Muster für ALV-Verarbeitung
*
* Coded by Thorsten Neubüser - www.4ap.de
* nach einem Muster von Berhard vdG
*
* Stand 28.03.2003
*
*=====================================================================*
* DEFINITIONS *
*=====================================================================*

*---------------------------------------------------------------------*
* DDIC and internal Tables *
*---------------------------------------------------------------------*
*........Table for data output........................................*
DATA: BEGIN OF t_daten OCCURS 0,
* Bezugnahme auf marav, da hier auch der Kurztext vorhanden ist
matnr LIKE marav-matnr,
mtart LIKE marav-mtart,
matkl LIKE marav-matkl,
maktx LIKE marav-maktx,
lbkum like mbew-lbkum,
meins like marav-meins,
SALK3 like mbew-SALK3,
wert like bseg-dmbtr,

END OF t_daten.
*........ALV.........................................................*
TYPE-POOLS: slis. " immer benötigt damit nachfol-
" gendes gefunden wird
DATA tabname TYPE slis_tabname VALUE 'T_DATEN'.
DATA: fieldcat TYPE slis_t_fieldcat_alv.
data: IS_LAYOUT TYPE SLIS_LAYOUT_ALV,
It_SORT TYPE SLIS_T_SORTINFO_ALV.
DATA VARIANT LIKE DISVARIANT.

*--------------------------------------------------------------------*
* Arbeitsfelder / Hilfsfelder *
*--------------------------------------------------------------------*
DATA: g_repid LIKE sy-repid.
*--------------------------------------------------------------------*
* Abgrenzungen *
*--------------------------------------------------------------------*
SELECT-OPTIONS:
* Select-options mit 's_' beginnend, Parameters mit 'p_'
s_matnr FOR t_daten-matnr,
s_mtart FOR t_daten-mtart,
s_matkl FOR t_daten-matkl.
PARAMETERS: P_LAYOUT LIKE DISVARIANT-VARIANT.


AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_LAYOUT.
PERFORM GET_LAYOUT.


*=====================================================================*
* PROCESSING *
*=====================================================================*
START-OF-SELECTION.
* Berechtigungsverprobung nötig, wenn nicht mit log. DB gearbeitet wird
PERFORM AUTHORITY_BEGIN(RSAQEXCE).
* darf der Benutzer die MARA lesen??
PERFORM AUTHORITY(RSAQEXCE) USING 'MARA'.
PERFORM AUTHORITY(RSAQEXCE) USING 'MAKT'.
PERFORM AUTHORITY(RSAQEXCE) USING 'MBEW'.
PERFORM AUTHORITY_END(RSAQEXCE).

* Materialdaten in t_daten selektieren
PERFORM get_marav.
perform get_mbew.

*=====================================================================*
* PROCESSING AFTER SELECTION *
*=====================================================================*
END-OF-SELECTION.
* nur fortfahren wenn mindestens 1 Satz selektiert wurde
DESCRIBE TABLE t_daten LINES sy-tfill.
IF sy-tfill = 0.
MESSAGE s010(es). "nix gefunden
EXIT.
ENDIF.
* sortieren
SORT t_daten.
* Ausgabe

*break-point.

* ALV Aufbau des Feldkatalogs
g_repid = sy-repid.
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
i_program_name = g_repid
i_internal_tabname = tabname
i_inclname = g_repid
CHANGING
ct_fieldcat = fieldcat[].
* optimale Spaltenbreite
is_layout-colwidth_optimize = 'X'.
is_layout-zebra = 'X'.
* Überarbeitung Feldkatalog
perform modify_fieldcatalog.
* Überarbeiten Sortierreihenfolge
perform modify_it_sort.



VARIANT-VARIANT = P_LAYOUT.

* ALV Listausgabe
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
I_CALLBACK_PROGRAM = g_REPID
* Kopie von SAPLKKBL STANDARD_FULLSCREEN
* i_callback_pf_status_set = 'PF_ALV_STATUS'
I_CALLBACK_USER_COMMAND = 'USER_COMMAND'
iS_LAYOUT = is_layout
it_SORT = It_SORT
it_fieldcat = fieldcat[]
* u = User darf Varianten nur für sich oder a = für alle abspeichern
I_SAVE = 'A' "
IS_VARIANT = VARIANT
I_CALLBACK_TOP_OF_PAGE = 'TOP_OF_PAGE'
I_GRID_TITLE = 'Special ALV'
TABLES
t_outtab = t_daten.




*........End of program...............................................*



*=====================================================================*
* FORM - ROUTINEN *
*=====================================================================*
*&---------------------------------------------------------------------*
*& Form get_marav
*&---------------------------------------------------------------------*
* Materialdaten selektieren
*----------------------------------------------------------------------*
* --> Abgrenzungen
* <-- t_daten
*----------------------------------------------------------------------*
FORM get_marav.
SELECT * INTO CORRESPONDING FIELDS OF TABLE t_daten
* nur für Testzwecke geignet: UP to 25 rows
* bei up to 1 rows wird immer der erste Eintrag gewählt
UP TO 25 ROWS
* es wird der View marav benutzt um nicht über die MAKT gegen zu müssen
FROM marav
WHERE matnr IN s_matnr
AND spras = sy-langu
AND mtart IN s_mtart
AND matkl IN s_matkl.

ENDFORM. " get_marav


*&---------------------------------------------------------------------*
*& Form modify_fieldcatalog
*&---------------------------------------------------------------------*
FORM modify_fieldcatalog.

* der Feldkatalog besitzt keine Kopfzeile
* Kopfzeilenersatz ist daher zu deklarieren

* Start lokale Datendeklarationen
data: wa_fieldcat like line of fieldcat.
* Ende lokale Datendeklarationen

loop at fieldcat into wa_fieldcat.
if wa_fieldcat-fieldname = 'WERT'.
wa_fieldcat-reptext_ddic = 'ddic-wert'(004).
wa_fieldcat-seltext_l = 'Materialwert'(001).
wa_fieldcat-seltext_m = 'Mat.-wert'(002).
wa_fieldcat-seltext_s = 'Mwert'(003).
wa_fieldcat-do_sum = 'X'.
modify fieldcat from wa_fieldcat.
endif. " wa_fieldcat-fieldname = 'WERT'


if wa_fieldcat-fieldname = 'SALK3'.
wa_fieldcat-no_out = 'X'.
modify fieldcat from wa_fieldcat.
endif. " wa_fieldcat-fieldname = 'WERT'

IF wa_FIELDCAT-FIELDNAME EQ 'MATNR'.
wa_FIELDCAT-HOTSPOT = 'X'.
MODIFY FIELDCAT FROM wa_FIELDCAT.
ENDIF.

IF wa_FIELDCAT-FIELDNAME EQ 'MTART'.
wa_FIELDCAT-KEY = 'X'.
MODIFY FIELDCAT FROM wa_FIELDCAT.
ENDIF.


endloop. " at fieldcat into wa_fieldcat



ENDFORM. " modify_fieldcatalog

*&---------------------------------------------------------------------*
*& Form modify_it_sort
*&---------------------------------------------------------------------*
FORM modify_it_sort.

* der Feldkatalog besitzt keine Kopfzeile
* Kopfzeilenersatz ist daher zu deklarieren

* Start lokale Datendeklarationen
data: wa_it_sort like line of it_sort.
* Ende lokale Datendeklarationen

wa_it_sort-fieldname = 'MTART'.
wa_it_sort-spos = 1.
wa_it_sort-up = 'X'.
wa_it_sort-subtot = 'X'.
append wa_it_sort to it_sort.

wa_it_sort-fieldname = 'MATKL'.
wa_it_sort-spos = 2.
wa_it_sort-up = 'X'.
wa_it_sort-subtot = 'X'.
append wa_it_sort to it_sort.



ENDFORM. " modify_it_sort

*&---------------------------------------------------------------------*
*& Form get_mbew
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM get_mbew.

data: bwkey like mbew-bwkey,
bwtar like mbew-bwtar.

bwkey = '1000'.
bwtar = ''.

loop at t_daten.

SELECT SINGLE lbkum salk3
FROM MBEW
into (t_daten-lbkum, t_daten-salk3)
WHERE MATNR = t_daten-matnr
AND BWKEY = bwkey
AND BWTAR = bwtar.

t_daten-wert = sy-tabix.
modify t_daten.

endloop. " at t_daten

ENDFORM. " get_mbew

*---------------------------------------------------------------------*
* FORM USER_COMMAND *
*---------------------------------------------------------------------*
FORM USER_COMMAND USING R_UCOMM LIKE SY-UCOMM
RS_SELFIELD TYPE SLIS_SELFIELD.


* R_UCOMM wird nicht abgefragt, da nur ein Kommando möglich
read table t_daten index rs_selfield-tabindex.


CASE RS_SELFIELD-FIELDNAME.
WHEN 'MATNR'.
IF NOT RS_SELFIELD-VALUE IS INITIAL.
SET PARAMETER ID 'MAT' FIELD RS_SELFIELD-VALUE.
* Sichtenauswahl abschalten
SET PARAMETER ID 'MM5' Field ' '.
* Sichtenauswahl auf Buchhaltungssicht 1 setzen
* Information über die Sichten aus dem Pflegestatus
SET PARAMETER ID 'MXX' Field 'B'.

SET PARAMETER ID 'WRK' Field '1000'.
CALL TRANSACTION 'MM03' AND SKIP FIRST SCREEN.
ENDIF.
ENDCASE.
*   um das Auffrischen anzustoßen Flag setzen
rs_selfield-refresh = 'X'.
* 'Festhalten' der aktuellen Position
rs_selfield-col_stable = 'X'.
rs_selfield-row_stable = 'X'.
ENDFORM.

*&---------------------------------------------------------------------*
*& Form GET_LAYOUT
*&---------------------------------------------------------------------*
FORM GET_LAYOUT.

DATA L_EXIT.
DATA L_VARIANT LIKE DISVARIANT.
VARIANT-REPORT = SY-REPID.
CALL FUNCTION 'REUSE_ALV_VARIANT_F4'
EXPORTING
IS_VARIANT = VARIANT
* I_TABNAME_HEADER =
* I_TABNAME_ITEM =
* IT_DEFAULT_FIELDCAT =
I_SAVE = 'U'
* I_DISPLAY_VIA_GRID = ' '
IMPORTING
E_EXIT = L_EXIT
ES_VARIANT = L_VARIANT
EXCEPTIONS
NOT_FOUND = 1
PROGRAM_ERROR = 2
OTHERS = 3
.
CHECK SY-SUBRC = 0.
IF L_EXIT EQ SPACE.
P_LAYOUT = L_VARIANT-VARIANT.
ENDIF.


ENDFORM. " GET_LAYOUT


*---------------------------------------------------------------------*
* FORM TOP_OF_PAGE *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
FORM TOP_OF_PAGE.
DATA LISTHEADER TYPE SLIS_T_LISTHEADER.

DATA W_LISTHEADER TYPE SLIS_LISTHEADER.

W_LISTHEADER-TYP = 'H'.
W_LISTHEADER-INFO = 'Dies ist der Kopf'.
APPEND W_LISTHEADER TO LISTHEADER.

W_LISTHEADER-TYP = 'S'.
w_listheader-key = 'Werk:'.
W_LISTHEADER-INFO = '1000'.
APPEND W_LISTHEADER TO LISTHEADER.

CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
IT_LIST_COMMENTARY = LISTHEADER
* I_LOGO =
* I_END_OF_LIST_GRID =
.

ENDFORM.