Kopfbereich mit Daten aus der jeweiligen Seite füllen

Alles was sich mit dem Thema dynamische XML Formulare auf Basis des LiveCycleDesigners beschäftigt
Antworten
TestUser
Beiträge: 6
Registriert: 13.07.2010, 08:53

Kopfbereich mit Daten aus der jeweiligen Seite füllen

Beitrag von TestUser » 15.07.2010, 07:53

Hallo,

ich habe ein Formular gebaut, welches ein Teilformular beinhaltet, dass sich dynamisch über 5-7 Seiten erstreckt.  Dieses Teilformular wird zur Laufzeit für jeden Datensatz erzeugt, so dass am Ende ein großes Formular mit zig Seiten dabei herauskommt.

Im Kopfbereich einer jeden Seite soll nun ein Wert aus diesem Teilformular dargestellt werden. Dieser Wert befindet sich immer auf Seite 1 des Teilformulars, soll aber auf jeder Seite des Teilformulars stehen.  Da sich das Teilformular aber wiederholt, ist der Wert also alle 5-7 Seiten ein anderer. 

Wie kann ich diesen Zustand erzeugen?

Eine direkte Referenz auf das Feld (Binding) geht nicht, vermutlich kann man das nur als Skript im layout:ready machen - aber da ist mir die korrekte Auswertung noch nicht gelungen. Ich habe versucht, über resolveNode auf das Feld zu kommen, aber das Beste, was gelungen ist, war derselbe Wert auf allen Seiten im Header (nicht nur innerhalb eines Teilformulars).

Ein zweiter Versuch war, eine Tabelle zu verwenden und die Kopfzeile auf jeder Seite wiederholen zu lassen (als Header). Allerdings hat auch das nicht richtig funktioniert, denn die Kopfzeile erschien nur auf den ersten beiden Seiten, zudem stimmte der Wert darin auch nicht richtig (Text-Referenz {} im Text der Kopfzeile).

 

Ich wäre für Ideen und Vorschläge sehr dankbar.

Gruß, Ulrich

 

walde
Beiträge: 611
Registriert: 02.05.2008, 21:22

Kopfbereich mit Daten aus der jeweiligen Seite füllen

Beitrag von walde » 19.07.2010, 16:32

Hallo TestUser,

 

Mit "resolveNode" kann man auf jedes Feld eines Formulars referenzieren. Sie sollten jedoch beachten, dass sich die Referenzsyntax für das jeweilige Feld verändert, wenn zusätzliche Instanzen von Teilformularen in denen das Feld enthalten ist dynamisch hinzugefügt werden.

Beispiel:

Textfeld1 unter Formular1.Teilformular1 wird in der 1. Instanz folgendermaßen referenziert "xfa.form.resolveNode("Formular1.Teilformular1.Teftfeld1").rawValue;" oder "xfa.form.resolveNode("Formular1.Teilformular1[0].Teftfeld1").rawValue;".

Textfeld1 unter Formular1.Teilformular1 wird in der 2. Instanz folgendermaßen referenziert "xfa.form.resolveNode("Formular1.Teilformular1[1].Teftfeld1").rawValue;".

Textfeld1 unter Formular1.Teilformular1 wird in der 3. Instanz folgendermaßen referenziert "xfa.form.resolveNode("Formular1.Teilformular1[2].Teftfeld1").rawValue;".

 

Das Problem besteht nun darin dynamisch auf die richtige Instanz zuzugreifen. Hierzu sollten Sie nach erzeugung eines Teilformulars, welches auch als letzte Instanz dient, das Teilformular mit Ihren Datensätzen füllen und anschließend wie folgt zum Kopfbereich referenzieren:

"xfa.form.resolveNode("Formular1.Teilformular1[" + Formular1.Teilformular1.instanceManager.count -1 + "].Teftfeld1").rawValue;".

Mit "...instanceManager.count" greifen Sie auf den Zähler der Instanzen vom jeweiligem Teilformular zu. Wenn die Anzahl der Instanzen eines Teilformulars z.B. 3 beträgt so greifen Sie mit "...instanceManager.count - 1 ergibt 2(3-1)" folgendermaßen auf die 3. Instanz zu: "xfa.form.resolveNode("Formular1.Teilformular1[2].Teftfeld1").rawValue;". Die Werte sind 0 basiert.



Gruß,

 

Walde



TestUser
Beiträge: 6
Registriert: 13.07.2010, 08:53

Kopfbereich mit Daten aus der jeweiligen Seite füllen

Beitrag von TestUser » 22.07.2010, 09:11

Hallo Walde,

vielen Dank für Ihre Antwort. Ich bin bei der Verwendung jedoch auf ein Problem gestoßen: da mein Zielfeld sich im Kopfbereich (also auf einer Masterpage) befindet, muss ich wohl das Event layout:ready verwenden, um das Skript auszuführen.

In diesem Event scheine ich aber nicht auf die Body-Seiten zugreifen zu können; wenn ich versuche, mit folgendem Befehl auf die Daten zuzugreifen, erhalte ich einen Fehler "accessor [[fontsize=2]data.Form.Formular.instanceManager.count[/fontsize]] is unknown":

Code: Alles auswählen

data.#pageSet[0].Seite_Normal.HEADER_TICKET_ID::docReady - (FormCalc, client)

