[Gelöst] CC: Report für den Auftragseingang

15. Juli 2015 11:12

Hallo zusammen,

ich soll einen Report erstellen, der den Auftragseingang für die letzten 4 Wochen berechnet bzw. anzeigt.

Dieser kann dann, in regelmäßigen Abständen, gestartet werden um den aktuellen Stand zu erhalten.

Dieser Stand soll dann in der Artikelkarte in einem neuen Feld angezeigt werden.

Eine Anzeige in Echtzeit wäre natürlich noch besser, ist aber nicht unbedingt notwendig.


Wenn ein Auftrag den Status "freigegeben" hat, soll sich der Report die Artikelnr und Menge aus den Zeilen ziehen, schauen ob es innerhalb der letzten 4 Wochen passiert ist und falls ja, in den Report aufnehmen.

Ich weiß nur leider nicht so wirklich, wo ich da ansetzen soll bzw. was ich dafür alles benötige... :-?
Zuletzt geändert von NIQ am 20. Juli 2015 10:34, insgesamt 1-mal geändert.

Re: CC: Report für den Auftragseingang

15. Juli 2015 11:35

Muss es die Menge aus dem Auftragseingang sein oder reicht evtl. auch nur die Menge der gebuchten Lieferungen bzw. gebuchten Rechnungen?
Diese stehen ja schon in der Umsatzstatistik des Artikels.

Re: CC: Report für den Auftragseingang

15. Juli 2015 11:38

Gebuchte Belege sind hierbei für uns leider unrelevant.

Es muss die Menge aus dem Auftragseingang sein.

Also sobald ein Auftrag erfasst und freigegeben wurde, sollen die jeweiligen Artikel und Mengen aufgenommen werden...

Re: CC: Report für den Auftragseingang

15. Juli 2015 12:03

Da hast Du dann ja ein schönes Problem. Die Aufträge werden ja nach der Fakturierung u. U. automatisch gelöscht, die Mengen der Positionen gehen also verloren.
Dann Hast Du eigentlich nur die Möglichkeit, die Artikelnummer, Menge und Datum bei der Freigabe der Aufträge in eine neue Tabelle zu schreiben.
Dies Tabelle kann man dann er Report oder dynamisch auf der Artikelkarte als Flowfield anzeigen lassen.

Re: CC: Report für den Auftragseingang

15. Juli 2015 12:13

Stimmt, ein guter Hinweis!

Wobei die Aufträge mit den Mengen ja hinterher im Verkaufsauftragsarchiv landen.

Macht es dann aber wohl noch komplizierter.

Gibt es zufällig eine Tabelle bzw. Report, der ähnliches macht an dem ich mich etwas orientieren könnte?

Re: CC: Report für den Auftragseingang

15. Juli 2015 12:16

Hallo,

wenn die Aktion "Auftrag freigeben" entscheidend ist, dann könntest du in der Codeunit 414 "Release Sales Document" eine neue Tabelle mit Belegnummer, Belegzeilennr., Auftragsdatum, Artikelnr. und Menge (Basis) schreiben (falls es sich bei dem freigegebenen Beleg um einen Auftrag handelt).
du solltest dabei allerdings berücksichtigen, dass sich der Status des Auftrags auch nochmals ändern ("Status zurücksetzen") kann und dann ggf. Auftragszeilen gelöscht, geändert oder neu erfasst werden.
Mit dieser neuen Tabelle könntest du dann z.B. in der Artikelkarte über ein Flowfield die Auftragsmenge anzeigen.
Die Berechnung dieses Flowfields könntest du dabei noch abhängig von einem Datumsfilter (ggf. separates Flowfilter-Field anlegen) berechnen und diesen Datumsfilter automatisch beim Öffnen der Maske setzen.
Alternativ für die Anzeige in der Artikelkarte könntest du die Daten natürlich auch über einen Report drucken.

Re: CC: Report für den Auftragseingang

15. Juli 2015 13:10

Vielen Dank schon mal für die Vorschläge!

Ich habe eine Tabelle mit den Werten angelegt.

Wie und wo genau binde ich die nun in die Codeunit 414 ein, sodass die Tabelle gefüllt wird?

Re: CC: Report für den Auftragseingang

15. Juli 2015 13:21

