Compile your routine/class with the 'k' flag (eq. /keepsource).  Otherwise the ObjectScript compiler throws away the .int code.

I'm a bit confused here - granting the user SELECT privileges on those tables didn't allow your customer's ODBC client to work?  It sounds like %ALL is working as designed (if you have %ALL you own the system and can therefore see everything).  What does the client tool look like when you grant just SELECT access to certain tables or schemas?  Can you try a different ODBC client to see how that behaves (I like WinSQL)? 

Your IDKEY is your ID field, so it is a unique identifier that also becomes the subscript of the global you use to store your data.  A Primary Key is any unique field (or combination of fields).  Having it be primary key is the same as it being unique, as far as I know. 

Changing your Identity property to have MINVAL=1 should make your class bitmap eligible.  If that doesn't work, please contact the WRC.

The easiest solution here is to link the table from another namespace.  Only takes a second and you don't need to screw around getting the storage right (note: do NOT start editing storage defs if you can avoid it - that is not an easily maintained solution).  This solution does not work if you have to JOIN the two tables together (we call this a heterogeneous JOIN), however.  The next best solution is to write your own class query as @Stephen Canzano & @Michael Smart  have recommended.  It's a little work up front but you can make some easy changes, such as creating a temp table and populating it with data from the other namespace or using a process private global.

Great article!  I especially liked the part where you mentioned me! :-D

For what situation(s) should a user go to this page?  For login?  After login?  When they've been timed out? 

I think what you want to do is have a custom login page that automatically redirects you to a default landing page.  But that's not configurable, you need to write that logic into your login page.  But you can put your custom login page into the Web Application menu.

I do know a way to add permissions on a table that doesn't exist yet - so I'm adding on to Pravin's answer. 

GRANT SELECT ON SCHEMA SQLUser TO MyRole

Then any table added to the SQLUser schema will be accessible to the role "MyRole" when that table is added.  Since Schemas (or schemata) are how we split up tables into more generic categories, this is a nice way to also spit up your permissions. 
 

So I spent 10 years working in Caché product support and this has popped up before. But I've only ever seen it on development systems when folks are creating, deleting, and updating classes at a much higher rate than would be acceptable on a production machine.  And I'm relatively sure it was all new development.  I think it ends up being an artifact of new development and the first creation of your class structures, though I've never been able to find what caused it in the past. 

OK you seem to have 3 questions here:
 

1) IRIS or Caché: If you're working with new the answer is IRIS.  IRIS is our "latest and best" and you'll be best off going there.

2) Which IDE: Doesn't matter.  Atelier is an Eclipse based IDE, which is nice if you're used to Eclipse.  I haven't touched VSCode so I can't speak for that.  Studio is our home-grown IDE.  Choose one, I'm not sure it matters at all, as long as you're comfortable using it.
 

3) How to deploy: In IRIS we have containers for deployment, so if you want to go that direction, great.  However, you might be more comfortable working on your own machine, which you can also do and bring in containerization later (if it makes sense).  Remember, using containers is a tool, and it's not ALWAYS the right tool for the job.

Good luck!  And if you have questions about building your application be sure to let us know!