Change views selection criteria on the fly
I was asked to provide a calendar view to users, where they were able to select on the fly what documents were included in the calendar view based on a designated category.
View member feedback to this tip.
I was asked to provide a calendar view to users, so they could select on the fly what documents were included in the calendar view, based on a designated category. The problem became more difficult when the designated categories were dynamic (i.e., changeable and able to be added to or deleted from).
To solve this problem, I needed to be able to supply the users a way of changing the views selection criteria on the fly. This ability is limited to only Designer access and above, so how could I give this functionality to the end users?
I used the Notes 6 functionality of assigning an agents "run on behalf of" property. I created two agents. The first was called from an outline entry and requested the user to select the category they wished to limit the calendar view selection to. The second agent was called from the first agent (the one where I assigned the "run on behalf of" property to the username we use to sign all of our databases, and, as a default, has manager access to this database).
Here's the code I used in the agents:
Agent1 (Agent to get Category Name and to create the new Selection Criteria Formula) Dim s As New NotesSession Dim ws As New NotesUIWorkspace Dim db As NotesDatabase Dim templateview As NotesView Dim agent As NotesAgent Dim selection As Variant Dim selectFormula As String Dim channels As Variant Dim uidb As NotesUIDatabase Dim doc As NotesDocument Set db = s.CurrentDatabase Set agent = db.GetAgent("(Open Calendar)") Set templateview = db.GetView("Calendar") Set uidb = ws.CurrentDatabase Call ws.SetTargetFrame("NotesView") 'Get options for selection in Prompt below. channels = Evaluate( { "All" : @DbColumn ("" : "NoCache"; ""; "Channel"; 1 ) } ) selection = ws.Prompt(4, "Channel Selection", "Please choose the required Channel", "All", channels) If Not Isempty(selection) Then 'Capture the desired selection formula If selection = "All" Then selectformula = {SELECT ( ( Form = "SalesPromo" ) | ( Form = "MarketingPromo" ) )} Else selectformula = {SELECT ( ( Form = "SalesPromo" ) | ( Form = "MarketingPromo" ) ) & Channel = "} & selection & {"} End If 'If the selection formula is the same as the current selection formula, just open the view. 'If the selection formula is not the same as the views current selection formula, then call 'Agent2 to change the selection formula in the view, prior to opening it. If selectformula = templateview.SelectionFormula Then Call uidb.OpenView("Calendar") Else 'Create a temporary document to store the new selection formula, so it can be passed to Agent2. Set doc = db.CreateDocument doc.Form = "Calendar" doc.SelectFormula = selection Call doc.save (True, False) 'Run the 'Open Calendar' agent on the server and pass the agent the note ID of the temporary document storing the selection formula. Call agent.RunOnServer(doc.NoteID) Call uidb.OpenView("Calendar") End If End If Agent2 (Agent created to amend the views selection criteria). REM This agent must run on the server so that the 'Run on behalf of' property is used. Dim session As New NotesSession Dim templateview As NotesView Dim selectFormula As String Dim selection As Variant Dim db As NotesDatabase Dim channels As Variant Dim agent As NotesAgent Dim doc As NotesDocument Set db = session.currentdatabase Set templateview = db.GetView("Calendar") Set agent = session.CurrentAgent 'Get the temporary document created to store the selection formula Set doc = db.GetDocumentByID (agent.ParameterDocID) 'Change the selection formual accordingly If doc.selectformula( 0 ) = "All" Then selectformula = {SELECT ( (Form = "SalesPromo") | (Form = "MarketingPromo") )} templateview.SelectionFormula = selectformula templateview.Refresh Else selectformula = {SELECT ( (Form = "SalesPromo") | (Form = "MarketingPromo") ) & Channel = "} & doc.selectformula(0) & {"} templateview.SelectionFormula = selectformula templateview.Refresh End If 'Remove the temporary document that stored the selection formula. Call doc.Remove(True)
MEMBER FEEDBACK TO THIS TIP
Is this a single user application? Once the view selection formula is changed on the server, won't it be changed for all users of the application and possibly cause issues if more than one person is using the database at a time?
—Brian A.
******************************************
No, this is a multi-user database. I had the same question, but fortunately, the continuous change to the view was accepted by the users. The view is used for reference purposes only and each time it is needed, the code forces them to select the criteria and hence, get the view they want. The view will stay the same on their client until they change views or exit the database, even if someone else uses the database on a different client and selects a different criteria.
If this is not acceptable for others, then I can only suggest you try "private on first use" views and see if the same functionality can be applied to these types of views.
—Graham Frey, tip author
******************************************
Why don't you just use @SetViewInfo?
— Hassan V.
******************************************
In most circumstances you could definitely use the @SetViewInfo function. But, in my case the selection criteria did not end at just one selection. The application needed to be able to provide further categorization based on the previous selections. I could not utilize @SetViewInfo because I needed to know what the previous selections were.
My code was enabling them to categorize the calendar and then drill down to further categories within the previous selections.
—Graham Frey, tip author
Do you have comments on this tip? Let us know.
This tip was submitted to the SearchDomino.com tip exchange by member Graham Frey. Please let others know how useful it is via the rating scale below. Do you have a useful Notes/Domino tip or code to share? Submit it to our monthly tip contest and you could win a prize and a spot in our Hall of Fame.