Wie kriege ich ne Summe in js aus Textfeld

Liebe/-r Experte/-in,
ich habe ein dynamisches Formular.
In dem Formular gibt es jeweils ein Textfeld Menge und ein Feld Preis und das Ganze mit
preis1, preis2, preis3 usw.
Nun möchte ich das Ganze aufsummieren.

var gesamtsumme=0;
function Gesamt(teilsumme)
{
if(document.getElementById(„gesamtsumme“).value==„wird berechnet …“)
gesamtsumme=teilsumme;
else
{
var gesamtsumme = document.getElementById(„gesamtsumme“).value;
var gesamtsumme=parseFloat(gesamtsumme)+parseFloat(teilsumme);
}
alert(gesamtsumme);
document.getElementById(„gesamtsumme“).value=gesamtsumme; }
function teilsumme_berechnen(posnr)
{
var aktuellenr=„menge“+posnr;
var menge=parseInt(document.getElementById(aktuellenr).value);
var aktuellerpreis=„einzelpreis“+posnr;
var einzelp=parseFloat(document.getElementById(aktuellerpreis).value);
// alert(einzelp);
var teilsummex=einzelp*menge;
var xyz=„teilsumme“+posnr;
parseFloat(document.getElementById(xyz).value=teilsummex);
Gesamt(teilsummex);
}

Also ich lese Menghe und preis aus und bei onchange summiert er mir eine Teilsumme auf und zum Scgkuss ruft er die Funktion Gesamt auf, wo er die Einzelnen Summe zu einer Endsumme zusammenpackt.

Nun kommt der Haken:
Ändere ich eine Wert, nimmt er den vorherigen Wert aus dem Gesamtfeld und dann packt er die neuen Werte dazu.
Es müsste also sowas wie einen Reset geben.

Bsp.:
2 Blöcke mit
Menge1: 1 und Preis1 2
Menge2: 13 und Preis2 5
Rauskommen tutda korrekt 67

Ändere ich nun zB Menge2 von 13 zu 3 müsste da 17 rauskommen. Aber die gesammtsumme merkt sich fälschlicherweise die 67 und packt die 17 obendrauf (=84).
Einfach alle Felder aufsummieren kann ich nicht, da die Felder am Anfang noch leer sind.
Any idea? Danke für Deine Mühe. Vielleich habe ich auch eine völlig falschen Ansatz. ich vermute mal der falsche Ansatz ist das gesamtsumme=gesamtsumme+preisx;

Ist ein Array eine Lösung? also alles ins array rein und dann aufsummieren? Grübel Grübel Grübel.

Hallo,

ohne mir das jetzt näher angeschaut zu haben, würde ich sagen, dass es reicht, wenn Du die Zeile „var gesamtsumme=0;“ zusätzlich als oberstes in Deine Funktion schreibst. Damit „resettest“ Du ja quasi den Wert.

Viele Grüße,

Thorsten

Also ich blicke nicht ganz durch was du mit diesem Code anstellen willst. Wieso machst du nicht einfach Gesamtsumme=Preis1*Menge1+Preis2*Menge2+Preis3*Menge3? Dann hast du keinerlei Probleme mit bisherigen Werten.

Zusatz zur vorherigen Antwort: Ich habe gerade erst deinen Schlusssatz gesehen „alles aufsummieren geht nicht da Felder leer“. Wieso denn nicht? Du musst einfach dafür sorgen dass „leer“ mit 0 berechnet wird.

Hi Oliver,

warum kannst du nicht alle Felder aufsummieren? Prüfe doch einfach vorher, ob ein Feld leer bzw. sein Inhalt eine gültige Zahl ist, bevor du den Inhalt mit dazu rechnest.

MfG
Detlef

Hi,
danke für Deine superschnelle Antwort!
So hatte ich es auch.
Aber dann macht er mir die Teilwerte jedesmal leer.
Gruß
Oliver

