Generisch Feldwert auslesen und aktualisieren

Aus SAP-Wiki
Zur Navigation springenZur Suche springen

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.

Excepts1.jpg


Excepts2.jpg


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.

Web-Links