webForumDet fria alternativet

beräkningar vid onchange i textrutor

26 svar · 1 182 visningar · startad av daniel_ra

daniel_raMedlem sedan jan. 2002381 inlägg
#1

Jag har en ganska stor matris med värden som laddas till textrutor från en databas.

varje rad i matrisen består av ett antal värden i olika textrutor och den sista rutan för varje rad består av en summa av berärkningen mellan de övriga textrutorna på raden.
textrutorna namnges ungefär som nedan då värdena presenteras från databasen. I dagsläget så sparar jag alla dessa värden i en temporär tabell. Då jag förändrar värdet i en textruta så har jag en speciell asp-sida som genomför beräkningarna, uppdaterar temp-tabellen och laddar om ursprungssidan med matrisen med värdena från temptabellen. Jag kan alltså genomföra en rad beräkningar innan jag trycker på sparaknappen då alla värden uppdateras i de riktiga tabellerna. Temp-tabellen töms då jag sparat värdena.

Exempel

textruta1_1 + textruta2_1 - textruta3_1 = textrutaSumma_1
textruta1_2 + textruta2_2 - textruta3_2 = textrutaSumma_2
textruta1_3 + textruta2_3 - textruta3_3 = textrutaSumma_3

osv.

Jag har även en funktion som innebär att jag kan välja att antingen göra en beräkning för en rad vid onchange i någon av textrutorna på raden, alternativt göra låta den förändrade raden styra beräkningar på alla andra rader, dvs om jag ändrar textruta1_1 så får textruta1_2 och 1_3 samma värde och beräkningarna görs om för alla rader så att summan på respektive rad överstämmer igen.

Problemet jag har nu är att beräkningarna tar väldigt mycket tid och jag skulle helst vilja slippa att ladda om sidan vid varje förändring samt slippa att använda temporära tabeller för att spara värdena innan de sparas. Visst borde jag kunna göra dessa beräkningar med hjälp av javascript. Hur skall jag bete mig för detta. Någon som har lite tid att hjälpa mig.

Peter SMedlem sedan dec. 20025 483 inlägg
#2

Hur väljer du sättet som skall användas vid beräkning, d.v.s. om den gäller för den aktuella raden eller de andra raderna? Har du ett färdigt HTML-formulär att utgå ifrån?

daniel_raMedlem sedan jan. 2002381 inlägg
#3

Jag väljer detta med en radiobutton. vill jag endast ändra på den raden som radiobutton är ikryssad då¨jag först laddar formuläret (första raden) så måste jag alltså först flytta bort denna till någon annan rad. Formuläret skapar jag dynamiskt beroende på hur många poster jag hämtar från databasnamnet. Namnen på fälten sätter jag med hjälp av en siffra i loopen.

Peter SMedlem sedan dec. 20025 483 inlägg
#4

Det ser alltså ut så här:

<form>
 <input type="radio"><input>...<br>
 <input type="radio"><input>...<br>
 <input type="radio"><input>...<br>
 ...<br>
 <input type="radio"><input>...<br>
</form>

Om radioknappen för den rad som ändras är ikryssad, ändras de andra raderna också. Är den inte ikryssad ändras endast den raden. Korrekt?

daniel_raMedlem sedan jan. 2002381 inlägg
#5

stämmer precis det!

daniel_raMedlem sedan jan. 2002381 inlägg
#6

Ytterligare ett förtydligande: jag kan göra förändringar i vilken utav textrutorna som helst på en rad och det är just den textrutans värde som skall gälla för alla andra. i mitt exempel oven så ändrade jag värdet i textruta1_1 men jag skulle lika gärna kunna ändra värdet i textruta1_2 och då skall textruta2_2 och textruta3_2 ändras osv

Peter SMedlem sedan dec. 20025 483 inlägg
#7

Hur skall värdena i fälten på samma rad räknas ihop? I ditt exempel har du tre fält, varav det tredje skall subtraheras från de övrigas summa – är så alltid fallet?

