I don't think there is a really good way to do exactly this through JDBC, but you can handle this using the JDBC URL if you do a little setup beforehand.

First, in the SMP, System Administration, Configuration, System Configuration, Namespaces, click on Create New Namespace. Give it a name - let's say "SAMPLE" and have it copy from your original namespace (probably USER).

Second, go into a terminal, switch to the new namespace and use the command:

w $SYSTEM.SQL.Schema.SetDefault("SAMPLE",.oldval,1)

You should get a 1 confirming that the change was made successfully.

At this point, when you make your JDBC connection, connecting to either namespace will work on the same database, but connecting to the SAMPLE namespace will use the sample schema, and the USER namespace will use the SQLUser schema.

You can use the if $i to do some stuff within loops too. For example, if you enter the following to commands in a terminal:

set a = 5
for{if $i(a,-1){w a,!}else{quit}}

This will subtract 1 from a and write its value until it reaches 0, then quit the loop. Of course you could just as easily use for a=4:-1:1 {w a,!} to produce the same output a little more nicely, so you don't see that as much.

Queries to linked tables will fail if there is an issue with the connection, but when it's up, you've got the current data. Copying it over would help with potential connection issues, though you would still have a problem if the connection can't be established when you're trying to copy the data over. But if you're doing that once a day, your data is going to be a day old at times. I think the question you need to be asking is, for your specific application, how important is it that the data you're getting from the external database is current?

Your login request technically is an unauthenticated request, which means it uses the account UnknownUser. Since the web application /api/atelier requires user permission on the %Development resource, the request is failing. You could address this by either removing that restriction from the web app or by assigning the %Developer role to UnknownUser. In my opinion, though, neither of those is really ideal.

When you see something that starts with a ..# that's a parameter that's defined in a class. If you look at the source of the %CSP.REST class, you'll see:

Parameter HTTP401UNAUTHORIZED As %String = "401 Unauthorized";

So you could try either set the %response.Status "401 Unauthorized" or add that parameter to your class and use it as you have before in %CSP.REST classes.

If you want to do all files in a directory, including recursively going into all subfolders, the command should be something like:

zip -r test001.zip /path/to/folder/

If you're trying to do this from inside ObjectScript, you'd have to use $ZF -100 to do that:

set args(1) = "-r"
set args(2) = "test001.zip"
set args(3) = "/path/to/folder/"
do $ZF(-100,"","zip",.args)

We haven't tried using it for ObjectScript, but we do have some customers who use Crystal Reports who have tried using it to help set those up, and it has been very questionable for that. It definitely doesn't understand what's where in the database structure, and even basic formula fields seem to be far more complicated than necessary.

If you want to treat them as lists, you probably want to use $LISTFROMSTRING along with $LISTGET, $LISTFIND, and $LISTLENGTH. All of which can be abbreviated to their initials, by the way - $LFS, $LG, $LF, $LL.

set y = $LFS("Red,Green,Orange,Yellow")
set x = $LFS("Purple,Black,Yellow,Pink")
for i=1:1:$LL(x){
    if $LF(y,$LG(x,i)) > 0 { 
        write $LG(x,i)_" found in both lists!",!
        //Or whatever else you want to do when you find a match here . . .
    }
}