Page innerhalb von PageSet ansprechen

Grundsätzliche Themen zur Bedienung, Erstellung von Formularen, Datenbankanbindung und Beispiele ...
Antworten
Dennis1994
Beiträge: 5
Registriert: 01.10.2019, 16:16

Page innerhalb von PageSet ansprechen

Beitrag von Dennis1994 » 01.10.2019, 16:38

Hallo zusammen,

Ich habe eine Frage:
Ich habe ein Zeitnachweisformular gebaut. Im Formular habe ich 2 Masterseiten: Startseite und Folgeseite. Die Startseite kommt immer nur einmal je Mitarbeiter vor. Die Folgeseite kann aufgrund einer dynamisch wachsenden Tabelle mehrere Seiten umfassen.
Ich möchte auf jeder Seite die Seitenzahl und die Gesamtseitenzahl je Mitarbeiter anzeigen. Setze ich Seitennummer = xfa.layout.page(this) + " / " + xfa.layout.pageCount(), ist die erste Startseite bei z.B. 5 Mitarbeitern "Seite 1 / 12", die zweite Startseite "Seite 3 / 12" usw. Gewünscht wäre, dass die erste Startseite "Seite 1 / 3" (Mitarbeiter 1 hat 3 Seiten) anzeigt, die zweite Startseite "Seite 1 / 2" (Mitarbeiter 2 hat 2 Seiten), usw.

Haben alle Mitarbeiter nur 2 Seiten, konnte ich das Problem lösen, indem ich die Seiten nachträglich setze mit Hilfe von pageSet. Ich speichere dafür in 3 Variablen die korrekte Seitennummer der Seite (wird auf den Folgeseiten hochgezählt und bei jeder Startseite auf 1 zurückgesetzt), den pageSet und die Gesamtzahl der Seiten (wird auf der letzten Folgeseite für die vorherigen bis zur letzten Startseite gesetzt). Auf der letzten Seite des Formulars trage ich dann mit Hilfe der Variablen die Seitennummern korrekt ein ( Mittels: $.parent.parent.parent.parent.pageSet.Startseite.Seitenzahlen.Seite.rawValue = Concat("1 / ", f_c1) ). Wie gesagt funktioniert das leider nur bei einer Startseite und einer Folgeseite. Gibt es mehrere Folgeseiten, wird nur die erste Folgeseite berücksichtigt, bei den anderen bleibt die Seitennummer blank.
Gibt es innerhalb des pageSet die Möglichkeit auf eine bestimmte page zuzugreifen? (Formular.pageSet[0].Folgeseite[1]...?) Ich habe je Seite auch die classID gespeichert, wäre ein Zugriff über diese möglich?

Oder hat jemand eine einfachere Lösung, um den pageCount je Mitarbeiter zurückzusetzen?

Gruße
Dennis

armine
Beiträge: 2690
Registriert: 16.05.2009, 10:24

Re: Page innerhalb von PageSet ansprechen

Beitrag von armine » 07.10.2019, 09:43

Hallo Dennis, willkommen im Forum!

Mir scheint, du denkst zu kompliziert und zwischen FormCalc und JavaScript unterscheidest du auch nicht so recht.
Allgemein: PDF hochladen wäre gut gewesen.
Zur Beachtung: Die Platzierung der Mitarbeiterbeiträge auf MS1 (1. Masterseite) wird durch „bedingten Seitenumbruch“ gesteuert, um Leerseiten zu vermeiden.
Zur Problemlösung: Schau doch einfach (z.B. am Ende des Formulars) nach, wie viele Mitarbeiterbeiträge du hast und wie lange die jeweils sind. Dann kannst du die gewonnene Erkenntnis in der von dir gewünschten Form auf die schon vorhandenen Instanzen der Masterseiten schreiben.

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

Dennis1994
Beiträge: 5
Registriert: 01.10.2019, 16:16

Re: Page innerhalb von PageSet ansprechen

Beitrag von Dennis1994 » 07.10.2019, 10:30

Hallo Armine,

Vielen Dank für die nette Begrüßung und für deine Mühe!
Ich glaube auch, dass ich zu kompliziert denke :D

