Here's a fun test to see how well you know ObjectScript.
What will each of the following statements output?
InterSystems ObjectScript is a scripting language to operate with data using any data model of InterSystems Data Platform (Objects, Relational, Key-Value, Document, Globals) and to develop business logic for serverside applications on InterSystems Data Platform.
Here's a fun test to see how well you know ObjectScript.
What will each of the following statements output?
Did you know that Caché (and now InterSystems IRIS) has available parser for ObjectScript ?
Well, technically, lexer. It hides under the name of %SyntaxColor class. This class provides API to the DLL used by Studio to do syntax highlighting. As a result if works only under Windows.
Is anyone in the fine community of developers who work with ISC technologies looking at Microsoft's Visual Studio Code offering?
One of Bill McCormick's recent posts about Atelier referred to Visual Studio being considered the best IDE. Granted, Code is far less of a tool than VS, and probably always will be. But it claims to be open source and cross-platform, i.e. Linux and OS X as well as Windows.
I'm not 100% sure my post belongs in the Atelier group, but didn't see any other group that would be a better home. Might we benefit from a "Tools" group?
(Originally posted to InterSystems CODE by @Dmitry Maslennikov) The following code snippet outputs message header data in Ensemble. The class method "fetchExecute" runs the process, and the result is stored in the argument "qHandle":
include Ensemble
Class DAiMor.fetchMessageHeaderData extends %RegisteredObject
{
Query Fetch(Namespace As %String) As %Query(ROWSPEC = "Namespace:%String,ID:%Integer,Type:Ens.DataType.MessageType,Priority:Ens.DataType.MessagePriority,Invocation:Ens.DataType.MessageInvocation,TimeCreated:Ens.DataType.UTC,TimeProcessed:Ens.DataType.UTC,Status:Ens.DataType.MessageStatus,IsError:%Boolean,ErrorStatus:%Status,CorrespondingMessageId:%Integer,SessionId:%Integer,SourceConfigName:%String,TargetConfigName:%String,SourceBusinessType:Ens.DataType.MessageBusinessType,TargetBusinessType:Ens.DataType.MessageBusinessType,BusinessProcessId:%Integer,TargetQueueName:%String,ReturnQueueName:%String,MessageBodyClassName:%String,MessageBodyId:%String,Description:%String,SuperSession:%String,Resent:%String") [ SqlProc ]
{
}
(Originally posted on Intersystems CODE by @Iain Bray) The following code snippet converts all indices in a package to bitmap indices. The subroutine "test" runs the code:
I have a XML enabled persistent class and a XML representation of some object of this class (object ID is available).
How can I use XML Reader (or some other mechanism) to automatically update this object?
Hi
Totally new to IRIS and Cache.
Trying to evaluate it and work out how we could use it.
As a standard application database. Object or relational etc. does not matter.
Issue is ObjectScript.
So:
1) Can we develop, maintain and use an IRIS database and never use ObjectScript i.e. use only Java, Python, C++ interfaces etc. (exactly which one does not matter)? Would that make designing and using the IRIS database more prone to inefficiency and error?
2) Can we import an existing Cache database into IRIS and convert its ObjectScript code into Java, Python whatever?
I need to write a script to answer a couple of fairly simple questions:
1) What is the current routine DB (name and location) for this namespace?
2) What is the current data DB (name and location) for this namespace?
3) Is global ^ABC mapped to a different location than the default data DB?
Can anyone point me to some system APIs that would allow me to answer these questions?
Thanks!
Ben
Hi Developers!
New video from Global Summit 2018 is available now on InterSystems Developers YouTube Channel:
Unit Test Coverage in InterSystems ObjectScript
I'm trying to interpret a ObjectScript pattern and I am stumped on the first part. I understand everything else but not sure what 1.A means. I know A stands for Alpha characters just not sure what the 1. means
Hi,
This must be a really easy question but for some reason I am unable to do this
I have a string name = "ERRORMSG"
I want to remove the first 2 characters in the string, so the result should be string newname = RORMSG
Please can you advice on how I can do this?
The following code provides information about software builds. Read the original description below for information about the different methods:
(Originally posted on Intersystems CODE by @Eduard Lebedyuk, 10/12/15) The following code snippet outputs all filenames in the file path "dir" in the Cache/IRIS terminal. The class method "test" runs the code:
Class eduardlebedyuk.filenamesInDir Extends %RegisteredObject
{
classmethod test() {
// replace dir with file path you want
set dir = "D:\directory"
set dir = ##class(%File).NormalizeDirectory(dir)
set file=$ZSEARCH(dir_"*")
while file'="" {
write !,file
set file=$ZSEARCH("")
}
}
}
This code snippet contains the class method "test" which sends an HTML email. Change the literal strings in the method to customize the email's from address, to address, subject, and body:
Class objectscript.sendEmail Extends %RegisteredObject
{
classmethod test() {
set m=##class(%Net.MailMessage).%New()
set m.From="user@company.com"
set m.IsHTML=1
do m.To.Insert("user@company.com")
set m.Subject="Sent by IRIS mail"
set m.Charset="iso-8859-1"
do m.TextData.Write("<HTML><HEAD><TITLE></TITLE>"_$char(13,10))
do m.TextData.Write("<META http-equiv=Content-Type content=""text/html; charset=iso-8859-2""></HEAD>"_$char(13,10))
do m.TextData.Write("<BODY><FONT face=Arial size=2>Test <B>Test</B></FONT></BODY></HTML>")
set s=##class(%Net.SMTP).%New()
set s.smtpserver="mail.company.com"
set status=s.Send(m)
}
}
Here's a link to the code on GitHub
Is it just set varName = 1 or is there an actual true/false value?
Hello all...
Is there two matching patterns in Caché, is there a difference in use one or the other?
Example:
USER>set a = "(1234)"
Using $match.
USER>w $match(a,"\([0-9]{4}\)")
USER>1
Using literal match (sorry if not correctly term expression)
What is different from using one or the other?
The 'a?1"("4n1")"' does this pattern exist only Caché.
Exists performance improvement with use pattern Caché?
This code snippet uses %ZEN.Auxiliary.jsonSQLProvider. The namespace and string of SQL can be edited for different situations. The class method "test" runs the code:
Class eduardlebedyuk.passQuestionParams
{
classmethod test(pValue = 50) {
s ns = $Namespace
zn "samples"
s tSQL = "SELECT ID, Name FROM Sample.Person WHERE Id > ?"
s tPR = ##class(%ZEN.Auxiliary.jsonSQLProvider).%New()
s tPR.sql = tSQL
s tPR.%Format = "tw"
s tPR.maxRows = 100
s tParam = ##class(%ZEN.Auxiliary.parameter).%New()
s tParam.value = pValue
d tPR.parameters.SetAt(tParam,1)
d tPR.%DrawJSON()
//d ##class(%ZEN.Auxiliary.jsonSQLProvider).%WriteJSONFromSQL(,,,,,tPR) //same thing
zn ns
}
}
(Originally posted to Intersystems CODE by @Eduard Lebedyuk, 5/13/15)
Here's a link to the code on GitHub
Hi All,
I need some help with sending PDF files to printer using cache instead of using third party tools(Adobe, foxit reader, etc..).
Sometime i getting access issue with the exe files.
Can able to send text data to printer using below code.
Set Dev="|PRN|PrinterName"
OPEN Dev:(/DATATYPE="TEXT"):80
USE Dev Write "Test printing",!
CLOSE Dev
Any suggestions on sending PDF to printer?
Hello,
I am a beginner with Object Script and I hope anyone can help me solving my questions.
1. Is there a way to time a loop in Object Script?
2. My code leads to the following error, even though it executes the method.
Is there a way to ignore this specific error, so that I can repeat my code in a time loop over and over again without stopping?
There are some classes in our code base that contain Methods only (no properties). I told my colleagues that converting them into the ClassMethods should improve performance as it would eliminate unnecessary OREF support at run-time. Some of them replied that it would be microseconds, so what is the reason to bother.
Is it possible to estimate the impact of OREF support of method calls at run-time? E.g., as a % of all CPU load.
Hi!
Did anyone try to serialize objects in Caché using Google Protocol Buffers? Your experience will be very helpful for me.
Thanks!
The following class method "test" contains code that can create a new class, create new properties for classes, or create new methods for classes. "test" runs all three of these processes once, and the code that performs each action is labelled by comments in the method:
ClassMethod test() As %Status
{
set sc = $$$OK
// Create a class
set class = ##class(%ClassDefinition).%New("MyClass")
set class.Description = "This is my test class"_$c(13,10)_"testing %ClassDefinition"
set class.Super = "%Persistent"
// Create a property and add it
set property = ##class(%PropertyDefinition).%New("MyClass.MyProperty")
set property.Type = "%String"
set property.Description="This is a property"
set sc1 = class.Properties.Insert(property)
do:$$$ISERR(sc1) $system.Status.DisplayError(sc1)
set sc = $$$ADDSC(sc, sc1)
// Create a method and add it
set method = ##class(%MethodDefinition).%New("MyClass.MyMethod")
set method.ReturnType = "%Integer"
set method.FormalSpec = "x:%Integer,y:%Integer=10"
set method.Description = "Return product of x and y"
set method.CodeMode = "code"
set method.Code = " new result"_$c(13,10)_" set result=x*y"_$c(13,10)_" quit result"
set sc2 = class.Methods.Insert(method)
do:$$$ISERR(sc2) $system.Status.DisplayError(sc2)
set sc = $$$ADDSC(sc, sc2)
// Save the class definition
set sc3 = class.%Save()
do:$$$ISERR(sc3) $system.Status.DisplayError(sc3)
set sc = $$$ADDSC(sc, sc3)
return sc
}
Here's a link to the code on GitHub
The following code snippet includes a class method "test" that runs code to find a class based on the class's name. "test" takes one argument, which is the name of the table:
Class objectscript.findTable Extends %RegisteredObject
{
classmethod test(name as %String="mytable")
{
#Dim result as %ResultSet
#Dim tName as %String
#Dim contain as %Integer
Set contain=0
Set result = ##class(%ResultSet).%New("%Dictionary.ClassDefinition:Summary")
Do result.Execute()
While(result.Next())
{
Set tName=$get(result.Data("Name"))
&sql(select position (:name in :tName) into :contain)
Write:contain'=0 tName, " ... ", name, " (", contain,")", !
}
Return $$$OK
}
}
Here's a link to the code on GitHub
This code snippet determines the day of the week associated with a date. The class method "test" takes a date as a string in "mm/dd/yyyy" format, and returns an integer corresponding to a day of the week:
Class cartertiernan.getDayfromDate Extends %RegisteredObject
{
classmethod test(date) as %Integer {
//Set date = $ZDATE(date) // Looks like: mm/dd/yyyy
Set monthList = $LISTBUILD(0,3,3,6,1,4,6,2,5,0,3,5) // (Jan,Feb,Mar,Apr,...)
Set centuryList = $LISTBUILD(6,4,2,0) // first two digits divisiable by 4, then subsequent centuries. EX (2000, 2100, 2200, 2300)
Set dayList = $LISTBUILD("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday") // Index goes from 0-6
Set day = $PIECE(date,"/",2) // get the day
Set monthVal = $LIST(monthList,($PIECE( date,"/",1 ))) // get the month value
Set first2DigsYear = $PIECE( date,"/",3 ) \ 100 // get the last 2 digits of the year
Set last2DigsYear = $PIECE( date,"/",3 ) # 100 // get the first 2 digits of the year
// Used for DEBUG perpouses
/*write !,"day: ",day
write !,"Month: ",monthVal
write !,"last2: ",last2DigsYear
write !,"first2: ",first2DigsYear
write !,"cen Val: ",$LIST(centuryList,(first2DigsYear # 4) + 1),!!*/
// Look here for formula explination (its the "Basic method for mental calculation")
// http://en.wikipedia.org/wiki/Determination_of_the_day_of_the_week
Set dayOfWeekVal = ( day + monthVal + last2DigsYear + (last2DigsYear\4) + $LIST(centuryList,(first2DigsYear # 4) + 1 ) ) # 7
Quit dayOfWeekVal
}
}
Here's a link to the code on GitHub
(originally posted to CODE by Carter Tiernan, 6/18/14)
Hello Experts,
I have a silly question of using InsertParam method and usage. I understand it is name value pair. I am using GET method to send a url and to get the details from server. URL has multiparameter
URL - api/Identifier/Image/?Verify.EDD={EDD}&Verify.Ethnicity={ETHNICITY}
I have used the URL in a method and called that method directly in the business operation. I am using Insertparam method -
do httpRequest.InsertParam("EDD",..Data.Verify.EDD)
do httpRequest.InsertParam("ETHNICITY",..Data.Verify.Ethnicity)
Hi All, Can any one please tell how to get the Windows SID number using Caché Command.
I am trying to create a file from within a zen page but it keeps giving me a method does not exist error
in my page, i am taking the values and writing them to a file, when I do this :
set filename= ##class(%Library.File).New("E:\test\file.txt") it gives me an error
Would appreciate some guidance on this.

We have the need to write a function that can loop through say a field in an OBX segment within HL7 and compare it to a string passed. Is it possible to have the user enter the Operator ( >,<,=,<>) as a variable inside Cache object script? Does anyone have any examples they can share?
Thanks
Scott Roth
The Ohio State University Wexner Medical Center
Hi,
it is possible to convert a csv file to json file?
I want to stream json files and output the data as it comes in from the files. So my files are "csv" type and I want to convert these files to "json" type.
I can read csv file as follows:
ClassMethod ReadFile()
{
set stream = ##class(%Stream.FileCharacter).%New()
set sc = stream.LinkToFile("*.csv")
do stream.Rewind()
while'stream.AtEnd {
set line=stream.ReadLine()
write line,!
}
What should I add to convert it to "json" and read it again?
Thank you
Hi,
I have a routing rule that calls some utility classmethods, but for some reason the compiled version insists on linking to a utility function in a different package.
The call to 'SendToEaling(HL7)' in isn't compiling to a call to the LNWTIEPackage as expected:
##class(LNWTIEPackage
but is instead becoming a call to the LNWDeploy package
##class(LNWDeploy
Specifically
<assign property="@SendToEaling" value="SendToEaling(HL7)"></assign>