[Gelöst] Seitenzahl x von y in Reports???

2. Mai 2006 11:28

Hallo zusammen,

ich habe mich heute registriert, weil ich bei einer Sache nicht weiterkomme. Es ist ein alt-bekanntes Problem in Navision, ich weiß, aber ich bekomme es nicht gelöst:

Wie zeige ich auf allen Seiten die Gesamtseitenzahl an?

Eine einfach Funktion gibt es nicht, das weiß ich und über die Suchfunktion habe ich hier leider nichts gefunden. Falls das Thema also schon hier durch ist, bitte ich um Entschuldigung und einen Tipp. wie ich es finde. Danke.

Folgendes habe ich z.B. probiert:

1.
2-facher Durchlauf des Reports, wobei beim ersten die Sections nicht ausgegeben werden: fehlgeschlagen, da das CurrReport.pageno bei ausgeblendeten Sections nicht zu funktionieren scheint.
2.
Aufruf eines Reports im Report über Funktionen: habe ich leider nicht hinbekommen.

Hat jemand eine Lösung für das Problem, ohne dass ich tatsächlich die doppelte Anzahl von Seiten drucken muss? DAS funktioniert nämlich :roll:
Zuletzt geändert von NavHummel am 4. Mai 2006 21:55, insgesamt 1-mal geändert.

Re: Seitenzahl x von y in Reports???

2. Mai 2006 13:14

NavHummel hat geschrieben:Wie zeige ich auf allen Seiten die Gesamtseitenzahl an?


Dies ist wirklich nicht einfach zu lösen. Der Ansatz, den Report 2x durchlaufen zu lassen, ist gut.

Folgende Lösung ist aus meiner Sicht möglich:
- Den Report als Varibale deklarieren
- Report als Preview ausführen ohne Requestform
- Im OnPostReport-Trigger die Seitenzahl abfragen und wegschreiben (separate Tabelle mit User und ReportID)
- Report normal zum Drucken starten
- Weggeschriebene Seitenzahl aus Tabelle lesen
- Jetzt ist die Anzeige 1/15 usw. möglich

2. Mai 2006 15:19

@rotsch

"Report als Preview ausführen ohne Requestform "
lässt sich ein Preview im Report erzwingen, d.h. kann ich einen Report automatisch ausführen nur in der Seitenansicht?

2. Mai 2006 16:07

ICh denke, das wird nicht gehen, weil die Seitenansicht ja auf eine Benutzereingabe wartet.
Aber, du könntest einen Pseudodrucker einrichten, der an die Schnittstelle Nul: druckt, das ist sozusagen die Bit-Wiederverwertung (auch Nirvana genannt)
Jetzt Seitenzahl merken dann änderst du den Drucker auf den richtigen Drucker zurück und druckst den Report mit gefüllter Variable für die Gesamtseitenzahl.
Der Nul-Drucker muss auf jedem Arbeitsplatz, der den Report druckt eingerichtet sein.

Das ist jetzt mal nur aus dem Bauch geschossen, ich weiss nicht, ob die Änderung des Druckers im Report funktioniert, aber wenn ja, wäre das die Lösung.

2. Mai 2006 16:12

Michael Schumacher hat geschrieben:...Aber, du könntest einen Pseudodrucker einrichten, ...

Der Pseudodrucker müsste dann aber immer den "richtigen" Druckertreiber haben, sonst ist das Ergebnis evtl. nicht ganz korrekt.

2. Mai 2006 16:17

Nicht in Preview sonder Report.SaveAsHTML und dann die Seitenzahl holen.
Du kannst ja im Report eine neue Funktion implementieren
GetTotalPage
exit(TotalPages)

Report.SaveAsHtml(Environ('TEMP')+'\Reportxy.html');
Report.GetTotalPage
...

2. Mai 2006 16:36

martinst hat geschrieben:Nicht in Preview sonder Report.SaveAsHTML und dann die Seitenzahl holen.
Du kannst ja im Report eine neue Funktion implementieren
GetTotalPage
exit(TotalPages)

