Summe über alle Aufträge mit einer Stückzahl kleiner 4000

7. August 2012 09:52

Tag zusammen,

bisher habe ich auf der Arbeit im Rahmen eines Studentenjobs nur Reports angepasst, korrigiert und verbessert.
Jetzt wurde ich gefragt, ob es mir möglich wäre einen Report zu erstellen, welcher die Summe der Aufträge mit einer Stückzahl eines Artikels kleiner 4000 und anderen Ausschlusskritieren bildet.

Allerdings werde ich aus dem Aufbau der Reports nicht wirklich schlau und finde auch keine Tutorials oder ähnliches, die das neu Erstellen eines Reports beschreiben. Könntet ihr mir ein bisschen Starthilfe geben, was ich brauche und wie die Grundstruktur von so einem Report aussieht?

Herzlichen Dank im Vorraus!

Viele Grüße,
Seiivo

Re: Summe über alle Aufträge mit einer Stückzahl kleiner 400

7. August 2012 10:18

Seiivo hat geschrieben:Allerdings werde ich aus dem Aufbau der Reports nicht wirklich schlau und finde auch keine Tutorials oder ähnliches, die das neu Erstellen eines Reports beschreiben. Könntet ihr mir ein bisschen Starthilfe geben, was ich brauche und wie die Grundstruktur von so einem Report aussieht?


Hallo Seiivo,

wenn du das noch nie gemacht hast würde ich dir das erst in einer Testdatenbank empfehlen zu testen.

Report erstellen:
- Im Objektdesigner unter "Report" auf "New" klicken.
- "Create a blank report"
- Dataitems angeben
- Name vergeben und unter einer freien lizensierten Objektid vermutlich 50xxx speichern

Eine grundlegende Einführung zu Reports hat Natalie für dich zusammengefasst (Link).

Seiivo hat geschrieben:Jetzt wurde ich gefragt, ob es mir möglich wäre einen Report zu erstellen, welcher die Summe der Aufträge mit einer Stückzahl eines Artikels kleiner 4000 und anderen Ausschlusskritieren bildet.


Ein paar Tipps zur Umsetzung:
Hier wären die Tabelle 36 (Sales Header) und 37 (Sales Line) interessant.
Die könntest du als Dataitems (eingerückt) in den Report einbinden in den Properties nur gefiltert auf Belegart "Auftrag". Das Beispiel findest du sogar in dem obigen Link.

Mit einer Zählvariable zählst du dann im "Sales Line" Dataitem die Aufträge im OnAftergetRecord-Trigger, aber nur dann wenn in dem selben Auftrag nicht schon einmal hochgezählt wurde.

Den oder die Filter (z.B. Menge<4000) würde ich den Benutzer selber im Report eingeben lassen oder wenn es denn sein soll mit SETFILTER auf die Menge fest im Code verankern.

In den Sections gibst du dann wenigstens die Überschrift, Filterbedingungen der beiden Dataitems (GETFILTERS), Datum (CURRENTDATETIME) und die errechneten Summenwerte aus.

Falls du in dem Text neue Begriffe lesen solltest, kannst du diese in der internen Hilfe von Navision nachschlagen.

P.S.: Erfahrungsgemäß würde ich die Anforderungen noch einmal hinterfragen, da in der Terminologie von Navision mit "Aufträgen" nur diejenigen Aufträge meint sind, die nicht schon gebucht sind, sprich noch nicht geliefert/fakturiert sind. Ansonsten wären das andere Tabellen. :wink:

mfg,
winfy

Re: Summe über alle Aufträge mit einer Stückzahl kleiner 400

7. August 2012 12:14

Für das reine Zählen an Aufträgen könntest du auch auf die eingerückten Data-Items verzichten und das wie im Anhang zu sehen nur über Code erledigen. Ist für den Fall das nur eine Tabelle abgefragt wird meiner Meinugn nach wesentlich performanter über die Funktion COUNT den wert zu ermitteln anstatt die einzelnen Header/lines durchzuarbeiten und in einer Variablen hochzuzählen.. Habe für das Beispiel nun auch nur die Anzahl und die Artikelnummer als frei befüllbare Filter eingebaut und das auch ohne Tablerelations (Den Wert Auftrag und Artikel hab ich wie im Code zu sehen fest definiert). Will damit ja nur eine weitere Möglichkeit zur Umsetzugn demonstrieren,