Hallo,
wenn ich das machen müsste, würde ich dazu eine neue Funktion in der Codeunit anlegen und dieser Funktion den Parameter "Rec" (Sales Header) übergeben.
In dieser Funktion legst du eine neue Record-Variable vom Typ "Sales Line" (Record 37) an, filterst diese Record-Variable nach Belegart und Belegnummer des übergebenen Verkaufskopfes und ggf. nach Art = Artikel.
Danach die Record-Variable in einer REPEAT-UNTIL-Schleife verarbeiten und innerhalb der Schleife deine Tabelle füllen.
Ggf. musst du vor der REPEAT-Schleife deine Tabelle auf die aktuelle Auftragsnummer filtern und bereits vorhandene Datensätze in deiner Tabelle löschen (falls Aufträge nochmals geöffnet und danach bearbeitet werden).

Code:
..
IF TestPrepayment(Rec) AND ("Document Type" = "Document Type"::Order) THEN BEGIN
  Status := Status::"Pending Prepayment";
  MODIFY(TRUE);
  EXIT;
END
ELSE
  Status := Status::Released;

//
IF "Document Type" = "Document Type"::Order then
  DeineNeueFunktion(Rec);
//

SalesLine.SetSalesHeader(Rec);
SalesLine.CalcVATAmountLines(0,Rec,SalesLine,TempVATAmountLine0);
SalesLine.CalcVATAmountLines(1,Rec,SalesLine,TempVATAmountLine1);
SalesLine.UpdateVATOnLines(0,Rec,SalesLine,TempVATAmountLine0);
SalesLine.UpdateVATOnLines(1,Rec,SalesLine,TempVATAmountLine1);

MODIFY(TRUE);
..

Re: CC: Report für den Auftragseingang

15. Juli 2015 14:29

Hallo,

ich habe die Funktion TransferQuantities(Rec : Record "Sales Header") erstellt und dort eine Variable für die Sales Line hinterlegt.

Muss meine Anweisung:

IF "Document Type" = "Document Type"::Order then
TransferQuantities(Rec);


in den Trigger meiner Funktion oder woanders rein?

Wo filter ich Record-Variable nach Belegart und Belegnummer?

Wo muss meine erstellte Tabelle AE-Mengen hin?

Re: CC: Report für den Auftragseingang

15. Juli 2015 14:51

Code:
  SalesLine.RESET;
  SalesLine.SETRANGE("Document Type", Rec."Document Type");
  SalesLine.SETRANGE("Document No.", Rec."No.");
  SalesLine.SETRANGE(Type,SalesLine.Type::Item);
  IF SalesLine.FINDFIRST THEN
    REPEAT


Wäre das soweit korrekt?

Wenn ja, was muss in die Schleife und wie übergebe ich die Werte in meine angelegte Tabelle?

Re: CC: Report für den Auftragseingang

15. Juli 2015 15:10

Hallo,

in deiner Funktion könntest zu zuerst eventuell vorhandene Daten in der Tabelle "Auftragseingang" zu diesem Auftrag löschen.
Danach fügst du die Daten aus den aktuellen Auftragszeilen neu ein (falls in deiner Tabelle "Auftragseingang" der Primärschlüssel aus "Belegnummer" und "Zeilennummer" besteht)
Sollte der Primärschlüssel in deiner Tabelle z.B. "Belegnummer" + "Artikelnummer" sein, dann könntest du den unteren Teil nehmen.

Code:
// Bereits Datensaetze für den aktuellen Auftrag vorhanden?
Auftragseingang.reset;
Auftragseingang.setrange("Document No.",Rec."No.");
Auftragseingang.deleteall(true);

// Falls primary Key in der Tabelle "Auftragseingang" = "Document No.","Line No."
Auftragseingang.RESET;
SalesLine.RESET;
SalesLine.SETRANGE("Document Type", Rec."Document Type");
SalesLine.SETRANGE("Document No.", Rec."No.");
SalesLine.SETRANGE(Type,SalesLine.Type::Item);
IF SalesLine.FINDFIRST THEN
  REPEAT
    Auftragseingang."Document No." := SalesLine."Document No.";
   Auftragseingang."Line No." := SalesLine."Line No.";
   Auftragseingang."Item No." := SalesLine."No.";
   Auftragseingang."Quantity (Base)" := SalesLine."Quantity (Base)";
   Auftragseingang."Order Date" := rec."Order date";
   IF Auftragseingang.insert then;
  until SalesLine.next = 0;

