TypeCasting GenericValue object.

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
16 messages Options
Reply | Threaded
Open this post in threaded view
|

TypeCasting GenericValue object.

vijay Si
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.GenericValue to
java.lang.xx"

Is there any particular way in ofbiz to work around this?

Regards
Reply | Threaded
Open this post in threaded view
|

RE: TypeCasting GenericValue object.

Nikita Shinde
Hi,

Apply .toString() to your generic value object.

Eg: if your generic record is orderItem then do orderItem.toString()


Thanks,
Nikita.
Amicon Technologies Pvt. Ltd.
Mumbai.


-----Original Message-----
From: vijay Si [mailto:[hidden email]]
Sent: Tuesday, September 25, 2007 11:42 AM
To: [hidden email]
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.GenericValue to
java.lang.xx"

Is there any particular way in ofbiz to work around this?

Regards

Reply | Threaded
Open this post in threaded view
|

RE: TypeCasting GenericValue object.

SkipDever
In reply to this post by vijay Si
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:[hidden email]]
Sent: Monday, September 24, 2007 11:12 PM
To: [hidden email]
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.GenericValue to
java.lang.xx"

Is there any particular way in ofbiz to work around this?

Regards

Reply | Threaded
Open this post in threaded view
|

Re: TypeCasting GenericValue object.

vijay Si
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, skip@theDevers <[hidden email]> 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:[hidden email]]
> Sent: Monday, September 24, 2007 11:12 PM
> To: [hidden email]
> 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
>
>
Reply | Threaded
Open this post in threaded view
|

RE: TypeCasting GenericValue object.

SkipDever
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:[hidden email]]
Sent: Tuesday, September 25, 2007 2:32 AM
To: [hidden email]
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, skip@theDevers <[hidden email]> 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:[hidden email]]
> Sent: Monday, September 24, 2007 11:12 PM
> To: [hidden email]
> 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
>
>

Reply | Threaded
Open this post in threaded view
|

Re: TypeCasting GenericValue object.

vijay Si
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 <[hidden email]> 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:[hidden email]]
> Sent: Tuesday, September 25, 2007 2:32 AM
> To: [hidden email]
> 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, skip@theDevers <[hidden email]> 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:[hidden email]]
> > Sent: Monday, September 24, 2007 11:12 PM
> > To: [hidden email]
> > 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
> >
> >
>
>
Reply | Threaded
Open this post in threaded view
|

Re: TypeCasting GenericValue object.

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

Isn't that how Java works?

Or do you mean that you:

1. Declared variable outside loop

2. Used variable inside loop, but got a null there?

It's easy to develop bad Java coding habits in Beanshell. Just try to do proper Java in Beanshell,
and things should work as expected. But don't try classes and methods, they're slightly different.

Jonathon

vijay Si wrote:

> 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 <[hidden email]> 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:[hidden email]]
>> Sent: Tuesday, September 25, 2007 2:32 AM
>> To: [hidden email]
>> 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, skip@theDevers <[hidden email]> 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:[hidden email]]
>>> Sent: Monday, September 24, 2007 11:12 PM
>>> To: [hidden email]
>>> 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.30/1030 - Release Date: 9/25/2007 8:02 AM

Reply | Threaded
Open this post in threaded view
|

RE: TypeCasting GenericValue object.

SkipDever
In reply to this post by vijay Si
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:[hidden email]]
Sent: Wednesday, September 26, 2007 12:49 AM
To: [hidden email]
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 <[hidden email]> 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:[hidden email]]
> Sent: Tuesday, September 25, 2007 2:32 AM
> To: [hidden email]
> 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, skip@theDevers <[hidden email]> 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:[hidden email]]
> > Sent: Monday, September 24, 2007 11:12 PM
> > To: [hidden email]
> > 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
> >
> >
>
>

Reply | Threaded
Open this post in threaded view
|

Re: TypeCasting GenericValue object.

vijay Si
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, skip@theDevers <[hidden email]> 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:[hidden email]]
> Sent: Wednesday, September 26, 2007 12:49 AM
> To: [hidden email]
> 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 <[hidden email]> 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:[hidden email]]
> > Sent: Tuesday, September 25, 2007 2:32 AM
> > To: [hidden email]
> > 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, skip@theDevers <[hidden email]> 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:[hidden email]]
> > > Sent: Monday, September 24, 2007 11:12 PM
> > > To: [hidden email]
> > > 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
> > >
> > >
> >
> >
>
>
Reply | Threaded
Open this post in threaded view
|

Re: TypeCasting GenericValue object.

jonwimp
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, skip@theDevers <[hidden email]> 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:[hidden email]]
>> Sent: Wednesday, September 26, 2007 12:49 AM
>> To: [hidden email]
>> 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 <[hidden email]> 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:[hidden email]]
>>> Sent: Tuesday, September 25, 2007 2:32 AM
>>> To: [hidden email]
>>> 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, skip@theDevers <[hidden email]> 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:[hidden email]]
>>>> Sent: Monday, September 24, 2007 11:12 PM
>>>> To: [hidden email]
>>>> 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

Reply | Threaded
Open this post in threaded view
|

Re: TypeCasting GenericValue object.

vijay Si
Hi Johnathon,
Got the concept......thanks............

"Technically speaking, the "type" is a bsh.Primitive,
actually."

i agree.....but i did not get the bug ...can u please explain.

Regards

On 9/27/07, Jonathon -- Improov <[hidden email]> wrote:

>
> 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, skip@theDevers <[hidden email]> 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:[hidden email]]
> >> Sent: Wednesday, September 26, 2007 12:49 AM
> >> To: [hidden email]
> >> 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 <[hidden email]> 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:[hidden email]]
> >>> Sent: Tuesday, September 25, 2007 2:32 AM
> >>> To: [hidden email]
> >>> 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, skip@theDevers <[hidden email]> 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:[hidden email]]
> >>>> Sent: Monday, September 24, 2007 11:12 PM
> >>>> To: [hidden email]
> >>>> 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
>
>
Reply | Threaded
Open this post in threaded view
|

Re: TypeCasting GenericValue object.

jonwimp
Vijay,

This was what I wrote:

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

You mentioned that it is not possible to avoid the above-mentioned error unless you used the
"super." keyword. I'm not using that keyword, but am not getting the error. I would like to know
how you got the error.

Jonathon

vijay Si wrote:

> Hi Johnathon,
> Got the concept......thanks............
>
> "Technically speaking, the "type" is a bsh.Primitive,
> actually."
>
> i agree.....but i did not get the bug ...can u please explain.
>
> Regards
>
> On 9/27/07, Jonathon -- Improov <[hidden email]> wrote:
>> 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, skip@theDevers <[hidden email]> 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:[hidden email]]
>>>> Sent: Wednesday, September 26, 2007 12:49 AM
>>>> To: [hidden email]
>>>> 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 <[hidden email]> 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:[hidden email]]
>>>>> Sent: Tuesday, September 25, 2007 2:32 AM
>>>>> To: [hidden email]
>>>>> 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, skip@theDevers <[hidden email]> 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:[hidden email]]
>>>>>> Sent: Monday, September 24, 2007 11:12 PM
>>>>>> To: [hidden email]
>>>>>> 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
>>
>>
>
>
> ------------------------------------------------------------------------
>
> 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

Reply | Threaded
Open this post in threaded view
|

Re: TypeCasting GenericValue object.

vijay Si
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".


What i did was,
i defined the variable outside the loop first, and tried using it inside the
loop (without declaring it again within for(...here...) ) using super. this
gave me error. I thought that super is supposed to make it lookup to the
master copy. but that was not the case. Now again after your posting i tried
removing super keyword and it worked..only thing that was important was to
declare the variable to be used within for(...).




On 9/27/07, Jonathon -- Improov <[hidden email]> wrote:

>
> Vijay,
>
> This was what I wrote:
>
> >> 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".
>
> You mentioned that it is not possible to avoid the above-mentioned error
> unless you used the
> "super." keyword. I'm not using that keyword, but am not getting the
> error. I would like to know
> how you got the error.
>
> Jonathon
>
> vijay Si wrote:
> > Hi Johnathon,
> > Got the concept......thanks............
> >
> > "Technically speaking, the "type" is a bsh.Primitive,
> > actually."
> >
> > i agree.....but i did not get the bug ...can u please explain.
> >
> > Regards
> >
> > On 9/27/07, Jonathon -- Improov <[hidden email]> wrote:
> >> 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, skip@theDevers <[hidden email]> 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:[hidden email]]
> >>>> Sent: Wednesday, September 26, 2007 12:49 AM
> >>>> To: [hidden email]
> >>>> 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 <[hidden email]> 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:[hidden email]]
> >>>>> Sent: Tuesday, September 25, 2007 2:32 AM
> >>>>> To: [hidden email]
> >>>>> 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, skip@theDevers <[hidden email]> 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:[hidden email]]
> >>>>>> Sent: Monday, September 24, 2007 11:12 PM
> >>>>>> To: [hidden email]
> >>>>>> 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
> >>
> >>
> >
> >
> > ------------------------------------------------------------------------
> >
> > 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
>
>
Reply | Threaded
Open this post in threaded view
|

Re: TypeCasting GenericValue object.

Jacques Le Roux
Administrator
In reply to this post by jonwimp
Interesting,

Thanks Jonathon

Jacques

De : "Jonathon -- Improov" <[hidden email]>

> 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, skip@theDevers <[hidden email]> 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:[hidden email]]
> >> Sent: Wednesday, September 26, 2007 12:49 AM
> >> To: [hidden email]
> >> 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 <[hidden email]> 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:[hidden email]]
> >>> Sent: Tuesday, September 25, 2007 2:32 AM
> >>> To: [hidden email]
> >>> 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, skip@theDevers <[hidden email]> 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:[hidden email]]
> >>>> Sent: Monday, September 24, 2007 11:12 PM
> >>>> To: [hidden email]
> >>>> 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
>
Reply | Threaded
Open this post in threaded view
|

Re: TypeCasting GenericValue object.

jonwimp
In reply to this post by vijay Si
Hi Vijay,

Yes, it's important to declare a variable before it is used.

In the example you and I were using, there are 2 declarations: one outside the for-loop, the other
in the for-loop initialization. We're talking beanshell here, where a value-to-variable assignment
also counts as declaration (the one in the for-loop initialization).

Both declarations are actually outside/above the for-loop, so either one will work.

In standard Java, you either declare the variable outside the for-loop with "double thisMonthSales
= 0", or you do it in the for-loop initialization like this:

     for (int i = 0, double thisMonthSales = 0; i < whatever; i++)

Just do standard Java in beanshell, it should work. Again, methods and classes are different in
beanshell, so watch out for those.

Jonathon

vijay Si wrote:

> 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".
>
>
> What i did was,
> i defined the variable outside the loop first, and tried using it inside the
> loop (without declaring it again within for(...here...) ) using super. this
> gave me error. I thought that super is supposed to make it lookup to the
> master copy. but that was not the case. Now again after your posting i tried
> removing super keyword and it worked..only thing that was important was to
> declare the variable to be used within for(...).
>
>
>
>
> On 9/27/07, Jonathon -- Improov <[hidden email]> wrote:
>> Vijay,
>>
>> This was what I wrote:
>>
>>>> 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".
>> You mentioned that it is not possible to avoid the above-mentioned error
>> unless you used the
>> "super." keyword. I'm not using that keyword, but am not getting the
>> error. I would like to know
>> how you got the error.
>>
>> Jonathon
>>
>> vijay Si wrote:
>>> Hi Johnathon,
>>> Got the concept......thanks............
>>>
>>> "Technically speaking, the "type" is a bsh.Primitive,
>>> actually."
>>>
>>> i agree.....but i did not get the bug ...can u please explain.
>>>
>>> Regards
>>>
>>> On 9/27/07, Jonathon -- Improov <[hidden email]> wrote:
>>>> 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, skip@theDevers <[hidden email]> 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:[hidden email]]
>>>>>> Sent: Wednesday, September 26, 2007 12:49 AM
>>>>>> To: [hidden email]
>>>>>> 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 <[hidden email]> 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:[hidden email]]
>>>>>>> Sent: Tuesday, September 25, 2007 2:32 AM
>>>>>>> To: [hidden email]
>>>>>>> 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, skip@theDevers <[hidden email]> 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:[hidden email]]
>>>>>>>> Sent: Monday, September 24, 2007 11:12 PM
>>>>>>>> To: [hidden email]
>>>>>>>> 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
>>>>
>>>>
>>>
>>> ------------------------------------------------------------------------
>>>
>>> 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
>>
>>
>
>
> ------------------------------------------------------------------------
>
> 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

