Das sd:input-table- Element

Container für die Eingabemaske zu einer Tabelle. Der Content dieses Elements wird nur ein einziges Mal ausgeführt. Es gibt zwei verschiedene Verwendungsmöglichkeiten: Entweder werden mit sd:label die Spaltenbeschriftungen sowie mit sd:input-text die Eingabefelder individuell ausgegeben und durch eigene Formatierungen, erläuternde Texte und ähnliches ergänzt. Oder es wird das sd:input-cell-set -Element verwendet, um eine Kombination aus Beschriftung und Eingabefeld zu definieren. Dieses Element wird später für jede Spalte der Tabelle einmal ausgeführt.

Das sd:ro-value -Element ermöglicht es, eine einzelne Zelle einer bearbeiteten Zeile mit einem festen Wert (read-only) zu belegen, um bsp. zu erkennen, daß die letzte Bearbeitung dieses Datensatzes über diese Ausgabeseite (und nicht über die interne Maske) erfolgt ist. Dies ermöglicht später bsp. das leichte Auffinden aller über diese Ausgabeseite hinzugefügten neuen Datensätze. Der hier definierte Wert wird erst nach dem Verarbeiten aller Eingabeparameter der Zelle zugewiesen und wird nicht in die Html-Version übertragen, sondern ausschließlich intern verarbeitet.

Falls das sd:main -Attribut mit dem Namen einer Tabelle belegt ist, kann das Eingabeformular dazu verwendet werden, einen Haupt- sowie einen ersten Detaildatensatz zu diesem Hauptdatensatz gleichzeitig zu speichern. In diesem Fall müssen zusätzliche sd:input-text -Eingabefelder definiert werden, die mit dem sd:is-main -Attributwert 'true' der Haupttabelle zugeordnet werden. Ferner muß die Detailtabelle eine Spalte namens 'Haupttabelle' + 'Id' besitzen. Dann wird zunächst die Hauptzeile gespeichert, die Verweisspalte der Detailtabelle mit der neuen Id belegt und anschließend die Detailzeile gespeichert.

Eine Sonderfunktion nimmt das sd:cached-id -Attribut ein. Wird ihm ein Name zugewiesen, so wird beim Speichern dieses Datensatzes die neue Zeilen-Id unter diesem Namen mit vorgestelltem '$' im Laufzeitcache für den aktuellen Nutzer zwischengespeichert. Anschließend kann dieser Name (mit '$') verwendet werden, um im sd:ro-value -Element anderer Ausgabeseiten die bereits gespeicherte Id einzutragen. Damit kann auf einer einführenden Seite durch den Klick eines Nutzers zunächst ein Hauptdatensatz erzeugt (Bsp.: Pizza-Bestellung) und dieser gecacht werden. Auf den folgenden Seiten werden die Details dieser Bestellung vom Nutzer ausgewählt und die zugeordneten Detaildatensätze mit der Haupt-Id der Bestellung gespeichert. Zum Schluß kann nochmals der Hauptdatensatz gespeichert und mittels des sd:ro-value -Elements ein Flag gesetzt werden, so daß die Bestellung erfolgreich abgesandt worden ist.

Typ
Äußere Elemente
Attribute
sd:table *
Legt den Namen der zu bearbeitenden Tabelle fest.
sd:rel-format
Legt fest, wie bei Relationen dieser Tabelle das Suchfeld und die Buttons zum Durchblättern der Relationen erzeugt werden. Mögliche Werte sind:
	search
	button
	auto
	manual
Die Werte 'search' und 'button' erzeugen automatisiert ein Suchfeld und die beiden Buttons zum Vorwärts- und Zurückblättern, 'auto' erstellt sämtliche Objekte automatisch, 'manual' verzichtet auf jede manuelle Erstellung. Jede automatisierte Erstellung belegt Platz unmittelbar hinter dem Eingabefeld. Zusätzlich zur manuellen Erstellung können sd:rel-steps -Container für jede Spalte mit Relationen genutzt werden.

