Das sd:param- Element

Deklariert einen sd-Parameter und ordnet ihm eventuell einen Standardwert zu. Ein sd-Parameter ist innerhalb der Seite gültig, in welcher er definiert worden ist. Er kann in sd:with-param -Elementen verwendet werden, um benutzerdefinierten Abfragen Sql-Parameter zu übergeben. Der Wert läßt sich zusätzlich entweder durch eine Url-Ergänzung (Dateiname.html?Parametername=neuerWert) oder durch einen interaktiv vom Leser der Seite eingetragenen Eintrag in ein Formularfeld festlegen. Für letzteres kann ein sd:input-text -Element mit passendem sd:param-name -Attribut innerhalb eines sd:form -Elements ohne ein sd:input-table -Element genutzt werden.

Ist das sd:cache-name - Attribut belegt, so wird beim Aufruf der Seite geprüft, ob dem sd:param-Element ein Wert zugewiesen worden ist. Falls ja, wird dieser Wert in der Session des aktuellen Nutzers gecacht. Dies läßt sich nutzen, um mit einem Link eine ID von einer Grundtabelle zu einer Detailtabelle zu übergeben, so daß die Detailtabelle nur die Einträge zur Grundtabelle anzeigt.

Typ
Äußere Elemente
Attribute
sd:name
Legt den Namen des Objektes fest. Dieses Attribut ist immer ein Pflicht-Attribut.
sd:std-value
Legt den Standardwert für das sd:param -Element fest. Dieser Wert wird verwendet, falls er nicht durch eine Url-Überschreibung oder durch den in ein Formularfeld eingegebenen Wert überschattet wird.
sd:datatype
Legt den Datentyp fest, nach welchem der Wert von sd:std-value oder der vom Nutzer eingegebene Wert interpretiert und an die Datenbank weitergegeben wird. Fehlt dieser Wert, so wird als Standard-Datentyp String/nvarchar verwendet. Ist dieser Wert gesetzt und kann der vom Benutzer eingegebene Wert nicht konvertiert werden, so wird eine Fehlermeldung von der Laufzeitumgebung erzeugt. Fehlt dieser Wert, so wird der vom Benutzer eingegebene Wert an die Datenbank weitergegeben und eine eventuelle Fehlermeldung vom Sql-Server erzeugt.
sd:relation
Ist dieses Attribut mit dem Namen einer Relation belegt und wird dem sd:param-Element ein Eingabefeld (sd:input-text ) zugeordnet, so wird das Eingabefeld wie bei einer üblich definierten Relation als Pulldown-Liste mit den Werten und der Darstellung aus der Relationen-Grundtabelle angezeigt. Damit kann der Nutzer einen Wert wählen und das sd:param-Element mit diesem Wert vorbelegen. Ein Beispiel zu dieser Nutzung ist unter mehrere Zimmer zugänglich.
sd:parent-value
In einer Eingabemaske mit einer Pulldown-Liste kann es wünschenswert sein, daß die Pulldown-Liste nur gefilterte Werte enthält - nicht alle. Dann kann dem sd:relation - Attribut der Name einer Verknüpfung und zusätzlich dem sd:parent-value - Attribut ein Cache-Name (mit '$' beginnend) und - zusätzlich durch ein Leerzeichen getrennt - ein Standardwert zugewiesen werden. Existiert der Cache-Name, so wird dieser genutzt. Ansonsten wird der Standardwert verwendet, um die Ausgabeliste vorzufiltern.
sd:cache-name
Erwartet eine Zeichenfolge als Wert. Ist dem Parameter ein Wert zugewiesen, so wird dieser unter der angegebenen Zeichenfolge mit vorgestelltem '$' gecacht. Anschließend kann dieser Wert für alle folgenden Aktionen mit '$' + Zeichenfolge verwendet werden.
sd:cache-name-small
Der Wert dieses Attributes wird ebenso als Cachename verwendet wie der Wert des sd:cache-name -Attributes. Der Unterschied zwischen beiden Attributen besteht darin, daß die small-Version bei jedem Reset gelöscht wird. Die 'große Version' wird dagegen nur überschrieben, verschwindet am Ende einer Session oder kann mit einer Url der Form
Parametername=
explizit gelöscht werden.
sd:query-name
Wird dieses Attribut mit dem Namen einer Abfrage belegt, dann wird die Abfrage beim Aufruf der Ausgabeseite ausgeführt. Falls dem sd:param -Element ein Cachename zugewiesen wird, können die Spalten der Ergebniszeile einzeln für diesen Nutzer gecacht werden.
Dies ermöglicht es bsp., daß zum aktuellen Nutzer und dessen USER_ID die zugeordnete MitarbeiterId aus der Tabelle der Mitarbeiter geholt und für Vorbelegungen gecacht wird.
sd:ignore-form
Kann mit einem der beiden Werte true/false belegt werden. 'True' bedeutet, daß der Wert für diesen Parameter nicht aus einem Formularfeld ermittelt wird bzw. die entsprechende Zuweisung übersprungen wird. Dies ist nützlich, falls dieselbe Ausgabeseite von verschiedenen Seiten her aufgerufen wird und - mittels sd:choose-null -Elementen Felder aus- und einblendet. Damit wird verhindert, daß Werte eines Datensatzes nach dem Speichern womöglich Filtereffekte erzeugen.
sd:remove-from-query
Ist dieses Attribut mit dem Wert 'true' belegt und wird der Wert des Parameters über die Url übergeben (?Parametername=Wert), dann wird dieser Ausdruck nach der Verwendung aus der Url bzw. aus dem Querystring der Url entfernt.
sd:remove-from-form
Ist dieses Attribut mit dem Wert 'true' belegt und wird der Wert des Parameters über ein Formularfeld übergeben, dann wird der Ausdruck nach der Verwendung aus der Formularauflistung entfernt.
sd:remove-from-query-on-error
Dieses Attribut leistet fast dasselbe wie 'sd:remove-from-query'. Hier wird der Wert nur dann gelöscht, falls bei der Aktion der Seite ein Fehler aufgetreten ist.
sd:remove-when-changed
Kann eine kommagetrennte Liste Objektname.Spalte enthalten. Der Wert des Parameters wird auf den Standardwert zurückgesetzt, falls einer der hier festgelegten Spaltenwerte geändert wird.
sd:check-cache
Wenn dieses Attribut mit einem Namen belegt ist, unter dem es zur Laufzeit einen als ID interpretierbaren gecachten Wert gibt, wenn zusätzlich das sd:relation-Attribut mit dem Namen einer Relation bzw. einer durch '|' getrennten Liste von Relationen belegt ist und wenn schließlich auf der Ausgabeseite diese Relation ausgegeben werden, dann wird beim Aufruf geprüft, ob der gecachte Wert in der Pulldownliste mit angezeigt wird. Falls nein, wird die zur ID gehörende Datenzeile zusätzlich geladen und der Pulldown-Liste hinzugefügt. Ist das Eingabefeld mit der Relation nun durch ein sd:new-if-exists - Attribut mit dem Namen des Cache-Elements belegt, dann wird dieser Wert beim Neuerstellen eines Datensatzes zugewiesen.

