Eduard Lebedyuk · Dec 24, 2021 go to post

New (2016.2+) Dynamic Objects support NULLs:

set mynull={"def":null}
set mynull2 = {}
do mynull2.%Set("def","","null")
Eduard Lebedyuk · Dec 17, 2021 go to post

Properties are recalculated so it's enough to execute this query once:

UPDATE <DOC TABLE CLASS> SET %Doc = NVL(%Doc||' ', %Doc)

I'm not sure how to trick SQL engine into updating the value without changing it completely but just NVL(%Doc, %Doc) does not work. Adding empty space after json does not affect it.

For DocDB indexed properties are defined as

Property firstName As %String [ SqlComputeCode = { set {*}=$$%EvaluatePathOne^%DocDB.Document({%Doc},"$.firstName")}, SqlComputed, SqlComputeOnChange = %Doc ];

So updating %Doc does the trick.

Also add:

WHERE <NEW PROPERTY> IS NULL

to recalculate only for documents where a property value is missing.

Eduard Lebedyuk · Dec 17, 2021 go to post

Try it like this:

new reader,sc,data,xmlSignature

set sc=reader.OpenFile(file)
quit:$$$ISERR(sc) sc

set document = reader.Document

do reader.Correlate("Signature","%XML.Security.Signature")
if 'reader.Next(.xmlSignature,.sc) {
    quit sc
}

quit xmlSignature.ValidateDocument(document)

From docs.

Eduard Lebedyuk · Dec 16, 2021 go to post

There are two options:

  1. Use SQL Gateway to create Linked Tabled from Oracle (if there are a lot of tables it might be better to create a linkage with a view). After that query Linked Table same as any normal InterSystems IRIS table using the code snippet above.
  2. Write a service with the EnsLib.SQL.InboundAdapter to query Oracle database. In that case you need to implement a CSV writer.
Eduard Lebedyuk · Dec 6, 2021 go to post

Only if the property becomes calculated after being stored which I don't see happening that often.

Eduard Lebedyuk · Dec 6, 2021 go to post

Sure

Property D As %String [ Calculated, SqlComputeCode = {set {*}=##class(CClass).DGetStored(##class(BClass).CGetStored(##class(ClassA).BGetStored({A})))}, SqlComputed ];

Would be way faster than SQL approach too.

Eduard Lebedyuk · Dec 6, 2021 go to post

if you need to get a->b->c->d 

That's what chained GetStored is for!

and they at the same time can be null

GetStored is a safe method: GetStored("") -> "", so it can be safely used even if some values are NULL.

Eduard Lebedyuk · Dec 3, 2021 go to post

You do it by chaining GetStored methods:

Class Document Extends %Persistent {

Property Filename As %VarString;

}

Class Question As %Persistent {

// Or relationship
Property Document As Document;

Property Filename As %String [ Calculated, SqlComputeCode = {set {*}=##class(Document).FilenameGetStored({Document})}, SqlComputed ];

}
Eduard Lebedyuk · Nov 25, 2021 go to post

I'm not really sure what is it that you want (please consider providing more information), but this project can be used to both read and write excel files.

Eduard Lebedyuk · Nov 24, 2021 go to post

Try it like this:

Class User.ResultsMessage Extends (%Persistent, %XML.Adaptor)
{

Property PersonIDs As list Of %String(XMLITEMNAME = "PersonID", XMLNAME = "PersonIDs", XMLPROJECTION = "WRAPPED");

XData Data
{
<Results>
  <PersonIDs>
    <PersonID>1000000</PersonID>
    <PersonID>1000001</PersonID>
    <PersonID>1000005</PersonID>
  </PersonIDs> 
</Results>
}

/// do ##class(User.ResultsMessage).Test()
ClassMethod Test()
{
	Set text = ##class(%Dictionary.XDataDefinition).IDKEYOpen($classname(), "Data").Data
	Set reader = ##class(%XML.Reader).%New()
	Set sc=reader.OpenStream(text)

	Do reader.Correlate("Results","User.ResultsMessage") 
	While reader.Next(.msg,.sc) {
		Write !,"Count(): "_msg.PersonIDs.Count(),!
	}
	Write:$$$ISERR(sc) $System.Status.GetErrorText(sc)
}
}

Docs.