Robert Cemper · Apr 14, 2025 go to post

Did you mean to map this Global ?
 ^DepartmentMasterData("^E2C8.D9IS.*")  ?????

or just ^E2C8.D9IS.*  ? with all subscripts

Robert Cemper · Apr 8, 2025 go to post

OK

To Stream needs 1 line 2 statements
 

ClassMethod personsidGET(messageRequest As dc.Sample.v3rest.requests.personsidGET) As%Stream.Object
{
 set stream=##class(%Stream.TmpCharacter).%New(),sc=##class(dc.Sample.Person).%OpenId(messageRequest.pathid).%JSONExportToStream(.stream)
 return stream
 }

To String is shorter (just 1 statement) as you don't need to initialize %String)

ClassMethod personsidGET(messageRequest As dc.Sample.v3rest.requests.personsidGET) As%Stringdo##class(dc.Sample.Person).%OpenId(messageRequest.pathid).%JSONExportToString(.string)
 return string
{
Robert Cemper · Apr 7, 2025 go to post

not just Sample.Person but also Sample.Address,
or whatever serial class you refer to require %JSON Adaptor.
then

set person=##class(Sample.Person).%OpenId(3)
>set sc=person.%JSONExportToString(.Jperson)
set zjson={}.%FromJSON(Jperson)
ZWRITE
Jperson="{"LIMIT":103,"Name":"O'Rielly,Xavier E.","SSN":"331-77-5308","DOB":"1957-05-26","Home":{"Street":"8757 Elm Place","City":"Miami","State":"FL","Zip":"92027"},"Office":{"Street":"413 First Drive","City":"Miami","State":"NH","Zip":"83830"},"Age":67,"RowVer":0}"
person=<OBJECT REFERENCE>[2@Sample.Person]
sc=1
zjson=<OBJECT REFERENCE>[13@%Library.DynamicObject]

and there is your dynamic object

Robert Cemper · Apr 1, 2025 go to post

there is no description of how to communicate with Butler
at the moment it hangs around like a lazy chap

Robert Cemper · Mar 10, 2025 go to post

Congratulations to the participants and winners.
Special BIG THANKS to the organizers and administrators of this contest. 💐🏵🌷🌻🌹
I'm really proud to see how this community has grown and raised in quality.

Robert Cemper · Mar 3, 2025 go to post

do ^ADMIN  indicates that you run a classic straight ObjectScript program.
while WRITE just has 1 direction to act  READ is bi-directional.
READ can send some text as prompt and waits for reply.
The only bi-directinal device I know of are network connections as TCP, UDP, TRM,FTP,..
The common feature is : they communicate out of your IRIS instance.
Inside IRIS 
you may do a redirection e.g to some TCP port like |TCP|7000
but then this port is blocked. No other process can touch |TCP|7000.
So you need an external port wrapper to some other port. e.g. |TCP|7100

Then you can handle this bi-directional communication either by sequence
or you have a list of prompts and the expected replies or similar. 

The sequence of operation could then be:

  • have a STARTER that runs in background
    • initiate the external wrapper 
    • run do ^ADMIN
  • start the FOREGROUND 
    • connect to external wrapper
    • send prompts to terminal
    • get replies from external file
    • send it back to port
    • which forwards it to  ^ADMIN hanging in background

 The most tricky point is to handle situations where the communication
if it is not just 1 Prompt :=> 1 Answer  but
multiple Prompts or WRITEs  :=>1 Answer or 1 Prompt :=> multiple Answers.
So I'd suggest instead of an IRIS internal solution rather look for an
external Terminal program to consume and apply your answer script.  
 

Robert Cemper · Feb 26, 2025 go to post

check if your lines start with the labels or if you have some leading <blank> or <tab>
if so it is interpreted as function call instead of a label

Robert Cemper · Feb 25, 2025 go to post

slightly shorter using Julian Date

USER>set hours=-3write$zdt($zdth(hours*3600+$zdt($h,-2),-2))

Sorry, I just couldn't resist

Robert Cemper · Feb 25, 2025 go to post

From Ensemble.inc:
 

#define TRACE(%arg)             $$$catTRACE("user",%arg)
#define sysTRACE(%arg)          $$$catTRACE("system",%arg)
#define catTRACE(%cat,%arg)     Do:$$$DoTrace##class(Ens.Util.Trace).WriteTrace(%cat,$$$CurrentClass,$$$CurrentMethod,%arg)
#;#define DoTrace                 $S($D($$$EnsJobLocal("DoTrace")):$$$EnsJobLocal("DoTrace"),1:##class(Ens.Util.Trace).DoTrace())
#;#define EnsJobLocal         %Ensemble
#;
. . . . 
Class Ens.Util.Trace [ Abstract, ClassType = "", ProcedureBlock, System = 4 ]
{
ClassMethod DoTrace()
{
	Set tJobConfigName=$$$JobConfigNameQuit$G($$$ConfigTrace(tJobConfigName),0)||(""'=$G($$$JobTraceDevice))||$$$IsTerminalDevice($IO)
}

Robert Cemper · Feb 21, 2025 go to post

Never tried it for long time , but $system.CSP.Shell() might be a starting point
$system.CSP.*  seems to have some more useful methods.

Robert Cemper · Feb 20, 2025 go to post

I followed this rules with (1,1) as base
Starting any other point than (1,1) simply shortens the spiral.
now I reached 259

I really dislike the result as it is composed so unfriendly
just to save same bytes that nobody asked for.

Robert Cemper · Feb 19, 2025 go to post

I see a general problem in interpretation of the "spiral" 
so I took some drawing for aquadratíc and a rectangular matrix. 

  1. depending on the starting point you have to take a pre-designed direction
  2. if you hit the diagonal you have to turn right
  3. you have to invalidate the row/column you just were on
  4. proceeding to invalid points is not allowed.
  5. start a the central point is an immediate termination as it has no direction to proceed

The diagonal came to my mind thinking how to NOT increase the imaginative radius of the spiral.
The related subscripts for the diagonale points of an n*m are found as (-n/2+x,-m/2+y) 
The pink subscripts are obviously (n/2,m/2) and might be just virtual.   

As subscripts start with 1 and first  piece position  is also 1
some more adjustment of coordinates is required

I haven't written any useful line yet.

Robert Cemper · Feb 16, 2025 go to post

Just at a  2nd view also N=3 has that problem.
StarMiddleTop   (1,2) has the same Problem as MiddleRight (2,3)
Not all characters of the matrix show up in the result.
it shows DEFGHABIbut  DEFGHABC looks similar correct according to published rules
Is this expected behavior? 

2cents more

Robert Cemper · Feb 16, 2025 go to post

The clockwise logic is simple for a  3*3 matrix
though starting with 4*4  there is some rule missing on how the handle a dead end
Starting at a corner (1,1) or similar is trivial. 
BUT:  starting at any other point may create a rathole or miss some boxes 

Set matrix($Increment(matrix)) = "C,O,D,E"Set matrix($Increment(matrix)) = "U,C,H,G"Set matrix($Increment(matrix)) = "M,U,F,O"Set matrix($Increment(matrix)) = "S,I,F,L"

Start (1,1) is in the example but
Start (1,2) runs ODEGOLFISMU what is the next to (2,1) ?  (1,1)  or (2,2) or ??
worse with Start(2,2) already the first according to description could be
up (1,2) or right (2,3) or left (2,1)  leaving dead ends clockwise.
And this is only with N=4  larger grids may create multiple lost cells.
Clockwise spiral is just not detailed enough for a UNIQUE result to collect ALL cells
A rule how to handle / skip already consumed cells might improve.
Just as I type a non straight spiral solution to (2,2) consuming the full matrix
might be CUISMUCODEGOLFFH
 I fail to imagine grids >5*5
  

Robert Cemper · Feb 13, 2025 go to post

2 options:

set mylist = ""for i = 1:1:5 {
    set item = "item"_i
    set mylist = mylist_$ListBuild(item)
}
zw mylist
kill mylist
for i = 1:1:5set$li(mylist,i)="item"_i
zw mylist
Robert Cemper · Feb 6, 2025 go to post

As a first step I would search Journals to find the Globals affected
if they are not in IRISTEMP/CACHETEMP or PPG of if Journal is switched off.

In order to separate routine calls (abc^myroutine) from real ^globals
Though journal just shows Process Ids, no routine names.

Robert Cemper · Feb 6, 2025 go to post

Great idea.
Though it requires to run the whole application repeatedly.
Eventually need to fix transactions broken by <PROTECT> 

Robert Cemper · Feb 4, 2025 go to post

After un-install of my own python versions
PY was still there in a different hidden and protected version unknown for me.
I detected it using regedit 
C:\\Program Files\\WindowsApps\\PythonSoftwareFoundation.Python.3.12_3.12.2288.0_x64__qbz5n2kfra8p0\ 
I fail to explain where it came from (pre-installed win ?? )
Manual killing it and reinstallation of an official Python distribution fixed it.
BIG THANKS for your advise and help- 

Robert Cemper · Feb 4, 2025 go to post

Merci,
As noted I'm back to python 3.9.13.  sys.path looks correct
the problem persists
message log shows:

(17064) 1 [Generic.Event] Python library failed to LoadLibraryEx :126 C:\Program Files\Python313\python3.dll

NTFS error 126 indicates also a problem in DLL registry.
I used an official 64bit installer. Probably Pre-WIn11 design.

Robert Cemper · Feb 3, 2025 go to post

Your file format doesn't fit, but you are close.
UDL Header is missing, also leading blanks in the lines as you have no labels.
And you have to switch to namespace %SYS and back to make it work.

ROUTINE DisplayDB[Type=INT]
 new$namespacezn"%SYS"set db=##class(Config.Databases).DatabasesByServer("",.dbList)
 for i=1:1:$LENGTH(dbList,",") {
   set dbName= $PIECE(dbList,",",i)
   write dbName,!
 }
 quit
Robert Cemper · Feb 1, 2025 go to post

Try this from %Library.Routine: 
https://docs.intersystems.com/iris20243/csp/documatic/%25CSP.Documatic.cls?LIBRARY=%25SYS&CLASSNAME=%25Library.Routine#Delete
with flag=2

classmethod Delete(rtnname As %String, flag As %String = 0, supressbackup As %Boolean = 0, nsp As %String = $namespace) as %Status

Delete the routine rtnname. If the rtnname is not fully qualified we will resolve this into a fully qualified name first and then proceed with the rest of the delete. For example if you specify 'test' and there is a 'test.mac' it will resolve to this, if there was only a 'test.obj' it will resolve the name to this. The parameter flag specifies how much to delete. The options are:

  • 0 - Delete entire routine, for a MAC routine this will delete MAC, INT, OBJ. For an INT routine it will delete INT and OBJ, for a INC routine it will only delete the INC, for a BAS routine it will delete the BAS and the OBJ code.
  • 1 - Delete just the named routine, for example for a MAC routine it will only delete the MAC and it will leave the INT and OBJ if present.
  • 2 - Delete all the source code but leave any OBJ code.