Dies entspricht der Nutzung des sd:new-if-exists - Attributes für Relationen. Falls diese bsp. alphabetisch ausgegeben wird und mehrere hundert Zeilen umfaßt, dann würde der Wert eines sd:new-if-exists - Attributes für eine Zeile fehlen, die mit 'Z' beginnt. Damit läßt sich auch auf großen Datenbeständen einfach ein Detaildatensatz erzeugen, indem auf den Grundseiten die Einträge gemerkt und auf der Detailseite nur 'Neu' geklickt wird. In diesem Fall wurde die Detailzeile nachgeladen und wird ausgewählt angezeigt.

sd:as-bitset
Wenn der Parameter einer Bitset-Tabelle zugeordnet ist, dann sorgt der Wert 'true' für dieses Attribut dafür, daß die Bits aufaddiert werden, anstatt daß eine kommagetrennte Liste zugewiesen wird.
sd:cookie-set
Erwartet ein Tripel exTID|90|$eTID. Damit wird ein Cookie mit dem Namen 'exTID' von 90 Tagen gesetzt. Der Cookie-Wert entspricht dem gecachten Wert $eTID.
sd:cookie-get
Derzeit nicht genutzt. Es genügt, das ein Name mit einem Doppelpunkt (:exTID) beginnt, damit als Wert der entsprechende Cookie-Wert ausgelesen wird.

