[Gelöst] Bericht: Lagerplatz zählen

29. Juli 2013 13:13

Hallo !

ich bin relativ neu in dem Bereich NAV, ich versuche mich grade an einem Report und komme nicht so richtig weiter.


Ich wollte gerne ein Bericht schreiben der in der Tabelle "Bin Content" nachschaut ob es für einen Artikel zwei eingetragene Lagerplätze gibt.

Wenn dies der Fall ist sollte der Artikel auf dem Bereicht gedruckt werden , alle anderen Artikel sollten dann übersprungen werden.

Kann mir jemand Tipps geben oder mir helfen das umzusetzen ?

Ich habe ein paar Berichte geschrieben, allerdings meistens nur Belege die etwas bestimmtes angezeigt haben, Überprüfungen der Inhalte habe ich so noch nicht gemacht, könntet ihr da helfen?


mit freundlichen Grüßen !
Zuletzt geändert von foxra am 31. Juli 2013 08:18, insgesamt 1-mal geändert.

Re: Bericht: Lagerplatz zählen

29. Juli 2013 13:35

Herzlich Willkommen im Forum!
Natalie hat hier eine schöne Anleitung zum Thema Datensatzzugriff geschrieben.

Da das vermutlich nur innerhalb eines Lagerortes gelten soll, muss der Lagerort beim Filtern auch noch mit dazu genommen werden, wenn mehrere Lagerplätze vorhanden sind.
Datensätze zählen kann man mit COUNT oder alternativ auch den ersten und letzten Datzensatz vergleichen. Wenn die den gleichen Lagerplatzcode haben, gibt es nur einen Platz an dem Lagerort ( wenn nicht noch Varianten und unterschiedliche Basiseinheitencodes dazukommen).

Ergibt die Prüfung nur einen Platz, wird im Report dann mit CURRREPORT.SKIP der Artikel übersprungen und nicht angedruckt.

Re: Bericht: Lagerplatz zählen

29. Juli 2013 13:44

Herzlich Willkommen bei uns!

foxra hat geschrieben:Überprüfungen der Inhalte habe ich so noch nicht gemacht, könntet ihr da helfen?!

Der Code für die Prüfungen (und das eben genannte CurrReport.SKIP) gehören in den Trigger OnAfterGetRecord das Bin-DataItems.
In der Onlinehilfe werden auch die anderen Trigger beschrieben.

Re: Bericht: Lagerplatz zählen

29. Juli 2013 14:47

danke für die Begrüßung und schnelle Anwtort :)


Ich stehe grade etwas aufm Schlauch, irgendwie bekomme ich das nicht hin... :oops:


Bin Content - OnAfterGetRecord()

BinCode.INIT;
BinCount := BinCode.COUNT;
BinCount := 0;
BinCode.SETFILTER(BinCode."Location Code", BinCode."Item No.");

IF BinCode.FINDSET THEN
REPEAT
BinCount := BinCount + 1;
UNTIL BinCode.NEXT = 0;

IF BinCount = 1 THEN
CurrReport.SKIP;


Er filtert alle Artikel und schreibt sie in den Bericht, warum überspringt er nicht alle die nur einen Lagerplatz haben ?

Re: Bericht: Lagerplatz zählen

29. Juli 2013 14:58

Siehe Kommentare:

Code:
BinCode.INIT;
BinCount  := BinCode.COUNT; // 1)
BinCount := 0;
BinCode.SETFILTER(BinCode."Location Code", BinCode."Item No."); 2)

IF BinCode.FINDSET THEN
  REPEAT
   BinCount := BinCount + 1; // 3)
  UNTIL BinCode.NEXT = 0;

  IF BinCount = 1 THEN
  CurrReport.SKIP;


1) Hier Zählst du alle Lagerplätze, egal für welchen Artikel und egal welchen Lagerort - also ungefiltert. Da du den eben ermittelten Wert in der nächsten Zeile direkt wirder überschreibst, kannst du Zeile 1) auch gleich löschen ...

2) Leider völlig falsch. Hier hast du formuliert: Filtere Lagerplätze, und zwar setze in Feld Lagerortcode den Filter Artikelnummer ... ;-)
Was wolltest du erreichen? Links vom Komma gehört das Feld, auf welches ein Filter gesetzt werden soll, rechts neben dem Komma steht der Wert, auf welchen gefiltert werden soll.

3) Statt REPEAT-UNTIL hättest du hier einfach den COUNT-Befehl aus 1) verwenden können.

Re: Bericht: Lagerplatz zählen

29. Juli 2013 15:07

