[Gelöst] Datensatz mit frühersten Datum finden

23. Oktober 2009 11:37

Hallo Leute

Schreibe gerade ein Report und bin relativ neu in Navision deswegen wird euch die Frage jetzt echt dumm vorkommen aber ich finde nichts im Forum dazu.

Ich soll aus einer Tabelle auf der ich Filter setze den Datensatz mit dem frühersten und spätersten Datum finden. Da das Datum nicht Primärschlüssel ist muss ich das ja anders lösen wie sonst. Da hab ich ja mit SETCurrentkey einfach so umgestellt wie ich es gebraucht habe und dann mit GETFIRST und GETLAST gearbeitet. Aber wie geht das nun?
Zuletzt geändert von Fishburn am 27. Oktober 2009 10:08, insgesamt 1-mal geändert.

Re: Datensatz mit frühersten Datum finden

23. Oktober 2009 11:50

Im Sekundärschlüssel muss das Datum dann aber ganz vorne stehen ( ggf. einen neuen anlegen), da sonst erst nach anderen Feldern sortiert wird die dann höhere Priorität haben. Ob das ein Problem ist, hängt von der Datenstuktur ab.
Dann erst SETCURRENTKEY, dann ggf. SETRANGE auf Ausschlussfelder wenn nicht alle Datensätze benötigt werden, und dann FINDFIRST bzw. FINDLAST.

Re: Datensatz mit frühersten Datum finden

23. Oktober 2009 12:03

Hmm naja es geht um die Tabelle 167 Jobs ... so einfach nen Sekundärschlüssel kann ich da nicht vergeben, oder geht das für meinen Record auch nur temporär?

Re: Datensatz mit frühersten Datum finden

23. Oktober 2009 12:37

Fishburn hat geschrieben:so einfach nen Sekundärschlüssel kann ich da nicht vergeben

Warum nicht, die kosten kein Geld, sondern nur ein bisschen Platz und stören sonst keinen :wink: . Der zusätzliche Platzbedarf ist aber eher bei Postentabellen mit Millionen von Datensätzen ein Thema, sonst nicht. Tabu sind nur Änderungen am Primärschlüssel, weil das Seiteneffekte hat, die sich durch die gesamte Anwendung ziehen.

Re: Datensatz mit frühersten Datum finden

23. Oktober 2009 13:06

Naja mein Chef meinte eben das dies nicht möglich sei weil er irgendwelche Indiexes am SQL-Server durcheinander bringen würde, weil die irgendwie fest vergeben sind und ein paar händisch eingetragen sind.

Keine Ahnung ob das stimmt aber ich hab bei Schlüsseln auch immer nen komisches Gefühl im Magen da was einzutragen. Hab ja keine Ahnung was so ein Sekundärschlüssel macht

Re: Datensatz mit frühersten Datum finden

23. Oktober 2009 13:22

Ja, das sind fiese kleine datenfressende Wesen, diese Sekundärschlüssel. Und hässlich noch dazu! :twisted:

Wenn du partout keinen setzen willst und wirklich nur das kleinste und das größte Datum brauchst, wäre das in einem Durchlauf zu machen. Ganz billig immer das Datum vergleichen und zwischenpeichern.

Re: Datensatz mit frühersten Datum finden

23. Oktober 2009 13:26

Tja leider fehlt mir einfach das Wissen um meinen Chef da zu widersprechen, ich denke auch das ich diesen Durchlauf mache ... danke für den Tip.

Re: Datensatz mit frühersten Datum finden

23. Oktober 2009 13:27

Naja, ein Sekundärschlüssel ist nix anderes als ein weiterer Index auf dem SQL-Server ...

Re: Datensatz mit frühersten Datum finden

23. Oktober 2009 13:35

Hier meine Alternative (Wenn die Key´s "tabu" sind):
(Nicht zwingend performand, sollte aber klappen)

Deklariere zwei Variablen vom Typ Date (z.B. MinDate und MaxDate), dann benötigst du ungefähr folgenden Code:

Code:
// DeineTabelle.SETFILTER(...);    // Sofern nötig
IF DeineTabelle.FINDSET THEN BEGIN
  MinDate := DeineTabelle.PostingDate;
  MaxDate := DeineTabelle.PostingDate;
  REPEAT
    IF DeineTabelle.PostingDate > MaxDate THEN
      MaxDate := DeineTabelle.PostingDate;
    IF DeineTabelle.PostingDate < MinDate THEN
      MinDate := DeineTabelle.PostingDate;
  UNTIL DeineTabelle.NEXT = 0;
END;

MESSAGE('Das kleinste Datum ist %\ das gößte Datum ist %2',MinDate,MaxDate);



**Edit by Mikka**
Ich habs vorhin überlesen, McClane hats ja schon vorgeschlagen :roll:
McClane hat geschrieben:Wenn du partout keinen setzen willst und wirklich nur das kleinste und das größte Datum brauchst, wäre das in einem Durchlauf zu machen. Ganz billig immer das Datum vergleichen und zwischenpeichern.

Re: [Gelöst] Datensatz mit frühersten Datum finden

27. Oktober 2009 10:10

Hallo