Beispiel: <sd:param sd:name='eTID' sd:std-value=':exTID' sd:cache-name='eTID'/>

Das ordnet dem Parameternamen eTID und damit dem gecachten Wert $eTID den Wert des Cookies exTID zu.

sd:function
Ermöglicht die Deklaration einer Funktion, die verwendet wird, um den ermittelten Wert zu transferieren. Gültige Werte sind derzeit:

  • dateadd|days|1: Wenn der ermittelte Wert ein Datum ist, dann zählt dieser Funktionsaufruf einen Tag hinzu. Dies ist bsp. nützlich, falls eine Seite eine Tagesliste enthält, das Datum über ein sd:param-Element übergeben wird und ein Link für die Anzeige des nächsten Tages benötigt wird.

    Für die mittlere Position sind Werte minutes, hours, days, weeks, months und years zulässig. Die letzte Position enthält eine Ganzzahl - negative Zahlen erzeugen ältere Datumsangaben.

  • get-extension: Der ermittelte Wert wird als Text betrachtet und an diese Funktion übergeben. Sie betrachtet den Input als Dateinamen und gibt die Endung einschließlich '.' zurück.
  • get-filename-without-extension: Der ermittelte Wert wird als Text betrachtet und an diese Funktion übergeben. Zurückgegeben wird der Dateiname ohne Endung und ohne Punkt am Ende.
sd:remove-when-posted-and-not-found
Löscht den Parameterwert, falls er nicht explizit neu beim Aufruf übergeben worden ist. Dies ist dann wichtig, falls über ein Formular Bitset-Werte zum Anhaken addiert werden, die als Filter wirken. Beim Aushaken wird von Browsern nichts geschickt, also bleibt der Cachewert normalerweise erhalten und filtert weiterhin. Das Setzen dieses Attributes auf 'true' sorgt für ein explizites Löschen.
sd:remove-from-cache-if-not-found
Wenn dieses Attribut mit 'true' belegt ist und für das sd:param-Element kein Wert ermittelt werden kann, es jedoch bereits einen zugeordneten gecachten Wert gibt, dann wird dieser gecachte Wert explizit gelöscht.
sd:remove-text
Falls mit 'true' belegt, werden Buchstaben am Ende entfernt
sd:refresh-explicit
Wenn das Attribut mit 'true' belegt ist, dann wird diese Ausgabe bei jedem Aufruf aktualisiert. Das ist im Allgemeinen nicht sinnvoll, kann aber notwendig sein, falls bsp. Zufallsbilder angezeigt werden sollen.
sd:execute-after-search
Normalerweise werden zusätzliche Abfragen nach dem Verarbeiten von Speicher- oder anderer Sonderanforderungen und vor einem möglichen Redirect sowie dem Vorbereiten der Seitenobjekte ausgeführt. Es kann Fälle geben, in welchen es nützlich ist, diese Abfragen nach der Hauptsuche durchzuführen, um IDs der Suchergebnisse als Parameter übergeben zu können. Dies wird durch den Wert 'true' für dieses Attribut erzwungen.
sd:execute-before-processing-post
Markiert per "true" einen Parameter, dessen zusätzliche Abfragen noch vor der Verarbeitung der POST-Anforderung ausgeführt werden. Kann bsp. nützlich sein, wenn ein Ausdruck per split-on-last-dot zerlegt wird und über eine Abfrage geprüft wird. Liefert die Abfrage gecachte Werte, die zum Speichern benötigt werden, würde ein mehr als eine Stunde offenes Formular die Session löschen - und ohne diesen Wert speichern.
sd:query-argument-list
Wenn dem sd:param - Element ein sd:query-name -Attribut zugewiesen ist, so daß eine Abfrage ausgeführt wird, dann kann dieses Attribut eine semikolongetrennte Liste von Sql-Parametern für diese Abfrage enthalten.
Jeder Abschnitt enthält drei pipegetrennte Werte: Sql-Parameter, Datentyp, Cache- oder sonstiger Wert.

