Robert Cemper · Jun 8, 2021 go to post

no qspec required.

USER>set file="box.xml"
USER>set sc=$system.OBJ.Export("box.GBL",.file)
 
Exportieren in XML gestartet am 06/08/2021 11:46:58
Exportiere Global: ^box
Export erfolgreich abgeschlossen.
 
USER>$type box.XML
 
<?xml version="1.0" encoding="UTF-8"?>
<Export generator="Cache" version="25" zv="IRIS for Windows (x86-64) 2021.1 (Build 209U)" ts="2021-06-08 11:46:58">
<Global>
<Node><Sub>^box</Sub>
<Node><Sub>1</Sub>
<Node><Sub>1</Sub>
<Data> </Data>
<Node><Sub>0</Sub>
<DataBase64>G1syOzRI
</DataBase64>
</Node>
<Node><Sub>1</Sub>
<Data>1</Data>
</Node>
<Node><Sub>2</Sub>
<Data>...456..9</Data>
</Node>
</Node>
<Node><Sub>2</Sub>
<Data> </Data>
<Node><Sub>0</Sub>
<DataBase64>G1syOzEwSA==
</DataBase64>
- - - -   removed ------- 
</Node>
</Node>
<Data> </Data>
USER>
Robert Cemper · May 25, 2021 go to post

Ok. this is not MS-SQL.
Connect with your Studio to the correct Namespace and print out the related ClassMethod. 
This would most likely be some code in ObjectScript and not look like SQL

Robert Cemper · May 24, 2021 go to post

ownership is typically irisowner:irisuser.
Apply chown to the iris directories & files

Robert Cemper · May 22, 2021 go to post

instead of simple ls run ls -l  to see who is the owner.
most likely it's the user that installed iris.
to fix it run sudo chmod . . . 

Robert Cemper · May 21, 2021 go to post

I did this more than a year ago. It was quite some effort but it worked nicely.
But I was blocked by ISC and got under pressure not to publish it for copy-right reasons.
So be careful not to have this same conflict. Pls. don't ask for details!

Robert Cemper · May 20, 2021 go to post

OK! Thanks for resolving the miracle! 
And we just learned IRIS does JSON . . .  more or less . . . some times  . . . somehow . . . fuzzy
A real enlightenment that I was not aware of !

Robert Cemper · May 20, 2021 go to post

After a lengthy discussion, you still seem not to be aware of what information you send and what is coming back.
It may help just to watch your communication using TcpTrace or WireShark to find out what ERROR to chase at all.
As I distrust your initial JSON construct I checked my personal opinion with
a public JSON validator. https://jsonformatter.curiousconcept.com/
Info: Remove trailing commas.
But this was pointed out correctly already before me by @Julius Kavay 
 

Robert Cemper · May 20, 2021 go to post

I'd strongly recommend to use %Stream since 3.6 MB is huge for a String but not for a PDF.
Besides the absolute maximum of 3.6 MB for %String you may have additional limits of %String.
Dating from ancient ODBC the default max. for Strings is 50 !!!! If you don't set (MAXLEN="") explicitely

Robert Cemper · May 17, 2021 go to post

I  don't think so. But Caché has a bunch of quite useful tutorials included in the kit.
 

Robert Cemper · May 12, 2021 go to post

I assume you have a PatientID so you might be able to select your records using an INNER JOIN in this way:

SELECT <.......your columns....,contacttype,....> 
FROM my.patient as pat
INNER JOIN 
(select PatientID, MAX(DateFrom) as MaxDate FROM my.patient Group by PatientID) as max
ON  
pat.PatientID=max.PatientID AND pat.DateFrom=max.MaxDate
WHERE  <...whatever... >

so you get the records with the highest DateFrom by Patient
 

Robert Cemper · May 12, 2021 go to post

Did you perform "Purge cached queries" before your test?
I tried it with some test data and could see the expected query plan using
Index numDossiersMERIdx On numDossiersMER(ELEMENTS);
 

Robert Cemper · May 12, 2021 go to post

if you use Relationship many As obj [ Cardinality = many, Inverse = one ];
you create a managed pointer from many->one  with no sequence of insert.
Though it may be kept if new "many" elements are inserted in sequence with ascending IDs.
Later (manual?) add to the relationship of already exisiting "many" may break this.

