Ausgangslage

Wenn man eine Fiori Elements App auf Basis von CDS-Views erstellt, entsteht oft auch die Anforderung, dass neue Elemente erstellt werden sollen.
Mit den Annotationen createEnabled, deleteEnabled und updateEnabled lässt sich dies ziemlich schnell realisieren. Allerdings können standardmäßig Felder nur für alle CRUD-Operationen hinweg entweder eingabebereit oder nicht eingabebereit gesetzt werden. Gerade bei einem Schlüsselfeld ist dies nicht wünschenswert, da diese im Update-Fall eines Elements natürlich nicht geändert werden sollen. Fiori Elements verhält sich standardmäßig übrigens so, dass Key-Felder beim Update in der UI überschrieben werden können. Die Werte werden aber nicht in den jeweiligen Backend-Tabellen abgespeichert sondern verbleiben auf ihren alten Werten. Dies kann für Endbenutzer natürlich verwirrend sein. In diesem Blogbeitrag zeige ich, wie man einzelne Felder während der Update-Operation auf readonly setzen kann.

Beispielszenario

In einer Fiori-Elements-App, die auf Basis der Tabelle SFLIGHT erstellt wurde, sind auch die Key-Felder bearbeitbar. Dies

Anpassung der Composition View in Eclipse

Zunächst einmal müssen wir auf Feld-Ebene in der Composition View beschreiben, dass das readonly-Attribut extern vergeben werden soll. Dies machen wir mit der Annotation @ObjectModel.readOnly: 'EXTERNAL_CALCULATION'. Hier einmal ein Beispiel, wie dies in einem fertigen Beispiel aussehen kann:

Implementierung der Feldsteuerung in BOPF

Nun müssen wir nur noch eine Feldsteuerung in BOPF implementieren, die genau diese externe Vergabe regelt:

      1. Dazu navigieren wir zunächst in die Transaktion bobx und wählen das Geschäftsobjekt aus (Ausklappen: Lokale Business-Objekte -> Geschäftsobjekte -> Geschäftsobjekt mit dem Namen deiner Composite-View mit Doppelklick auswählen):
      2. Hier generieren wir zunächst ein Konstanteninterface.
      3. In der folgenden Ansicht klicken wir uns bis zur schon vorhandenen Ermittlung ACTION_AND_FIELD_CONTROL durch und öffnen die implementierende Klasse mit einem Doppelklick.
      4. Anschließend öffnet sich der Class Builder. Dort wählen wir mit einem Doppelklick die Methode execute aus.
      5. In dieser Methode erstellen wir uns erst zwei Variablen. Die Typen dafür kannst du aus dem Business-Objekt in der Transaktion bobx entnehmen. Mit der retrieve-Methode lesen wir die vom Benutzer eingegebenen Daten via BOPF.
      6. Danach können wir mit dem Property-Helper und dem Konstanteninterface von BOPF die Eigenschaften eines spezifischen Felds ändern.
      7. Wenn man nun einen Eintrag in der App bearbeiten möchte, ist die Fluggesellschaft nicht mehr eingabebereit.

Kompletter Code

Hier kannst du den kompletten Code aus dem Tutorial herunterladen:

  METHOD /bobf/if_frw_determination~execute.
    DATA: lt_sflight TYPE ztcsflight,
          ls_sflight TYPE zscsflight.

    " Lese Daten via BOPF
    io_read->retrieve(
      EXPORTING
        iv_node = is_ctx-node_key
        it_key = it_key
      IMPORTING
        et_data = lt_sflight
    ).
    
        
    " Setze für ein Key-Attribut das Feld auf Readonly
    DATA(lo_property_helper) = NEW /bobf/cl_lib_h_set_property( io_modify = io_modify is_context = is_ctx ).
    LOOP AT l_t_msg_con REFERENCE INTO l_s_msg_con.

      lo_property_helper->set_attribute_read_only(
           iv_attribute_name = ZIF_C_SFLIGHT_C=>sc_node_attribute-zc_sflight-carrid
           iv_key            = l_s_msg_con->key ).

    ENDLOOP.
    
  ENDMETHOD.

 

 

Fazit & Ausblick

Mit Feldsteuerungen können Fiori Elements App individualisiert werden. Sie sind ein gutes Werkzeug, um die UX von Apps zu verbessern und noch sehr viel mächtiger als in diesem Beispiel gezeigt. In zukünftigen Beiträgen werde ich noch weitere Feldsteuerungen verwenden, um die Möglichkeiten aufzuzeigen. Weitere Informationen zum Thema Feldsteuerung und Ermittlungen in BOPF findest du auch in folgendem Blogbeitrag: https://blogs.sap.com/2020/12/10/determination-in-bopf
Wie nutzt du Feldsteuerungen in BOPF?

Categorized in:

CDS, Fiori, S4,