Beispiel:

"@PID|int|$PID;@SID|int|§oS.StellengesucheId;@eTYPE|nvarchar|Mitarbeiter"

@PID/@SID/@eTYPE sind die in der Abfrage definierten Sql-Parameter.
int/nvarchar sind die Datentypen.
$PID liest den Wert aus dem Cache.
§oS.StellengesucheId sucht im Objekt 'oS' nach der ersten Zeile und liest dort den Wert 'StellengesucheId' aus.
'Mitarbeiter' ist eine Konstante. Andere Seiten übergeben andere Konstanten, dementsprechend liefert die Abfrage andere Ergebnisse zurück.

sd:soft-check-with-redirect
Dieses Attribut ist sehr mächtig, falls die Seite als Folder definiert ist, von verschiedenen Domains her verlinkt wird und falls den verlinkenden Seiten eindeutige Provisionszahlungen zugeordnet werden sollen.

Beispiel: <sd:param sd:name="extern" sd:std-value="_path-1" sd:cache-name="eFiNa|eFID" sd:function="split-on-last-dot" /> <sd:param sd:name="rFiNa" sd:query-name="get_FiNa" sd:cache-name="rFiNa;has_logo;rFiNa-soft" sd:query-argument-list="@FID|int|$eFID" sd:soft-check-with-redirect="1|$eFiNa|$rFiNa-soft|301|404|/|$rFiNa-soft|.|$eFID" /> Das erste sd:param-Element wird mit dem ersten Path-Ausdruck in der Url belegt. Dieser wird am letzten Punkt gesplittet, die Werte werden den Variablen $eFiNa und $eFID zugewiesen (Firmenname und FirmenId).

Das zweite sd:param - Element führt die Abfrage get_FiNa aus und cacht die drei Ergebnisse unter $rFiNa, $has_logo und $rFiNa-soft. Es übergibt dabei die ID, die unter $eFID gecacht ist.

Das sd:soft-check-with-redirect - Attribut sorgt anschließend dafür, daß:

  1. fehlende Werte erlaubt sind - dies macht die 1. 0 an erster Position unterbindet fehlende Werte.
  2. die beiden folgenden Werte $eFiNa und $rFiNa-soft werden soft miteinander verglichen. Groß/Kleinschreibung spielt keine Rolle, '-' werden entfernt. Sind beide Ausdrücke identisch, passiert nichts. Sind sie 'soft - gleich', aber verschieden, dann wird per Http-Status 301 auf die Kombination '/' + $rFiNa-soft + '.' + $eFID weitergeleitet. Sind sie unvergleichbar, wird ein Http-Status 404 erzeugt.
Damit kann sichergestellt werden, daß nur die Aufrufe korrekt verarbeitet werden, bei welchen die Klartextdarstellung des Firmennamens in der Url und die ID zueinander passen. Die 'fast passenden' Kombinationen werden auf die korrekte Variante weitergeleitet. Alle anderen Fälle, die praktisch auf 'böswilliger Verlinkung' beruhen, werden mit einem 404 quittiert.
sd:check-value
keine Beschreibung
sd:additional-conditions
Keine Beschreibung
sd:update-row-if-value-was-found
Keine Beschreibung
Keine Child- oder inneren Elemente zulässig
Beispiele
Das folgende Beispiel demonstriert die Verwendung dieses Elements, um einer Abfrage einen Wert per Formularfeld zu übergeben:
<sd:param sd:name='page-Param' />
<sd:form sd:name='myForm'>
  Legen Sie hier den Parameterwert fest. Gültige Werte
    sind 11/12/13/22: <p />
  <sd:input-text sd:param-name='page-Param' /><p />
  <sd:button sd:name='myButton'>
    <sd:label-standard>Senden</sd:label-standard>
  </sd:button>
   <sd:button sd:name='reset' /><p />

  <sd:rs sd:name='sample-output' sd:source-type='query'
    sd:source-name='einArtikel'>

    <sd:with-param sd:sql-param='@i'
      sd:param-name='page-Param' sd:datatype='int'
    />

    <sd:normal>
      <tr>
        <sd:cell-set>
          <sd:normal>
            <td>
              <sd:cell-value />
            </td>
          </sd:normal>
        </sd:cell-set>
      </tr>
    </sd:normal>
  </sd:rs>
