[Gelöst] CC: Nulldivision

19. August 2015 12:03

Hallo zusammen,

ich habe die Variable "Wert/Menge" und folgenden Code erstellt, um eine Nulldivision zu vermeiden:

Code:
Value Entry - OnAfterGetRecord()

IF "Value Entry"."Invoiced Quantity" <> 0 THEN
  "Wert/Menge" := "Cost Amount (Actual)" / "Invoiced Quantity";


Nun habe ich das Problem, dass in manchen Zeilen im Feld "Wert/Menge" auch 0 steht, obwohl eine Berechnung hätte stattfinden müssen.

Bsp.: 365,28 / 365 = 0

Wie kommt es wohl zu solchen Abweichungen bzw. Nicht-Berechnungen?
Zuletzt geändert von NIQ am 20. August 2015 16:36, insgesamt 1-mal geändert.

Re: CC: Nulldivision

19. August 2015 12:08

Das Feld "Menge/Wert" ist nicht als Decimal definiert, sondern als Integer, da wird dann auf ganze Zahlen gerundet.

Re: CC: Nulldivision

19. August 2015 12:11

Die Variable "Wert/Menge" habe ich als Decimal definiert...

Re: CC: Nulldivision

19. August 2015 12:16

Dann fällt mir noch das Property "DecimalPlaces" ein. Steht da 0:0 drin? Es sollte aber 2:2 sein.

Re: CC: Nulldivision

19. August 2015 12:17

Hallo,

Welchen Typ hat denn "Wert/Menge"?
Ist dein Code- Schnipsel der erste Code im Trigger?
ist der Code evtl. Bestandteil eines WITH- Statements?

Gruß Fiddi

Re: CC: Nulldivision

19. August 2015 12:22

Hallo,

die Stellen sind auch schon auf 2:2

Bei den meisten funktioniert es komischerweise auch.

Das ist der gesamte Code:

Code:
Value Entry - OnAfterGetRecord()

IF ISSERVICETIER THEN
  IF NOT Item.GET("Item No.") THEN
    Item.INIT;

IF "Value Entry"."Invoiced Quantity" <> 0 THEN
  "Wert/Menge" := "Cost Amount (Actual)" / "Invoiced Quantity";


Wenn ich meine Anweisung an den Anfang stelle, passiert das Gleiche.

Welchen Typ hat denn "Wert/Menge"?

Was meinst du genau mit "Typ"?

Re: CC: Nulldivision

19. August 2015 12:33

Was mich auch noch wundert ist, dass wenn ich das Feld "Item.Inventory" hinzufügen möchte, ich immer nur den Wert 0,00 erhalte.

Obwohl schon die Artikelnr. und Beschreibung im Report im gleichen Trigger ausgegeben werden. :-?

Re: CC: Nulldivision

19. August 2015 13:08

Hallo,

bei Cost Amount Actual handelt es sich um ein Flowfield, das muss erst mit CALCFIELD berechnet werden, sonst 0/365 = 0 :-)

Viele Grüße
Mike

Re: CC: Nulldivision

19. August 2015 13:11

"Item.Inventory" ist ebenfalls ein Flowfield, da muss auch CALCFIELDS dazu.

Code:
IF ISSERVICETIER THEN
  IF NOT Item.GET("Item No.") THEN
    Item.INIT;

Was hat hier Item.GET mit CC oder RTC zu tun?

Re: CC: Nulldivision

19. August 2015 13:15

Mike24 hat geschrieben:bei Cost Amount Actual handelt es sich um ein Flowfield,

In den Artikelposten wäre das so, in den Wertposten aber nicht, danach sieht es oben aus.

Re: CC: Nulldivision

19. August 2015 13:16

Code:
IF "Value Entry"."Invoiced Quantity" <> 0 THEN
  "Wert/Menge" := "Cost Amount (Actual)" / "Value Entry"."Invoiced Quantity";


Ändere deinen Code mal bitte so ab. Falls das nicht funktioniert, versuch mal das Feld "Cost per Unit" aus der Tabelle "Value Entry", evtl. reicht das schon.

Mit Typ meine ich den Typ des Feldes wie z.B. Integer oder Decimal, Code,... dein feld sollte den Type Decimal haben, damit es funktioniert.

Das Item.Inventory nicht funktioniert, hängt damit zusammen, dass es das Feld eigentlich gar nicht gibt. Der Inhalt wird auf den Pages bzw. Form zur Laufzeit abhängig von Filterkriterien automatisch berechnet. Will man dieses Feld allerdings im Code verwenden, muss man es mit CALCFIELDS erst berechnen, nachdem man die Filter, falss nötig, gesetzt hat.

