Generisch Feldwert auslesen und aktualisieren
Siehe Dynamische/Generische Programmierung.
Siehe Kategorie: Dynamische/Generische Programmierung.
Es kann der Fall vorkommen, dass erst zur Laufzeit sich entscheidet von welchem Feld einer Struktur ein Wert gelesen wird, bzw. zurückgeschrieben werden muss.
Anwendungsfall: Generisch ALV-Feld ändern mit Popupwert
In einem Praxis-Anwendungsfall war die Anforderung, dass einzelne Zellen einer ALV-Liste änderbar sein sollten. Dies wurde realisiert, indem per Doppelklick der Wert einer Zelle in einem Popup-Dialog (Funktionsbaustein 'POPUP_GET_VALUES') angezeigt wurde und hier änderbar war. Dieser geänderte Wert musste dann in die Zeile/Workingarea zurückgeschrieben werden.
Das ist nicht trivial, weil sich erst zur Laufzeit entscheidet, auf welchem Feld der Doppelklick passierte. Daher kann dieser Feldname nicht hart im Coding eingetragen werden.
Hier kann man mit dem Befehl "Assign component" zur Laufzeit den betreffenden Feldwert in ein Feldsymbol schreiben. Durch Aktualisierung dieses Feld-Symboles wird automatisch auch die Struktur LS_ALV_FI aktualisiert, da das Feldsymbol nur einen Zeiger auf das Strukturfeld darstellt.
In der Struktur RS_SELFIELD steht u. a. der Feldname, auf den in der ALV-Liste ein Doppelklick passierte.
form alv_user_command "#EC CALLED using r_ucomm type sy-ucomm rs_selfield type slis_selfield. Field-Symbols: <fs_value> type any. "Das Field-Symbol bekommt nun den Typ des Feldnamens, der in RS_SELFIELD-FIELDNAME steht assign component rs_selfield-fieldname of structure ls_alv_fi to <fs_value>. ... (Popupfunktionalität Funktionsbaustein POPUP_GET_VALUES, neuer Wert in LS_FIELDS-VALUE) "Das Field-Symbol <FS_VALUE> bekommt den Wert von LS_FIELDS-VALUE zugewiesen <fs_value> = ls_fields-value. endform.
In dem Feldsymbol <FS_VALUE> steht nun abschließend der aktualisierte Wert.
Anwendungsfall: Generische Field-Symbol-Tabelle aktualisieren
field-Symbols: <ft_itab> type table,
<fs_itab> type any,
<fs_kunnr> type kunnr.
if <ft_itab> is ASSIGNED.
loop at <ft_itab> ASSIGNING <fs_itab>.
assign COMPONENT 'ZZKNDNR' of STRUCTURE <fs_itab> to <fs_kunnr>.
<fs_kunnr> = ...
endloop.
endif.
Anwendungsfall: Alle Felder der generischen Struktur lesen
Über eine DO-ENDDO-Schleife und den Befehl
ASSIGN COMPONENT SY-INDEX OF STRUCTURE <structure_fieldsymbol> TO <feld_fieldsymbol>.
lassen sich alle Felder eines generischen Field-Symbols auslesen und weiterverarbeiten.
FIELD-SYMBOLS: <fs_zeile> TYPE any,
<fv_feld> TYPE any.
DO.
ASSIGN COMPONENT sy-INDEX OF STRUCTURE <fs_zeile> TO <fv_feld>.
IF sy-subrc NE 0.
EXIT.
ENDIF.
WRITE: / <fv_feld>.
ENDDO.
Anwendungsfall: Coding im Produktiv, aber Feldname existiert noch nicht
Das Coding sollte schon ins Produktiv. Aber das Feld BSTKD von der Tabelle Z_RET_HEAD wird erst in ein paar Tagen dort live sein.
Würde das Feld normal angesprochen werden, würde es aktuell einen Syntaxfehler im Produktiv geben. Man müsste normal warten, bis das Feld auch im Produktiv ist. Aber mit dem Feldsymbol kann man das Coding schon einbauen ohne Syntaxfehler und sobald das neue Feld BSTKD in der Tabelle Z_RET_HEAD vorhanden ist, wird auch die Variable CD_KDRETOURENNR gefüllt.
*Lese Kundenretourennummer
SELECT single *
INTO ls_head
FROM z_ret_head
WHERE vbeln = cv_retourennr.
IF sy-subrc = 0.
ASSIGN COMPONENT 'BSTKD' OF STRUCTURE ls_head TO <fv_bstkd>.
IF sy-subrc = 0.
cv_kdretourennr = <fv_bstkd>.
ENDIF.
ENDIF.
Anwendungsfall: In Tabelle werden Ausnahmewerte zu Tabellenname und Feldname bestimmt
- In der Tabelle ZSD_ATP_EXCEPTS stehen die Ausnahmen für die eine Kundenauftragsaufprüfung nicht erfolgen soll.
Die Methode "_CHECK_EXCEPTS" prüft im User-Exit der Kundenauftragsanlege, ob im Auftragskopf oder auf der ersten Kundenauftragsposition, ob ein Eintrag in der Ausnahmetabelle vorliegt.
METHOD _check_excepts. DATA: ls_atp_excepts TYPE zsd_atp_excepts. FIELD-SYMBOLS: <fv_dyn> TYPE any. DATA: lv_tabstring TYPE char100, lv_value TYPE zsd_atp_excepts-value. * Lese in einer Schleife alle Ausnahmen aus, * für die die Prüfungen nicht gelten sollen. * Wenn eine Ausnahme gilt, dann setze Returnparameter * und verlasse Routine SELECT * INTO ls_atp_excepts FROM zsd_atp_excepts. * Lese Wert vom Feld der Tabelle lv_value = ls_atp_excepts-value. * Feldname muss zwingend gefüllt sein IF ls_atp_excepts-fieldname is not initial. CASE ls_atp_excepts-tabname. WHEN 'VBAK'. * Lese (dynamisch) den Wert vom Feldnamen der Struktur IS_VBAK (Kopf Kundenauftrag) ASSIGN COMPONENT ls_atp_excepts-fieldname OF STRUCTURE is_vbak TO <fv_dyn>. WHEN 'VBAP'. * Lese die erste Position READ TABLE it_xvbap ASSIGNING FIELD-SYMBOL(<fs_xvbap>) INDEX 1. * Lese (dynamisch) den Wert vom Feldnamen der Struktur IS_VBAK (Kopf Kundenauftrag) ASSIGN COMPONENT ls_atp_excepts-fieldname OF STRUCTURE <fs_xvbap> TO <fv_dyn>. ENDCASE. * Wenn die Ausnahme gilt, dann setze Returnparameter und verlasse Routine IF <fv_dyn> = lv_value. rv_no_check = 'X'. RETURN. ENDIF. ENDIF. ENDSELECT. ENDMETHOD.
Beim Aufruf der Methode "_CHECK_ATP_EXCEPTS" wird geprüft, ob der Returnparameter "NO_CHECK" nicht gefüllt ist.
Data(no_check) = zcl_sd_mv45afzz=>_check_atp_excepts( exporting is_vbak = cs_vbak IT_XVBAP = CT_XVBAP ). check no_check = space.