Page 1 of 1

memvar

Posted: Mon Jul 13, 2020 3:23 pm
by jds
How to convert the name of a memory variable into the name of a field and use the variable name as a field name?

Re: memvar

Posted: Mon Jul 13, 2020 4:28 pm
by hmpaquito
FIELD->

Re: memvar

Posted: Mon Jul 13, 2020 6:59 pm
by nageswaragunupudi
Interesting test:

Code: Select all

#include "fivewin.ch"

function Main()

   PRIVATE Salary := 30

   USE CUSTOMER

   subfunc()


return nil

//----------

function subfunc()

   local salary := 10

   ? salary, field->salary, memvar->salary

return nil
 

Re: memvar

Posted: Mon Jul 13, 2020 9:53 pm
by jds
The question is f.e.
select sales
goto top
cproduct:=sales->name

select products
locate for products->cproduct="smart"

Re: memvar

Posted: Tue Jul 14, 2020 1:48 am
by nageswaragunupudi

Code: Select all

   PRIVATE cproduct

   select sales
   goto top
   cproduct:=sales->name

   select products
   locate for products->&cproduct="smart"
 
OR

Code: Select all

   local cproduct

   select sales
   goto top
   cproduct:=sales->name

   select products
   locate for products->&(cproduct)="smart"
 
OR

Code: Select all

   sales->( dbgotop() )
   select products
   locate for products->&(sales->name)="smart"
   // or
   locate for &(sales->name)="smart"
 

Re: memvar

Posted: Tue Jul 14, 2020 7:44 am
by jds
Thank you India but it does not work with the macro ampersand. I tried that already yesterday and I tried it again today but it gives errors by compiling

the real source code is as follows:

select temp2
goto top
calias:=temp2->alias
select temp1
sum all temp1->calias to ntotalias

Re: memvar

Posted: Tue Jul 14, 2020 8:42 am
by nageswaragunupudi

Code: Select all

sum all temp1->&(calias) to ntotalias
 
All the snippets I posted were after testing. If you adopt them correctly, they should work.

Re: memvar

Posted: Tue Jul 14, 2020 9:43 am
by jds
By compiling no problem but while calling the procedure I got the error message:
"error base/1449 syntax error : &" (ampersand)
PS: I am a non professional programmer working for free at the food bank of my home town

Re: memvar

Posted: Tue Jul 14, 2020 4:46 pm
by nageswaragunupudi
Please try this program as it is in your fwh\samples folder

Code: Select all

#include "fivewin.ch"

function Main()

   local cfield, nTotSal

   DBCREATE( "TMP.DBF", {{ "FLD", "C", 10, 0 }}, NIL, .T., "TMP" )
   APPEND BLANK
   FIELD->FLD := "SALARY"
   CLOSE DATA

   USE TMP NEW
   cField := TMP->FLD

   USE CUSTOMER NEW

   SUM ALL CUSTOMER->&( cField ) TO ntotsal

   ? ntotsal

return nil
 

Re: memvar

Posted: Tue Jul 14, 2020 6:03 pm
by jds
Hallo,
The customer.dbf file that is within the fwh/samples map does not contain a fld field??
By compiling and launching the program that you suggest, I become an alert saying "Alert 38836300.00"??

Re: memvar

Posted: Tue Jul 14, 2020 6:49 pm
by nageswaragunupudi
"Alert 38836300.00"?
This alert box show the total as 38836300.00.
That means the program worked correctly.

Now, apply the same logic to your situation.

Re: memvar

Posted: Wed Jul 15, 2020 1:06 pm
by jds
hallo,
Can you try my situation? The compiling is OK but when launching I got an error message

.....
select temp2
goto top

do while .NOT. eof()

calias:=temp2->alias
cnaam:=temp2->naam

select temp1

sum all temp1->&( calias ) to ntotalias

oPrn:say(nRow, 10*fntArial2:nWidth, cnaam, fntArial3)
oPrn:say(nRow, 50*fntArial2:nWidth, STR(ntotalias,3), fntArial1)
nRow += 1.3 * fntArial1:nHeight

select temp2

skip 1

enddo
......

Re: memvar

Posted: Fri Jul 17, 2020 10:07 pm
by James Bott
JDS,

I am not exactly sure what you are trying to do, but if you use database objects you don't need to use local variables for fields--that is built into the database object.

oCustomer:Name

Is actually a buffer that contains a copy of the data in the NAME field.

Also you never need to use workareas or aliases with database objects.

Here is an example of how to build a database object for a customer database:

Code: Select all

CLASS TCustomers from TDatabase
   Method New()
ENDCLASS

Method New( lShared ) Class TCustomers
   Default lShared:= .T.
   ::Super:New(,"cust",,lShared)
   If ::Use()
      ::SetOrder("CUSTNO") // Primary key
      ::Gotop()
   Endif
Return self
// Note that this assumes you have set your databases to automatically open thier indexes when you open a database.
Now you can do:

Code: Select all

oCustomer:= TCustomer():New()

msgInfo( oCustomer:name )
Have you read the articles that I provided the links to in your other message thread with the same title as this one? If not, please do.

James