[Gelöst] Sortierung nach Datum

10. August 2011 16:04

In einem Report zeige ich wann das letzte Mal ein Artikel verkauft bzw. gekauft wurde, bei jedem Artikel läuft eine Schleife die das letzte Datum in einem Array speichert Datum[1] ( Einkauf) und Datum[2] (für den Verkauf). am Ende sieht mein Reporrt so aus:

ArtikelNr | Letzter Einkauf | Letzter Verkauf

Ich habe eine Sortierung nach ArtikelNr gemacht, ist einfach wenn das der Key ist.
Das Problem ist : Ich möchte nach dem Letzten Verkaufsdatum sortieren, wie mache ich das :?:
Zuletzt geändert von solionte am 20. Februar 2013 16:21, insgesamt 2-mal geändert.

Re: Sortierung nach Datum

10. August 2011 17:00

Hallo solionte,

ich würde vorschlagen in dem Report eine temporäre Tabelle zu befüllen (z.B. Subtyp Wertposten).

Nicht vergessen die Temporary Property auf "Yes" setzen.

mfg,
winfy

Re: Sortierung nach Datum

11. August 2011 07:50

Guten Morgen,

also mit den Wertposten wird solionte Probleme haben, da es diese Tabelle in den Navision-Versionen 2.x noch nicht gab.
Je nachdem was die Navision-Lizenz erlaubt (z.B. Table Design), sollte ggf. eine neue Tabelle angelegt werden, die den Anforderungen entspricht oder es wird eine der Standardtabellen (z.B. Artikelposten) temporär für den Report verwendet.

Gruß
Jörg

Re: Sortierung nach Datum

11. August 2011 14:08

JRenz hat geschrieben:Guten Morgen,

also mit den Wertposten wird solionte Probleme haben, da es diese Tabelle in den Navision-Versionen 2.x noch nicht gab.


JRenz hat vollkommen Recht, die gab es erst ab NAV 3.xx!
Dann eben beispielsweise die (temporäre) Artikelposten-Tabelle! :wink:

mfg,
winfy

Re: Sortierung nach Datum

11. August 2011 14:40