Hi,
danke für Deine superschnelle Antwort.
Also :
Als Ausgang habe ich zB 3 Sätze an Feldern.
Als Zwischenpreis und Gesamtpreis habe ich den String „wird berechnet…“ im Textfeld stehen.

Ich gebe die 1. Menge ein und den 1. Einzelpreis.
Daraus errechnet er mir den 1. Zwischenpreis. In dieser einen Ausnahme ist der 1. Zwischenpreis = dem Gesamtpreis.
Dann gebe ich die 2. Menge ein und den 2. Preis
und habe einen 2. Zwischenpreis.

Die Summe der zwischenpreise ist die Gesamtsumme. Ich rufe jedesmal die Unterfunktion teilsumme_berechnen auf.
In der Funktion wird ganz zu letzt die Gesamtsumme aufgerufen und die zwischensumme dazugepackt.
Klappt, solange ich keine Werte wieder ändere.
Weil ich könnte ja wert 1 eingeben auslösen und dann den wert ändern…

Wie und wann rufe ich die Funktion Gesamt() auf?
Normal müsste ich irgendwie bei jedem Aufruf der teilsumme_berechnen() die Gesamtsumme neu berechnen.
Nur ist beim Ausfüllen der ZB 1.Blocks der zweite und dritte noch leer.
Oder geht sowas wie if(document.Getelementbyid(zwischenpreis1).value!=„wird_berechnet“)
Und dann isn array packen.
Weil sonst müsste ich alle kombinationen durchprobieren.

Hi,
danke für Deine superschnelle Antwort.
Hm, aber wie? Prüfen uns ins array packen?

Gruß
Oliver

Wenn du drei Zeilen hast, dann mach folgendes:

function UpdateFields()
{
zsum1=menge1*anz1;
zsum2=menge2*anz2;
zsum3=menge3*anz3;
gessum=zsum1+zsum2+zsum3;
}

Statt menge1 usw. musst du natürlich getElementById, parseInt, parseFloat usw. einsetzen.
Z.B so:
var menge1str=document.getElementById(‚feld_menge1‘).value;
var menge1=0;
if(isNumeric)
menge1=parseInt(menge1str);
Bei onchange in jedem der Felder rufst du diese Funktion auf. Abfragen wie „wird berechnet“ usw. brauchst du nicht.
Wenn die Anzahl der Zeilen dynamisch ist, musst du halt das gleiche für die JS Funktion machen.

Hallo Oliver,

du könntest versuchen die gesamtsumme auf 0 zu setzten bevor du die Teilsumme neu brechnest. Allerdings kommt das ein wenig darauf an wie du die funktion teilsumme_berechnen aufrufst.

Gruß,
Olaf

servus!

wie wäre es mal die gesamtsumme auf 0 zu schreiben?

denn irgendwie ist
var gesamtsumme=parseFloat(gesamtsumme)+parseFloat(teilsumme);

das u.a. dein problem…
du rechnest auf die gesamtsumme nochmal die teilsumme und weist sie der gesamtsumme zu.
mir ist shcon klar warum das passiert :smile:

denn… erster durchlauf…
0 + 67 = 67
zweiter durchlauf
67+17 = 84
etc. etc.

grüße

Hallo,

Wenn dein Code beim ersten mal funktioniert und beim zweiten Durchlauf fehlerhaft rechnet könnte es an den Variablen liegen…

Packe jede Variable aus deinem JS-Code ganz oben hin
wie
var gesamtsumme=0;
und initialisiere alle Variablen mit NULL.

Du solltest auch String und Zahlen nicht mischen!!
var aktuellerpreis=„einzelpreis“+posnr;

Auch sehe ich hier ein Textfeld das genauso heißt wie die Variable 3 Zeilen höher…
var einzelp=parseFloat(document.getElementById(aktuellerpreis).value)

Wenn du willst kannst du mir die html Datei in der alles drin ist mal mailen, falls du es nicht hinbekommst.

[email protected]

MfG

Nicky

Hi Olaf,
ich habe mehrere Blöcke. Und jedesmal bei onchange rufe ich die Teilsummen Funktion auf.

