Connecting Tech Pros Worldwide Help | Site Map

Help with loop

 
LinkBack Thread Tools Search this Thread
  #1  
Old July 23rd, 2005, 11:22 AM
Targa
Guest
 
Posts: n/a
Default Help with loop

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......




  #2  
Old July 23rd, 2005, 11:22 AM
Shawn Milo
Guest
 
Posts: n/a
Default Re: Help with loop

"Targa" <targa1_removethistoreply_@alltel.net> wrote in message news:<f9yvc.322$783.131@fe39.usenetserver.com>...[color=blue]
> 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?[/color]
<snip>


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 -- //
  #3  
Old July 23rd, 2005, 11:22 AM
Richard Cornford
Guest
 
Posts: n/a
Default Re: Help with loop

Shawn Milo wrote:
<snip>[color=blue]
> 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.[/color]

OK:-

<snip>[color=blue]
> qty = eval('form.Line_Qty' + lineNum);[/color]

qty = form['Line_Qty' + lineNum];
[color=blue]
> prc = eval('form.Line_Unit_Price' + lineNum);[/color]

prc = form['Line_Unit_Price' + lineNum];
[color=blue]
> subt = eval('form.Line_Subtotal' + lineNum);[/color]

subt = form['Line_Subtotal' + lineNum];

<snip>[color=blue]
> qty = eval('form.Line_Qty' + lineNum);[/color]

qty = form['Line_Qty' + lineNum];
[color=blue]
> prc = eval('form.Line_Unit_Price' + lineNum);[/color]

prc = form['Line_Unit_Price' + lineNum];
[color=blue]
> subt = eval('form.Line_Subtotal' + lineNum);[/color]

subt = form['Line_Subtotal' + lineNum];

<URL: http://jibbering.com/faq/#FAQ4_39 >

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.


  #4  
Old July 23rd, 2005, 11:22 AM
Targa
Guest
 
Posts: n/a
Default Re: Help with loop

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" <Richard@litotes.demon.co.uk> wrote in message
news:c9nbf6$3ta$1$830fa17d@news.demon.co.uk...[color=blue]
> Shawn Milo wrote:
> <snip>[color=green]
> > 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.[/color]
>
> OK:-
>
> <snip>[color=green]
> > qty = eval('form.Line_Qty' + lineNum);[/color]
>
> qty = form['Line_Qty' + lineNum];
>[color=green]
> > prc = eval('form.Line_Unit_Price' + lineNum);[/color]
>
> prc = form['Line_Unit_Price' + lineNum];
>[color=green]
> > subt = eval('form.Line_Subtotal' + lineNum);[/color]
>
> subt = form['Line_Subtotal' + lineNum];
>
> <snip>[color=green]
> > qty = eval('form.Line_Qty' + lineNum);[/color]
>
> qty = form['Line_Qty' + lineNum];
>[color=green]
> > prc = eval('form.Line_Unit_Price' + lineNum);[/color]
>
> prc = form['Line_Unit_Price' + lineNum];
>[color=green]
> > subt = eval('form.Line_Subtotal' + lineNum);[/color]
>
> subt = form['Line_Subtotal' + lineNum];
>
> <URL: http://jibbering.com/faq/#FAQ4_39 >
>
> 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.
>
>[/color]



  #5  
Old July 23rd, 2005, 11:22 AM
Lee
Guest
 
Posts: n/a
Default Re: Help with loop

Targa said:
[color=blue]
> 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;[/color]

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.

  #6  
Old July 23rd, 2005, 11:22 AM
Targa
Guest
 
Posts: n/a
Default Re: Help with loop

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:
<SCRIPT LANGUAGE="JavaScript"><!--
// INVOICE CALCULATIONS
function calc(form) {
var sum = 0;
var rowsum;
var quantity = 1;
var lineNumber = 1;

var qty;
var prc;
var subt;
qty = form['Line_Qty' + lineNumber];
prc = form['Line_Unit_Price' + lineNumber];
subt = form['Line_Item_Subtotal' + lineNumber];

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)
}

