459,528 Members | 1,375 Online Need help? Post your question and get tips & solutions from a community of 459,528 IT Pros & Developers. It's quick & easy.

# Help with loop

 P: n/a Im using the script below to total lines on an invoice. There are 3 fields per line: Line_Qty(n), Line_Unit_Price(n) and Line_Item_Subtotal(n). It works when there is a fixed number of lines but I need to have it work for any amount of lines. Can somebody help me convert this into a loop? Thanks in advance! function calc(form) { var sum = 0; var rowsum; var quantity = 1 // Add Lines if ( parseFloat(form.Line_Qty1.value) && parseFloat(form.Line_Unit_Price1.value) ) { quantity += parseInt(form.Line_Qty1.value); form.Line_Qty1.value = parseInt(form.Line_Qty1.value); form.Line_Unit_Price1.value = parseFloat(form.Line_Unit_Price1.value); rowsum = form.Line_Qty1.value * form.Line_Unit_Price1.value; sum += rowsum; form.Line_Unit_Price1.value = money(form.Line_Unit_Price1.value); form.Line_Item_Subtotal1.value = money(rowsum) } if ( parseFloat(form.Line_Qty2.value) && parseFloat(form.Line_Unit_Price2.value) ) { quantity += parseInt(form.Line_Qty2.value); form.Line_Qty2.value = parseInt(form.Line_Qty2.value); form.Line_Unit_Price2.value = parseFloat(form.Line_Unit_Price2.value); rowsum = form.Line_Qty2.value * form.Line_Unit_Price2.value; sum += rowsum; form.Line_Unit_Price2.value = money(form.Line_Unit_Price2.value); form.Line_Item_Subtotal2.value = money(rowsum) } if ( parseFloat(form.Line_Qty3.value) && parseFloat(form.Line_Unit_Price3.value) ) { quantity += parseInt(form.Line_Qty3.value); form.Line_Qty3.value = parseInt(form.Line_Qty3.value); form.Line_Unit_Price3.value = parseFloat(form.Line_Unit_Price3.value); rowsum = form.Line_Qty3.value * form.Line_Unit_Price3.value; sum += rowsum; form.Line_Unit_Price3.value = money(form.Line_Unit_Price3.value); form.Line_Item_Subtotal3.value = money(rowsum) } and so on...... Jul 23 '05 #1
7 Replies

 P: n/a "Targa" wrote in message news:... Im using the script below to total lines on an invoice. There are 3 fields per line: Line_Qty(n), Line_Unit_Price(n) and Line_Item_Subtotal(n). It works when there is a fixed number of lines but I need to have it work for any amount of lines. Can somebody help me convert this into a loop? Try something like this (untested). Some people would say that using eval() is a bad thing, so maybe one of them will take the time to post an alternative. Shawn // -- code follows -- // var lineNum = 1; var qty; var prc; var subt; qty = eval('form.Line_Qty' + lineNum); prc = eval('form.Line_Unit_Price' + lineNum); subt = eval('form.Line_Subtotal' + lineNum); while (qty.value){ if ( parseFloat(qty.value) && parseFloat(prc.value) ) { quantity += parseInt(qty.value); qty.value = parseInt(qty.value); prc.value = parseFloat(prc.value); rowsum = qty.value * prc.value; sum += rowsum; prc.value = money(prc.value); subt.value = money(rowsum) } lineNum++; qty = eval('form.Line_Qty' + lineNum); prc = eval('form.Line_Unit_Price' + lineNum); subt = eval('form.Line_Subtotal' + lineNum); } // -- end of code -- // Jul 23 '05 #2

 P: n/a Shawn Milo wrote: Try something like this (untested). Some people would say that using eval() is a bad thing, so maybe one of them will take the time to post an alternative. OK:- qty = eval('form.Line_Qty' + lineNum); qty = form['Line_Qty' + lineNum]; prc = eval('form.Line_Unit_Price' + lineNum); prc = form['Line_Unit_Price' + lineNum]; subt = eval('form.Line_Subtotal' + lineNum); subt = form['Line_Subtotal' + lineNum]; qty = eval('form.Line_Qty' + lineNum); qty = form['Line_Qty' + lineNum]; prc = eval('form.Line_Unit_Price' + lineNum); prc = form['Line_Unit_Price' + lineNum]; subt = eval('form.Line_Subtotal' + lineNum); subt = form['Line_Subtotal' + lineNum]; In this context the alternative to - eval - is the standard bracket notation property accessor syntax, supported in every javascript version, shorter, simpler and between two and twenty times faster depending on the browser (and unlike - eval - is not optional in ECMA 327 "Compact Profile" implementations so it will also work in more browsers). The reason that - eval - is considered a bad thing is that it really is the _worst_ way of doing 99.99% of the things that are done with it. Richard. Jul 23 '05 #3

 P: n/a Hey! Looks like youve got me on the right track! But now I get 'undefined' is null or not an object. How can I track this buggar down? "Richard Cornford" wrote in message news:c9*******************@news.demon.co.uk... Shawn Milo wrote: Try something like this (untested). Some people would say that using eval() is a bad thing, so maybe one of them will take the time to post an alternative. OK:- qty = eval('form.Line_Qty' + lineNum); qty = form['Line_Qty' + lineNum]; prc = eval('form.Line_Unit_Price' + lineNum); prc = form['Line_Unit_Price' + lineNum]; subt = eval('form.Line_Subtotal' + lineNum); subt = form['Line_Subtotal' + lineNum]; qty = eval('form.Line_Qty' + lineNum); qty = form['Line_Qty' + lineNum]; prc = eval('form.Line_Unit_Price' + lineNum); prc = form['Line_Unit_Price' + lineNum]; subt = eval('form.Line_Subtotal' + lineNum); subt = form['Line_Subtotal' + lineNum]; In this context the alternative to - eval - is the standard bracket notation property accessor syntax, supported in every javascript version, shorter, simpler and between two and twenty times faster depending on the browser (and unlike - eval - is not optional in ECMA 327 "Compact Profile" implementations so it will also work in more browsers). The reason that - eval - is considered a bad thing is that it really is the _worst_ way of doing 99.99% of the things that are done with it. Richard. Jul 23 '05 #4

 P: n/a Targa said: form.Line_Qty1.value = parseInt(form.Line_Qty1.value); form.Line_Unit_Price1.value = parseFloat(form.Line_Unit_Price1.value); rowsum = form.Line_Qty1.value * form.Line_Unit_Price1.value; Those first two lines are doing nothing useful. The value attribute of a form element is *always* a string. You're parsing the numeric values out of those strings, storing them back into the value attributes, which causes the engine to automatically convert them back to strings, then multiplying those strings, which causes them to be automatically converted back to numbers. Jul 23 '05 #5

 P: n/a Actually, the loop Shawn provided is working (with Richard's mod) Each line totals up fine. I think its the next step (totaling all the lines) that's tripping me up: var total=0; var form = document.forms["calculations"]; for (var i=1; i<=<%= RS("myTotal")%>; i++) { total += (form["Line_Item_Subtotal"+i].value-0); } form.subtotal.value = money(total); On page load I get 'undefined' is null or not an object. Once I hit the calc button, I get 'value' is null or not an object. It always returns the wrong line # so I dont know to to trace it. Complete code: "Targa" wrote in message news:Ih**************@fe39.usenetserver.com... Hey! Looks like youve got me on the right track! But now I get 'undefined' is null or not an object. How can I track this buggar down? "Richard Cornford" wrote in message news:c9*******************@news.demon.co.uk... Shawn Milo wrote: Try something like this (untested). Some people would say that using eval() is a bad thing, so maybe one of them will take the time to post an alternative. OK:- qty = eval('form.Line_Qty' + lineNum); qty = form['Line_Qty' + lineNum]; prc = eval('form.Line_Unit_Price' + lineNum); prc = form['Line_Unit_Price' + lineNum]; subt = eval('form.Line_Subtotal' + lineNum); subt = form['Line_Subtotal' + lineNum]; qty = eval('form.Line_Qty' + lineNum); qty = form['Line_Qty' + lineNum]; prc = eval('form.Line_Unit_Price' + lineNum); prc = form['Line_Unit_Price' + lineNum]; subt = eval('form.Line_Subtotal' + lineNum); subt = form['Line_Subtotal' + lineNum]; In this context the alternative to - eval - is the standard bracket notation property accessor syntax, supported in every javascript version, shorter, simpler and between two and twenty times faster depending on the browser (and unlike - eval - is not optional in ECMA 327 "Compact Profile" implementations so it will also work in more browsers). The reason that - eval - is considered a bad thing is that it really is the _worst_ way of doing 99.99% of the things that are done with it. Richard. Jul 23 '05 #6

 P: n/a Lee wrote: Targa said: form.Line_Qty1.value = parseInt(form.Line_Qty1.value); form.Line_Unit_Price1.value = parseFloat(form.Line_Unit_Price1.value); rowsum = form.Line_Qty1.value * form.Line_Unit_Price1.value; Those first two lines are doing nothing useful. The value attribute of a form element is *always* a string. I'm not convinced that's entirely true - it does cause the values to be normalized. You're parsing the numeric values out of those strings, storing them back into the value attributes, which causes the engine to automatically convert them back to strings, then multiplying those strings, which causes them to be automatically converted back to numbers. Assuming that we want the values in the fields to be normalized, is it less efficient to use the code above or something like this: var quantity = parseInt(form.Line_Qty1.value); form.Line_Qty1.value = quantity; var value = parseFloat(form.Line_Unit_Price1.value); form.Line_Unit_Price1.value = value; rowsum = quantity * value; I'm guessing that it probably doesn't matter that much. Donald Jul 23 '05 #7

 P: n/a Donald F. McLean said:Lee wrote: Targa said: form.Line_Qty1.value = parseInt(form.Line_Qty1.value); form.Line_Unit_Price1.value = parseFloat(form.Line_Unit_Price1.value); rowsum = form.Line_Qty1.value * form.Line_Unit_Price1.value; Those first two lines are doing nothing useful. The value attribute of a form element is *always* a string.I'm not convinced that's entirely true - it does cause the valuesto be normalized. That's why I said "nothing useful", rather than absolutely nothing. Note that it will change a price entered as "2.10" to "2.1", which is probably not what they really want. Jul 23 '05 #8

### This discussion thread is closed

Replies have been disabled for this discussion. 