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.

Eduard Lebedyuk · Nov 14, 2021 go to post

You can use this syntax on calculated properties:

/// This property holds the document state. Serialization is JSON. 
Property JSON As %Library.DynamicAbstractObject;

/// This is an automatically calculated property "$.firstName"
Property firstName As %VarString [ SqlComputeCode = { set {*}=$$%EvaluatePathOne^%DocDB.Document({JSON},"$.firstName")}, SqlComputed, SqlComputeOnChange = %Doc ];

/// Index on firstName property
Index firstName On firstName;
Eduard Lebedyuk · Nov 11, 2021 go to post

Well, enjoy.

UPD: it was missing isc.util.dbf.Field.

Class isc.util.DBF.Field Extends %SerialObject [ ClassType = serial, ProcedureBlock ]
{

Property name As %String(TRUNCATE = 1);

Property type As %String(TRUNCATE = 1);

Property length As %Integer;

Property decimals As %Integer;

}
Eduard Lebedyuk · Nov 11, 2021 go to post

Are there really no other options (CSV, JSON, XML)?

I have some code for a DBF reader, if you're interested I can share it and you can create a DBF writer by analogue.

Eduard Lebedyuk · Nov 10, 2021 go to post

Check out my series of articles: Debugging Web.

Add this code to see call parameters:

set %response.ContentType = "html"
do ##class(%CSP.Utils).DisplayAllObjects()
return $$$OK
Eduard Lebedyuk · Nov 10, 2021 go to post

Like this:

Class ... Extends %CSP.REST
{

XData UrlMap [ XMLNamespace = "http://www.intersystems.com/urlmap" ]
{
<routes>
<route call="logout" method="GET" url="/logout">
</routes>
}

/// Logout user from current session
ClassMethod logout() As %Status
{
    #dim %session As %CSP.Session
    set sc = %session.Logout(1)
    set %session.EndSession = 1
    return sc
}
}
Eduard Lebedyuk · Nov 10, 2021 go to post

1. Implement %iFind.Transformation.Abstract interface with the custom transformation that would remove all property names (I assume you know property names beforehand).

After that set TRANSFORMATIONSPEC index parameter to your transformation implementation.

2. Maybe User Dictionaries could also be used.

3. Are you sure you need analytic queries? Simpler iFind indices (Minimal, Basic) can be advantageous in some situations.

Calling @Benjamin De Boe 
 

Eduard Lebedyuk · Nov 3, 2021 go to post

Install Docker inside WSL2  (not DD on Windows).

Alternatively you can just install IRIS in WSL2.