[Gelöst] Datenverlust im DataSet (RDLC-Reports)

30. April 2013 09:33

Schönen guten Morgen,

ich muss aktuell für einen Kunden eine Migration von einer 5.00 auf einer NAV 2013 Version durchführen und habe dementsprechend viele Reports im RDLC-Layout umzusetzen.
Bei meinem aktuellen Fall habe ich aber ein massives Problem mit dem DataSet, dass mir in keiner Form logisch erscheint:

Der Report besteht aus 2 Dataitems, "Item Category" auf erster Ebene und darunter eingerückt "Item Ledger Entry".
Hierbei soll der Report diverse Werte summieren - was eigentlich kein großer Akt ist - und dazu auch prozentuale Werte bilden, wobei aber die Probleme auftreten.
Gruppiert wird nach "Item Category Code" und pro Kategorie eine Summe gebildet. Jede Detailzeile bekommt ebenfalls einen Prozent-Wert errechnet, welche im OnAfterGetRecord-Trigger der Item Ledger Entries berechnet werden.
Die Prozentsumme wird im OnPostDataItem gebildet und laut Debugger und Message-Ausgaben korrekt gebildet - im DataSet sind meine dafür eingefügten Columns aber '0' und werden mir auch als '0' ausgegeben.
Die anderen Summenfelder lassen sich auch nur per '+=' im OnAfterGetRecord berechnen, aber nicht im OnPostDataItem.
Die Prozentwerte kann ich leider ja auch erst bilden, wenn ich die anderen Summenfelder fertig berechnet habe.

Ich bin etwas planlos wie ich meine Werte nun korrekt in mein DataSet übergeben bekomme und hoffe hier kann mir jemand helfen.
Das DataSet habe ich auch über "Info zu diesem Bericht" kontrolliert - die Felder sind leer.

//EDIT: Ach und die Variablen habe ich schon unter beiden DataItems versucht als Columns zu übergeben - vergeblich.

Hier der Code aus "Item Ledger Entry".

MfG Sipa aka Paul
Code:
>>>>Item Ledger Entry - OnAfterGetRecord()<<<<
IF grecCustomer.GET("Source No.") THEN
  gtxtCustomerName := grecCustomer.Name
ELSE
  gtxtCustomerName := '';

gdecDeckungsbetrag := "Sales Amount (Actual)" + "Cost Amount (Actual)";
gdecDeckungsbetragKat += "Sales Amount (Actual)" + "Cost Amount (Actual)";
gdecDeckungsbetragGes += "Sales Amount (Actual)" + "Cost Amount (Actual)";

gdecSalesAmountKat += "Sales Amount (Actual)";
gdecSalesAmountGes += "Sales Amount (Actual)";

gdecCostAmountKat += "Cost Amount (Actual)";
gdecCostAmountGes += "Cost Amount (Actual)";

IF "Sales Amount (Actual)" <> 0 THEN
  gdecProzent := ROUND((("Sales Amount (Actual)" + "Cost Amount (Actual)") / ABS("Sales Amount (Actual)") * 100),0.01)
ELSE
  gdecProzent := 0;

>>>>Item Ledger Entry - OnPostDataItem()<<<<
IF gdecSalesAmountKat <> 0 THEN
  gdecProzentKat := ROUND(((gdecSalesAmountKat + gdecCostAmountKat) / ABS(gdecSalesAmountKat) * 100),0.01)
ELSE
  gdecProzentKat := 0;
Zuletzt geändert von Sipa am 30. April 2013 10:51, insgesamt 1-mal geändert.

Re: Datenverlust im DataSet (RDLC-Reports)

30. April 2013 09:46

Ohne mir jetzt den Quelltext im Detail angesehen zu haben:
Sämtliche Aufsummierungen und Bestimmung von Prozentwerten sollten im RDLC erfolgen, nicht in C/AL mit Übergabe an das Dataset. Dies ist (nach der Umgewöhnung) nicht nur einfacher für dich, sondern bei der Ausführung des Reports auch performanter, weil das an das RDLC übergebene DataSet kleiner ist.

Schau dir bitte mal das Beispiel hier an: https://www.youtube.com/watch?v=h0Wg18Nk1c0

Re: Datenverlust im DataSet (RDLC-Reports)

30. April 2013 09:58

Hallo Natalie,

dessen bin ich mir bewusst und versuche aktuell auch so viel wie möglich z.B. mit SUM(..) zu arbeiten, jedoch ist mir dies im Falle der Prozentwerte ein Dorn im Auge, da ich so keine Null-Division abfangen kann ohne aufwändigen Code in Visual-Studio zu bauen. Und davon wurde mir von Schulungsleitern, Chefs und Kollegen stets nur abgeraten :wink:

Re: Datenverlust im DataSet (RDLC-Reports)

30. April 2013 10:01

Sipa hat geschrieben:da ich so keine Null-Division abfangen kann ohne aufwändigen Code in Visual-Studio zu bauen.

Das stimmt so nicht ;-)
Du musst nur eine ganz kleine neue Funktion im RDLC schreiben (wenn Inputwert = 0, Ausgabe 0, sonst Ausgabe ...) und diese mittels Code.DeinFunktionsname aufrufen.

Re: Datenverlust im DataSet (RDLC-Reports)

30. April 2013 10:08

Da muss ich mich leider dumm stellen, da ich bisher ausschließlich Programmiererfahrung in NAV und C++ besitze, aber mit Visual-Studio-Code grade so weit bin froh zu sein die syntax von iif zu kapieren.^^"
Sprich: Wie sähe die Funktion aus bzw. wie steuer ich die in der Berechnen meines Feldes an?

Re: Datenverlust im DataSet (RDLC-Reports)

30. April 2013 10:15

..grade so weit bin froh zu sein die syntax von iif zu kapieren


Das sollte für die Lösung deines Problems eigentlich ausreichen :mrgreen:

Code:
=IIF(VAR=0,0,VAR2/VAR)


Gruß, Fiddi

Re: Datenverlust im DataSet (RDLC-Reports)

30. April 2013 10:18

Nur für's Verständnis:
=IIF(VAR=0,0,VAR2/VAR)

Wenn VAR = 0 dann wird der Output des Feldes 0 und anderweitig wird die Berechnung VAR2/VAR durchgeführt.
Korrekt?

//EDIT:
Danke vielmals für die Infos, die iif-Methode funktioniert hier einwandfrei.
Hätte nicht gedacht, dass das doch so "simpel" in Visual Studio funktioniert.

Code:
=iif(SUM(Fields!Sales_Amount_Actual.Value) = 0, 0, (SUM(Fields!Sales_Amount_Actual.Value) + SUM(Fields!Cost_Amount_Actual.Value)) / ABS(SUM(Fields!Sales_Amount_Actual.Value)) * 100)


MfG Sipa aka Paul