Block 1:
menge1
einzelpreis1 -> Aufruf der Teilsumme mit onchange
gesamtpreis1

Block 2:
menge2
einzelpreis2 -> Aufruf der Teilsumme mit onchange
gesamtpreis2

Block 3:
menge3
einzelpreis3 -> Aufruf der Teilsumme mit onchange
gesamtpreis3

Auf 0 setzten klingt gut. Aber wie und wo? Weil wenn ich es zu Anfang der Telsumme mache habe ich immer nur die Teilsumme als gesamtwert.

Hi ,
ich habe mehrere Blöcke. Und jedesmal bei onchange rufe ich die Teilsummen Funktion auf.

Block 1:
menge1
einzelpreis1 -> Aufruf der Teilsumme mit onchange
gesamtpreis1

Block 2:
menge2
einzelpreis2 -> Aufruf der Teilsumme mit onchange
gesamtpreis2

Block 3:
menge3
einzelpreis3 -> Aufruf der Teilsumme mit onchange
gesamtpreis3

Auf 0 setzten klingt gut. Aber wie und wo? Weil wenn ich es zu Anfang der Telsumme mache habe ich immer nur die Teilsumme als gesamtwert. Vielleicht mit nem Array oder nem Zähler… Und dann alle Teilsummen abfragen. Aber dann gibst auch Probleme, weil die ja beim 2. Durchlauf noch leer, bzw mit „wird berechnet“ gefüllt sind.

Hi Nicky,
gesamtsumme=0. Aber wo udn wie? Wenn ich zu Anfang mache, habe ich immer nur die Zwischensumme als wert.
Gesamtsumme=0
Teilsumme1=24
gesamtsumme+teilsumme=24

Gesamtsumme=0
Teilsumme2=36
gesamtsumme+teilsumme=36

Strings und zähler habe ich absichtlich gemsicht, da ich die Anzahl der Blöcke flexibel habe.
So erzeuge ich Variablen, also var zwischensumme1, zwischensumme2 usw.

Danke für Dein Angebot.Wenns gar nicht geht, melde ich mich tatsächlich. :smile:

Gruß
Oliver

OK,wenn es eine belibige anzahl an Blöcken gibt dann würde ich das so machen:

function update() {
var sum = 0;
var fields = document.getElementsByTagName(„input“);

for (var i = 0; i < fields.length; i++) {
var num = parseInt(fields[i++].value);
var preis = parseFloat(fields[i].value);

if(num > 0 && preis > 0) {
sum = sum + (num * preis);
}
}
document.getElementById(‚gesamtsumme‘).innerHTML = sum;
}

pos: preis_pos:

pos: preis_pos:

pos: preis_pos:

pos: preis_pos:

pos: preis_pos:

pos: preis_pos:

pos: preis_pos:

Sum:

Hi Oliver,

am einfachsten prüfst du den Feldinhalt mit etwas wie

!isNaN(parseFloat(a));

wobei a den Feldinhalt darstellen soll. Das Konstrukt liefert true, wenn a eine gültige Zahl (inkl. Null) ist und false, wenn a keine Zahl (oder eben leer) ist.

Damit kannst du eine Abfrage bauen, wie

if (!isNaN(parseFloat(a))) {
sum = sum + a;
}

Ob du das ganze in ein Array packst, ist davon unabhängig. Wichtig ist, dass vor jeder neuen Addition die Variable sum auf 0 gesetzt wird.

MfG
Detlef

Hi,
wenns interessiert. Ich habs gelöst. Kleiner Haken war noch die variable Anzahl von Positionen. Daher hatte ich keine festen Variablennamen und musste diese erst generieren.