Deine Idee mit dem gucken am Ende des Formulars habe ich schon probiert, hat nicht ganz geholfen, weil ich nicht alle Seiten nachträglich bearbeiten konnte.
Ich habe nun mal ein Beispiel PDF vorbereitet und angehängt, vielleicht hilft das:
Ich habe nachträglich Kommentare hinzugefügt ( Beginnen immer mit ">>>" und enden mit "<<<"). Im Formulare sind 3 Mitarbeiter abgebildet. Je Mitarbeiter ist fer Aufbau wie folgt:
Die erste Seite ist auf Masterpage1 platziert. Hier gibt es 2 Inhaltsbereiche, "Header" und "Data". Im Header sind Adress und Organisationsdaten, dieser wird nur auf der ersten Seite benötigt. Im Bereich Data beginnt eine tabelle mit den entsprechenden Mitarbeiterdaten. Diese wächst dynamisch. Wird die Tabelle zu groß, springt sie in Masterpage2 (damit eben der Header nicht mehr dargestellt wird). Reicht auch diese Seite nicht aus, wird eine 2. Masterpage2 gefüllt. Danach kommt noche eine Übersicht, diese ist immer von der gleichen größe. Der nächste Mitarbeiter beginnt dann wieder mit der Masterpage1. In der rechten oberen Ecke fülle ich ein Textfeld mit der Seitennummer abhängig von der Anzahl der Seiten je Mitarbeiter. Bei den ersten beiden Mitarbeitern klappt das auch, weil diese nur 2 Seiten aufweisen. Der dritte Mitarbeiter hat 3 Seiten, hier funktioniert es nicht, da ich glaube ich die 2 Seite von masterpage2 nicht ansprechen kann.
Ich fülle das Textfeld je Seite wie folgt (Die Zahlen habe ich hier einfach zur einfacheren Kommunikation eingefügt) :
In Event ready:layout von Masterpage2 (FormCalc, client)
1 if (f_total == xfa.layout.pageCount()) then
2 var i = 0
3 while (i <= f_c2) do
4 var help = $.parent.parent.parent.parent.pageSet.Folgeseite.Header_Folgeseite.Seitenzahlen.C1.rawValue
5 $.parent.parent.parent.parent.pageSet.Startseite.Seitenzahlen.Seite.rawValue = Concat("1 / ", help)
6 $.parent.parent.parent.parent.pageSet.Folgeseite.Header_Folgeseite.Seitenzahlen.Seite.rawValue = Concat(help, " / ", help)
7 i = i + 1
8 endwhile
9 endif


Zeile 1: f_total ist einfach ein Counter, der je Seite hochzählt, ich warte also bis die letzte Seite erreicht ist um dann alle Seiten nachträglich zu bearbeiten. f_total heißt im Formular "Total".
Zeile 4. C1 ist im Formular "akt.Seite". Hier wird je Mitarbeiter hochgezählt. Auf Masterpage1 wird der Wert wieder auf 1 gesetzt. Ziel ist, dass ich hier die entsprechende Zahl der Seiten je Mitarbeiter bekomme.
Zeile 5 & 6: Hier Setze ich jeweils auf der Startseite (Masterpage1) und der Folgeseite (Masterpage2) die Seitenzahl. Wie zusehen mache ich das via pageSet. Ich denke, dass hier das Problem liegt, da ich bei der Folgeseite nur die erste Seite ansprechen kann. Gibt es mehrere Folgeseiten, werden die nachfolgenden ignoriert.
Wie wäre hier ein besserer Weg bze. der richtige Weg?^^

VG Dennis

Beispiel für Forum.pdf
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

armine
Beiträge: 2690
Registriert: 16.05.2009, 10:24

Re: Page innerhalb von PageSet ansprechen

Beitrag von armine » 08.10.2019, 07:48

Hallo Dennis,

mit „PDF hochladen wäre gut gewesen“ meinte ich nicht, dass du deine Datei zum Hochladen über den PDF-Drucker erzeugen sollst.
Den Fehlschlag „... gucken am Ende des Formulars habe ich schon probiert, hat nicht ganz geholfen, weil ich nicht alle Seiten nachträglich bearbeiten konnte.“ solltest du nicht auf meine Datei übertragen. Die funktioniert nämlich. Darüber hinaus keimt in mir der Verdacht, dass du die Arbeitszeiten nicht im Formular ermittelst, sondern nachträglich eingibst. Und obendrein arbeitstäglich wegen der Ausgabe der Arbeitszeit in Dezimal-Stunden diese Zwischenergebnisse oftmals gerundet werden. Runden war in meiner Schulzeit eine Übung, die zum Schluss – nie bei Zwischenergebnissen – aufgeführt wurde.
Hast du „Dann kannst du die gewonnene Erkenntnis in der von dir gewünschten Form auf die schon vorhandenen Instanzen der Masterseiten schreiben.“ beachtet? Ist dir nun klar, dass es nicht nur die Materseite gibt, sondern auch Instanzen und diese auch referenziert werden wollen? Das hättest du auch meinem Code entnehmen können.

Schaffst du es nun oder willst du deine Datei hochladen?

vg armine

Dennis1994
Beiträge: 5
Registriert: 01.10.2019, 16:16

Re: Page innerhalb von PageSet ansprechen

