Summierung über Tabelle
Shihan
- javascript
Hallo zusammen
Vorneweg, ich habe nicht viel Ahnung von Javascript. Programmiere aber sonst viel in PHP und zur Zeit mehr und mehr in Java.
Zur Zeit entwickle ich mit Java/JSP/Struts eine Anwendung für eine Zeiterfassung. So, als Beispiel hat ein Benutzer z.B. 5 verschiedene Aufträge also Reihen und dann einige Spalten:
| AuftragsID | ZeitMonat | ZeitDienstag | ... | SummeWoche(proAuftrag) |
Die Felder für die Zeit sehen im Quelltext (nach der automatischen überarbeitung durch Struts) so aus (pro Zeile):
<input type="text" name="Orders[0].moZeitStd" size="5" value="0.0" onchange="updateRowSummary()" class="zeit">
Und die für die Summe (pro Zeile):
<input type="text" name="row[0].sum" size="5" value="0.0" readonly="readonly" class="zeit">
pro Zeile erhöht sich der Wert in den Klammern (hier [0]) um "1".
Alsoooooo, zur eigentlichen Frage resp. Problem:
Wenn jetzt in einem Zeit-Feld etwas geändert wird (also eine andere Stundenanzahl eingetragen wird), dann sollte es ja die function "updateRowSummary()" aufrufen. Das macht es auch, doch irgendwie ist ein Fehler drinn. Ich möchte nach einer Änderung, dass das hinterste Feld, also das Summenfeld sich neu berechnet und der Wert dann angezeigt wird. Hier die Funktion (habe ne Änderung auskommentiert, hat aber nix gebracht):
function updateRowSummary() {
for(var i = 0; i<5; i++) {
var nameSum = "row[" + i + "].sum";
var nameMo = "Orders[" + i + "].moZeitStd";
var nameDi = "Orders[" + i + "].diZeitStd";
var nameMi = "Orders[" + i + "].miZeitStd";
var nameDo = "Orders[" + i + "].doZeitStd";
var nameFr = "Orders[" + i + "].frZeitStd";
var nameSa = "Orders[" + i + "].saZeitStd";
var nameSo = "Orders[" + i + "].soZeitStd";
//var sum = document.getElementsByName("nameMo")[0].value + document.getElementsByName("nameDi")[0].value + document.getElementsByName("nameMi")[0].value + document.getElementsByName("nameDo")[0].value + document.getElementsByName("nameFr")[0].value + document.getElementsByName("nameSa")[0].value + document.getElementsByName("nameSo")[0].value;
//document.getElementsByName("nameSum")[0].value = sum;
var sum = document.workTimeRegListForm.nameMo.value + document.workTimeRegListForm.nameDi.value;
document.workTimeRegListForm.nameSum.value = sum;
alert("Ausgabe: " + i);
}
}
Im Prinzip wird wie ihr seht die ganze Tabelle neu berechnet, egal in welcher Reihe oder Feld etwas geändert wird, da ich durch das Struts-Framework nicht den jeweils gesetzten Index (z.b. [0]) im vornhinein weiss (oder nicht weiss wie man das anstellt ;-))
Was mach ich falsch? Irgendwie muss ich ja den namen für das jeweilige Input-Field dynamisch erstellen um dann darauf zuzugreifen, aber irgendwie haut das so nicht hin.
Besten Dank für eure Hilfe!
Gruss, Shihan
hi,
Irgendwie muss ich ja den namen für das jeweilige Input-Field dynamisch erstellen um dann darauf zuzugreifen,
http://de.selfhtml.org/javascript/objekte/elements.htm#allgemeines
aber irgendwie haut das so nicht hin.
Dann debugge, und liefere eine vernünftige Problembeschreibung.
Javascript-Konsole im Firefox, oder Erweiterung FireBug helfen weiter.
gruß,
wahsaga
Ok, konnte es nun selbst lösen, der Hinweis von wahsaga hat mir aber sehr geholfen.
Da ich häufig im Internet nach Problemen und deren Lösung suche und häufig zwar mein Problem xy wiederfinde aber nie die Lösung, poste ich hier mal wie es bei mir funktioniert hat:
function updateRowSummary() {
var elementCount = document.forms["workTimeRegListForm"].elements["wochenId"].length;
for(var i = 0; i<elementCount; i++) {
var moName = "Orders[" + i + "].moZeitStd";
var diName = "Orders[" + i + "].diZeitStd";
var miName = "Orders[" + i + "].miZeitStd";
var doName = "Orders[" + i + "].doZeitStd";
var frName = "Orders[" + i + "].frZeitStd";
var saName = "Orders[" + i + "].saZeitStd";
var soName = "Orders[" + i + "].soZeitStd";
var sum = parseFloat(document.forms["workTimeRegListForm"].elements[moName].value) +
parseFloat(document.forms["workTimeRegListForm"].elements[diName].value) +
parseFloat(document.forms["workTimeRegListForm"].elements[miName].value) +
parseFloat(document.forms["workTimeRegListForm"].elements[doName].value) +
parseFloat(document.forms["workTimeRegListForm"].elements[frName].value) +
parseFloat(document.forms["workTimeRegListForm"].elements[saName].value) +
parseFloat(document.forms["workTimeRegListForm"].elements[soName].value);
var sumName = "row[" + i + "].sum";
document.forms["workTimeRegListForm"].elements[sumName].value = sum.toFixed(1);
}
}