Heloisa Ramalho · Jun 29, 2022 go to post

A multidimensional property is an array.  You should use the "Merge" command to set it, instead of the "Set" command, like in Eduard's example.

Heloisa Ramalho · Jun 17, 2022 go to post

I meant a custom utility function, not a custom process.  It would be a class derived from Ens.Rule.FunctionSet.

An Ensemble rule expression must be constructed using + - * / Max Min etc.  That does not include the ability to use a generic ObjectScript expression.

You can add your own custom function, and inside it, you can use any ObjectScript expression that does what you want.  If you define a parameter in a class, you could make it a COSEXPRESSION; this parameter might be used by your custom function to obtain the value at run time and return it to your rule.

An alternative is to set a property in your BPL context object and simply use it in the rule. 

Have you browsed the sample rules provided in ENSDEMO?  There are some interesting examples of what you can do.

Heloisa

Heloisa Ramalho · May 16, 2022 go to post

You could invoke curl using $zf(-100), where you'd make the call redirecting the response to a file.  After the call completes, you can read the contents of the file into a string or stream.

Heloisa Ramalho · May 11, 2022 go to post

You can use the built-in classes %Net.SMTP and %Net.MailMessage.

Basically you need to instantiate an object of these classes, set properties for them, and invoke the Send() method of %Net.SMTP.  Let us know if that is not what you are asking, or if you need more information.

Heloisa Ramalho · Nov 5, 2021 go to post

I think that the reasoning for having two similar functions $next and $order is that $next returns -1 when no next subscript is found, preserving compatibility with the original applications, whereas $order returns "" when no next subscript is found, besides additional functionality of course.

Heloisa Ramalho · Aug 25, 2021 go to post

Hi.  Without seeing the source code for your production, I would guess that there is an item in your Production for which the associated class does not exist.  When the Production starts, Ens.Director obtains information from for the classes involved, in order to create the jobs and message queues, among other things.

If you can't spot the problematic item from the log, I suggest that you disable all items and begin re-enabling one at a time, and seeing which item is the source for the error.

Hope it helps,

Heloisa

Heloisa Ramalho · Jul 7, 2021 go to post

Getting the value of a global node should not be a problem, but you need to figure out the proper quoting for the string values.  You might as well create a class method in a location that makes sense, and reference the global from there, in case the syntax becomes easier to manage.

Heloisa Ramalho · Apr 26, 2021 go to post

The O.S. process associated with the terminal was still running, in READ state, unaware that the terminal had disconnected.  Once we found it and terminated it (we used the System Management Portal for that), the transaction was properly rolled back.

Heloisa Ramalho · Aug 26, 2019 go to post

You might consider using  OnBeforeProductionStart() instead of  OnAfterProductionStart() when you want to change settings.

Heloisa Ramalho · Feb 4, 2019 go to post

Hello.

Ens.Config.Production objects are created when you compile your Production.  

Your Production must be in a class that extends Ens.Production and you must have imported it into your target namespace and compiled it there.

As others mentioned, if you export and deploy it, these steps should happen.

Hope this helps,

Heloisa

Heloisa Ramalho · Sep 4, 2018 go to post

Hello.

Whilst your application would work with the Caché private web server, please be aware that it is not recommended for production, only for development and testing as well as serving the internal portal. It does not have all the features as a full apache web server; for instance, it does not support https.

Heloisa

Heloisa Ramalho · Jul 11, 2018 go to post

Hello.  Here is a suggestion of what you could do. Please note I did not actually try it, so this still needs extra work, but hopefully will help you move forward.

In your helper class, add code to your OnBankMsg() method to index  messages:

ClassMethod OnBankMsg(pHeader As Ens.Enterprise.MsgBank.MessageHeader, pFullHeaderID As %String, pBody As %RegisteredObject = "", pFullBodyID As %String, pService As Ens.Enterprise.MsgBank.TCPService) As %Status
{
 If (pHeader.ClientBodyClassName="mypackage.mymessageclass") {
  Set pStream = ##class(%Stream.GlobalCharacter).%OpenId(pHeader.MessageBodyId)
  Do ##class(mypackage.mysearchtableclass).IndexDoc(pStream)
}
 Quit $$$OK
}

}
 

Where your search table class mypackage.mysearchtableclass would look like:

Class mypackage.mysearchtableclass Extends Ens.CustomSearchTable
{

Property myproperty As ...

ClassMethod OnIndexDoc(pDocObj As %Persistent, pSearchTable As mypackage.mysearchtableclass) As %Status
{
 // Set the properties
 Set pSearchTable.myproperty = ... // extract the information you want to index
 Quit $$$OK
}

}

This is only a sketch, hope it helps,

Heloisa

Heloisa Ramalho · May 30, 2018 go to post

It can be caused if there is an error.  That would cause the job to terminate, if not intercepted.  In case you haven't done so, you could try adding error interception and logging, so you can check the error logging when a dead job appears, to see if that was the cause. 

Hope it helps,

Heloisa

Heloisa Ramalho · Jan 23, 2018 go to post

Have you tried using the numeric form?  They are ≤ and ≥ for these characters.

Let us know if it works.

Heloisa

Heloisa Ramalho · Sep 7, 2017 go to post

Hi Nagel,

You can add a timer to the page and when the timer fires, refresh the tablePane with  table.refreshContents() where 'table' is the table object. You may also want to clear the selection if any.

Heloisa

Heloisa Ramalho · May 23, 2017 go to post

I have used %UnitTest.TestProduction to automate Ensemble testing. It can start a Production, adjust settings, etc. The class documentation contains explanations. Unfortunately I am not familiar with Selenium so cannot answer about that tool.

Heloisa Ramalho · May 8, 2017 go to post

The way I see it working in 2017.1, %OverrideGuidAssignment only sets the in-memory value of the object's GUID to the value passed as the argument and returns the same value.  It does not validate the value.   If the object already has a GUID, it will not be changed.  New objects for which the user did not provide a GUID will have one assigned with $system.Util.CreateGUID() unless the user invoked %OverrideGuidAssignment(userGUID) before saving.

In order to know if the intended assignment was successful, you must compare it with the object's GUID after save to see if the assignment was successful or not.  If they are different, then it was not overridden, probably because it was not a new object.