// Falls primary Key in der Tabelle "Auftragseingang" = "Document No.","Item No."
Auftragseingang.RESET;
SalesLine.RESET;
SalesLine.SETRANGE("Document Type", Rec."Document Type");
SalesLine.SETRANGE("Document No.", Rec."No.");
SalesLine.SETRANGE(Type,SalesLine.Type::Item);
IF SalesLine.FINDFIRST THEN
  REPEAT
    IF Auftragseingang.GEt(SalesLine."Document No.",SalesLine."No.") then begin
      Auftragseingang."Quantity (Base)" := Auftragseingang."Quantity (Base)" + SalesLine."Quantity (Base)";
     Auftragseingang.modify;
   end else begin
      Auftragseingang."Document No." := SalesLine."Document No.";
     Auftragseingang."Item No." := SalesLine."No.";
     Auftragseingang."Quantity (Base)" := SalesLine."Quantity (Base)";
     Auftragseingang."Order Date" := rec."Order date";
     Auftragseingang.insert;   
   end;   
  until SalesLine.next = 0;

Re: CC: Report für den Auftragseingang

15. Juli 2015 18:23

Super, das hat schon mal geklappt. :)

Ich werde noch ein Feld dafür auf der Artikelkarte erstellen.

Nun soll die Tabelle aber immer nur die Werte der letzten 4 Wochen ausgeben und die anderen automatisch löschen. Und wie bekomme ich es hin, dass auf der Artikelkarte auch nur die Positionen des jeweiligen Artikels angezeigt wird?

Wie könnte ich denn da am besten vorgehen?

Re: CC: Report für den Auftragseingang

16. Juli 2015 08:33

Hallo,
schau' dir dazu mal die Berechnung der kalkulierten Felder in der Tabelle 27 an.
Als Beispiel die Berechnung des Feldes 71 "Purchases (Qty.)":
In diesem Feld werden die Mengen aus der Tabelle 32 "Item Ledger Entry" des jeweiligen Artikels (..WHERE Item No.=Field(No.)...) und abhängig von diversen Flowfiltern (u.a. Date Filter) berechnet.
du müsstest dann in der Tabelle 27 ein neues kalkuliertes Feld anlegen und in der CalcFormula deine neue Tabelle einbinden und dort die Mengen summieren (abhängig von der Artikelnr. und abhängig eines Datumfilter-Feldes).

Re: CC: Report für den Auftragseingang

16. Juli 2015 10:50

Hallo Jörg,

ich habe in der Item-Tabelle ein neues FlowField angelegt.

Wie genau setze ich jetzt hier den Table Filter - also Field, Type und Value?

FlowField.JPG


Wie ich erfahren habe soll es zwei Felder in der Artikelkarte hinterher geben, einmal die Mengen für die letzten 4 und einmal für die letzten 12 Wochen...
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Re: CC: Report für den Auftragseingang

16. Juli 2015 13:05

Hallo,
wie bereits geschrieben, schaust du da am besten mal das Feld 71 in der Tabelle 27 an und wie dieses Feld berechnet wird.
In diesem Feld siehst du zunächst mal, was die Berechnungsformel enthalten muss, dass das kalkulierte Feld nur die Werte der aktuellen Artikelnummer aus deiner AE-Mengen-Tabelle berechnet.
Wenn du das mal gemacht und geprüft hast, dass die gesamte Auftragsmenge pro Artikel richtig berechnet wird, kannst du zuerst ein neues Flowfilter-Field z.B. "Date Filter2" anlegen (Feldeigenschaften siehst du am besten im Feld "Date Filter" nach).
Danach ergänzt du die Berechnungsformel für den neues kalkuliertes Feld um dieses neue Feld "Date Filter2", damit dein kalkuliertes Feld die Auftragsmengen für den Zeitraum lt. "Date Filter2" berechnet.
Wie das geht, siehst du ebenfalls im Feld 71. Dort steht in der Berechnungsformel u.a. "Posting Date" Field "Date Filter" - bei dir wäre es "Order Date" (wenn das Feld so in deiner neuen Tabelle heißt) Field "Date Filter2".
Wenn das getan ist, prüfst du, ob das berechnete Feld richtig berechnet wird, wenn du in der Artikelkarte einen Flowfilter auf das Feld "Date Filter2" setzt.
Wenn das erledigt ist, brauchst du vermutlich für deine zweite Anforderung (12 Wochen) jeweils nochmal ein kalkuliertes Feld und ein Flowfilter-Feld ("Date Filter3").
Die Berechnung wäre dann analog zum vorherigen Feld - nur statt "Date Filter2" nimmst du "Date Filter3".