Report.SaveAsHtml(Environ('TEMP')+'\Reportxy.html');
Report.GetTotalPage
...


Das habe ich so ähnlich auch schon versucht, aber nicht ganz hinbekommen. Wo muss ich den Aufruf für den "Vor-Report" starten? Auf dem OnPush oder in dem zu druckendem Report selber? Oder über eine Extra-Funktion?

2. Mai 2006 16:42

Ich würde auf dem OnAfterGetRecord-Triggers des Belegkopfes.

Gruss

2. Mai 2006 18:45

mespelage hat geschrieben:@rotsch

"Report als Preview ausführen ohne Requestform "
lässt sich ein Preview im Report erzwingen, d.h. kann ich einen Report automatisch ausführen nur in der Seitenansicht?


Nein, da habe ich mich geirrt, sorry.

Den Report müsste man ganz normal starten und als Seitenansicht laufen lassen. Dabei können die Seiten gezählt werden. Anschliessend muss dann der Report nochmals gestartet und definitiv gedruckt werden.

Das ist aber wirklich nicht die feine Art, das gebe ich zu :roll:

2. Mai 2006 18:49

Den Report müsste man ganz normal starten und als Seitenansicht laufen lassen. Dabei können die Seiten gezählt werden. Anschliessend muss dann der Report nochmals gestartet und definitiv gedruckt werden.


Nein, nicht PrintPreview, sondern SaveAsHtml!!

2. Mai 2006 19:27

Die sicherste Methode ist und bleibt wohl leider wirklich nur die Möglichkeit, den Report per SaveAsHTML zu speichern und über eine entsprechende Funktion die Anzahl Seiten ermitteln.

Der optimale Punkt wäre der OnPreReport-Trigger, da dort alle gesetzten Filter des Anwenders bekannt sind, jedoch noch keine Druckausgabe erfolgte.
Für Verkaufs- und Einkaufs-Belege (wo die Seitenzahl jedesmal wieder zurückgesetzt wird), empfiehlt sich der OnAfterGetRecord-Trigger des DataItems CopyLoop (direkt hinter der Zeile CurrReport.PAGENO := 1;).

Kleiner Hinweis:
Wenn ein Report als XML oder HTML gespeichert wird, läuft diese Instanz des Reports in dem gleichen Modus wie die Seitenansicht, d. h. man kann mit CurrReport.PREVIEW eine Endlosschleife verhindern:
Code:
[CopyLoop - OnAfterGetRecord()]

[...]
CurrReport.PAGENO := 1;

