[Gelöst] Frage zu Filterung in Report

14. September 2011 11:38

Hallo,

ich steh gerade bei einem Problem auf dem Schlauch.

Aufgabe:
Ausgabe eines Reports mit Inhalt der archivierten Verkaufsaufträge (genauer gesagt die Zeilen). Da es dort Versionen gibt, soll nur jeweils die letzte Version ausgegeben werden.

Ich hab mit der Forensuche schon ähnliche Probleme gefunden, aber irgendwie nicht das Richtige.

Ich hab nur folgende Sortierung/Filterung im DataItemTableView gesetzt:
SORTING(Document Type,Document No.,Line No.,Doc. No. Occurrence,Version No.) ORDER(Descending) WHERE(Document Type=CONST(Order))

(Da ich keine Lizenz zur Schlüsselvergabe habe, muss dieser Vorhandene genutzt werden)

Diese Sortierung funktioniert ja schon mal und gibt mir alle Versionen aus (Die Letzte zuerst ...usw.).

Frage:
Wie filtere ich, damit nur die letzte Version ausgegeben wird?


Ausserdem noch eine Frage zum FIND Befehl: Ich versteh das Prinzip noch nicht so ganz...

Ich muss also einen Filter mit SETRANGE setzen und dann in diesem Fall mit FIND('-') den ersten Datensatz finden? ....OK soweit so gut, aber wie filtere ich dann auf diesen ersten Datensatz?

Die Zeile:
"Sales Line Archive".FIND('-');
ist sinnlos oder?

Die Zeile:
IF "Sales Line Archive".FIND('-') THEN ....
scheint richtig zu sein, aber was schreib ich nach dem THEN? ...ich will da ja eigentlich nix ausführen, ich will dass mir nur dieser erste Datensatz ausgegeben wird.

Ich hoffe mir kann jemand helfen? :-(

Danke!

Gruss
Stephen
Zuletzt geändert von Stephen06 am 15. September 2011 11:17, insgesamt 1-mal geändert.

Re: Frage zu Filterung in Report

14. September 2011 12:01

"Sales Line Archive" ist dein DataItem, richtig?
Dann gehört dieser Quelltext in den OnPreDataItem-Trigger:

Code:
IF FINDFIRST THEN BEGIN    // "Sales Line Archive".FIND('-') funktioniert auch
  RESET;     // löscht alle Filter und kehrt zum Primärschüssel zurück, behält aber den gefundenen Datensatz bei
  SETRECFILTER;    // filtert auf deinen gefundenen Datensatz
END ELSE BEGIN
  CurrReport.BREAK;
END;

Re: Frage zu Filterung in Report

14. September 2011 12:53

hmm, erstmal danke.

Aber das funktioniert so nicht. Es werden 0 Seiten erzeugt.

Ich hab mal versucht per Debugger rauszufinden wieso, aber keine Ahnung. Er steigt an anderer Stelle aus.

Es gibt da noch ein übergeordnetes Dataitem. (Responsibility Center)
Vielleicht liegt da noch ein anderer Fehler.

Edit:
Also ich hab nun rausgefunden, dass das besagte DataItem mit deinen Codezeilen nur 1 mal durchläuft. Sozusagen nur der erste Datensatz von allen. Und da dieser nicht den weiteren Filterkriterien entspricht, gibt er auch nix aus.

So soll es natürlich nicht sein. Er soll von jedem Datensatz nur die letzte Version ausgeben, aber dennoch jeden Datensatz durchlaufen.

Vielleicht muss der Code irgendwo anders hin?

Re: Frage zu Filterung in Report

14. September 2011 16:31

Ich komm da momentan nicht weiter ...

Um noch ein paar mehr Infos zu geben:
Der Report soll eine Art Umsatzübersicht für das laufende Kalenderjahr auf Basis des Liefertermins darstellen.

Aufbau:
Responsibility Center (übergeordnet)
Sales Line
Sales Line Archive
Service Line

Responsibility Center, weil unsere Firma unabhängige Abteilungen hat.

Der Report funktioniert mit Sales Line und Service Line wie gewünscht.

Sales Line Archive hab ich grundlegend identisch zu Sales Line aufgebaut. (Nur eben die nötigen Anpassungen der DataItems, Variablen und ein anderer Key)

In den untergeordneten DataItems gibt es jeweils einen DataItemLink zu Responsibility Center=FIELD(Code). Vielleicht liegt darin auch das Problem mit dem Code von Natalie.

Ich hab diesen Report nicht selbst erstellt, sondern nur angepasst. (Bin noch ziemlicher Neuling in C/AL)

Vielleicht helfen diese Infos ja weiter bei der Problemlösung. Eventuell muss ich auch einen komplett anderen Ansatz verfolgen?

Gruss
Stephen

Re: Frage zu Filterung in Report

14. September 2011 17:12

Also du brauchst aus meiner Sicht zwei DataItems:
Code:
Sales Header Archive
  Sales Line Archive

Bei beiden den Primärschlüssel, aber nicht Descending, sondern ganz normal aufsteigend sortiert. Das "Sales Line Archive" bekommt in der Property DataItemLink das hier:
Code:
Document Type=FIELD(Document Type),Document No.=FIELD(No.),Doc. No. Occurrence=FIELD(Doc. No. Occurrence),Version No.=FIELD(Version No.)


Dann fehlt nur noch im "Sales Header Archive" auf dem OnAfterGetRecord-Trigger folgendes:
Code:
FILTERGROUP(2);
SETRANGE("Document Type","Document Type");
SETRANGE("No.","No.");
SETRANGE("Doc. No. Occurrence","Doc. No. Occurrence");
FINDLAST;
SETRANGE("Document Type");
SETRANGE("No.");
SETRANGE("Doc. No. Occurrence");
FILTERGROUP(0);

Habs jetzt nicht getestet, sollte aber funktionieren.

EDIT: Deinen "Document Type = Order"-Filter kannst du natürlich auch setzen, sinnvollerweise auf das DataItem "Sales Header Archive"

Re: Frage zu Filterung in Report

15. September 2011 11:17

Hallo Tim,

hat funktioniert :-) (Allerdings erst, nachdem ich die Section vom Sales Header Archive gelöscht hab .....hat auch gedauert, bis ich das rausgefunden hab :roll: )

