Are you asking how to check a global to see if the system is Dev/Test/Production as per the "System Mode" dropdown in the "Memory and Startup" page in the SMP?


If so, then this is stored in the following global:


It should have values like "DEVELOPMENT", "TEST" and "LIVE"

There are different kernels but other than that you should be able to run the same ObjectScript code on both platforms and it will behalf identically.  If you are going to be doing file interactions, then I suggest using the %File library class which will make your code portable between Windows and UNIX file systems.  Likewise if you are calling out to other executables, you will need to instrument your code to call out appropriately based on your platform. 

I am assuming you want to create a tag-based CSP page as a quick and dirty way to through up some data in a table?  If so, the basic steps would be:

  1. Load a JS library like to make your filtering easy
  2. Write out your <table> and <th> tags 
  3. Create a <script language='cache' runat='server'> block to hold your ObjectScript which will fetch your result set 
  4. Use %SQL.Statement to create and run the query and fetch the data
  5. Iterate over the resultset, and write out a row of HTML for each row in the resultset using &html<>
  6. End your </script> tag and then end your </table> tag

Hope that gets you rolling!

You can get a Community Edition of InterSystems IRIS as Evgeny suggested, or if you need a new developer license for your Caché instance you should work with your Account Manager to get one.  If you are not sure who your account manager is, contact the WRC who should be able to help direct you.

@Perla Escarcega  - taking a closer look at this, I think we had an issue with a historical file clean-up routine which was a little too overeager to reclaim space.  All of your source is safe and available but you may need to create a fresh ItemSet to push this source.  Note - you should always be making fresh ItemSets anyway because the head revision may be newer than what is in your historical ItemSet, and you don't want to get an older revision of something which breaks when interacting with a newer revision of other items.  So simply create a new ItemSet for BASE and deploy it and you should be all set.

P.S.  This does raise the question of why you are initializing a new Secondary BASE environment from old ItemSets as opposed to just grabbing the head revision of the BASE source and running Refresh to pull it all into the Namespace?  I am afraid your approach may be significantly more risky than the recommended approach.  

@sjbttt sjbttt  - it sounds like you want to set up source control which controls this Readonly property on the server, is that correct?  If that is the case, then you will need to use server-side source control hooks.  would be a good place to start understanding how to manage this in general.

For your specific question, the way we force classes to be read-only with our source control hooks is via the GetStatus() method which should be extended from the %Studio.SourceControl.Base subclass of your hooks (see
).  This method returns an "Editable" property which your hooks control and which can be used to force the IDE (Studio, Atelier or VSCode) to treat the file as Readonly, thereby preventing users from changing it.  In our development workflow, we will force the class to be Readonly in the following situations:

  •  The user does not have it checked out
  • A different user has it checked out
  • The entire namespace has source locked (e.g. for non-development environments)
  •  It is mapped from another namespace (we manage our source branches based on Namespace so we treat a read-only those things which are not in the current Namespace

Hope this is helpful.  

That may be the cleanest you can get it, unless you know that the methods are always Classmethods of the class you are calling in which case you don't need to send $classname() every time.  But sending it does allow for the generalized use-case of calling to different classes.

I was playing around to programmatically figure out how many argument a method accepts using %Library.ClassDefinition, however I just realized that if $classmethod() can't accept variable argument quantities than this doesn't help at all and you'd still end up with the approach that you have above.  

It may be worth a note to the WRC to ask for an enhancement to $classmethod() (unless someone chimes in here to say that there is a way to pass a variable number of arguments to it)

Not sure what you mean by occurring before and after.  However, you could pass the name of the method and then execute it using $ClassMethod within MethodA()

Something like:

Do ..MethodA("Method1","var","Method2",0)

MethodA {method1, arg1, method2, arg2) {

Do $classmethod($classname(),method1,arg1)

Do $classmethod($classname(),method2,arg2)


But again, I am not entirely sure what you want to accomplish here....

I suggest you contact Support if no one provides insights on this thread.  


If you are interested in a full kit install rather than a container, you can get yourself a full kit of InterSystems IRIS For Health Community Edition from:

(If you are interested in a container, see the other answers people have already given you)

HTH - welcome to the community and feel free to ask any questions here as you are learning / gaining your experience!