Im Besipiel gab es bei mir eben auch nur einen Artikel der weniger als 11x in Aufträgen vorhanden war.
Bild


Edit:
Besteht ja noch die Möglichkeit das es mehrere Zeilen pro Auftrag mit dem gleichen Artikel vorhanden sind. Wie soll den dann verfahren werden? Zählt jede Zeile gesondert oder zählt die Summe des Artikels aus allen zeilen pro Auftrag?

Re: Summe über alle Aufträge mit einer Stückzahl kleiner 400

7. August 2012 13:00

Jetzt wurde ich gefragt, ob es mir möglich wäre einen Report zu erstellen, welcher die Summe der Aufträge mit einer Stückzahl eines Artikels kleiner 4000 und anderen Ausschlusskritieren bildet.


Warum ich Dataitems bevorzugen würde ist einfach nur damit er seine anderen Ausschlusskriterien jedesmal beim Reportaufruf gesondert festlegen kann.

Und wie du selbst festgestellt hast könnte ein Count auch nicht unbedingt reichen, genau dann nicht wenn ein Auftrag mehr als eine Zeile mit Artikeln der Menge < 4000 hat (bzw. der Filterbedingung pro Auftrag mehrfach entspricht).

Viele Wege führen nach Rom und dein Code hilft ihm sicher auch beim Verständnis weiter.
Dann sieht er wenigstens gleich den Unterschied zwischen Dataitems und Record-Variablen. :wink:

mfg,
winfy

Re: Summe über alle Aufträge mit einer Stückzahl kleiner 400

7. August 2012 13:51

Hallo zusammen,

herzlichen Dank für eure Beiträge, sind mir beide eine gute Hilfe.

Ich habe die Lösung mit dem Report umgesetzt, da ich das mit den DataItems schnell verstanden habe.
Bei den SalesLines muss ich nach bestimmten Artikelnummern (No.) Filtern und die Quantitäten der gefilterten Artikel
für jeden SalesHeader zusammen addieren. Sprich ein SalesHeader kann mehrere Artikel haben, die zusammen in der Quantität
niedriger als 4000 sein müssen.
Allerdings will das ganze noch nicht so ganz.

Kurze Erklärung: Sendungen entspricht den Quantitäten, es dürfen nur Artikel mit dem Anfang PO_ aber nicht PO_1N_2PWS oder PO_1N_3PW in die Sendungen mit einfließen.
Hier der Code:

Sales Header:
Code:
Documentation()

Sales Header, Body (1) - OnPreSection()
CurrReport.SHOWOUTPUT(FALSE);
IF ("Sales Header"."Document Type" = "Document Type"::Order) AND
 NOT(PreviousNo = "Sales Header"."No.") THEN BEGIN
  MESSAGE("Sales Header"."No.");
  PreviousNo := "Sales Header"."No.";
  Sendungen := 0;
END;

Sales Header, Body (1) - OnPostSection()
IF ("Sales Header"."Document Type" = "Document Type"::Order) THEN BEGIN
  IF (Sendungen > 0) AND (Sendungen <= 4000) THEN BEGIN
    TotalMatches += 1;
    MESSAGE('TotalMatches = %1', TotalMatches);
  END;
END;


Sales Line:
Code:

Documentation()

Sales Line, Body (1) - OnPreSection()
CurrReport.SHOWOUTPUT(FALSE);

IF ("Sales Header"."No." = "Sales Line"."Document No.")
 AND ("Sales Header"."Document Type" = "Sales Line"."Document Type")
 AND ("Sales Header"."Document Type" = "Document Type"::Order) THEN BEGIN

  IF (COPYSTR("No.", 1, 3) = 'PO_')
   AND NOT (COPYSTR("No.", 1, 10) = 'PO_1N_2PWS')
   AND NOT (COPYSTR("No.", 1, 9) = 'PO_1N_3PW') THEN BEGIN
    MESSAGE('Quantity: %1', Quantity);
    Sendungen += Quantity;
  END;
END;

Sales Line, Body (1) - OnPostSection()