function Gesamt(anzahlpos)
{
var wirdberechnet=„wird berechnet …“;
gesamtsumme_array=new Array();

for(var f=1;f<=anzahlpos;f++)
{
var zwischenvarnummer=„teilsumme“+f;
if(document.getElementById(zwischenvarnummer).value != wirdberechnet)
var zwischenvar=parseFloat(document.getElementById(zwischenvarnummer).value);
else
var zwischenvar=0;
gesamtsumme_array[f]=parseFloat(zwischenvar);
}
Array.prototype.array_add = function() {
return eval(this.join("+"));
};
var gesamtsummesa = gesamtsumme_array.array_add();
document.getElementById(„gesamtsumme“).value= gesamtsummesa;
}
function teilsumme_berechnen(posnr,wievielepos)
{
var aktuellenr=„menge“+posnr;
var menge=parseInt(document.getElementById(aktuellenr).value);
var aktuellerpreis=„einzelpreis“+posnr;
var einzelp=parseFloat(document.getElementById(aktuellerpreis).value);
var teilsummex=einzelp*menge;
var xyz=„teilsumme“+posnr;
parseFloat(document.getElementById(xyz).value=teilsummex);
Gesamt(wievielepos);
}

Danke für Deine Hilfe!!
Gruß

Hi,
wenns interessiert. Ich habs gelöst. Kleiner Haken war noch die variable Anzahl von Positionen. Daher hatte ich keine festen Variablennamen und musste diese erst generieren.

function Gesamt(anzahlpos)
{
var wirdberechnet=„wird berechnet …“;
gesamtsumme_array=new Array();

for(var f=1;f<=anzahlpos;f++)
{
var zwischenvarnummer=„teilsumme“+f;
if(document.getElementById(zwischenvarnummer).value != wirdberechnet)
var zwischenvar=parseFloat(document.getElementById(zwischenvarnummer).value);
else
var zwischenvar=0;
gesamtsumme_array[f]=parseFloat(zwischenvar);
}
Array.prototype.array_add = function() {
return eval(this.join("+"));
};
var gesamtsummesa = gesamtsumme_array.array_add();
document.getElementById(„gesamtsumme“).value= gesamtsummesa;
}
function teilsumme_berechnen(posnr,wievielepos)
{
var aktuellenr=„menge“+posnr;
var menge=parseInt(document.getElementById(aktuellenr).value);
var aktuellerpreis=„einzelpreis“+posnr;
var einzelp=parseFloat(document.getElementById(aktuellerpreis).value);
var teilsummex=einzelp*menge;
var xyz=„teilsumme“+posnr;
parseFloat(document.getElementById(xyz).value=teilsummex);
Gesamt(wievielepos);
}

Danke für Deine Hilfe!!
Gruß.

Hi,
wenns interessiert. Ich habs gelöst. Kleiner Haken war noch die variable Anzahl von Positionen. Daher hatte ich keine festen Variablennamen und musste diese erst generieren.

function Gesamt(anzahlpos)
{
var wirdberechnet=„wird berechnet …“;
gesamtsumme_array=new Array();

for(var f=1;f<=anzahlpos;f++)
{
var zwischenvarnummer=„teilsumme“+f;
if(document.getElementById(zwischenvarnummer).value != wirdberechnet)
var zwischenvar=parseFloat(document.getElementById(zwischenvarnummer).value);
else
var zwischenvar=0;
gesamtsumme_array[f]=parseFloat(zwischenvar);
}
Array.prototype.array_add = function() {
return eval(this.join("+"));
};
var gesamtsummesa = gesamtsumme_array.array_add();
document.getElementById(„gesamtsumme“).value= gesamtsummesa;
}
function teilsumme_berechnen(posnr,wievielepos)
{
var aktuellenr=„menge“+posnr;
var menge=parseInt(document.getElementById(aktuellenr).value);
var aktuellerpreis=„einzelpreis“+posnr;
var einzelp=parseFloat(document.getElementById(aktuellerpreis).value);
var teilsummex=einzelp*menge;
var xyz=„teilsumme“+posnr;
parseFloat(document.getElementById(xyz).value=teilsummex);
Gesamt(wievielepos);
}

Danke für Deine Hilfe!!
Gruß…