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