Natalie hat geschrieben:Der Code für die Prüfungen (und das eben genannte CurrReport.SKIP) gehören in den Trigger OnAfterGetRecord das Bin-DataItems.
Es ist doch gewünscht, dass der Artikel nicht gedruckt wird? Daher würde ich im OnAfterGetRecord von "Item" prüfen.

foxra hat geschrieben:BinCode.SETFILTER(BinCode."Location Code", BinCode."Item No.");
Da läuft so einiges noch nicht rund, aber hauptsächlich filterst du hier auf Lagerort = Artikelnummer. Da wird vermutlich nichts gefunden, und da Null ungleich Eins ist, kommt deine Abbruchbedingung nicht zum Zug.

Re: Bericht: Lagerplatz zählen

29. Juli 2013 15:48

okay danke das mit dem Setfilter habe ich irgendwie dann falsch verstanden :oops:

Ich hab als dataitem die Item Tabelle angegeben:

Somit müsste er ja jetzt versuchen die Artikelnumer in der Bin Content zu finden, wenn das der Fall ist, sollte "BinCount:= BinCode.COUNT;" die Datensätze zählen und mit wenn mehr als ein Datensatz vorhanden ist dann sollte der Artikel im Report angezeigt werden.

Aber der Report läuft bis an die 1000 seiten durch mit der ersten Artikelnumer die er findet.

Code:
BinCode.INIT;
BinCount := 0;
BinCode.SETFILTER(BinCode."Item No.",Item."No.");

IF BinCode.FINDSET THEN
BinCount:= BinCode.COUNT;
IF BinCount  = 1 THEN CurrReport.SKIP;


Bei 1 zeigt er so wie vorher alle datensätze an , bei bzw. 2 werden alle sätze übersprungen.
In meinem Testmandaten gibt es ca. 15 Artikel, davon haben 3 zwei Lagerplatze eingetragen.

Re: Bericht: Lagerplatz zählen

29. Juli 2013 15:56

Siehe wieder unten:

Code:
BinCode.INIT;
BinCount := 0;
BinCode.SETFILTER(BinCode."Item No.",Item."No."); 1)

IF BinCode.FINDSET THEN // 2)
BinCount:= BinCode.COUNT;
IF BinCount  = 1 THEN CurrReport.SKIP;  // 3)


1) Sieht richtig aus :-)

2) Die Zeile kann raus.

3) Was möchtest du jetzt eigentlich erreichen? Momentan druckst du alle Datensätze an, für die die Anzahl der Lagerplätze nicht 1 (also z.b. 0, oder 2 oder 3) ist.
Anfangs hattest du noch geschrieben:
foxra hat geschrieben:ob es für einen Artikel zwei eingetragene Lagerplätze gibt.

Meintest du damit, du willst nur die Artikel sehen, die exakt zwei Lagerplätze haben?
Wenn ja, gehört hier hin:
Code:
IF BinCount <> 2 THEN
  CurrReport.SKIP;

Re: Bericht: Lagerplatz zählen

29. Juli 2013 16:02

ich möchte alle Artikel auflisten die mehr als einen Lagerplatz haben.

Re: Bericht: Lagerplatz zählen

29. Juli 2013 16:10

foxra hat geschrieben:ich möchte alle Artikel auflisten die mehr als einen Lagerplatz haben.

Dann formuliere in C/AL um: du möchtest umgekehrt alle SKIPen, die ...?

Re: Bericht: Lagerplatz zählen

29. Juli 2013 16:15

