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