[gelöst] Doppelte Werte in COUNT Funktion

16. April 2013 12:16

Hallo zusammen!
Ich befasse mich seit kurzem mit MSDynamics NAV und bin aktuell hauptsächlich mit Reports beschäftigt.
Ich konnte schon viel nützliches aus diesem Forum ziehen, hänge derzeit aber an einem kleinen Problem mit der COUNT Funktion.
Nachdem ich durch die Suchfunktion und googeln nicht weitergekommen bin, wollte ich meinen ersten Beitrag erstellen ;-)

Und zwar möchte ich in dem vom Datumsfilter angegebenem Zeitraum, sämtliche Einträge zählen.
Allerdings kann es vorkommen, dass ein Datum (also ein Tag) mehrfach erscheint. Die Duplikate möchte ich jetzt nicht mitzählen lassen.
Derzeit sieht mein code wie folgt aus:

Code:
IF FORMAT(GETFILTER("Date Filter")) <> '' THEN
  Tabelle.SETFILTER("Datum", GETFILTER("Date Filter"));
Tabelle.SETRANGE("Nr.", Tabelle2."Nr.");
NoOfDays := Tabelle.COUNT;


Jetzt werden doppelte Zeilen natürlich mitgezählt.
Gibt es eine performante Funktion die ich einbinden kann oder muss ich eine IF-Anfrage dazwischen basteln
(IF Tabelle.NEXT.Datum <> Tabelle.Datum THEN Tabelle.COUNT)
Oder wäre es besser (möglich?) das ebenfalls als SETFILTER davor zu selektieren?
(Tabelle.SETRANGE("Datum", Tabelle.Datum <> Tabelle.NEXT.Datum)

Performance wäre hier schön, da die gezählten Tage Basis für weitere Berechnungen des Reports sind und die Geschwindigkeit schon jetzt nicht so toll ist...
Wäre für Tipps und Hilfen sehr dankbar.

Gruß - Stefan
Zuletzt geändert von DynamicStefan am 23. April 2013 13:29, insgesamt 1-mal geändert.

Re: Doppelte Werte in COUNT Funktion

16. April 2013 12:30

Willkommen bei uns!

Kleiner Tipp, auf die allererste Zeile
Code:
IF FORMAT(GETFILTER("Date Filter")) <> '' THEN
kannst du verzichten, denn:
Code:
Tabelle.SETFILTER("Datum", GETFILTER("Date Filter"));

Wenn GETFILTER("Date Filter") keinen Filter zurück liefert, dann bleibt Tabelle.SETFILTER(Datum,...)) wirkungslos. Dies ist aber eine Besonderheit des SETFILTER. Würdest du SETRANGE benutzen, würde tatsächlich ein Filter auf Wert leer gesetzt werden.

Nun aber zur eigentlichen Frage:
Leider bietet NAV von Hause aus kein SELECT DISTINCT, wie du es vielleicht aus SQL kennst.
In NAV hilft da leider nur der Umweg über temporäre Tabellen:
Fülle alle gefundenen Datensätze in eine temp. Tabelle um - aber nur fast alle: für jeden DS prüfst du, ob es zu Datum X nicht schon einen gibt. Wenn ja, nicht einfügen.
Am Ende brauchst du nur noch ein COUNT auf die temp. Tabelle abzusetzen.

Re: Doppelte Werte in COUNT Funktion

16. April 2013 13:03

Hallo Natalie,

Genau auf so eine Art SQL-Distinct-Funktion hätte ich gehofft :-)

Vielen Dank für die Erklärung und die Tipps.
Werde das Problem gleich mit den temporären Tabellen angehen

Viele Grüße

Stefan

Re: Doppelte Werte in COUNT Funktion

16. April 2013 13:31

Geht es im die Count-Funktion oder um das Zählen an sich?

Wenn ich sowieso jeden Datensatz anfasse, um zu prüfen, ob das Datum schon vorhanden ist, könnte ich doch auch gleich einen Zähler mitlaufen lassen. Keine Ahnung, ob sich das auf die Performance auswirkt.


Cheers
André

Re: Doppelte Werte in COUNT Funktion

16. April 2013 13:34

apab hat geschrieben:Wenn ich sowieso jeden Datensatz anfasse, um zu prüfen, ob das Datum schon vorhanden ist, könnte ich doch auch gleich einen Zähler mitlaufen lassen. Keine Ahnung, ob sich das auf die Performance auswirkt.

Wir müssen dennoch ein TempRec.INSERT (pro neuem Datum) ausführen, um später festzustellen, dass wir das darin enthaltene Datum schon hatten.
Das finale TempRec.COUNT ist zwar durch Mitzählen "ersetzfähig", aber daduch wirst du keinen messbaren Performancevorteil haben.
Wetten nehme ich aber nicht an :lol:

Re: Doppelte Werte in COUNT Funktion

16. April 2013 14:29

Falls du allerdings die Anzahl Tage zwischen zwei Datumswerten haben möchtest, dann versuch doch mal folgendes:


Code:
Var
    DateDiff:Duration
    DateTime1:DateTime
    DateTime2:DateTime

BEGIN
    DateTime1 := CREATEDATETIME(010109D, 000000T); // 1. Januar 2009 um 00:00:00
    DateTime2 := CREATEDATETIME(050509D, 000000T); // 5. May  2009  um 00:00:00

    DateDiff := DateTime2 -DateTime1;
    Message('%1',DateDiff);
 
END



Gruß, Fiddi