Avatar billede doctorman Nybegynder
07. oktober 2005 - 12:13 Der er 9 kommentarer og
1 løsning

Sum af form feltet

Hej

Først og fremmest er dette mit første spørgsmål på eksperten, så I må bære over med mig... :-)

Jeg har godt nok søgt og søgt på mit spørgsmål men har ikke fundet løsningen.

Jeg har nedenstående kode og ønsker at når man forlader text felterne med navn = txtAntal? skal funktionen summere tallene til txtSum? feltet og lige ledes i linie 2 osv.
Formen er forsimplet meget i forhold til den endelige form men dette er humlen. Jeg har selv lavet funktioner til at kontrollere om det tastede tal er et tal mm.
Så det er "kun" loopet af felterne jeg mangler.
Om felterne skal hedde txtAntal1 ovs. eller om der skal benyttes ID ved jeg ikke - men det ved I sikkert.

<html>
<head>
    <title>Test</title>
    <SCRIPT type="text/javascript">
    function beregnsum(id) {
        // loop af form felter som hedder noget med txtAntal + id
        // sum af felterne
        // resultatet skal skrives i document.frmReg.txtSum+id.value
    }
    </SCRIPT>
</head>

<body>
<form action="default.asp" method="post" name="frmReg" id="frmReg">
Linie 1&nbsp;&nbsp;
<input type="text" name="txtTekst2" size="15" maxlength="30">&nbsp;&nbsp;
<input type="text" name="txtAntal1" size="3" maxlength="5" value="0" style="text-align: right;" onchange="beregnsum(1);">&nbsp;&nbsp;
<input type="text" name="txtAntal1" size="3" maxlength="5" value="0" style="text-align: right;" onchange="beregnsum(1);">&nbsp;&nbsp;
<input type="text" name="txtAntal1" size="3" maxlength="5" value="0" style="text-align: right;" onchange="beregnsum(1);">&nbsp;&nbsp;
<input type="text" name="txtSum1" size="3" maxlength="5" value="0" style="text-align: right;" readonly="true">&nbsp;&nbsp;
<br><br>
Linie 2&nbsp;&nbsp;
<input type="text" name="txtTekst2" size="15" maxlength="30">&nbsp;&nbsp;
<input type="text" name="txtAntal2" size="3" maxlength="5" value="0" style="text-align: right;" onchange="beregnsum(2);">&nbsp;&nbsp;
<input type="text" name="txtAntal2" size="3" maxlength="5" value="0" style="text-align: right;" onchange="beregnsum(2);">&nbsp;&nbsp;
<input type="text" name="txtAntal2" size="3" maxlength="5" value="0" style="text-align: right;" onchange="beregnsum(2);">&nbsp;&nbsp;
<input type="text" name="txtSum2" size="3" maxlength="5" value="0" style="text-align: right;" readonly="true">&nbsp;&nbsp;
<br><br>
Linie 3 ->&nbsp;&nbsp;
</form>

</body>
</html>
Avatar billede roenving Novice
07. oktober 2005 - 14:19 #1
F.eks.

<script type="text/javascript">
function beregnsum(elm) {
  // loop af form felter som hedder noget med txtAntal + id
  var elms = elm.form.elements[elm.name],sum=0;
  // sum af felterne
  for(i=0;elms.length>i;i++){
    sum += +elms[i].value;
  }
  // resultatet skal skrives i document.frmReg.txtSum+id.value
  var id = elm.name.replace(/^.*?(\d+)$/,"$1");
  elm.form.elements["txtSum" + id].value = sum;
}
</script>

<form action="default.asp" method="post" name="frmReg" id="frmReg">
Linie 1&nbsp;&nbsp;
<input type="text" name="txtTekst1" size="15" maxlength="30">&nbsp;&nbsp;
<input type="text" name="txtAntal1" size="3" maxlength="5" value="0" style="text-align: right;" onchange="beregnsum(this);">&nbsp;&nbsp;
<input type="text" name="txtAntal1" size="3" maxlength="5" value="0" style="text-align: right;" onchange="beregnsum(this);">&nbsp;&nbsp;
<input type="text" name="txtAntal1" size="3" maxlength="5" value="0" style="text-align: right;" onchange="beregnsum(this);">&nbsp;&nbsp;
<input type="text" name="txtSum1" size="3" maxlength="5" value="0" style="text-align: right;" readonly="true">&nbsp;&nbsp;
<br><br>
Linie 2&nbsp;&nbsp;
<input type="text" name="txtTekst2" size="15" maxlength="30">&nbsp;&nbsp;
<input type="text" name="txtAntal2" size="3" maxlength="5" value="0" style="text-align: right;" onchange="beregnsum(this);">&nbsp;&nbsp;
<input type="text" name="txtAntal2" size="3" maxlength="5" value="0" style="text-align: right;" onchange="beregnsum(this);">&nbsp;&nbsp;
<input type="text" name="txtAntal2" size="3" maxlength="5" value="0" style="text-align: right;" onchange="beregnsum(this);">&nbsp;&nbsp;
<input type="text" name="txtSum2" size="3" maxlength="5" value="0" style="text-align: right;" readonly="true">&nbsp;&nbsp;
<br><br>
Linie 3 ->&nbsp;&nbsp;
</form>

