[GELÖST] Archiv. Verk.zeilen: die letzte Versionsnr. filtern

6. Mai 2015 13:06

Hallo liebe Community,

ich bin dabei einen Dataport (Export) zu erstellen. Ziel hier ist es u.a. das "gewünschte Lieferdatum" in der Ausgabedatei anzuzeigen. Für den "normalen" Verkaufsauftrag ist es kein Problem. Aber: dasselbe gilt auch für die "Archivierten Verkaufsaufträge". Hier muss ich aber immer das Lieferdatum der letzten Version nehmen. Also: die Version mit der höchsten Versionnr.

Was ich mir überlegt habe:

Code:
SalesLine.RESET;
SalesLineArchive.RESET;
SalesLine.SETRANGE("Document Type", SalesLine."Document Type"::Order);
SalesLine.SETRANGE(Type, Type);
SalesLine.SETRANGE("No.", "No.");

IF SalesLine.FINDSET THEN BEGIN
  ReqDeliveryDate := SalesLine."Requested Delivery Date";

END ELSE BEGIN
  SalesLineArchive.SETRANGE("Document Type", SalesLineArchive."Document Type"::Order);
  SalesLineArchive.SETRANGE(Type, Type);
  SalesLineArchive.SETRANGE("No.", "No.");
  SalesLineArchive.SETRANGE(SalesLineArchive."Version No.");
  IF SalesLineArchive.FINDLAST THEN BEGIN
    ReqDeliveryDate := SalesLineArchive."Requested Delivery Date";

  END;
END;


Durch den FINDLAST müsste ich doch auf dem richtigen Dampfer sein, oder?
Oder kann mir bitte jemand Ratschläge geben?

Viele Grüße,
Tim
Zuletzt geändert von Boyrinho am 18. Mai 2015 09:25, insgesamt 1-mal geändert.

Re: Archiv. Verkaufszeilen: auf die letzte Versionsnr. filte

6. Mai 2015 13:50

Boyrinho hat geschrieben:...Durch den FINDLAST müsste ich doch auf dem richtigen Dampfer sein, oder?
Oder kann mir bitte jemand Ratschläge geben?

...

Ja, aber nur wenn die Sortierung passt.

Re: Archiv. Verkaufszeilen: auf die letzte Versionsnr. filte

7. Mai 2015 22:26

Hallo Michael,

vielen Dank für Deine Antwort.
Entschuldige bitte, aber was genau meinst Du hier mit "Sortierung"?
Wie müsste denn sonst mein Code"alternativ" aussehen?

Gruß,
Tim

Re: Archiv. Verkaufszeilen: auf die letzte Versionsnr. filte

8. Mai 2015 10:06

Die Tabelle der "Archivierten Verkaufsaufträge" hat ja eine Sortierung. Meistens ist nach der Auftragsnummer sortiert. Es gibt aber auch Tabellen, wie z.B. "Item Ledger Entry", die standardmäßig nach "lfd.nr." sortiert sind. Und das FINDLAST gibt immer den letzten Datensatz der Sortierung entsprechend aus.

Findlast auf diese Liste

    AUF001
    AUF003
    AUF002
ergibt ein anderes Ergebnis als bei dieser Liste

    AUF001
    AUF002
    AUF003

Re: Archiv. Verkaufszeilen: auf die letzte Versionsnr. filte

11. Mai 2015 07:49

Hallo Tim,

der Primary Key der Tabelle "Sales Line Archive" (Table 5108) setzt sich so zusammen:
Document Type,Document No.,Doc. No. Occurrence,Version No.,Line No.

D.h. innerhalb der Belegart und der Belegnummer kommt als nächstes Sortierkriterium das Feld "Doc. No. Occurence" (Belegnr.-Häufigkeit).

