List & Label 19 Trial
Visual Studio 2012 Pro
.NET 4.0
Hallo Leute,
ich arbeite mich gerade in List & Label ein. Als langjähriger Crystal Reports-Benutzer bin ich begeistert vom Funktionsumfang den List & Label bietet.
Ich rufe den Designer über die .Design()-Methode des List & Label-Controls auf. Dazu habe ich zwei Fragen:
1.) Ist es möglich, den Designer auch nicht modal aufzurufen? Momentan bleibt die Anwendung beim Aufruf der Design-Methode “stehen”.
2.) Mir ist aufgefallen, dass bei den Menüeinträgen mit Icons die Texte fehlen:
Siehe Screenshot:
Der][/url] Aufruf erfolgt aus dem GUI-Thread. Habt Ihr eine Idee woran das liegen könnte?
Kunde
→ Kundenadresse
→ Tabelle mit Anreden
→ Tabelle mit Bundesländern
→ Tabelle mit Ländern
Die Tabellen unterhalb der Kundenadresse sind mit der Kundenadresse verknüpft. In der Kundenadresse steht aber lediglich der Key. Erst in den Untertabellen selber steht die jew. Bezeichnung.
Wie bekomme ich es hin, dass ich drei Untertabellen in einer Tabelle (Berichtsobjekt) verwenden kann? Ich möchte das Land, die Anrede und das Bundesland in einer Zeile mit der Kundenadresse drucken.
(1) Ja, das geht. Schau mal das DesignerControl-Sample an, da wird das gezeigt. Leider ist der Inplace-Designer Ribbon-los, deswegen nutze ich lieber den Popup-Designer. Wenn Dich das nicht stört (lt. Deinem Screenshot verwendest Du ja das “alte” UI) ist der prima.
(2) Das ist bei mir nicht so. Passiert das bei Dir auf allen Rechnern? Welches Betriebssystem verwendest Du? Da würde ich mal den Support bemühen…
(3) Was für eine Datenquelle verwendest Du? Wenn Du es in der Hand hast könntest Du ja die Informationen in eine Tabelle zusammenpacken. Ansonsten müsste es glaube ich gerade umgekehrt sein, Du müsstest von der Anrede eine 1:n-Beziehung auf die Stammdaten definieren, das gleiche für Bundesland und Land. Die werden dann - je nach Datenprovider - rückwärts aufgelöst und als 1:1-Beziehung in der Stammadressen-Tabelle eingeblendet. Das kannst Du in der Beispielanwendung bei den erweiterten Beispielen sehen, wenn Du in der Feldliste z.B. die OrderDetails aufklappst.
Ich arbeite mit dem DbCommandDataProvider, da wir die Beziehungen zwischen den Tabellen nicht in der Datenbank selber definieren. Kannst Du mir sagen, wie List & Label bei diesem Provider vorgeht? Werden die via AddCommand hinzugefügten SQL-Statements einzeln ausgeführt oder baut List & Label mit Hilfe der definierten Relations ein großes SQL-Statement zusammen? Ich habe beim Testen die ganze Zeit das Gefühl, dass jedes Statement einzeln abgesetzt wird.
Das Generieren der Liste mit 15000 Testkunden und der dazugehörigen Adressen dauert eine halbe Ewigkeit (die Darstellung erfolgt in einer simplen Tabelle). An den SQL-Statements selber oder der Datenbank liegt das aber nicht, das habe ich geprüft.
Es macht wohl mehr Sinn, alle Daten in einem großen Statement zusammenzufassen, oder?
wenn Du den Debug-Modus aktivierst (LL.Debug = LlDebug.Enabled + Debwin starten) kannst Du genau die Statements sehen, die abgesetzt werden. In dem Fall könntest Du ja die Eltern- und Kind-Tabellen einfach vertauschen, dann sollten die 1:1-Ordner auftauchen. Es werden dann aber tatsächlich einzelne Queries ausgeführt, da könnte es einfacher sein, einen View zu definieren, der genau die Daten enthält die Du brauchst und sich an den zu binden. Alternativ natürlich ein spezielles Statement als Command übergeben, dann musst Du darauf achten, die MinimalSelect-Eigenschaft des Providers auf “false” zu setzen (vgl. Doku, da steht das glaube ich drin, ich habe das auf jeden Fall auch mal gebraucht).
Die Performance ist bei mir eigentlich sehr gut, ich hatte davor (das ist aber schon hundert Jahre her) FastReports, da war LL bis Version 18 ein Stück langsamer, inzwischen zumindest schneller als die Version die ich früher hatte. Bei SQL-Daten komme ich typischerweise auf knapp 20 Seiten pro Sekunde (auf meinem fetten Entwickler-System).
Ich habe das ganze jetzt auf zwei Statements, die ich via AddCommand an den Provider übergeben, reduziert. Die Statements sind voll auf Indizes angepasst, was mir ein Explain nochmal bestätigt hat.
Statement 1 (KUNDEN): Auslesen aller oder bestimmer Kunden
Statement 2 (ADRESSE): Auslesen aller oder bestimmter Adressen
Für jeden Kundendatensatz wird nochmal das ganze Statement der Adresse ausgeführt.
In meinem Test hatte ich gerade 14.000 Kundendatensätze. Da ich testweise mal alle Kunden selektiert habe, wird pro Kunde einmal das Statement für die Adresse ausgeführt. Dadurch dauert die Ausgabe natürlich mächtig lange.
Nachdem ich beide Statements zusammengefasst habe, dauert die Ausgabe jetzt nur noch ein paar Sekunden. Das Zusammenfassen der Statements bringt zwar die gewünschte Geschwindigkeit, dadurch hat man im Designer aber große Probleme die Felder auseinander zu halten. Es sein denn, man macht sich die Mühe für jeden Feldnamen einen Alias zu vergeben, was ich bei großen Statements mit großen Tabellen als sehr aufwändig empfinde…
Hm, dass das so einen Unterschied macht wundert mich schon - ich habe bei mir auch ein paar Relationen drin, ganz ähnlich wie bei Dir. Connection-Pooling hast Du schon “ganz normal” an, so dass es nicht daran liegen kann, dass die Connections wirklich immer wieder neu geöffnet werden müssen? Sonst muss ich mit der Schulter zucken, dann würde ich vielleicht mal bei combit nachfragen, ob die noch eine Idee haben.