daniel_raMedlem sedan jan. 2002381 inlägg
#8

Jag har två värden som alltid kommer att skickas med, dessa är inte redigerbara från textruta men skall användas i beräkningen. sedan har jag fyra textfält

summeringarna skall alltid ske lika på varje rad och lite mer exakt så skall det vara såhär:

Värde1 - Värde2 - textruta1 + textruta 2 = textruta3
textruta4 = (textruta3 *1,25)

reglerna för omräkning är följande:

om jag ändrar i texttruta1 så skall värdena i textruta3 och textruta4 vara kvar som innan, det värdet som skall räknas om så att beräkningen går ihop är textruta2

om jag ändrar i textruta3 eller textruta4 det även i detta fall bli så att textruta2:s värde s´räknas om. Givetvis kommer textruta3 eller textruta4 också ändras eftersom de är beroende av varandra.

Detta är alltså konsekvent för alla rader i matrisen.

Peter SMedlem sedan dec. 20025 483 inlägg
#9

Följande ändrar endast värden på samma rad (där inte checkboxen är ikryssad). Också är Värde1 = Värde2 = 0.

<script type="text/javascript">
var cc = null,    /* checked radio */
    nr = 0,       /* # of rows */
    v1 = 0,       /* value 1 */
    v2 = 0;       /* value 2 */

function f(i)
{
  if (!cc){
    alert("no radio button checked!");
    return;
  }

  var elms = i.form.elements;

  if (/^textruta(\d+)/.test(i.name)){
    if (RegExp.$1 == cc.charAt(cc.length - 1)){
      /* change other rows */
    } else {
      /* only change this row */

      if (i.name.charAt(i.name.length - 1) == "1"){
        elms["textruta" + RegExp.$1 + "_2"].value
            = elms["textrutaSumma_" + RegExp.$1].value - elms["textruta" + RegExp.$1 + "_1"].value;
      } else {
        elms["textrutaSumma_" + RegExp.$1].value
            = v1 - v2 + parseFloat(elms["textruta" + RegExp.$1 + "_1"].value || 0) + parseFloat(elms["textruta" + RegExp.$1 + "_2"].value || 0);
        elms["textrutaTotal_" + RegExp.$1].value = elms["textrutaSumma_" + RegExp.$1].value * 1.25;
      }
    }
  } else if (/^textruta(Summa|Total)_(\d+)/.test(i.name)){
    if (RegExp.$1 == cc.charAt(cc.length - 1)){
      /* change other rows */
    } else {
      /* only change this row */

      elms["textruta" + (RegExp.$1 == "Summa" ? "Total" : "Summa") + "_" + RegExp.$2].value
          = (RegExp.$1 == "Summa") ? i.value * 1.25 : i.value / 1.25;

      elms["textruta" + RegExp.$2 + "_2"].value
          = elms["textrutaSumma_" + RegExp.$2].value - elms["textruta" + RegExp.$2 + "_1"].value;
    }
  }
}

window.onload = function()
{
  var i  = document.getElementsByTagName("INPUT"),
      l  = i.length;
  while (l--){
    if (/^radio$/i.test(i.item(l).type)){
      if (i.item(l).checked){
        cc = i.item(l).value;
        break;
      }
    }
  }
}
</script>

<form>
  <input type="radio" name="c" value="cb1" onclick="cc = this.value" checked="checked"><input name="textruta1_1" onkeyup="f(this)"> + <input name="textruta1_2" onkeyup="f(this)"> = <input name="textrutaSumma_1" onkeyup="f(this)"> * 1,25 = <input name="textrutaTotal_1"><br>
  <input type="radio" name="c" value="cb2" onclick="cc = this.value"><input name="textruta2_1" onkeyup="f(this)"> + <input name="textruta2_2" onkeyup="f(this)"> = <input name="textrutaSumma_2" onkeyup="f(this)"> * 1,25 = <input name="textrutaTotal_2" onkeyup="f(this)"><br>
  <input type="radio" name="c" value="cb3" onclick="cc = this.value"><input name="textruta3_1" onkeyup="f(this)"> + <input name="textruta3_2" onkeyup="f(this)"> = <input name="textrutaSumma_3" onkeyup="f(this)"> * 1,25 = <input name="textrutaTotal_3"><br>