Bei komplexeren Designs dürfte 'manual' sowie die manuelle Erstellung dieser Objekte die richtige Wahl sein.

sd:name
Legt den Namen des Objektes fest. Dieses Attribut ist immer ein Pflicht-Attribut.
sd:main
Legt den Namen für eine Haupttabelle fest
sd:main-edit
Legt eine Liste von zugeordneten Haupttabellen fest. Ausgewählte Spalten können editiert werden.
sd:main-edit-columns
Enthält zu jedem Eintrag von sd:main-edit eine '|'-getrennte List der Spalten, die über diesen Weg editiert werden dürfen. Nur von diesen Spalten werden die Änderungen tatsächlich übernommen. Die Spaltenblöcke werden ';' - getrennt.
sd:detail
Legt eine Liste von abhängigen Detailtabellen fest
sd:detail-main-column-list
Das Attribut kann - bei gesetztem sd:detail - Attribut - entweder fehlen oder mit einer pipe-getrennten Liste der Parent-Spalten belegt werden.

Die Standardvariante geht davon aus, daß die Detailtabelle eine Spalte HaupttabelleId hat, die genutzt wird, um die ID des Hauptdatensatzes zu speichern. Ist dieser Name bereits belegt oder unpassend, so kann der Hauptspaltenname beliebig genannt und über dieses Attribut übergeben werden.