Wenn ich deinen Programmcode ansehe, frage ich mich, mit welcher Tabelle/Datensatz diese Filterung auf die Tabelle "SalesLineArchive" ausgeführt wird:
Code:
...
  SalesLineArchive.SETRANGE("Document Type", SalesLineArchive."Document Type"::Order);
  SalesLineArchive.SETRANGE(Type, Type);
  SalesLineArchive.SETRANGE("No.", "No.");
  SalesLineArchive.SETRANGE(SalesLineArchive."Version No.");
  IF SalesLineArchive.FINDLAST THEN BEGIN
    ReqDeliveryDate := SalesLineArchive."Requested Delivery Date";
...


Dabei meine ich speziell die beiden Zeilen mit SETRANGE(Type, Type) und SETRANGE("No.","No.").
Das Gleiche gilt im Übrigen auch für die Filterung der Tabelle "SalesLine".

Re: Archiv. Verkaufszeilen: auf die letzte Versionsnr. filte

11. Mai 2015 09:08

Hallo Jörg,

vielen Dank für Deine Anmerkungen! Es ist so:

hier geht es um einen bereits bestehenden Dataport den es zu erweitern gilt. Dieser Dataport hat als DataItem Sales Invoice Line.
Das Codefragment, welches ich hier gepostet habe, war auch schon bereits vorhanden; soll heißen: ein Vorgänger hat damit bereits angefangen gehabt.
Ich habe einfach nur die mit Werten erwartenden Felder eingefügt (ReqDeliveryDate) und einen SETRANGE auf die Versionsnummer gesetzt.
Deine Fragen leuchten mir natürlich jetzt auch ein: kann es sein, dass die Filterung mit SETRANGE(Type, Type) und SETRANGE("No.","No.") mit der Tabelle "Sales Invoice Line" durchgeführt wird? Daran habe ich gar nicht gedacht. Aber ich hatte mir eine Testdataport eingerichtet, auch mit Sales Invoice Line als Dataitem und das Codefragment in den OnBeforeExortRecord-Trigger abgelegt. Und es schien zu laufen.

Also müsste dann auch eine SETRANGE auf die Beleg-Häufigkeitsnr. erfolgen? Aber auf der Sales Invoice Line oder Sales Line gibt es keine Beleg-Häufigkeitsnr., so dass mir nur SETRANGE("Doc. No. Occurence"); einfällt.

..?!?

Freue mich über eine Antwort.

Viele Grüße,
Tim

Re: Archiv. Verkaufszeilen: auf die letzte Versionsnr. filte

11. Mai 2015 09:46

Hallo Tim,

wenn die Filterung im "OnBeforeExport"-Trigger der Tabelle "Sales Invoice Line" erfolgt, dann wird die Filterung mit den Tabellenfeldern der Tabelle "Sales Invoice Line" - was m.M. passen würde.

Die letzte Belegnr.-Häufigkeit (Doc. No. Occurence) könntest du aus der Tabelle "Sales Header Archive" ermitteln.
wie das geht, siehst du z.B. in der Codeunit 5063 "ArchiveManagement" in der Funktion "GetNextOccurrenceNo" (Dort wird die nächste Nummer für die Belegnr.-Häufigkeit ermittelt).

Re: Archiv. Verkaufszeilen: auf die letzte Versionsnr. filte

11. Mai 2015 17:20

Hallo Jörg,

ich musste leider feststellen, dass anscheinend mein Code so wie ich ihn hier abgebildet habe, nicht ausreicht.

Bezüglich der Codeunit 5063 und der Funktion GetNextOccuranceNo: kannst Du mir auch da ein konkretes Beispiel nennen, also z.B. wo/woher diese Funktion (auch sonst) aufgerufen wird? Ich habe gerne auch immer ein Beispiel... so zum warm werden... :wink:

Ich finde es nämlich umständlich, eine "ganze" Funktion einer Codeunit zu nutzen anstatt einfach einen SETRANGE zu nutzen.

Gruß,
Tim

Re: Archiv. Verkaufszeilen: auf die letzte Versionsnr. filte

12. Mai 2015 07:27

Hallo Tim,

