Caveat: heavy programming content ahead.
Nearly two years ago, I
wrote1
about the 'temp' table that I had added to my blog manager program. As I
wrote then (edited):
I would like several different functions to output a list of blogs, each
showing different data. This would mean using the multiple document
interface (MDI) and displaying the same form several times. How would each
instance of the form know what to display? I added to the temporary table
a new field, 'instance' that would be part of the primary key; each query
would get a unique instance and store its data (entries) along with that
instance. The form that displays the data would be sent the instance
number and so would retrieve the correct data. When the form closes, it
deletes the data from the temporary table and frees the instance number
for further use. In other words, the 'temp' table is being used to store data for output.
I added a checkbox (here it's a radio button, but later on I discovered a problem with this) that when pressed brings up the familiar two listbox screen. Here one chooses tags from the left listbox then by means of the arrow buttons one transfers the tags to the right listbox. When one presses the 'OK' button, a new instance of the 'temp' table is created with the ids of the various tags chosen added to lines in the table.
The code for using the the temp table from this example is too convoluted to display here because apart from anything else, the output of the query is sent to another instance of the 'temp' table. Instead, I'll show the various necessary lines to support multiple values in the OP's management query ('s' is a string that contains the various lines of the SQL query, at this point consisting of the 'SELECT' and 'FROM' clauses but before the 'WHERE' clause; 'tipulim' is the name of the 'treatment types' table so an alias is used for the temp table).
if rgTipulim.Checked then s:= s + ' inner join temp tipul on tipul.id = tipulim.id '; ... // part of the WHERE clause s:= s + 'tipul.instance = :p4'; ... // parameters sdsShowByTreatment.parambyname ('p4').asinteger:= rgTipulim.tag;
In other words, if multiple values are required than an extra line is added to the 'FROM' clause, joining the temporary table to (in this case) the treatments type table. Later on the instance is added to the WHERE clause and finally the parameter is passed. This works very well.
Why did I write earlier here it's a radio button, but later on I discovered a problem with this? In that 'set values for retrieval' form, there is only one parameter capable of choosing multiple values, but in the form in the OP's management suite from which I quoted above, there are two parameters that can have multiple values - customers and treatment type - and if I used radio buttons (as I did at first), selecting one will deselect the other and vice versa. If one wants multiple values for both parameters, then a radio button is useless but a checkbox is fine.
That's how things stood six months ago. On Friday I was talking with the OP about selecting dockets that could be defined with one of several treatment types - in other words, a clear case of a multiple value parameter. But after adding this to the form, I was struck with a new idea: what if I wanted to save this combination of values in a similar fashion to saved queries?
I was thinking about how to implement this when I went swimming on Saturday
morning; as a result of all that thinking, I swam better and faster as I
didn't have the brain power to spare on quotidian matters such as breathing.
I wish every swim was like this!
In a prior blog2, I described how I extended the 'saved queries' table in order to store predefined complex sort conditions. Thus in terms of the data structures, I didn't have to change anything in order to store what I am calling 'bundles' - a saved list of multiple values from a table. To the two listboxes form I added the visual components of a saved query, but the code for saving and restoring the values was far different and somewhat complicated; eventually I figured it out (and improved it this morning).
One interesting observation is that these bundles are available wherever a
query requires a customer or treatment type parameter, so once defined, they
can be used in multiple forms. Another idea that occurred to me (once again
inspired by Priority) but yet to be implemented is adding the capability of
duplicating a saved query/sorter/bundle from one user to another.
Using this, I can define the saved whatever without having to explain to the
user how to define it, then allow the user to use it in practice. Whilst
quite complicated to program, this is simple in conception.
In the course of writing this blog entry, I am reminded of what I wrote in
my previous blog,
Another addition was the possibility of displaying within the blog
manager the list of blogs mentioned in the 'this day in history' list at
the bottom of the blog. What that idea ignores are any blog entries mentioned in the text of the
current entry (here there are three links to prior blogs). If I recall
correctly, I was thinking that I would have to parse the text of a blog
entry in order to find those links and that this idea did not appeal to me
very much. Then I realised that I could easily display the 'this day in
history' list in a suitable format for the blog manager program and forgot
the idea of finding referenced blogs. That will have to wait for a few
days.
[1] 1548
[2] 1680
Title | Tags | ||
---|---|---|---|
277 | More inbasket | In-basket, Psychology | |
396 | Spam mail | Spam | |
618 | Research questionnaire | ERP, Excel | |
754 | Computer woes | Personal, Computer | |
1415 | New oven gloves | Cooking | |
1660 | Preparing for the New Year ceremony | Musical group |
No comments:
Post a Comment