-- bemærk, at jeg lige springer over et sted, hvor gærdet er meget lavere, ved at bruge referencen til det felt, der kaldes fra !-)
Avatar billede doctorman Nybegynder
07. oktober 2005 - 22:04 #2
Tja, jeg må sige det virker det du har lavet, MEN jeg har selv lavet en lille fejl.
Da formen's data senere skal kunne gemmes i en database går det jo ikke med flere felter med samme navn (f.eks. txtAntal1). Desuden skal jeg også have en sammentælling af tallene i 1. kolonne og 2. kolonne og 3. kolonne. dvs. formen vil se ca. således ud:

<form action="default.asp" method="post" name="frmReg" id="frmReg">
Linie 1&nbsp;&nbsp;
<input type="text" name="txtTekst1" size="15" maxlength="30">&nbsp;&nbsp;
<input type="text" name="txtAntal1_1" id="Antal1" size="3" maxlength="5" value="0" style="text-align: right;" onchange="beregnsum(this);">&nbsp;&nbsp;
<input type="text" name="txtAntal2_1" id="Antal1" size="3" maxlength="5" value="0" style="text-align: right;" onchange="beregnsum(this);">&nbsp;&nbsp;
<input type="text" name="txtAntal3_1" id="Antal1" size="3" maxlength="5" value="0" style="text-align: right;" onchange="beregnsum(this);">&nbsp;&nbsp;
<input type="text" name="txtSum1" size="3" maxlength="5" value="0" style="text-align: right;" readonly="true">&nbsp;&nbsp;
<br><br>
Linie 2&nbsp;&nbsp;
<input type="text" name="txtTekst2" size="15" maxlength="30">&nbsp;&nbsp;
<input type="text" name="txtAntal1_2" id="Antal2" size="3" maxlength="5" value="0" style="text-align: right;" onchange="beregnsum(this);">&nbsp;&nbsp;
<input type="text" name="txtAntal2_2" id="Antal2" size="3" maxlength="5" value="0" style="text-align: right;" onchange="beregnsum(this);">&nbsp;&nbsp;
<input type="text" name="txtAntal2_2" id="Antal2" size="3" maxlength="5" value="0" style="text-align: right;" onchange="beregnsum(this);">&nbsp;&nbsp;
<input type="text" name="txtSum2" size="3" maxlength="5" value="0" style="text-align: right;" readonly="true">&nbsp;&nbsp;
<br><br>
Linie 3 -> osv.&nbsp;&nbsp;
<br><br>
Sum 1: <input type="text" name="txtIalt1" size="3" maxlength="5" value="0" style="text-align: right;" readonly="true">&nbsp;&nbsp;
Sum 2: <input type="text" name="txtIalt2" size="3" maxlength="5" value="0" style="text-align: right;" readonly="true">&nbsp;&nbsp;
Sum 3: <input type="text" name="txtIalt3" size="3" maxlength="5" value="0" style="text-align: right;" readonly="true">&nbsp;&nbsp;
</form>

Du kan evt. bedre se hvad jeg mener med dette billede, der skal bare kunne være flere linier hvor timer/antal kan redigeres og total samt Grand total skal opdateres
http://www.freerider.dk/AA/timer.jpg

Jeg troede egentlig jeg selv kunne - men nej.
Avatar billede roenving Novice
08. oktober 2005 - 17:18 #3
<script type="text/javascript">
function beregnsum(elm) {
  // loop af form felter som hedder noget med txtAntal + id
  var f = elm.form;
  var elms = elm.form.elements,sum1=0,actRow=1,sum2=new Array(),col=0;
  // sum af felterne
  for(i=0;elms.length>i;i++){
    if(elms[i].name.indexOf("txtAntal")==0){
      id = elms[i].name.split("_");
      if(id[1]!=actRow){
        f.elements["txtSum" + actRow].value = sum1;
        sum1 = 0;
        actRow = id[1];
      }
      sum1 += +elms[i].value;
      col = +id[0].replace(/^.*?(\d+)$/,"$1");
      if(!sum2[col])
        sum2[col] = 0;
      sum2[col] += +elms[i].value;
    }
  }
  f.elements["txtSum" + actRow].value = sum1;
  // resultatet skal skrives i document.frmReg.txtSum+id.value
  for(var x in sum2)
    elm.form.elements["txtIalt" + x].value = sum2[x];
}
</script>

