Subject Re: allowing user to change or add an alias
From Akshat Kapoor <akshat.kapoor@kapoorsons.in>
Date Sun, 18 Jun 2017 13:01:48 +0530
Newsgroups dbase.getting-started

Hello Charlie,
On 18/06/2017 00:15, Charlie wrote:
> Hi Akshat..
>
> Thanks, I have looked at yours but don't get exactly what you are
doing.  Could you send the tables?  Or the structure?  Possibly that
would help me understand it.  If I can fix the permissions or whatever
is causing the problem bdealias.cc will work well.  But I still love
learning other ways of doing things.  And that's a good thing because I
have a whole lot to learn!!! :)
>

There are two approaches to using variable databases I have tested. I
will explain both
Approach 1
Create a temporary BDE Alias
This is can be created/altered as and when you want. There is only one
drawback It is not permanent in nature. It will be gone as soon as the
session ends.

mysession = new session()
mysession.addalias("muneem","DBASE","Path:c:\dbasetutorial\muneem\1")

/*The above two lines will create a new alias named "muneem" accessing
"DBASE" tables in the path mentioned above.*/

d = new database()
d.session = mysession
d.databasename = "muneem"
d.active = true
/*
Now I am using the session and database alias created above as a
database I have an instance of the Database.
*/
q = new query()
q.database = d
/*
now I am using the database to access tables.
*/
q.sql = "select * from vatrate"
//I have not specified any path here. It will access the database for
the table
q.active = true
?q.rowset.fields["tax"].value
q.rowset.next()
?q.rowset.fields["tax"].value
//The above 3 lines are just for testing from command line. You can omit
these in your program and proceed

You can declare a session in the first program (say first.prg)and it
will be accessible to all programs/forms/reports that are called by
first or down the tree structure.
so if second.wfm is called by first and third.rep by second.wfm then the
session/database will be accessible in third.rep also
There is no limit to the depth of the tree structure. But if you declare
the session in second.wfm it cannot be accessed by first.prg because the
session ceases to exist as soon as execution of second.wfm ends. This is
in accordance with normal scope of variable rules and how can they be
accessed.

There is a default _app session also But since I had not experimented
with that session I have not mentioned it here

You can go through the online help of addalias and class session.


Approach 2
In the first program declare a memory variable and store to full path in
the memory variable.
   mdirect = "C:\dbasetutorial\muneem\1"

And then use this memory variable as part of sql string. You can use
full path in any sql string and string functions like + can be used to
generate the complete sql string.
sql = 'select * from "' +mdirect+'\vatrate.dbf"' will be the same as typing
sql = 'select * from "C:\dbasetutorial\muneem\1\vatrate.dbf"'
The only difference is that the second option does not give you the
option of variable directory.

This approach suffers from a drawback. If you use calculated string in a
form every time you open the form in designer the query
sql = 'select * from "' +mdirect+'\vatrate.dbf"'
is replaced by
sql = 'select * from "C:\dbasetutorial\muneem\1\vatrate.dbf"'

To avoid this situation you will have to use the Form_onOpen event to
redeclare the query and requery. Or develop a datamodule with the query
sql = 'select * from "' +mdirect+'\vatrate.dbf"'
and use that data module in your form.

If more details are required then please email with which approach you
require the details.
Regards
Akshat