Beitrag von Dennis1994 » 08.10.2019, 08:15

Hallo armine,
Den Fehlschlag habe ich nicht auf deine Datei übertragen, sondern meinte das schon auf mein Formular ;)
Die Arbeitszeiten werden von mir im Formular weder gerundet noch nachträglich hinzugefügt. Diese stammen aus den HR Tabellen und ich lasse einfach die Tabelle füllen. Das klappt auch alles und gibt die korrekten Werte aus.
An sich ist mir auch klar, dass es nicht nur die eine Masterseite gibt, sondern Instanzen. Ich habe ja auch schon gemerkt, dass je Mitarbeiter ein pageSet erzeugt wird, in welchem dann eben eine Instanzen der Masterpage "Startseite" und X Instanzen der Masterpage "Folgeseite" sind. Auch dass ich die einzelnen Instanzen referenzieren muss ist mir eigentlich klar. Mein Problem ist ja wie ich auf diese referenziere. Sobald mehr als eine Instanz der Masterpage "Folgeseite" in einem pageSet existiert, kann ich nicht mehr auf die einzelnen Instanzen referenzieren.
Deiner Datei habe ich leider noch nichts entnehmen können, da wenn ich sie öffne such einfach ein pdf öffnet. Muss ich die Datei speziell öffnen? Wie und in welcher Form müsste ich meine Datei hochladen? (Bin erst seit ein paar Wochen in dem Umfeld unterwegs, habe also leider noch nicht so viel Erfahrung, tut mir Leid :/)

Viele Grüße und vielen Dank
Dennis

armine
Beiträge: 2690
Registriert: 16.05.2009, 10:24

Re: Page innerhalb von PageSet ansprechen

Beitrag von armine » 08.10.2019, 09:22

Hallo Dennis,

du kannst mein PDF zum Zwecke der Ansicht mit Acrobat Reader oder Acrobat öffnen.
Mehr über den Aufbau erfährst du, wenn du das PDF mit dem LCD (bzw. dem Nachfolger AEM) öffnest.
Der Code im Teilformular (subform) Subpaginierung ist:

form1.gesamt.Subpaginierung::calculate - (JavaScript, client)

var arr = [], ff = 0 ;
for (i = 0; i < xfa.host.numPages; i++) {
var oForms = xfa.layout.pageContent(i, "subform") ;
for (var j = 0; j < oForms.length; j++) {
var oItem = oForms.item(j) ;
if (oItem.name == "Block") { // "Block" darf als Name für "subform" nicht nochmal vorkommen!
arr.push([oItem.index, xfa.layout.pageSpan(oItem)]) ;
i += xfa.layout.pageSpan(oItem) - 1 ;
break
}
}
}

for (i = 0; i < arr.length; i++) {
xfa.resolveNode("#pageSet.MS1[" + i + "]").subPagina.rawValue = "Abschnitt " + (i+1) + ", Seite 1 von " + arr[1] ;
for (j = 1; j < arr[1]; j++) {
xfa.resolveNode("#pageSet.MS2[" + ff + "]").subPagina.rawValue = "Abschnitt " + (i+1) + ", Seite "+ (j+1) + " von " + arr[1] ;
ff++
}
}

form1.gesamt.Subpaginierung::docReady - (JavaScript, client)

this.execCalculate() // damit die Subpaginierung schon beim Öffnen des PDFs über alle Instanzen ausgeführt wird

Der Ansatz:
Alle Subforms aller Layoutseiten auslesen.
Suche nach dem Namen des Teilformulars (hier: Block) in der ersten „numPages“.
Schreibe den Index des Teilformulars und den Umfang in Seiten in ein Array.
Nachdem nun bekannt ist, in wie vielen Seiten nicht mehr gesucht werden braucht, korr. den äußeren Schleifenzähler und brich die innere Schleife ab.
Verwende nun das Array um auf der 1. Masterseite (MS1) den
• Abschnitt,
• „Seite 1“
• Umfang des Abschnitts
einzutragen sowie die entsprechenden Wert für eventuelle Folgeseiten auf der 2. Masterseite (MS2).
Dazu wird die Variable „ff“ hochgezählt, um die entsprechende Instanz zu treffen.

vg armine

P.S.: Die Vorschau mit der ungewollten Kursiv ist mir ein Gräuel – und Coden ist einfacher, als diesen Summs zu schreiben.

Dennis1994
Beiträge: 5
Registriert: 01.10.2019, 16:16

Re: Page innerhalb von PageSet ansprechen

Beitrag von Dennis1994 » 08.10.2019, 14:37

Hallo armine,

Hab das mal probiert und funktioniert super. Vielen Dank für deine Hilfe und Geduld :)

Gruß
Dennis

Antworten