Altova MobileTogether Designer

Die Hauptseite hat drei Seitenquellen: \$XML1, \$DB1 und \$DB2. Diese werden im Fenster "Seitenquellen" (siehe Abbildung) angezeigt und verwaltet.

MTDDBCDataSrcMain01

Der XPath-Kontext-Node der Seite ist der Root-Node \$XML1, d.h. alle XPath-Ausdrücke auf dieser Seite haben \$XML1 als Kontext-Node. Um einen Node in einer der anderen Strukturen (\$DB1 und \$DB2, welche die Root-Nodes dieser Strukturen sind) zu identifzieren, beginnen Sie den XPath-Locator-Pfad mit dem entsprechenden Root-Node.

 

Die erste Seitenquelle: \$XML1

Diese Seitenquelle wurde als leere, editierbare XML-Datei erstellt. Der Root-Node \$XML1 enthält ein Root-Element (root), das zwei Attribute hat (DesiredOffice und DesiredYear). Der Root-Node \$XML1 wurde (über sein Kontextmenü) als XPath-Kontext-Node für Seite zwei definiert. Es ist keine Standarddatei definiert, daher werden keine Daten in die Struktur importiert.

MTDDBCDataSrcXML1

Diese Seitenquelle (\$XML1) wurde für die vom Endbenutzer in der Auswahlliste ausgewählten Einträge erstellt:

 

Das Attribut DesiredOffice enthält die Office-Auswahl des Endbenutzers

Das Attribut DesiredYear enthält die Year-Auswahl des Endbenutzers

 

Um die in den Auswahllisten gewählten Daten zu erhalten, wurden die beiden Attribut-Nodes mit den Auswahllisten als Links zur Seitenquelle verknüpft. Dazu wurden die Attribut-Nodes auf die entsprechende Auswahlliste gezogen (siehe Abbildung aus dem Simulator unten).

MTDDBCSimulatorComboBoxes01

Für jeden der Nodes wurde (über den Kontextmenüeintrag Beim Laden auf Vorhandensein überprüfen (XPath-Wert)) ein Anfangswert definiert, der beim Laden der Seite verwendet wird, damit ein Anfangswert in der Auswahlliste angezeigt wird (siehe Abbildung oben aus dem Simulator). Die XPath-Ausdrücke, die die Anfangswerte bereitstellen, lauten folgendermaßen:

 

Für @DesiredOffice: if (count(\$DB1/DB/RowSet/Row) > 0) then \$DB1/DB/RowSet/Row[1]/@id else ""
Wenn \$DB1 einen oder mehrere Datensätze enthält, dann definiere den @id Wert des ersten Datensatzes als Wert von @DesiredOffice. Wenn kein Datensatz vorhanden ist, dann definiere den leeren String als Wert von @DesiredOffice.
 

Für @DesiredYear: min(distinct-values(\$DB2/DB/RowSet/Row[@Office=\$XML1/root/@DesiredOffice]/@Year))
Wählt in \$DB2 alle Datensätze der in @DesiredOffice ausgewählten Niederlassung aus, ruft die eindeutigen Jahre aus diesen Datensätzen ab und wählt anschließend das Jahr mit dem niedrigsten numerischen Wert aus.

 

Außerdem haben wir definiert, dass der Node @DesiredOffice korrekt befüllt wird, wenn die Hauptseite geladen wird. Dies geschieht mittels einer Node aktualisieren Aktion im Ereignis BeimLadenDerSeite der Hauptseite (Seite | Seitenaktionen).

MTDDBCOnPageLoad

Die Aktion aktualisiert den Node @DesiredOffice. Wenn die Seite zum ersten Mal geladen wird, so wird die ID der ersten Niederlassung als Inhalt von @DesiredOffice übergeben. Andernfalls bleibt der bereits in @DesiredOffice vorhandene Wert erhalten. Das Ergebnis ist, dass der Wert in @DesiredOffice während einer Ausführung nicht geändert, aber aktualisiert wird, wenn die Seite zum ersten Mal geladen wird.

 