@Mike24
"Cost Amount (Actual)" ist im "Value Entry" kein Flow- Field, nur im Artikelposten. :wink:

Gruß Fiddi

Re: CC: Nulldivision

19. August 2015 14:07

NIQ hat geschrieben:Nun habe ich das Problem, dass in manchen Zeilen im Feld "Wert/Menge" auch 0 steht, obwohl eine Berechnung hätte stattfinden müssen.

Bsp.: 365,28 / 365 = 0


Oh - erleben wir hier die Geburt einer neuen Arithmetik? (n/n = 0 für n!=0)

:mrgreen:

Re: CC: Nulldivision

19. August 2015 14:14

Bsp.: 365,28 / 365 = 0

365,28 / 765 = 0,48 sollte dies heißen.
Es erscheint nur 0.

IF "Value Entry"."Invoiced Quantity" <> 0 THEN
"Wert/Menge" := "Cost Amount (Actual)" / "Value Entry"."Invoiced Quantity";

Funktioniert leider auch nicht.

Mit Typ meine ich den Typ des Feldes wie z.B. Integer oder Decimal, Code,... dein feld sollte den Type Decimal haben, damit es funktioniert.

Die Variable "Wert/Menge" habe ich als Decimal definiert...


Trotz
Code:
Item.CALCFIELDS(Inventory);
wird es nicht berechnet.

Re: CC: Nulldivision

19. August 2015 14:35

Funktioniert leider auch nicht.


Was heißt das? Null-Division oder nur 0- Wert?

wenn du das Calcfields mit deinem Code bei einer Classic- Anwendung ausführst, dann ist der Bestand sicherlich 0 (Siehe Kowas Anmerkung)

Gruß, Fiddi

Re: CC: Nulldivision

19. August 2015 14:42

Code:
IF ISSERVICETIER THEN
  IF NOT Item.GET("Item No.") THEN
    Item.INIT;

Warum das so gemacht wurde, weiß ich leider nicht.

Meine Änderungen funktioniert weder im CC noch im RTC.

Auch nicht, wenn ich den Teil rausnehme.

Was heißt das? Null-Division oder nur 0- Wert?

Manche Werte sind korrekt, manche sind falsch, manche sind 0.
Irgendwas läuft bei der Berechnung wohl nicht richtig.
:-?

Alternativ die Null-Divison anders umgehen?

Re: CC: Nulldivision

19. August 2015 14:50

Ich glaube, dass ein Teil deines Problems (die falschen Werte) darin liegt, dass du deine Variable "Wert/Menge" nicht clearst, falls "Invoiced Quantity" = 0 ist. Dann wird natürlich der letzte Wert übernommen.

Re: CC: Nulldivision

19. August 2015 14:59

Hallo,

wenn das mit der Null-Wert- Division jetzt weg ist, dann haben wir ja schon mal das erste Problem beseitigt.
Das die Werte schon mal 0 sind, ist ganz normal, da es auch nicht bei jedem Wert-Posten ein "Cost Amount (Actual)" gibt.
Das Sie falsch sind, hängt sicherlich damit zusammen, das du deine Variable nicht auf 0 setzt, wenn "Invoiced Quantity" =0 ist, dann hast du da noch den Wert vom letzten Durchlauf drinn :wink: .

Der Code für den korrekten Besstand sollte so aussehen:
Code:
IF NOT Item.GET("Item No.") THEN
        Item.INIT;

damit es funktionieren kann.
den anderen Code ändere bitte mal so ab:
Code:
IF "Value Entry"."Invoiced Quantity" <> 0 THEN
  "Wert/Menge" := "Value Entry"."Cost Amount (Actual)" / "Value Entry"."Invoiced Quantity"
else
  "Wert/Menge" :=0;


Hast du schon das Feld "Cost per Unit" ausprobiert?

Gruß Fiddi

Re: CC: Nulldivision

19. August 2015 15:01

NIQ hat geschrieben:
Code:
IF ISSERVICETIER THEN
  IF NOT Item.GET("Item No.") THEN
    Item.INIT;

Warum das so gemacht wurde, weiß ich leider nicht.
Meine Änderungen funktioniert weder im CC noch im RTC.
Auch nicht, wenn ich den Teil rausnehme.

