Daten können an die DLE auf zwei Arten übergeben werden. Als Variablen und als Datenobjekte. Üblicherweise übergibt man alle Daten, die vor dem Aufruf der DLE schon vorhanden sind, um ein unnötiges Nachladen der Daten durch die DLE zu vermeiden.

Übergabe von Variablen

Variablen können an die DLE so übergeben werden, als seien sie innerhalb der DLE mit dem Kommando FELD SETZEN TEMPORÄR gesetzt worden.
Dies geschieht über die API mit der Methode setVariable():

dleApi.setVariable(“DEMO:OrgUnit“, “1“);

Erster Parameter ist ein Variablenausdruck, der Wert der Variablen wird als String übergeben.
Ein Variablenausdruck besteht aus einem Paketnamen, gefolgt von einem Doppelpunkt und dann einer Variablenbezeichnung. Diese kann eine einzelne Variable aus den Metadaten, oder ein Attributname eines Datenobjektes sein.
Soll ein Attribut gesetzt werden, ist der Datenobjektname voranzustellen:

dleApi.setVariable(“DEMO:Adresse.Name1“, “Meier“);

Hier wird der Wert des Attributes Name1 des Datenobjektes Adresse aus dem Paket DEMO auf den Wert Meier gesetzt.
Mit einem Variablenausdruck können auch Attribute von assoziierten Datenobjekten gesetzt werden, indem über den Assoziationsnamen eines Datenobjektes auf das entsprechende Objekt verwiesen wird.
Ist zum Beispiel für das Objekt Auftrag eine Assoziation mit dem Namen Kunde definiert, die auf eine Adresse verweist, kann der Name1 des Kunden über den Auftrag angesprochen werden:

dleApi.setVariable(“DEMO:Auftrag.Kunde.Name1“, “Meier“);

Es können dabei beliebig viele Assoziationen aneinandergereiht werden:

dleApi.setVariable(“DEMO:Auftrag.Kunde.Land.Code“, “DE“);

Damit werden jedoch keine Werte in die Datenbank geschrieben, es handelt sich um temporäre Werte, die nur für einen DLE Durchlauf gelten.
Eine Besonderheit gilt für Variablenausdrücke, die einen Objektschlüssel (Primärschlüssel) definieren.
Wird über setVariable() ein Primärschlüssel gesetzt, gilt das dadurch spezifizierte Datenobjekt als aktuelles Objekt und alle temporären Änderungen an diesem Objekt und an allen assoziierten Datenobjekten werden rückgängig gemacht.
Wenn der Objektschlüssel für ein Datenobjekt gesetzt wurde, kann innerhalb der DLE auf jedes Attribut und jede Assoziation des Objektes zugegriffen werden, da die DLE dieses Objekt automatisch lädt, sobald auf dieses das erste Mal zugegriffen wird.
Der Wert wird als String übergeben, hier gilt für Zahlen das amerikanische Format mit einem Punkt als Dezimaltrennzeichen.
Ein Datum wird im Format JJJJ-MM-TT HH:MM:SS übergeben.

Übergabe von Datenobjekten

Um innerhalb der DLE auf Datenobjekte zugreifen zu können, reicht es eigentlich aus, die Objektschlüssel über setVariable() zu setzen. Dies hat jedoch den Nachteil, daß die DLE die Datenobjekte erst über die Datenschicht einlesen muß. Sind alle Werte eines Datenobjektes vor dem Aufruf der DLE schon bekannt, ist es sinnvoller das gesamte Datenobjekt zu übergeben. Außerdem können Mithilfe von Datenobjekten auch strukturierte Daten (zum Beispiel ein Auftrag mit Positionen) übergeben werden, sowie noch nicht gespeicherte Datensätze ohne Objektschlüssel der DLE bekannt gemacht werden.
Ein Datenobjekt wird mit der Methode addDataObject() an die DLE übergeben. Dabei muß der Datenobjektname, sowie die Datenobjektattribute mit Werten übergeben werden. Als letzter Parameter ist mit einem Kennzeichen anzugeben, ob dieses Datenobjekt auch als aktuelles Datenobjekt gesetzt werden soll.
Der Datenobjektname besteht immer aus dem Paketnamen, gefolgt von einem Doppelpunkt und dem Objektnamen, wie er in den Metadaten definiert worden ist.
Die Datenobjektattribute werden als java.util.Map Instanz übergeben, als Schlüssel wird der Attributname und als Wert ein beliebiges Objekt übergeben.

Map attributes = new java.util.Hashtable();
attributes.put(“Adresse_ID“, “1“);
attributes.put(“Name1“, “Hans“);
attributes.put(“Name2“, “Meier“);
attributes.put(“Ort“, “Berlin“);
attributes.put(“ErstelltAm“, “2005-05-14“);
dleApi.addDataObject(“DEMO:Adresse“, attributes, true);