To bypass this limitation I see 2 possible solutions:
- you add a property (auto-incremented, insert sequencer) to "many" to keep the insert sequence 
e.g.  Property InsertSequence As %Integer [ InitialExpression = {$increment(^InSeq)} ];
which is rather brute force, but available to manual adjustment for existing data

- you add to "one" side: Property ManyList As %ListOfObjects;
and add your many with Insert() function at and the end of the individual list.
The advantage of this approach is to have the freedom to change the sequence at your needs
And it also allows a kind of m:n relation as you are not limited to add your many to a unique one.
This is not my preferred solution and requires some coding erfort.

Robert Cemper · May 2, 2021 go to post

All your examples are correct.
BUT: 
- all your examples assume that docker is available to the users.
- this prerequisite is not always given. And may even contradict customer-defined rules.
And as I mentioned earlier: customers pay so they define their rules.
Losing a bid just because someone deep in the background dislikes SSH access must not be acceptable.  
[I have learned my lessons using VMware long before it became an "accepted platform" ]

Robert Cemper · Apr 28, 2021 go to post

¡Hola @Kurro Lopez !
It's a really interresting issue.
#2) your second example can't work by principal as you don't pass a call parameter.
#1) It is not foreseen to use object properties as host-variables in SQL
The code fails in the generated Execute method.

set tResult = tStatement.%Execute($g(pObject.KeyProcess),$g(pObject.CodeSpecialist),$g(pObject.CodeProvider),$g(pObject.CodeCenter),$g(pObject.Date))

$GET for oblect-properties is just not ​implemented. It is definded by the class and always there,
But it is required and makes sense for multidimensional properties !

This is valid for ObjectScript as such and not related to SQL.​​​​​​
But in handwritten code you can use $g(NOTHING,pObject.KeyProcess
The generator just doesn't do it. 

 

Workaround #1: directly fiddle in the generated code .  Not recommended
Workaround #2:  move your properties with a helper function into local variables
and adjust your query to those variables 
example helper (with obj or id):

ClassMethod FillProp(pObject As Kurro.MyClass) As %Boolean [ SqlName = FILLP, SqlProc ]
{
if '$isObject(pObject) set obj=##class(Kurro.MyClass).%OpenId(pObject)
else  set obj=pObject
set %Kurro("kp")=obj.KeyProcess
     ,%Kurro("sp")= obj.CodeSpecialist
     ,%Kurro("pr")= obj.CodeProvider
     ,%Kurro("cs")= obj.CodeCenter
    ,%Kurro("dt")= obj.Date
quit 1
}
example query;
Query GetInfoRcc(objid As %Integer) As %SQLQuery(CONTAINID = 0, ROWSPEC = "IdList:%String,IdProcess:%String,Duration:%String")
{
    SELECT IdList, IdProcess, Duration
    FROM Kurro.MyClass
    WHERE KeyProcess = :%Kurro("kp")
    AND CodeSpecialist = :%Kurro("sp")
    AND CodeProvider = :%Kurro("pr")
    AND CodeCenter = :%Kurro("cs")
    AND "Date" = :%Kurro("dt")
   AND FILLP(:objid) = 1
}

works as expected.
Sorry for being late. I was interrupted by ....  15 times at least with nonsense
 

Robert Cemper · Apr 25, 2021 go to post

try:

;
set file=$system.Util.ManagerDirectory()_"messages.log"
open file:("RS"):1 w $T  open 2:99
try { for n=1:1 use file read lin use 2 write lin,! } catch { close 2,file  write n_" lines",! }
;

then use ^SPOOL mapping (OEX) to work on it with SQL

Robert Cemper · Apr 23, 2021 go to post

Hello Hannes!
Thanks for the hint ! I'll check immedeatly.
-  for the stop:
I've seen this in some cases but could imagine it related to large global buffers.
default timeout for docker stop iris is 10 sec  but  docker stop -t 60  iris will give it a minute
the total save approach could be 
docker exec iris iris stop iris quietly      so iris is down
docker stop iris                                          now stop the container