Allerdings führt das noch nicht zum gewünschten Ergebnis, die TotalMatches sind immer 0.
Kann es sein, dass der Sales Header Body immer ausgeführt wird, bevor ein Sales Line Body ausgeführt wird? Dann würde ja Sendungen immer auf 0 zurückgesetzt werden.

Grüße,
Seiivo

Re: Summe über alle Aufträge mit einer Stückzahl kleiner 400

7. August 2012 15:05

Erst einmal allgemein zu Code:

Ich würde deinen Code aus den Sections rausnehmen und im OnAfterGetRecord() einstellen.

Code:
IF ("Sales Header"."No." = "Sales Line"."Document No.")


ist unüblich!

Das erreichst du mit der "DataItemLink"-Property im Dataitem.
Dort verlinkst du die beiden Dataitems ("Sales Line" eingerückt) über die Belegnummer.
Ein Dataitem rückst du über das DataItemIndent-Property ein.

    DataItemIndent: 1

Code:
AND ("Sales Header"."Document Type" = "Document Type"::Order)


ist auch unüblich!

Das legst du am Besten auch im DataItemTableView-Property im "Table Filter" fest.

Code:
IF (COPYSTR("No.", 1, 3) = 'PO_')
   AND NOT (COPYSTR("No.", 1, 10) = 'PO_1N_2PWS')
   AND NOT (COPYSTR("No.", 1, 9) = 'PO_1N_3PW')


auch unüblich!

Das würde ich über einen Filter lösen. Entweder im Report manuell eintragen lassen oder
im Code SETFILTER("No.", 'PO_*&<>PO_1N_2PWS&<>PO_1N_3PW'); im OnPreDataItem()

Code:
MESSAGE('Quantity: %1', Quantity);


Die Ausgabe per Messagebox ist nur sinnvoll wenn du das mit 1-5 Aufträgen testest.
Du würdest sonst hunderte oder tausende Messageboxen bekommen.

Mach die Ausgabe in den Sections vom Report, wie das Modde oben im Screenshot gezeigt hat.

mfg,
winfy

Re: Summe über alle Aufträge mit einer Stückzahl kleiner 400

8. August 2012 10:32

Hi winfy,

abermals vielen Dank für deine Bemühungen, der Code sieht jetzt tatsächlich sehr viel schöner aus :-)!
Allerdings habe ich das Problem, dass irgendwie die DataItemTableView Property "WHERE(Document Type=CONST(Order))" total komische Datensätze ausgeben lässt, nämlich nur 3 Rechnungen.

Hier gerade meine aktuelle Konfiguration:
Sales Header:
Bild
Code:
Documentation()

Sales Header - OnPreDataItem()

Sales Header - OnAfterGetRecord()
IF NOT(PreviousNo = "Sales Header"."No.") THEN BEGIN
  PreviousNo := "Sales Header"."No.";
  Sendungen := 0;
END;

IF (Sendungen > 0) AND (Sendungen <= 4000) THEN BEGIN
  TotalMatches += 1;
END;
//*******************************************************************

MESSAGE('Auftrag %1, Sendungen: %2', "No.", Sendungen);

Sales Header - OnPostDataItem()



Sales Line - Properties:
Bild
Code:
SETFILTER("No.", 'PO_*&<>PO_1N_2PWS*&<>PO_1N_3PW*');

Sales Line - OnAfterGetRecord()
Sendungen += Quantity;
//MESSAGE('Artikel, Quantity = %1, Document No. = %2', Quantity, "Document No.");




Das ganze läuft auf einem Testmandanten, sind also nicht so viele Datensätze (Ansonsten hilft ESC gedrückt halten ja auch ;-)).


Also die Message die im Moment eingebunden ist wird nur 4-5 mal gezeigt. Es gibt definitiv mehr als 40 Aufträge, 20 davon mindestens mit PO_ Artikeln, sollte also angezeigt werden.
Wenn ich die DataItemTableView Property raus nehme, zeigt der mir auch ein paar Aufträge und Angebote an, was ja auch logisch ist. Allerdings nicht alle.

Ich werde da beim besten willen nicht schlau draus, warum der nur diese Rechnungen anzeigt....


//NACHTRAG:
Oh Gott, ahem.... Blanket Order war der Document Type nach dem ich gesucht habe, Rahmenaufträge halt.
Jetzt kriege ich auch die richtigen Artikel ausgegeben. Jetzt muss ich nurnoch die Addition hinbiegen, aber das kriege ich wohl hin :-D!


