Steve Pisani · Sep 18, 2017 go to post

Hi Ahncel,

To help... - If not already enabled; enable security auditing via the system management portal's "System Administration > Security > Auditing > View Audit Database",  and look at this audit log after generating the error.

It will shed some more light on the user in question, or service, or whatever - may be causing this issue.

Steve

Steve Pisani · Aug 17, 2017 go to post

John is absolutely right.

You cannot set this value.  In fact, I should have said in my earlier post that the advertised (documented) maximum number of connections per License Unit is and always has been only 12.

The fact it is 25, is somewhat common knowledge and is a sort of grace limit, however I always tell my customers that you should work on the assumption that InterSystems could eventually enforce the advertised number of 12. If this happens it should not come as a shock to anyone.

12 connections from a user interacting with Cache, coming in from the same address, should be ample.

Steve

Steve Pisani · Aug 17, 2017 go to post

Hi,

The code below returns the maximum number of connections a user can make while consuming one license unit.

Write ##class(%SYSTEM.License).MaxConnections()

It is a global setting, and, it is not related to the License Unit Authorized value.  That value is how many license units (not connections per unit), you can take out.

sincerely,

Steve

Steve Pisani · Jul 12, 2017 go to post

Hi Carey,

As you probably realised, the intention of the business rule (and rule sets within a rules class) is to typically have 1 sets of rules that are applied to a message, but for which you could have multiple versions, based on an effective date/time period.  That is:  if the date is X run rules set# 1, but if the date is Y run rule set#  2.  

If date ranges overlap, than, whichever is the first valid date range in the order in which the rules sets are arranged, defines which set of rules is executed. This is important to remember for later...

You can create 'Rule Set #2' ahead of time, making sure that the effectiveBegin of rule set #2, is immediately after the effectiveEnd of rule set #1 (as you indicated you wanted).

However, the second rule set would need be essentially, a copy of the first set - except for the changes to an individual rule item(s) that you want a different behavior for.  

Admittedly, cloning a whole rule set to another copy is labor intensive via the UI, but, extremely easy if you open the generated class in Studio - as you can just copy/paste the XML elements between the <ruleSet> tags,  save and re-compile. After you have your second set,  make your edits to rule set 2's effective date range, and whatever rule changes needed.

The Delegate action sends the message to another rule definition altogether, and, the Send sends the message to any other business component, (which can be a routing rule).   Using these two actions, based on any condition regardless, would require you to build a new rule definition or component to act as their target which you said you did not want to do, so, they are out.

Now - What you *can* do is write a user defined function to retrieve a rule definition's second rule set date range, and, use the value from this function in a conditional statement that drives the behavior of any of your first rule set's rule items.  You must ensure that Rule Set #1, however, is always the one that ever gets executed and the system does not ever fall on to running rule set #2 - so - even though you put in  a date range for rule set #2, leave date ranges for rule set #1 blank or wide open, so it will be the first and only one that will qualify for execution every time. 

Warning: This is not standard use or best practice, and I'm not recommending you do this - as it will effectively negate the rules sets with effective periods feature. which in the future, you may want to use.   I would stick with the approach of cloning Rule Set 1 into Rule Set 2, setting an appropriate EffectiveStart/end ahead of time, and making the individual changes you need to take effect in the future. 

Steve

Steve Pisani · Jun 9, 2017 go to post

..and I must add... 'No' - it is not used to establish a connection without authentication. For that, the connection method would need to be specifically defined to allow unauthenticated access, and that needs to be done from within Cache.

Steve

Steve Pisani · Jun 9, 2017 go to post

Hi,

There are a number of reasons for it.  

One that comes to mind, for example, is if your user accounts expire, (also perhaps, if you just forgot passwords, or there is some other user authentication issue) -  you will not be able to get into Cache to extend the expiry date, effectively - you will be locked out.

Starting Cache in Emergency Access Mode will allow you to specify a one-time, single-use account you can use to log into Cache, then into security settings, and, re-enable those account that should no longer be disabled.

You can then restart Cache with emergency access and you will be able to access Cache again using your newly re-enabled user accounts.

Steve

Steve Pisani · Jun 7, 2017 go to post

Thank you for all the replies.

I'll take all comments on board, and attempt to set this up myself.

Steve

Steve Pisani · Jun 6, 2017 go to post

Hi,

is it possible to get a recording or slide deck from this webinar ?

Thanks  - Steve

Steve Pisani · May 31, 2017 go to post

Hi,

Upcoming 'Show Inherited' feature will definitely be welcome - thanks, and, using ctrl+space to invoke intellisense to get a list of options for class elements such as: indices, properties, methods, XData elements, Foreign Keys, Projections and Queries  does cover a lot of what is apparently missing..

I have not - however, been able to use the ctrl+<space> to list out options for Parameter of a class.

I have not managed to get Atelier to show me the parameters of a property type, (like MAXLEN, etc)

Property Title As %String (MAXLEN = 50, POPSPEC = "Title()") 

This is available in Studio's Inspector window, and is very handy to have: both as users are starting out and can't remember exactly the name of a given property's parameters (VALUELIST, DISPLAYLIST, MAXLEN, etc...), but even and more so I guess, when using custom property types. 

I couldn't find a way of bringing these up.

thanks - 

Steve

Steve Pisani · May 29, 2017 go to post

Hi Vitaliy,

Can you please elaborate ?  Are you saying that Atelier does this already, and if so - what version are you using and how do I get to view this information ?

Thanks

Steve

Steve Pisani · Mar 23, 2017 go to post

Hi Ryan,

The message that you pass to your SOAP-based business operation should (as you indicated in your 3rd bullet point), contain both the extracted HL7 data, and the authorization key you retrieved from the previous step.

