Robert Cemper · Jul 19, 2019 go to post

ENSEMBLE may have some signal mechanic.

BUT at Caché level you still have Special Variable $HALT as the last chance handler.
all details https://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=RCOS_vhalt

Most important: 

If you have $HALT set and also have code defined for ^%ZSTOP when a HALT is issued, the $HALT is executed first. $HALT can prevent the termination of the process, if its halt trap routine does not contain a HALT command.   !!!!

Robert Cemper · Jul 19, 2019 go to post

if you test your example from terminal prompt it needs some important change:

open file:("WNS"):3
if ('$test{  write !,"Failed to open "_file  quit  }
use file do ALL^%SS      ;; must be the same line
close file
quit

Robert Cemper · Jul 18, 2019 go to post

the popular use of is INTERACTIVE.

But there is a BATCH option:   

SAMPLES>zn "%SYS"
 
%SYS>d BATCH^GBLOCKCOPY
 
1) Manage Batches
2) Run a Batch
3) Restart a Batch
4) Add Processes to a running Batch
5) Stop a Running batch
6) Monitor Running Batch
7) Batch Report
8) Exit
 
Option? 1
 
1) Create a Batch
2) Edit a Batch
3) List Batches
4) Delete a Batch
5) Exit
 
Option?

I never used it myself.

it seems to me you should find it in  ^%SYS("GBLOCKCOPY")

But the source code is open in %SYS and easy to read:

BATCH
 !
 !,"1) Manage Batches"
 !,"2) Run a Batch"
 !,"3) Restart a Batch"
 !,"4) Add Processes to a running Batch"
 !,"5) Stop a Running batch"
 !,"6) Monitor Running Batch"
 !,"7) Batch Report"
 !,"8) Exit"
 !
 Option=$$OPTION("Option? ",8,8)
 Option=1 BATCHMANAGE BATCH
 Option=2 BATCHRUN BATCH
 Option=3 BATCHRESTART BATCH
 Option=4 BATCHADDPROCESSES BATCH
 Option=5 BATCHSTOP BATCH
 Option=6 BATCHMONITOR BATCH
 Option=7 BATCHREPORT BATCH
 q
BATCHMANAGE
 !
 !,"1) Create a Batch"
 !,"2) Edit a Batch"
 !,"3) List Batches"
 !,"4) Delete a Batch"
 !,"5) Exit"
 !
 Option=$$OPTION("Option? ",5,5)
 Option=1 BATCHCREATE BATCHMANAGE
 Option=2 BATCHEDIT BATCHMANAGE
 Option=3 BATCHLIST BATCHMANAGE
 Option=4 BATCHDELETE BATCHMANAGE
 q
BATCHCREATE $zt="BATCHE"
 Name=$$GETNAME("Batch name to create? ",0,0) q:POP
 f  !!,"Adding to batch: "_Name BATCHSETUP q:POP
 BATCHCREATE
BATCHEDIT   $zt="BATCHE"
 Name=$$GETNAME("Batch name to edit? ",1,0) q:POP
 Status=$$GETSTATUS(Name,1)
 $p(Status,"~",4)'="Queue" !,"Batch "_Name_" has been run, please re-enter" BATCHEDIT
 $$YN("Do you want to add to the batch","Y")="Y" f  !!,"Adding to batch: "_Name BATCHSETUP q:POP
 $$YN("Do you want to delete entries from batch "_Name,"N")="N" BATCHEDIT
BATCHEDIT1
 SUMMARYREPORT(Name,0)
 Option=$$OPTION("Delete which entry? ",0,+$o(^|"^^"_$zu(12)|%SYS("GBLOCKCOPY",Name,""),-1))
 Option=0 BATCHEDIT
. . . . . . . .

HTH,

Robert Cemper · Jul 18, 2019 go to post

Sorry, this is a description of how to run a program of WINDOWS or LINUX from Caché.

What you address here ar Caché Routines or ClassMethods. 

Robert Cemper · Jul 17, 2019 go to post

to count the number of changes you may use this approach

 Set ^Data("Cambridge") = "1" if  $increment(change("Cambridge"))
 Set ^Data("New York") = "2" if  $increment(change("New York"))
 Set ^Data("Boston") = "3" if  $increment(change("Boston"))
 Set ^Data("London") = "4" if  $increment(change("London"))
 Set ^Data("Athens") = "5" if  $increment(change("Athens"))
 Set ^Data("Athens") = "6" if  $increment(change("Athens"))
 Set ^Data("Athens") = "7" if  $increment(change("Athens"))

zw change

change("Athens")=3
change("Boston")=1
change("Cambridge")=1 
change("London")=1 
change("New York")=1
Robert Cemper · Jul 13, 2019 go to post

"using object methods while running the report"

