Clear filter
Announcement
Uwe Hering · May 19, 2018
Hi all,
Anyone who is planning to attend CEBIT 2018 in Hannover should make sure to join us on June 13 from 2pm to 5pm for a technical deep-dive into our new InterSystems IRIS Data Platform™ technology.
We will explore how InterSystems IRIS paves the way for innovation by supporting open analytics, sharding, docker and cloud deployments, to name but a few. Expect an interactive learning experience with insightful presentations and live demos.
To register, simply send an email to marie-laure.kinkel@intersystems.com. The event is free of charge, but has only a limited number of seats available, so make sure to sign up NOW! We will also provide you with a FREE CEBIT ticket upon registration.
What’s more, you will also get the chance to delve into InterSystems IRIS yourself: Sit down in our Sandbox area at stand C49 in hall 13 and take InterSystems IRIS to the test.
See and discuss the agenda below.
Session I – Data-driven Business Models
Session II – InterSystems IRIS Technical Deep-dive
View the original agenda of the event in German here.
We look forward to welcoming you in Hannover!
Sincerely,InterSystems CEBIT Team
Article
Gevorg Arutiunian · Jul 6, 2018

[GraphQL](http://graphql.org/) is a standard for declaring data structures and methods of data access that serves as a middleware layer between the client and the server. If you’ve never heard about GraphQL, here is a couple of useful online resources: [here](https://medium.freecodecamp.org/so-whats-this-graphql-thing-i-keep-hearing-about-baf4d36c20cf), [here](https://blog.apollographql.com/graphql-vs-rest-5d425123e34b) and [here](https://blog.apollographql.com/the-anatomy-of-a-graphql-query-6dffa9e9e747).
In this article, I will tell you how you can use GraphQL in your projects based on InterSystems technologies.
InterSystems platforms currently support several methods of creating client/server applications:
- REST
- WebSocket
- SOAP
So what’s the advantage of GraphQL? What benefits does it provide compared with REST, for example?
GraphQL has several types of requests:
- **query** - server requests for obtaining data, similar to GET requests recommended for fetching data using REST.
- **mutation** - this type is responsible for server-side data changes, similar to POST (PUT, DELETE) requests in REST.
Both mutation and query can return data – this comes in handy if you want to request updated data from the server immediately after performing a mutation.
- **subscriptions** - the same query type that will output data. The only difference is that a query is launched by a page rendered on the client side while subscriptions are activated by mutations.
## Key features and advantages of GraphQL
### It’s up to the client to decide what data should be returned
One of the key features of GraphQL is that the structure and volume of returned data are defined by the client application. The client application specifies what data it wants to receive using a declarative, graph-like structure that closely resembles the JSON format. The response structure corresponds to that of the query.
Here is how a simple GraphQL query looks:
```json
{
Sample_Company {
Name
}
}
```
A response in the JSON format:
```json
{
"data": {
"Sample_Company": [
{
"Name": "CompuSoft Associates"
},
{
"Name": "SynerTel Associates"
},
{
"Name": "RoboGlomerate Media Inc."
},
{
"Name": "QuantaTron Partners"
}
]
}
}
```
### Single endpoint
When using GraphQL to work with data, we always connect to a single **endpoint**, GQL server, and get different data by changing the structure, fields, and parameters of our queries. REST, in contrast, uses multiple endpoints.
Let’s compare REST with GraphQL using a simple example:

Let’s assume that we need to load a user’s content. If we are using REST, we need to send three queries to the server:
1. Get the user’s data by their id
2. Use their id to load their posts
3. Use their id to get a list of their followers/subscribers
Below is a REST map corresponding to these queries:
```
```
In order to get a new data set, we will need to update this REST map with a new endpoint.
GraphQL handles this with a single query. To do that, just specify the following in the request body:
```
{
operationName: null, //a query can have a name ( query TestName(...){...} )
query: "query {
User(id: "ertg439frjw") {
name
posts {
title
}
followers(last: 3) {
name
}
}
}",
variables: null // initialization of the variables used in the query
}
```
A REST map corresponding to this query:
```
```
Note that this is the only endpoint on the server.
## Installing GraphQL and GraphiQL
In order to start using GraphQL, you need to complete a few steps:
1. Download the [latest release](https://github.com/intersystems-ru/GraphQL/releases) from GitHub and import it to the necessary namespace
2. Go to the system management portal and create a new web application based on your InterSystems Data Platform product (Caché, Ensemble or IRIS):
- Name - **/**
- Namespace - **for example, SAMPLES**
- Handler class - **GraphQL.REST.Main**
3. GraphiQL — a shell for testing GraphQL queries. Download the [latest build](https://github.com/intersystems-ru/GraphQL/releases) or [build](https://github.com/graphql/graphiql) from the source on your own.
4. Create a new web application:
- Name - **/graphiql**
- Namespace - **for example, SAMPLES**
- Physical path to CSP files - **C:\InterSystems\GraphiQL\**
## Let’s take a look at the result
Go to the following link in your browser **http://localhost:57772/graphiql/index.html** (localhost — server, 57772 — port)

I hope everything is clear with the **Query** and **Response** namespaces. A **Schema** is a document that is generated for all stored classes in a namespace.
The schema contains:
- Classes
- Properties, arguments, and their types
- Descriptions of all of the above generated from comments
Let’s take a closer look at a schema for the **Sample_Company** class:

GraphiQL also supports automatic code completion that can be activated by pressing the **Ctrl + Space** key combination:

## Queries
Queries can be simple and complex for several sets of data. Below is a sample query for data from to different classes, **Sample_Person** and **Sample_Company**:

## Filtering
At the moment, only strict equality is supported:

## Pagination
Pagination is supported through 4 functions that can be combined to achieve the necessary result:
- **after: n** – all records with id greater than n
- **before: n** – all records with id smaller than n
- **first: n** – first n records
- **last: n** – last n records

## Visibility areas
In most situations, the business logic of an application dictates that particular clients only have access to particular namespace classes (role-based permissions). Based on that, you may need to limit class visibility for a client:
- All classes in the namespace (**GraphQL.Scope.All**)
- Classes inherited from a superclass (**GraphQL.Scope.Superclass**)
- Classes belonging to a particular package (**GraphQL.Scope.Package**)
In order to change the method of visibility restriction, open the studio, switch to the necessary namespace, and open the **GraphQL.Settings** class. It has a **SCOPECLASS** parameter with the default value of **GraphQL.Scope.All** — this is the class containing the description of the class visibility interface in the namespace:

To change class visibility restrictions, you need to set one of the values provided above: **GraphQL.Scope.Package** or **GraphQL.Scope.Superclass**.
If you picked **GraphQL.Scope.Package**, you will also need to go to that class and change the value of the **Package** parameter to the name of the necessary package – for instance, **Sample**. This will make all the stored classes from this package fully available:

If you picked **GraphQL.Scope.Superclass**, simply inherit from this class once again in the necessary classes::

## Currently supported
Queries:
- Basic
- Embedded objects
- Only many to one relation
- List of simple types
- List of objects
## Currently under development
Queries:
- Embedded objects
- Support of relations of all types
- Filtering
- Support of inequalities
## Plans
- Mutaions
- [Aliases](https://graphql.github.io/learn/queries/#aliases)
- [Directives](https://graphql.github.io/learn/queries/#directives)
- [Fragments ](https://graphql.github.io/learn/queries/#fragments)
→ [Link ](https://github.com/intersystems-community/GraphQL) to the project repository
→ [Link ](http://37.139.6.217:57773/graphiql/index.html) to the demo server
Issues Pull Requests are very welcome.
Keep an eye on our project updates!
Just for the record, GraphQL access to Cache has been supported in EWD.js and EWD 3 (the fore-runners to QEWD.js) since 2015:https://groups.google.com/forum/#!searchin/enterprise-web-developer-community/graphql%7Csort:date/enterprise-web-developer-community/okC6T2W-Sfk/UomKqSrwBQAJhttps://groups.google.com/forum/#!searchin/enterprise-web-developer-community/graphql%7Csort:date/enterprise-web-developer-community/aO1-9mE1FOE/ebdUS8ZbBAAJ And, any stats, Rob? Is it the most popular API in EWD and EWD3? And why it is not supported in QEWD? As I release my code as Open Source, I've no idea of usage stats. There's growing interest in the use of GraphQL in the community I work within these days, for all sorts of reasons.QEWD is a re-badging of EWD 3, so yes, it is supported in QEWD - which of course is straightforward since QEWD is JavaScript/Node.js and can just use the Facebook JavaScript GraphQL module.Just making the point that GraphQL and support for it in Cache isn't something new, as those who follow our work at M/Gateway will know :-)Rob Actually I'm impressed how quickly you guys introduce in QEWD new trendy approaches for development. Though there is a difference here: what @Arutunyan.Gevorg published supports Caché Objects and I doubt if QEWD does. Is there any Caché Objects support/mapping in QEWD? QEWD supports Cache Objects for those who wish to use them via the cache.node APIs for Cache Objects.:https://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=BXJS_objectsYour handler logic (which runs in a QEWD Worker process) has access to these APIs via the "this.db" object, eg this.db.invoke_classmethod()The following post is a bit old and refers to how you used these APIs in EWD.js. However, change the invocation to this.db.xxx() and the examples should work in QEWD:https://groups.google.com/forum/#!searchin/enterprise-web-developer-community/invoke_classmethod%7Csort:date/enterprise-web-developer-community/iVR-z_Lxs9I/PPS26Lp5RskJPersonally I prefer to use the Cache database as a persistent JSON database / Document Database, via the ewd-document-store abstraction that is used by QEWD, and integrate that storage into JavaScript Objects. But Cache Objects will work with QEWD and GraphQL just fineRob Hi Rob,I have searched and read through all training materials only for this answer. Probably, it is a good idea to have a separate slide which shows how QEWD can make use of cache object scripts from the handler methods with examples.This may be useful for:1. Applications written in Cache object scripts over the years with business logic that is not easy to change in few years of development.2. Applications using a middle layer and they want to replace it with QEWD to make use of micro-service architecture.3. New development mainly focusing on back-end logic in Cache database with object oriented programming.4. And of course, to make use of QEWD while enjoying the Cache object oriented programming style rather than using it as a document store (I think Cache is not mainly used for document store, but because of its value added features and strengths). Also, to adopt QEWD in Cache based ERP applications, integration of QEWD with Cahce object script is vital.Any training materials, slides or GitHub source with working examples to use QEWD and cache object scripts is highly recommended.Thanks,Jose After import an error occurred as below.---------------------------Studio---------------------------ERROR #6301: SAX XML Parser Error: invalid XML encoding declaration '' while processing Anonymous Stream at line 1 offset 32 > ERROR #5490: Error running generator for method 'DispatchMap:GraphQL.REST.AbstractREST'ERROR: %CSP.REST.cls(DispatchMap) of generated code compiling subclass 'GraphQL.REST.AbstractREST' > ERROR #5030: An error occurred while compiling class 'GraphQL.REST.AbstractREST'---------------------------OK ---------------------------I am using Cache 2017.2.2.Any pointers will be a great help.Thanks, Strange, as that should not be hit for AbstractREST at all.Does you class looks the same as in repo?Just compiled successfully on:
Cache for Windows (x86-64) 2017.2 (Build 744U) Fri Sep 29 2017 10:58:27 EDT
Yes, same version. Just downloaded from repo and imported GraphQL.xml.Version: Cache for Windows (x86-64) 2017.2.2 (Build 865) Mon Jun 25 2018 10:45:31 EDTAlso in Cache for Windows (x86-64) 2017.2 (Build 744) Fri Sep 29 2017 11:10:05 EDTand getting the same error when import and compile GraphQL.xml. You use 8bit Caché. Maybe you need to convert GraphQL.xml into your local encoding.Or use Unicode Caché. Thanks Eduard, now it is working in two different versions.1. Cache for Windows (x86-64) 2017.2.2 (Build 865U_SU) Mon Jul 9 2018 14:31:14 EDT USER>Write $system.Version.IsUnicode() 12. Cache for Windows (x86-64) 2018.1 (Build 179) Tue Sep 4 2018 00:04:51 EDT USER>Write $system.Version.IsUnicode() 0 Really interesting stuff that I would like to introduce but there seem to be no new developments for a long time now. Has this development fizzled out? What features are you most interested in? Unless its not documented, I think he meant features like mutations and subscriptions.Specially mutations, anything else have a workaround. Mutations, mainly.
Is GraphQL support, or will it become, an official part of the product? I have not heard about such plans, maybe when this technology becomes more stable and widely adopted. Extremely uneducated question:
If we have a global with its nice tree structure (like for example that Persons tree built in Globals Introduction by InterSystems Learning Services) without specific schema (e.g. class definition), would graphql be able to be used to make specific condition/wild-card based queries? Current implementation resolves GraphQL query into SQL, so classes/tables are required.
This is our advantage as we don't need to write resolvers manually.
That said, if you want to provide custom schema - you can, as our GraphQL implementation includes GraphQL parser so you can use parsed AST to write your own resolver. This looks very promising. I've got the testing shell up and running returning data from the Sample namespace but how do i "generate a schema for all classes in the namespace" as mentioned in your instructions? My Documentation Explorer just reports "NO SCHEMA AVAILABLE" What does running this code
write ##class(GraphQL.Utils.Schema).GetSchema().%ToJSON()
return for you? It generates tons of JSON looking data. Is there a trick to getting the GraphiQL to get to the schema? Any settings or such? This is the schema.
Do you uses GraphiQL packaged with the repo? yes, I did No worries, I got it working after a fresh reinstall. Probably did something wrong the first time around
Article
Evgeny Shvarov · Apr 22, 2017
Hi!
If you see this page you are in the InterSystems Developer Community!
You are very welcome!
This is the place where you can read about and discuss InterSystems products and technologies: InterSystems IRIS, Caché, Ensemble, HealthShare, DeepSee, and iKnow.
What type of content can I find here?
We have three types of content on Developer Community(DC): articles, questions, announcements. And answers to questions. And videos.
The articles are about the best practices and experience with InterSystems technology and products. Both InterSystems employees and community members post articles. You can find release notes and new features descriptions and the articles regarding experiences and InterSystems technology examples.
And of course, its a place where you can ask your question and get the answer from the most experienced engineers in InterSystems technology from all over the world.
Why register?
Register on DC to post and comment articles, ask questions and give answers regarding InterSystems Data Platforms, solutions built with InterSystems Data Platforms and tools, technologies and approaches which help to build, deploy and maintain solutions on InterSystems Data Platforms. Here are the guidelines on how to post.
Note! Moderators may remove posts that are not related to InterSystems products and technologies.
InterSystems Developers community code of conduct.
Registered members can vote. Vote if you like an article, a question or an answer.
When should I vote down?
Use your downvotes whenever you encounter an egregiously sloppy, no-effort-expended post, or an answer that is clearly and perhaps dangerously incorrect.
If you downvote, please consider adding a comment if you think the post can be improved.
See more about votes.
How does the site work?
Posts are categorized by Tags. There are mandatory tags, which called Groups in editiing. Mandatory tags are related either to InterSystems Products, or InterSystems Services. You need to supply at least one of these tags. Tags are tags, the things which help to categorize posts. You can subscribe for tags to get notifications via email or RSS.
Also, you can follow the member you like - it's a subscription to member's posts and comments.
On the main page, you can see the feed of posts where the topmost is the either latest posted or the latest commented or answered.
You can use feed filters to see only the tags you subscribed, the most voted and new postings as well.
Also, we have DC analytics site to check some figures about DC members, posts, answers, etc.
For all the rest see the Developer Community FAQ.
Subscriptions and notifications
Registered members can receive email notifications regarding different actions on the Developers Community. Please see this article how to deal with that.
Also, everyone can subscribe to RSS: for everything and for specific tags.
InterSystems Global Masters!
It's our InterSystems Advocacy Hub. If think you are an advocate of InterSystems Technology please join the team of hundreds of InterSystems advocates all over the world. We'll provide you challenges, badges, and rewards of course. See the details.
InterSystems Open Exchange!
Find tools, frameworks, solutions, technology examples on InterSystems Open Exchange! Learn more.
What else?
If you have any questions about the site, ask in this group or see the FAQ.
We have Twitter to tweet about all what is valuable in Developer Community and Facebook page if you like it more.
Here is InterSystems Developers LinkedIn information channel and InterSystems Developers LinkedIn Group.
And we have DC Telegram channel for the same purpose if you like Telegram.
And we started the InterSystems Developers YouTube Channel
And also we have Developer Community Subreddit for all the most interesting announcements.
Welcome to InterSystems Developer Community!
This is nice documentation.I am still confused between GROUPS and TAGS, they seem like the same thing.Also, it would have been nice to have this information and much, much more at the beginning.I did ask for documentation when DC was just starting but was told it should be intuitive, but it was never that to me.(at least that was in my memory).Anyway, the documentation is nice, but should be expanded and available through a shortcut, or is that a tag or group?You say if I have any more questions, ask in this Group, how do I know what Group I am in? And how do I ask in a Group?Thank you Hi, Mike!Thanks for the feedback!I am still confused between GROUPS and TAGS, they seem like the same thing.Groups and tags are both tags. But the group is the way for us to be sure, that every post relates to something very significant to what our Company does. It's either InterSystems product, technology or service. Anyway, the documentation is nice, but should be expanded and available through a shortcutThere is a shortcut on the Links widgetand in Community menu - "About the site" You say if I have any more questions, ask in this Group, how do I know what Group I am in? And how do I ask in a Group?Sorry, Mike! I just forgot to put the link to the group. But of course, you can ask here in this post too.And yes, this post would be updated once new features and new better ideas to describe the Community will appear. Hi Evgeny,I couldn't help notice that this post has a -1 rating.I can't see anything wrong with the post so curious what the reason for a down vote would be.On stack overflow they explain the use of down voting as...When should I vote down?Use your downvotes whenever you encounter an egregiously sloppy, no-effort-expended post, or an answer that is clearly and perhaps dangerously incorrect.You have a limited number of votes per day, and answer down-votes cost you a tiny bit of reputation on top of that; use them wisely.This post has an interesting conversation around down votes...https://meta.stackexchange.com/questions/135/encouraging-people-to-explain-downvotesAs the original poster explains...Where the down-vote has been explained I've found it useful & it has improved my answer, or forced me to delete the answer if it was totally wrongThis initiated a change that prompts down voters with the message, "Please consider adding a comment if you think the post can be improved".We all make mistakes so its good to get this type of feedback. It also helps anyone landing on the answer months or years down the line and not realising the answer they are trying to implement has a mistake. Perhaps the DC site could do with something similar?Sean. Sean,I was the one who put the downvote in, and I explained myself in the reply.Maybe you are not the person to ask, but you brought in the comment:"You have a limited number of votes per day, and answer down-votes cost you a tiny bit of reputation on top of that; use them wisely."I don't understand how using down-votes cost someone "a tiny bit of reputation"Seems to me when a down-vote is used, it should enhance ones reputation as you are increasing the quality of a post.Also, if the down-vote is used when:"Use your downvotes whenever you encounter an egregiously sloppy, no-effort-expended post, or an answer that is clearly and perhaps dangerously incorrect."If that is the criteria for downvotes, they will never be used, so why even have them? Hi, Sean!Thanks for the feedback, this is very useful and fair input. So I've introduced the statement about downvotes to the description.We'll add a hint about commenting triggering by downvote. Thanks! In relation to stackoverflow I think the intention was to stop people abusing the implementation of the down vote.I'm not sure that's relevant here, unless the main DC site started displaying some kind of reputation score in the same way as stackoverflow.> Then downvotes will never be used, they why even have them?I think dangerously incorrect is a poor description and perhaps needs down voting :)It should just say "contains incorrect information".Despite that, there are 1,000,000+ users on stackoverflow regularly using the down vote so it must be working. We have a nice welcome video now. Check it out! Recently we got yet another "spam" post. It was hidden.
So this post was updated with the statement:
Note! Moderators may remove posts that are not related to InterSystems products and technologies.
Hi, Community!You can apply your enhancement requests to DC in this repository.And you can monitor the progress in this kanban projects. E.g. here is the June 2018 project. How to solve this error local host:5772 says Internal server error Hi Masilu! Could you please submit a new question with the description of the problem? In DC ANALYTICS / Authors what do these column headers stand for?
Comment Rating
Post Rating
VPP Context
VPP Absolute
For Rating I'd expect Votes ? But VPP ? VPP=Votes per post Thanks!
Question
Kishan Ravindran · May 10, 2017
Is there any simple code in Cache using FHIR to understand the relationship between them? If so can anyone provide some example. Hi KishanI think it would help to have a little bit more information on your particular use case for FHIR. FHIR is the latest standard to be developed under the HL7 organization. Pronounced 'Fire' , FHIR stands for Fast Healthcare Interoperability Resources. FHIR is a standard for exchanging healthcare information electronically. The FHIR standard is just that, a standard, and as is the case for all standards, requires implementation. Complete details about the FHIR standard are publically available on the internet at https://www.hl7.org/fhir/There is no specific functionality built into the InterSystems Cache product to support the FHIR standard, although InterSystems Cache could be used to develop an implementation of the FHIR standard. Such an implementation, done with Cache, would require a significant amount of developmentOn the other hand InterSystems HealthShare does have specific libraries included that can make working with the FHIR standard much easier, but this obviously would depend upon what your exact use-case for FHIR was. If you could provide additional information as to what you are wanting to do with FHIR it would make answering your question much easier.
Question
Manoj Krishnamoorthy · Jul 19, 2017
Hi,I'm interested in participating InterSystems Global Masters!Can anyone send the invitation to join InterSystems Global Masters!Thanks Thanks Evgeny How do I invite a colleague to Global Masters ?Will be able to earn points by sharing the link ? Hi, Manoj!You are invited!Check the mail.
Question
Laura Cavanaugh · Aug 1, 2017
My boss would like to change the Ensemble logo that one sees in the mangement portal, because it's part of the DeepSee Anaylzer. I can see where it lives on the generated html. I kow that you can set the logo for the User POrtal settings in DeepSee -- you can specifiy a URL for your logo. But we'd like to go one stee further and change the Ensemble by InterSystems to our own logo / company name. Is it possible to change this in the code? Is there a Configuration setting to change this?Thanks,Laura Is that uhmm... an empty rectangle? For me there is the InterSystems Ensemble Logo - NOW Yeah, you can't upload photos directly to this forum and it is somewhat bad, even though there's a lot of image related configs that most won't even think about using... The only way is hosting in the cloud. Yep, now it's displaying for me too. You can upload images using this button: Thanks Ed! I just went through old DC post for half an hour+ to detect it. It's much better than my link to Facebook. Regards I can't believe how much I look forward to these discussions. Unfortunately, there is no EnsembleLogo* anywhere in the InterSystems directory. It almost looks like it's simple text, made to look like a logo using CSS. This is from the page source: <div class="portalLogoBox"> <div class="portalLogo" title="Powered by Zen">Ensemble</div> <div class="portalLogoSub">by InterSystems</div> The class portalLogoBox must do all that CSS/html stuff to make it look cool. I was wondering if I can change the text from Ensemble to something else. If the user is in the DeepSee Analyzer, it will say DeepSee by InterSystems instead, but with similar CSS modifications.I figured out why he wants to do this; we have a few "portal" users who have accss to all of the clients' namespaces. For a demo, they will go into the DeepSee UserPortal, then exit to the management portal to switch namespaces, then go back in to the DeepSee user portal. THe DeepSee user portal has settings where you can change the logo that is displayed (what are those classes? I need to be able to change them programmatically rather than manually 50 times!) but when the portal users go back to the management portal, our company logo is lost; instead the lovely Ensemble by InterSystems (Powered by Zen) is there. I personally think IS should get the credit, but my boss is wondering if we can change it for the purposes of these demos. If not, that's OK; but now I'm simply curious. Thanks!Laura I could swear it was related to this widget's toolbar. It seems they have changed it to an image for newer releases. (Even Caché is now an image instead of pure CSS).Well, I do agree with crediting IS, however it should be something like:"Powered by InterSystems ENSEMBLE" like a single message, since the focus is to demonstrate your work, not theirs. do you look for this one?%ENSInstallDir%\CSP\broker\portal\EnsembleLogo210x50.png I often forget to mention that we are on 2014. Thanks - at least I can tell him we can't do it but maybe in a future release we can change the IS logo.Thanks,Laura
Announcement
Evgeny Shvarov · Aug 2, 2017
Hi, Community!
You know we would have a meetup in Boston on the 8th of July August with the following agenda:
Time
Topic
Presenter
5-30pm
Registration and welcome coffee
5-55pm
Opening
Evgeny Shvarov
6-00pm
Atelier 1.1
Andreas Dieckow, Joyce Zhang, Michelle Stolwyk
6-30pm
REST API in Caché
Fabian Haupt
7-00pm
Coffee break
7-30pm
Online Learning and Developer Community
Douglas Foster, Evgeny Shvarov
8-00pm
End of the Meetup. Coffee, beverages
Let me share some details about presenters.
Andreas Dieckow the product manager, Joyce Zhang the tech lead and Michelle Stolwyk the UX designer from the Atelier team will be sharing the benefits of the InterSystems new IDE and introducing the new features in the next release.
Fabian Haupt is an InterSystems senior support engineer, you might have worked with him on one of your WRC issues. Fabian is also an honored author on Developer Community. He will share some best practices on implementing REST API backends using InterSystems Caché, Ensemble, HealthShare.
Douglas Foster, manager of the InterSystems Online Learning department will present the latest news about online learning and how the courses have evolved. He will demonstrate the resources available now and will gather feedback about what to include in the future online learning catalog.
And you can introduce your topic on the next meetup and share your success built with InterSystems Technology.
Join us on the 8th of August!
You forgot Evgeny Shvarov, community manager of InterSystems who will persuade you to join and contribute to our beloved Developers Community! 8th of July? Thank you, Sergey! Will do! ) 8th of August of course! Thanks) So I've used my moderator superpowers to correct the first line of the post. Thanks, John!
Article
Niyaz Khafizov · Jul 27, 2018
Hi all. Today we are going to upload a ML model into IRIS Manager and test it.
Note: I have done the following on Ubuntu 18.04, Apache Zeppelin 0.8.0, Python 3.6.5.
Introduction
These days many available different tools for Data Mining enable you to develop predictive models and analyze the data you have with unprecedented ease. InterSystems IRIS Data Platform provide a stable foundation for your big data and fast data applications, providing interoperability with modern DataMining tools.
In this series of articles we explore Data mining capabilities available with InterSystems IRIS. In the first article we configured our infrastructure and got ready to start. In the second article we built our first predictive model that predicts species of flowers using instruments from Apache Spark and Apache Zeppelin. In this article we will build a KMeans PMML model and test it in InterSystems IRIS.
Intersystems IRIS provides PMML execution capabilities. So, you can upload your model and test it against any data using SQL queries. It will show accuracy, precision, F-score and more.
Check requirements
First, download jpmml (look at the table and select suitable version) and move it to any directory. If you use Scala, it will be enough.
If you use Python, run the following in the terminal
pip3 install --user --upgrade git+https://github.com/jpmml/pyspark2pmml.git
After success message go to Spark Dependencies and add dependence to downloaded jpmml:
Create KMeans model
PMML builder uses pipelines, so I changed the code written in the previous article a bit. Run the following code in Zeppelin:
%pysparkfrom pyspark.ml.linalg import Vectorsfrom pyspark.ml.feature import VectorAssemblerfrom pyspark.ml.clustering import KMeansfrom pyspark.ml import Pipelinefrom pyspark.ml.feature import RFormulafrom pyspark2pmml import PMMLBuilder
dataFrame=spark.read.format("com.intersystems.spark").\option("url", "IRIS://localhost:51773/NEWSAMPLE").option("user", "dev").\option("password", "123").\option("dbtable", "DataMining.IrisDataset").load() # load iris dataset
(trainingData, testData) = dataFrame.randomSplit([0.7, 0.3]) # split the data into two setsassembler = VectorAssembler(inputCols = ["PetalLength", "PetalWidth", "SepalLength", "SepalWidth"], outputCol="features") # add a new column with features
kmeans = KMeans().setK(3).setSeed(2000) # clustering algorithm that we use
pipeline = Pipeline(stages=[assembler, kmeans]) # First, passed data will run against assembler and after will run against kmeans.modelKMeans = pipeline.fit(trainingData) # pass training data
pmmlBuilder = PMMLBuilder(sc, dataFrame, modelKMeans)pmmlBuilder.buildFile("KMeans.pmml") # create pmml model
It will create a model, that predicts Species using PetalLength, PetalWidth, SepalLength, SepalWidth as features. It uses PMML format.
PMML is an XML-based predictive model interchange format that provides a way for analytic applications to describe and exchange predictive models produced by data mining and machine learning algorithms. It allows us to separate model building from model execution.
In the output, you will see a path to the PMML model.
Upload and test the PMML model
Open IRIS manager -> Menu -> Manage Web Applications -`> click on your namespace -> enable Analytics -> Save.
Now, go to Analytics -> Tools -> PMML Model Tester
You should see something like the image below:
Click on New -> write a class name, upload PMML file (the path was in the output), and click on Import . Paste the following SQL querie in Custom data source :
SELECT PetalLength, PetalWidth, SepalLength, SepalWidth, Species, CASE Species WHEN 'Iris-setosa' THEN 0 WHEN 'Iris-versicolor' THEN 2 ELSE 1 ENDAs predictionFROM DataMining.IrisDataset
We use CASE here because KMeans clustering returns clusters as numbers (0, 1, 2) and if we do not replace species to numbers it will count it incorrectly. Please comment if you know how can I replace сluster number with a species name.
My result is below:
There you can look at detailed analytics:
If you want to know better what is true positive, false negative, etc, read Precision and recall.
Conclusion
We have found out that PMML Model Tester is very useful tool to test your model against data. It provides detailed analytics, graphs, and SQL executor. So, you can test your model without any extended tool.
Links
Previous article
PySpark2PMML
JPMML
ML Pipelines
Apache Spark documentation Note that in InterSystems IRIS 2018.2, you'll be able to save a PMML model straight into InterSystems IRIS from SparkML, through a simple iscSave() method we added to the PipelineModel interface. You can already try it for yourself in the InterSystems IRIS Experience using Spark.Also, besides this point-and-click batch test page, you can invoke PMML models stored in IRIS programmatically from your applications and workflows as explained in the documentation. We have a number of customers using it in production, for example to score patient risk models for current inpatient lists at HBI Solutions. The article is considered as InterSystems Data Platform Best Practice.
Announcement
Evgeny Shvarov · Sep 25, 2018
Hi Community!
I'm pleased to announce that InterSystems IRIS is available on Microsoft Azure Marketplace!
→ InterSystems IRIS on Azure Marketplace
This is the second public cloud offering of InterSystems IRIS after recently announced Google Cloud Platform support.
What's inside?
You can find InterSystems IRIS 2018.1.2 for Ubuntu there with BYOL option for the license.
Stay tuned!
Announcement
Anastasia Dyubaylo · Oct 9, 2018
Hi Community!I want to share with you my impressions of Global Summit 2018.It was my first time in the USA and my first Global Summit. And I can say that it was really amazing trip and a great experience!And here are some key highlights of my choice:1. This year we had a special Global Masters Meeting Point under my direction. There, all the summit participants could learn more about our gamification platform, ask questions, share ideas, check out some samples of rewards and, of course, register and get their first points. What is more, many of our Advocates were awarded with special Badges for their active participation in Global Masters and Developer Community life. It was great to meet Developer Community Heroes in person, congratulations again! 2. Developer Community Flash Talks and the launch of InterSystems Open Exchange — a marketplace of Solutions, Interfaces, Plugins and Tools build with and build for InterSystems Data Platforms. Big applause goes to all the speakers, @Eduard.Lebedyuk, @Dmitry.Maslennikov, @John.Murray, @Daniel.Tamajon, @Evgeny.Shvarov and @Peter.Steiwer, thank you guys! 3. Global Summit Partner Pavilion was really full of people involved in interesting conversations. Please find more photos on DC Twitter. 4. A great activity on social networks, especially on Twitter. Here are some facts:More than 1,000 Tweets were posted with our special #GlobalSummit18 hashtag and garnered about 2 million impressions. The Hashtag #GlobalSummit18 was in top 20 Twitter Hashtags worldwide (11th place).We had 9 Broadcasts in DC Twitter and 2 Broadcasts in YouTube and in total more than 3,000 views. And...What about you? We're waiting of your stories from InterSystems Global Summit 2018!Please share your impressions with our special #GlobalSummit18 hashtag!
Announcement
Jeff Fried · Nov 12, 2018
Note: there are more recent updates, see https://community.intersystems.com/post/updates-our-release-cadence
InterSystems is adopting a new approach to releasing InterSystems IRIS. This blog explains the new release model and what customers should expect to see. We laid this out at Global Summit at the end of the InterSystems IRIS roadmap session and have received a lot of positive feedback from customers.
With this new model we offer two release streams:
1) An annual traditional release that we call EM (for Extended Maintenance)
2) A quarterly release that is tagged CD (for Continuous Delivery) and will be available only in a container format.
Why change? Speed and predictability
The pace of change in our industry is increasing, and this model ensures that we can publish the latest features very quickly to be responsive and competitive in the market. Many customers have told us they want two things:
Quicker time from requesting a new feature to having it available
A predictable schedule that allows them to plan for updates
Our new release cadence, inspired by continuous delivery principles, is similar to two-stream models used at many major software companies and a substantial fraction of enterprise-ready open source projects. Those that have successfully adopted this approach resoundingly report that they have higher quality and lower-risk releases, as well as a faster response time.
What’s not changing? Traditional releases are the same
Traditional releases (the "EM" releases) work the same way that our customers are used to. They receive ongoing maintenance releases, are the basis for adhocs as needed, and are supported on all platforms. Full product installation kits are available through the WRC Software Distribution portal as usual. Field tests will be available for major releases as we have done in the past. Maintenance releases will be made available for EM releases using the same ground rules we’ve used traditionally.
The difference is that these are released once per year, at a predictable time. Version 2019.1 of InterSystems IRIS is scheduled for March of 2019, version 2020.1 is scheduled for March 2020, and so on, as shown in the diagram below.
New quarterly releases are container-only
Every three months, new features and functionality will be available via a new quarterly release stream, denoted with a “CD”. For example, InterSystems IRIS version 2018.2 CD is scheduled for November 2018, version 2019.1 CD is scheduled for February 2019, version 2019.2 CD is scheduled for May 2019 and so on, as shown in the following diagram.
There are restrictions on these CD releases:
They are only available as container images, using the Open Container Initiative (OCI) format. This is widely used and supported by many companies including Docker, Amazon, Microsoft, Google, and IBM.
They only run on OCI compatible infrastructure. Docker is the most common OCI runtime, so InterSystems provides and supports docker containers built with the Ubuntu Linux kernel. This runs on a wide variety of platforms: all major cloud platforms (Amazon AWS, Microsoft Azure, Google GCP, IBM cloud), essentially all flavors of Linux, Windows Server 2016 and 2019, and more. InterSystems supports deploying containers on Windows 10 and Mac OS for development only, using Docker-for-windows and Docker-for-mac respectively. (The most notable platform that does not currently support OCI containers is AIX.)
Because these are containers, there is no install and no image upgrade. You can use the container images provided by InterSystems and compose your own images using them. To deploy, you simple replace containers. If there are any data upgrades needed, InterSystems will supply these along with the release.
With CD releases, InterSystems will not provide maintenance releases, security fixes, or adhocs. If you want to get a change, you can simply take the next release. There is a new release with the latest changes every three months, so you don’t need to wait longer than that for important fixes.
CD releases are fully supported by InterSystems for development, test, and production. Along with each CD release, InterSystems will have a preview program and provide preview images ahead of the final release. Preview images are supported for development and test purposes, but not for production.
Although Containers are relatively new, they are now widely used and provide many benefits. Customers do not need to use the CD releases or adopt containers, but there are many resources available from InterSystems to help with using InterSystems IRIS in containers (including multiple online videos) as well as a large ecosystem around containers in the industry at large.
In addition to providing rapid delivery of new features, CD releases will help with the predictability and stability of the traditional (EM) releases. The first CD release of the year has a corresponding EM release (which is the same except for any platform-specific capabilities), and these include all the functionality of the previous CD release plus more. Developers can work with CD releases and be confident that their code will work with traditional releases as well. Even if you never touch a CD release, you can track what features are released with InterSystems IRIS each quarter and plan confidently. Hello @Jeffrey.Fried, quick question.The CD releases will be Docker Images downloadables only from WRC or will be another public site? (Docker marketplace)Thanks Hello @David.Reche - we will have these available in public marketplaces, for sure. We will announce here when that is available, currently the image is available through WRC. Hi @David Reche - We do plan to make these available from the docker store as well as the major cloud marketplaces and of course via the WRC. The idea is to fit smoothly into the DevOps pipelines and toolsets our customers use.We're working on this, so stay tuned, and in the meantime please use the WRC.Any and all feedback welcome.
Article
Gevorg Arutiunian · Nov 16, 2018
The data model of your solution based on InterSystems platforms constantly changes over time. But what do you do with the data that was entered before? Back then, the data was valid, but what’s happening to it now after a number of data model changes? The answer to this question can be provided by the IDP DV tool that checks the property data of persistent and serial classes according to the types of these properties. In case any discrepancies are found, the tool generates a detailed error report for the user.
## Capabilities
### IDP DV offers three methods of scanning classes:
- Scanning of all classes
- Scanning of all the subclasses of the class
- Scanning of all classes corresponding to the SQL mask
## Usage
To install the tool, just download and import its classes from the repository into the necessary namespace and call the corresponding function.
```
s st = ##class(IDP.DV).ScanAllClasses(.Oid) //for all classes
s st = ##class(IDP.DV).ScanSubclassesOf(Class, .Oid) //for subclasses
s st = ##class(IDP.DV).ScanMatchingClasses(Mask, .Oid) //for SQL
```
### where:
*Oid* — the output structure saving data about unacceptable objects in the classes
*Class* — scanning of all subclasses of the class (and the class itself)
*Mask* — a parameter of the “SELECT ID FROM %Dictionary.ClassDefinition Where ID LIKE ?” SQL query
### Example
For our example, let’s use the Sample.Person class and the ScanSubclassesOf method. Let’s start this method without making any changes to it and with making a single change in one of its properties.
### No changes
```
SAMPLES>s st = ##class(IDP.DV).ScanSubclassesOf("Sample.Person", .Oid)
Sample.Employee has 0 invalid objects
Sample.Person has 0 invalid objects
```
### Having changed the Name property from string to integer:
```
SAMPLES>s st = ##class(IDP.DV).ScanSubclassesOf("Sample.Person", .Oid)
Class: Sample.Person
Object: 1
-----------------------------------------------------------------
ERROR #7207: The value of the ‘Ramsay, Jeff X.” data type is not a valid number
> ERROR #5802: Checking of the data type failed for property ‘Sample.Employee:Name’ with the value equal to “Ramsay, Jeff X.”
...
Class: Sample.Person
Object: 200
----------------------------------------------------------------
ERROR #7207: The value of the ‘Kovalev,Howard F.’ is not a valid number
> ERROR #5802 Checking of the data type failed for property ‘Sample.Employee:Name’ with the value equal to “Kovalev, Howard F.”
```
Comments and suggestions are very much welcome.
The [application with source code and documentation is available on Open Exchange](https://openexchange.intersystems.com/index.html#!/package/IDP-DV)
Link to OE shows an error:UPD: Link should be https://openexchange.intersystems.com/index.html#!/package/IDP-DV Thanks! I fixed it
Article
Alex Woodhead · Jun 13, 2023
Yet another example of applying LangChain to give some inspiration for new community Grand Prix contest.
I was initially looking to build a chain to achieve dynamic search of html of documentation site, but in the end it was simpler to borg the static PDFs instead.
Create new virtual environment
mkdir chainpdf
cd chainpdf
python -m venv .
scripts\activate
pip install openai
pip install langchain
pip install wget
pip install lancedb
pip install tiktoken
pip install pypdf
set OPENAI_API_KEY=[ Your OpenAI Key ]
python
Prepare the docs
import glob
import wget;
url='https://docs.intersystems.com/irisforhealth20231/csp/docbook/pdfs.zip';
wget.download(url)
# extract docs
import zipfile
with zipfile.ZipFile('pdfs.zip','r') as zip_ref:
zip_ref.extractall('.')
# get a list of files
pdfFiles=[file for file in glob.glob("./pdfs/pdfs/*")]
Load docs into Vector Store
import lancedb
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import LanceDB
from langchain.document_loaders import PyPDFLoader
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.prompts.prompt import PromptTemplate
from langchain import OpenAI
from langchain.chains import LLMChain
embeddings = OpenAIEmbeddings()
db = lancedb.connect('lancedb')
table = db.create_table("my_table", data=[
{"vector": embeddings.embed_query("Hello World"), "text": "Hello World", "id": "1"}
], mode="overwrite")
documentsAll=[]
pdfFiles=[file for file in glob.glob("./pdfs/pdfs/*")]
for file_name in pdfFiles:
loader = PyPDFLoader(file_name)
pages = loader.load_and_split()
# Strip unwanted padding
for page in pages:
del page.lc_kwargs
page.page_content=("".join((page.page_content.split('\xa0'))))
documents = CharacterTextSplitter().split_documents(pages)
# Ignore the cover pages
for document in documents[2:]:
documentsAll.append(document)
# This will take couple of minutes to complete
docsearch = LanceDB.from_documents(documentsAll, embeddings, connection=table)
Prep the search template
_GetDocWords_TEMPLATE = """Answer the Question: {question}
By considering the following documents:
{docs}
"""
PROMPT = PromptTemplate(
input_variables=["docs","question"], template=_GetDocWords_TEMPLATE
)
llm = OpenAI(temperature=0, verbose=True)
chain = LLMChain(llm=llm, prompt=PROMPT)
Are you sitting down... Lets talk with the documentation
"What is a File adapter?"
# Ask the queston
# First query the vector store for matching content
query = "What is a File adapter"
docs = docsearch.similarity_search(query)
# Only using the first two documents to reduce token search size on openai
chain.run(docs=docs[:2],question=query)
Answer:
'\nA file adapter is a type of software that enables the transfer of data between two different systems. It is typically used to move data from one system to another, such as from a database to a file system, or from a file system to a database. It can also be used to move data between different types of systems, such as from a web server to a database.
"What is a lock table?"
# Ask the queston # First query the vector store for matching content
query = "What is a locak table"
docs = docsearch.similarity_search(query)
# Only using the first two documents to reduce token search size on openai
chain.run(docs=docs[:2],question=query)
Answer:
'\nA lock table is a system-wide, in-memory table maintained by InterSystems IRIS that records all current locks and the processes that have owned them. It is accessible via the Management Portal, where you can view the locks and (in rare cases, if needed) remove them.'
Will leave as a future exercise to format an User interface on this functionality Amazing...
Can we do the same against DC pages? Impressive, and I have some UI ideas. But your example doesn't use IRIS in any way, right? Correct. There is no use of IRIS though the example could be extended to profile metadata from classes. With generative AI the line between Class Dictionary and Documentation could be less distinct. The example doesn't make use of vector metadata yet. The documentation has description of settings, and a deployment has a cpf / api to allude setting values, so maybe it is possible for AI to describe the nature of a deployment or support further information regarding messages / application / event log.
( Deliberately suggesting too many options for a single competition candidate to attempt to take on )
Announcement
Anastasia Dyubaylo · Jul 5, 2023
InterSystems is currently looking for a U.S.-based Developer and Startup Evangelist!
Are you a strong developer who loves writing, speaking and teaching other developers about technology while taking a meaningful role in shaping the experience they have with the platform itself?
Join InterSystems and help us delight developers within the open source community. You will be the subject matter expert and evangelist for modern developers, focused on the end-to-end experience through the entire development cycle, and ensure that we meet the needs of current and future developers.
As the InterSystems Developer and Start Up Evangelist, your mission is to educate and engage early adopters and the broader developer community around the InterSystems IRIS data platform and back it up with practical examples. That means doing whatever it takes to bring them into our developer community of developers and keep them actively and happily building within it while learning from their experiences.
This is a role that will allow you to contribute to building real software and also take a public-facing role representing the platform to developer communities. It is part marketing, part engineering and part community building with a healthy sprinkle of education and public relations.
Job Responsibilities
Expand the number of active and influential open source projects using InterSystems’ technology
Create and deliver impactful content (sample code, blog posts, presentations, etc.) that help developers learn concepts and build successful apps and integrations on our data management platform.
Develop performance indicators and results for awareness and engagement, and create a reporting cadence.
Collaborate across the organization to create videos, courses, or exercises to meet the needs of new-to-InterSystems developers.
Support various development events/hackathons and evangelize our IRIS Data Platform
Skills & Experience
5+ years in software engineering at top companies.
2+ years in developer relations/advocacy/evangelism
A track record of speaking, presenting and teaching highly technical topics.
Continual learner who thrives on figuring out new technology.
Broad understanding of the open source software space.
Superior oral and written communication skills in English.
Experience with a mix of database technologies (SQL/relational, NoSQL/document, key-value, unstructured).
Experience in a variety of programming languages
Willingness to travel and ability to work autonomously.
Bachelors in a STEM related field
Bonus points for having experience with InterSystems technology
>> APPLY HERE <<
Article
Evgeniy Potapov · Jul 10, 2023
In this article, we will explore the use of parameters, formulas and labels in Logi Report Designer (formerly Logi JReport Designer). What are they for and how to create them?
Using the basic functionality of InterSystems Reports Designer, parameters, formulas and labels, you can significantly improve the detail and information content of the generated report. In addition, these tools allow you to automate some of the processes, which greatly speeds up and facilitates the creation of reports.
Let's analyze each tool separately now.
Parameters are individually configurable variables. They can store both static and dynamic data. For a dynamic parameter, you can set your own SQL query, which will be independent of the SQL query of the main dataset. In this way, you can output data without creating multiple datasets, thus keeping your design organized and clean. Parameters can be used both as a part of functions and SQL queries and as an independent indicator with the following syntax: “@YourParameter”. This quality is simply indispensable when the accuracy and detail of data are required.
A static parameter is a predefined value or a list of values used as a condition or filter on the output. A static parameter can also be used in SQL queries, functions and labels using the same syntax: “@YourParameter”.
Formulas are fully programmable functions in the Java language. This powerful tool greatly expands the possibilities of analytics, allowing you to perform complex calculations and set logical conditions for the output data. Formulas are created in the built-in Java IDE inside Logi with a built-in set of functions for working with such data types as Array, Date / Time, Financial, Math, String, etc. Formulas can work with all data available in InterSystems Reports. The built-in IDE understands parameters, calculated fields, and even other formulas.
A label is a text widget. It serves to display any lowercase characters and variables. Its purpose speaks for itself: it is used in headers and footers, as a custom legend for a chart or table, in a word, and wherever data need to be titled. Just like all other InterSystems Reports tools, the label is a very flexible widget. It can be placed anywhere on the page, inside a graph or table.
Here we will look at examples of the most basic use of these tools.
We will create a parameter that returns the number of developers out of the total number of members of the InterSystems community.
In order to create a parameter, you need to click on the Catalog Manager button in the upper left corner of the toolbar.
In the window that opens, on the left, select the Parameters item, then click on the “New Parameter” button in the upper left corner.
The parameter creation window will open.
In the first line, we need to set the parameter name. It is recommended to choose a name that reflects the purpose of the parameter as accurately as possible and at the same time is short enough. It is necessary because during the development process, you will create an abundance of different parameters, and there is a risk of overloading the lists of parameters and functions. In this article, we will analyze the dynamic parameter, so in the second line in the Value Setting we will select Bind with Single Column. In the next Data Source line, we will choose the table from which the selection will occur. In our case, it is Members. Then in the Bind Column, we will select the columns from which we will return the value.
There isn't a separate column that can count the number of developers for us in the Members table. Yet, thanks to the ability to set a special SQL query, we can establish a condition for this particular selection. To do that, scroll down the list of properties, find the line Import SQL and click on it.
A request creation window will appear. It has already pre-recorded the selection string of the members_count column - the total number of participants. We only need to add the condition “where Developer = 1”. We can check the request by clicking on the Check button, and if it is successful, you should click OK.
After completing the previous steps, click OK in the parameter creation window, and the new Developer_member parameter will appear in the directory on the left. At this point, close the Catalog Manager window and try the newly created parameter. To do that, drag it to the report page and click View. After completing this step, you will be prompted to accept the value of the parameter taken from the current database, so click OK.
Ready! Now we can see how many people in the community are developers. This setting will automatically get updated every time the data changes.
Now we will create a formula. This formula will calculate the percentage of developers compared to the total number of participants.
To do that, you should repeat the same steps we took when creating the parameter. Let me remind you. Click on the Catalog Manager, select Formulas, and then New Formula in the upper left corner.
Before the formula creation window appears, we will be prompted to enter a name for the formula.
After that, the IDE will open for you to write code in Java. Built in InterSystems Reports, the compiler allows you to write short functions without defining classes and methods. In order to calculate the percentage, we need to divide our new parameter by the total number of members and multiply by 100. We have already created the CountTotalMembers indicator. We did it with the tool called InterSystems Adaptive Analytics (powered by AtScale). You can find out more about it here (link).
Thus, we got the following formula. Pay attention to the function allowing you to write comments to the code. Well-documented code will make it easier for others to work with your formulae.
After writing, you can check if the resulting code has any errors by clicking the checkmark button on the toolbar. Toolwill check whether the syntax is correct and whether the specified parameters are present.
After the function has been tested, it can be saved. To make that happen, click the Save button, and the formula will appear in the catalog.
Following the parameter example, our next step will be to drag the new formula onto the page and find out the share of developers in the total number of participants.
This function can be utilized as an indicator for graphs and tables. I will give you an example of using our new formula in a bar graph. You can learn more about charts and how to create them here (link).
In this example, I used a new formula and derived the proportion of developers over the past five months.
It's a bar graph, with the formula developers_to_members on the y-axis and the dimension month_year_num on the x-axis. It turned out a very visual trend and we did it in just a few minutes.
Now it is time to look at the labels.
They are embedded into the report page from the Insert tab with the Label button.
A window to enter the text will appear on the page.
The built-in functionality allows you to edit many parameters for the new Label. In this article, we used this widget to enhance our new table.
There are a lot of parameters placed on the panel on the right that can help you design a label. To make them appear, select the Label widget.
To set the borders for the widget, scroll down to the Border category. Select all 4 borders: Bottom Line, Left Line, Right Line, and Top Line, and set all of them to Solid.
In order to fill the background, you need to scroll through the properties to the Color category and select the desired shade. The same can be done in the Format tab on the toolbar at the top.
If you wish to select the font size, stay on the same Format tab, click the drop-down menu with sizes, and pick the desired one. It can also set the font type and the location of the text inside the widget.
For more precise positioning relative to other widgets, use the coordinates the Label has inside the page. By default, sheet sizes are in inches. The positioning settings are located in the Geometry category on the widget's properties panel on the left.
In this article, we tried to cover three basic features of InterSystems Reports (powered by Logi Report). That is why by now, we expect you to know how to create formulae, parameters, and labels with great confidence. Great article! @Jean.Millette / @Timothy.Leavitt - are we leveraging all of these features in our use of InterSystems Reports? Hi,
I think you missed some links references:
Btw, great article! :)