I have written a reusable dialog report interface to handle the over one hundred reports I need to eventually write. I am using a single Action Javascript “Open Report, Label or Letter Layout” method to open any report and have converted it to text mode. I am using a UDF Javascript function inside this code to set all of the report object (ro) variables. I am initializing the “ro” object on the server-side and storing the object in the e._state variable which gets passed to the client-side. I am creating a single “ro” pointer (dim e._state.ro as p) and then dimming 16 member variables of character type to the “ro” pointer.
This is the server-side code that initializes the “ro” object:
This is the client-side function which sets up the A5 report object:
I have to delete the “ro” object on the client-side in order to remove all of the variables for the next time a report is run. If I don’t, the values I initially set on the server-side do not get overwritten the next time I open a report.
I realize that some of the data I am passing in the e._state variable already exists in the dialog controls and could be read directly on the client-side using {dialog.object}.getData(). The reason I am initializing everything on the server-side is because some of the data only exists on the server-side and also for future maintenance. I already know some of the data will need to be formatted differently than it exists in the controls and I will need to come back from time to time to make other tweaks and changes. I would prefer to put all of the smarts in the server-side and have the client-side be as straightforward as possible.
It just occurred to me this morning that pointers/objects may not be allowed just like with session variables. Is it ok to create a pointer in the e._state object on the server-side? The code works fine of course in Live Preview mode. If pointers are not allowed inside the e._state object, I suppose I could store all of the data I need in character strings. Video M58 demonstrates creating a JSON object on the client-side, but does not mention anything about instantiating an object on the server-side.
Thanks
This is the server-side code that initializes the “ro” object:
Code:
' Setup the report object member variables dim e._state.ro as p dim e._state.ro.reportName as c = e.arguments.Find("ReportName").data + "@” + database + “.alb" dim e._state.ro.reportNameShort as c = e.arguments.Find("ReportName").data dim e._state.ro.download as c = download dim e._state.ro.xbasicFunction as c ‘ not used at this time dim e._state.ro.clientSideFilename as c ' not used at this time dim e._state.ro.reportMessagesDivId as c = "RI_ReportArea" dim e._state.ro.filter as c ' not used at this time dim e._state.ro.order as c ' not used at this time dim e._state.ro.sqlFilter as c = request.variables.V.R1.filter_definition dim e._state.ro.sqlOrder as c = request.variables.V.R1.order_definition dim e._state.ro.arguments as c = e.RI_Args + "aReportTitle|Character|" + request.variables.V.R1.report_title dim e._state.ro.workingMessage as c = "Printing report: " + e._state.ro.reportNameShort dim e._state.ro.pdfoptions as c = pdfOptions dim e._state.ro.displayMode as c ‘ not used at this time dim e._state.ro.saveAs as c = "pdf" dim e._state.ro.pdfOpenParameters as c = pdfOpenParameters
Code:
function RI_BeforeExecuteOpenReport(ro) { if (typeof {dialog.object}.stateInfo.ro.reportName != 'undefined') ro.reportName = {dialog.object}.stateInfo.ro.reportName; if (typeof {dialog.object}.stateInfo.ro.reportNameShort != 'undefined') ro.reportNameShort = {dialog.object}.stateInfo.ro.reportNameShort; if (typeof {dialog.object}.stateInfo.ro.download != 'undefined') ro.download = {dialog.object}.stateInfo.ro.download; if (typeof {dialog.object}.stateInfo.ro.xbasicFunction != 'undefined') ro.xbasicFunction = {dialog.object}.stateInfo.ro.xbasicFunction; if (typeof {dialog.object}.stateInfo.ro.clientSideFilename != 'undefined') ro.clientSideFilename = {dialog.object}.stateInfo.ro.clientSideFilename; if (typeof {dialog.object}.stateInfo.ro.reportMessagesDivId != 'undefined') ro.reportMessagesDivId = {dialog.object}.stateInfo.ro.reportMessagesDivId; if (typeof {dialog.object}.stateInfo.ro.filter != 'undefined') ro.filter = {dialog.object}.stateInfo.ro.filter; if (typeof {dialog.object}.stateInfo.ro.order != 'undefined') ro.order = {dialog.object}.stateInfo.ro.order; if (typeof {dialog.object}.stateInfo.ro.sqlFilter != 'undefined') ro.sqlFilter = {dialog.object}.stateInfo.ro.sqlFilter; if (typeof {dialog.object}.stateInfo.ro.sqlOrder != 'undefined') ro.sqlOrder = {dialog.object}.stateInfo.ro.sqlOrder; if (typeof {dialog.object}.stateInfo.ro.arguments != 'undefined') ro.arguments = {dialog.object}.stateInfo.ro.arguments; if (typeof {dialog.object}.stateInfo.ro.workingMessage != 'undefined') ro.workingMessage = {dialog.object}.stateInfo.ro.workingMessage; if (typeof {dialog.object}.stateInfo.ro.pdfoptions != 'undefined') ro.pdfoptions = {dialog.object}.stateInfo.ro.pdfoptions; if (typeof {dialog.object}.stateInfo.ro.displayMode != 'undefined') ro.displayMode = {dialog.object}.stateInfo.ro.displayMode; if (typeof {dialog.object}.stateInfo.ro.saveAs != 'undefined') ro.saveAs = {dialog.object}.stateInfo.ro.saveAs; if (typeof {dialog.object}.stateInfo.ro.pdfOpenParameters != 'undefined') ro.pdfOpenParameters = {dialog.object}.stateInfo.ro.pdfOpenParameters; // The stateInfo.ro object must be deleted to clear out the old values, otherwise they “stick”. delete {dialog.object}.stateInfo.ro; }
I realize that some of the data I am passing in the e._state variable already exists in the dialog controls and could be read directly on the client-side using {dialog.object}.getData(). The reason I am initializing everything on the server-side is because some of the data only exists on the server-side and also for future maintenance. I already know some of the data will need to be formatted differently than it exists in the controls and I will need to come back from time to time to make other tweaks and changes. I would prefer to put all of the smarts in the server-side and have the client-side be as straightforward as possible.
It just occurred to me this morning that pointers/objects may not be allowed just like with session variables. Is it ok to create a pointer in the e._state object on the server-side? The code works fine of course in Live Preview mode. If pointers are not allowed inside the e._state object, I suppose I could store all of the data I need in character strings. Video M58 demonstrates creating a JSON object on the client-side, but does not mention anything about instantiating an object on the server-side.
Thanks