Hi Vijay,
I'm not getting this in my bsh.
Here's what I did:
double thisMonthSales = 0;
for (i = 0, thisMonthSales = 0; i < 10; i++) {
thisMonthSales += 10;
}
Debug.logInfo("thisMonthSales: " + thisMonthSales, "");
That worked, without "super.". Omitting the declaration "double
thisMonthSales = 0" will mean the
type is defaulted to integer, not double. (Technically speaking, the
"type" is a bsh.Primitive,
actually.)
I'm really interested in catching and documenting this bug (in
beanshell?). Please help? Thanks.
Note that removing the declaration "double thisMonthSales = 0" AND also
removing the for-loop
initialization "thisMonthSales = 0" will give you that error --- "Illegal
use of undefined
object... blah blah".
"In BeanShell using an untyped or "loosely" typed variable is also
equivalent
to declaring a local variable. That is, if you use a variable that has
not
been defined elsewhere, it defaults to the local scope:"
In my test, it is functioning as per the documentation.
In the example you and I used, there are actually 2 declarations of the
variable "thisMonthSales".
One is above the for-loop, the other is inside the for-loop
initialization.
Omitting the first declaration will mean you are using an untyped or
"loosely" typed variable
"thisMonthSales" inside the for-loop initialization. Once out of the loop,
the reference to
variable "thisMonthSales" works because it IS "defined elsewhere",
"elsewhere" being "inside the
for-loop".
As I said, if you do proper Java in beanshell, you should be safe. Syntax
and structures are a bit
different when you go into classes and sub-classing and methods, etc.
Jonathon
vijay Si wrote:
Hi people here's the example:
double thisMonthSales = 0;
for( i=0,super.thisMonthSales=0; i<=(elim.size()-1); i++)
{
super.thisMonthSales += elim.get
(i).getDouble("grandTotal").doubleValue();
}
I was earlier omitting super.thisMonthSales=0 within for loop. This
resulted in an error "Illegal use of undefined object or 'void' literal
"
Even removing "super" keyword from : super.thisMonthSales +=
elim.get(i).getDouble("grandTotal").doubleValue();
: did not work. Atleast this was expected to work because i had defined
the
variable outside the loop too.
A point from the bshmanual.
"In BeanShell using an untyped or "loosely"
typed variable is also equivalent to declaring a local variable. That
is, if
you use a variable that has not been
defined elsewhere, it defaults to the local scope:"
Thanks and Regards.
Vijay
On 9/26/07, [EMAIL PROTECTED] <[EMAIL PROTECTED]> wrote:
vija
"So if one has to use the same variable elsewhere than one must declare
it
outside the loop and refer to it elsewhere as super.variable to use the
same
version of the varible."
Gads. I would love to see an example of this so I can avoid the same
problem.
Skip
-----Original Message-----
From: vijay Si [mailto:[EMAIL PROTECTED]
Sent: Wednesday, September 26, 2007 12:49 AM
To: [email protected]
Subject: Re: TypeCasting GenericValue object.
Thanks....Skip.
I got this point after some expeimentation " Typically, the
GenericValue
contains the name/value
pairs of some row in a table or view."
I changed my code accordingly... to use elim.get
(i).getDouble("grandTotal").doubleValue();
thanks for the support.
One point that i would like to share is about beanshell.
Beanshell localizes the scope of the variable used within the loop to
that
loop.
So if one has to use the same variable elsewhere than one must declare
it
outside the loop and refer to it elsewhere as super.variable to use the
same
version of the varible.
This actually took up lot of my time and was also one the reasons for
"void"
!!
On 9/26/07, Skip <[EMAIL PROTECTED]> wrote:
vijay
I don't understand some of the code in your example. But, if you look
at
the source for GenericEntity (which GenericValue is a subclass of),
you
will
see that at its heart, there is a Map of name-value pairs, i.e. a
String
which is the field name mapped to (in this case) the value(s)
retrieved
by
the GenericDelegator. Typically, the GenericValue contains the
name/value
pairs of some row in a table or view.
But, here is some code that will do what you want (assuming that
"grandTotal" is really a field in OrderHeader which I don't remember
for
sure.) I have not included the required try/catch error trapping for
clarity.
//Get a list of orders matching our conditions. In place of the
ellipse,
add your conditions
List orders = delegator.findByAnd("OrderHeader", ...);
Iterator i = orders.iterator();
double total = 0.0;
//Go through the list and add up all the "grandTotal" values.
while (i.hasNext())
{
GenericValue orderHeader = (GenericValue) i.next();
String orderId = orderHeader.getString("orderId");
Double totalThisOrder = orderHeader.getDouble("grandTotal");
System.out.println("Order id is " + orderId + "\t\tAmount is " +
totalThisOrder);
if(totalThisOrder != null)
total += totalThisOrder.doubleValue();
}
System.out.println(" \t\t Grand Total " + total);
In the above example, "orders" is a Java List of GenericValue objects
returned by the delegator. We have to iterate through them and
extract
the
"grandTotal" values to add up.
This is such a common task that maybe I'll write a
double GenericValue.sumDouble(List <GenericValue>values, String field)
and
long GenericValue.sumLong(List <GenericValue>values, String field)
Give it a try and see if this is not what you want.
Skip
-----Original Message-----
From: vijay Si [mailto:[EMAIL PROTECTED]
Sent: Tuesday, September 25, 2007 2:32 AM
To: [email protected]
Subject: Re: TypeCasting GenericValue object.
Hello Skip,
My piece of code is :
itelim = elim.iterator(); //where elim =
findByCond(........);
elimList = new ArrayList();
while(itelim.hasNext())
{
elimList = itelim.next();
elimList.toString();
String a1 = elimList.getString("grandTotal");
a = Double.parseDouble(a1);
}
Now this does give me some result at the o/p : which is last entry in
the
grandTotal column(a double value) say for eg: 350.30
I also used the piece of code that you provided.....it works for sure
but
gives "void" at the o/p.......
Also wanted to ask as to how can i iterate over the grandTotal
entries.
for
eg: if i have to get grandTotal for all products and sum it up.
Thanks
On 9/25/07, [EMAIL PROTECTED] <[EMAIL PROTECTED]> wrote:
You can't type cast the GenericValue. You possibly can type cast one
of
the
objects it holds depending on the type. Each GenericValue holds
different
types if information depending on what it represents. For example,
GenericValue existingOrderHeader = delegator.findByPrimaryKey
("OrderHeader",
UtilMisc.toMap("orderId", orderId));
String customerId = externalOrderHeader.getString("customerPartyId");
if OrderHeader had a Double value in it, say "grandTotal", you could
double grandTotal =
externalOrderHeader.getDouble("grandTotal").doubleValue();
or
double grandTotal =
((Double)externalOrderHeader.get("grandTotal")).doubleValue();
Both of these will throw a ClassCastException if "grandTotal" is not
a
double.
Everything in a GenericValue object is an object itself, i.e double
is
wrapped in Double, etc.
Hope that helps
Skip
-----Original Message-----
From: vijay Si [mailto:[EMAIL PROTECTED]
Sent: Monday, September 24, 2007 11:12 PM
To: [email protected]
Subject: TypeCasting GenericValue object.
Hi,
I have been trying to type cast a generic value object to double and
string,
but i get an error
"java.lang.ClassCastException: Cannot cast
org.ofbiz.entity.GenericValueto
java.lang.xx"
Is there any particular way in ofbiz to work around this?
Regards
------------------------------------------------------------------------
No virus found in this incoming message.
Checked by AVG Free Edition.
Version: 7.5.488 / Virus Database: 269.13.32/1032 - Release Date:
9/26/2007 8:20 PM