</form>

Ser det rätt ut?

daniel_raMedlem sedan jan. 2002381 inlägg
#10

jag är grymt imponerad över hur snabbt du satt upp detta, tack!! det verkar dock vara så att då jag sätter checkboxen för en rad så räknar den inte på någon rad alls

daniel_raMedlem sedan jan. 2002381 inlägg
#11

är jag för övrigt för krävande om jag ber dig hjälpa mig att få till det enligt de regler m.m. som jag nämnde ovan. Dvs så att alla textfält är med samt att jag kan skicka med två värden till funktionen. Jag förstår nämligen inte allt i koden vilket kommer medföra att jag pajar ihop allt om jag försäker ändra nåt =)

Peter SMedlem sedan dec. 20025 483 inlägg
#12

Hm:

<script type="text/javascript">
var cc = null,    /* checked radio */
    nr = 0,       /* # of rows */
    v1 = 0,       /* value 1 */
    v2 = 0;       /* value 2 */

function f(i)
{
  if (!cc){
    alert("no radio button checked!");
    return;
  }

  var elms = i.form.elements;

  if (/^textruta(\d+)/.test(i.name)){
    if (RegExp.$1 == cc.charAt(cc.length - 1)){
      /* change other rows */

      if (i.name.charAt(i.name.length - 1) == "1"){
        for (var k = 1; k <= nr; ++k){
          if (k != RegExp.$1){
            elms["textruta" + k + "_1"].value = i.value;
            elms["textruta" + k + "_1"].onkeyup(elms["textruta" + k + "_1"]);
          } else {
            elms["textruta" + RegExp.$1 + "_2"].value
                = elms["textrutaSumma_" + RegExp.$1].value - elms["textruta" + RegExp.$1 + "_1"].value;
          }
        }
      } else {
        for (var k = 1; k <= nr; ++k){
          if (k != RegExp.$1){
            elms["textruta" + k + "_2"].value = i.value;
            elms["textruta" + k + "_2"].onkeyup(elms["textruta" + k + "_1"]);
          } else {
            elms["textrutaSumma_" + RegExp.$1].value
                = v1 - v2 + parseFloat(elms["textruta" + RegExp.$1 + "_1"].value || 0) + parseFloat(elms["textruta" + RegExp.$1 + "_2"].value || 0);
            elms["textrutaTotal_" + RegExp.$1].value = elms["textrutaSumma_" + RegExp.$1].value * 1.25;
          }
        }
      }
    } else {
      /* only change this row */

      if (i.name.charAt(i.name.length - 1) == "1"){
        elms["textruta" + RegExp.$1 + "_2"].value
            = elms["textrutaSumma_" + RegExp.$1].value - elms["textruta" + RegExp.$1 + "_1"].value;
      } else {
        elms["textrutaSumma_" + RegExp.$1].value
            = v1 - v2 + parseFloat(elms["textruta" + RegExp.$1 + "_1"].value || 0) + parseFloat(elms["textruta" + RegExp.$1 + "_2"].value || 0);
        elms["textrutaTotal_" + RegExp.$1].value = elms["textrutaSumma_" + RegExp.$1].value * 1.25;
      }
    }
  } else if (/^textruta(Summa|Total)_(\d+)/.test(i.name)){
    if (RegExp.$2 == cc.charAt(cc.length - 1)){
      /* change other rows */

      for (var k = 1; k <= nr; ++k){
        if (k != RegExp.$2){
          elms["textruta" + RegExp.$1 + "_" + k].value = i.value;
          elms["textruta" + RegExp.$1 + "_" + k].onkeyup(elms["textruta" + RegExp.$1 + "_" + RegExp.$2]);
        } else {
          elms["textruta" + (RegExp.$1 == "Summa" ? "Total" : "Summa") + "_" + RegExp.$2].value
              = (RegExp.$1 == "Summa") ? i.value * 1.25 : i.value / 1.25;

          elms["textruta" + RegExp.$2 + "_2"].value
              = elms["textrutaSumma_" + RegExp.$2].value - elms["textruta" + RegExp.$2 + "_1"].value;
        }
      }
    } else {
      /* only change this row */

      elms["textruta" + (RegExp.$1 == "Summa" ? "Total" : "Summa") + "_" + RegExp.$2].value
          = (RegExp.$1 == "Summa") ? i.value * 1.25 : i.value / 1.25;

      elms["textruta" + RegExp.$2 + "_2"].value
          = elms["textrutaSumma_" + RegExp.$2].value - elms["textruta" + RegExp.$2 + "_1"].value;
    }
  }
}