</sd:form>
Die definierte Abfrage 'einArtikel' sieht wie folgt aus:
Declare @i int
Select A.ArtikelId, A.A_Name, A.A_Preis
From Artikel As A
Where A.ArtikelId = @i
Der vom Nutzer eingegebene Wert wird dem Seitenparameter 'page-Param' zugewiesen. Bei der Ausführung der Abfrage wird dieser Wert an den Sql-Parameter '@i' weitergereicht. Die Abfrage liefert die Zeile mit der passenden ArtikelId zurück.

Beispiel für das Cachen eines Wertes

Eine Ausgabeseite stelle eine Eingabemaske für eine Detailtabelle 'detailtabelle' bereit. Die Haupttabelle sei über die Spalte 'haupttabelleId' verknüpft. Ferner sei die verknüpfende Relation mit 'Hauptrecht notwendig' = Ja definiert, Nutzer haben das Recht, zur Haupttabelle und zur Detailtabelle Datensätze hinzuzufügen, alle Daten zu lesen und eigene Zeilen zu bearbeiten.

Dann seien die folgenden Elemente definiert:

<sd:param sd:name='myParam' sd:cache-name='my-internal-name'/>
<sd:ro-value sd:for='sample-input' sd:col='haupttabelleId'
    sd:new-value='$my-internal-name'
    sd:std-value='$my-internal-name'
    sd:missing-value='-1' />
<sd:ro-value sd:for='sample-output' sd:col='haupttabelleId'
    sd:std-value='$my-internal-name'
    sd:missing-value='-1' />
Wird eine solche Seite mit einem Link der Form
<a>
    <sd:attribute sd:attribute-name='href'>
        seite.html?myParam=<sd:cell-value sd:col='haupttabelleId'/>
    </sd:attribute>
    Detail bearbeiten
</a>
aufgerufen, der sich innerhalb eines sd:rs -Elements für jede Zeile passend erzeugen läßt, dann wird beim Aufruf der übergebene Wert unter '$my-internal-name' gecacht. Anschließend kann der Nutzer über diese Ausgabeseite nur Detaildatensätze zu diesem Hauptdatensatz hinzufügen, ändern und löschen. Dies stellt das sd:ro-value -Element sicher. Damit wäre es jedoch möglich, daß ein Nutzer einen Hauptdatensatz aufruft, der ihm nicht gehört und zu diesem eine neue Detailzeile hinzufügt - das 'Add'-Recht bezieht sich nicht auf einen bestehenden Datensatz. Mit 'Hauptrecht notwendig' wird dies verhindert. Bei einer so definierten Relation überprüft der Datenbankserver beim Hinzufügen / Ändern / Löschen eines Detaildatensatzes, ob der Bearbeiter das Recht hat, den Hauptdatensatz zu bearbeiten.

Hat der Nutzer - bei gültiger Anmeldung - diese Seite über einen anderen Weg aufgerufen, so daß der Wert von sd:param unbelegt ist, so wird auch $my-internal-name nicht belegt. In diesem Fall läßt sich mit dem sd:missing-value -Attribut und einem negativen Wert jede Speicherung unterbinden, obwohl der Nutzer prinzipiell das Recht hat, zu dieser Tabelle Datensätze hinzuzufügen oder diese zu bearbeiten.

Ein Beispiel zu dieser Technik, das - unter Nutzung einer Anmeldung auf beispiel.server-daten.de - das Eingeben von Daten gestattet, findet sich auf https://beispiel.server-daten.de/ als Punkt Haupt- und Detaildatensätze. Analoge Konstruktionen lassen sich immer dort verwenden, wo Haupt- und eine oder mehrere Detailtabellen bearbeitet werden sollen.



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.