Hallo
erstmal Danke für die schnellen Antworten.
Ich weiss wie man eine Temp. Tabelle erstellt, aber nicht wie man sie füllt,
die sache mit der Ganzzahl-Tabelle finde ich in keinem Buch :(
es geht um eine Array Variable die in TempArtikelposten nicht existiert .

Re: Sortierung nach Datum

11. August 2011 14:56

solionte hat geschrieben:Hallo
erstmal Danke für die schnellen Antworten.
Ich weiss wie man eine Temp. Tabelle erstellt, aber nicht wie man sie füllt,
die sache mit der Ganzzahl-Tabelle finde ich in keinem Buch :(
es geht um eine Array Variable die in TempArtikelposten nicht existiert .

Hallo solionte,

du verwendet sozusagen die Standardtabelle Artikelposten und deren Felder für deine Zwecke temporär anders. :wink:

Vorgehensweise:
Du erstellst eine Record Variable (tempRec) auf die Tabelle Artikelposten in dem betreffenden Report.
:!: Wichtig: Dann setzt du das Temporary Property für tempRec auf "Yes".

Mit jeden Artikeldurchlauf befüllst du beispielsweise die Tabelle mit:
Code:
LfdNr:= LfdNr+1;
tempRec."Entry No.":=LfdNr;
tempRec.INIT;
tempRec."Item No.":=DeineArtikelnummer;
tempRec."Document Date":=Datum[1];
tempRec."Posting Date":=Datum[2];
tempRec.INSERT;


Dann hast du deine Daten in der temporären Tabelle.
Nun kannst Du mit SETCURRENTKEY einen Sortierschlüssel (Buchungsdatum,...) setzen und nach Datum[2] sortieren.

:!: Trigger sollte man bei temporären Tabellen im übrigen vermeiden. Hier könnte sich sonst noch Code verbergen, der auf die echten Tabellendaten zugreift.

EDIT: hochzählen des Primärschlüssels LfdNr hinzugefügt.

mfg,
winfy
Zuletzt geändert von winfy am 15. August 2011 14:53, insgesamt 4-mal geändert.

Re: Sortierung nach Datum

12. August 2011 14:30

Vielen Dank für die Erklärung,
was meinst du mit
Trigger sollte man bei temporären Tabellen im übrigen vermeiden. Hier könnte sich sonst noch Code verbergen, der auf die echten Tabellendaten zugreift

mfg

Re: Sortierung nach Datum

12. August 2011 14:36

Damit meint er: kein insert(true), delete(true), modify(true) und kein validate eines Feldes.

Re: Sortierung nach Datum

15. August 2011 11:02

Danke,
habe alles soweit eingerichtet, jetzt bekomme ich eine Fehlermeldung mit der ich nicht klar komme :
:!: Artikelposten Lfd. Nr. '0' existiert bereits. :-(

Re: Sortierung nach Datum

15. August 2011 11:15

Hallo,
die lfd.Nr ist der Primärschlüssel. Diesen kannst du mit lfd.nr +=1 füllen.

Gruß

Re: Sortierung nach Datum

15. August 2011 11:15

Das weist darauf hin, dass du deinen temporären Posten eine Nummer zuweisen und diese Nummer hochzählen musst.

Re: Sortierung nach Datum

15. August 2011 12:02

solionte hat geschrieben:Danke,
habe alles soweit eingerichtet, jetzt bekomme ich eine Fehlermeldung mit der ich nicht klar komme :
:!: Artikelposten Lfd. Nr. '0' existiert bereits. :-(


Wie McClane und Petra69 schon sagten muß mit jedem Durchlauf noch der Primärschlüssel erhöht werden.
Also passend zum obigen Beispiel dann immer noch ein:

Code:
tempRec."Entry No.":=tempRec.COUNT;


hinzufügen.
Das ist dann automatisch die Anzahl der Datensätze in der temporären Tabelle. Sofen du da keine Datensätze löscht geht das ganz gut.
Alternativ könntest du dir auch den Primärschlüssel vom letzten Datensatz erhöhen oder eine Variable mitzählen lassen.

mfg
winfy

Re: Sortierung nach Datum

15. August 2011 12:57

winfy hat geschrieben:Wie McClane und Petra69 schon sagten muß mit jedem Durchlauf noch der Primärschlüssel erhöht werden.
Also passend zum obigen Beispiel dann immer noch ein:

Code:
tempRec."Entry No.":=tempRec.COUNT;


hinzufügen.
Das ist dann automatisch die Anzahl der Datensätze in der temporären Tabelle. Sofen du da keine Datensätze löscht geht das ganz gut.
Alternativ könntest du dir auch den Primärschlüssel vom letzten Datensatz erhöhen oder eine Variable mitzählen lassen.

mfg
winfy


Am besten eine Integer-Variable nehmen und hochzählen, wie oben von Petra69 bereits beschrieben.
Ein Count bei jedem neuen Datensatz führt zu unnötig hohen Zugriffen auf deine temporäre Tabelle.

Re: Sortierung nach Datum

15. August 2011 14:30

Ja, die Performance sollte auch nicht leiden.
Ich habe es daher das obige Beispiel abgeändert. :wink:

mfg,
winfy

Re: Sortierung nach Datum

15. August 2011 16:27

Der Fehler ist beseitigt :) es sieht so aus :
Daten werden in der Temp. Tabelle eingefügt und wiedergegeben
aber nicht sortiert, was mache ich falsch ?!!
Code:

tempRec."Lfd. Nr.":=tempRec.COUNT;
tempRec.INIT;
tempRec.Buchungsdatum := Datum[2];
tempRec.INSERT;
tempRec.SETCURRENTKEY(Buchungsdatum);
tempRec.ASCENDING(TRUE);

Re: Sortierung nach Datum

16. August 2011 14:22

solionte hat geschrieben:Der Fehler ist beseitigt :) es sieht so aus :
Daten werden in der Temp. Tabelle eingefügt und wiedergegeben
aber nicht sortiert, was mache ich falsch ?!!
Code:

tempRec."Lfd. Nr.":=tempRec.COUNT;
tempRec.INIT;
tempRec.Buchungsdatum := Datum[2];
tempRec.INSERT;
tempRec.SETCURRENTKEY(Buchungsdatum);
tempRec.ASCENDING(TRUE);



Hallo solionte,

wann gibst du die Tabellenwerte wieder?
Du musst natürlich erst die temporäre Tabelle vollständig füllen und erst danach kannst du das größte oder niedrigste Datum sortiert anzeigen.
Du kannst ja nur soviele Tabellendaten sortieren wie zu diesem Zeitpunkt Datensätze in der temporären Tabelle sind.

Du hast in deinem Code außerdem noch die Artikelnummer vergessen.

Gibt es bei euch auch wirklich den Schlüssel "Buchungsdatum" in den Artikelposten?
Standard ist eher tempRec.SETCURRENTKEY(Buchungsdatum,Postenart,Artikelnr.) bzw.:
Code:
tempRec.SETCURRENTKEY("Posting Date", "Entry Type" ,"Item No.");


mfg,
winfy

Re: Sortierung nach Datum

16. August 2011 15:42

winfy hat geschrieben:Gibt es bei euch auch wirklich den Schlüssel "Buchungsdatum" in den Artikelposten?
Standard ist eher tempRec.SETCURRENTKEY(Buchungsdatum,Postenart,Artikelnr.)

Das war schon ok so; es genügt, das erste Feld des Schlüssels anzugeben.

Re: Sortierung nach Datum

16. August 2011 16:02

McClane hat geschrieben:
winfy hat geschrieben:Gibt es bei euch auch wirklich den Schlüssel "Buchungsdatum" in den Artikelposten?
Standard ist eher tempRec.SETCURRENTKEY(Buchungsdatum,Postenart,Artikelnr.)

Das war schon ok so; es genügt, das erste Feld des Schlüssels anzugeben.


Du hast Recht, das wußte ich noch nicht. :-D
Wieder was gelernt.

Und wenn man mehr Schlüssel mit diesem Feld am Anfang hat nimmt er den ersten Sortierschlüssel?

mfg,
winfy

Re: Sortierung nach Datum

16. August 2011 16:08

Native vermutlich den erstbesten, ja. Auf einem SQL-Server dürfte das durchaus anders aussehen. Da müssten wir Stryk fragen.

Re: Sortierung nach Datum

17. August 2011 09:40

wann gibst du die Tabellenwerte wieder?

Die Ausgabe erfolgt mit einem Report, ich denke die Werte werden ausgegeben während dem Einfüllen.
Du musst natürlich erst die temporäre Tabelle vollständig füllen und erst danach kannst du das größte oder niedrigste Datum sortiert anzeigen.

muss ich die Tabelle Ganzzahl benutzen?

Der Schlüssel "Buchungsdatum" habe ich in der Tabelle eingesetzt.

Re: Sortierung nach Datum

18. August 2011 10:00

solionte hat geschrieben:Die Ausgabe erfolgt mit einem Report, ich denke die Werte werden ausgegeben während dem Einfüllen.

Daher sind sie auch nicht richtig (vollständig) sortiert.

solionte hat geschrieben:muss ich die Tabelle Ganzzahl benutzen?


Ja könntest du nehmen, musst du aber nicht.

Beispiel mit Ganzzahl (Integer) DataItem:
Zuerst die temporäre Tabelle im OnPreDataitem des Ganzzahl DataItems befüllen.
Beispielsweise:
Code:
IF Artikel('-') THEN
REPEAT
BEGIN
  //temporäre Tabelle befüllen
END;
UNTIL Artikel.NEXT=0; // nächster Artikel


Schlüssel und Filter setzen:
Code:
tempRec.SETCURRENTKEY("Posting Date", "Entry Type" ,"Item No.");
SETRANGE(Number,1,tempRec.COUNT);


Dann im OnAfterGetRecord:
Code:
IF Number = 1 THEN
  tempRec.FIND('-')
ELSE
  tempRec.NEXT;


Damit durchläufst du die Datum-sortierte temporäre Tabelle im Ganzzahl Dataitem und kannst dann dafür deine Sections ausprogrammieren.

mfg,
winfy