window.onload = function()
{
  var i  = document.getElementsByTagName("INPUT"),
      l  = i.length;
  while (l--){
    if (/^radio$/i.test(i.item(l).type)){
      if (i.item(l).checked){
        cc = i.item(l).value;
      }
      if (i.item(l).name == "c"){ /* for counting the # of rows */
        ++nr;
      }
    }
  }
}
</script>

<form>
  <input type="radio" name="c" value="cb1" onclick="cc = this.value" checked="checked"><input name="textruta1_1" onkeyup="f(this)"> + <input name="textruta1_2" onkeyup="f(this)"> = <input name="textrutaSumma_1" onkeyup="f(this)"> * 1,25 = <input name="textrutaTotal_1" onkeyup="f(this)"><br>
  <input type="radio" name="c" value="cb2" onclick="cc = this.value"><input name="textruta2_1" onkeyup="f(this)"> + <input name="textruta2_2" onkeyup="f(this)"> = <input name="textrutaSumma_2" onkeyup="f(this)"> * 1,25 = <input name="textrutaTotal_2" onkeyup="f(this)"><br>
  <input type="radio" name="c" value="cb3" onclick="cc = this.value"><input name="textruta3_1" onkeyup="f(this)"> + <input name="textruta3_2" onkeyup="f(this)"> = <input name="textrutaSumma_3" onkeyup="f(this)"> * 1,25 = <input name="textrutaTotal_3" onkeyup="f(this)"><br>
</form>
daniel_raMedlem sedan jan. 2002381 inlägg
#13

denna verkar ju fungera fint. Jag får ett felmeddelande ibland: stack overflow, vad betyder det?
Jag kom även på att jag inte riktigt var helt tydlig =). värde1 och två är olika för varje rad.

sen har jag ytterligare en lite request. går det att avrunda alla tal till heltal? och går det att per automatik göra så att inga värden kan bli mindre än 0. Det jag alltså skulle vilja är att om textruta2:s värde blir mindre än 0 vid omräkning så sätts värdet i denna istället till 0 och textruta3 och fyra skall anpassa sig utefter detta istället. jag vill heller inte att man skall kunna skriva in ett negativt tal.

du verkar för övrigt vara grym på detta, jag är otroligt tacksam för all hjälp.

Peter SMedlem sedan dec. 20025 483 inlägg
#14

Hur klickar du för att få stack overflow?

daniel_raMedlem sedan jan. 2002381 inlägg
#15

det räcker med att jag kryssar i checkboxen för en annan rad än den första.

jag fyllde rutorna med värden. bytte rad för checkboxen och sedan försökte ändrar ett värde för den raden där ckeckboxen nu var vald. När jag väl fått detta så blir det så hela tiden

Peter SMedlem sedan dec. 20025 483 inlägg
#16

Ok, det var relaterat till onkeyup(). Litet klantigt kan tyckas... Nåväl

<script type="text/javascript">
var cc = null,    /* checked radio */
    nr = 0;       /* # of rows */