$.rawValue = xfa.form.resolveNode("data.Form.Formular[" + data.Form.Formular.instanceManager.count - 1 + "].TICKET_ID").rawValue

 
Mit dem Event doc:ready kann ich allerdings nicht auf die Masterpages zugreifen, da das Layouting erst danach passiert.

Haben Sie eine Idee, wie ich das lösen könnte?

Gruß, Ulrich

walde
Beiträge: 611
Registriert: 02.05.2008, 21:22

Kopfbereich mit Daten aus der jeweiligen Seite füllen

Beitrag von walde » 24.07.2010, 08:39

Hallo TestUser,

 

Anbei eine kleine Beispieldatei, in der auf den Kopfbereich (befindet sich auf der Masterseite) jeder hinzugefügten Instanz seperat zugegriffen wird.

 

Gruß,

 

Walde
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

TestUser
Beiträge: 6
Registriert: 13.07.2010, 08:53

Kopfbereich mit Daten aus der jeweiligen Seite füllen

Beitrag von TestUser » 27.07.2010, 14:13

Hallo Walde,

vielen Dank für Ihre interessanten Beispiele.  Leider trifft das noch nicht ganz mein Problem und ich schaffe es nicht selbst, die für mich korrekte Lösung zu produzieren.

Das wahre Problem ist doch folgendes: 

ich möchte zur Generierungs-Zeit (layout:ready, nicht buttonclick oder so) wissen, welchen Wert (sozusagen welche Zeile ich aus dem Datensatz ansprechen muss) ich auf alle Seiten meines aktuellen Teilformulars in den Header schreiben muss. Und das für beliebig viele Teilformulare (Teilformular = Datenzeile), die unterschiedlich viele Seiten haben können (je nach Befüllungsgrad der Datenzeile).

 

Ich habe schon diverse Skripte geschrieben, aber es passt alles nicht genau so hin, wie es soll.  Einer der heutigen Versuche liegt unten an, der hat aber auch nicht alles gelöst.  Ich kann ja nichtmal innerhalb eines Teilformulars von Seite 1-n eine Schleife deklarieren, oder?

 

Code: Alles auswählen

data.Form.Formular.Subform_Basisdaten.Sub_Basisdaten_1.TICKET_ID::ready:layout - (JavaScript, client)

tickets_total = data.Form.Formular.instanceManager.count;

quer_page = Math.floor(tickets_total / xfa.layout.page(this)) + 1;

ticket_id = this.rawValue;

for (i = xfa.layout.page(this) - 1; i < (xfa.layout.page(this) + 10); i++){

if ( i == quer_page ){

xfa.form.resolveNode("data.#pageSet.Seite_Querformat[" + (i ) + "].HEADER_TICKET_ID").rawValue = ticket_id;

}else{

xfa.form.resolveNode("data.#pageSet.Seite_Normal[" + ( i ) + "].HEADER_TICKET_ID").rawValue = ticket_id;

} 

}
 

Vielleicht haben Sie ja noch eine Idee, ansonsten bin ich langsam bereit, das ganze aufzugeben.

 

Gruß, Ulrich

walde
Beiträge: 611
Registriert: 02.05.2008, 21:22

Kopfbereich mit Daten aus der jeweiligen Seite füllen

Beitrag von walde » 30.07.2010, 09:24

Hallo TestUser,

 

Leider kann ich Ihrer Ausführung nicht ganz folgen. Es ist für mich wichtig zu wissen, welche Werte überhaupt in die Kopfzeile geschrieben werden sollen.

- Eine Berechnung,

- Ein Wert aus einer Datenbank,

- Ein Wert von einem anderem Feld.

 

Mit JavaScript kann man in LCD auf jedes Feld zugreifen. Es ist auch möglich eine Schleife anzupassen, um automatisiert auf bestimmte Felder zuzugreifen.

So wie ich es verstanden habe, möchten Sie in einem Teilformularsatz auf jedes Feld in der Kopfzeile der entsprechenden Instanz zugreifen und den Wert abändern.

Es ist sinnvoll eine kleine Beispieldatei zu erstellen undhier hochzuladen.

 

Gruß,

 

Walde 

TestUser
Beiträge: 6
Registriert: 13.07.2010, 08:53

Kopfbereich mit Daten aus der jeweiligen Seite füllen

Beitrag von TestUser » 30.07.2010, 11:09

Hallo Walde,

der Fall ist (für mich) nicht so ganz einfach zu erklären. Leider erlaubt das SAP System, in dem ich das Formular erstellt habe, auch keinen Export.  Wenn ich Zeit finde, erstelle ich mal ein ähnliches Beispiel "offline". Das wird wohl vor Montag/Dienstag nichts werden.

Ansonsten mal soviel:  ich möchte pro Teilformular (von denen jedes über mehrere Seiten geht, dabei aber reichlich dynamische Bereich hat, so dass man nicht sagen kann, welcher Bereich sich auf welcher Seite befindet) die Kopfdaten der zugehörigen Templates (Masterseiten) mit einem Wert aus einem Feld des jeweiligen Teilformulars füllen.

Um diesen Wert eben auf die korrekten Seiten zu bringen, müsste ich für jedes Teilformular feststellen, welche Instanzen der Masterpages sich "innerhalb" des Teilformulars befinden. Diese Referenz habe ich leider nirgendwo gefunden.

 

Gruß, Ulrich

Antworten