Do you have SMP access? If so:

  1. Open any CSP app config, i.e. /csp/user.
  2. Note which folder it takes files from (CSP Files Physical Path property).
  3. Export production/classes/whatever into this folder into one xml file.
  4. Download the file from a browser.

What do you want your $list to look like?

If you want the end result to be like this:

$lb("das", "is", "wp", "dsa", "nmk")

try this code (assumes dir is shorter that 3 641 144 chars):

ClassMethod test(dir = "test.txt")
    set file = ##class(%Stream.FileCharacter).%New()
    set file.LineTerminator = $c(1)
    do file.LinkToFile(dir)
    set str = file.Read($$$MaxStringLength)
    kill file
    set separator = $c(13,10)
    do {
        set newstr = str
        set str = $replace(str, separator _ separator, separator)
    } while newstr'=str
    set:$e(str, 1, $l(separator))=separator str=$e(str, 1 + $l(separator), *)
    set:$e(str, *-$l(separator)+1, *)=separator str=$e(str, 1, *-$l(separator))
    set list = $lfs(str, separator)
    quit list

This is a naive implementation assuming you don't care about the speed.

Faster solution would go through file line by line.

There are two parts to it.

1. Create a trigger after INSERT/UPDATE/DELETE. Triggers can work for both sql and object access:

Trigger NewTrigger1 [ Event = INSERT/UPDATE/DELETE, Foreach = row/object, Language = objectscript, Time = AFTER ]
    set ^dbg={fieldname*N}

2. In the trigger code send an SMS. You can either use an API (a lot of them available) or talk to a GSM modem.

First you need to create corresponding classed. You can do that by either importing the XSD or manually.

Here's a manual approach:

Class test.mensajeWS Extends (%RegisteredObject, %XML.Adaptor) {

Parameter NAMESPACE = "https://wslexnet.webservices.lexnet/3.22";

Property respuestaEnvioMensaje As respuestaEnvioMensaje;

Class test.respuestaEnvioMensaje Extends (%RegisteredObject, %XML.Adaptor) {

Property idEnvio As %Integer;

Property tamBloque As %Integer;

Property bytesMIME As %VarString;

After that in your BS convert incoming XML string like this:

set reader = ##class(%XML.Reader).%New()
set sc = reader.OpenString(pRequest.EnviarIniciadoresGeneralOut)
quit:$$$ISERR(sc) sc

do reader.Correlate("mensajeWS","test.mensajeWS")

do reader.Next(.mensajeWSObj,.sc)
quit:$$$ISERR(sc) sc

// Process mensajeWSObj

For the case where only a new OnResponse method is added the workaround is executing these update queries:

UPDATE process.Context__ResponseHandlers
SET  "_ResponseHandlers" = 'OnResponseXYZ'
WHERE "_ResponseHandlers" = 'OnResponseABC'

Where ABC is an old method name, XYZ is a new method name.

In a case of several new methods they should be executed from the largest number first.

Unable to reproduce. Here's my test routine:

    kill a
    set a = 1
    set a(1) = 2
    do Test(.a)
    zw a

    set a(1) = a(1) + 1
    set a(2) = -1

And here's an invocation result:

>d ^ByRef

as you can see a new subscript has been added successfully.

Datatype classes are used to define object properties, they allow to:

  • Validate values both generic (for example any defined %Integer property by default checks that it's value is an integer) and based on datatype parameters (for example you can have an %Integer(MINVAL=0, MAXVAL=9) property which in addition to checking that it's value is an integer would check that integer value is between 0 and 9)
  • Provide different representations based on context, specifically:
    • Logical (what's stored in globals)
    • Display (what's shown in object)
    • XSD (for XML export/import)
    • ODBC (returned in SQL)
  • Provide generators for utility methods. Article on some examples.


Here's an example:

Class User.Assert Extends Ens.BusinessProcess [ ClassType = persistent, Language = objectscript ]

Method OnRequest(pRequest As Ens.Request, Output pResponse As Ens.Response) As %Status
    Set pResponse = ##class(Ens.Response).%New()
    $$$ASSERT(1) // skipped

    Quit $$$OK

Sure, just mount C:\InterSystems\IRISHealth\mgr\samples\ folder as a docker volume.

After that add a new Database from inside the container pointing to the mounted folder.

Have you tried to declare C# property like this:

public Dictionary<string, string> VarsXctsTU { get; set; }