<form action="default.asp" method="post" name="frmReg" id="frmReg">
Linie 1&nbsp;&nbsp;
<input type="text" name="txtTekst1" size="15" maxlength="30">&nbsp;&nbsp;
<input type="text" name="txtAntal1_1" size="3" maxlength="5" value="0" style="text-align: right;" onchange="beregnsum(this);">&nbsp;&nbsp;
<input type="text" name="txtAntal2_1" size="3" maxlength="5" value="0" style="text-align: right;" onchange="beregnsum(this);">&nbsp;&nbsp;
<input type="text" name="txtAntal3_1" size="3" maxlength="5" value="0" style="text-align: right;" onchange="beregnsum(this);">&nbsp;&nbsp;
<input type="text" name="txtSum1" size="3" maxlength="5" value="0" style="text-align: right;" readonly="true">&nbsp;&nbsp;
<br><br>
Linie 2&nbsp;&nbsp;
<input type="text" name="txtTekst2" size="15" maxlength="30">&nbsp;&nbsp;
<input type="text" name="txtAntal1_2" size="3" maxlength="5" value="0" style="text-align: right;" onchange="beregnsum(this);">&nbsp;&nbsp;
<input type="text" name="txtAntal2_2" size="3" maxlength="5" value="0" style="text-align: right;" onchange="beregnsum(this);">&nbsp;&nbsp;
<input type="text" name="txtAntal3_2" size="3" maxlength="5" value="0" style="text-align: right;" onchange="beregnsum(this);">&nbsp;&nbsp;
<input type="text" name="txtSum2" size="3" maxlength="5" value="0" style="text-align: right;" readonly="true">&nbsp;&nbsp;
<br><br>
Linie 3 -> osv.&nbsp;&nbsp;
<br><br>
Sum 1: <input type="text" name="txtIalt1" size="3" maxlength="5" value="0" style="text-align: right;" readonly="true">&nbsp;&nbsp;
Sum 2: <input type="text" name="txtIalt2" size="3" maxlength="5" value="0" style="text-align: right;" readonly="true">&nbsp;&nbsp;
Sum 3: <input type="text" name="txtIalt3" size="3" maxlength="5" value="0" style="text-align: right;" readonly="true">&nbsp;&nbsp;
</form>

-- bemærk, at jeg fjernede nogle ulovlige id'er, som der ikke må være flere ens af i et dokument (hvorimod der godt må være flere elementer med samme navn !-)
Avatar billede doctorman Nybegynder
08. oktober 2005 - 17:53 #4
Hej roenving

Jeg har ikke testet det endnu, men jeg er ikke i tvivl om at det virker som det skal, når det er dig som har lavet det, MEN hvordan giver man dig egentlig point??

Mange tak for hjælpen..

Mvh
KPH
Avatar billede roenving Novice
08. oktober 2005 - 17:57 #5
Jamen, så skal du jo lige have et svar !-)

-- og jeg ville altid teste, selv gad jeg ikke sætte flere kolonner eller rækker på, men metoderne, jeg bruger, skulle også kunne klare en hulens masse af dem !o]

Velbekomme '-)
Avatar billede doctorman Nybegynder
08. oktober 2005 - 20:20 #6
Jamen det virker jo bare - kanon..
Du er s.. en hård mand..
Avatar billede doctorman Nybegynder
08. oktober 2005 - 20:22 #7
Fik du point??
Avatar billede roenving Novice
08. oktober 2005 - 20:37 #8
Du skal huske at markere navnet på dem/den, der skal have point, i boksen til venstre før du trykker på Acceptér !-)
Avatar billede doctorman Nybegynder
09. oktober 2005 - 08:38 #9
Det synes jeg nu også jeg havde, men nu skulle du have fået dem - egentlig skulle du have haft 200, det havde været fortjent :-)
Avatar billede roenving Novice
09. oktober 2005 - 17:01 #10
Tak for point ;~}

-- men jeg synes ikke det havde været fortjent at få maksimum-point, for det er ganske rimeligt, at jeg får for et svært spørgsmål pga. det arbejde, som skulle lægges i det, ikke på grund af sværhedsgraden !-)

-- men der findes faktisk i åbne spørgsmål et punkt under Funktioner oppe til venstre, som hedder 'Afsæt flere point' !o]
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester