Preisstaffel per JavaScript abfragen

muellermanfred

muellermanfred

Aktives Mitglied
Thread Starter
Dabei seit
19.04.2007
Beiträge
2.744
Reaktionspunkte
184
Moin Gemeinde!

Ich bastele gerade ein Bestellformular, das am Bildschirm ausgefüllt und dann gedruckt und gefaxt werden soll.

Bei den meisten Positionen komme ich mit den einfachen Kalkulationsfunktionen aus, einige jedoch erfordern die Berücksichtigung einer Mengenstaffel.

Ich habe in jeder Zeile 3 Felder: "itemX" (Einzelpreis), "quantX" (Eingabefeld Bestellmenge) und "totalX" (Ergebnis von (itemX*quantX)), wobei "X" natürlich durch eine eindeutige Zahl ersetzt wird.

Meine Idee war, das Feld für den Einzelpreis der Mengenstaffel durch ein Skript zu befüllen:

Code:
var q2 = this.getField("quant2");


if (q2<=9) {

 num2 = 11.28;

} else if (q2>=10 && q2<=19) {

 num2 = 10.56;

} else if (q2>=20) {

 num2 = 10.08;

} else {

 num2 = 0;

}



event.value = num2;

Ich hole also den Wert aus "quant2", lasse mit der if-Schleife entscheiden, wie der gültige Einzelpreis auszusehen hat und weise ihn "num2" zu. Mit der letzten Zeile möchte ich "item2" den Wert von "num2" geben.

Nun passiert ... nichts.

Kann mir jemand sagen, was ich falsch mache?

1000 Dank schonmal für jede Antwort!

Manfred
 
Wenn ich's einfacher machen will, lasse ich das direkt in "total2" berechnen:

Code:
var q2 = this.getField("quant2");


if (q2<=9) {

 num2 = 11.28;

} else if (q2>=10 && q2<=19) {

 num2 = 10.56;

} else if (q2>=20) {

 num2 = 10.08;

} else {

 num2 = 0;

}



event.value = (num2*q2);

Aber dann krieg' ich 'ne Fehlermeldung:

"The value entered does not match the format of the field [ total2 ]."

:confused:
 
Sorry für's pushen ... aber heute rollt mein Kopf. :rolleyes:
 
ich bin ne Javascript-Niete ( komme irgendwie mit Javascript nie klar). Immer wenn ich mich doch mal nativ damit auseinandersetzen muß, nehme ich als Inspiration SelfHTML zur Hilfe und vor allem nutze ich die Fehlerkonsolen von Opera oder FireFox um zu sehen wo es gegen die Wand fährt!

Ich könnt mir hier z.B. denken das eine var-Definition von num2 helfen köönte, denn num2 ist ja sonst nur lokal in den jeweiligen if-clauses (If ist keine Schleife :motz: ) vorhanden und somit ggf. danach wieder undefiniert!
 
Ich könnt mir hier z.B. denken das eine var-Definition von num2 helfen köönte, denn num2 ist ja sonst nur lokal in den jeweiligen if-clauses (If ist keine Schleife :motz: ) vorhanden und somit ggf. danach wieder undefiniert!

Schleife oder nicht (Du hast auf jeden Fall recht) - num2 ist doch abhängig vom Wert im Feld "quant2" und darum ein Ergebnis, das kann ich doch vorher gar nicht definieren ... :kopfkratz:

Tscha ...

Ich würde ohnehin zu Variante 2 tendieren, also nicht den Wert erst in ein hidden-feld schreiben und dann auslesen, sondern die Berechnung direkt im Summenfeld durchführen.
 
num2 ist doch abhängig vom Wert im Feld "quant2" und darum ein Ergebnis, das kann ich doch vorher gar nicht definieren

Das eine ist die Deklaration, das andere die Initialisierung! Du deklarierst nie und deshalb endet ggf. Deine implizite Deklaration am Ende des If-Blockes, sprich die Variable existiert nicht mehr wenn Du rechnest. Das ändert sich, wenn Du sie einfach vorher als


var num2;

deklarierst. Dann existiert sie auch später noch.
 
  • Gefällt mir
Reaktionen: muellermanfred
Abhängig ja, aber global nicht sichtbar. Das kannst du ja erreichen, indem du außerhalb der if-Schleife
var num2;
deklarierst. Musst ihr ja keinen Wert zuweisen.

Edit: Zwei Verrückte, ein Gedanke. :hehehe:
 
  • Gefällt mir
Reaktionen: muellermanfred
Okay, ich tu alles. :D

Hier die Kalkulation, wie sie nun in "item2" steht:

Code:
var q2 = this.getField("quant2")
var num2;

if (q2<=9) {

 num2 = 11.28;

} else if (q2>=10 && q2<=19) {

 num2 = 10.56;

} else if (q2>=20) {

 num2 = 10.08;

} else {

 num2 = 0;

}



event.value = ((num2*q2).toFixed(2));

"this" soll ausdrücken, daß das aktuelle Dokument gemeint ist, "event" soll ausdrücken, daß der Wert des aktuellen feldes definiert werden soll. Hab' ich so aus einem Tutorial ... :hum:

Es klappt ... nicht. "total2" berechnet das Produkt aus "item2" und "quant2", steht in der calculation order NACH "item2", bleibt aber bei "0,00" ...

Hier die Meldung des Debuggers:

Code:
Acrobat JavaScript Debugger Functions Version 6.0
Acrobat EScript Built-in Functions Version 6.0
Acrobat Annotations / Collaboration Built-in Functions Version 6.0
Acrobat Multimedia Version 6.0

ReferenceError: item2 is not defined
1:Field:Calculate
ReferenceError: item2 is not defined
1:Field:Calculate
ReferenceError: item2 is not defined
1:Field:Calculate
ReferenceError: item2 is not defined
1:Field:Calculate
 
Zuletzt bearbeitet:
Noch 'ne Variation:

Code:
[B]item2[/B].value = ((num2*q2).toFixed(2));

Kein Ergebnis; "total2" bleibt bei "0,00" ...
 
verwende doch mal ein paar Alert() als debugger oder wirf eine der angesprochenen Konsolen an!
 
verwende doch mal ein paar Alert() als debugger oder wirf eine der angesprochenen Konsolen an!

Ich danke Dir sehr, aber ich fürchte, Du überforderst mich.

Hab jetzt wieder alles in "total 2" stehen:

Code:
var q2 = this.getField("quant2")
var num2 = 0;


if (q2<=9) {

 num2 = 11.28;

} else if (q2>=10 && q2<=19) {

 num2 = 10.56;

} else if (q2>=20) {

 num2 = 10.08;

} else {

 num2 = 0;

}



event.value = ((num2*q2).toFixed(2));

Da ich ständig fehlermeldungen bezüglich des Formats erhielt, habe ich nun "quant2" auf Ganzzahlen ohne dezimalstellen formatiert und "total2" ohne Formatierung, da die letztendliche berechnung eh 'ne kaufmännische Rundung enthält (".toFixed(2)"). Ergebnis siehe screenshot:


"NaN" ????? :confused:

EDIT:

"NaN" bedeutet einfach "Not a Number" ... das Feldformat ist also falsch.
 

Anhänge

  • NaN.png
    NaN.png
    10 KB · Aufrufe: 97
Zuletzt bearbeitet:
NaN heißt: Not a Number ( keine Zahl):
 
So, hier das aktuelle Skript in "total2":

Code:
var q2 = this.getField("quant2")
var num2 = 0;


if (q2<=9) {

 num2 = 11.28;

} else if (q2>=10 && q2<=19) {

 num2 = 10.56;

} else if (q2>=20) {

 num2 = 10.08;

} else {

 num2 = 0;

}



document.total2.value = ((num2*q2).toFixed(2));

Und das sagt der Debugger dazu:

Code:
25:Field:Calculate
TypeError: this.total2 has no properties
25:Field:Calculate
ReferenceError: document is not defined
25:AcroForm:total2:Calculate
ReferenceError: document is not defined
25:AcroForm:total2:Calculate
ReferenceError: document is not defined
25:AcroForm:total2:Calculate
ReferenceError: document is not defined
25:AcroForm:total2:Calculate

Ändere ich "document" in "this", sagt der Debugger zur letzten Zeile:

Code:
TypeError: this.total2 has no properties
25:Field:Calculate
TypeError: this.total2 has no properties
25:Field:Calculate
 
In ner HTML-Seite schon. Aber ich glaube nicht, dass Acrobat nach dem DOM arbeitet. Oder doch? :noplan:
 
Da Javascript aber Objektorientiert arbeitet muß es doch ein vergleichbare DOM Darstellung und Dokumentation dazu geben!?
 
  • Gefällt mir
Reaktionen: muellermanfred
Da Javascript aber Objektorientiert arbeitet muß es doch ein vergleichbare DOM Darstellung und Dokumentation dazu geben!?

Klar gibt es das. Ich lese gerade das hier:

Nein, ich verstehe es nicht auf Anhieb. Ja, ich bleibe am Ball ... :D

EDIT:
Bis jetzt kann ich keinen Fehler entdecken; die Objekte und Methoden wurden alle richtig eingesetzt. Hier der aktuelle Stand:

Code:
var q2 = this.getField("quant2");
var num2;


if (q2<=9) {

 num2 = 11.28;

} else if (q2>=10 && q2<=19) {

 num2 = 10.56;

} else if (q2>=20) {

 num2 = 10.08;

} else {

 num2 = 0;

}



event.value = ((num2*q2).toFixed(2));

Wenn ich eine Ausgabe kriege, dann "NaN", sonst nichts ...
 
Zuletzt bearbeitet:
Bingo!

So geht's:

Code:
var quant2 = this.getField("quant2")
var q2 = quant2.value
var num2;


if (q2<=9) {

 num2 = 11.28;

} else if (q2>=10 && q2<=19) {

 num2 = 10.56;

} else if (q2>=20) {

 num2 = 10.08;

} else {

 num2 = 0;

}



event.value = ((num2*q2).toFixed(2));

Ich muß also erst auf das Feld zugreifen und dann eine Variable aus dem Wert des Feldes erzeugen ... Puh!

Danke für euer Interesse, Jungs! Ihr seid eine große Stütze! :)
 
Zurück
Oben Unten