Dieses Szenario ist gar nicht selten. Und es ist äusserst löblich, dass diese Frage überhaupt gestellt wird. Tatsache ist, dass in vielen Fällen eine Berechnung erst dann "legale" Resultate produziert, wenn alle Eingabewerte auch "legal" sind.
Die Implementierung ist mit JavaScript, aber es ist nicht sooo kompliziert.
Ganz allgemein wird in der Berechnung zuerst geprüft, ob der Eingabewert gültig und "legal" ist, und zwar für alle Eingabewerte. Wenn es nur darum geht, einen Wert zu haben, dann ist jeder Wert, welcher NICHT dem Default-Wert entspricht, gültig. Erst wenn diese Bedingung für alle Eingabewerte stimt, wird die Berechnung durchgeführt.
In Pseudocode sieht das so aus:
if (this.getField("Eingabe1").value != this.getField("Eingabe1").defaultValue && this.getField("Eingabe2").value != this.getField("Eingabe2").defaultValue) {
// Code für Berechnung
} else {
// nichts oder Code wenn keine Berechnung erfolgt
}
Hinweis: Die Zeile beginnend mit if ist eine sehr lange Zeile, und sie geht bis zur geschweiften Klammer
Wenn das ganze nun in einer Tabelle, zum Beispiel der erwähnten Bestelliste eingebaut werden soll, ist es äusserst empfehlenswert, den ganzen Berechnungscode für diese Tabelle in ein einziges Script zusammenzufassen. Damit wird die Berechnung schneller und sie ist besser zu kontrollieren.
Damit nun der Totalpreis nur dann erscheint, wenn tatsächlich eine Zeile gültig ist, kann eine Vereinfachnung gemacht werden. Die Berechnung für das Zeilentotal ist wie oben gezeigt zu schützen. Zusätzlich ist nun noch ein Zähler einzuführen, welcher ursprünglich 0 ist, aber für jede Zeile mit gültiger Berechnung erhöht wird. Für die Berechnung des Totals wird dann geprüft, ob der Zähler grösser als null ist; wenn ja, wird addiert, sonst nicht. (der Umweg über den Zähler erlaubt auch die Eingabe von Artikeln zum Preis 0; in diesem Fall ist 0 ein legaler Wert, wenn er aus der Zeilenberechnung resultiert).
Es ist mir klar, dass dies sehr theoretisch klingt. Für ein konkretes Besipiel müssten entsprechende Vorgaben gemacht werden.
HTH.
Max Wyss.
als Antwort auf: [#497807]