This is a rather generic statement.
If you are using CLASS METHODS (as I 'd assume) you can project each class method as Stored SQL Procedure too.

By this,  you can make them available to be used over JDBC.

Could be an eventual workaround.

Robert Cemper · Jul 12, 2019 go to post

This is a rather common misunderstanding.
The naming GLOBAL was created in the 60ties.
Long before any other programming language even had anything named Global or similar.

GLOBAL in Caché is a persistent storage component that builds the backbone of (SQL) Tables and Persistent Objects.

see this documentation: Using Caché Globals

Robert Cemper · Jul 11, 2019 go to post

OK !
They look rather similar.

BUT:

  • Process Private Globals are "unlimited". 
    Clear there is a physical limit, but it's far away compared to local variables.
  • PPGs are best suited as Storage location + Index location of temporary tables.
    Without limit as any ordinary Global. 

So it depends on your needs.

Robert Cemper · Jul 10, 2019 go to post

the data property is a standard HTML page.
I'm not aware of some function in Caché that converts HTML to JSON.

But asking Google "convert HTML to JSON"  shows that this a standard feature in JavaScript. 
so I see 2 options:

- write your own parser (or someone in the community has done this before ???

- call an external tool (eg. node.js) to it for you

see:   https://stackoverflow.com/questions/34504050/how-to-convert-selected-html-to-json

or  https://stackoverflow.com/questions/12980648/map-html-to-json

or https://stackoverflow.com/questions/43469412/convert-html-source-code-to-json-object

Robert Cemper · Jul 10, 2019 go to post

it's not related to ENS . the error is pure HTTP

<Ens>ErrHTTPStatus: Received non-OK status 404 from remote HTTP server: 'HTTP/1.1 404 Not Found':<html>

simply tells you that your URL is wrong.

try it in browser to verify it exists

Robert Cemper · Jul 8, 2019 go to post

as a quick approach:

  set instring="........whatever you  need .........."
  set len=75
  for part=0:1 {
    set segment=$extract(instring,part*len+1,part+1*len)
    do OBX(segment)
  if $length(instring)<(part+1*len+1)  quit      ; nothing left
  }

;;; have no details how OBX looks like but this are the pieces
Robert Cemper · Jun 29, 2019 go to post

I prefer this solution as it is in full accordance with the documentation and
with no need also for beginners to fiddle into internals .
https://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=RCOS_flist

  • $LIST(list,position,end) returns a “sublist” (an encoded list string) containing the elements of the list from the specified start position through the specified end position (inclusive). If position and end specify the same element, $LIST returns this element as an encoded list.

</snip> 

Robert Cemper · Jun 28, 2019 go to post

(XMLPROJECTION="wrapped");

should separate your items.

from docs:  https://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=GXMLPROJ_basics#GXMLPROJ_basics_collections

Effect of XMLPROJECTION on Collection Properties

Value of XMLPROJECTION Effect on Collection Properties
"WRAPPED" The property is projected as an element with subelements; each subelement corresponds to an item of the collection. This is the default for collection properties.
"ELEMENT" Each item in the collection is projected as an element, without being wrapped in the parent property.
 
Robert Cemper · Jun 27, 2019 go to post

I miss   Public {   } in your example
it ensures that only parameters are visible as <Private variables>  or all %*
 

Robert Cemper · Jun 27, 2019 go to post
MyFunc(Param1,Param2) Public {
    if $d(Param2)  write " 2 params",! 
    else  write " 1 param",!
  
    S Param2="it's all good"

   Q 1

}
Robert Cemper · Jun 27, 2019 go to post

did you try to Save your Stream.Container ?

set tSC tRequest.%Save()

before 

set tSC = ..SendRequestAsync(..TargetConfigNames,tRequest)

Robert Cemper · Jun 22, 2019 go to post

Did you check your license capacity? 
looks like running out of license slots.

Robert Cemper · Jun 20, 2019 go to post

my personal rule:

  • In the development stage, programmers should have full access but data are anonymized.
  • In the test stage - only some qualified developers get limited access
  • in the production stage, neither users nor developers should have access to the studio or terminal.
    Access is given only temporary, to top experts for error analysis.
    That's like the doctors that take care of places of your body you won't' show to anybody else.
     
Robert Cemper · Jun 20, 2019 go to post

Yeah!
you can lock out developers from SMP.

But you can't prevent them from writing code with similar functionality. And run it.
And then you have the same SYSTEM privileges as your Caché installation has. 

It might be hard to block it.

For stronger security block all developers on production systems. 

Robert Cemper · Jun 14, 2019 go to post

#3 in details:

- mount the copy of the DB as an additional DB to your Test Environment READ ONLY.
e.g directory C:\InterSystems\Cache\myCopyDB\
- Using Extended Global References you copy whatever global your need.

e.g.  merge ^my.Global = ^|"^^C:\InterSystems\Cache\myCopyDB\"|my.Global

Robert Cemper · Jun 13, 2019 go to post

did you try instead of Array Of Objects  to use List of Objects   ?

(it's different storage structure behind)

Robert Cemper · Jun 7, 2019 go to post

Ah, got it.
I understand and agree on 7, 8, 9

for 1. I still wait for the "modern" editor. 
None of the existing ones could really convince me. But all are easier to handle than vi or X ^%  devil

Robert Cemper · Jun 6, 2019 go to post

normally there is no need for such "wrapper"

typically %Save() returns a %Status object and then it's up to you to analyze it in case there is an error.
In the situation described here, all you can do is just a retry. 
- it could be a Lock collision 
- or the LockTable is full.  
Instead of fiddling in system parameters requiring a restart, you just wait and retry. 

if you are curious how often this happens you may add a loop counter. for further decisions

Robert Cemper · Jun 6, 2019 go to post

Yes.

it prevents an error message if there is a collision.
if nobody else is around it just falls through without loop.