Anfang des InhaltsbereichsHintergrunddokumentation Datenbindung Dokument im Navigationsbaum lokalisieren

Um Ihnen die Programmierung mit dem MVC Design zu erleichtern, stellt Ihnen das Framework für das Model einer Anwendung eine Basisklasse CL_BSP_MODEL zur Verfügung, die Sie als vererbende Klasse für Ihre eigene Model-Klasse verwenden. Die Model-Klasse stellt den Datenkontext Ihrer Anwendung dar und enthält somit eine Kopie (oder Referenzen auf die Daten) der für den View relevanten Daten aus dem Datenbank-Modell.

Die Model-Klasse stellt zur Verfügung:

Ein Controller kann eine Model-Klasse oder auch mehrere Model-Klassen instantiieren (siehe auch Aufruf der Model-Klasse durch den Controller). Der Controller hält sich zur Laufzeit eine Liste aller Modell-Instanzen, analog zur Liste der Unter-Controller.

Der Controller vergibt eindeutige Ids an jede Model-Instanz.

Hinweis

Wenn Sie das MVC Design Pattern verwenden, besteht keinerlei Notwendigkeit, die StrukturlinkApplikationsklasse einzusetzen. Anstelle der bei rein seitenbasierten BSP-Applikationen üblichen Applikationsklasse verwenden Sie im MVC-Umfeld Controller und Model-Klassen.

Die Datenbindung ist insbesondere bei den HTMLB-Extension-Elementen inputField und label von Bedeutung (siehe auch Dokumentation zu diesen Elementen im System). Außerdem ist sie für die HTMLB-Elemente dropdownListBox, radioButtonGroup, checkbox, textEdit und tableView implementiert.

Eine Model-Klasse kann entweder ganz einfach gestaltet sein oder aber für komplexere Anwendungsfälle ausgeprägt sein.

Einfache Model-Klasse

Die Datenbindung ist insbesondere für die Wertübergabe von Ein- und Ausgabedaten nützlich. Sie fügen die von dem View benötigten Daten in Form von Attributen Ihrer Model-Klasse hinzu. Diese Attribute sind alle vom Sichtbarkeitsbereich public und können Folgendes sein:

Im einfachsten Fall besitzt die Model-Klasse lediglich diese Attribute und kann somit im Rahmen einer BSP-Applikation sehr leicht für die Datenbindung eingesetzt werden.

Eine solche ganz einfache Model-Klasse bietet die folgende Funktionalität:

Beispiel

Beispiel:

In einer BSP-Applikation gibt es ein über HTMLB realisiertes Eingabefeld, in das der Benutzer Eingaben schreiben kann.
Als Seitenattribut sei
model definiert. Dann kann für das Eingabefeld geschrieben werden:
<htmlb inputField … value="//model/<Attribut>"
Dadurch wird erreicht, dass der Inhalt von value an das entsprechende Attribut der Model-Klasse gebunden wird.

Der Verarbeitungsablauf ist nun folgendermaßen:

      1. Dem Inhalt des Attributs wird über die obige Anweisung der Wert des Eingabefeldes zugewiesen.
      2. Dabei wird die ID aus dem Model generiert.
      3. Außerdem werden zusätzliche Eigenschaften generiert, z.B. ob eine F4-Hilfe verfügbar ist oder ob Festwerte existieren.
      4. Beim nächsten Request wird die Benutzereingabe in die Model-Klasse übernommen.
      5. Datenkonvertierungen inklusive Dictionary-Anbindung (z.B. Konvertierungsexits) werden von der Basis-Model-Klasse automatisch durchgeführt.

Im Standardfall wird, falls für ein Feld im Data Dictionary ein Konvertierungsexit besteht, dieser Konvertierungsexit aufgerufen. Alle Daten, die in der Data-Dictionary-Struktur für das Feld enthalten sind, stehen zur Verfügung. Wenn jedoch eigene Setter- /Getter-Methoden (siehe nächster Abschnitt) geschrieben werden, kann der Konvertierungsexit ausgeschaltet werden.

Bei Bedarf können Sie auch Ihrer Model-Klasse eigene Methoden für die weitere Bearbeitung der Attribute hinzufügen.

Komplexe Model-Klasse

Es kann vorkommen, dass einfache Model-Klassen nicht ausreichen. Dies ist z.B. dann der Fall, wenn mit generischen Daten gearbeitet wird oder wenn besondere Methoden zum Setzen (SET) und Holen (GET) von Attributen benötigt werden. Also können Sie über diese Methoden eigene Implementierungen festlegen, die für Ihre spezifische Anwendung wichtig sind.

Für derartige Anwendungsfälle gibt es auf der Basisklasse Kopiervorlagen für Setter- und Getter-Methoden: _SET_<Attribut> und _GET_<Attribut> . Diese Vorlagen beginnen alle mit _. Die Namenskonventionen für die eigentlichen Methoden sind folgendermaßen:

Syntax

Namenskonventionen für Setter-Methoden:

SET_<Attribut> für ein Feld
SET_S_<Attribut>
für eine Struktur
SET_T_<Attribut>
für eine Tabelle

 

Syntax

Namenskonventionen für Getter-Methoden:

GET_<Attribut> für ein Feld
GET_S_<Attribut>
für eine Struktur
GET_T_<Attribut>
für eine Tabelle

Beispiel

Beispiel für eine Implementierung einer Getter-Methode für Strukturfelder/Strukturattribute:

method GET_S_FLIGHT .
field-symbols: <l_comp> type any.

  assign component component of structure flight to <l_comp>.
  value = <l_comp>.
  if component eq 'CARRID'.
    translate value to lower case.
  endif.
  if component eq 'CONNID'.
    shift value left deleting leading '0'.
  endif.
endmethod.

Hier wird durch das ABAP-Schlüsselwort assign component die Strukturkomponente component des strukturierten Feldes flight (das den Bezugstyp sflight hat) dem Feldsymbol <l_comp> zugewiesen. Der Wert von <l_comp> wird folgendermaßen ausgegeben: Zeigt die Strukturkomponente component auf eine Fluggesellschaft (CARRID), dann wird der Name der Fluggesellschaft in Kleinbuchstaben übersetzt. Zeigt dagegen die Strukturkomponente component auf eine Einzelflugverbindung (CONNID), dann werden eventuelle führende Nullen gelöscht.

 

Achtung

Beachten Sie, dass Sie in einem SAP Web AS System unter 6.30 bei der Verwendung von Setter- und Getter-Methoden die Metadaten explizit durch Getter-Methoden beschaffen müssen. Hierfür lautet die Syntax:

GET_M <Attribut> für ein Feld
GET_M_S_<Attribut>
für eine Struktur
GET_M_T_<Attribut>
für eine Tabelle

Ab SAP Web AS 6.30 geschieht dies automatisch.

Sobald eine Setter- oder eine Getter-Methode gesetzt wurde, kommt sie automatisch zum Einsatz.

Aufgrund der Namensgleichheit ist die Datenbindung automatisch verfügbar. In der Methode DO_HANDLE_DATA (siehe auch Verarbeitungsablauf) der Klasse CL_BSP_CONTROLLER2 werden die Daten der Models automatisch aus den Form-Feldern gefüllt.

Die Pfadangaben für die Model-Daten haben folgende Syntax:

value="//<Feldname>"

value="//<Strukturname>.<Feldname>"

value="//<Tabellenname>[<Zeilenindex>].<Feldname>"

Ende des Inhaltsbereichs