Hi Jochen.

If you have different modules in one namespace I suggest to you to have different Atelier projects for these modules. Then you can have one Git repository to handle all these projects.

With such approach the repository has all the code for the namespace and the code is grouped by projects (modules) inside repository.

Here you can find more details on how you can define Git repository for multiple projects.


I'm not aware of such global setting.

If you want to prevent legacy Caché ObjectScript application with direct global access to see not-committed data, then you need to implement proper locking in that application.

Starting READ COMMITTED transaction in that process will not help as this does not affect the code that modifies globals directly.

Hi P.

Check for $d(^Vehicle(unitNumber)) in your sample is not right -- process in transaction can always read data that it has changed.

Starting transaction in READ COMMITTED mode means that this transaction cannot read data modified by other transactions but not commited yet (provided other transaction properly locks the data). It does not restricted other processes from reading data changed by this transaction, unless

a) Other process also starts transaction in READ COMMITED mode
b) Other process acquires the lock for the global node that is modified by current process.

So, if legacy Caché ObjectScript code does not use locks you cannot prevent it from reading your uncommited data.

If legacy Caché ObjectScript uses locks then you need acquire these locks before inserting the rows into Vehicle.* tables.

Transaction isolation in Caché is implemented using locks. When you modify data using SQL or Object-access Caché acquire locks for you, unless you explicitely say not to do this.

Please see following documentation for more information on locking and concurrency in globals, Objects and SQL
"Locking and Concurrency control"
"Modifying the Database"

Hope this explains things a little more,

First of all, this is bad sample of GROUP BY query, in my opinion:

SELECT c1, c2 FROM table2 GROUP BY c1

You are grouping by c1, but also selecting c2. GROUP BY collects all rows with the same c1 into one row. Each group of row with the same c1 might have different values of c2. What particular value of c2 you want to get?

Generally, if you query contains GROUP BY, SELECT should contain either expressions from GROUP BY, or aggregate functions. For example, following query is OK:

SELECT c1, max(c2) FROM table2 GROUP BY c1

Having said all that, you might try to concatenate column1 and columnn2

SELECT column1, column2, column 3
FROM  table
    column1 || '===' || columnn2 IN (SELECT c1 || '===' || c2 FROM table2 GROUP BY c1)
ORDER BY column1

provided that values in these columns do not contain '==='

Another possibility is:

SELECT column1, column2, column 3
FROM  table T1
               WHERE T2.c1 = T1.column1
                 AND T2.c2 = T1.column2)
ORDER BY column1

I think GROUP BY is not necessary in second case.

Try to open following URL in browser on the machine where the Atelier is installed:


What does it return?

Check in web applications settings that /api/atelier is enabled.

Check in System Dashboard that you have enough license units.

UPD: I modified URL to http://server:57772/api/atelier/