Die zweite Seitenquelle: \$DB1

Die zweite Seitenquelle (\$DB1) ist die Tabelle Offices in der MS Access-Datenbank OfficeSales_DB.mdb. Die Daten für dieses Datenstruktur stammen aus der Tabelle Office der Datenbank.

MTDDBCDataSrcDB1

Die Tabelle "Offices" hat zwei Spalten (id und City), die in der Datenstruktur in Form von Attributen des Elements Row, das selbst wiederum einer Zeile in der DB-Tabelle entspricht, repräsentiert werden. Da die Spalte id der Primärschlüssel ist und Werte darin nicht geändert werden können, können wir diese Spalte nicht bearbeiten. Wir müssen jedoch für neue Zeilen id-Werte erstellen. Wir automatisieren diesen Vorgang, indem wir einen XQuery-Ausdruck zur Generierung des id-Werts für jede neu erstellte Zeile schreiben. Der XQuery-Ausdruck wird über den Kontextmenübefehl Beim Laden auf Vorhandensein überprüfen (XPath-Wert) eingefügt:

 

let \$all := \$DB1/DB/RowSet/Row/@id

let \$ids := remove(\$allindex-of(\$all""))

let \$id := if (empty(\$ids)) then 1 else max(\$ids) + 1

return \$id

 

Beachten Sie, dass der id-Wert die eindeutige ID der Niederlassung ist, während der City-Wert der Name der Stadt, in der sich die Niederlassung befindet, ist. Dies ist deshalb wichtig, weil die Niederlassung zwar anhand ihrer ID identifziert wird (über den Node \$XML1/root/@DesiredOffice), doch der Endbenutzer eine Niederlassung anhand des Namens der Stadt identifiziert.

 

Wenn ein Node in der Seitenquelle bearbeitet werden soll, muss (über das Kontextmenü) ein OriginalRowSet-Node erstellt werden, damit OriginalRowSet die Originaldaten enthält, während RowSet die aktuellen (bearbeiteten) Daten enthält. MobileTogether Designer benötigt diese beiden Datengruppen (die Originaldaten und die bearbeiteten), um zu erkennen, welche Daten neu, aktualisiert und gelöscht wurden und dadurch zum richtigen Zeitpunkt die notwendigen Änderungen vorzunehmen. Ein weiterer Grund dafür ist, dass dadurch mit der XQuery-Anweisung let neue Primärschlüssel erstellt werden können. Sobald die Datenbank aktualisiert wird, werden die aktualisierten Daten zu den neuen Originaldaten und in den Node OriginalRowSet geschrieben.

 

Die dritte Seitenquelle: \$DB2

Die dritte Seitenquelle (\$DB2) ist die Tabelle "Sales" in der MS Access-Datenbank OfficeSales_DB1.mdb. Die Daten für diese Datenstruktur stammen aus der Datenbanktabelle "Sales".

MTDDBCDataSrcDB2

Jede Zeile in der Tabelle "Sales" hat fünf Spalten (id , Licenses, Month, Year und Office). Die DB-Tabellenzeile entspricht dem Element Row in der Datenquellstruktur. Die Spalten der Tabelle entsprechen den Attributen des Elements Row. Das Attribut id hat einen XQuery-Ausdruck zur Generierung des id-Werts für jede neu erstellte Zeile. Der XQuery-Ausdruck wird über den Kontextmenübefehl Beim Laden auf Vorhandensein überprüfen (XPath-Wert) eingefügt:

 

let \$all := \$DB1/DB/RowSet/Row/@id

let \$ids := remove(\$allindex-of(\$all""))

let \$id := if (empty(\$ids)) then 1 else max(\$ids) + 1

return \$id

 

Wenn ein Node in der Seitenquelle bearbeitet werden soll, muss (über das Kontextmenü) ein OriginalRowSet-Node erstellt werden, damit OriginalRowSet die Originaldaten enthält, während RowSet die aktuellen (bearbeiteten) Daten enthält.

 

© 2017-2023 Altova GmbH