lineNumber++;
qty = form['Line_Qty' + lineNumber];
prc = form['Line_Unit_Price' + lineNumber];
subt = form['Line_Item_Subtotal' + lineNumber];

}

var total=0;
var form = document.forms["calculations"];
for (var i=1; i<=<%= RS("myTotal")%>; i++) {
total += (form["Line_Item_Subtotal"+i].value-0);
}
function money(num) // converts from floating point to money format
{
var amount = Math.abs(num);
var pounds = Math.floor(amount);
var pence = Math.round( 100*(amount-pounds) );
if(pence>99) pence=0, pounds++;
pence += ""
while (pence.length < 2) pence = "0" + pence;
amount = pounds + "." + pence;
if (num < 0) return "[" + amount + "]";
return amount;
}

//-->
</SCRIPT>



"Targa" <targa1_removethistoreply_@alltel.net> wrote in message
news:IhHvc.384$783.64@fe39.usenetserver.com...[color=blue]
> 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" <Richard@litotes.demon.co.uk> wrote in message
> news:c9nbf6$3ta$1$830fa17d@news.demon.co.uk...[color=green]
> > Shawn Milo wrote:
> > <snip>[color=darkred]
> > > 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.[/color]
> >
> > OK:-
> >
> > <snip>[color=darkred]
> > > qty = eval('form.Line_Qty' + lineNum);[/color]
> >
> > qty = form['Line_Qty' + lineNum];
> >[color=darkred]
> > > prc = eval('form.Line_Unit_Price' + lineNum);[/color]
> >
> > prc = form['Line_Unit_Price' + lineNum];
> >[color=darkred]
> > > subt = eval('form.Line_Subtotal' + lineNum);[/color]
> >
> > subt = form['Line_Subtotal' + lineNum];
> >
> > <snip>[color=darkred]
> > > qty = eval('form.Line_Qty' + lineNum);[/color]
> >
> > qty = form['Line_Qty' + lineNum];
> >[color=darkred]
> > > prc = eval('form.Line_Unit_Price' + lineNum);[/color]
> >
> > prc = form['Line_Unit_Price' + lineNum];
> >[color=darkred]
> > > subt = eval('form.Line_Subtotal' + lineNum);[/color]
> >
> > subt = form['Line_Subtotal' + lineNum];
> >
> > <URL: http://jibbering.com/faq/#FAQ4_39 >
> >
> > 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.
> >
> >[/color]
>
>
>[/color]



  #7  
Old July 23rd, 2005, 11:22 AM
Donald F. McLean
Guest
 
Posts: n/a
Default Re: Help with loop

Lee wrote:
[color=blue]
> Targa said:
>
>[color=green]
>> 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;[/color]
>
>
> Those first two lines are doing nothing useful.
> The value attribute of a form element is *always* a string.[/color]

I'm not convinced that's entirely true - it does cause the values
to be normalized.
[color=blue]
> 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.[/color]

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
  #8  
Old July 23rd, 2005, 11:22 AM
Lee
Guest
 
Posts: n/a
Default Re: Help with loop

Donald F. McLean said:[color=blue]
>
>Lee wrote:
>[color=green]
>> Targa said:
>>
>>[color=darkred]
>>> 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;[/color]
>>
>>
>> Those first two lines are doing nothing useful.
>> The value attribute of a form element is *always* a string.[/color]
>
>I'm not convinced that's entirely true - it does cause the values
>to be normalized.[/color]

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.

 

Bookmarks

Thread Tools Search this Thread
Search this Thread:

Advanced Search

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On

Popular Articles

What is Bytes?

We are a network of experts and professionals in IT and software development that help one another with answers to tough questions and share insights. Get the best answers to your questions from over 220,989 network members.