Martin: Berechnung mit unvereinheitlichen <input name"n">

Hallo,
ich hab ein Problem, mit dem ich mich seit Wochen den Kopf zerbreche. Ich komm einfach auf keine Lösung - nicht durch SelfHTML, nicht durchs Internet. Folgendes Problem:

Ich habe ein Formular, mit vielen, vielen Eingabefeldern, die mit Zahlen zu füllen sind...

Quasi ein Preisrechner. Das Schema schaut immer folgend aus (Beispiel):
<input type="text" name="Bezeichnung (1220)"><input name="1220" type="hidden" value="6.5">Bezeichnung.

Wenn also bei "Bezeichnung (1220)" der Value="3" ist, dann möchte ich
diesen mit dem value von "1220" multiplizieren.

Wenn kein Value bei "Bezeichnung (1220) dann soll auch nichts ausgerechnet werden.

Ich hab eben fast 100 solcher Felder, am Ende möchte ich alle Zwischenergebnisse ausrechnen.

Irgendwelche Vorschläge?? Zuletzt hatte ich die, arbeitsaufwendige, Idee, für jeden Artikel zwei Variablen zu schreiben, so etwa
var artikel1 = document.formular.Bezeichnung (1220).value
var artikel11 = document.formular.122.value

if (document.formular.Bezeichnung (1220).value != "")
{
zwischenergebnis1 = parseFloat(artikel1)*parseFloat(artikel11);
}

usw...
dann

ausgabe = zwischenergebnis1+zwischenergebnis2+zwischenergebnis3....;
document.formular.endergebnis.value = ausgabe;

Ich kriegs einfach nicht gebacken, dass zu vereinheitlichen...

Das Problem ist auf jeden Fall dieser <input name="">. Der muss aber aus verschiedenen Gründen Bezeichnung+Nummer beeinhalten. Vielleicht wäre es besser/nötig, die Bezeichnungen mit <input name="Bezeichnung_1220"> zu machen.

Seht ihr mein Problem? Irgendwelche Ideen? Mein Kopf ist gleich am platzen. Und meine JavaScript Kenntnisse sind da auch noch ausbaubar...

