RDL - Report: Counter nur unter Bedingung hochzählen

15. Mai 2018 16:00

Hallo zusammen,

ich habe in einem Report eine Tabelle, in der Artikel aufgeführt werden. Ich möchte jetzt in der Fußzeile der Tabelle die Gesamtzahl der Artikel aufführen, die keinen Haken bei Gesperrt haben.

Ich habe eine Integer-Variable angelegt "CountNonBlockedItems" im Report. Diese zähle ich im OnAfterGetRecord meines Dataitems hoch, wenn Blocked = FALSE ist. Innerhalb meines "Item"-Dataitems habe ich "CountNonBlockedItems" als Column hinzugefügt und ihr als Namen auch CountNonBlockedItems verpasst. Wenn ich den Wert (egal per SUM(Fields!CountNonBlockedItems ) oder per Fields!CountNonBlockedItems .Value) einbaue, wird mir immer eine 1 angezeigt.

Weiß hier evtl. jemand Rat? Vielen Dank im Voraus!

Wahrscheinlich ist das Hochzählen im OnAfterGetRecord auch der falsche Ansatz; bei RDL-Reports muss man sich ja immer wer weiß wie verbiegen, ich hasse die Dinger.
Zuletzt geändert von InfoWissler am 15. Mai 2018 16:14, insgesamt 1-mal geändert.

Re: RDL - Report: Counter nur unter Bedingung hochzählen

15. Mai 2018 16:12

Wie sieht denn dein DataSet dazu aus?

Auf anhieb fallen mir 2 Möglichkeiten ein dies zu lösen:
Code:
* Integer
  - feld1
  * Item
    - No.
    - if blocked then 0 else 1

Bei der Lösung kannst du auf das If feld nen SUM machen.

Code:
* Integer
  - feld1
  * Item
    - No.
  * Integer
    - CounterVar


Hier kannst du im Report dann LAST(CounterVar) machen.
Hoffe ist verständlich.

Re: RDL - Report: Counter nur unter Bedingung hochzählen

15. Mai 2018 16:35

Hi,

vielen Dank für die schnelle Hilfe :)

Bei Lösung 1 bekomme ich folgenden Fehler:

Es wurde ein Wert oder ein Ausdruck erwartet. Zum Beispiel:
100
MeineVariable
MeineVariable + 100
MeineVariable = 100

(Ich versuche, statt auf Blocked einen String mit einem anderen String abzugleichen; mein richtiges Beispiel ist da etwas komplexer, aber ich hatte gehofft, von einem einfachen Beispiel zu meinem konkreten schließen zu können). In Wirklichkeit möchte ich meine Countervariable nur hochzählen, wenn das Feld "Tariff No." einen anderen Wert enthält als der Artikel davor; sorry, hätte ich direkt so fragen sollen. Ich habe es jetzt mit <IF (LastTariffNo = "Tariff No.") THEN 0 else 1> versucht Das zusätzliche Problem dabei ist auch noch wahrscheinlich, dass im RDL-Report nach Tariff No. sortiert ist, aber das Dataitem Item nicht. Die "LastTariffNo" - Variable fülle ich im OnAfterGetRecord und die ich wollte ich dann vorab (aber auch noch im OnAfterGetRecord) zum Abgleich nehmen.

Wie müsste ich bei Lösung 2 das Integer-Dataitem filtern? Kann ich da im OnAfterGetRecord meine Abfrage machen?

Re: RDL - Report: Counter nur unter Bedingung hochzählen

15. Mai 2018 17:02

Hallo,

in einem RDLC- Bericht in der Fußzeile sieht das so aus:
Code:
=Count(IIF(cBool(ReportItems!Blocked_Item.Value),1,Nothing))


Wobei "Blocked_Item" hier sowohl der Name des übergebenen Feldes als auch der Name der zu zählenden Textbox ist.
Der Name der Textbox muss hier zum Zählen benutzt werden.

Wenn du eine Gesamtanzahl haben willst, dann musst du allerdings noch ein wenig bei den bei den Übertragsfunktionen Anschauungsunterricht nehmen.

Gruß Fiddi

Re: RDL - Report: Counter nur unter Bedingung hochzählen

15. Mai 2018 17:08

Oh ok dann vielleicht doch verwirrend

Beim ersten:
Mach dir ne Globale Variable "ItemCounts"
OnAfterGetRecord vom Item machst du dann
Code:
ItemCounts := 1;
if LastTariffNo <> "Tariff No." then
  ItemCounts := 0;
LastTariffNo := "Tariff No.";

Im DataSet hängst du ItemCounts nun mit in deinem Item ein.

Variante2:
im OnAfterGetRecord vom Item machst du
Code:
if LastTariffNo <> "Tariff No." then
  CounterVar += 1;

Den Integer Record musst du einfach nur auf MaxIterations = 1 setzen.
Das Ganze funktioniert jeweils aber nur wenn dein DataItem nach TariffNo Sortiert ist.

Besser wäre wenn du dir eine Temporären Record anlegst wo du die Nummern rein schreibst die du schon hattest. wieder im OnAfterGetRecord:
Code:
ItemTMP.SetRange("Tariff No.", Item."Tariff No.");
If ItemTMP.IsEmpty() then begin
  CountVar += 1
else begin
  ItemTMP.COPY(Item);
  ItemTMP.INSERT(FALSE);
end;

Re: RDL - Report: Counter nur unter Bedingung hochzählen

15. Mai 2018 17:17

Hallo,

das muss man im RDLC lösen, du weißt doch gar nicht wieviel Artikel auf der jeweiligen Seite gesperrt sind.

Wenn du das ganze in der Summenzeile eines RDLC- Tablixes haben möchtest.
sieht der Code so aus:
Code:
=Count(IIF(cBool(Fields!Blocked_Item.Value),1,Nothing))


Gruß Fiddi

Re: RDL - Report: Counter nur unter Bedingung hochzählen

15. Mai 2018 17:21

Aber er Schreibt doch das er das in der Fusszeile der Tabelle ausgeben möchte, ich lese nichts von pro Seite.
Wenn das pro Seite ausgegeben werden soll, hast du natürlich recht.

Re: RDL - Report: Counter nur unter Bedingung hochzählen

16. Mai 2018 09:42

Ted hat geschrieben:Beim ersten:
Mach dir ne Globale Variable "ItemCounts"
OnAfterGetRecord vom Item machst du dann
Code:
ItemCounts := 1;
if LastTariffNo = "Tariff No." then
  ItemCounts := 0;
LastTariffNo := "Tariff No.";

Im DataSet hängst du ItemCounts nun mit in deinem Item ein.


Mit einer kleinen Abwandlung (= statt <> - im Zitat schon geändert) hats funktioniert, vielen vielen Dank! :)