Generisch Feldwert auslesen und aktualisieren

Aus SAP-Wiki
Wechseln zu: Navigation, Suche

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.

Web-Links