Eduard Lebedyuk · Oct 17, 2016 go to post

The CALLIN^%ZSTART entry point gets executed when an external program begins or completes a callin. You can add logging there to see if something initiates callin.

Eduard Lebedyuk · Oct 13, 2016 go to post

What's speed are you getting? Rows per second and average size of row for example.

Have you tried comparing that speed with direct iteration over a same resultset in COS?

Eduard Lebedyuk · Oct 13, 2016 go to post

The largest pool size is recommended to be the same as the number of CPUs in the Ensemble server, since there are only going to be as many jobs available as the number of CPUs.

Why should number of jobs be less or equal to the number of cores? I tested (admittedly only one) BP for processing some objects and results (messages processed per second) were better with PoolSize=100, than with PoolSize=50 on a system with 1CPU/8cores.

Eduard Lebedyuk · Oct 12, 2016 go to post

Sorry, I posted a link to an old FieldTest version, it  not available now. I replaced the link in my example with actual version, so it should work now (delete cookies.txt and both lines need to be executed again).

Eduard Lebedyuk · Oct 11, 2016 go to post

You can write a dtl transformation or a generic business process which accepts object, dynamically gets a list of properties to convert (All %String properties? Some kind of a dictionary? Pattern?) and strips diacritic signs from them.

Eduard Lebedyuk · Oct 7, 2016 go to post

I use the following script (courtesy of Alexander Koblov):

wget --delete-after --keep-session-cookies --save-cookies cookies.txt --post-data='UserName=?????&Password=???????' 'https://login.intersystems.com/login/SSO.UI.Login.cls?referrer=https%253A//wrc.intersystems.com/wrc/login.csp'
wget --load-cookies cookies.txt --content-disposition 'https://wrc.intersystems.com/wrc/WRC.StreamServer.cls?FILE=/wrc/distrib/HS-2016.1.2.208.0-hscore15.01_hsaa15_hspi15_hsviewer15.01_linkage15-b6402-lnxrhx64.tar.gz'

First line for authentication and saves cookies into a file. Second line loads cookies from file and downloads with file.

Eduard Lebedyuk · Oct 6, 2016 go to post

You can call %KillCache method in a cubeclass. It does exactly that. For example:

write ##class(HoleFoods.Cube).%KillCache()
Eduard Lebedyuk · Oct 4, 2016 go to post

If you are on windows you may have access problems while writing into the root of system drive.

 I suggest you:

  • Provide filename pointing to your desktop directory (C:\Users\eduard\Desktop\1.xls for me, for example)
  • Instead of w ##class... save the status and decode it into a more readable form:
set sc = ##class(Utils.XLS).generateFileFromSQL(...)
write $System.Status.GetErrorText(sc)
Eduard Lebedyuk · Oct 4, 2016 go to post

I think compile should be called once after the loop. While in the loop you can build a local array of affected classes and pass it to the compiler after the loop.

Eduard Lebedyuk · Sep 27, 2016 go to post

Yes. You can use cursors for that. In the following example rowlist contains list of affected ids. You can get it all at the end or get individual ids right before or after the update, or even decide on the update based on id/val values:

Class User.NewClass1 Extends %Persistent
{

Property val;

/// do ##class(User.NewClass1).Test()
ClassMethod Test()
{
   do ..%KillExtent()
   
   &sql(INSERT INTO NewClass1 SET val = 0)
   &sql(INSERT INTO NewClass1 SET val = 3)
   
   set rowlist = ""
   &sql(DECLARE NewClass1 CURSOR FOR
        SELECT %ID,val
        INTO :id, :val
        FROM NewClass1)
   
   &sql(OPEN NewClass1)
   for {
       &sql(FETCH NewClass1)
       quit:SQLCODE'=0
       set val2 = val*2
       write "Processing id: ", id,!
       set rowlist = rowlist _ $lb(id)
       &sql(UPDATE NewClass1 SET val = :val2 WHERE CURRENT OF NewClass1)
   }
   &sql(CLOSE NewClass1)
   
   zw rowlist
}
}

It would output in a terminal:

>do ##class(User.NewClass1).Test()
Processing id: 1
Processing id: 2
rowlist=$lb("1","2")

Documentation:

Eduard Lebedyuk · Sep 27, 2016 go to post

Here's an example:

Class User.NewClass1 Extends %Persistent
{

Property streams As list Of %Stream.GlobalCharacter;

ClassMethod Test()
{
    do ..%KillExtent()
    
    set obj = ..%New()
    set stream1 = ##class(%Stream.GlobalCharacter).%New()
    do stream1.WriteLine("Hi")
    set stream2 = ##class(%Stream.GlobalCharacter).%New()
    do stream2.WriteLine(123)
    
    do obj.streams.Insert(stream1)
    do obj.streams.Insert(stream2)
    write $System.Status.GetErrorText(obj.%Save())
    
    kill
    
    set obj = ..%OpenId(1)
    for i=1:1:obj.streams.Count() {
        write "Stream #", i, ": ", obj.streams.GetAt(i).Read($$$MaxCacheInt)
    }
}
}
Eduard Lebedyuk · Sep 23, 2016 go to post

This method links stream object to an existing file:

Method imagefile()
{
  set obj = ##class(Sam.binary).%New()
  read "enter path to image: ",img
  set st = obj.Image.LinkToFile(img)
  write $System.Status.GetErrorText(st)
  set st = obj.%Save()
}