Wechselbedingung bei Kreutabellen

Hallo List & Label Team,

Ich versuche momentan mit List & Label 19 unter Microsoft .Net (C#) eine Kreuztabelle zu erstellen.

Folgende Situation:

Ich übergebe dem Designer ein DataTable mit folgenden Spalten:

Tabelle:
“Artikel XXX”

Spalten:
Artikel ID
Größe
Farbe
Filiale
Bestand
Verfügbarkeit
Verkauft

In der Kreuztabelle soll der Bestand für jeweils einen Artikel dargestellt werden.
Dabei werden die Spalten erst nach den jeweiligen Größen und dann nach den jeweiligen Farben des Artikels gruppiert.
Die Zeilen werden nach Filialen gruppiert.
Das funktioniert auch alles soweit super. Ich habe eine pdf Datei angehängt die meine Kreuztabelle enthält.

Wie sie sehen werden die Summe der Bestände, Verfügbarkeiten und Verkäufe des Artikels alle zusammen in der Gesamt Zeile dargestellt.

Frage 1:
Gibt es eine Möglichkeit mehrere Gesamtzeilen mit Summen darzustellen ohne alles in eine Gesamtzeile schreiben zu müssen. Evtl. eine Funktion zum Einfügen von zusätzlichen Fußzeilen?

Frage 2:
Später soll der Benutzer beliebig viele Artikel auswählen können, für jeden ausgewählten Artikel soll dann eine Kreuztabelle mit den jeweiligen Beständen gedruckt werden. Momentan übergebe ich für jeden Artikel ein neues DataTable und rufe im Code erneut “Print()” auf. Ich könnte durch die Spalte “Artikel ID” in meinem DataTable zwischen den einzelnen Artikeln unterscheiden und alle Daten/Artikel in einem DataTable übergeben. Gibt es eine Art Wechselbedingung die erkennt wenn sich der Wert in der Spalte “Artikel ID” ändert und für den neuen Artikel eine neue Tabelle erstellt?

16-10-2014-09-37-55.png

Nachtrag zui Frage 2: Gibt es vllt. eine Möglichkeit das DataSource zur Laufzeit zu verändern? Habe versucht der “DataSource” Eigenschaft zur Laufzeit eine neue Tabelle zuzuordnen, aber leider hat das auch nicht funktioniert. Das würde mir bei meinem Problem auch schon sehr weiter helfen.

Würde mich über eine Antwort freuen

Grüße Flo

Hallo Florian,

vielen Dank für Ihren Beitrag.

Gerne möchte ich Ihre Fragen wie folgt beantworten:

Zu 1.) Die Möglichkeit mehrere Gesamtzeilen mit Summen darzustellen gibt es für die Kreuztabelle leider nicht. Ich nehme dies jedoch gerne als Wunsch für zukünftige Versionen in unsere Wunschdatenbank auf, vielen Dank für Ihren Vorschlag!

Als Workaround können Sie versuchen die Kreuztabelle mittels einer normalen Tabelle zu gestalten/nachzubauen. Hier haben Sie die volle Kontrolle über das Erscheinungsbild und können auch mehrere Gesamtzeilen definieren.

Zu 2.) Sie können hierbei mit einer Datenquelle arbeiten, welche alle benötigten Informationen enthält. Ermöglicht wird dies durch die Option ‘Datenfilter’ in den Eigenschaften der Kreuztabelle. Je nach Auswahl der Benutzer legen Sie n Kreuztabellen mit der gleichen Datenquelle an und ändern lediglich den Datenfilter, sodass die Ausgabe auf den vom Benutzer gewählten Wert eingeschränkt wird.

Zudem besteht die Möglichkeit mittels DOM-API den Bericht komplett per Code aufzubauen, sodass Sie neue Kreuztabellen anhand wechselnder Artikel IDs dynamisch erstellen. Weitere Informationen zur DOM-API erhalten Sie in der List & Label 19 Programmierer-Referenz im Kapitel ‘5.8. Verwendung der DOM-API’, ab Seite 128. Sie finden zudem Praxisbeispiele im Pfad “…\combit\LL19\Programmierbare Beispiele und Deklarationen\Microsoft .NET”.

Zu Ihrem Nachtrag: Eine bereits angemeldete Datenquelle kann während der Laufzeit nicht verändert werden. Sie können jedoch über die Ereignisse der .NET Komponente Einfluss auf die Daten nehmen. Weitere Informationen erhalten Sie ebenfalls in der Programmierer-Referenz im Kapitel ‘2.3.3. Ereignisse’, ab Seite 35.

Mit freundlichen Grüßen

Patrick Preuschoff
Technischer Support
combit GmbH

Hallo Herr Preuschoff,

Vielen Dank für Ihre Antwort, das hat mich schon mal weiter gebracht.

Nun stehe ich vor einem anderen Problem:

