Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
BUG, reBUG and
Message
From
08/08/2003 05:06:39
 
 
To
All
General information
Forum:
Visual FoxPro
Category:
Other
Title:
BUG, reBUG and
Miscellaneous
Thread ID:
00818105
Message ID:
00818105
Views:
59
Hi,

i want implement a shared data object with private datasession.
I want use this to take advantage of the binding between objects and datasession.

A example is a data cache engine.

I have found problems.

First way:
define a session private object and call a method for get info.
PUBLIC myForm,dbCache 

dbCache = CREATEOBJECT('db_Cache')

myForm=CREATEOBJECT('fm')
myForm.show()

DEFINE CLASS fm AS Form
 PROCEDURE load
   WAIT WINDOWS 'FORM SESSION ='+STR(this.DataSessionId)
   CREATE CURSOR base (id I)
	INSERT INTO (ALIAS()) VALUES (1)
	INSERT INTO (ALIAS()) VALUES (2)
 PROCEDURE Unload
 	USE IN base
 	RELEASE myForm,dbCache 

 PROCEDURE Click
 	SELECT base
	WAIT WINDOWS "test read  "+dbCache.GetInfo(base.id) && no problem
	DEFINE POPUP myPopup FROM 10,10 SHORTCUT PROMPT FIELD dbCache.GetInfo(base.id)
	ACTIVATE POPUP myPopup  
   && evaluator error, point on object.Methods put VFP parser on error
   && then i cannot call my object directly ( very bad

ENDDEFINE

DEFINE CLASS db_Cache AS Session
	DataSession = 2
	PROCEDURE Init
		CREATE CURSOR myCache ( id I,Info C(20))
		INSERT INTO (ALIAS()) VALUES (1,'PRIMO')
		INSERT INTO (ALIAS()) VALUES (2,'SECONDO')

	PROCEDURE GetInfo(i)
  		WAIT WINDOWS 'GET SESSION ='+STR(SET("Datasession"))
   		RETURN LOOKUP(myCache.Info,m.i,myCache.Id)
   		
	PROCEDURE Destroy
	 	USE IN myCache
ENDDEFINE
BUG on POPUP kill this way.

Try first Workaround:
call a prg procedure and change datasession.
PUBLIC myForm,dbCache 

dbCache = CREATEOBJECT('db_Cache')

myForm=CREATEOBJECT('fm')
myForm.show()

DEFINE CLASS fm AS Form
 PROCEDURE load
   WAIT WINDOWS 'FORM SESSION ='+STR(this.DataSessionId)
   CREATE CURSOR base (id I)
	INSERT INTO (ALIAS()) VALUES (1)
	INSERT INTO (ALIAS()) VALUES (2)
 PROCEDURE Unload
 	USE IN base
 	RELEASE myForm,dbCache 

 PROCEDURE Click
 	SELECT base
	WAIT WINDOWS "test read  "+dbCache.GetInfo(base.id) && no problem
	DEFINE POPUP myPopup FROM 10,10 SHORTCUT PROMPT FIELD GetInfo(base.id)
	WAIT WINDOWS "NOW ACTIVATE"
	ACTIVATE POPUP myPopup  
   && evaluator error, point on object.Methods put VFP parser on error
   && then i cannot call my object directly ( very bad

ENDDEFINE

DEFINE CLASS db_Cache AS Session
	DataSession = 2
	PROCEDURE Init
		CREATE CURSOR myCache ( id I,Info C(20))
		INSERT INTO (ALIAS()) VALUES (1,'PRIMO')
		INSERT INTO (ALIAS()) VALUES (2,'SECONDO')

	PROCEDURE GetInfo(i)
  		WAIT WINDOWS 'GET SESSION ='+STR(SET("Datasession"))
   		RETURN LOOKUP(myCache.Info,m.i,myCache.Id)
   		
	PROCEDURE Destroy
	 	USE IN myCache
ENDDEFINE

PROCEDURE GetInfo(i)
	SET DATASESSION TO dbCache.DatasessionId
	WAIT WINDOWS 'dbcache SESSION ='+STR(dbCache.DatasessionId,5);
+' PRG SESSION ='+STR(SET("Datasession"),5)
	RETURN LOOKUP(myCache.Info,m.i,myCache.Id)
BUG:
ACTIVATE POPUP fired:
first Call of GetIngo and allow datasession to change to 2,
but next call don't apply SET DATASESSION TO command ( BUG ? )

Workaround of workaround
PUBLIC myForm,dbCache 

dbCache = CREATEOBJECT('db_Cache')

myForm=CREATEOBJECT('fm')
myForm.show()

DEFINE CLASS fm AS Form
 PROCEDURE load
   WAIT WINDOWS 'FORM SESSION ='+STR(this.DataSessionId)
   CREATE CURSOR base (id I)
	INSERT INTO (ALIAS()) VALUES (1)
	INSERT INTO (ALIAS()) VALUES (2)
 PROCEDURE Unload
 	USE IN base
 	RELEASE myForm,dbCache 

 PROCEDURE Click
 	SELECT base
	WAIT WINDOWS "test read  "+dbCache.GetInfo(base.id) && no problem
	DEFINE POPUP myPopup FROM 10,10 SHORTCUT PROMPT FIELD GetInfo(base.id)
	WAIT WINDOWS "NOW ACTIVATE"
	ACTIVATE POPUP myPopup  
   && evaluator error, point on object.Methods put VFP parser on error
   && then i cannot call my object directly ( very bad

ENDDEFINE

DEFINE CLASS db_Cache AS Session
	DataSession = 2
	PROCEDURE Init
		CREATE CURSOR myCache ( id I,Info C(20))
		INSERT INTO (ALIAS()) VALUES (1,'PRIMO')
		INSERT INTO (ALIAS()) VALUES (2,'SECONDO')

	PROCEDURE GetInfo(i)
  		WAIT WINDOWS 'GET SESSION ='+STR(SET("Datasession"))
   		RETURN LOOKUP(myCache.Info,m.i,myCache.Id)
   		
	PROCEDURE Destroy
	 	USE IN myCache
ENDDEFINE

PROCEDURE GetInfo(i)
	SET DATASESSION TO dbCache.DatasessionId
	WAIT WINDOWS 'dbcache SESSION ='+STR(dbCache.DatasessionId,5);
+' PRG SESSION ='+STR(SET("Datasession"),5)
        PRIVATE rInfo
	STORE LOOKUP(myCache.Info,m.i,myCache.Id) TO rInfo
        SET DATASESSION TO 1
        RETURN m.rInfo
OK, it go, but i have lost much part of the speed that I could have had;
10 calls for two row !

Another workaround:
PUBLIC myForm,dbCache 

dbCache = CREATEOBJECT('db_Cache')

myForm=CREATEOBJECT('fm')
myForm.show()

DEFINE CLASS fm AS Form
 PROCEDURE load
   WAIT WINDOWS 'FORM SESSION ='+STR(this.DataSessionId)
   CREATE CURSOR base (id I)
	INSERT INTO (ALIAS()) VALUES (1)
	INSERT INTO (ALIAS()) VALUES (2)
 PROCEDURE Unload
 	USE IN base
 	RELEASE myForm,dbCache 

 PROCEDURE Click
 	SELECT base
	WAIT WINDOWS "test read  "+dbCache.GetInfo(base.id) && no problem
	DEFINE POPUP myPopup FROM 10,10 SHORTCUT PROMPT FIELD GetInfo1(base.id)
	WAIT WINDOWS "NOW ACTIVATE"
	ACTIVATE POPUP myPopup  
   && evaluator error, point on object.Methods put VFP parser on error
   && then i cannot call my object directly ( very bad

ENDDEFINE

DEFINE CLASS db_Cache AS Session
	DataSession = 2
	PROCEDURE Init
		CREATE CURSOR myCache ( id I,Info C(20))
		INSERT INTO (ALIAS()) VALUES (1,'PRIMO')
		INSERT INTO (ALIAS()) VALUES (2,'SECONDO')

	PROCEDURE GetInfo(i)
  		WAIT WINDOWS 'GET SESSION ='+STR(SET("Datasession"))
   		RETURN LOOKUP(myCache.Info,m.i,myCache.Id)
   		
	PROCEDURE Destroy
	 	USE IN myCache
ENDDEFINE

PROCEDURE GetInfo1(i)
   RETURN dbCache.GetInfo(@m.i)
This is elegant workaround, but need double procedure call,
and procedure call on VFP is very slow.

If someone has a better solution, i thanks it a lot.
Next
Reply
Map
View

Click here to load this message in the networking platform