function updateRow(elms, row, col)
{
  switch (col){
    case 1: case 2:
    {
      elms["textrutaSumma_" + row].value
          = parseInt(elms["textruta" + row + "_1"].value || 0) + parseInt(elms["textruta" + row + "_2"].value || 0);
      elms["textrutaTotal_" + row].value = Math.round(1.25 * elms["textrutaSumma_" + row].value);

    } break;

    case 3:
    {
      var tmp = elms["textrutaSumma_" + row].value - elms["textruta" + row + "_1"].value;
      if (tmp < 0){
        elms["textruta" + row + "_2"].value = 0;
        elms["textruta" + row + "_1"].value = elms["textrutaSumma_" + row].value;
      } else {
        elms["textruta" + row + "_2"].value = tmp;
      }
      elms["textrutaTotal_" + row].value = Math.round(elms["textrutaSumma_" + row].value * 1.25);

    } break;

    case 4:
    {
      elms["textrutaSumma_" + row].value = Math.round(elms["textrutaTotal_" + row].value / 1.25);
      var tmp = elms["textrutaSumma_" + row].value - elms["textruta" + row + "_1"].value;
      if (tmp < 0){
        elms["textruta" + row + "_2"].value = 0;
        elms["textruta" + row + "_1"].value = elms["textrutaSumma_" + row].value;
      } else {
        elms["textruta" + row + "_2"].value = tmp;
      }

    } break;
  }
}

function f(i,e)
{
  if (!cc){
    alert("no radio button checked!");
    return;
  }

  if (g(i,e)){
    return;
  }

  var elms = i.form.elements;

  if (/^textruta(\d+)/i.test(i.name)){
    if (RegExp.$1 == cc.charAt(cc.length - 1)){
      /* change all rows */
      for (var k = 1; k <= nr; ++k){
        elms["textruta" + k + "_" + parseInt(i.name.charAt(i.name.length - 1))].value
            = i.value;
        updateRow(elms, k, parseInt(i.name.charAt(i.name.length - 1)));
      }
    } else {
      /* change this row only */
      updateRow(elms, RegExp.$1, parseInt(i.name.charAt(i.name.length - 1)));
    }
  } else if (/^textruta(summa|total)_(\d+)/i.test(i.name)){
    if (RegExp.$2 == cc.charAt(cc.length - 1)){
      /* change all rows */
      var s = RegExp.$1;
      for (var k = 1; k <= nr; ++k){
        elms["textruta" + s + "_" + k].value = i.value;
        updateRow(elms, k, 4 - /^summa$/i.test(s));
      }
    } else {
      /* change this row only */
      updateRow(elms, RegExp.$2, 4 - /^summa$/i.test(RegExp.$1));
    }
  }
}

function g(i,e)
{
  var kc = (window.event) ? window.event.keyCode : (e) ? e.keyCode : null;
  if (!kc) return 0;
  if (!((kc >= 48 && kc <= 58) || kc == 8 || kc == 9 || kc == 16 || (kc >= 37 && kc <= 40))){
    if (window.event){
      window.event.returnValue = false;
    } else {
      e.preventDefault();
    }
    return 1;
  }
  return 0;
}

window.onload = function()
{
  var i  = document.getElementsByTagName("INPUT"),
      l  = i.length;
  while (l--){
    if (/^radio$/i.test(i.item(l).type)){
      if (i.item(l).checked){
        cc = i.item(l).value;
      }
      if (i.item(l).name == "c"){ /* for counting the # of rows */
        ++nr;
      }
    }
  }
}
</script>

