FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin for Harbour/xHarbour memvar
Posts: 124
Joined: Sat Dec 05, 2009 12:44 PM
memvar
Posted: Mon Jul 13, 2020 03:23 PM

How to convert the name of a memory variable into the name of a field and use the variable name as a field name?

Posts: 1515
Joined: Thu Oct 30, 2008 02:37 PM
Re: memvar
Posted: Mon Jul 13, 2020 04:28 PM

FIELD->

Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: memvar
Posted: Mon Jul 13, 2020 06:59 PM
Interesting test:
Code (fw): Select all Collapse
#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
Regards



G. N. Rao.

Hyderabad, India
Posts: 124
Joined: Sat Dec 05, 2009 12:44 PM
Re: memvar
Posted: Mon Jul 13, 2020 09:53 PM

The question is f.e.
select sales
goto top
cproduct:=sales->name

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

Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: memvar
Posted: Tue Jul 14, 2020 01:48 AM
Code (fw): Select all Collapse
   PRIVATE cproduct

   select sales
   goto top
   cproduct:=sales->name

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


OR

Code (fw): Select all Collapse
   local cproduct

   select sales
   goto top
   cproduct:=sales->name

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


OR

Code (fw): Select all Collapse
   sales->( dbgotop() )
   select products
   locate for products->&(sales->name)="smart"
   // or
   locate for &(sales->name)="smart"
Regards



G. N. Rao.

Hyderabad, India
Posts: 124
Joined: Sat Dec 05, 2009 12:44 PM
Re: memvar
Posted: Tue Jul 14, 2020 07:44 AM

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
Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: memvar
Posted: Tue Jul 14, 2020 08:42 AM
Code (fw): Select all Collapse
sum all temp1->&(calias) to ntotalias


All the snippets I posted were after testing. If you adopt them correctly, they should work.
Regards



G. N. Rao.

Hyderabad, India
Posts: 124
Joined: Sat Dec 05, 2009 12:44 PM
Re: memvar
Posted: Tue Jul 14, 2020 09:43 AM

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

Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: memvar
Posted: Tue Jul 14, 2020 04:46 PM
Please try this program as it is in your fwh\samples folder
Code (fw): Select all Collapse
#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
Regards



G. N. Rao.

Hyderabad, India
Posts: 124
Joined: Sat Dec 05, 2009 12:44 PM
Re: memvar
Posted: Tue Jul 14, 2020 06:03 PM

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

Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: memvar
Posted: Tue Jul 14, 2020 06:49 PM
"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.
Regards



G. N. Rao.

Hyderabad, India
Posts: 124
Joined: Sat Dec 05, 2009 12:44 PM
Re: memvar
Posted: Wed Jul 15, 2020 01:06 PM

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
     ......
Posts: 4840
Joined: Fri Nov 18, 2005 04:52 PM
Re: memvar
Posted: Fri Jul 17, 2020 10:07 PM
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 (fw): Select all Collapse
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 (fw): Select all Collapse
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
FWH 18.05/xHarbour 1.2.3/BCC7/Windows 10

Continue the discussion