Vielen Dank.

Ärgerlich ist jetz nur, dass die Ausgabe nur nach Versionsnr. und nicht mehr nach Kunden (wie bei Sales Line) erfolgt. Ausserdem wäre es ideal, wenn die Verkaufsaufträge und die archivierten Verkaufaufträge zusammen nach Kunden geordnet ausgegeben würden, aber das is mir dann wohl zu heftig, wenns überhaupt möglich ist ....

Aber ok, dieses eine Problem ist gelöst.

Gruss
Stephen

Re: Frage zu Filterung in Report

15. September 2011 13:57

Stephen06 hat geschrieben:Ärgerlich ist jetz nur, dass die Ausgabe nur nach Versionsnr. und nicht mehr nach Kunden (wie bei Sales Line) erfolgt.

Ich hab nicht genau verstanden, was du erreichen willst. Die Sortierung soll anders sein? Oder was ist jetzt das Problem?

Stephen06 hat geschrieben:Ausserdem wäre es ideal, wenn die Verkaufsaufträge und die archivierten Verkaufaufträge zusammen nach Kunden geordnet ausgegeben würden, aber das is mir dann wohl zu heftig, wenns überhaupt möglich ist ....

Was heißt denn für dich zusammen? Wenn du als übergeordnetes DataItem die Tabelle 18 Customer/Debitor hast, kannst du doch alle darunter liegenden DataItems passend verknüpfen und dann werden für jeden Debitoren nur die entsprechenden Verkaufszeilen, Verkaufsarchivzeilen und Servicezeilen durchläuft, aber das Problem ist doch jetzt nicht neu durch meine vorgeschlagenen Anpassungen, das müsstest du doch auch vorher schon gehabt haben.

Vorschlag für die Anordnung der DataItems:
Code:
Responsibility Center
  Customer // <-- Alle Debitoren die der Zuständigkeitseinheit zugeordnet sind
    Sales Line // <-- Alle Verkaufszeilen, die dem Debitoren zugeordnet sind, usw.
    Sales Header Archive
      Sales Line Archive
    Service Line
Wenn die Verkaufsaufträge und die archivierten Verkaufsaufträge auch noch in der korrekten Reihenfolge (also sortiert nach Belegnr.) angezeigt werden sollen, müsstest du mit einer temporären Record-Variablen arbeiten. Beachte auch, dass archivierte Verkaufszeilen auch durchaus noch als "echte" Verkaufszeilen existieren können.

Re: Frage zu Filterung in Report

15. September 2011 14:19

Tim hat geschrieben:
Stephen06 hat geschrieben:Ärgerlich ist jetz nur, dass die Ausgabe nur nach Versionsnr. und nicht mehr nach Kunden (wie bei Sales Line) erfolgt.

Ich hab nicht genau verstanden, was du erreichen willst. Die Sortierung soll anders sein? Oder was ist jetzt das Problem?

Das liegt eben einfach an dem anderen Schlüssel bei Sales Line. Dort hab ich Document Type,Responsibility Center,Bill-to Customer No.,Currency Code

Tim hat geschrieben:
Stephen06 hat geschrieben:Ausserdem wäre es ideal, wenn die Verkaufsaufträge und die archivierten Verkaufaufträge zusammen nach Kunden geordnet ausgegeben würden, aber das is mir dann wohl zu heftig, wenns überhaupt möglich ist ....

Was heißt denn für dich zusammen? Wenn du als übergeordnetes DataItem die Tabelle 18 Customer/Debitor hast, kannst du doch alle darunter liegenden DataItems passend verknüpfen und dann werden für jeden Debitoren nur die entsprechenden Verkaufszeilen, Verkaufsarchivzeilen und Servicezeilen durchläuft, aber das Problem ist doch jetzt nicht neu durch meine vorgeschlagenen Anpassungen, das müsstest du doch auch vorher schon gehabt haben.

Zusammen heisst für mich, dass bei der Ausgabe nicht Verkaufszeilen und archivierte Verkaufszeilen getrennt behandelt werden. Service soll getrennt dargestellt werden.
Und nein, natürlich haben deine Anpassungen nichts mit meinen weiteren Problemen zu tun. Das Problem tritt eben nur bei den Verkaufsarchivzeilen auf, da diese eben wegen den Versionen anders sortiert sind.

Aber du gibst ja schon die richtige Lösung. Danke :-)
Tim hat geschrieben:Vorschlag für die Anordnung der DataItems:
Code:
Responsibility Center
  Customer // <-- Alle Debitoren die der Zuständigkeitseinheit zugeordnet sind
    Sales Line // <-- Alle Verkaufszeilen, die dem Debitoren zugeordnet sind, usw.
    Sales Header Archive
      Sales Line Archive
    Service Line
Wenn die Verkaufsaufträge und die archivierten Verkaufsaufträge auch noch in der korrekten Reihenfolge (also sortiert nach Belegnr.) angezeigt werden sollen, müsstest du mit einer temporären Record-Variablen arbeiten. Beachte auch, dass archivierte Verkaufszeilen auch durchaus noch als "echte" Verkaufszeilen existieren können.


Danke, das hilft mir sicher weiter.