<form>
  <input type="radio" name="c" value="cb1" onclick="cc = this.value" checked="checked"><input name="textruta1_1" onkeypress="g(this,event)" onkeyup="f(this,event)" onkeydown="g(this,event)"> + <input name="textruta1_2" onkeypress="g(this,event)" onkeyup="f(this,event)" onkeydown="g(this,event)"> = <input name="textrutaSumma_1" onkeypress="g(this,event)" onkeyup="f(this,event)" onkeydown="g(this,event)"> * 1,25 = <input name="textrutaTotal_1" onkeypress="g(this,event)" onkeyup="f(this,event)" onkeydown="g(this,event)"><br>
  <input type="radio" name="c" value="cb2" onclick="cc = this.value"><input name="textruta2_1" onkeypress="g(this,event)" onkeyup="f(this,event)" onkeydown="g(this,event)"> + <input name="textruta2_2" onkeypress="g(this,event)" onkeyup="f(this,event)" onkeydown="g(this,event)"> = <input name="textrutaSumma_2" onkeypress="g(this,event)" onkeyup="f(this,event)" onkeydown="g(this,event)"> * 1,25 = <input name="textrutaTotal_2" onkeypress="g(this,event)" onkeyup="f(this,event)" onkeydown="g(this,event)"><br>
  <input type="radio" name="c" value="cb3" onclick="cc = this.value"><input name="textruta3_1" onkeypress="g(this,event)" onkeyup="f(this,event)" onkeydown="g(this,event)"> + <input name="textruta3_2" onkeypress="g(this,event)" onkeyup="f(this,event)" onkeydown="g(this,event)"> = <input name="textrutaSumma_3" onkeypress="g(this,event)" onkeyup="f(this,event)" onkeydown="g(this,event)"> * 1,25 = <input name="textrutaTotal_3" onkeypress="g(this,event)" onkeyup="f(this,event)" onkeydown="g(this,event)"><br>
</form>

De radspecifika värdena har ej tagits med. Får titta på det i helgen eller möjligtvis nästa vecka (såvida du inte gör ett försök).

Vidare har väl inte funktionerna f(), g() särskilt deskriptiva namn. Du kanske vill döpa om dem.

daniel_raMedlem sedan jan. 2002381 inlägg
#17

nu får jag inga fel, däremot så räknar den inte riktigt som jag vill fortfarande, jag har nog varit lite otydlig iallafall kom jag på.

om jag ändrar textruta1_x och radiobutton inte är ikryssad för denna rad skall textruta2_x för endast denna rad räknas om. alla andra värden skall vara kvar som innan. om radiobutton är ikryssad för denna rad skall textruta2_x för alla rader räknas om och alla andra värden skall vara oförändrade.

om jag gör en förändring i textruta2_x och radiobutton ej är ikryssad för denna rad så skall textruta3_x räknas om för endast denna rad, därmed ändras även värdet för textruta4_x eftersom denna är beroende av värdet i textruta3_x. textruta1_x för denna rad skall vara oförändrat. Om jag gör en förändring i textruta2_x och radiobutton är ikryssad för denna rad skall värdet av textbox2_x för alla rader ändras och värdena för textruta3 räknas om för varje rad. därmed ändras även textruta4_x för alla rader eftersom denna är beroende av textruta3_x. textruta1_x för alla rader skall vara oförändrade.

om jag gör en förändring av textruta3_x eller textruta4_x och radiobutton ej är ikryssad skall värdet för textruta2_x räknas om endast för denna rad. textruta1_x skall vara oförändrat. Om jag gör en förändring av textruta3_x eller textruta4_x och radiobutton är ikryssad skall värdet på textruta2_x för alla rader räknas om (utefter varje rades värden av textruta1_x). värdet för textruta1_x skall ej ändras.

sammanfattning:

om textruta1 ändras skall textruta2 räknas om, alla andra värden konstanta
om textruta2 ändras skall textruta3, samt därmed även textruta4 ändras, textruta1 skall vara konstant
om textruta3 eller textruta4 ändras skall textruta2 räknas om. textruta1 skall vara konstant.

värde1 samt värde2 skall alltid vara konstanta för respektive rad och skall aldrig räknas om.

tack för all din hjälp, jag har försökt att själv göra vissa förändringar i detta men jag förstår interiktigt alla delar av koden vilket gör det svårt dessvärre. det är lättare att följa fungerande kod baklänges och lära sig.