Da der Benutzer später Kreutabellen drucken soll ohne jedes Mal den Designer aufzurufen, habe ich eine .lst Datei als Vorlage erstellt, die eine Kreuztabelle enthält. Dann kopiere ich diese über die DOM API für jeden Artikel für den eine Kreuztabelle erstellt werden soll.

            ObjectReportContainer container = (ObjectReportContainer)proj.Objects[0];
            SubItemCrosstab originalCrossTable = (SubItemCrosstab)container.SubItems[0];

            SubItemCrosstab newCrossTable = container.SubItems.AddNewCrosstab();
            newCrossTable.CopyFrom(originalCrossTable);

Nun bekomme ich beim Aufruf von CopyFrom() eine PropertyNotFound_Exception.

Ich habe daraufhin versucht alle Eigenschaften des SubItemCrosstab Objekts einzeln über die CopyFrom() Methoden zu kopieren und herausgefunden das die Eigenschaft “ColumnBreakCondition” in “SubItemCrosstab.Columns” für die Exception verantwortlich ist. Dadurch lassen sich keine Objekte der Klasse “SubItemCrosstab” vollständig über CopyFrom() kopieren.

Hier die gesamte Fehlermeldung:

Die Eigenschaft ist für das gewählte Objekt nicht definiert. Sie können mit Hilfe des DOM-Viewers bestehende Projekte auf verfügbare Objekteigenschaften untersuchen.

StackTrace:
bei combit.ListLabel19.LLException.CheckReturn(Int32 returnValue)
bei combit.ListLabel19.LlCore.LlDomGetProperty(IntPtr domObject, String propertyName)
bei combit.ListLabel19.Dom.DomItem.GetProperty(String propertyName, Boolean throwException)
bei combit.ListLabel19.Dom.DomItem.GetProperty(String propertyName)
bei combit.ListLabel19.Dom.PropertyColumns.get_ColumnBreakCondition()

Hallo Herr Spuhl,

Das von Ihnen beschriebene Verhalten wurde uns bereits gemeldet und für das nächste Service Pack (List & Label 19.004) behoben.

Gerne können Sie in unserem Supportportal unter Support und Schulungen für List & Label – combit einen Support-Case eröffnen, sodass wir Ihnen Testmodule zusenden können, die das Problem beheben sollten. Bitte kopieren Sie die relevanten Informationen aus diesem Thread in die Beschreibung.

Mit freundlichen Grüßen

Patrick Preuschoff
Technischer Support
combit GmbH

Ich habe nun einen Workaround, der zu einer funktionierenden Lösung geführt hat.

Wie oben beschrieben, ist es nicht möglich ein SubItemCrosstab Objekt über die CopyFrom() Methode zu kopieren. Also erstelle ich neue Kreuztabellen Objekte und kopiere jede einzelne Eigenschaft von SubItemCrosstab in diese Objekte (Bis auf SubItemCrosstab.Columns, da diese die oben erwähnte Exception verursacht).

            SubItemCrosstab newItem = container.SubItems.AddNewCrosstab();

            newItem.SourceTablePath = originalSubItem.SourceTablePath;
            newItem.Condition = originalSubItem.Condition;
            newItem.Bookmark.CopyFrom(originalSubItem.Bookmark);
            newItem.IndexBookmark.CopyFrom(originalSubItem.IndexBookmark);
            [b]newItem.Definition.CopyFrom(originalSubItem.Definition);[/b]
            newItem.DistanceTop = originalSubItem.DistanceTop;

Nun konnte ich meine Originaltabelle zwar kopieren, aber die Spaltengruppierungen meiner kopierten Kreuztabellen stimmte nicht. Der Grund dafür ist, dass die Reihenfolge der Spaltengruppierungen beim Kopieren vertauscht wird.

Meine Originaltabelle besitzt 2 Spaltengruppierungen in SubItemCrosstab.Definition.Columns.Groupings: 1. Farbe und 2. Größe.
Wenn man die Definition Eigenschaft einer Kreuztabelle kopiert, werden die Gruppierungen in SubItemCrosstab.Definition.Columns.Groupings in umgedrehter Reihenfolge zu dem Objekt hinzugefügt, in das kopiert werden soll. In meinem Fall dann: 1. Größe und 2. Farbe.
Steht das damit in Zusammenhang, das ich nicht das komplette Objekt kopieren kann, und deshalb evtl. Beziehungen bei Spalten oder Gruppierungen fehlen, oder liegt es an der CopyFrom() Methode?

Ich kopiere nun meine Originaltabelle, kopiere diese Kopie wiederum nochmal und lösche die erste Kopie. Dies hebt das Problem mit den vertauschten Spaltengruppierungen wieder auf, aber ist natürlich nicht sehr schön.

Ich hoffe Sie können mir helfen.

Grüße Flo