I'm assuming your SOAP Business operation you are using in the last step has been automatically generated by the Studio wizards, so, you will have a Class Method for each web method of your SOAP service.

You need to edit the default generated versions of these methods the wizard gives you, in order to add your SOAP Header.

You can access   ..Adapter.%Client in this business operation to get access to the private instance of the web service client class, so, using

   Do ..Adapter.%Client.HeadersOut.SetAt(...)

You can set the headers for that particular message invocation.

Sincerely - Steve

Steve Pisani · Jan 22, 2017 go to post

I needed version 6 (not 7) of NodeJS and had to run

npm install -global --production windows-build-tools

...From an elevated powershell or DOS prompt (running as administrator), to get the UI installed.

Steve

Steve Pisani · Jan 19, 2017 go to post

I too am having a problem installing this.

I'm using the "source installation" instructions.

Can someone verify please what are the true list of prequisites needed (other than Cache 2016.1) for this.  Please make no assumptions that node.js, or, Python, of any version, is already installed on the target server..

Thanks - Steve

Steve Pisani · Jan 18, 2017 go to post

Hi,

I'm wondering... Is it possible to have a single dashboard that represents metrics from multiple Cache instances  - for example, if I have 3 Cache instances installed on separate servers , and I want to see on a single dashboard, then % license usage graphs from each instance, represented in separate widgets.

Steve

Steve Pisani · Oct 27, 2016 go to post

Hi Mike

Have you tried setting up a Credentials  record with username and password pair in Ensemble  (Configure>Credentials) - then specifying the credentials name in Settings for the Ensemble u business operation ?

This has worked for me before for Web services that require basic authentication.

Steve

Steve Pisani · Oct 27, 2016 go to post

Hi Mike. 

Have you already tried setting up  a Credentials record (with username and password paid via Ensemble > Configure > Credentials), and then specifying the credentials record which will be a setting in the Ensemble business operation ?

This has worked form me before with Web services that require basic authentication.

Regards

Steve

Steve Pisani · Oct 27, 2016 go to post

Hi Mike. 

Have you already tried setting up  a Credentials record (with username and password paid via Ensemble > Configure > Credentials), and then specifying the credentials record which will be a setting in the Ensemble business operation ?

This has worked form me before with Web services that require basic authentication.

Regards

Steve

Steve Pisani · Oct 5, 2016 go to post

Hi David

Defining the SQL Gateway connection is only one part of the problem solved.

Once you have ano SQL gateway defined, you can then create 'proxy' classes in Cache that  know something about, and represent the tables in the remote database system.

With these proxy classes on hand, you can then use them to query and update data as you would with any other persistant Cache vlass yout have.

Steve Pisani · Sep 20, 2016 go to post

Hi Lutz - 

I'm assuming you have a small typo above and you intended to use "$ZF" not "$F"

Steve

Steve Pisani · Sep 2, 2016 go to post

Thanks Bernd,

I see that onkeypress works- just as I expected it to firing onevent(). you're right.-

But - I was trying to capture onkeyup - which does not get fired into the onevent().

For onkeyup, and probably other events, we need to implement this manually. We would need to resolve the element id of the layout object, then, register an event listener for the event occurring on that element  - which when fired, would invoke onevent() in the template class.    (as per Steve Whitemen's next post)

thanks - 

Steve Pisani · Aug 31, 2016 go to post

Thanks Bernd.

My issue is actually managing to get the onevent() method in the template class to be fired at all.  

I'm currently trying to determine what code is required to register onKeyUp() events to be captured for specific layout objects -  that would result in the onevent() in my template class gets invoked (with the evt, key, value and docViewId arguments passed).

Have you use the onevent method callback in the template class ?

Steve

Steve Pisani · Aug 26, 2016 go to post

Hi Stefan,

I guess that's not how it is described under 'Event Handling' here:  http://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY…  which incorrectly implies that that Zen Mojo will call onevent for anything other than onselect or onchange.  

So: in my ZENPage, I've overridden onkeydownhandler(evt), and I intend to call the onevent() method in my template class, which will have all the logic for all the events other than onsearch and onclick.

The zenPage onkeyuphandler gives me evt, which I can use to get the HTML DOM id of the component that raised the event.  (id=evt.srcElement .id).

How do I go about finding the layout object's  key attribute, given the DOM id ?

Steve

Steve Pisani · Jul 1, 2016 go to post

Hi.

I have made a correction to the post, and associated sample code, to indicate the correct way that long-handed versions of custom commands, functions and variables need to developed.  Code that is implemented as a function with arguments needs to explicitly invoke the short-hand logic, or the functionality will not get invoked when using the long-handed command.

Thanks

Steve

Steve Pisani · Jun 27, 2016 go to post

excellent - thanks !...

But what about collections, say, a property 'b' that is a collection (with b1, and b2 keys)

>set objFromJSON = {}.$fromJSON("{""a"":""1"",""b"":[{""b1"":""x""},{""b2"":""y""}]}")
>write objFromJSON.a
1
>write objFromJSON.b
24@%Library.Array

>set arr=objFromJSON.b

 

I can only get to each item in 'b' by instantiating an iterator (using arr.$getIterator()), and looping through the list with the $getNext() method of the resulting iterator.   I can remove, get the last, add to the end and set an item in the collection.

I'm assuming there is no concept of getting the item #1 from the collection - using '1' as the key, indicating the first in the collection, or getting #2, indicating the second item - something like

set bObject=arr[1] or  set bObject=arr.GetAt(1) or bObject=arr.Get(1) ?

Steve

Steve Pisani · Jun 24, 2016 go to post

Hi,

Using the new JSON support, is it possible to create a dynamic object from a JSON string, (eg objFromJSON) that will then allow  for objFromJSON.<property>  syntax on the dynamic object  to access properties in the JSON string.

Steve