Wenn das dann auch erledigt ist, könntest du dir Gedanken machen, ob "Date Filter2" und "Date Filter3" automatisch (z.B. beim Öffnen der Maske) gesetzt werden sollen.

P.S.:
Vielleicht solltest du deinen Arbeitgeber mal um einen Grundkurs in NAV-Programmierung bitten.

Re: CC: Report für den Auftragseingang

16. Juli 2015 13:19

Hallo,

ich habe das Feld in der Artikelkarte hinzugefügt und auch eine Page für den RTC erstellt, sowie jeweils einen Lookup auf die Form bzw. Page gesetzt.

Wir arbeiten mit beiden Clients.

Danke für die Erklärungen.

Das mit dem Date Filter ist mir soweit klar. Ich habe mir auch noch ein paar andere Flow Fields angesehen.

Mir ist nur noch nicht klar, wie genau ich das mit den 4 bzw. 12 Wochen filtere (also wie die Anweisung lautet) und das ältere Werte automatisch aus der neuen Tabelle gelöscht werden.

Wenn wir z.B. den 15.02. haben und er die letzten 12 Wochen filtern soll, muss er ja auch bis zum 15.11. aus dem letzten Jahr. Geht das ohne Weiteres?

Re: CC: Report für den Auftragseingang

16. Juli 2015 13:36

NIQ hat geschrieben:Mir ist nur noch nicht klar, wie genau ich das mit den 4 bzw. 12 Wochen filtere (also wie die Anweisung lautet) und das ältere Werte automatisch aus der neuen Tabelle gelöscht werden.

Wenn wir z.B. den 15.02. haben und er die letzten 12 Wochen filtern soll, muss er ja auch bis zum 15.11. aus dem letzten Jahr. Geht das ohne Weiteres?


das wird ein calcdate werden mit den passenden Parametern zu workdate/today.

Re: CC: Report für den Auftragseingang

16. Juli 2015 13:38

Mir würde nur sowas wie WORKDATE-30 (Tage) bzw. WORKDATE-120 einfallen...

Ups, zu spät gesehen :wink:

Re: CC: Report für den Auftragseingang

16. Juli 2015 14:53

Wäre das hier korrekt?

Code:
CALCDATE('<-3W>',WORKDATE);

CALCDATE('<-12W>',WORKDATE);


Wo genau setze ich das ein?

Sorry, bin da noch nicht ganz so firm...

Re: CC: Report für den Auftragseingang

16. Juli 2015 15:32

NIQ hat geschrieben:Wäre das hier korrekt?

Code:
CALCDATE('<-3W>',WORKDATE);

CALCDATE('<-12W>',WORKDATE);


Wo genau setze ich das ein?

In Deinem Datumsfilterfeld zum Flowfield also etwa:
Code:
setrange(neuesdatumsfilterfeld,CALCDATE('<-3W>',WORKDATE),workdate); calcfields(flowfield);

Re: CC: Report für den Auftragseingang

16. Juli 2015 15:55

Also ich habe in der Item Tabelle in meinem FlowField "AE-Mengen" bisher folgendes stehen:

Code:
Sum(AE-Mengen."Quantity (Base)" WHERE (No.=FIELD(No.),Order Date=FIELD(Date Filter)))


In der Item Tabelle habe ich noch zwei FlowFields (Date Filter 2, Date Filter 3) angelegt.

In Deinem Datumsfilterfeld zum Flowfield


Unter welchem Punkt genau? Habe Anweisungen mit SETRANGE o.ä. bisher nur im CAL-Code (in Codeunits, Reports etc.) selbst eingesetzt.

Es sollen hinterher auch beim Aufruf automatisch die Filter gesetzt sein...