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