Reply | Threaded
Open this post in threaded view
|

Re: TypeCasting GenericValue object.

vijay Si
Thanks.....buddy..

On 9/27/07, Jonathon -- Improov <[hidden email]> wrote:

>
> Hi Vijay,
>
> Yes, it's important to declare a variable before it is used.
>
> In the example you and I were using, there are 2 declarations: one outside
> the for-loop, the other
> in the for-loop initialization. We're talking beanshell here, where a
> value-to-variable assignment
> also counts as declaration (the one in the for-loop initialization).
>
> Both declarations are actually outside/above the for-loop, so either one
> will work.
>
> In standard Java, you either declare the variable outside the for-loop
> with "double thisMonthSales
> = 0", or you do it in the for-loop initialization like this:
>
>      for (int i = 0, double thisMonthSales = 0; i < whatever; i++)
>
> Just do standard Java in beanshell, it should work. Again, methods and
> classes are different in
> beanshell, so watch out for those.
>
> Jonathon
>
> vijay Si wrote:
> > 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".
> >
> >
> > What i did was,
> > i defined the variable outside the loop first, and tried using it inside
> the
> > loop (without declaring it again within for(...here...) ) using super.
> this
> > gave me error. I thought that super is supposed to make it lookup to the
> > master copy. but that was not the case. Now again after your posting i
> tried
> > removing super keyword and it worked..only thing that was important was
> to
> > declare the variable to be used within for(...).
> >
> >
> >
> >
> > On 9/27/07, Jonathon -- Improov <[hidden email]> wrote:
> >> Vijay,
> >>
> >> This was what I wrote:
> >>
> >>>> 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".
> >> You mentioned that it is not possible to avoid the above-mentioned
> error
> >> unless you used the
> >> "super." keyword. I'm not using that keyword, but am not getting the
> >> error. I would like to know
> >> how you got the error.
> >>
> >> Jonathon
> >>
> >> vijay Si wrote:
> >>> Hi Johnathon,
> >>> Got the concept......thanks............
> >>>
> >>> "Technically speaking, the "type" is a bsh.Primitive,
> >>> actually."
> >>>
> >>> i agree.....but i did not get the bug ...can u please explain.
> >>>
> >>> Regards
> >>>
> >>> On 9/27/07, Jonathon -- Improov <[hidden email]> wrote:
> >>>> 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, skip@theDevers <[hidden email]> 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:[hidden email]]
> >>>>>> Sent: Wednesday, September 26, 2007 12:49 AM
> >>>>>> To: [hidden email]
> >>>>>> 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 <[hidden email]> 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:[hidden email]]
> >>>>>>> Sent: Tuesday, September 25, 2007 2:32 AM
> >>>>>>> To: [hidden email]
> >>>>>>> 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, skip@theDevers <[hidden email]> 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.edouble
> >>>> is
> >>>>>>>> wrapped in Double, etc.
> >>>>>>>>
> >>>>>>>> Hope that helps
> >>>>>>>>
> >>>>>>>> Skip
> >>>>>>>>
> >>>>>>>> -----Original Message-----
> >>>>>>>> From: vijay Si [mailto:[hidden email]]
> >>>>>>>> Sent: Monday, September 24, 2007 11:12 PM
> >>>>>>>> To: [hidden email]
> >>>>>>>> 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
> >>>>
> >>>>
> >>>
> >>>
> ------------------------------------------------------------------------
> >>>
> >>> 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
> >>
> >>
> >
> >
> > ------------------------------------------------------------------------
> >
> > 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
>
>