Page 1 of 1

Macro & OOP syntax

Posted: Thu Feb 28, 2008 2:39 am
by hua
I find the following work as expected (just an illustration),

Code: Select all

aOrders := {}
for i := 1 to 7
     cCnt := ltrim(str(i))
     aadd(aOrders, oDbf:order&cCnt)
next
Where in the end, aOrders would contain the value of oDbf:order1, oDbf:order2, oDbf:order3,....oDbf:order7. What annoys me is the reverse isn't true. That is, the following won't work.

Code: Select all

for i := 1 to 7
     cCnt := ltrim(str(i))
     oDbf:order&cCnt := aOrders[i]
next
The values just seem can't be assigned to the database object. Can anyone shed a light on why it's so and a workaround? I'm hoping to avoid having to code it line by line as such

Code: Select all

oDbf:order1 := aOrders[1]
oDbf:order2 := aOrders[2]
oDbf:order3 := aOrders[3]
                .
                .
                .
oDbf:order7 := aOrders[7]

Posted: Thu Feb 28, 2008 10:00 am
by xProgrammer
My guess would be (based on dim recollections of my C coding days) that the right hand side of the := is evaluated and the left hand side is taken to be in effect the storage location to which the result of that evaluation is stored. So the &cCnt isn't valid on the left hand side of the :=.

One possible workaround would be to use a combination of FieldPos() and FieldPut() in a method inside a method of CLASS Dbf.

Code: Select all

FOR i := 1 to 7
   cCnt := ltrim( str( i ) )
   oDbf:AssignOrder( order&cCnt, aOrders[i] )
NEXT
and inside CLASS Dbf

Code: Select all

METHOD AssignOrder (pName, pValue ) CLASS Dbf
   FieldPut( FieldPos( pName ), pValue )
RETURN nil
That assumes that you want to put the values directly into the (one) table.

I don't know enough about what you are really trying to do to be of more help, but personally I avoid using &. Why can't class Dbf use an array? Or should you have a sub-table? I'm only guessing, but maybe there's a more elegant solution waiting to be found.

Regards
xProgrammer

Posted: Thu Feb 28, 2008 12:39 pm
by Antonio Linares
Hua,

Do it this way:

Code: Select all

for i := 1 to 7 
     cCnt := ltrim(str(i)) 
     OSend( oDbf, "_order" + cCnt, aOrders[i] ) 
next

Posted: Fri Feb 29, 2008 1:55 am
by hua
xProgrammer wrote: One possible workaround would be to use a combination of FieldPos() and FieldPut() in a method inside a method of CLASS Dbf.
Thanks for the reply Doug :) Yes, that's a valid suggestion but if I'm not mistaken, fieldpos() and fieldput() will read from the physical dbf. I'm trying to optimize the operations as everything is already in an array
xProgrammer wrote: I don't know enough about what you are really trying to do to be of more help, but personally I avoid using &.
I'm in the midst of converting an old dos module to windows. I do avoid '&' like a plague but sometimes if I don't see any alternative I'll end up using it anyway.
xProgrammer wrote: Why can't class Dbf use an array? Or should you have a sub-table? I'm only guessing, but maybe there's a more elegant solution waiting to be found.
Oh it does. The database class that comes with fivewin stores all the field values in oDbf:aBuffers though we access it in the form of oDbf:<fieldname>. This table should've been further normalized as the customers contact details and their orders are currently kept in the same table but for backward-compatibility sake I just maintain the structure as it is.

Here's to hoping to find an elegant solution :)

Posted: Fri Feb 29, 2008 1:56 am
by hua
Antonio Linares wrote: Do it this way:

Code: Select all

for i := 1 to 7 
     cCnt := ltrim(str(i)) 
     OSend( oDbf, "_order" + cCnt, aOrders[i] ) 
next
Yes! That's it!. Thank you Antonio!