//NACHTRAG 2:
Und doch noch eine Frage. Wie kann ich ausschließlich die erledigten Aufträge mit einbeziehen?

Abermals vielen Dank!

Viele Grüße,
Seiivo

Re: Summe über alle Aufträge mit einer Stückzahl kleiner 400

8. August 2012 11:12

Seiivo hat geschrieben://NACHTRAG 2:
Und doch noch eine Frage. Wie kann ich ausschließlich die erledigten Aufträge mit einbeziehen?

Abermals vielen Dank!

Viele Grüße,
Seiivo


Hallo Seiivo,

schön das du den Code umgestellt hast. Auf Dauer wird es dir damit auch leichter fallen die Standardreports zu verstehen.

Nun zu deiner Frage:
Ein Rahmenauftrag wird in der Regel für periodisch oder häufig auftretende Aufträge für gewissen Debitoren verwendet und dient als eine Art Auftragsmuster.

Aus einem Rahmenauftrag können dann konkrete Aufträge erstellt werden.
Ein Rahmenauftrag selbst zu untersuchen macht also meiner Meinung nach nicht so viel Sinn.

Die konkreten Aufträge können unter Umständen aus Rahmenaufträgen stammen.

Was verstehst du unter erledigten Aufträgen?
Sind das nun die Aufträge die aus einem Rahmenauftrag stammen oder meinst du hier die fakturierten Aufträge?
Das wären dann gebuchte Rechnungen und die wären dann in anderen (leider auch größeren) Tabellen (z.B. 112 oder 113).

mfg,
winfy

Re: Summe über alle Aufträge mit einer Stückzahl kleiner 400

8. August 2012 12:29

Hallo winfy,

ich glaube fast bei uns wird alles über Rahmenaufträge gelöst, ich soll die auf jeden Fall für die "Rechnung" gebrauchen.

Im Moment beziehe ich nur die aktiven Rahmenaufträge mit ein, es sollen aber alle Rahmenaufträge, auch in der Vergangenheit liegende, mit einbezogen werden.
Tabellen 112 und 113 scheinen dafür ja die richtigen zu sein, oder?

Viele Grüße,
Joschka

Re: Summe über alle Aufträge mit einer Stückzahl kleiner 400

8. August 2012 13:35

Seiivo hat geschrieben:Hallo winfy,

ich glaube fast bei uns wird alles über Rahmenaufträge gelöst, ich soll die auf jeden Fall für die "Rechnung" gebrauchen.

Im Moment beziehe ich nur die aktiven Rahmenaufträge mit ein, es sollen aber alle Rahmenaufträge, auch in der Vergangenheit liegende, mit einbezogen werden.
Tabellen 112 und 113 scheinen dafür ja die richtigen zu sein, oder?

Viele Grüße,
Joschka


Hallo Joschka,

Rechnungen oder gebuchte Rechnungen?
Ich weiß das ist spitzfindig, aber Navision macht da begrifflich Unterschiede. :wink:

In den "Sales Invoice Header" (Tabelle 112) sind jedenfalls deine gebuchten Verkaufsaufträge enthalten.
Die Zeilen dazu sind in Tabelle 113 "Sales Invoice Line".

Ich würde an deiner Stelle diese auch analog zu Sales Header und Sales Line wieder einrücken.
Natürlich könnte man für dein Vorhaben auch nur die Tabelle 113 nehmen. Ich würde das aber nicht empfehlen, da man so auch Filter auf den Sales Invoice Header setzen kann.

Beispielsweise könnte man so auf das Auftragsdatum filtern, was ja in den Zeilen nicht enthalten ist.

Deinen Report über wirklich alle gebuchten Rechnungen laufen zu lassen ist ohnehin nicht sehr sinnvoll.
Das macht nur Sinn wenn man einen Untersuchungszeitraum betrachtet, z.B. mit Filtern auf Buchungsdatum oder Auftragsdatum.

Wenn du dir das dann beantworten kannst, könntest du danach noch den Sortierschlüssel vom ersten Dataitem entsprechend anpassen, damit der Report dann performanter läuft.

mfg,
winfy