sd:detail-sort-list
Wenn die Detailzeilen in einer speziellen Sortierung ausgegeben werden sollen, dann kann diese Sortierung hier festgelegt werden.
Format: Wie in dem Sortierungsparameter für DataTable.Select bzw. in einer OrderBy-Klausel: Eine kommagetrennte Liste von Spaltennamen, optional DESC.
sd:detail-filter-list
Wenn die Detailzeilen bei der Ausgabe zusätzlich gefiltert werden sollen, dann kann hier eine Liste festgelegt werden: Semikolongetrennt für jede Detailtabelle, kommagetrennt für jeden Parameter, pipe-getrennt für die Kombination aus Parametername und Wert.
sd:detail-query-list
Wenn zum Holen der Detailzeilen bsp. aus Performance-Gründen nicht der Standardview, sondern eine gesonderte Abfrage genutzt werden soll, dann kann diese hier definiert werden. Die Abfrage darf nur einen Parameter, den Namen der zugeordneten Hauptspalte enthalten.
sd:new-detail-row
Ermöglicht das Notieren einer pipe-getrennten Liste von Tabellen. Zu jeder Tabelle wird beim Erfülltsein der entsprechenden Filterbedingung beim Speichern eines Datensatzes ein neuer Datensatz in dieser Detailtabelle erzeugt.
sd:new-detail-row-filter-list
Ermöglicht das Angeben einer pipe-getrennten Filterliste, mehrere Filter zu einer Tabelle können durch Semikolon getrennt werden.
sd:new-detail-row-values
Ermöglicht das Angeben einer pipe-getrennten Liste aus Kombinationen von Spaltenname und Wert. Der Wert kann ein Spaltenname der Ausgangstabelle, ein Standardwert oder ein per query-Start definierter Wert einer Abfrage sein.
sd:new-add-empty-detail-rows
Kann mit einer Ganzzahl belegt werden. Beim Neuerstellen eines Datensatzes werden entsprechend viele neue Detailzeilen ergänzt.
sd:start-page-as-new
Kann mit true belegt werden. Falls ja, wird die Seite (abgesehen vom Reset) sofort im Neu-Modus für die entsprechende Eingabetabelle geladen.
sd:pfilter-elements
Erwartet entweder den Namen eines einzelnen Views, der als Ziel für diese Autofilter-Logik genutzt wird. Oder es werden - semikolongetrennt - pipegetrennte Kombinationen aus Eingabetabelle und View notiert. Die letztere Variante ist notwendig, falls die Eingabetabelle für Url-Überschreibungen genutzt wird, so daß verschiedene Tabellen vom gleichen Element ausgegeben werden können.
sd:pfilter-type
Kann derzeit mit einem der beiden Wörter 'view' oder 'table' belegt werden. Falls belegt, werden die Eingabefelder mit Pulldownlisten ausgegeben, über die - vergleichbar der Excel - Autofilter - Funktion - per Klick nach einzelnen Einträgen gesucht werden kann.
sd:pfilter-tablefilter
Die Pulldown-Filter können selbst gefiltert werden. Dann sind hier Paare @Parametername|Parameterwert semikolongetrennt möglich.
sd:allow-multiple
Kann mit dem Wert 'true' belegt werden. Dann können bei AutoFiltern auch mehrere Ausdrücke per STRG-Taste zusammen ausgewählt werden. Der Wert 'true' setzt voraus, daß die Tabelle als 'allow-multiple' gekennzeichnet ist. In diesem Fall müssen gesonderte Zugriffsprozeduren generiert werden.
sd:min-detail-rows
Hier kann eine semikolongetrennte Liste aus Kombinationen von Detailtabelle, '|' und einer Ganzzahl übergeben werden. Dann muß jede Detailtabelle mindestens diese Zahl der Zeilen enthalten, bevor alle Zeilen gespeichert werden.
sd:cached-id
legt den Namen für eine Zwischenspeicherung der ID in den Laufzeitdaten des aktuellen Nutzers fest.
sd:edit-id
Ist dieses Attribut mit dem Namen einer gecachten ID belegt, welche innerhalb der aktuellen Umgebung gültig ist, so wird der Datensatz mit dieser Id sofort zur Bearbeitung ausgegeben.
sd:cache-columns
Ermöglicht das Festlegen einer semikolon-getrennten Liste von pipegetrennten Paaren Spaltenname | Cachename. Bei einem erfolgreichen Speichern werden die entsprechenden Spaltenwerte unter den Cachenamen gecacht.
sd:supress-pathinfo
Falls 'true', werden für das übergeordnete sd:rs- bzw. sd:input-table - Objekt keine PathInfo - Ausgaben generiert. Das kann nützlich sein für Elemente, durch die bsp. ohnehin nie geblättert wird (sd:rs auf einer Startseite als Linkliste oder mit einer einzigen Zeile als Ausgabe).
sd:refresh-pulldowns
Falls mit einer kommagetrennten Liste von Spalten-IDs belegt, werden die zugehörigen Pulldown-Daten neu geladen, falls per sd:with-postback='true' ein Post beim Ändern von Daten erzwungen wird.

Das ist nützlich, falls Relationen mit zusätzlichen Parametern, aber ohne direkte Detailspaltenfilter deklariert sind, um das Neuladen der Relation und die Berücksichtigung der geänderten Parameter zu erzwingen.

