Endlosschleifen in List & Label verhindern

Einleitung

Beim Druck bzw. Export kann es vorkommen, dass die Anwendung in eine Endlosschleife läuft und hängt.

Dies kann ganz grundsätzlich die verschiedensten Ursachen haben. In den meisten Fällen kann jedoch davon ausgegangen werden, dass das Problem auf die im Bericht verwendeten unterschiedlichen Objekte zurückzuführen ist, bzw. aufgrund von bestimmten Objektkombinationen oder deren Größe.

Grundsätzlich empfehlen wir immer das aktuelle Service Pack zu installieren, so dass im Vorfeld bereits korrigierte Probleme ausgeschlossen werden können.

Nachfolgend finden Sie eine Auflistung der erfahrungsgemäß häufigsten Ursachen.

Ursachen

Prüfen Sie die folgenden möglichen Ursachen, um Endlosschleifen zu verhindern:

Objekte passen nicht auf Seite

Prüfen Sie, ob Objekte auf einer Seite evtl. keinen Platz mehr als Ganzes finden (z.B. in einer Tabellenzelle). Diese werden normalerweise umgebrochen, sofern das betroffene Objekt dies unterstützt, bei manchen Objekten/Elementen müssen diese jedoch immer als Ganzes (am Stück) ausgegeben werden, dies betrifft z.B. Bilder. Passt ein Objekt nicht mehr auf eine Seite, wird versucht dieses auf der nächsten Seite auszugeben, in der Annahme, dass dort dann mehr Platz zur Verfügung steht. Sollte sich auf der/den Folgeseiten kein größerer Platz ergeben, kann dies in einer Endlosschleife resultieren.

Bildobjekt zu klein

Prüfen Sie bei Bild- oder ähnlichen Objekten, ob dieses aufgrund einer zu großen Höhe evtl. nicht mehr auf die Seite bzw. in die Tabelle passt. Dies kann bspw. der Fall sein, wenn für das Objekt eine feste Höhe definiert ist, die jedoch geringer ist als die Höhe des Bildes. Ggf. kann hier die Höhe auf 0 gesetzt werden, damit List & Label die optimale Höhe für die Spalte berechnen kann.

Baustein zu klein

Prüfen Sie, ob Objekte, die in Bausteinen bzw. Unterberichten enthalten sind, evtl. eine feste Höhe definiert haben, die größer als die Höhe des Containers ist.

RTF-Objekt zu klein

Prüfen Sie, ob der Inhalt in einem RTF-Objekt größer ist als der zur Verfügung stehende Platz, bspw. wenn das RTF ein Bild enthält. Dies führt zu einer Endlosschleife, weil das Bild möglicherweise auch für die folgenden Seiten zu groß ist.

PDF-Objekt zu klein

Prüfen Sie bei PDF-Objekten die Eigenschaft Originalgröße, um sicherzustellen, dass die Originalgröße des PDFs nicht größer ist als der druckbare Bereich.

Berichtscontainer zu groß

Prüfen Sie, ob der Berichtscontainer generell zu groß (Breite und Höhe) ist und dadurch möglicherweise weit über den Rand der Arbeitsfläche hinausragt.

Per Formel berechnete Werte passen nicht zum Papierformat

Prüfen Sie, ob Formeln evtl. Werte zurückgeben, die nicht zum gewählten Papierformat passen. Hier bietet es sich an, die Höhe/Breite des Berichtscontainers mittels der Variablen LL.Device.Page.Size.cy bzw. LL.Device.Page.Size.cx zu definieren.

Achten Sie inbesondere bei der Verwendung von Formeln auch darauf, die Funktion UnitFromSCM zu verwenden, aber auch bei Berichten, die für verschiedene regionale Benutzereinstellungen designt wurden.

Zeilenumbrüche am Ende von RTF-Texten

Prüfen Sie. ob am Ende von RTF-Texten evtl. Zeilenumbrüche enthalten sind, die eine Endlosschleife auslösen können. Mit dem Setzen der Option LL_OPTION_SKIPRETURNATENDOFRTF auf TRUE können diese Umbrüche ignoriert werden.

Weitere Maßnahmen

Schleifendurchläufe begrenzen

Seit Version 24 kann mit der Option LL_OPTION_IDLEITERATIONCHECK_MAX_ITERATIONS ein Wiederholen der Schleife soweit eingegrenzt werden, so dass eine solche Rekursion pro Objekt erkannt wird.

Der Druck kann dann mit der Option LL_ERR_IDLEITERATION_DETECTED abgebrochen werden, so dass zumindest keine Endlosschleife mehr entstehen würde und das Hängen der Anwendung somit verhindert wird.

Hinweis: Dies lediglich bei der Verwendung eines DataProviders in .NET möglich. Bei der Verwendung einer eigenen Druckschleife greift diese Option nicht, so dass selbst für einen Abbruch des Drucks zu einem selbstdefinierten Zeitpunkt gesorgt werden müsste (bspw. durch das Zählen der ausgegebenen Seiten und einem Abbruch, wenn eine unrealistische Anzahl erreicht wurde).