alle Artikel die < 2 sind, der bericht bleibt aber leer bei dieser Bedingung :(

Re: Bericht: Lagerplatz zählen

29. Juli 2013 16:17

foxra hat geschrieben:alle Artikel die < 2 sind,

Schonmal richtig.

der bericht bleibt aber leer bei dieser Bedingung :(

Du hast aber in der Item-Body-Section bereits Textboxen hinzugefügt, die die Artikelnummer usw. auch ausgeben ...?

Wenn ja, Zeig mal bitte nochmal den gesamten, aktuellen C/AL-Inhalt von OnAfterGetRecord.

PS: ich hatte vorher das hier überlesen:
McClane hat geschrieben:Daher würde ich im OnAfterGetRecord von "Item" prüfen.
McClane hatte natürlich recht - ich gehe schon davon aus, dass dein Report nur aus DataItem "Item" besteht. Ist das richtig?

Re: Bericht: Lagerplatz zählen

29. Juli 2013 16:50

ja genau das Dataitem ist <Item>


Code:
Item - OnAfterGetRecord()

BinCode.INIT;
BinCount := 0;
BinCode.SETFILTER(BinCode."Item No.",Item."No.");
BinCount:= BinCode.COUNT;
IF BinCount < 2 THEN
CurrReport.SKIP;



BinCode, Record = <Bin Content>
BinCount, Integer

in der Section Item / Body habe ich Artikelnummer/Beschreibung aus <Item> und Item No. + Lagerplatz aus <Bin Content> gesetzt. (testweise)


Ich rufe den Bericht im Classic per Obj. Designer auf und gebe als Filer "No." = * mit.

Re: Bericht: Lagerplatz zählen

29. Juli 2013 17:01

foxra hat geschrieben:Ich rufe den Bericht im Classic per Obj. Designer auf und gebe als Filer "No." = * mit.

Wenn du auf "No." nicht filtern möchtest, gib bitte auch "nichts" dort ein ...

Re: Bericht: Lagerplatz zählen

29. Juli 2013 17:11

keine veränderung....
was mache ich falsch?


ich habe mal das obj. angehängt (id 50080)
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Re: Bericht: Lagerplatz zählen

29. Juli 2013 17:46

foxra hat geschrieben:keine veränderung....
was mache ich falsch?


ich habe mal das obj. angehängt (id 50080)


Salü,

Hast du dir schon mal die Seite http://www.navision24.de angeschaut?
Dort werden die absoluten NAV Programmierer Grundlagen geschult.

edit: so, ich hab das mal auf die Schnelle ausprobiert ohne Report, einfach Code hinter einem neu erstellten Button auf einer Form.

Code:

ItemRec.RESET;
LocationRec.RESET;
BinContentRec.RESET;

REPEAT

 BinContentRec.SETRANGE("Item No.",ItemRec."No.");
  IF BinContentRec.FINDSET THEN
   IF BinContentRec.COUNT > 1 THEN BEGIN //Anzahl Artikelnr.-Zeilen > 1 mit gleicher Artikelnr.
    REPEAT //nimm die Lagerorttabelle als Iterator
      BinContentRec.SETRANGE("Location Code",LocationRec.Code);
      IF BinContentRec.FINDSET THEN
      REPEAT
        IF BinContentRec.COUNT > 1 THEN
          MESSAGE('Art-Nr. %1, enthaelt folgende Lagerplaetze: %2',BinContentRec."Item No.", BinContentRec."Bin Code");
      UNTIL BinContentRec.NEXT = 0;
    UNTIL LocationRec.NEXT = 0;
   END;

UNTIL ItemRec.NEXT = 0;


Tut noch nicht, aber als Prototyp und als Anregung für den Threadersteller vielleicht ganz brauchbar.
Morgen, wenn ich Zeit hab, guck ich nochmals drüber und dann wird der Code auch laufen :-)

edit2: Halleluja, der Code tut doch, ich hab in Cronus genau 7 Artikel gezählt, die mehrmals auftreten mit mehreren Lagerort / Lagerplatz Einträgen.
Zuletzt geändert von Freestyler am 29. Juli 2013 21:05, insgesamt 4-mal geändert.

Re: Bericht: Lagerplatz zählen

29. Juli 2013 18:17

Außerdem solltest du dir das hier ansehen:
viewtopic.php?f=19&t=10806

Dort ist auch ein Beispiel für die Verwendung von MESSAGE. Damit kannst du dir zur Laufzeit Meldungen ausgeben lassen, z.B. die von dir ermittelte Anzahl - als Kontrolle.
Um den Report damit zu testen, setze beim Starten des Reports aber unbedingt einen Artikel-Filter auf einen bestimmten Artikel.

Re: Bericht: Lagerplatz zählen

29. Juli 2013 22:35

foxra hat geschrieben:keine veränderung....
was mache ich falsch?

Prinzipiell sollte das richtige Ergebnis dabei heraus kommen. Importiere den Report doch mal in den Cronus-Mandanten und schau, ob dann sieben Artikel aufgelistet werden. Freestyler hat ja bereits sicher gestellt, dass es dort so viele Artikel mit mehr als einem Lagerplatz gibt :)

Re: Bericht: Lagerplatz zählen

30. Juli 2013 09:42

Danke für die Hilfe !

der Code von Freestyler funktioniert gut, ich werde ihn für meine zwecke anpassen,

Danke nochmals an alle!

Re: Bericht: Lagerplatz zählen

30. Juli 2013 09:59

Nochmal: dein ursprünglicher Report sollte genau das gleiche Ergebnis liefern. Und der Code von Freestyler ist für einen Report viel zu lang; dort brauchst du genau drei Zeilen.