erst auf den zweiten Blick auf deinen Programmcode ist mir aufgefallen, dass du sowohl bei der Record-Variablen "SalesLine", als auch bei der Record-Variablen "SalesLineArchive" einen entscheidenden Filter vergessen hast.
Du hast bei beiden Record-Variablen keinen Filter auf die Belegnummer gesetzt.

Wenn dein Dataport die Tabelle 113 "Sales Invoice Line" verarbeitet, sollte die ursprüngliche Auftragsnummer dort im Feld 5005396 "Order No." stehen, d.h. dein Programmcode sollte zumindest mal so aussehen:

Code:
SalesLine.RESET;
SalesLineArchive.RESET;
SalesLine.SETRANGE("Document Type", SalesLine."Document Type"::Order);
// >>> neu
SalesLine.setrange("Document No.","Order No.");
// <<< neu
SalesLine.SETRANGE(Type, Type);
SalesLine.SETRANGE("No.", "No.");

IF SalesLine.FINDSET THEN BEGIN
  ReqDeliveryDate := SalesLine."Requested Delivery Date";

END ELSE BEGIN
  SalesLineArchive.SETRANGE("Document Type", SalesLineArchive."Document Type"::Order);
// >>> neu
  SalesLineArchive.SETRANGE("Document No.","Order No.");
// <<< neu
  SalesLineArchive.SETRANGE(Type, Type);
  SalesLineArchive.SETRANGE("No.", "No.");
  SalesLineArchive.SETRANGE(SalesLineArchive."Version No.");
  IF SalesLineArchive.FINDLAST THEN BEGIN
    ReqDeliveryDate := SalesLineArchive."Requested Delivery Date";

  END;
END;

Re: Archiv. Verkaufszeilen: auf die letzte Versionsnr. filte

12. Mai 2015 08:36

Hallo Jörg,

vielen Dank für Deine Antwort! « Das weiß ich sehr zu schätzen!!