// > TL4.01:01 >>>
IF NOT CurrReport.PREVIEW THEN BEGIN
  SalesHeader2 := "Sales Header";
  SalesHeader2.SETRECFILTER;
  repMySelf.SETTABLEVIEW(SalesHeader2);
  IF repMySelf.SAVEASHTML(DELCHR(ENVIRON('TEMP'),'>','\') + '\' + repMySelf.OBJECTID + '.html') THEN BEGIN
    TotalNoOfPages := repMySelf.GetTotalNoOfPages;
    CLEAR(repMySelf);
    ERASE(DELCHR(ENVIRON('TEMP'),'>','\') + '\' + repMySelf.OBJECTID + '.html');
  END;
END;
// < TL4.01:01 <<<

Code:
[GetTotalNoOfPages() : Integer]
EXIT(CurrReport.PAGENO);

3. Mai 2006 08:50

Der optimale Punkt wäre der OnPreReport-Trigger, da dort alle gesetzten Filter des Anwenders bekannt sind, jedoch noch keine Druckausgabe erfolgte.


Da bin ich nicht ganz Deiner Meinung.
Was passiert, wenn mehrere Belege (von Nummer - Nummer) gleichzeitig gedruckt werden?
Dann würde ja die Gesamtseitenzahl aller Seiten zusammengezählt.
Deshalb OnAfterGetRecord.

Gruss

3. Mai 2006 10:36

Timo Lässer hat geschrieben:Die sicherste Methode ist und bleibt wohl leider wirklich nur die Möglichkeit, den Report per SaveAsHTML zu speichern und über eine entsprechende Funktion die Anzahl Seiten ermitteln.

Der optimale Punkt wäre der OnPreReport-Trigger, da dort alle gesetzten Filter des Anwenders bekannt sind, jedoch noch keine Druckausgabe erfolgte.
Für Verkaufs- und Einkaufs-Belege (wo die Seitenzahl jedesmal wieder zurückgesetzt wird), empfiehlt sich der OnAfterGetRecord-Trigger des DataItems CopyLoop (direkt hinter der Zeile CurrReport.PAGENO := 1;).

Kleiner Hinweis:
Wenn ein Report als XML oder HTML gespeichert wird, läuft diese Instanz des Reports in dem gleichen Modus wie die Seitenansicht, d. h. man kann mit CurrReport.PREVIEW eine Endlosschleife verhindern:
Code:
[CopyLoop - OnAfterGetRecord()]


SUPER! Das hat soweit funktioniert. Nur ergab die Gesamtseitenzahl im OnPostReport einen falschen Wert, so dass ich die CurrReport.PAGENO im OnPostDataItem() des PageLoop´s in eine Variable kopiert habe und diese dann in der Funktion ausgegeben habe.

Außerdem musste ich die Programmierung von dem CopyLoop in den Purchase Header verschieben. Denn wenn ich eine Anzahl Kopien in die Optionen eingetragen habe, dann gab es Probleme und ich musste den Taskmanager bemühen.
Jetzt habe ich dasselbe Problem, wenn ich mehr als eine Bestellung drucken will. Woran liegt das? Kann ich das abschalten?
EDIT: Das Problem tritt auch auf, wenn ich Report in kurzen Abständen starte, dann stürzt der Client ebenfalls ab.

Noch eine Frage dazu:
1. Kann ich es irgendwie schaffen, die Gesamtseitenzahl auch auszugeben, wenn die Seitenansicht gewählt wird, ohne dass es zu einer Endlosschleife kommt? Ich höre jetzt schon meine lieben Kollegen, die meinen, dass die Gesamtseitenzahl fehlt, nicht stimmt, etc., nur weil sie in der Seitenansicht stehen. :roll: Kann man irgendwie abfragen, dass der Report als *.html gedruckt wird? Dann könnte das ja funktionieren, oder?


Vielen Dank!!!
Zuletzt geändert von NavHummel am 3. Mai 2006 15:42, insgesamt 1-mal geändert.

3. Mai 2006 15:40

Okay, nachdem ich noch ein bisschen probiert habe:

Ich kann den Report defenitiv nur einmal für eine Bestellung drucken. Wenn ich es ein 2. Mal versuche, stürzt Navision ab. D.h: Ich bekomme die RequestForm, sage Drucken (die Seitenansicht funktioniert) und das Druckfenster läuft Amok, ich komme nicht mehr dazu den Druck mit OK zu bestätigen. Nur der TaskManager hilft noch...
Das bedeutet, ich muss pro Ausdruck einer Bestellung einen neuen Navision-Client starten, dann funktioniert es :roll:
Ich bekomme auch leider nicht heraus, WAS Navision da macht.

Desweiteren habe ich mir mal das entsprechende TEMP-Verzeichnis angeschaut. Zum einen werden die Logos aus dem Report dort ebenfalls gespeichert beim Druck, aber die kann ich ja dann löschen. Zum anderen werden immer 2 Dateien mit erstellt. Diese heißen: "_TEMP_". Die Dateiendung variiert hier. Z.B: "_TEMP_.EL4" und "_TEMP_.GDI". Wie kann ich die löschen??? Die sind so groß wie das erstellte und gelöschte *.html.
Wenn ich einen anderen Pfad eingebe, z.B. SAVEASHTML('C:\test.html') werden diese TEMP-Dateien nicht erstellt.

Ich weiß nicht ob ich lachen oder weinen soll. Der ganze Aufwand für eine Ausgabe der Gesamtseitenzahl auf der 1. Seite... :wink:

3. Mai 2006 17:24

Irgendwie komisch.

Ich lade Dir als Attachment eine FOB-Datei mit dem Report 205 hoch.
Ist zwar in der Basis ein CH-Report, sollte doch aber keine Rolle spielen.
Vorher Dein Objekt sichern.

Sie Dir mal die folgenden Trigger an:
Code:
Head - OnAfterGetRecord()
//Hier
IF NOT BlockTotalPages THEN BEGIN
  HTMLFileName := ENVIRON('TEMP')+'\'+FORMAT(CREATEGUID)+'html';
  Header2.COPY(Head);
  Header2.SETRECFILTER;
  SalesOrder2.SETTABLEVIEW(Header2);
  SalesOrder2.USEREQUESTFORM(FALSE);
  SalesOrder2.BlockCountTotalPages(TRUE);
  SalesOrder2.SAVEASHTML(HTMLFileName);
  IF EXISTS(HTMLFileName) THEN
    ERASE(HTMLFileName);

  PageCount := SalesOrder2.GetPageCount;
END;
//Ende

Code:
Total - OnPostDataItem()
//Hier
PageCount := CurrReport.PAGENO;


Code:
GetPageCount() : Integer
//Hier
EXIT(PageCount);

Code:
BlockCountTotalPages(_b : Boolean)
//Hier
BlockTotalPages := _b;

Funktioniert 1A.

3. Mai 2006 20:31

@ NavHummel:
Hast du bemerkt, dass ich eine Zeile CLEAR(repMySelf); in meinem Code habe?
Ich könnte mir gut vorstellen, dass es daran liegen könnte, wenn diese Zeile fehlt.

@ martinst:
Danke für den Tipp mit der Funktion BlockCountTotalPages!
Damit funktioniert das dann auch in der Seitenansicht.

4. Mai 2006 10:18

Also die Seitenansicht funktioniert nun wunderbar!
@ martinst Klasse Lösung!

Was aber nicht funktioniert, ist das mehrfache Drucken. Das Druckerauswahlfenster verschwindet beim 2. Ausdruckversuch immer hinter dem Navision-Client. Wenn ich es in der Statusleiste anklicke, erscheint immer wieder das Navision-Fenster im Vordergrund. Das ist gerade so, als sei Navision noch mit irgend etwas beschäftigt. Jedoch Seitenansicht nach dem ersten Druckversuch funktioniert x-Mal hintereinander.

Ich habe auch den Code noch einmal auskommentiert, dann kann ich mehrfach drucken. Den Code habe ich genau nach Anleitung von martinst eingebaut.

Weil ich sicher gehen wollte, dass der Bestell-Report nicht Müll ist, habe ich das ganze in einen neuen Report eingebaut: Dasselbe Ergebnis.

@ Timo Lässer Ja, klar, das hatte ich eingebaut. Und nachdem ich dann den Code von martinst eingebaut habe und es nicht funktionierte, habe ich auch dort ein CLEAR eingebaut. Hat aber nicht geholfen.

Mensch, ich will jetzt nicht aufgeben, wo das nun in der Seitenansicht so wunderbar funktioniert (leider nur da :( ).

Also ich teste weiter. Falls einer von Euch noch eine Idee hat, ich bin für jede Hilfe dankbar.

Danke nochmal.

Edit: Mit einem Trick kann ich mehrfach drucken, aber so kann ich das nicht lassen: Wenn ich beim 2. Druck-Versuch das Navision-Fenster auf meinem Bildschirm minimiere, erscheint das Druckerauswahlfenster und dann kann ich auch OK drücken und der Ausdruck erfolgt. :roll:

4. Mai 2006 17:39

Ich habe es!!! :-D

Ich habe den "ShowPrintStatus" des Reports auf "nein" gesetzt. Warum das damit funktioniert, kann ich mir zwar nicht erklären, aber es funktioniert. Hurra!

Vielleicht ein Bug im SAVEASHTML in der 3.60???

Nochmals ein großes Dankeschön an Euch!

4. Mai 2006 19:22

Ein dickes Danke, dass du uns alle an der Lösung teilhaben lässt.
So hat die ganze Community etwas davon, und gerade das Problem "Seite x von y" ist in Navision ein heißes Thema, was jeden brennend interessieren dürfte.
Zuletzt geändert von Timo Lässer am 21. Juni 2006 19:56, insgesamt 1-mal geändert.

4. Mai 2006 21:54

Warum das mit dem "ShowPrintStatus" nun funktioniert ist mir immer noch ein Rätesl.

4. Mai 2006 22:25

Navision wird uns wohl in vielen Bereichen immer ein Rätsel bleiben und den Internet-Communities weiterhin zahlreiche Mitglieder bescheren ;-)

Nichts ist unmöglich, man muss nur den Weg kennen.
(Und wenn es auch "von hinten durch die Brust in's Auge" ist.)

5. Mai 2006 07:28

hi,
ich bin an dieses problem etwas anders herangegangen, was natuerlich nicht bedeutet, dass diese loesung besser ist. ;)

mein report zaehlt saemtliche positionen der zu druckenden tabelle.
da ich die anzahl an zeilen kenne, die auf die erste und die folgenden seiten passt, kann ich mir damit ausrechnen wieviel seiten das ergeben muss.

vorteil: ist schnell eingebaut und einfach
nachteil: wird am layout etwas geaendert, muss ich nachzaehlen, ob sich die anzahl je seite aendert

gruesse
feri

5. Mai 2006 08:59

Weiterer Nachteil:
Druckt man den Report auf einem anderen Drucker (z. B. Tintenstrahl- statt Laserdrucker), dann könnte es ebenfalls zu Ungenauigkeiten kommen, da jeder Drucker unterschiedliche nicht druckbare Bereiche (vor allem am unteren Rand) hat.

Trotzdem vielen Dank für diese weitere Idee.

Re: [Gelöst] Seitenzahl x von y in Reports???

2. Februar 2009 17:00

Ich habe mal einen Post im Tips & Tricks Bereich zu diesem Thema erstellt:

http://www.msdynamics.de/viewtopic.php?f=17&t=6809

Zusätzlich habe ich noch eine kleine Verbesserung eingebaut um das Problem mit den Bildern, die während dem SAVEASHTML erstellt werden, zu lösen: es wird ein Ordner erstellt in dem der SAVEASHTML Output gespeichert wird und hinterher wir der gesamte Ordner gelöscht.

Re: [Gelöst] Seitenzahl x von y in Reports???

14. April 2020 12:52

Ignitor hat geschrieben:Ich habe mal einen Post im Tips & Tricks Bereich zu diesem Thema erstellt:
viewtopic.php?f=17&t=6809

Auch wenn hier 11 Jahre Ruhe war :-) eine kleine Ergänzung dazu, aus aktuellem Anlass.
Ich habe den obigen Code zusammen mit dem PDFCreator im Einsatz. Beim Stapeldruck klappt es bei mir nur mit diesem Zusatz zum Zurücksetzen im OnAfterGetRecord-Trigger vom ersten DataItem.

Code:
   […]
  IF PageCountReport.SAVEASHTML(Path + '\' + DELCHR(PageCountReport.OBJECTID) + '.html') THEN
    BEGIN
      TotalNoOfPages := PageCountReport.GetTotalNoOfPages;
      CLEAR(PageCountReport);
      FileSystem.DeleteFolder(Path);
    END;
    CLEAR(FileSystem);
    // - Zurücksetzen beim Stapeldruck
    PageCountReport.ClearCountTotalPages;
    // +

Zusätzliche Funktion
Code:
ClearCountTotalPages()
CountTotalPages := FALSE;