I'm going to leave this here, to help others search for a solution, as my own kept me scratching my head for a while while trawling the forums and wiki to no avail.
Feel free to contribute any further tips or corrections. I can provide screencaps if necessary.
Important Note: This is for those who absolutely *must* use a session variable.
- Session variables should be used sparingly, and use of other variable types where they can perform is preferred.
One common theme I see in regard to session variables is timing.
Most solutions I encounter require the developer to switch to page/window variable, and this is probably fine in most cases, but when you require a session variable, this can get tricky.
One common way to set a session variable on a control event is using an Ajax Call back in Javascript.
this works to a point. But can cause timing problems if your next step is to open up a Grid or dialog that uses the session variable - particularly if you're opening the grid/dialog in a DIV that isn't a new record or edit for the same grid.
(An example might be if you have 1 to many, parent to child respectively, table arrangement.
And you then want this:
from the parent grid you want to create a new child record
but also to do this without cluttering the screen with linked grids/detail views etc...
i.e you just want to display a simple dialog from a single click but also copy across any vital information from the parent grid into the child dialog's OnInitialize event)
There are two solutions to this, though i would caution against the first one in a high traffic website. Example 2 is preferred.
(I've used the onclick event as an example, but could be used for other events too)
Example 1:
i. Open up the onclick event
ii. Add an Ajax callback to action to the Action Javascript
- have it call an Xbasic function like this (in this example i've set it to a column value)
iii. Then after this create another Action Javascript action to open your dialog on the same event.
to someone new to ajax, stopping here would seem enough, but unfortunately its not a good way to do this - as ajax is asynchronous.
So the execution of the Action to open the grid will likely execute before the session variable is set in the first ajax callback.
Seperating them out into OnMouseDown and OnMouseUp does not work either (as i have seen in previous suggestions), particularly if you have a fast click action :P
iv.In the Dialog OnInitialize event, before any values you may want to set, add the following
Where x is the number in seconds.
This is not perfect or even a sound solution:
I found sleep(1) was good enough for my dynamic dialog (which contains > 30 controls and multiple lookup select statements, 100ms would probably suffice)
However, this is not ideal if you experience large amounts of traffic.
The timeout may not be long enough if there is already a slow down.
This can result in the dialog not reading, or reading a cached version of the session variable instead.
So here is solution 2: a simple solution that worked for me.....
Example 2:
i. Open up the onclick event.
ii. Add an Action to the Action javascript open up a dialog in whichever way you choose
(reminder: this is unnecessary if you're opening a dialog or grid that is a way to Edit or Create a new record of the Calling/Parent grid)
iii. Click text mode to convert it to javascript. You will be prompted to accept conversion to text mode.
Highlight the code and copy it (ctrl + c)
iv. Click Server-Side Xbasic
You will see this
"//Replace this with the javascript to be returned by the function."
v. Thats exactly what we're going to do.
Paste the previously copied javascript from step iii into that string.
vi. Above that javascript string assign your session variable a value so you end up with this for example
vii. Save and test it out !
The code has no choice to execute sequentially due to lack of callbacks and thus timing is no longer an issue.
Of course if you know the javascript you can just go straight into selection of the Sever Side XBasic radio button.
But this makes its easier if you're not used to the javascript objects or functions.
Hope this helps someone.
Feel free to contribute any further tips or corrections. I can provide screencaps if necessary.
Important Note: This is for those who absolutely *must* use a session variable.
- Session variables should be used sparingly, and use of other variable types where they can perform is preferred.
One common theme I see in regard to session variables is timing.
Most solutions I encounter require the developer to switch to page/window variable, and this is probably fine in most cases, but when you require a session variable, this can get tricky.
One common way to set a session variable on a control event is using an Ajax Call back in Javascript.
this works to a point. But can cause timing problems if your next step is to open up a Grid or dialog that uses the session variable - particularly if you're opening the grid/dialog in a DIV that isn't a new record or edit for the same grid.
(An example might be if you have 1 to many, parent to child respectively, table arrangement.
And you then want this:
from the parent grid you want to create a new child record
but also to do this without cluttering the screen with linked grids/detail views etc...
i.e you just want to display a simple dialog from a single click but also copy across any vital information from the parent grid into the child dialog's OnInitialize event)
There are two solutions to this, though i would caution against the first one in a high traffic website. Example 2 is preferred.
(I've used the onclick event as an example, but could be used for other events too)
Example 1:
i. Open up the onclick event
ii. Add an Ajax callback to action to the Action Javascript
- have it call an Xbasic function like this (in this example i've set it to a column value)
Code:
function setSessionVariable as c (e as p) session.myVar = e._currentRowDataNew.MyColumn end function
to someone new to ajax, stopping here would seem enough, but unfortunately its not a good way to do this - as ajax is asynchronous.
So the execution of the Action to open the grid will likely execute before the session variable is set in the first ajax callback.
Seperating them out into OnMouseDown and OnMouseUp does not work either (as i have seen in previous suggestions), particularly if you have a fast click action :P
iv.In the Dialog OnInitialize event, before any values you may want to set, add the following
Code:
sleep(x)
This is not perfect or even a sound solution:
I found sleep(1) was good enough for my dynamic dialog (which contains > 30 controls and multiple lookup select statements, 100ms would probably suffice)
However, this is not ideal if you experience large amounts of traffic.
The timeout may not be long enough if there is already a slow down.
This can result in the dialog not reading, or reading a cached version of the session variable instead.
So here is solution 2: a simple solution that worked for me.....
Example 2:
i. Open up the onclick event.
ii. Add an Action to the Action javascript open up a dialog in whichever way you choose
(reminder: this is unnecessary if you're opening a dialog or grid that is a way to Edit or Create a new record of the Calling/Parent grid)
iii. Click text mode to convert it to javascript. You will be prompted to accept conversion to text mode.
Highlight the code and copy it (ctrl + c)
iv. Click Server-Side Xbasic
You will see this
Code:
function serverside_3d3f03779a444e71ba2c29fe27bfe668 as c (e as p) serverside_3d3f03779a444e71ba2c29fe27bfe668 = "//Replace this with the javascript to be returned by the function." ......(omitted comments)
v. Thats exactly what we're going to do.
Paste the previously copied javascript from step iii into that string.
vi. Above that javascript string assign your session variable a value so you end up with this for example
Code:
function serverside_3d3f03779a444e71ba2c29fe27bfe668 as c (e as p) session.myVar = e._currentRowDataNew.MyColumn serverside_3d3f03779a444e71ba2c29fe27bfe668 = "{grid.componentName}_G__UNBOUND_BUTTON_1_2({grid.rownumber},'{grid.rowId}',this);" ....(omtted comments)
The code has no choice to execute sequentially due to lack of callbacks and thus timing is no longer an issue.
Of course if you know the javascript you can just go straight into selection of the Sever Side XBasic radio button.
But this makes its easier if you're not used to the javascript objects or functions.
Hope this helps someone.
Comment