Berechnung mit Wert aus vorhergehendem Datensatz ausführen

13. Februar 2007 11:09

Hallo Leute,

habe folgendes Problem.

Ich habe eine Tabelle: In diese werden immer mit dem Key "No." und "KUNUMMER" DAtensätze eingefügt. Dabei wird eine Feld "Zaehler" Automatisch um 1 hochgezählt.

Es gibt die Felder "Eingang", "Ausgang" und "Bestand". Der Bestand soll immer den aktuelle Lagerbestand anzeigen.

Was ich nun brauche ist eine Funktion die mir pro "No." und "KUNUMMER" immer den letzten Bestand holt und mit diesem den aktuelle Wert errechnet. Momentan habe ich es eben so das er mir zwar für die aktuelle Zeile den Bestand schön errechnet, es könnte aber auch sein das es bereits einen Datensatz gibt wo der Bestand verringert oder erhöht wurde.

Ich will also z.B. beim einfügen eines neuen Datensatz "Eingang: 100)" Die berechnung haben das er eine Zeile oben drüber nachsieht wie den eigentlich der Bestand ist bei dem Kunden und dann die Berechnung macht und dann den neuen Satz einfügt.

Die Berechnung habe ich natürlich schon drin, also Eingang - Ausgang = BEstand. Mir geht es wie gesagt nur darum den bestandswert aus der Zeile darüber zu greifen für den jeweiligen Kunden.

Die Tabelle ist so eine Art Buchungstabelle und soll Auskunft überdie Lagerbewegungen und BEstände geben...

Wäre klasse wenn mir da jemand weiterhelfen könnte!
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

13. Februar 2007 11:21

Hallo mit
>> Recored.NEXT(-1); <<
kannst du auf den vorherigen Datensatz zugreifen

13. Februar 2007 11:26

Aha und jetzt auch mein beispiel bezogen?

Wie ziehe ich mir den Wert aus dem Feld Bestand aus der vorhergehenden Zeile?

Muss ich das mit einem GET machen?

13. Februar 2007 11:49

Mit >> record.next(-1)<< steht die der Satzzeiger auf dem vorherigen Datensatz. Wenn du jetzt Bestand = Eingang - Ausgang berechnest am besten mit eigenen Variablen zb xBestand = xEingang - xAusgang hast den Bestand vom obrigen Datensatz.

13. Februar 2007 13:02

Habe das jetzt mal so eingebaut in den Onvalidate von meinem Feld eingang, das Problem ist aber das er mir die werte des obigen datensatzes einträgt beim insert...

Ich will lediglich das Bestandsfeld vom darüber liegenden DAtensatz holen...

Code:
INIT;
NEXT(-1);
xBestand := Bestand;
xEingang := Eingang;
xAusgang := Ausgang;
xBestand := xEingang - xAusgang;
NEXT(+1);
Bestand := xBestand;


Ist was an meinem Code falsch???

13. Februar 2007 13:47

In der Zeile
--> Bestand := xBestand;
überschreibst du denn aktuellen Bestand mit dem voherigen. Was willst du eigentlich in dieser Zeile machen?

13. Februar 2007 14:06

Juergen_G hat geschrieben:In der Zeile
--> Bestand := xBestand;
überschreibst du denn aktuellen Bestand mit dem voherigen. Was willst du eigentlich in dieser Zeile machen?
Hallo Jürgen,

na ich möchte in meiner aktuellen Zeile den Bestand einfügen (aus der vorhergehenden Zeile) der durch die Berechnung entsteht.

13. Februar 2007 14:13

tesarolle hat geschrieben:Habe das jetzt mal so eingebaut in den Onvalidate von meinem Feld eingang, das Problem ist aber das er mir die werte des obigen datensatzes einträgt beim insert...

?


Ich kann den Fehler nicht ganz nachvollziehen. Was passiert wann, und was läuft nicht so wie du es willst?

13. Februar 2007 14:23

tesarolle hat geschrieben:na ich möchte in meiner aktuellen Zeile den Bestand einfügen (aus der vorhergehenden Zeile) der durch die Berechnung entsteht.


