webForumDet fria alternativet

beräkningar vid onchange i textrutor

26 svar · 1 182 visningar · startad av daniel_ra · sida 2 av 2

daniel_raMedlem sedan jan. 2002381 inlägg
#21

några exempel. första värdet är textruta1, andra textruta2 och tredje textruta3. tre rader i varje exempel. stjärnan representerar där checkbox är ikryssad

1|2|3*
2|6|8
3|4|7

vid förändring av textruta1 i rad1 från 1 till 2 skall beräkningen ge följande:

2|1|3*
2|6|8
2|5|7

med utgångspunkt från ursprungsexemplet så gör jag en annan förändring, jag ändrar textruta2 i rad ett till 3 istället för 2. Beräkningen skall då ge följande resultat.

1|3|4*
2|3|5
3|3|6

med utgångspunkt från första exemplet gör jag följande förändring. jag ändrar värdet i textruta3 på första raden från 3 till 8. Beräkningen bör ge följande resultat:

1|7|8*
2|7|9
3|7|10

med utgångspunkt från första exemplet gör jag följande förändring: jag ändrar textruta3 i första raden från 3 till 0. beräkningen bör ge följande resultat:

1|-1|0*
2|-1|1
3|-1|2

i mina exempel ovan och med endast dessa textrutor så går det inte att framkalla eventiellt negativa värden av textruta3 eftersom jag inte skall tillåtas att ange ett negativt värde i ett fält. beräkningen kan dock ge ett negativt värde.

daniel_raMedlem sedan jan. 2002381 inlägg
#22

jag har redan fått grym hjälp med detta.. Tack för det!! jag klarar dock inte av att göra de förändringar jag behöver för att det skall fungera som jag vill. Om du har tid peter så skulle jag bli superglad om du kunde hjälpa mig lite till med detta =)

Peter SMedlem sedan dec. 20025 483 inlägg
#23
<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:
    {
      elms["textrutaSumma_" + row].value
          = parseInt(elms["textruta" + row + "_1"].value) + parseInt(elms["textruta" + row + "_2"].value);
      elms["textrutaTotal_" + row].value = Math.round(1.25 * elms["textrutaSumma_" + row].value);

    } break;

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

    } break;
  }
}

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

  e = e || window.event;

  if (!e || e.keyCode == 9 || 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 (/^textrutaSumma_(\d+)/.test(i.name)){
    if (RegExp.$1 == cc.charAt(cc.length - 1)){
      /* change all rows */
      var val = i.value - elms["textruta" + RegExp.$1 + "_1"].value;
      for (var k = 1; k <= nr; ++k){
        elms["textruta" + k + "_2"].value = val;
        updateRow(elms, k, 3);
      }
    } else {
      /* change this row only */
      updateRow(elms, RegExp.$1, 3);
    }
  } else if (/^textrutaTotal_(\d+)/.test(i.name)){
    if (RegExp.$1 == cc.charAt(cc.length - 1)){
      /* change all rows */
      for (var k = 1; k <= nr; ++k){
        elms["textrutaTotal_" + k].value = i.value;
        updateRow(elms, k, 4);
      }
    } else {
      /* change this row only */
    }
  }
}

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>

Några punkter som ej åtgärdats ännu:

  • Konstanterna är ej medtagna
  • Negativa tal går ej att ange i de två första fälten

Räknas det rätt nu?

Hur tabulerar du för att få konstiga uträkningar?

daniel_raMedlem sedan jan. 2002381 inlägg
#24

Två saker som märker. dels så är kan jag ibland inte ändra värdet i textruta3_x alls. den ändrar då tillbaka direkt till det värde som var innan jag försökte ändra. dels så skall textruta4_x ju vara en funktion av (textruta3_x *1.25). jag skall dock givetvis kunna ändra värdet i detta fält, räkna om textruta3_x beroende på vad jag angav i textruta4_x och sedan skall de andra textrutorna beräknas precis som om förändringen gjorts i textruta 3. hoppas att du förstår vad jag menar

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

Hm, jag glömde visst att aktivera funktionaliteten för de fält vars radioknapp ej är ikryssad ;)

<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:
    {
      elms["textrutaSumma_" + row].value
          = parseInt(elms["textruta" + row + "_1"].value) + parseInt(elms["textruta" + row + "_2"].value);
      elms["textrutaTotal_" + row].value = Math.round(1.25 * elms["textrutaSumma_" + row].value);

    } break;

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

    } break;
  }
}

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

  e = e || window.event;

  if (!e || e.keyCode == 9 || 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 (/^textrutaSumma_(\d+)/.test(i.name)){
    var val = i.value - elms["textruta" + RegExp.$1 + "_1"].value;
    if (RegExp.$1 == cc.charAt(cc.length - 1)){
      /* change all rows */
      for (var k = 1; k <= nr; ++k){
        elms["textruta" + k + "_2"].value = val;
        updateRow(elms, k, 3);
      }
    } else {
      /* change this row only */
      elms["textruta" + RegExp.$1 + "_2"].value = val;
      updateRow(elms, RegExp.$1, 3);
    }
  } else if (/^textrutaTotal_(\d+)/.test(i.name)){
    if (RegExp.$1 == cc.charAt(cc.length - 1)){
      /* change all rows */
      for (var k = 1; k <= nr; ++k){
        elms["textrutaTotal_" + k].value = i.value;
        updateRow(elms, k, 4);
      }
    } else {
      /* change this row only */
      updateRow(elms, RegExp.$1, 4);
    }
  }
}

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>
daniel_raMedlem sedan jan. 2002381 inlägg
#26

nu fungerar det bättre, det finns en sak som jag nämnde ovan som bryter lite mot mönstret för hur raderna skall uppdateras som inte fungerar
----------------
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.
----------------

sen är det egentligen bara konstanterna för respektive rad som skall vara med i beräkningen. sen är allt precis som jag tänkt mig =)

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

Okej, ett nytt test :)

<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 sumVal = parseInt(elms["textruta" + row + "_1"].value) + parseInt(elms["textruta" + row + "_2"].value);
      if (sumVal < 0){
        elms["textrutaSumma_" + row].value = 0;
        elms["textruta" + row + "_2"].value = -parseInt(elms["textruta" + row + "_1"].value);
      } else {
        elms["textrutaSumma_" + row].value = sumVal;
      }
      elms["textrutaTotal_" + row].value = Math.round(1.25 * elms["textrutaSumma_" + row].value);

    } break;

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

    } break;
  }
}

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

  e = e || window.event;

  if (!e || e.keyCode == 9 || 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 (/^textrutaSumma_(\d+)/.test(i.name)){
    var val = i.value - elms["textruta" + RegExp.$1 + "_1"].value;
    if (RegExp.$1 == cc.charAt(cc.length - 1)){
      /* change all rows */
      for (var k = 1; k <= nr; ++k){
        elms["textruta" + k + "_2"].value = val;
        updateRow(elms, k, 3);
      }
    } else {
      /* change this row only */
      elms["textruta" + RegExp.$1 + "_2"].value = val;
      updateRow(elms, RegExp.$1, 3);
    }
  } else if (/^textrutaTotal_(\d+)/.test(i.name)){
    if (RegExp.$1 == cc.charAt(cc.length - 1)){
      /* change all rows */
      for (var k = 1; k <= nr; ++k){
        elms["textrutaTotal_" + k].value = i.value;
        updateRow(elms, k, 4);
      }
    } else {
      /* change this row only */
      updateRow(elms, RegExp.$1, 4);
    }
  }
}

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>

Skulle någonting vara på tok får du gärna ge exempel med vilka värden i de olika fälten detta sker.

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