Eduard Lebedyuk · Nov 13, 2016 go to post

1. Get list of all items in production (via Ens.Director:getProductionItems)

2. Iterate over items local array and for each item:

  • Get list of settings for an item (via Ens.Director:GetItemSettings)
  • Check if ReplyCodeActions is a setting for current item, if it is get it's value.
  • Write into any structure the pairs Item:ReplyCodeActionsValue

 

Structure can be anything you want:

  • Custom class
  • Dynamic object
  • %List
  • %ListOfDataTypes

That mainly depends on what do you want to do with this information later.

Eduard Lebedyuk · Nov 13, 2016 go to post

You can't just concatenate to a %Status:

set ^sghp1($i(ind))=st_"**"_Hospital_"**"_OrganizationInitials_"**"_Organization_"**"_obj.SourceConfigName_"!!!"_obj.AlertText_"!!!"_obj.AlertDestination_"!!!"_obj.AlertTime_"!!!"_obj.SessionId

You need to append a %Status to another %Status:

if $$$ISERR(st) {
   set msg = "**"_Hospital_"**"_OrganizationInitials_"**"_Organization_"**"_obj.SourceConfigName_"!!!"_obj.AlertText_"!!!"_obj.AlertDestination_"!!!"_obj.AlertTime_"!!!"_obj.SessionId
   set infost = $$$ERROR($$$GeneralError, msg)
   set st = $$$ADDSC(st, infost)
} 
set ^sghp1($i(ind)) = st

In this snippet first I check if the save was successful, if it was not I build additional error message, then convert it from %String to %Status and concatenate old and new statuses into one.

Eduard Lebedyuk · Nov 12, 2016 go to post

Via SQL:

SELECT Settings
FROM Ens_Config.Item
WHERE Settings [ 'ReplyCodeActions'

Documentation on [.

You can also get it without SQL:

To get production setting use one of:

Set Value = ##class(Ens.Director).GetCurrProductionSettingValue("SettingName", .sc)
Set Value = ##class(Ens.Director).GetProductionSettingValue("Production", "SettingName", .sc)

To get setting of production item use:

Set Value = ##class(Ens.Director).GetItemSettingValue("ItemName", Type, "SettingName", sc)

Where Type can be Host or Adaptor.

The ItemName argument may contain the following elements:

ProductionName||ConfigName|CommentOrClassname

Notes on ItemName:

  • Only the ConfigName portion is required.
  • If ProductionName is not given, then the currently running or last run Production will be used.
  • CommentOrClassname is the name shown in the Config page's dropdown list for multiple items having the same ConfigName. If it is not given, then if more than one item of the given ConfigName exists, all will match.
  • None of the names of the items in your production should contain the '|' character.

Documentation.

Eduard Lebedyuk · Nov 8, 2016 go to post

Go to web applications and set identical "Group By ID" identifiers for web applications that serve file1.CSP and file2.CSP.

Eduard Lebedyuk · Nov 8, 2016 go to post

Are there any callbacks on save methods defined?

Can you post class, instance of which you are saving?

Eduard Lebedyuk · Nov 4, 2016 go to post

Ceiling, floor, $NORMALIZE. Examples:

>Write $SYSTEM.SQL.CEILING(.1)
1
>Write $SYSTEM.SQL.CEILING(1.2)
2
>Write $SYSTEM.SQL.CEILING(1.7)
2
>Write $SYSTEM.SQL.FLOOR(.1)
0
>Write $SYSTEM.SQL.FLOOR(1.2)
1
>Write $SYSTEM.SQL.FLOOR(1.7)
1
>Write $NORMALIZE(.1, 0)
0
>Write $NORMALIZE(1.2, 0)
1
>Write $NORMALIZE(1.7, 0)
2
Eduard Lebedyuk · Nov 4, 2016 go to post

Docs on Ens.BusinessOperation class, QueueCountAlert property state:

Number of messages on this item's queue needed to trigger an Alert message to be sent. Note that no further alerts will be sent unless the number of messages on the queue drops below 80% of this number and then rises again to this number. Note that this alert will be sent even if AlertOnError is False. Zero means no alerts of this type will be sent.

Eduard Lebedyuk · Nov 4, 2016 go to post

Try to call it like this:

do ..ReportHttpStatusCode(..#HTTP400BADREQUEST, sc)

Where sc is an optional %Status. Parameters are defined in %CSP.REST class.

Eduard Lebedyuk · Nov 4, 2016 go to post

You can use %File class to create directories:

Write ##class(%File).CreateDeirectory(dir)
Write ##class(%File).CreateDeirectoryChain(dir)
Eduard Lebedyuk · Nov 2, 2016 go to post

Can you post code sample?

Going by the error message, have you tried providing googleapis.com  certificate?

Eduard Lebedyuk · Oct 31, 2016 go to post

This line causes an error:

Write tMessage.Name,!

Your class does not have Name property, so it causes an error.

The following method works :

/// Do ##class(Testing.Messages.Session).test()
ClassMethod test()
{
    Set messagedata = "<?xml version=""1.0"" encoding=""UTF-8""?><session><sessionId>124364</sessionId><cabinet>demo</cabinet><eventType>IN</eventType><eventTime>20161006160154</eventTime><login>test</login><loginFirstName>test</loginFirstName><loginLastName>test</loginLastName></session>"
    Set reader = ##class(%XML.Reader).%New()
    Set status = reader.OpenString(messagedata)
    Do reader.Rewind()

    If $$$ISERR(status) {do $System.Status.DisplayError(status)}

    // Associate a class name with the XML element name
    Do reader.CorrelateRoot("Testing.Messages.Session")

    // Read objects from xml data
    While (reader.Next(.tMessage,.status)) {
        Do:$$$ISERR(status) $System.Status.DisplayError(status)
        Write tMessage.sessionId,!
    }
}

Terminal:

USER >do ##class(Testing.Messages.Session).test()
124364
Eduard Lebedyuk · Oct 27, 2016 go to post

The correct way to accomplish that is to use source control and CI:

  • Developers push code into a central repository
  • CI system gets the code, tests it and deploys to the server
Eduard Lebedyuk · Oct 19, 2016 go to post

It would, because cache for that chunk would be invalidated, and cache for other chunks would still be valid. But OP wants to invalidate cache for a whole cube, and for that inserting one fact is not enough.

Eduard Lebedyuk · Oct 19, 2016 go to post

It would only invalidate one chunk (most probably first, but ultimately it depends on id) of cube data, not all of them.

Eduard Lebedyuk · Oct 18, 2016 go to post

Disclaimer. I am not familiar with EDI.

Some solutions would be:

  • Get official EDI 271 xsd schema files and import them into Caché
  • Alternatively you can read EDI 271 specification/check examples and write your own classes

Then you need a dtl to transform incoming message into your new classes. If there's a lot of them maybe it would be better to write one generic transformer or write a transformer generator based on class (which would generate transformation method based on class properties).

After that you  can transform your class object into json via several ways:

  • Old json via %ZEN.proxyObject/%ZEN.auxillary.jsonProvider
  • New json via dynamic objects
Eduard Lebedyuk · Oct 17, 2016 go to post

The caveat with relationships is that all of the many objects are loaded or none are. That may present a performance problem if you have a one-many relationship with thousands of rows on the many side.

Eduard Lebedyuk · Oct 17, 2016 go to post

Generally yes, but here's some thoughts:

  • Use List, instead of Array  whenever possible
  • Specify STORAGEDEFAULT as "array" to project list collection properties as child tables
Property Providers as List of ProviderList(SQLProjection = "table/column", STORAGEDEFAULT = "array");
Eduard Lebedyuk · Oct 17, 2016 go to post

The CALLIN^%ZSTART entry point gets executed when an external program begins or completes a callin. You can add logging there to see if something initiates callin.