sd:disallow-edit-call
Unterbindet das Lesen und Editieren in dieser Eingabemaske, falls der Name der Eingabemaske in der Url verwendet wird. Ein Editieren über ein sd:rs -Element ist zunächst noch möglich.
sd:save-only-visible
Gültige Werte sind
true
false
Falls 'true', so wird ein Speichern- oder Löschbefehl nur dann ausgeführt, wenn der zu bearbeitende Datensatz im Laufzeitcache des aktuellen Nutzers existiert, also auch angezeigt wird. Dieses Attribut verhindert das Speichern / Löschen beliebiger Datensätze über die Id und sollte in jenen Fällen verwendet werden, in welchen anonyme Nutzer im Rahmen einer Bestellung ihre Bestelldetails angezeigt bekommen und einzelne Bestelldetails speichern / löschen dürfen. Da nur die Bestelldetails angezeigt werden, die zur Haupt-Id gehören und da die Haupt-Id aus dem Servercache geholt wird, kann auf diese Weise kein fremder Detaildatensatz gespeichert oder gelöscht werden.
sd:del-only-cached
Falls dieses Attribut mit dem Wert einer sd:cached-id - Variablen 'myId' belegt ist, wird eine Löschanforderung der Form
Dateiname.html?action=objektname-d-myId'
nur ausgeführt, falls der übergebene Name gleich diesem Attributwert ist. Die ID der zu löschenden Zeile wird in diesem Fall aus dem Laufzeitcache des ausführenden Nutzers ausgelesen. Dies verhindert Löschversuche durch die Übergabe einer Zahl, falls anonyme Nutzer Datensätze hinzufügen und löschen dürfen. Falls nur authentifizierte Nutzer Daten bearbeiten dürfen, ist diese Technik nicht notwendig, da nun der Datenbankserver die Berechtigung für den aktuellen Benutzer überprüft.
sd:ignore-empty-row
In einigen Fällen (viele Felder sind für einen externen Nutzer schreibgeschützt, die schreibbaren Felder bleiben leer) kann es wünschenswert sein, beim Speichern nicht die Meldung 'Eine Datenzeile muß mindestens einen Wert enthalten' auszugeben, sondern stattdessen einfach nichts zu machen (weder die schreibgeschützten Felder zu speichern noch eine Meldung auszugeben). Für diesen Fall kann dieses Attribute mit 'true' belegt werden.
sd:edit-filter
Es kann Fälle geben, in welchen die Tabellenberechtigungen nicht genügen, um Lesezugriff auf Datenzeilen zu verhindern.

Bsp.: Interne Mitarbeiter können alle Datensätze bearbeiten. Externe Firmennutzer bilden eine eigene Gruppe, so daß mehrere externe Mitarbeiter dieselbe Menge an Daten bearbeiten kann. Zusätzlich sollen regionsbezogene Mitarbeiter nur die Datensätze ihrer Region lesen können.

Hier ist die Gruppenspalte _Group bereits belegt, ein regionsbezogener Mitarbeiter soll Datensätze verschiedenster Gruppen seiner Region lesen können.

Ein Eintrag 'RegionenSpalte|$RID' überprüft, ob der Datensatz-Wert für 'Regionenspalte' gleich dem für diesen Nutzer gecachten Wert $RID ist und läßt nur bei Übereinstimmung die Anzeige zu.

Ein Eintrag 'RegionenSpalte|^$RID' läßt die Anzeige zu, falls $RID leer oder gleich dem Wert der Regionenspalte ist.

Bei internen Mitarbeitern bleibt $RID leer, damit können diese sämtliche Datensätze lesen. Für regionsbezogene Mitarbeiter wird hier die RegionenId gecacht - sie sehen nur die Datensätze ihrer Region.

sd:save-filter
Falls zwar ein Lesen möglich, ein Speichern aber unterbunden werden soll, kann dieses Attribut gesetzt sein.

Format: Spaltenname|$Cachewert.

sd:save-type
Gültige Werte sind
1
2
8
und Bitkombinationen (= Summen) dieser. Ist das 1-Bit gesetzt, so wird beim Speichern immer ein neuer Datensatz erzeugt. Ein Wert 2 zeigt an, daß mit der Eingabemaske ausschließlich ein vorhandener Datensatz editiert werden kann. 3 (= 1 | 2) läßt sowohl die Neuerstellung als auch das Editieren zu und wird als Standardeinstellung genutzt, falls das Attribut fehlt.

Interessant ist das 8-Bit in Kombination mit 1 (= 9) bzw. 1|2 (= 11). Damit wird gefordert, daß beim Neuerstellen eines Datensatzes noch kein Datensatz existiert, der diesem Owner gehört. Dies ist praktisch, falls eine Maske angeboten wird, die mittels des sd:choose-null -Elements ermittelt, ob es von diesem Nutzer bereits einen Datensatz gibt und den Speichern-Button entweder zum Erstellen eines neuen Datensatzes oder zum Speichern des bearbeiteten Datensatzes ausgibt. In diesem Fall kann ein böswilliger Nutzer die Eingabemaske durch eine passende Url auch erneut aufrufen. Das Speichern des so generierten zweiten Datensatzes wird durch das 8-Bit jedoch abgeblockt.

