Hi Luca,

Will there any academic sessions at global summit with Docker ?
I think it should be, it will be very helpful, to understand how it works with Cache, how possible to deploy applications. I like docker, and think about it, but still do not understand how it can be used with our applications, and how to make container for it, and connect to Cache's container.

I'm very agree, with advertising stackoverflow tags, it is a very good platform for questions. But unfortunately just a few people use it, some more at different google groups , and as I think much more at russian forum sql.ru.  But I see that stackoverflow, much better that any others. Unfortunately here as we already know, it is quite difficult to  recognize a question in new posts. And very bad that this site still does not have any RSS, i can't wait when it happen. And too difficult to catch any new posts via email subscriptions, which is so ugly yet.


You mentioned tag objectscript at stackoverflow, but I don't understand why so many people choose it as relevant to intersystems technologies. It does not, it looks odd, even every last question marked with this tag, depends only with caché. And it looks we should change description for this tag, which will be relevant to Caché. 

Is it your account on github ?

Looks like you already know how to create repository and work with github.

Just create another repository,  and create some readme (in english), license file. Most of projects on InterSystems technologies uses MIT license.

In your porject more then one class, so better to export each file separately. Easy to do it with Studio hooks, for example with this project. It can help to export project files automaticaly after compile.

And then after publish your project, Evgeny or somebody else who manage intersystems account, will fork it.

I guess that you writing an function for rule.  And your class where you do it extends  Ens.Util.FunctionSet  where Lookup is located. Lookup is a method and you should call it as a method, now it is as variable.

 
/// Returns the participant code based on MSH-4
ClassMethod getParticipant(iSendingFacility As %String) As %String [ Final ]
{
   set = $PIECE(iSendingFacility,"^",1)
   set = $PIECE(iSendingFacility,"^",2)
   set sc1 = ..Lookup("ParticipantCodeMap",a)
   if sc1 = "" {
      set sc1 = ..Lookup("ParticipantCodeMap",b)
   }
   sc1
}
 

And if you want to call it by terminal, it should be so:

 write ##class(Ens.Util.FunctionSet).Lookup("ParticipantCodeMap","1083601330")

Well, with this example, I just changed that block, which works for all rest pages in a group except the first one.

<masterreference masterReference="rest" pagePosition="rest">
<document width="8.5in" height="11in" marginLeft="1.25in" 
marginRight="1.25in" marginTop="1.0in" 
marginBottom="1.0in" headerHeight="1.0in">
</document>
<pageheader>
<table orient="col" layout="fixed" width="6in">
<item style="text-align:left" value="Sales Report" />
<item field="@name" width="2in"></item>
<item style="text-align:right" special="page-number-of-with-xpath" field="@name" />
</table>

</pageheader>
</masterreference>
 

And it shows Sale rep in a header where page counter was shown before, for example

Sales Report Jack 2 of 5

Sales Report Jen 3 of 5

You can see my result here. A changed only first section.

Hi Steve, are you have seen class  ZENReports.PageLayouts in SAMPLES namespace? It shows a lot possiblities for ZEN Reports. Page headers as well. And with sample is not so difficult to make a groupped report with a value on ech page at header.  For more control on page header in reports, you should look at page  pagemaster masterreference pageheader

Templates in ZEN, is a quite simple as I think. When you doing template page just add <pane paneName="MainContent"/>. And then in a children, you should add XData with the same name "MainContent", which starting with tag <pane>.

XData MainContent
{
<pane xmlns="http://www.intersystems.com/zen">
</pane>
}
 

You should not rewrite Contects XData in children pages, and such subpanes could in the same class, or in children. 

In this case, in a table you just add a new column with link 

<column header="" width="5%" linkCaption="view" link="ZenTutorial.ViewContact.cls?ID=#(%query.ID)#"/>

so, now, we got an contact's ID in every row.

and then in a ViewContact page, we should add a dataController, to our Model, and define an modelId, from url

<dataController id="contactData" 
                modelClass="ZenTutorial.ContactModel"
                 modelId="#(%url.ID)#" />

You can set modelId with URI Parameters as weel, after adding a property:

Property ContactID As %ZEN.Datatype.integer(ZENURL = "ID");

and new modelId, which now uses our new Property 

modelId="#(%page.ContactID)#"


and finally form, wich connected with previously added controllerId, and it shows two fields, read only, yet. But it is not so diffucult to add editng.

<form id="MyForm" layout="vertical" controllerId="contactData">
  <text label="ID:" id="ID" name="ID" 
    dataBinding="%id" size="5"
    readOnly="true"/>

  <text label="Name:" id="Name" name="Name" 
    dataBinding="Name" size="30"
    labelClass="required" required="true"/>
</form>
 

It is just a simple working example. But for reali life, it could be in some class. And flexible it will be with good UI, storage anyway for such task is quite simple. How well will be your UI, for organize that tree, so flexible it will be. Here is an example of complete UI, for creatingand running Decision trees. I think you could try to connect this project with Cache. And I think it is possible to find more web-libraries, which could help you.

start() public {
  do init()

  set result=$$ask(0)
  write !!,"Result: ",result 
}
init() {
  kill ^DECISIONTREE
  set ^DECISIONTREE(0)="Smoker"
  set ^DECISIONTREE(0,"Yes")=1
  set ^DECISIONTREE(0,"No")=2

  #; Smoker -> Yes
  set ^DECISIONTREE(1)="Age"
  set ^DECISIONTREE(1,"<30")=3
  set ^DECISIONTREE(1,">30")=4

  #; Smoker -> No
  set ^DECISIONTREE(2)="Diet"
  set ^DECISIONTREE(2,"Good")=3
  set ^DECISIONTREE(2,"Poor")=4

  #; Smoker -> Yes|Age -> <30
  set ^DECISIONTREE(3)="Less risk"

  #; Smoker -> Yes|Age -> >30
  set ^DECISIONTREE(4)="More risk"

  #; Smoker -> No|Diet -> Good
  set ^DECISIONTREE(5)="Less risk"

  #; Smoker -> No|Diet -> Poor
  set ^DECISIONTREE(6)="More risk"
}
ask(id) {
  set text=(^DECISIONTREE(id))
  quit:$data(^DECISIONTREE(id))=1 text
  
  write !,text
  set answer=""
  for i=1:1 {
    set answer=$order(^DECISIONTREE(id,answer),1,nextId)
    quit:answer=""
    set answer(i)=nextId
    write !,$justify(i,3),") ",answer
  }
  set nextId=$$read(.answer)
  quit:nextId="" "" 
  quit $$ask(nextId)
}
read(&answers) {
  write !
  do {
    write $char(13),"Option? "
    read res#1
    quit:$zconvert(res,"L")="q"
  while (res="")||('$data(answers(res)))
  
  write !
  
  quit $get(answers(res))
}

 

USER>d start^tree()
 
Smoker
  1) No
  2) Yes
Option? 2
 
Age
  1) <30
  2) >30
Option? 1
 
 
Result: Less risk