Ich denke, du musst dir eine Record-Variable anlegen von jener Tabelle, von der du die Werte lsesen willst. Dann filterst du diese Tabelle entsprechend den Anforderungen und positionierst mit FIND('+') auf den letzten Datensatz. Dann hast du alles was du brauchst, und kannst die Werte in deinen neuen Datensatz übernehmen.

13. Februar 2007 14:55

rotsch hat geschrieben:
tesarolle hat geschrieben:na ich möchte in meiner aktuellen Zeile den Bestand einfügen (aus der vorhergehenden Zeile) der durch die Berechnung entsteht.


Ich denke, du musst dir eine Record-Variable anlegen von jener Tabelle, von der du die Werte lsesen willst. Dann filterst du diese Tabelle entsprechend den Anforderungen und positionierst mit FIND('+') auf den letzten Datensatz. Dann hast du alles was du brauchst, und kannst die Werte in deinen neuen Datensatz übernehmen.
Hallo Rotsch,

ich glaube Deine Idee ist besser.

Wie kann ich das konkret machen.

Ich will auf die aktuelle No und Kunummer filtern (siehe TAbelle obe) und dann auf den Satz wo die Zaehler nummer am größten ist(das ist ja ann automatisch der letze satz). Dann will ich aus diesem Datensatz den Wert aus dem Feld "Bestand" in eine Variable schreiben.

Dann muss ich den Filter wiedder auflösen.

Wie muss ich das konkret vom Quellcode umsetzen? Ich brauche keine REcord variable da das feld in der gleichen t abelle ist!

13. Februar 2007 17:34

DOCH, Du brauchst eine Recordvariable, die auf die gleiche Tabelle zeigt, weil DU dir sonst den boden unter den füssen wegziehst, wenn du Rec.NEXT(-1) ausführst.

13. Februar 2007 17:45

Michael Schumacher hat geschrieben:DOCH, Du brauchst eine Recordvariable, die auf die gleiche Tabelle zeigt, weil DU dir sonst den boden unter den füssen wegziehst, wenn du Rec.NEXT(-1) ausführst.
Hallo Michael,

ja das habe ich ja auch vor. Die Variable habe ich schon, ich weiss nur nicht wie ich das mit dem Setfilter anstellen soll (siehe letzter Post von mir).

13. Februar 2007 18:22

na, du musst auf der Recordvariablen die gleichen Filter anwenden wie auf der aktuellen Tabelle und mit find(+) oder mit findlast, wenn du 4SP1 oder höher hast, dann auf den letzten Eintrag gehen, aus dem kannst du die Werte auslesen.

13. Februar 2007 18:40

Hallo Michael,

ich glaube wir reden aneinander vorbei :-)

Ich bin absoluter Newbie, wie man eine Recordvariable macht weiss ich noch gerade so, aber das abfiltern weiss ich nicht. Ich brauche da ein konkretes Beispiel.

Wenn ich das alles wüßte, würde ich vermutlich auch hier keine Hilfe benötigen.

So leicht ist es eben für mich leider nicht (:-

Ein Beispiel oder ein Ansatz für eine Lösung (am besten noch bezogen auf mein konkretes Problewm) würde mir weiter helfen...!

13. Februar 2007 19:22

filter setzen kannst du mit den Befehlen Setfilter und Setrange, die Syntax ist sehr ausführlich in der Onlinehilfe beschrieben.

Im Übrigen scheint mir da ein Denkfehler in deinem Vorhaben zu sein.
Du willst im vorherigen Datensatz nachsehen, wie hoch der Bestand ist (Inhalt eines echten Feldes!!!) und dann aus dem neuen Datensatz den Eingang hinzuzählen und den Ausgang abziehen, den neuen Bestand berechnen und fest in das Feld schreiben, richtig?
Und jetzt stell Dir mal vor, das machen 2 Leute gleichzeitig, da stimmt doch dann keine Summe mehr.
Ausserdem, warum so Umständlich? die Artikeltabelle hat doch alles was du brauchst? den Bestand kannst du im Flowfield auf der Artikelkarte ablesen und die Bewegung steht im Artikelposten, kannst du direkt mit Drilldown auf dem Bestandsfeld sehen.
Und wenn irgendwas gegen den Artikel spricht, kannst du dir bei dessen Programmierung ansehen, wie man das macht mit der Bestandsberechnung.