Thank you Eduard, I appreciate your time on this.  

Maybe I'm just dense, but I still don't get it.  I'm not logged into the server at all.  I'm only connecting to the server through a CSP application.  In order to access the CSP application, I have to log into one of the cache user accounts.  It doesn't seem to matter which cache account I use -- even if I log in as _SYSTEM to run the CSP application, the $ZF shell is executing under user vrogers.

Yes, agreed.  The thing that puzzles me is that the shell environment variables pertain to my personal account, even though when the $ZF command is invoked from the csp page, and I'm logged into an unrelated cache account.  How is it getting the USER vrogers?

If I use $ZF(-1,"whoami > output.txt"), the output is "cacheusr"

But when I use $ZF(-1,"printenv > output.txt"), the output includes:

USER=vrogers
HOME=/home/vrogers

Thank you.

Thank you Eduard for the quick reply!

However, in my testing, I am not using the terminal, or logged into the OS.  I am calling the $ZF function from a method that is being invoked by a web application.  Is cacheusr somehow tied to a unix username? The cache installation was installed as root, I believe (at least that's who owns the cache binaries and directories).

Thank you Dan and Gerd.  After reviewing your suggestions I reset the storage so that the array property would project in the default way, as a separate table.  After some trial and error, I came up with the following query, which seems to do what I need:

select * from PET.ImageStudy as std

left outer join PET.ImageStudy_Injection as inj  on std.ID=inj.ImageStudy

left outer join PET.PETImageFile as img on img.Study=std.ID AND img.InjKey=inj.element_key  

where Injection_RadioTracer->TracerName=?

Thank you Dan.

It does not appear to be using the default storage, as there is not a separate table for ImageStudy_Injection.  The Injection is stored as a column in the ImageStudy table.  I'm not sure why.  I didn't change any defaults. Though perhaps I tried using a list, instead of array, earlier.  If it's easier when stored in a separate table, can I change the storage mechanism?

Appreciate your help.   I will not get back to working on this until next week.

Thank you Herman, I appreciate the help.

When I change the form attribute to onsubmit ='SubmitForm()' then it stays on the current page after the form is processed regardless of whether the SubmitForm function returns 'true' or 'false'.

So far, the only way I've been successful getting it to go to the new page is when I use onsubmit='return SubmitForm()' and then return false at the end of the SubmitForm function. 

I probably have something else wrong that is causing this behavior.

Thank you! 

In some of the CSP pages in my application, there is code in the OnPreHTTP method to process a button-click or form submit, but in other pages, the form processing is done outside of the OnPreHTTP method.

Does it matter whether or not the form processing code is in the OnPreHTTP method?  Are there reasons why the form processing should or should not go in the OnPreHTTP method?