Danke die vielmals mikka, super Sache. Das mit den Keys ist scheisse ich weiss aber ich will jetzt da mit dem Chef keine Grundsatzdiskussion lostretten ;)

Hier ist übrigends mein fertiger Code falls es jemanden interessiert.

Code:
Job.RESET;
Job.SETCURRENTKEY(Job.Status,Job."Job No.");
Job.SETRANGE(Job.Status,1);
Job.SETRANGE(Job."Job No.",No);
IF Job.FINDSET THEN BEGIN
  MinDate := Job."Quote Date";
  MaxDate := Job."Quote Date";
  REPEAT
    IF Job."Quote Date" > MaxDate THEN
      MaxDate := Job."Quote Date";
      MaxNo := Job."No.";
    IF Job."Quote Date" < MinDate THEN
      MinDate := Job."Quote Date";
      MaxNo := Job."No.";
  UNTIL Job.NEXT = 0;
END;
IF Job.GET(MinNo) THEN BEGIN
....
END;
IF Job.GET(MaxNo) THEN BEGIN
....
END;

Re: [Gelöst] Datensatz mit frühersten Datum finden

27. Oktober 2009 10:25

So ganz richtig sieht das aber noch nicht aus :wink:

Re: [Gelöst] Datensatz mit frühersten Datum finden

27. Oktober 2009 10:33

Hallo

Aufgrund fehelnder Daten kann ich es leider nicht testen aber sollte doch funktionieren, oder wo siehst du da ein Problem?

Re: [Gelöst] Datensatz mit frühersten Datum finden

27. Oktober 2009 10:37

Fishburn hat geschrieben:aber sollte doch funktionieren, oder wo siehst du da ein Problem?


Naja, durch diesen Filter
Code:
Job.SETRANGE(Job."Job No.",No);

findet NAV sowieso nur ein einziges Projekt ... also wäre der darauf folgende Schleifendurchlauf ohne brauchbares Ergebnis.
Wenn du diese Zeile weglässt, dürfte da Ergebnis dagegen stimmen.

Re: [Gelöst] Datensatz mit frühersten Datum finden

27. Oktober 2009 10:50

- MinNo wird nie gesetzt
- MaxNo wird nach jedem Datensatz gesetzt
- Wenn beides korrigiert ist, aber schon beim ersten Datensatz das kleinste oder größte Datum drin steht, wird dementsprechend MinNo oder MaxNo auch nicht gesetzt

Re: [Gelöst] Datensatz mit frühersten Datum finden

27. Oktober 2009 10:54

Hallo Natalie,

Hmm die "Job No" kann doch mehrmals vorkommen. Wir kommen von der Akquise und zu jeder Akquise kann es mehrere Angebote geben. Zumindersten bei uns ...

Deswegen filtere ich hier auf die Job No mit der Akquiseprojektnr.

Und mit meinen Report soll ich Werte vom ersten (Datumsmässig) und vom letzten Angebot ausgeben.

@:McClane

Code:
Job.RESET;
Job.SETCURRENTKEY(Job.Status,Job."Job No.");
Job.SETRANGE(Job.Status,1);
Job.SETRANGE(Job."Job No.",No);
IF Job.FINDSET THEN BEGIN
  MinDate := Job."Quote Date";
  MaxDate := Job."Quote Date";
  MaxNo := Job."No.";
  MinNo := Job."No.";
  REPEAT
    IF Job."Quote Date" > MaxDate THEN
      MaxDate := Job."Quote Date";

    IF Job."Quote Date" < MinDate THEN
      MinDate := Job."Quote Date";
      MinNo := Job."No.";
  UNTIL Job.NEXT = 0;
END;
IF Job.GET(MinNo) THEN BEGIN
...
END;
IF Job.GET(MaxNo) THEN BEGIN
....
END;


Danke dir vielmals, ohne Testdaten ist programmieren einfach zum ...

Re: [Gelöst] Datensatz mit frühersten Datum finden

27. Oktober 2009 11:06

Besser so: :wink:
Code:
Job.RESET;
Job.SETCURRENTKEY(Job.Status,Job."Job No.");
Job.SETRANGE(Job.Status,1);
Job.SETRANGE(Job."Job No.",No);
IF Job.FINDSET THEN BEGIN
  MinDate := Job."Quote Date";
  MaxDate := Job."Quote Date";
  MaxNo := Job."No.";
  MinNo := Job."No.";
  REPEAT
    IF Job."Quote Date" > MaxDate THEN BEGIN
      MaxDate := Job."Quote Date";
      MaxNo:=Job."No.";
    END;

    IF Job."Quote Date" < MinDate THEN BEGIN
      MinDate := Job."Quote Date";
      MinNo := Job."No.";
    END;
  UNTIL Job.NEXT = 0;
END;
IF Job.GET(MinNo) THEN BEGIN
...
END;
IF Job.GET(MaxNo) THEN BEGIN
....
END;

Re: [Gelöst] Datensatz mit frühersten Datum finden

27. Oktober 2009 11:38

Mensch heute stell ich ich aber echt an, ich muss echt mal weg von diesem losprogrammieren testen korrigieren hin zu drüber nachdenken und gleich richtig machen ... den wenn ich mal was nicht testen kann komm ich gar nicht klar.

Ich vermiss meine vb.net welt ;)