Alexander,

Thank you for your response. I understand that get data method only needs to return the Y-Axis values. In my case they will be 0 if the system I monitor is down or 1 if the status is good. I envision I may calculate a Uptime % per time selected by user later. Actually very soon. I need to demo this today.

The values for x-Axis, Date/Time stamp when system status was checked, are supplied by a separate method.

Do you think it is good to try and store values for x and y-Axes in the same data array?

I will post another update soon after I get a chance to try it out.

Oliver

Hello,

I am trying Zen Report and Zen Page. I have Zen Page that displays a calendar to choose Date. I can display Zen Report inside iFrame when User clicks a button. It looks good EXCEPT my line graph shows no data values. I copy my Report class below. I hope someone will tell me what I am missing or what is wrong. This is my first Zen Report. Thanks

/// AETMON.Report
Class AETMON.Report Extends %ZEN.Report.reportPage
{

/// Class name of application this report belongs to.
Parameter APPLICATION;

/// Specifies the default display mode used for this report if
/// the URL parameter, <var>$MODE</var>, is not present.
Parameter DEFAULTMODE As STRING [ Constraint = ",html,tohtml,toxslfo,pdf,xml,xslfo,excel,toexcel,ps,pdfprint,xlsx,tiff,displayxlsx,fo2pdf,foandpdf", Flags = ENUM ] = "html";

/// This is the optional XML namespace used for the report.
Parameter REPORTXMLNAMESPACE;

Property Availability As %ZEN.Datatype.list(DELIMITER = ",");

Property AvaiDateTime As %ZEN.Datatype.list(DELIMITER = ",");

Property CreatedDate As %ZEN.Datatype.string(ZENURL = "CreatedDate");

/// This XML defines the logical contents of this report.
XData ReportDefinition [ XMLNamespace = "http://www.intersystems.com/zen/report/definition]
{
<report xmlns="http://www.intersystems.com/zen/report/definition"
 name="Report" 
 sql="SELECT ID, CreatedDate, CreatedTime, availabilityStatus FROM AETMON.AvailabilityLog WHERE CREATEDDATE=ORDER BY CreatedDate, CreatedTime">
<parameter expression='..CreatedDate'/>
<group name="CreatedDate" breakOnField="CreatedDate">
<attribute name="Date" field="CreatedDate" />
<group name="record">
<attribute name="id" field="ID" />
<attribute name="Time" field="CreatedTime" />
<attribute name="Status" field="availabilityStatus" />
</group>
<aggregate name="Count" type="SUM" field="availabilityStatus" />
</group>
</report>
}

/// This XML defines the display for this report.
/// This is used to generate the XSLT stylesheets for both HTML and XSL-FO.
XData ReportDisplay [ XMLNamespace = "http://www.intersystems.com/zen/report/display]
{
<report xmlns="http://www.intersystems.com/zen/report/display"
 name="Report" title="AET Availability Report">
<!-- Optional Init element inserts custom XSLT instructions at the top level of the generated XSLT stylesheet. -->
<init ></init>
<!-- Optional Document element specifies page layout and style characteristics. -->
<document width="8.5in" height="11in" marginLeft="1.25in" marginRight="1.25in" marginTop="1.0in" marginBottom="1.0in" ></document>
<!-- Optional Pageheader element. -->
<pageheader ></pageheader>
<!-- Optional Pagefooter element. Does not apply in HTML output. -->
<pagefooter ></pagefooter>
<!-- Required Body element. -->
<body>
<class="banner1">AET Availability Report</p>
<clineChart
ongetData="getchartdata"
title="Availability"
height="400px" width="400px"
markersVisible="true"
plotStyle="stroke-width: 1px;"
seriesYAxes="0"
ongetLabelX="getAxisTime"
>
<yAxis minValue="0" maxValue="1" />
</clineChart>
<group name="CreatedDate" line="1px">
<table orient="row" width="6in">
<item field="@Date" width="2in">
<caption value="Date:" width="2in"/>
</item>
<group name="record" line="1px">
<table orient="row" width="6in">
<item field="@Time" width="2in">
<caption value="Time:" width="2in"/>
</item>
<item field="@Status" >
<caption value="Status:"/>
</item>
</table>
</group>
</table>
</group>
</body>
</report>
}

Method getAxisTime(
val,
yseries)
{
Set tTime = $Piece(..AvaiDateTime,",",(val+1))
Quit $ZTime(tTime)
}

Method getchartdata(
ByRef var,
chart)
{
Do ##class(AETMON.Utility).DebugAETMON("AETMON.Report getchartdata")
Try {
Set sc = $System.Status.OK()
Set tTestDate = "08/06/2019"
Set pFrom = $ZDateH(tTestDate)
Set pTo = $ZDateH(tTestDate)
// Get a resultset containing Availability data
Set sc = ##class(AETMON.AvailabilityLog).GetAvailability(pFrom,pTo,.rs)
Quit:$System.Status.IsError(sc)
Set tCount = 0
While (rs.%Next()) {
Set var(tCount,0) = rs.%Get("availabilityStatus")
Set var(tCount,1) = rs.%Get("CreatedTime")
If $Increment(tCount)
}
}
Catch(ex) {
Set sc = ex.AsStatus()
}
Set tCreatedTimes = var(0,1) _ "," _ var(1,1)
Do ##class(AETMON.Utility).DebugAETMON("AETMON.Report getchartdata ..AvaiDateTime = "_tCreatedTimes)
Set ..AvaiDateTime = tCreatedTimes
Quit sc
}

}
 

I have added the Business Metric to my production monitor. It works good. However it only shows the most recent data for Availability. I need to be able to allow user to choose dates and times and show Availability status for the selected time period. I am able to run SQL query and show the data on a CSP page. However I am lacking the line graph. I tried to set up a cube but it is not working as expected.

My persistent data is very simple class:

AETMON.AvailabilityLog Extends (%Persistent, %XML.Adaptor)
{

Property CreatedDate As %Date;

Property CreatedTime As %Time;

Property availabilityStatus As %Boolean;

Storage Default
{
<Data name="AvailabilityLogDefaultData">
<Value name="1">
<Value>%%CLASSNAME</Value>
</Value>
<Value name="2">
<Value>CreatedDate</Value>
</Value>
<Value name="3">
<Value>CreatedTime</Value>
</Value>
<Value name="4">
<Value>availabilityStatus</Value>
</Value>
</Data>
<DataLocation>^AETMON.AvailabilityLogD</DataLocation>
<DefaultData>AvailabilityLogDefaultData</DefaultData>
<IdLocation>^AETMON.AvailabilityLogD</IdLocation>
<IndexLocation>^AETMON.AvailabilityLogI</IndexLocation>
<StreamLocation>^AETMON.AvailabilityLogS</StreamLocation>
<Type>%Library.CacheStorage</Type>
}

}
 

I have properties for Date, Time, and boolean Status. My cube produced the class below:

/// 
Class AETMON.Cube.Availability Extends %DeepSee.CubeDefinition [ DependsOn = AETMON.AvailabilityLog, ProcedureBlock ]
{

/// Cube definition from Architect.
XData Cube [ XMLNamespace = "http://www.intersystems.com/deepsee]
{
<cube xmlns="http://www.intersystems.com/deepseename="Availability" displayName="Availability" disabled="false" abstract="false" sourceClass="AETMON.AvailabilityLog" countMeasureName="%COUNT" bucketSize="8" bitmapChunkInMemory="false" precompute="0" disableListingGroups="false">
  <dimension name="availabilityStatus" displayName="Status" disabled="false" hasAll="false" allCaption="All availabilityStatus" allDisplayName="availabilityStatus" type="data" calendar="gregorian" iKnowType="entity" hidden="false" showHierarchies="default">
    <hierarchy name="H1" disabled="false" hidden="false">
      <level name="availabilityStatus" displayName="Status" disabled="false" sourceProperty="availabilityStatus" list="false" useDisplayValue="true" useAsFilter="true" hidden="false">
      </level>
    </hierarchy>
  </dimension>
</cube>
}

Parameter DOMAIN;

}
 

When I try DeepSee Analyzer, I just see Working..., but no Count

Evgeny,

Thank you for your comment. 

I am new to DeepSee and I do not know if I should created a cube for this. Or a Business Metric? Or just SQL Data??

Really I just need to show a report that can be printed or exported with start and end dates and times. I saw that Dashboards are easy to access from Management Portal compared to opening a DeepSee Report.

And I want to show a line graph.

Maybe a Zen report which I have not really done yet either.

I am not sure what to do ???

I am working on DTL to transform X12 HIPAA_5010:278Review into HIPAA_5010:278Response.

My challenges are I do not know an elegant way to create multiple 2000E loops in the target. The source can have only one loop 2000E, I need to create as many 2000E loops as I find authorizations.

On top of that, I may need to create possibly hundreds of 2000F loops under one or more 2000E loops. The source may have zero or many 2000F loops.

The scenario I have been working on has zero 2000F loops and I need to create about 600 2000F loops in the target. Any guidance will be appreciated. I am not sure if subtransform will work because I can only create a Document or a Segment, not a Loop in a transformation.

Since I do not know how to create a new segment and then append to my target, I set x = target.OutputToString() and then append segments to my string as in Set x=x_"HL*5*4*0~...." and x=x_"SE*...~" and then set target=##class(EnsLib.EDI.X12.Document).ImportFromString(x).

I feel there should be a better way than doing string manipulation using Document Map etc.

Hello Sean,

Thank you for your response.

We attempted a different approach yesterday using XML Adapter in our persistent class and routing the message to an SQL Outbound Adapter. We were able to insert data into our table. However we see errors logged in our SQL Operation (Business Operation):

ERROR <Ens>ErrRequestNotHandled: Request message '13@Test.SubscriberX' not handled

Do you know what we need to do to avoid getting these errors?

Thank you