Es können dabei mehrere Datenobjekte eines Typs übergeben werden, wobei innerhalb der DLE eines davon als aktuelles Datenobjekt gilt. Dies ist analog eines Datenbankcursors oder eines Zeigers zu verstehen, der aus einer Menge gleichartiger Datenobjekte auf einen bestimmten Datensatz zeigt:

Map attributes1 = new java.util.Hashtable();
attributes1.put(“Adresse_ID“, “1“);
attributes1.put(“Name1“, “Hans“);
attributes1.put(“Name2“, “Meier“);
attributes1.put(“Ort“, “Berlin“);
attributes1.put(“ErstelltAm“, “2005-05-14“);
dleApi.addDataObject(“DEMO:Adresse“, attributes1, false);

Map attributes2 = new java.util.Hashtable();
attributes2.put(“Adresse_ID“, “2“);
attributes2.put(“Name1“, “Klaus“);
attributes2.put(“Name2“, “Müller“);
attributes2.put(“Ort“, “München“);
attributes2.put(“ErstelltAm“, “2005-01-21“);
dleApi.addDataObject(“DEMO:Adresse“, attributes2, true);

Hier werden zwei Adressen hinzugefügt, wobei die zweite Adresse als aktueller Datensatz markiert wird. Wird innerhalb der DLE jetzt zum Beispiel auf die Variable $DEMO:Adresse.Name1 zugegriffen, hat diese den Wert des Attributes des zweiten Datenobjekts, nämlich Klaus.
Innerhalb der DLE kann zusätzlich auf solche Mehrfachobjekte mit entsprechenden Schleifen zugegriffen werden, ohne daß eines als aktuelles Datenobjekt markiert ist.

Übergabe von strukturierten Daten

Die Beziehungen (Assoziationen) der Datenobjekte untereinander sind in den Metadaten hinterlegt, indem Attributbeziehungen definiert werden. Dies ist analog einer Fremdschlüsselbeziehung in relationalen Datenbanken zu betrachten.
Die DLE löst Strukturen anhand dieser Definitionen automatisch zur Laufzeit auf, ohne daß explizit die Beziehungen angegeben werden müssen.
Wurde zum Beispiel eine Assoziation Positionen zu einem Auftrag definiert, die über einen Fremdschlüssel im Datenobjekt Position mit Namen Auftrag_ID auf den Primärschlüssel des Datenobjekts Auftrag (Auftrag_ID) verknüpft wurde, können Auftrag und Positionen einfach dazugefügt werden:

Map auftrag = new java.util.Hashtable();
auftrag.put(“Auftrag_ID“, “1“);
auftrag.put(“AuftragNummer“, “12345“);
auftrag.put(“Kunde_ID“, “99“);
dleApi.addDataObject(“DEMO:Auftrag“, auftrag, true);
Map pos1 = new java.util.Hashtable();
pos1.put(“Position_ID“, “1“);
pos1.put(“Auftrag_ID“, “1“);
pos1.put(“Content“, “xyzzy“);
dleApi.addDataObject(“DEMO:Position“, pos1, false);
Map pos2 = new java.util.Hashtable();
pos2.put(“Position_ID“, “2“);
pos2.put(“Auftrag_ID“, “1“);
pos2.put(“Content“, “example“);
dleApi.addDataObject(“DEMO:Position“, pos2, false);

Die DLE erkennt hier automatisch durch die Fremdschlüsselbeziehung, daß die Positionen zum Auftrag gehören.
Das gleiche gilt auch für zu-eins Assoziationen. Verweist das Attribut Kunde_ID aus obigem Beispiel per Fremdschlüssel auf eine Adresse, kann eine Adresse hinzugefügt werden:

Map adresse = new java.util.Hashtable();
adresse.put(“Adresse_ID“, “99“);
adresse.put(“Name1“, “Hans“);
adresse.put(“Name2“, “Becker“);
dleApi.addDataObject(“DEMO:Adresse“, adresse, false);

Da der Auftrag als aktueller Datensatz übergeben wurde, kann nun innerhalb der DLE auf die Variable $DEMO:Auftrag.Kunde.Name2 zugegriffen werden, die den Wert Becker enthält.
Zu beachten ist hierbei, daß die Adresse nicht als aktuelles Datenobjekt angefügt wurde, die Abfrage der Variable $DEMO:Adresse.Name2 führt daher zu einem leeren Wert, solange nicht eine Adresse als aktuelles Adressdatenobjekt definiert ist.

Übergabe der Attribute

Die Attribute werden als eine Instanz einer java.util.Map übergeben. Als Schlüssel wird dabei der Attributname, wie in den Metadaten spezifiziert, verwendet. Der Attributwert wird als eine Object Instanz übergeben, üblicherweise ein String. Alternativ können für bestimmte Datentypen auch andere Objekte übergeben werden:

DLE DatentypJava Objekt
Numberjava.math.BigDecimal
Datejava.sql.Date
Datetimejava.sql.Timestamp
Blobbyte[]

