Hinzufügen neuer Bücher
Auf der Seite Editing Page können wir neue Bücher hinzufügen, indem wir Autor- und Buchinformationen ausfüllen. Für diese Seite wird die Seitenquelle $EditBook verwenden. Über diese Seitenquelle werden die Daten eines einzigen Buchs ausgewählt und angezeigt: Die Autor-ID und die Buch-ID des auszuwählenden Buchs stammen aus der $PERSISTENT-Struktur. Wenn wir nun diese Unterseite als Formular zum Ausfüllen der Informationen über ein neues Buch und Anzeigen einer Seite mit leeren Eingabefeldern verwenden möchten, so dürfen wir keinen bestehenden Datensatz aus der Datenbank auswählen. Wir müssen leere Felder für die Dateneingabe zur Verfügung stellen. Dazu setzen wir vor dem Öffnen der Unterseite die IDs der $PERSISTENT-Struktur jeweils auf den leeren String.
Wir müssen jedoch sicherstellen, dass wir als Primärschlüssel des neuen Autor- und Buch-Datensatzes eindeutige IDs verwenden. Dazu inkrementieren wir den höchsten vorhandenen ID-Wert in der jeweiligen Tabelle um eins.
Die Text- und Bildfelder der Seitenquelle $EditBook können auf dieselbe Art wie beim Ändern der Werte bearbeitet werden. Wenn $EditBook gespeichert wird, werden die neue Daten in der Tabelle Authors bzw. Books in einem neuen Autor- bzw. Buchdatensatz gespeichert. Die beiden neuen Datensätze haben nicht nur neue eindeutige IDs, sondern auch den korrekten Sekundärschlüssel in der Tabelle Books - einen, der ihn mit dem korrekten Autor verknüpft.
Der oben beschriebene Mechanismus wird mit Hilfe der Aktionen (i) der Schaltfläche Add New Book auf der Seite Main Page und (ii) der BeimLadenDerSeite-Aktionen der Seite Editing Page implementiert. Diese beiden Aktionsgruppen werden unten beschrieben.
Add New Book-Aktionen (Hauptseite)
Die Aktionen zum Aufrufen der Unterseite Editing Page, werden für die Schaltfläche Add New Book definiert (siehe Abbildung unten).
Die Aktionen sind insofern dieselben wie diejenigen zum Bearbeiten eines Buchs, als die Aktionsgruppe Edit Author aufgerufen wird. Beachten Sie jedoch, dass vor Aufruf der Aktionsgruppe die Daten in der $PERSISTENT-Struktur neu initialisiert werden, wobei Genre auf All gesetzt wird.
Die Parameter $AuthorID und $BookID (siehe Abbildung oben) werden im Aufruf der Aktionsgruppe Edit Author auf den leeren String gesetzt. In der Edit Author Aktionsgruppe werden die Nodes EditAuthorID und EditBookID der $PERSISTENT-Struktur mit diesen Werten aktualisiert (siehe Abbildung unten). Dies ist wichtig, da die Seitenquelle $EditBook der Unterseite Editing Page das anzuzeigende Buch entsprechend den Werten in der $PERSISTENT-Struktur auswählt. Da es sich bei diesen Werten um die leeren Strings handelt, gibt es keinen Datensatz in der Datenbank, der ausgewählt wird. Folglich wären die Nodes der Seitenquelle $EditBook und somit auch die Eingabefelder der Seite leer.
Es gibt jedoch drei Datenbankfelder, die nicht leer sein dürfen. Hierbei handelt es sich um die Primärschlüssel des neuen Authors- und des neuen Books-Datensatzes sowie den Sekundärschlüssel des Books-Datensatzes, der diesen Books-Datensatz mit dem neuen Authors-Datensatz verknüpft. Die Werte dieser Schlüssel werden wie unten beschrieben als Aktionen des BeimLadenDerSeite-Ereignisses der Unterseite definiert.
BeimLadenDerSeite-Aktionen (Editing Page)
Die Aktionen der BeimLadenDerSeite-Ereignisses bewirken Folgendes:
•Sicherstellen, dass die Seitenquelle $EditBook die erwartete Struktur des Authors-Parent-Elements einschließlich des Books Child-Elements hat. Diese geschieht mit Hilfe der XPath-Erweiterungsfunktion mt-get-page-source-structure (siehe Abbildung unten).
•Ermittlung des höchsten Ganzzahlwerts unter den Autor-IDs. Aktualisierung dreier Nodes mit diesem um 1 inkrementierten Wert: (i) $PERSISTENT/Root/EditAuthorID; (ii) des Node, der dem Primärschlüssel der Tabelle Authors entspricht (Row/@Author_ID); (iii) des Node, der dem Sekundärschlüssel der Tabelle Books entspricht (Row/Books/Row/@Author_ID).
•Ermittlung des höchsten Ganzzahlwerts unter den Buch-IDs. Aktualisierung von zwei Nodes mit diesem um 1 inkrementierten Wert: (i) $PERSISTENT/Root/EditBookID; (ii) des Node, der dem Primärschlüssel der Books-Tabelle entspricht (Row/Books/Row/@Book_ID).
Anmerkung: | Die Nodes Author_ID und Book_ID sind die Primärschlüssel der Tabellen Authors bzw. Books. Jede ID muss daher eindeutig sein, weshalb eine neue ID immer einen Wert erhält, der um 1 höher ist als der höchste Wert der vorhandenen IDs. Dies ist in einigen Fällen allerdings keine ideale Methode. Eine alternative Methode wird im nächsten Abschnitt Automatische Inkrementierung von Primärschlüsseln beschrieben. |
Beachten Sie die folgenden Punkte:
•Mit dem ersten IF-Ausdruck wird überprüft, ob die ID-Nodes in der $PERSISTENT-Struktur beide leer sind. Wir haben festgelegt, dass diese leer sein sollen, wenn der Benutzer einen neuen Datensatz hinzufügt (siehe Add New Book-Aktionen oben).
•Mit dem zweiten IF-Ausdruck wird überprüft, ob aus der Datenbank ein Datensatz importiert wurde. Da keiner vorhanden ist, wird die Seitenquellstruktur angehängt.
•Mit der ersten der beiden DB ausführen-Aktionen (blau markiert) wird die Datenbank nach dem höchsten Ganzzahlwert unter den Autor-IDs abgefragt und der Wert wird als Attribut mit dem Namen @pk in der dynamischen Variablen $MT_DBExecute_Result gespeichert. (Bei dieser Variablen handelt es sich um eine XML-Struktur. Sie kann mit der XPath-Funktion serialize serialisiert werden, wenn Sie ihre Struktur sehen möchten)
•Mit Hilfe der ersten Gruppe von Node aktualisieren-Aktionen werden die Autor-ID-Nodes in der $PERSISTENT-Struktur und der Seitenquelle $EditBook aktualisiert.
•Die zweite der beiden DB ausführen-Aktionen ähnelt der ersten. Damit wird die Datenbank nach dem höchsten Ganzzahlwert unter den Buch-IDs abgefragt und der Wert wird als Attribut mit dem Namen @pk in der dynamischen Variablen $MT_DBExecute_Result gespeichert.
•Mit Hilfe der zweiten Gruppe von Node aktualisieren-Aktionen werden die Buch-ID-Nodes in der $PERSISTENT-Struktur und der Seitenquelle $EditBook aktualisiert.
Die wichtigen ID-Felder des Datensatzes wurden nun mit den entsprechenden eindeutigen IDs befüllt und der Datensatz wird zur Dateneingabe auf der Unterseite Editing Page angezeigt. Die eingegebenen Daten werden in der Seitenquelle $EditBook gespeichert. Beim Speichern der Seitenquelle werden die neuen Daten als ein Authors- und ein Books-Datensatz in der Datenbank gespeichert, wobei diese Datensätze über den Sekundärschlüssel des Books-Datensatzes miteinander verknüpft sind. Die Aktionen zum Speichern und Abbrechen sind dieselben wie die zur Bearbeitung eines Datensatzes.
Autoinkrementierung von Primärschlüsseln
In unserem Beispiel oben haben wir den Primärschlüsselwert des neuen Datensatzes folgendermaßen berechnet: Wir suchen nach der höchsten Ganzzahl unter allen IDs der entsprechenden Tabelle, addieren den Wert 1 zu diesem Wert und weisen den erzeugten Wert dem neuen Datensatz als ID zu.
Diese Methode wäre jedoch nicht ideal, wenn ein Benutzer einen neuen Datensatz hinzufügt, diesen noch nicht gespeichert hat und währenddessen ein zweiter Benutzer beginnt, einen neuen Datensatz hinzuzufügen. In diesem Fall hätten beide Datensätze dieselbe ID, wodurch das Kriterium der Eindeutigkeit nicht erfüllt würde und folglich einer der Datensätze nicht in die Datenbank aufgenommen würde.
Eine alternative Methode wäre, festzulegen, dass die Primärschlüsselfelder der Datenbank automatisch inkrementiert werden, wenn ein neuer Datensatz zur Datenbank hinzugefügt wird. Somit müsste kein Wert - erst recht kein eindeutiger - für das Primärschlüsselfeld eingegeben werden, da von der Datenbank bei Eingabe des Datensatzes bereits automatisch ein eindeutiger Wert vergeben wird.
Es gibt folgende Möglichkeiten, um die Autoinkrementierung für ein Datenbankfeld zu definieren:
•Definieren Sie in der Datenbank das zu inkrementierende Feld. Wenn ein neuer Datensatz aus der Lösung in der Datenbank gespeichert wird, wird das Primärschlüsselfeld automatisch um einen eindeutigen Wert inkrementiert.
•Klicken Sie im Fenster "Seitenquellen" Ihres Designs mit der rechten Maustaste auf das gewünschte Feld und wählen Sie DB-Feld | Ist automatisch inkrementierter Wert. Wenn der Datensatz in der Datenbank gespeichert wird, wird das Feld automatisch inkrementiert.