grüße. martin

  1. Hallo,

    schau dir mal http://selfhtml.teamone.de/javascript/objekte/elements.htm an. Du kannst auf Formularelemente auch über ihren Index im elements Array zugreifen, nicht nur über ihren Namen.
    So gehst du alle Elemente durch und prüfst ihren Namen. Wenn es der Bezeichner ist, dann setzt du ihren Wert in ein Array für die Bezeichner. Wenn es dein hidden Feld ist, dann setzt du den Wert mit der entsprechenden Id in ein anderes Array.

    Wenn du alle Elemente durch hast, dann brauchst du nur noch eine Schleife über deine Arrays laufen lassen, welche deine Multiplikation ausführt.

    Viele Grüße,

    Stefan

    --
    Lass dir das Tanzen NICHT verbieten
    http://petition-tanzverbot.de.vu
    1. Hi, ich hab mir das mit den <input name=""> mal zu Herzen genommen - sie heißen jetzt alle <input name="Bezeichnung_zahl">.

      Du kannst auf Formularelemente auch über ihren Index im elements >>Array zugreifen, nicht nur über ihren Namen.

      also wäre das in etwa

      for (i=0;i<200;i++){
      if (document.form.[i].value != ""){
      ???
      }
      }

      So gehst du alle Elemente durch und prüfst ihren Namen. Wenn es der Bezeichner ist, dann setzt du ihren Wert in ein Array für die Bezeichner. Wenn es dein hidden Feld ist, dann setzt du den Wert mit der entsprechenden Id in ein anderes Array.

      Das mit dem Namen prüfen, wie meinst du das?

      Wenn du alle Elemente durch hast, dann brauchst du nur noch eine Schleife über deine Arrays laufen lassen, welche deine Multiplikation ausführt.

      Das klingt super, so ganz kann ich es mir aber noch nicht vorstellen. Könntest du mir mal ein Beispiel geben? Gerade für das Namen prüfen...

      1. Hallo,

        Du kannst auf Formularelemente auch über ihren Index im elements Array zugreifen, nicht nur über ihren Namen.

        for (i=0;i<200;i++){
        if (document.form.[i].value != ""){
        ???
        }
        }

        Das mit dem Namen prüfen, wie meinst du das?

        Zu erst einmal solltest du deine Schleife nicht einfach wahllos bis 200 laufen lassen sondern die Länge des elements array prüfen. Außerdem greift dein Beispiel nicht auf form.elements zu sondern auf verschiedene Formulare und die hast du nicht.

        Du solltest dir mal das Kapitel über das form Objekt und seine Unterobjekte noch mal genau durchlesen.

        Dann wirst du sehehn, dass jedes element Objekt auch eine .name Eigenschaft hat. Über diese kannst du dann herausfinden welchen Namen das gefundene Element hat. Über die .value Eigenschaft findest du den Wert heraus. Das schreibst du wie beschrieben alles in 2 Arrays und rechnest die Sachen erst ganz am Schluss aus.

        Das klingt super, so ganz kann ich es mir aber noch nicht vorstellen. Könntest du mir mal ein Beispiel geben? Gerade für das Namen prüfen...

        http://selfhtml.teamone.de/javascript/objekte/elements.htm#name

        Viele Grüße,

        Stefan

        --
        Lass dir das Tanzen NICHT verbieten
        http://petition-tanzverbot.de.vu
    2. Also,
      meine inputs heißen jetzt alle nach dem Muster:
      Bezeichnung_nummer.

      Aber...
      Es heißt nicht immer Bezeichnung, sonder es kann Auto_100 oder auch Jahr2003_120 heißen.

      Wenn ich dich richtig verstehe, soll ich prüfen, ob das input in Namen das Element Bezeichnung hat - was es ja nicht haben muss.

      Prinzipiell könnte man doch sagen, dass jeweils der value des input mit gerader Nummer (0,2,4) mit dem value des input mit ungerader id (1,3,5) multipliziert werden muss.

      Eine andere Verallgemeinerung fällt mir nicht ein...
      Aber so recht weiter bin ich trotza allem nicht

      1. Hallo,

        Es heißt nicht immer Bezeichnung, sonder es kann Auto_100 oder auch Jahr2003_120 heißen.

        Wenn ich dich richtig verstehe, soll ich prüfen, ob das input in Namen das Element Bezeichnung hat - was es ja nicht haben muss.

        So war es angedacht. Aber wenn sie so heißen wie oben, dann kannst du ja auch auf einen Unterstrich, mehrere Ziffern und das Ende der Value prüfen. Das sollte über eine RegEx gut gehen.

        Aber ich habe so  langsam das Gefühl, du willst all dieses für ein Bestellformular oder ähnliches. Und in diesem Fall sollte die Abarbeitung serverseitig stattfinden. Und zwar völlig serverseitig. Sonst stehen die Leute ohne JS dumm da.

        Viele Grüße,

        Stefan

        --
        Lass dir das Tanzen NICHT verbieten
        http://petition-tanzverbot.de.vu
        1. Es ist eine quasi Bestellliste...

          Aber wie meinst du Serverseitig? Mit PHP? Mit CGI? Erzähl mir doch mal wie und am besten ein Praxisexempel...

          grüße

          1. Hallo,

            Es ist eine quasi Bestellliste...

            Aber wie meinst du Serverseitig? Mit PHP? Mit CGI? Erzähl mir doch mal wie und am besten ein Praxisexempel...

            Zum Beispiel mit PHP. Oder mit Perl. Oder mit jeder anderen Sprache die via CGI genutzt werden kann.

            Du warst ja noch recht schweigsam, wozu dein JavaScript dienen soll. Aber wenn du eine Bestellung über ein Formular abwicklen willst, dann brauchst du ja so oder so irgend etwas das serverseitig läuft und dein Formular bearbeitet. Eben da würde ich deine Berechnung auch mit einbauen.
            (Oder wolltest du etwa dein Formular per action="mailto:..." versenden?)

            Ich werde dir jetzt bestimmt kein Beispiel liefern, da gibt es genügende (Beispiele zu Formmailern, Beispiele zum Multiplizieren, ...) und da ich nicht weiß, was du willst könnte ich dir auch keines liefern das zu deiner Situation passt.
            Außerdem sind wir hier immer noch bei _SELF_html.

            Viele Grüße,

            Stefan

            --
            Lass dir das Tanzen NICHT verbieten
            http://petition-tanzverbot.de.vu
            1. PHP und Co. sind ja ganz nett, bloß irgendwie nicht so geeignet, wenn sich die Ausgabe des Gesamtergebnis ständig ändert.

              Das Ergebnis soll immer am Ende der Seite erscheinen - und nicht auf einer extra Seite. Damit fällt PHP weg.

              Ich merke aber langsam, dass das ein bisschen arg aufwendig ist. Die Bestellung läuft über Formmail, also CGI, und das kann ich leider nicht ändern. Außerdem hab ich keinen Plan von CGI, ganz ehrlich.

              Warum ich nicht allzu viel verrate?
              Nun ja, es nicht "geschäftlich" in dem sinne, vielmehr sogar für einen guten Zweck - aber ich möchte den link nicht unbedingt öffentlich hier posten. Per E-Mail gerne.

              1. Hallo,

                PHP und Co. sind ja ganz nett, bloß irgendwie nicht so geeignet, wenn sich die Ausgabe des Gesamtergebnis ständig ändert.

                Das Ergebnis soll immer am Ende der Seite erscheinen - und nicht auf einer extra Seite. Damit fällt PHP weg.

                Ok, in diesem Fall musst du es mit JavaScript machen. Aber das JavaScript darf für eine Bestellung nicht zwingend erforderlich sein. Wenn dein Script jetzt so etwas wie den Gesamtbetrag berechnet (das denke ich mir doch mal), dann musst du diesen nach eintreffen der Mail von Hand noch einmal nachrechnen.
                Auf das was per JavaScript beim Client geschiet (oder auch nicht) hast du keinen Einfluss. Und du darfst dich auf die Daten die scheinbar vom Script kommen auch nicht verlassen.

                Wie du dein Script programmierst, das solltest du eigentlich inzwischen herausgefundne haben oder herausfinden können. Hinweise standen genügend in diesem Thread.
                Wenn du dann doch noch einmal Fragen hast oder nicht weiterkommst, dann poste etwas von deinem bisher erstellten Code und dir wird geholfen.

                Viele Grüße,

                Stefan

                --
                Lass dir das Tanzen NICHT verbieten
                http://petition-tanzverbot.de.vu
                1. Hallo,

                  danke für deinen abschließenden Tipp, ja, die Daten werden nach Versenden der "Bestellung" noch einmal überprüft - Serverseitig, bzw. von Hand, wenn ich das richtig weiß - das kann ich aber nicht beeinflussen, bei meiner Coderei geht es nur darum, dem Benutzer ein schnelles, ungefähres Zwischenergebnis zu präsentieren.

                  grüße.

                  1. Bin jetzt ein gutes Stück weitergekommen.
                    Aber an dein Array scheiter ich. Ich finde keine vernünftige Anleitung wie ich denn ein Array erstelle.

                    Hier mal mein Code, mit zwei Beispielbüchern, deren Wert zusammengezählt werden soll..

                    <html>
                    <head><title></title></head>
                    <script language="JavaScript">
                    <!--
                    function ukosten()
                    {
                    var form = document.material;
                    for (i=0; i<form.length; i++)
                    {
                    if (form.elements[i].value != ""){
                    zahlen = newArray();
                    zahlen[i] = parseFloat(form.elements[0].value) * parseFloat(form.elements[0].alt);
                    // Zusammenzählen der verschiedenen Array-Werte??
                    }
                    }
                    }

                    //-->
                    </script>

                    <body>
                    <form name="material">
                    <input name="BuchGats_1540" alt="6.5" value="3" size=3>Buch 1<br>
                    <input name="Buch20_1244" alt="7" size="3">Buch 2<br><br>
                    <input name="ergebnis" size="5"><br>
                    <input type="button" value="Kosten berechnen" onclick="ukosten()">
                    </form>

                    </body></html>

                    grüße. Martin

                    1. Hallo,

                      Hier mal mein Code, mit zwei Beispielbüchern, deren Wert zusammengezählt werden soll..

                      <form name="material">
                      <input name="BuchGats_1540" alt="6.5" value="3" size=3>Buch 1<br>
                      <input name="Buch20_1244" alt="7" size="3">Buch 2<br><br>
                      <input name="ergebnis" size="5"><br>
                      <input type="button" value="Kosten berechnen" onclick="ukosten()">
                      </form>

                      Was soll denn das sein? Deine input Felder haben keine type Angabe. Das zweite hat noch nicht mal eine value Angabe und ein alt Attribut existiert hier nicht.
                      Außerdem wolltest du doch die Werte von Textfeldern mit denen von Hiddenfeldern multiplizieren. Erstell doch bitte mal ein Beispiel welches auch die von dir beschriebene Situation widerspiegelt.

                      Viele Grüße,

                      Stefan

                      --
                      Lass dir das Tanzen NICHT verbieten
                      http://petition-tanzverbot.de.vu
                      1. <form name="material">
                        <input name="BuchGats_1540" type="text" alt="6.5" value="3" size=3>Buch 1<br>
                        <input name="Buch20_1244" alt="7" type="text" size="3">Buch 2<br><br>
                        <input name="ergebnis" type="text" size="5"><br>
                        <input type="button" value="Kosten berechnen" onclick="ukosten()">
                        </form>

                        Das war tatsächlich das, was ich heute schnell als Beispiel für mein Problem geschrieben habe.

                        OK, die types habe ich vergessen, die "alt" habe ich gewählt, nachdem ich mir die SelfHTML Seiten zum Thema input angeschaut habe.

                        So müsste es doch auch gehen. Dann bräuchte man kein hidden Feld, das man zuordnen müsste? Oder nicht?

                        Deswegen ist bei ergebnis ja auch kein alt, denn das soll ja nicht berechnet werden.

                        1. Hallo,

                          OK, die types habe ich vergessen, die "alt" habe ich gewählt, nachdem ich mir die SelfHTML Seiten zum Thema input angeschaut habe.

                          Das alt="" ist aber vermutlich nur dazu da als Alternativtext zu dienen, wenn man als input Feld einen graphischen Submit Button hat.

                          So müsste es doch auch gehen. Dann bräuchte man kein hidden Feld, das man zuordnen müsste? Oder nicht?

                          Nein. http://selfhtml.teamone.de/javascript/objekte/elements.htm wird dir sagen, dass du per JS nicht auf die alt Eigenschaft von Formularfeldern zugreifen kannst.
                          Über das DOM wäre es zwar möglich, aber dann ist dein Script zu älteren Browsern nicht mehr kompatibel. Ich hätte das schon so mit den hidden Feldern gelassen.

                          Viele Grüße,

                          Stefan

                          --
                          Lass dir das Tanzen NICHT verbieten
                          http://petition-tanzverbot.de.vu
  2. hi

    <input type="text" name="Bezeichnung (1220)"><input name="1220" type="hidden" value="6.5">Bezeichnung.

    das solltest du dir vieleicht nochmal gründlich durchlesen, besonders den teil wo es um "name" geht :)

    http://selfhtml.teamone.de/html/formulare/eingabe.htm#felder

    so long
    ole
    (8-)>

    --
    Die Summe aller menschlichen Intelligenz ist eine Konstante.
    Das Problem ist das Bevölkerungswachtum...
    sh:( fo:) ch:| rl:° br:& n4:° ie:% mo:} va:| de:] zu:| fl:( ss:) ls: js:|
    If you can't beat 'em...eat 'em !
  3. <input type="text" name="Bezeichnung (1220)"><input name="1220" type="hidden" value="6.5">Bezeichnung.

    Hmm. In der Tat sehr kompliziert. Ein Tipp vorneweg: Bevor du eine mögliche Lösung aufs ganze ausprobierst, versuchs erst mal mit 3 Werten (aber das versteht sich ja fast von selbst ;) )
    Was mir nach einem Problem aussehen könnte ist in der Tat das Leerzeichen in der Bezeichnung. Weiß jetzt nicht die genauen Leerzeichen-Regeln, aber das würde ich versuchen zu vermeiden. Was wäre mit Bezeichnung1220? Das ist am Problemlosesten.
    Noch eine Frage zum Verständnis:
    Im obenstehenden Bsp. soll 1220 mit 6.5 multipliziert werden, oder? Sind die anderen 99 Felder alle in beiden Werten unterschiedlich, oder werden z.b. alle mit "6.5" multipliziert?

    MfG

    Max

    1. Nein, es soll mit dem value von Bezeichnung1220 also dem, was der User eingibt.

      Beispiel:
      <input name="Bezeichnung1220" value="2"><input type="hidden" value="6.5">

      Der User hat also 2 eingeben, dass Ergebnis sollte dann "13" sein...

      P.S. Zumindest die Bezeichnnug der Elemente habe ich schon korrigiert...