Wird null als Wert übergeben, ignoriert die DLE dieses Attribut, da null Werte innerhalb der DLE dadurch gekennzeichnet sind, daß kein Wert vorhanden ist.
Außerdem ist es möglich unbekannte Attribute, also Attribute die nicht in den DLE Metadaten definiert sind, zu übergeben. Auf diese kann innerhalb der DLE nicht zugegriffen werden, sie werden jedoch so wie sie übernommen wurden auch wieder im Ergebnis der DLE Ausführung zurückgegeben. Eine Anwendung solcher unbekannten Attribute ist zum Beispiel die Applikationsseitige Identifizierung von Objekten, die noch keinen Primärschlüssel haben.

Übergabe von Datenobjekten ohne Objektschlüssel

Der DLE können auch Datenobjekte übergeben werden, die (noch) keinen Objektschlüssel haben, der sie eindeutig identifiziert. In diesem Fall vergibt die DLE einen temporären, eindeutigen Schlüssel.
Sollen strukturierte Daten übergeben werden, die keinen Objektschlüssel haben, müssen diese mit der speziellen Methode addChildDataObject() übergeben werden. Hier vergibt die DLE die temporären eindeutigen Schlüssel und stellt anhand dieser Schlüssel die Fremdschlüsselbeziehungen her.
Die Methode erfordert vier Parameter:

  • Assoziationsname
  • Datenobjektname
  • Attribute und Werte
  • Kennzeichen zum setzen des aktuellen Datenobjektes

Der Assoziationsname ist ein Variablenausdruck, der mit einer Assoziation endet. Er bezeichnet die Assoziation, an der das Datenobjekt angehangen werden soll.
Der Datenobjektname bezeichnet den Typ des anzuhängenden Datenobjektes.
Die Attribute und Werte werden als Instanz einer java.util.Map übergeben, es gelten die gleichen Regeln wie bei der Übergabe von definierten Datenobjekten wie oben beschrieben.
Das Kennzeichen steuert wieder, ob das zugefügte Datenobjekt als aktueller Datensatz gesetzt werden soll.
Anhand der angegebenen Assoziation wird ausgehend vom aktuellen Datenobjekt ein neues Kindobjekt mit dem angegebenen Namen und den angegebenen Werten an die DLE übergeben.
Das Beispiel 4-8 von weiter oben kann mit undefinierten Datenobjekten wie folgt an die DLE übergeben werden:

Map auftrag = new java.util.Hashtable();
auftrag.put(“AuftragNummer“, “12345“);
auftrag.put(“Kunde_ID“, “99“);
dleApi.addDataObject(“DEMO:Auftrag“, auftrag, true);
Map pos1 = new java.util.Hashtable();
pos1.put(“Content“, “xyzzy“);
dleApi.addChildDataObject(
“DEMO:Auftrag.Positionen“,
“DEMO:Position“,
pos1,
false);
Map pos2 = new java.util.Hashtable();
pos2.put(“Content“, “example“);
dleApi.addChildDataObject(
“DEMO:Auftrag.Positionen“,
“DEMO:Position“,
pos2,
false);

Mehrerer Ebenen von Kindobjekten lassen sich so auch sehr einfach konstruieren. Da die Kindobjekte immer ausgehend vom aktuellen Datenobjekt hinzugefügt werden, ist eine beliebige Abstufung möglich. Es muß jeweils nur das aktuelle Datenobjekt gesetzt werden und anschließend die Kindobjekte hinzugefügt werden. Sollen zu den Positionen zum Beispiel Paketnummern hinzugefügt werden, kann dies wie folgt geschehen:

Map pos1 = new java.util.Hashtable();
pos1.put(“Content“, “xyzzy“);
dleApi.addChildDataObject(
“DEMO:Auftrag.Positionen“,
“DEMO:Position“,
pos1,
true);
Map nr1 = new java.util.Hashtable();
nr1.put(“Number“, “0992923561“);
dleApi.addChildDataObject(
“DEMO:Position.Paketnummern“,
“DEMO:Paketnummer“,
nr1,
false);
Map pos2 = new java.util.Hashtable();
pos2.put(“Content“, “example“);
dleApi.addChildDataObject(
“DEMO:Auftrag.Positionen“,
“DEMO:Position“,
pos2,
true);
(…)

Zu beachten ist hierbei, daß erst eine Position übergeben wird, die als aktuelles Datenobjekt definiert wird. Dann werden zu dieser Position die Paketnummern angefügt. Anschließend wird mit der nächsten Position fortgefahren.
Das setzen des aktuellen Datensatzes sollte jedoch nur erfolgen, wenn es wirklich nötig ist. Dies ist insbesondere der Fall bei einzelnen Datenobjekten und bei undefinierten Kindobjekten bei dem Elternobjekt. Das Setzen des aktuellen Datensatzes verbraucht sonst unnötigerweise Rechenzeit.
Innerhalb der DLE kann auf diese undefinierten Datenobjekte wie auf definierte Datenobjekte zugegriffen werden.