Bezüglich der fehlenden Belegnr.: ja das ist mir gestern im Zuge der Programmierung auch aufgefallen und habe es reingebracht, aber dennoch ohne Erfolg. :-(

Mein derzeitiger Stand sieht momentan so aus:

Code:
SalesLine.RESET;
SalesLineArchive.RESET;
SalesLine.SETRANGE("Document Type", SalesLine."Document Type"::Order);
SalesLine.SETRANGE("Document No.",SalesInvoiceLine."Order No.");
SalesLine.SETRANGE("Line No.", SalesInvoiceLine."Order Line No.");
SalesLine.SETRANGE(Type, Type);
SalesLine.SETRANGE("No.", "No.");

IF SalesLine.FINDSET THEN BEGIN
  ReqDeliveryDate := SalesLine."Requested Delivery Date";

END ELSE BEGIN
  SalesLineArchive.SETRANGE("Document Type", SalesLineArchive."Document Type"::Order); 
  SalesLineArchive.SETRANGE("Document No.",SalesInvoiceLine."Order No.");
  SalesLineArchive.SETRANGE("Line No.", SalesInvoiceLine."Order Line No.");
  SalesLineArchive.SETRANGE(Type, Type);
  SalesLineArchive.SETRANGE("No.", "No.");
  SalesLineArchive.SETRANGE(SalesLineArchive."Version No.");
    IF SalesLineArchive.FINDLAST THEN BEGIN
    ReqDeliveryDate := SalesLineArchive."Requested Delivery Date";
    END;
  END;


Ehrlich gesagt, verzweifle ich! So wie der Code hier verfasst ist, findet er (obwohl vorhanden) keinen Datensatz, also kein "gewünschtes Lieferdatum". Außerdem ein seltsames Merkmal: wenn ich in beiden Blöcken jeweils die Filterungen auf "Order No." und "Order Line No." auskommentiere, so dass steht:
Code:
SalesLine.SETRANGE("Document Type", SalesLine."Document Type"::Order);
//SalesLine.SETRANGE("Document No.",SalesInvoiceLine."Order No.");
//SalesLine.SETRANGE("Line No.", SalesInvoiceLine."Order Line No.");
SalesLine.SETRANGE(Type, Type);
SalesLine.SETRANGE("No.", "No.");

...dann bekomme ich in der Tat ein Datum, aber auch das scheint nicht das richtige/passende Datum zu sein. Denn wenn ich "als Anwender" in den Verkaufszeilen schaue, so erhalte ich in den jeweiligen Zeilen ganzen andere Datums.

Meine weiteren Fragen:

1. Müsste ich denn nicht noch einen SalesLine.GET(...); nach den RESET am Anfang einbauen?
2. Es hakt doch garantiert an einer lückenhaften Sortierung?

Warte sehnsüchtigst auf eine Rückmeldung...

Viele Grüße,
Tim

Re: Archiv. Verkaufszeilen: auf die letzte Versionsnr. filte

12. Mai 2015 09:07

Hi Jörg,

irgendwas läuft da jetzt doch richtig (zur mindestens zur Hälfte)?!?

Was habe ich verändert?

Code:
SalesLine.RESET;
SalesLineArchive.RESET;
SalesLine.SETRANGE("Document Type", SalesLine."Document Type"::Order);
SalesLine.SETRANGE("Document No.","Order No.");
SalesLine.SETRANGE("Line No.", "Order Line No.");
SalesLine.SETRANGE(Type, Type);
...


Ich habe bei SETRANGE bei Order No. und Order Line No. einfach die vorherige Referenz SalesInvoiceLine (« welches ich -warum auch immer- auch als lokale Variable im OnBeforeExport"-Trigger definiert habe) herausgenommen und schon läuft es!

also:
Code:
SalesLine.SETRANGE("Document No.",[b]SalesInvoiceLine."Order No."[/b]);
war wohl falsch gewesen.

Jetzt fehlt nur noch, dass der Part in Bezug auf die letzte Versionsnr. funktioniert. Aber woran könnte das denn hapern?

Gruß,
Tim

Re: Archiv. Verkaufszeilen: auf die letzte Versionsnr. filte

13. Mai 2015 07:50

Hallo Tim,

ich gehe mal davon aus, dass du auch bei der Filterung der Tabelle "Sales Line Archive" nicht mehr die lokale Variable "SalesInvoiceLine" verwendest.
Da der primary Key der Tabelle "Sales Line Archive" sich aus Belegart, Belegnr., Belegnr.-Häufigkeit (Integer-Feld), Versionsnr. (Integer) und Zeilennr. (Integer) zusammensetzt, solltest du damit das "Requested Delivery Date" aus dem Verkaufszeilenarchiv herausbekommen.
Du solltest dir vielleicht überlegen, die Variable "ReqDeliveryDate" am Anfang des Triggers auf 0D zu setzen, weil es ggf. vorkommen kann, dass ein Auftrag komplett fakturiert wurde (Verkaufskopf und Verkauiszeile wären dann nicht mehr vorhanden) und der Auftrag nicht archiviert wurde (dann würdest du auch kein Verkaufszeilenarchiv zu diesem Auftrag finden).
In diesem Fall und falls die Variable "ReqDeliveryDate" nicht vorher initialisiert wurde, hättest du in dieser Variablen noch den zuletzt gefundenen Wert drin.

Code:
..
  SalesLineArchive.SETRANGE("Document Type", SalesLineArchive."Document Type"::Order); 
  SalesLineArchive.SETRANGE("Document No.","Order No.");
  SalesLineArchive.SETRANGE("Line No.", "Order Line No.");
  SalesLineArchive.SETRANGE(Type, Type);
  SalesLineArchive.SETRANGE("No.", "No.");
// die folgende Zeile ist unnötig
//  SalesLineArchive.SETRANGE(SalesLineArchive."Version No.");
  IF SalesLineArchive.FINDLAST THEN BEGIN
    ReqDeliveryDate := SalesLineArchive."Requested Delivery Date";
...

Re: Archiv. Verkaufszeilen: auf die letzte Versionsnr. filte

18. Mai 2015 09:24

Hi Jörg,

es scheint wohl so zu laufen.

Vielen Dank für Deine Unterstützung!!!

Gruß,
Tim