Re: Summe über alle Aufträge mit einer Stückzahl kleiner 400

8. August 2012 13:48

Hallo winfy,

leider fehlt mir da die fachliche Kompetenz um das entscheiden zu können. Allerdings wurde mir gesagt, dass die gebuchten Verkaufsaufträge mit rein sollen.
Das Zusammenzählen habe ich einfach, wie du auch gesagt hast, geklont. Funktioniert bestens.
Mit der "Rechnung" war das addieren der Aufträge gemeint :-)!

Was mir jetzt noch Kopfzerbrechen bereitet ist das Setzen des Filters. Man soll nach verschiedenen Artikelnummern filtern können, das mit dem PO_ usw. hat sich erübrigt (die wissen noch nicht so ganz was die wollen).
Am besten wäre es, wenn man nach dem Initialisieren des Reports in der Filter-Form eine vorgegebene Auswahl an Teilartikelnummern hat, die man einstellen kann. Ist das mit einfachen Mitteln möglich? Problem dabei ist wahrscheinlich, dass die Lizenz hier sehr beschränkt ist, Formen editieren ist z.B. nicht möglich.

Außerdem wäre es super, wenn der Filter von der Verkaufszeile automatisch auch in die Verkaufsrechnungszeile übernommen wird. Dafür müsste ich den Filter nach dem Setzen lesen können, ist das möglich?

Der Untersuchungszeitraum kann dann von meinen Chefs in den Filtern ja nach belieben eingestellt werden, das kriegen die hin.

Viele Grüße und danke abermals,
Joschka

Re: Summe über alle Aufträge mit einer Stückzahl kleiner 400

8. August 2012 14:26

Seiivo hat geschrieben:Was mir jetzt noch Kopfzerbrechen bereitet ist das Setzen des Filters. Man soll nach verschiedenen Artikelnummern filtern können, das mit dem PO_ usw. hat sich erübrigt (die wissen noch nicht so ganz was die wollen).


Das sie nicht immer wissen was sie wollen, daran musst du dich gewöhnen.
Es macht auch in der Regel keinen Sinn solche Filter im Code zu implementieren.
Solche Anforderungen sollte man gleich torpedieren - ähm hinterfragen. :wink:
Man gibt diese Filter manuell im Report ein und damit ist der schön flexibel.
Nächste Woche wollen sie dann nicht die "PO"-Artikel, sondern die "OHR"-Artikel und die Woche darauf "PO" mit "OHR" Artikel, wenn du weißt was ich meine. :-D

Seiivo hat geschrieben:Am besten wäre es, wenn man nach dem Initialisieren des Reports in der Filter-Form eine vorgegebene Auswahl an Teilartikelnummern hat, die man einstellen kann. Ist das mit einfachen Mitteln möglich? Problem dabei ist wahrscheinlich, dass die Lizenz hier sehr beschränkt ist, Formen editieren ist z.B. nicht möglich.


Musst du mal testen, ob deine Lizenz das macht, aber du könntest die Request Form vom Report dafür verwenden.
Hier könntest du Filter als Muster vorgeben und per ButtonClick mit SETFILTER auf die jeweiligen Felder der Dataitems übernehmen.

Seiivo hat geschrieben:Außerdem wäre es super, wenn der Filter von der Verkaufszeile automatisch auch in die Verkaufsrechnungszeile übernommen wird. Dafür müsste ich den Filter nach dem Setzen lesen können, ist das möglich?


Mit GETFILTER kannst du im Code die Filter abfragen und mit SETFILTER kannst du sie setzen.
Damit ein Dataitem für die Auswahl ausgeblendet bleibt, weil du beispielsweise einen Filter kopieren möchtest, gehe wie folgt vor:
    "ReqFilterFields"-Property leer lassen
    "DataItemTableView"-Property des jeweiligen DataItems einen Sortierschlüssel verpassen

mfg,
winfy

Re: Summe über alle Aufträge mit einer Stückzahl kleiner 400

8. August 2012 14:45

Hallo winfy,

da habe ich mich zum Glück schon dran gewöhnt :-D.

Das mit der Request Form werde ich mal probieren, hört sich nach einer guten Lösung an.
Das Ausblenden hat wunderbar funktioniert, vielen Dank.

Viele Grüße,
Joschka