oskarsMedlem sedan nov. 20051 317 inlägg
Peter SMedlem sedan dec. 20025 483 inlägg
#19

Vi testar igen

<script type="text/javascript">
var cc = null,    /* checked radio */
    nr = 0;       /* # of rows */

function updateRow(elms, row, col)
{
  switch (col){
    case 1:
    {
      var tmp = elms["textrutaSumma_" + row].value - elms["textruta" + row + "_1"].value;
      if (tmp < 0){
        elms["textruta" + row + "_2"].value = 0;
        elms["textrutaSumma_" + row].value = elms["textruta" + row + "_1"].value;
        elms["textrutaTotal_" + row].value = Math.round(1.25 * elms["textrutaSumma_" + row].value);
      } else {
        elms["textruta" + row + "_2"].value = tmp;
      }

    } break;

    case 2:
    {
      elms["textrutaSumma_" + row].value
          = parseInt(elms["textruta" + row + "_1"].value || 0) + parseInt(elms["textruta" + row + "_2"].value || 0);
      elms["textrutaTotal_" + row].value = Math.round(1.25 * elms["textrutaSumma_" + row].value);

    } break;

    case 3:
    {
      var tmp = elms["textrutaSumma_" + row].value - elms["textruta" + row + "_1"].value;
      if (tmp < 0){
        elms["textruta" + row + "_2"].value = 0;
        elms["textruta" + row + "_1"].value = elms["textrutaSumma_" + row].value;
      } else {
        elms["textruta" + row + "_2"].value = tmp;
      }
      elms["textrutaTotal_" + row].value = Math.round(elms["textrutaSumma_" + row].value * 1.25);

    } break;

    case 4:
    {
      elms["textrutaSumma_" + row].value = Math.round(elms["textrutaTotal_" + row].value / 1.25);
      var tmp = elms["textrutaSumma_" + row].value - elms["textruta" + row + "_1"].value;
      if (tmp < 0){
        elms["textruta" + row + "_2"].value = 0;
        elms["textruta" + row + "_1"].value = elms["textrutaSumma_" + row].value;
      } else {
        elms["textruta" + row + "_2"].value = tmp;
      }

    } break;
  }
}

function f(i,e)
{
  if (!cc){
    alert("no radio button checked!");
    return;
  }

  if (g(i,e)){
    return;
  }

  var elms = i.form.elements;

  if (/^textruta(\d+)/i.test(i.name)){
    if (RegExp.$1 == cc.charAt(cc.length - 1)){
      /* change all rows */
      for (var k = 1; k <= nr; ++k){
        elms["textruta" + k + "_" + parseInt(i.name.charAt(i.name.length - 1))].value
            = i.value;
        updateRow(elms, k, parseInt(i.name.charAt(i.name.length - 1)));
      }
    } else {
      /* change this row only */
      updateRow(elms, RegExp.$1, parseInt(i.name.charAt(i.name.length - 1)));
    }
  } else if (/^textruta(summa|total)_(\d+)/i.test(i.name)){
    if (RegExp.$2 == cc.charAt(cc.length - 1)){
      /* change all rows */
      var s = RegExp.$1;
      for (var k = 1; k <= nr; ++k){
        elms["textruta" + s + "_" + k].value = i.value;
        updateRow(elms, k, 4 - /^summa$/i.test(s));
      }
    } else {
      /* change this row only */
      updateRow(elms, RegExp.$2, 4 - /^summa$/i.test(RegExp.$1));
    }
  }
}

function g(i,e)
{
  var kc = (window.event) ? window.event.keyCode : (e) ? e.keyCode : null;
  if (!kc) return 0;
  if (!((kc >= 48 && kc <= 58) || kc == 8 || kc == 9 || kc == 16 || (kc >= 37 && kc <= 40))){
    if (window.event){
      window.event.returnValue = false;
    } else {
      e.preventDefault();
    }
    return 1;
  }
  return 0;
}