Nicht alles, aber die erste Zeile muss auf jeden Fall entfernt werden, wenn man Feldinhalte vom Artikel benötigt, gilt das GET immer für beide Clients.
Das Item.INIT verhindert dann , dass die Werte vom letzen gelesenen Artikeldatensatz gelöscht werden, falls der Artikel des aktuellen Lesevorgangs nicht (mehr) vorhanden ist. Sonst besteht immer die Gefahr, den Wert des letzen zu verarbeiten, den man gefunden hat, auch wenn man aktuell nichts gefunden hat.

Re: CC: Nulldivision

19. August 2015 15:19

Vielen Dank schon mal für eure Ratschläge!

Ich habe nun den folgenden Code:

Code:
Value Entry - OnAfterGetRecord()

Item.CALCFIELDS(Inventory);
 
IF NOT Item.GET("Item No.") THEN
  Item.INIT;

IF "Value Entry"."Invoiced Quantity" <> 0 THEN
  "Wert/Menge" := "Value Entry"."Cost Amount (Actual)" / "Value Entry"."Invoiced Quantity"
ELSE
  "Wert/Menge" :=0;


Leider wird mir der Lagerbestand noch nicht angezeigt.

Bezüglich der Werte habe ich 2 Beispiele:

5106,55 / 969 = 5,269917440660475
Bei mir kommt 5,50 raus. Können solche Rundungsdifferenzen entstehen?

1325,59 / 115 = 11,52686956521739
Bei mir kommt 0 raus.

Re: CC: Nulldivision

19. August 2015 15:25

Hallo,

damit du den Lagerbstand berechnen kannst, musst du den Artikel erst einmal lesen. Das Calcfields muss also hinter dem Lesen des Artikels kommen :-? .

Kann es sein, das du bei deinen Vergleichen Artikelposten mit Wertposten vergleichst?

Gruß Fiddi

Re: CC: Nulldivision

19. August 2015 15:27

NIQ hat geschrieben:
Code:
Value Entry - OnAfterGetRecord()

IF NOT Item.GET("Item No.") THEN
  Item.INIT;

Item.CALCFIELDS(Inventory);...



Eher so: Du willst ja das inventory des aktuellen items wissen.

(Wie fiddi ja schon (schneller) schrub)

Re: CC: Nulldivision

19. August 2015 15:39

damit du den Lagerbstand berechnen kannst, musst du den Artikel erst einmal lesen. Das Calcfields muss also hinter dem Lesen des Artikels kommen


Sorry falsch kopiert, funktioniert aber auch nach dem lesen nicht. Der Lagerbestand bleibt immer bei 0,00.

Ich teile den Wert 1325,59 "Cost Amount (Actual) durch 115 "Invoiced Quantity"

Kommt aber 0 raus. :-?

Re: CC: Nulldivision

19. August 2015 15:50

Ich teile den Wert 1325,59 "Cost Amount (Actual) durch 115 "Invoiced Quantity"


Woher hast du die Werte mit denen du vergleichst, und hast du mit dem Debugger an der Stelle gestoppt, um die tatsächlich gelesenen Werte zu prüfen?

Dein Code sollte dann etwa wie folgt aussehen:

Code:
Value Entry - OnAfterGetRecord()

 
IF NOT Item.GET("Value Entry"."Item No.") THEN
  Item.INIT;

Item.CALCFIELDS(Inventory);

IF "Value Entry"."Invoiced Quantity" <> 0 THEN
  "Wert/Menge" := "Value Entry"."Cost Amount (Actual)" / "Value Entry"."Invoiced Quantity"
ELSE
  "Wert/Menge" :=0;


ist das wirklich der ganze Code aus dem "OnAfterGetRecord"- Trigger, den du hier geposted hast?


Gruß Fiddi

Re: CC: Nulldivision

19. August 2015 16:39

ist das wirklich der ganze Code aus dem "OnAfterGetRecord"- Trigger, den du hier geposted hast?


Jap, genau so!

Verstehe nicht, warum mir der Lagerbestand nicht angezeigt wird.

Die Werte aus der Value Entry Tabelle werden ja auch irgendwo berechnet!?

Ich vermute, dass es diesbezüglich zu den Problemen kommt...

Der Report beinhaltet noch folgendes Filter:

Code:
Report - OnPreReport()
VendFilter := Vendor.GETFILTERS;
ItemLedgEntryFilter := "Value Entry".GETFILTERS;
PeriodText := "Value Entry".GETFILTER("Posting Date");

Re: CC: Nulldivision

19. August 2015 17:49

Also,

nachdem was wir hier schon alles versucht haben, muss es da ein generelles Problem mit dem Bericht geben. Ohne diesen Bericht als ganzes zu sehen, kommen wir da nicht weiter.

Gruß Fiddi