Dieses Attribut ist bsp. nützlich, falls ein Datensatz zum Editieren angeboten wird, dessen ID bei einem früheren Aufruf erzeugt und gecacht worden ist. Das Attribut verhindert, daß die Seite isoliert aufgerufen und anstelle einer Bearbeitung ein neuer Datensatz erzeugt wird.

sd:mail-name
Existiert dieses Attribut und ist der Wert gleich dem Namen eines sd:mail -Elements, dann wird beim Speichern des Datensatzes eine Mail gemäß den Daten des sd:mail -Elements versandt.
sd:check
Dieses Attribut kann derzeit mit einem sd:calendar -Element derselben Seite belegt werden. Dann wird vor dem Speichern des Datensatzes in einer Transaktion geprüft, ob die Datenzeile einen freien Termin im Sinne dieses Kalenderelements nutzt oder ob dieser Termin bereits belegt ist. Die Kapselung in einer Transaktion stellt sicher, daß nur ein Nutzer diesen Termin speichern kann, auch wenn zwei verschiedene Nutzer dasselbe Kalenderelement aufrufen, sehen, daß der gewünschte Termin noch frei ist und praktisch gleichzeitig speichern.
Innere Elemente
Beispiele
Das folgende Beispiel codiert jedes Eingabefeld einzeln und bettet die Ausgabe in eine Blindtabelle ein. Da alle Spaltennamen hart codiert sind, wirken hier einerseits keine Url-Überschreibungen, andererseits können zusätzliche Texte, Umbrüche oder gesonderte Formatierungen eingefügt werden:
<table>
  <sd:input-table sd:name='sample-input' sd:table='Artikel'>
	<tr>
	  <td>
		<sd:label sd:col='ArtikelId' />
	  </td>
	  <td>
		<sd:input-text sd:col='ArtikelId' />
	  </td>
	</tr>
	<tr>
	  <td>
		<sd:label sd:col='A_Name' />
	  </td>
	  <td>
		<sd:input-text sd:col='A_Name' />
	  </td>
	</tr>
	<tr>
	  <td>
		<sd:label sd:col='A_Preis' />
	  </td>
	  <td>
		<sd:input-text sd:col='A_Preis' />
	  </td>
	</tr>
  </sd:input-table>
</table>
Der folgende Code verwendet ebenfalls eine Blindtabelle zur Positionierung, nutzt jedoch die dynamische Erstellung. Mit diesem Code können Url-Überschreibungen (/sample-input/table/Vertreter) genutzt werden, so daß - ohne weitere Anpassungen - eine Eingabemaske für eine andere Tabelle zur Verfügung steht. Es wird ein sehr kompakter Code generiert:
<table>
  <sd:input-table sd:name='sample-input' sd:table='Artikel'
  sd:rel-format='auto'>
	<sd:input-cell-set>
	  <sd:normal>
		<tr>
		  <td>
			<sd:label />
		  </td>
		  <td>
			<sd:input-text />
		  </td>
		</tr>
	  </sd:normal>
	</sd:input-cell-set>
  </sd:input-table>
</table>
Hier wird das sd:input-table-Element nur einmal ausgeführt. Das sd:input-cell-set -Element wird jedoch für jede Spalte einmal aufgerufen. Eine Belegung mit expliziten Spaltennamen ist hier nicht notwendig. Falls zwischen ungeraden und geraden Spalten unterschieden werden soll, kann zusätzlich ein sd:alternate -Element eingefügt werden.


Kontaktformular:

Schreiben Sie mir und wir bauen gemeinsam Ihre neue Web-Datenbank!

Die Erläuterungen zum Datenschutz habe ich gelesen und stimme diesen zu.

© 2003-2019 Jürgen Auer, Berlin.