window.onload = function()
{
  var i  = document.getElementsByTagName("INPUT"),
      l  = i.length;
  while (l--){
    if (/^radio$/i.test(i.item(l).type)){
      if (i.item(l).checked){
        cc = i.item(l).value;
      }
      if (i.item(l).name == "c"){ /* for counting the # of rows */
        ++nr;
      }
    }
  }
}
</script>

<form>
  <input type="radio" name="c" value="cb1" onclick="cc = this.value" checked="checked"><input name="textruta1_1" onkeypress="g(this,event)" onkeyup="f(this,event)" onkeydown="g(this,event)"> + <input name="textruta1_2" onkeypress="g(this,event)" onkeyup="f(this,event)" onkeydown="g(this,event)"> = <input name="textrutaSumma_1" onkeypress="g(this,event)" onkeyup="f(this,event)" onkeydown="g(this,event)"> * 1,25 = <input name="textrutaTotal_1" onkeypress="g(this,event)" onkeyup="f(this,event)" onkeydown="g(this,event)"><br>
  <input type="radio" name="c" value="cb2" onclick="cc = this.value"><input name="textruta2_1" onkeypress="g(this,event)" onkeyup="f(this,event)" onkeydown="g(this,event)"> + <input name="textruta2_2" onkeypress="g(this,event)" onkeyup="f(this,event)" onkeydown="g(this,event)"> = <input name="textrutaSumma_2" onkeypress="g(this,event)" onkeyup="f(this,event)" onkeydown="g(this,event)"> * 1,25 = <input name="textrutaTotal_2" onkeypress="g(this,event)" onkeyup="f(this,event)" onkeydown="g(this,event)"><br>
  <input type="radio" name="c" value="cb3" onclick="cc = this.value"><input name="textruta3_1" onkeypress="g(this,event)" onkeyup="f(this,event)" onkeydown="g(this,event)"> + <input name="textruta3_2" onkeypress="g(this,event)" onkeyup="f(this,event)" onkeydown="g(this,event)"> = <input name="textrutaSumma_3" onkeypress="g(this,event)" onkeyup="f(this,event)" onkeydown="g(this,event)"> * 1,25 = <input name="textrutaTotal_3" onkeypress="g(this,event)" onkeyup="f(this,event)" onkeydown="g(this,event)"><br>
</form>

Är det ej så att textruta 1 ibland måste räknas om då textruta(3|4) ändras? Låt säga att det i den övre raden står 0 2 2 och att det i den andra raden står 2 1 3: om nu checkboxen är ikryssad för den övre raden och man ändrar textruta1_3 till 1, skall då ej textruta 2_3 uppdateras till 1 vilket orsakar att textruta 2_1 måste räknas om eftersom summan (2 + 1) ej längre stämmer?

daniel_raMedlem sedan jan. 2002381 inlägg
#20

Jag får göra ett litet tillgägg till. Det du nämner får inte inträffa. Textruta1_2 får aldrig räknas om. textruta2_2 får då bli ett negativt värde så att beräkningen går ihop. Jag kom på att jag trots min långa förklaring ovan glömde en sak nämligen följande regel.

om jag ändrar värdet av textruta3_x eller textruta4_x så skall ju textruta2_räknas om och textruta1_x behålla sitt värde. det jag inte nämnde var att om checkbox är ikryssad för raden jag gör förändringen så skall vi först räkna ut ett nytt värde för textruta2_x för raden jag ändrade på. Värdet för textruta2 är det värde jag vill skall läggas i alla andra raders textruta2 med ett undantag: om det blir så att värdet för textruta3_x blir negativt på någon rad så skall värdet för textruta2_x för denna rad räknas om så att beräkningen går ihop med textruta3_x:s värde satt till 0. Jag får inte ha negativa värden i textruta3 eller textruta4.

jag råkar för övrigt ut för en liten konstig sak. om jag tabbar mig från en textruta så förändras värdena konstigt i rutorna. den räknar om saker på ett konstigt sätt.

148 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
145 ms — hämta tråd, inlägg och bilagor (db)