清除过滤器
文章
Jingwei Wang · 二月 14, 2022
# 1. 互操作性-嵌入式Python(interoperability-embedded-python)
这个概念旨在展示**iris互操作性框架**如何与嵌入的python一起使用。
## 1.2. 示例代码
```
import grongier.pex
import iris
import MyResponse
class MyBusinessOperation(grongier.pex.BusinessOperation):
def OnInit(self):
print("[Python] ...MyBusinessOperation:OnInit() is called")
self.LOGINFO("Operation OnInit")
return
def OnTeardown(self):
print("[Python] ...MyBusinessOperation:OnTeardown() is called")
return
def OnMessage(self, messageInput):
if hasattr(messageInput,"_IsA"):
if messageInput._IsA("Ens.StringRequest"):
self.LOGINFO(f"[Python] ...This iris class is a Ens.StringRequest with this message {messageInput.StringValue}")
self.LOGINFO("Operation OnMessage")
response = MyResponse.MyResponse("...MyBusinessOperation:OnMessage() echos")
return response
```
## 1.3. 注册一个组件
**不需要 ObjectScript 代码**.
多亏Grongier.PEX.Utils.RegisterComponent()方法。
启动一个嵌入式的Python shell:
```
/usr/irissys/bin/irispython
```
然后使用这个类方法将一个新的py文件添加到组件列表中,以实现互操作性。
```
iris.cls("Grongier.PEX.Utils").RegisterComponent(,,,,)
```
例如 :
```
iris.cls("Grongier.PEX.Utils").RegisterComponent("MyCombinedBusinessOperation","MyCombinedBusinessOperation","/irisdev/app/src/python/demo/",1,"PEX.MyCombinedBusinessOperation")
```
# 2. 演示
Production有四个Python组件:
- 两个业务服务组件 :
- 用Grongier.PEX.MyCombinedBusinessService持续的给业务操作组件发送同步消息
- 这些消息是JSON格式的Python对象,存储于Grongier.PEX.Message类
- Thoses messages are python objects casted in JSON and stored in Grongier.PEX.Message.
- Python代码 : src/python/demo/MyCombinedBusinessService.py
- Grongier.PEX.MyBusinessService是一个用于写消息日志的原始业务服务组件,无其他作用。
- Python 代码 : src/python/demo/MyBusinessService.py
- 两个业务操作组件:
- Grongier.PEX.BusinessOperation是用于接收业务服务组件Grongier.PEX.MyCombinedBusinessService的消息
- Python 代码 : src/python/demo/MyBusinessOperation.py
- Grongier.PEX.CombinedBusinessOperation可以接收Ens.StringRequest消息,并返回Ens.StringResponse消息
- Python 代码 : src/python/demo/MyCombinedBusinessOperation.py
为Python本地消息新增json跟踪:
# 3. 前置需求
Git和Docker必须已安装
# 4. 使用Docker安装
从git拉取repo到本地
```
git clone https://github.com/grongierisc/interpeorability-embedded-python
```
在安装路径打开terminal,并运行:
```
docker-compose build
```
使用IRIS容器运行你的项目:
```
docker-compose up -d
```
# 5. 无Docker安装
在iris 实例上安装 grongier_pex-1.0.0-py3-none-any.whl :
```
/usr/irissys/bin/irispython -m pip install grongier_pex-1.0.0-py3-none-any.whl
```
然后,加载ObjectScript类:
```
do $System.OBJ.LoadDir("/opt/irisapp/src","cubk","*.cls",1)
```
# 6. 运行How to Run the Sample
打开production,并运行。
示例代码会开始运行。
# 7. repo中包含什么内容What's inside the repository
## 7.1. Dockerfile
Dockerfile包含在容器中安装一些python的依赖项,例如pip, venv和sudo
然后创建dev目录将git仓库复制进入目录
Dockerfile启动IRIS并导入Titanics csv文件,然后为Python Shell激活**%Service_CallIn**。
可以使用使用相关的docker-compose.yml来轻松地设置额外的参数,如端口号和映射键和主机文件夹的位置。
这个dockerfile以安装python模块的需求结束。
最后一部分是关于安装jupyter notebook和它的内核。
使用.env/文件来调整在docker-compose中使用的dockerfile。
## 7.2. .vscode/settings.json
VSCode配置文件 [VSCode ObjectScript plugin](https://marketplace.visualstudio.com/items?itemName=daimor.vscode-objectscript)
## 7.3. .vscode/launch.json
VSCode ObjectScript 调试配置文件
[获取更多相关信息](https://community.intersystems.com/post/dockerfile-and-friends-or-how-run-and-collaborate-objectscript-projects-intersystems-iris)
## 7.4. .vscode/extensions.json
如果你想在容器中用VSCode运行,可以添加扩展。
[获取更多相关信息](https://code.visualstudio.com/docs/remote/containers)
对于使用嵌入式python非常有用。
## 7.5. src 文件夹
```
src
├── Grongier
│ └── PEX // ObjectScript classes that wrap python code
│ ├── BusinessOperation.cls
│ ├── BusinessProcess.cls
│ ├── BusinessService.cls
│ ├── Common.cls
│ ├── Director.cls
│ ├── InboundAdapter.cls
│ ├── Message.cls
│ ├── OutboundAdapter.cls
│ ├── Python.cls
│ ├── Test.cls
│ └── Utils.cls
├── PEX // Some example of wrapped classes
│ ├── MyBusinessOperationWithAdapter.cls
│ ├── MyBusinessOperationWithIrisAdapter.cls
│ ├── MyBusinessOperationWithPythonAdapter.cls
│ ├── MyBusinessService.cls
│ ├── MyOutboundAdapter.cls
│ └── Production.cls
└── python
├── demo // Actual python code to run this demo
│ ├── MyBusinessOperation.py
│ ├── MyBusinessOperationWithAdapter.py
│ ├── MyBusinessOperationWithIrisAdapter.py
│ ├── MyBusinessProcess.py
│ ├── MyBusinessService.py
│ ├── MyCombinedBusinessOperation.py
│ ├── MyCombinedBusinessProcess.py
│ ├── MyCombinedBusinessService.py
│ ├── MyInboundAdapter.py
│ ├── MyLoggingOperation.py
│ ├── MyNonPollingStarter.py
│ ├── MyOutboundAdapter.py
│ ├── MyRequest.py
│ ├── MyResponse.py
│ ├── MySyncBusinessProcess.py
│ └── SimpleObject.py
├── dist // Wheel used to implement python interoperability components
│ └── grongier_pex-1.0.0-py3-none-any.whl
├── grongier
│ └── pex // Helper classes to implement interoperability components
│ ├── _BusinessHost.py
│ ├── _BusinessOperation.py
│ ├── _BusinessProcess.py
│ ├── _BusinessService.py
│ ├── _Common.py
│ ├── _Director.py
│ ├── _InboundAdapter.py
│ ├── _Message.py
│ ├── _OutboundAdapter.py
│ └── __init__.py
└── setup.py // setup to build the wheel
```
# 8. 如何增加一个新组件
## 8.1. 入站适配器InboundAdapter
使用python执行入站适配器,使用grongier.pex.InboundAdapter子类,覆盖OnTask()方法。
## 8.2. 出站适配器OutboundAdapter
使用python执行出站适配器,使用grongier.pex.OutboundAdapter子类,实现所需action方法。
## 8.3. 业务服务组件BusinessService
使用python执行业务服务组件,使用grongier.pex.BusinessService子类,覆盖OnProcessInput()方法。
## 8.4. 业务流程组件BusinessProcess
使用python执行业务流程组件,使用grongier.pex.BusinessProcess子类,覆盖 OnRequest(), OnResponse() and OnComplete()方法。
## 8.5. 业务操作BusinessOperation
使用python执行业务流程组件,使用grongier.pex.BusinessOperation子类,覆盖 OnMessage()方法。
## 8.6. 注册一个组件
启动一个嵌入式python shell:
```
/usr/irissys/bin/irispython
```
然后使用这个类方法将一个新的py文件添加到组件列表中,以实现互操作性。
```
iris.cls("Grongier.PEX.Utils").RegisterComponent(,,,,)
```
例如 :
```
iris.cls("Grongier.PEX.Utils").RegisterComponent("MyCombinedBusinessOperation","MyCombinedBusinessOperation","/irisdev/app/src/python/demo/",1,"PEX.MyCombinedBusinessOperation")
```
## 8.7. 直接使用Grongier.PEX
如果你不想使用RegisterComponent,你可以添加一个Grongier.PEX.Business*组件并配置其属性
- %module :
- 你的python代码的模块名称
- %classname :
- 你的组件的类名
- %classpaths
- 你的组件所在的路径。
- 除了PYTHON_PATH之外,可以有一个或多个Classpaths(用'|'字符分隔)
例如 :
# 9. 其他工作
- 仅业务服务组件和业务操作组件可以被测试
- 在适配器上工作
# 10. 认证
大部分代码来自Mo Cheng和Summer Gerry的PEX for Python。
注册部分来自于尚未发布的IRIS 2021.3的功能。
文章
Jingwei Wang · 二月 15, 2022
1. 使用PyODBC访问InterSystems IRIS数据库
pyodbc是一个开源的Python模块,可以利用ODBC来访问底层数据库。InterSystems支持使用pyodbc作为使用关系模式从Python访问数据库的一种方式。这个模块也可以用于InterSystems IRIS的早期版本。
代码示例
import pyodbc
def run():
# connection information
ip = localhost
port = 51773 # IRIS超级服务端口号
namespace = USER
username = <userName>
password = <password>
driver = "{InterSystems IRIS ODBC35}" # ODBC data source名称, IRIS 安装时一般自带ODBC驱动,所以不需要独立安装
# Create connection to InterSystems IRIS
connection_string = 'DRIVER={};SERVER={};PORT={};DATABASE={};UID={};PWD={}' \
.format(driver, ip, port, namespace, username, password)
print(connection_string)
connection = pyodbc.connect(connection_string)
connection.setdecoding(pyodbc.SQL_CHAR, encoding='utf-8')
connection.setencoding(encoding='utf-8')
print("Connected to InterSystems IRIS")
if __name__ == '__main__':
run()
在windows终端执行上面的python文件,可以运行成功,代表您已经可以从通过pyodbc访问InterSystems IRIS
2. 使用 InterSystems IRIS Native API 访问InterSystems IRIS 数据库
2.1 安装 .whl 文件
2.2 代码示例
"""
PURPOSE: Makes a connection to an instance of InterSystems IRIS Data Platform using the native API
"""
import irisnative
def run():
# connection information
ip = localhost
port = 51773 # IRIS超级服务端口号
namespace = USER
username = <userName>
password = <password>
# Create connection to InterSystems IRIS
connection = irisnative.createConnection(ip, port, namespace, username, password)
print("Connected to InterSystems IRIS")
# Create an iris object
iris_native = irisnative.createIris(connection)
if __name__ == '__main__':
run()
可以在windows终端执行上面的python文件,可以运行成功,代表您已经可以从通过Native API访问InterSystems IRIS
3. Pyodbc 与 Native API的区别
PyODBC可以让你的应用程序快速检索、更新和删除数据。 Native API可以让你的应用程序直接访问InterSystems IRIS中的底层数据结构(globals),以及调用ObjectScript方法和例程。
问题
泽 吴 · 三月 16, 2022
我就一个问题,InterSystems IRIS 怎么用,我就想创建一个数据库(也不知道是不是cache),然后通过jdbc url 连接,找了一个星期的文档,不知道jdbc url 是什么,完全靠猜,别跟我说文档,没有一个靠谱的 不知道你在哪里找文档找了一个星期,可以直接去docs.intersytems.com,选择你要对应的版本,然后再查找框里输入jdbc url, 比如我在最新的InterSystems IRIS for health 2021.2的文档中查到:
jdbc:IRIS://<host>:<port>/<namespace>/<logfile>:<eventclass>:<nodelay>:<ssl>
比如:
jdbc:IRIS://127.0.0.1:1972/User
原文在这里:https://docs.intersystems.com/irisforhealth20212/csp/docbook/DocBook.UI.Page.cls?KEY=BJAVA_connecting#BJAVA_connecting_url 从文档库搜索关键词“JDBC“
进入第一篇或第二篇文档,其中明确指出了IRIS使用的JDBC参数
耗时大约15秒
请务必使用官方文档以达到事半功倍的效果哦
公告
Jingwei Wang · 五月 11, 2022
各位开发者们好,:
很高兴跟大家宣布,畅销书作家和技术专家杰弗里·摩尔将在6月22日InterSystems的全球峰会上做专题演讲。以下是他的简历:
杰弗里·摩尔是一名咨询专家,他最近的咨询业务包括Salesforce、微软、Autodesk、F5Networks、Gainsight、谷歌和Splunk。 他一生的工作都集中在颠覆性创新的市场动态上。他的第一本书《跨越鸿沟》是关于创业公司在从早期采用者过渡到主流客户时所面临的挑战,该书已售出超过一百万册。摩尔最近的作品《Zone to Win》探讨了大型企业在拥抱颠覆性创新时所面临的挑战。 摩尔每年发表50至80场演讲,最近他重点关注企业IT投资从记录系统向交互系统的转变。
我将发布更多关于我们演讲者的信息。今年的全球峰会,演讲阵容很强大。
另外,你现在可以在我们的网站上建立你的会议和时间表。如果你还没有注册,可以点击马上注册.
公告
Claire Zheng · 二月 6, 2023
Hey 开发者们,
投票周开始了!
在我们的 InterSystems 开发者竞赛:Tool(工具)中,来为你最欣赏的应用投上一票吧!
🔥 投票选出最佳应用程序 🔥
如何投票?详情如下。
Experts nomination(专家提名)
InterSystems经验丰富的专家评审团将选出最好的应用程序,在Experts nomination(专家提名)中提名奖项。 有请InterSystems专家:
⭐️ @akoblov,支持专家⭐️ @Guillaume.Rongier7183,销售工程师⭐️ @Eduard.Lebedyuk,高级云工程师⭐️ @Steve.Pisani,高级解决方案架构师⭐️ @Timothy.Leavitt,开发经理⭐️ @Evgeny.Shvarov,开发者生态系统经理⭐️ @Dean.Andrews2971,开发者关系主管
Community nomination(社区提名)
每一个用户来说,你投出的每一票的分数,是根据下面两类中最高的分数来计:
条件
奖项排名
第一名
第二名
第三名
您在社区发布了一篇文章并将应用程序上传到 Open Exchange (OEX)
9
6
3
您在社区发布了至少 1 篇文章或将 1 个应用程序上传到 OEX
6
4
2
您对 DC 做出任何有效贡献(发表评论/问题等)
3
2
1
等级
奖项排名
第一名
第二名
第三名
Global Masters 的 VIP 级别 或 InterSystems 产品经理
15
10
5
Global Masters 的 Ambassador级别
12
8
4
Global Masters的Expert 级别或开发者社区版主
9
6
3
Global Masters的Specialist级别
6
4
2
Global Masters的Advocate级别,或 InterSystems员工
3
2
1
Blind vote!
每个应用获得的投票数将对所有人不可见。我们会每天在这个帖子(英文原帖)的评论区发布一次排行榜。
在竞赛页面,提交时间越早,在列表中的排名就靠前。
P.S. 不要忘记订阅本文(请订阅英文原帖),点击铃铛图标,即可收到最新“排行榜”评论。
在参与投票前,您需要:
登录 Open Exchange – 使用开发者社区账号即可。
在社区内进行有效贡献 ——回答问题、发帖、在Open Exchange发布新应用等等都可以,然后你的账号才可以参与投票。点击查看本帖 ,了解如何更好地成为有效的社区贡献者!
投票期间,如果你改了主意,可以随时将票改投给其他项目。
来支持你喜欢的项目吧!
注意:在投票期间,参赛者可以继续修复bug,提升应用,所以投票者不要错过最新发布的版本哦~ 截至2月7日的投票结果分享-
Since the beginning of the voting we have the results:
Expert Nomination, Top 5
OpenAPI-Suite by @Lorenzo Scalese
irissqlcli by @Dmitry Maslennikov
iris-tripleslash by @Henry Pereira
Intersystems IRIS platform queue trend monitoring component by @Yubo Mao
message_key_query by @王喆
➡️ Voting is here.
Community Nomination, Top 5
Intersystems IRIS platform queue trend monitoring component by @Yubo Mao
iris-tripleslash by @Henry Pereira
message_key_query by @王喆
DX Jetpack for VS Code by @John Murray
OpenAPI-Suite by @Lorenzo Scalese
➡️ Voting is here.
So, the voting continues.
Please support the application you like! Please check out today's voting results:
Expert Nomination, Top 5
irissqlcli by @Dmitry Maslennikov
OpenAPI-Suite by @Lorenzo Scalese
iris-geo-map by @Muhammad Waseem
iris-tripleslash by @Henry Pereira
iris-log-viewer by @Oliver Wilms
➡️ Voting is here.
Community Nomination, Top 5
iris-tripleslash by @Henry Pereira
Intersystems IRIS platform queue trend monitoring component by @Yubo Mao
irissqlcli by @Dmitry Maslennikov
OpenAPI-Suite by @Lorenzo Scalese
message_key_query by @王喆
➡️ Voting is here.
公告
Michael Lei · 三月 8, 2023
你好社区,
在上次激烈的编程比赛之后,我们很高兴宣布下一场 InterSystems 技术文章写作比赛!
✍️技术文章竞赛:InterSystems IRIS 教程✍️
写一篇可以被视为 InterSystems IRIS 教程的文章 任何级别的程序员:3月1日至3月31日初级/中级/高级。
🎁 人人有奖:参加比赛的每位作者都可获得一份特别奖品包!
🏆 主要奖品:共有6个奖品可供选择。
奖品
1. InterSystems技术论文大赛人人有奖!任何在比赛期间写文章的会员都将获得特别奖品:
🎁 品牌有机帆布手提袋
🎁 Moleskine 内衬笔记本
2. 专家奖——文章将由 InterSystems 专家评判:
🥇 第一名:Mars Pro 蓝牙音箱 / AirPods Max
🥈 第二名:带无线充电盒的 Apple AirPods Pro /
JBL Pulse 4 灯光秀音箱
🥉 第三名:适用于 iPad 的妙控键盘保护套 / Bose Soundlink 微型蓝牙音箱
或者作为替代方案,任何获胜者都可以从比他自己的奖品级别低的奖品中选择一个奖品。
3.开发者社区奖——点赞数最多的文章。获胜者将可以选择以下奖品之一:
🎁 iPad 妙控键盘保护套
🎁 Bose Soundlink 微型蓝牙扬声器
笔记:
作者每个类别只能获得一次(作者总共将获得 2 个奖项:一个专家奖,一个社区奖)
如果出现平局,则专家对平局文章的投票数将被视为打破平局的标准。
谁可以参加?
任何开发人员社区成员,InterSystems 员工除外。 创建一个帐户!
比赛期间
📝 3月1日-3月31日:文章发表及投票时间。
在此期间发表一篇文章。 DC 成员可以通过 Likes 为已发表的文章投票——在社区奖中投票。
注意:您越早发表文章,您收集专家和社区投票的时间就越多。
有什么要求?
❗️凡是在比赛期间所写的文章,满足以下要求,将自动进入比赛:
文章必须是有关 InterSystems IRIS 主题的教程*。它可以适用于初学者、中级或高级开发人员。
文章必须是英文的。
文章必须是 100% 新的(它可以是现有文章的延续)。
该文章不能是已在其他社区发表的文章的翻译。
文章必须包含Tutorial 标签。
文章大小:最少 400 字(链接和代码不计入字数限制)。
同一作者最多允许 3 个条目。
允许发表关于同一主题但具有来自不同作者的不同示例的文章。
* 教程提供开发人员可以遵循以完成特定任务或一组任务的分步说明。
🎯 额外奖励
这次我们决定增加额外的奖金来帮助您赢得奖品!请欢迎:
奖金
标称
细节
话题奖
5个
如果您的文章与建议主题列表(如下所列)中的主题相关,您将获得 5 票专家票的奖励(相对于专家选择的第一名 = 3 票) 。
视频奖
3个
文章内容的呈现形式:除了发布文章外,还制作一个解释性视频。
讨论奖
1个
包含最有用讨论的文章,由 InterSystems 专家决定。只有 1 篇文章将获得此奖金。
翻译奖金
1个
在任何区域社区上发布您文章的翻译。 了解更多。
注意:每篇文章只能投一票。
新会员奖励
3个
如果您没有参加过之前的比赛,您的文章将获得 3 票专家票。
拟议主题
以下是建议的主题列表,这些主题将为您的文章提供额外的奖励:
✔️ 从 C# 使用 IRIS✔️ 从 Java 使用 IRIS✔️ 从 Python 使用 IRIS✔️ 使用嵌入式 Python✔️ 使用 Python API✔️ 使用嵌入式 SQL✔️ 使用 ODBC/JDBC✔️ 使用 %Query/%SQLQuery✔️ 使用索引✔️ 使用触发器✔️ 使用 JSON✔️ 使用 XML✔️ 使用休息✔️ 使用容器✔️ 使用 kubernetes
注意:允许来自不同作者的同一主题的文章。
➡️ 加入InterSystems Discord讨论规则、话题和奖金。
所以,
是时候展示你的写作技巧了!祝你好运✨
重要提示:奖品的交付因国家/地区而异,其中一些可能无法交付。可以从@Liubka.Zelenskaia 索取有限制的国家/地区列表
欢迎关注中文社区成员 @ 王喆 的作品:Develop IRIS using SSH (https://community.intersystems.com/node/537756)
文章
Claire Zheng · 五月 11, 2023
2023年4月14日-16日,2023 CHITEC在合肥圆满举办!此次盛会期间,创新的数据技术提供商InterSystems通过展位展示、主题研讨会、分论坛演讲等方式,全方位多角度展示了“加速评测,助力公立医院高效建设互联互通平台和数据中心”的能力,吸引了众多参会嘉宾。
文章
Hao Ma · 一月 15, 2021
假设您想编写一些真正的web应用程序,例如medium.com网站的简单克隆。这类应用程序可以在后端使用任何不同的语言编写,也可以使用前端的任何框架编写。编写这样一个应用程序有很多方法,你也可以看看这个项目。它为完全相同的应用程序提供了一堆前端和后端实现。您可以轻松组合它们,任何所选前端应该与任何后端搭配。
我来介绍一下这个使用后端InterSystems IRIS来实现后端的相同的应用程序。
RealWorld项目使用REST并提供预设swagger规范,以及Postman/Newman集合自动化测试。因此,它有助于实现完全相同的REST API。幸运的是,InterSystems已经实现了通过swagger规范生成REST API实现的方法。最佳实践在这里。
我实现这个应用程序的步骤是:
从swagger规范生成API
为应用程序中使用的每个对象类型添加一些持久类,包括
Users
Articles
Comments
实现API并用Postman测试
最后,用任何前端查看实际效果。
用 docker 启动
你可以自己使用docker 来实验一下。
// clone github repository
git clone https://github.com/daimor/realworld-intersystems-iris.git
cd realworld-intersystems-iris
// build and run it with docker-compose
docker-compose up -d --build
启动后可以通过URL http://localhost:12000/conduit获取IRIS中的REST API,可以用newman测试,需要已安装npm和npx包。
APIURL=http://localhost:12000/conduit ./run-api-tests.sh
运行Postman的相同测试
可以通过URL http://localhost/访问前端
可以通过zpm运行UnitTest,只需要进入iris会话
$ docker-compose exec server iris session iris
Node: 0790684cf488, Instance: IRIS
CONDUIT>zpm
zpm: CONDUIT>test realworld [realworld] Reload START
[realworld] Reload SUCCESS
[realworld] Module object refreshed.
[realworld] Validate START
[realworld] Validate SUCCESS
[realworld] Compile START
[realworld] Compile SUCCESS
[realworld] Activate START
[realworld] Configure START
[realworld] Configure SUCCESS
[realworld] Activate SUCCESS
[realworld] Test START
Use the following URL to view the result:
http://172.22.0.3:52773/csp/sys/%25UnitTest.Portal.Indices.cls?Index=48&$NAMESPACE=CONDUIT
All PASSED
[realworld] Test SUCCESS
zpm: CONDUIT>
默认使用Vue前端,但也能运行Angular和React
web=angular docker-compose up -d --build web
web=react docker-compose up -d --build web
web=vue docker-compose up -d --build web
通过ZPM安装
InterSystems IRIS部分(后端)可以通过ZPM安装
USER>zpm
zpm: USER>install realworld [realworld] Reload START
[realworld] Reload SUCCESS
[realworld] Module object refreshed.
[realworld] Validate START
[realworld] Validate SUCCESS
[realworld] Compile START
[realworld] Compile SUCCESS
[realworld] Activate START
[realworld] Configure START
[realworld] Configure SUCCESS
[realworld] Activate SUCCESS
zpm: USER>
它将创建`/conduit` Web应用程序,只要设置正确的端口,也能用newman进行测试。
APIURL=http://localhost:52773/conduit ./run-api-tests.sh
可以用ZPM进行UnitTest
zpm: USER>test realworld [realworld] Reload START
[realworld] Reload SUCCESS
[realworld] Module object refreshed.
[realworld] Validate START
[realworld] Validate SUCCESS
[realworld] Compile START
[realworld] Compile SUCCESS
[realworld] Activate START
[realworld] Configure START
[realworld] Configure SUCCESS
[realworld] Activate SUCCESS
[realworld] Test START
Use the following URL to view the result:
http://172.17.0.2:52773/csp/sys/%25UnitTest.Portal.Indices.cls?Index=4&$NAMESPACE=USER
All PASSED
[realworld] Test SUCCESS
备注
在开发这个项目的过程中,我遇到了一些问题。
%JSON.Adaptor
它在导入全新对象时效果非常好。但如果需要部分更新现有对象,则%JSONImport对于来源JSON中应该有的必需字段无效。
所以我没用%JSONImport更新对象,而是用了一个从传入的JSON到对象的简单集(如果定义了值)。
只能导出到字符串、流和输出设备。无法导出到原生JSON
API需要返回被另一个对象(属性被命名为返回对象的类型)包装的任何对象。并用%JSONExportToString解决了这个问题,对于数组,将其转换为原生JSON
忽略空集合属性(如:数组和列表)的导出。虽然应用程序可能期望得到字段的空数组,但它根本没有得到任何字段
这个问题没解决。太棘手,只能在%JSON.Adapter端解决。
%REST - REST实现的生成器及REST实现本身
即使没有任何更改,`spec`类的任何编译都会更新`impl`类。因此,切记保持生成的部分(如:方法名、参数列表和变量名)不变,否则将会被下一次`spec`编译重写,这可能会在构建用于生产的应用程序时发生。
REST可以有`/users/` 端点,也能获取`/users/`请求,在这种情况下,两者效果相同。但如果只定义了第一种方式,REST就不能识别第二种方式。
要解决这个问题,必须修改swagger规范,只复制带新端点`/users/`的`/users/`
Swagger规范定义了参数化请求的默认值,而生成器忽略了
在方法/生成器的代码中手动设置默认值可能会重写方法定义,而参数的设置默认值将被删除。所以可能在部署后破坏实现。
%REST.REST中的方法不可用于覆盖,仅由`disp`类使用,且将被`spec`类的编译完全重写。
无法访问实例的OnPreDispatch方法,也就无法进行更多控制,如:检查访问
Swagger规范定义了哪些端点是公共的,哪些需要授权。%REST生成器无法使用。
API必须用JWT来授权请求,且必须手动检查哪个端点需要检查访问。超出了%OAuth2实现的范围,在IRIS中使用JWT也很麻烦。
在`impl`类中生成的方法应该返回原生JSON对象、流或字符串。但我认为如果它也能接受%JSON.Adaptor对象就很好。
无论如何,实现这样的应用程序是非常有趣的。至少知道了可以用IRIS来实现。
这个应用程序使用了IRIS的这些特性
原生JSON + %JSON.Adaptor
REST,及其遵守swagger规范的实现生成器
OAuth2的JWT
容器化
竞赛
这个项目正在参加InterSystems全栈竞赛,如果您喜欢请投票。
公告
Claire Zheng · 一月 26, 2021
亲爱的社区开发者们!
本周进入 InterSystems多模型数据库竞赛的投票环节!是时候为你所认可的最佳方案投票了!
🔥 投票通道: 点击投票 🔥
如何投票?
使用我们全新的投票引擎和算法提名专家(Experts)和社区提名,您可以选择3个项目,分别投出心目中的第一、第二和第三位。
以下是社区排行榜说明:
社区排行榜:
名次
得分
1st
3
2nd
2
3rd
1
专家(Experts)排行榜会有更复杂的数学计算,不同级别的专家有更多的“点数”权力:
专家(Experts)排行榜:
级别
名次
1st
2nd
3rd
VIP级:总经理,版主,产品经理
9
6
3
Global Masters中的专家(Expert)级
6
4
2
Global Masters中的专业(Specialist)级
3
2
1
专家投票也将为按“3-2-1”为社区排行榜贡献出分数。
投票说明
投票在 Open Exchange 竞赛页面 ,用户需要登录 Open Exchange 进行投票(使用开发者社区的账号即可登录)。
投票后您可以取消投票,将宝贵的票票投给其他更心仪的项目,
参赛者可以在投票周修复bug并进一步改进程序,欢迎订阅程序发布,不要错过 !
➡️ 请查收最新的 InterSystems在线竞赛投票规则.
注:本文为译文,欢迎点击阅读原文,原文由Anastasia Dyubaylo撰写。
文章
Louis Lu · 四月 15, 2021
InterSystems IRIS 下使用 DataOps .png)
Gartner 对 DataOps 的定义是:“DataOps 是一种协作式的数据管理方法,侧重于改善整个组织中数据管理者和数据消费者之间数据流的沟通、整合与自动化。 DataOps 的目标是创建可预测的数据、数据模型和相关项目的交付和变更管理,从而更快地交付价值。 DataOps 采取特殊技术手段和相应治理水平自动化数据交付的设计、部署和管理,以元数据提高动态环境中数据的易用性和价值。”
2014 年 6 月 19 日,InformationWeek 特约编辑 Lenny Liebmann 发表于 IBM Big Data & Analytics Hub 的题为“3 reasons why DataOps is essential for big data success”的文章中首次提出 DataOps 这一概念。 DataOps 一词后被 Andy Palmer 推广到 Tamr。 DataOps 是“数据运营”的专属名称。 2017 年对 DataOps 来说是意义重大的一年,生态系统取得巨大发展,分析师覆盖范围进一步扩张,关键字搜索量以及调查、出版物和开源项目数均有所提升。 Gartner 在 2018 年的 Hype Cycle for Data Management 中添加了 DataOps 。 (资料来源:)
DataOps 宣言确立了以下 DataOps 原则:()
1. **持续满足客户需求**:我们的首要任务是在几分钟到几周内及尽早并持续交付有价值的内容给客户,并以此满足客户的需求。
2. **有价值工作的分析**:我们认为评价工作效率的主要度量指标是,提交了多少深度分析的内容、产出多少高准确度的数据以及在顶层框架和系统中贡献了多少。
3. **拥抱变化**:我们并不抗拒客户需求的变化,事实上,我们欣然接受这些变化,并以此产生竞争优势。 我们相信,与客户直接交谈是最高效、最实用、最敏捷的沟通方式。
4. 这是一项团队运动:分析团队将始终具有各种角色、技能、偏好工具和头衔。 多元化的背景和意见可以提高创新力和生产力。
5. **日常互动**:客户、分析团队和运营必须每天都在整个项目中协同工作。
6. **自发组织**:我们相信,最好的分析见解、算法、架构、需求和设计都来自于自发组织的团队。
7. **减少英雄主义**:对于分析的深度和广度,需求正在加速扩大,我们认为分析团队应尽力减少英雄主义,创建可持续且可扩展的数据分析团队和流程。
8. **反思**:分析团队应定期根据客户、自身和运营统计提供的反馈意见开展自我反思,优化运营绩效。
9. **分析即代码**:分析团队使用各种工具对数据进行访问、集成、建模和可视化。 从根本上讲,每种工具都会生成代码和配置,这些都会对数据进行操作,从而为进一步理解数据提供帮助。
10. **编排**:从头到尾编排数据、工具、代码、环境以配合分析团队的工作,这是分析成功的关键因素。
11. 使其可复现:结果需要可复现,我们对所有内容进行版本控制:包括数据、底层硬件、软件配置以及特定于工具链中各工具的代码和配置。
12. **一次性的工作环境**:我们认为,必须为分析团队成员提供易于创建、隔离、安全并能反映其生产环境的一次性工作环境,从而最大程度地降低分析团队的实验成本。
13. **简洁性**:我们认为,持续关注卓越的技术和良好的设计不仅可以提高敏捷性,也可以提高简洁性,特别是突出显示未完成的工作量。
14. **分析即生产**:分析管道类似于精益生产线。 我们认为,DataOps 的一个基本概念是注重过程思维,提升分析及生产的效率。
15. **质量至上**:分析管道在基础上应该有能力自动检测代码、配置和数据中的异常 (jidoka) 与安全问题,并应向操作员提供持续反馈以避免错误 (poka yoke)。
16. **监视质量和性能**:我们的目标是对性能、安全和质量措施进行持续监视,及时发现意外变化并生成运营统计信息。
17. **重用**:我们认为,提升分析及生产效率的一个基本方面是避免个人或团队重复以前的工作。
18. **缩短周期时间**:从将客户需求转化为分析思路,到在开发中创建、并作为可重复生产的流程发布,再到最后的重构和重用产品,我们应尽全力将这一周期耗费的时间和精力降到最低。
当您分析这些原则时,也许会发现 InterSystems IRIS 能够在某些方面起到作用:
* 持续满足客户需求:您可以通过冲刺或迭代创建新的短集成产品、编排、IRIS 多维数据集、报告、BI 可视化和 ML 模型。
* 有价值工作的分析:IRIS 帮助您提供高质量的数据(在持久化类中使用production、适配器和类方法),并使您能够在 IRIS BI 数据透视表(分析设计器)和 IRIS NLP(文本分析)中进行数据探索。
* 自组织:IRIS 简化了自组织,借助统一的数据平台,您只需一个工具即可收集、处理、分析和发布见解。
* 反思:您可以通过此用户门户与用户互动并收集反馈,以改进交付的产品。
* 分析即代码:在 IRIS 数据模型中,多维数据集、仪表板都是代码,具有版本控制和治理功能。
* 编排:IRIS 数据平台可在单个工具中编排数据的引入、扩充、分析工作、数据可视化和 ML。
* 使其可复现:IRIS 支持使用 Docker、Kubernetes (IKO) 和 DevOps 复现结果。
* 一次性环境:IRIS 支持为集成、数据模型、BI 多维数据集和可视化创建 Docker 一次性环境。
* 简洁性:IRIS 数据多维数据集的创建非常简单,无需创建 ETL 脚本,分析器、多维数据集、仪表板的创建均实现可视化和网络化,并且可由用户而不仅是开发者团队完成。 同时,IntegratedML 允许在没有源代码开发的情况下针对常见场景创建 ML。
* 监视质量和性能:IRIS 使用 SAM 监视性能并具有 Web 管理门户。
* 重用:在 IRIS 中,DataOps 项目是类,这些类默认可扩展、可重用。
* 缩短周期时间:用户可以通过自助服务创建仪表板、分析、报告,以及发布和共享工作。
ODSC () 指出以下 DataOps 策略:
InterSystems IRIS 对以上几点均有所帮助:
* 自助服务配置:用户可以创建和发布多维数据集与仪表板。
* 共享、标记、注解:用户门户可用于共享仪表板,IRIS Analytical Web Portal 允许用户创建、记录、整理到文件夹并标记您的工作。
* 扩充:BPL 可用于扩充数据。
* 准备:BPL、DTL、适配器和 ObjectScript 逻辑可以帮助准备数据。
* 数据市场:数据资产可以发布到 REST API 并通过 IRIS API Manager 获利。
* 数据目录:IRIS 中的数据被组织成类,这些类被存储在类目录系统 (%Dictonary) 中
* 配置文件与分类:可在用户门户和管理门户中为分析项目创建组、文件夹。
* 质量:IRIS 具有实用工具类,可生成示例数据和进行单元测试。
* 沿袭:在 IRIS 中,所有数据资产都相互连接,您可以从数据模型构建多维数据集,再从多维数据集构建仪表板,所有数据资产均可由数据管理者(IRIS 权限系统)控制。
* 掌控:通过管理门户,您可以掌控分析项目的各个方面。
* 数据库数据、文件数据、SaaS API、流:IRIS 为多模型,支持持久性以及数据和文本分析 (NLP)。 以 IRIS API Manager 支持 SaaS API,以 Integration Adapters 和 PEX(带有 Kafka)与 Streams 结合使用。
* 应用程序、BI 工具、分析沙盒:通过 IRIS,您可以使用您喜欢的语言(Java、Python、.NET、Node.js、ObjectScript)创建 DataOps 应用。 虽然 IRIS 是 BI 工具,但是在这个工具中,您可以将连接器与 Power BI 或 MDX 桥结合使用,将 IRIS 作为分析沙盒。
参见我反映 IRIS 和 DataOps 的汇总:
.png)
公告
Claire Zheng · 四月 7, 2021
亲爱的开发者们!
现在你可以在InterSystems开发者社区找工作啦!在开发者社区发帖,你可以为自己找一份心仪的工作,也可以为你的公司寻找合适的人才!
那么,具体怎么操作呢?
在顶部菜单栏找到"职位" 版块:
在这里,你可以发现:
工作机会:
你可以找到需要InterSystems技术能力的工作机会;
求贤:
在这里,你可以发帖寻找具备InterSystems数据平台技术能力的优秀人选,在“所需技能”等相关描述中应包含对InterSystems技术的需求。
所以,如果你:
想为拥有InterSystems技术的人提供一个工作机会,或
拥有InterSystems技术能力,且正在寻找新的工作机会
就可以在社区发帖,当然,请在你发的帖子中加入相关tags:
工作机会
求职
以下是一份超简单的发帖攻略:
找到 职位 并点击 "新工作机会" 按钮,, 就可以创建相关帖子。
欢迎你尝试这个新功能,在这里找到合适的员工,在这里找到心仪的工作😉
如果有任何疑问,跟帖讨论与我们联系吧!
Precautionary measures:
InterSystems 不保证招聘信息及其他在本网站发布信息的准确性
InterSystems 对因本网站所公布的信息而造成的任何损失概不负责,请直接与招聘人员或申请人确认内容及条件
更多内容,请查看 InterSystems开发者社区行为准则.
文章
Michael Lei · 二月 19, 2024
世界各地的医院和医疗系统、支付方、技术提供商和研究人员都使用InterSystems解决方案来打破互操作性障碍,简化FHIR应用程序的开发和交付工作。
SMART on FHIR 应用
纽约州健康信息网络Hixny使用InterSystems HealthShare Unified Care Record®,为美国最大的公共卫生信息交换机构Healthix开发了一个SMART on FHIR应用程序。每当临床医生查看患者记录时,该创新应用程序都会并排显示患者的社交和病史。该解决方案允许临床医生评估健康的社会决定因素,并直接从其现有的应用程序和工作流程中进行社会服务转介,从而简化互动并提高提供者的效率。HealthShare Unified Care Record 使 Hixny 能够轻松地以单一、一致的格式维护所有数据,无论其来源如何。
数据转换
英国林肯郡NHS使用InterSystems HealthShare和InterSystems HealthShare护理社区来支持一个综合护理门户,并为当地护理团队和患者提供个性化的护理计划。InterSystems解决方案使医生、护士、健康从业者、护理提供者和护理经理能够在任何环境中有效地共享信息并协调护理。Care Community 通过提供对准确治疗计划和患者偏好的全面和即时访问,帮助护理提供者节省时间和精力,并改善护理质量和患者体验。临床医生使用护理门户在就诊前查看患者记录和护理计划,从而提高准备情况并简化咨询和基于社区的就诊。这种方法有助于NHS改善人口健康,并通过将护理从医院转移到更接近林肯郡公民的地方来降低护理成本。
Leumit Health Services是以色列四大健康维护组织之一,作为患者信息亭项目的一部分,它使用InterSystems IRIS for Health在支付机构和医疗服务系统之间交换数据。该集成解决方案通过在登记时以电子方式验证患者的保险资格来改善患者体验,从而取代了耗时的手动流程。Leumit将InterSystems FHIR服务器作为FHIR的Facade,以简化和加快集成工作。(FHIR Facade相当于中间件,它通过将旧数据转换为 FHIR 格式,将现代 FHIR 应用程序与旧医疗保健系统互通。使用Facade方法时,历史数据仍保留在其原始源中以原始格式保存。InterSystems FHIR服务器自动将数据实时转换并转换为FHIR格式,以响应查询,而无需额外的数据存储。
中东的一家私立医院集团使用InterSystems HealthShare Health Connect为远程患者监测应用提供动力。InterSystems解决方案打破了互操作性障碍,将FHIR格式的数据转换为XML,将家庭患者监护系统与医院集团的EHR系统和其他临床应用程序无缝连接。远程监控计划通过改善家庭护理和减少再入院率,帮助医院集团控制护理成本并改善临床结果和患者满意度。
查询 FHIR 数据
Pria是一家创新的医疗技术公司,使用InterSystems HealthShare Health Connect作为其老年人居家健康解决方案的基础。Pria Wellhub是一个语音激活的交互式家庭健康平台,包括健康管理和监测工具,并提供实时警报和通信功能。Pria 使用 HealthShare Connect 将 Wellhub 平台连接到不同的电子病历系统和医疗保健应用程序。InterSystems解决方案使Pria能够轻松地将FHIR格式的家庭中心数据传播给临床医生和个人护理人员。
基于FHIR的数据分析
一家领先的医疗设备制造商使用InterSystems IRIS for Health来快速、大规模地收集和分析设备数据。InterSystems解决方案将设备性能数据、患者报告结果测量(PROM)数据和其他数据转换为通用的FHIR格式,以便进行直接分析。该解决方案消除了对单独分析存储库的需求,从而降低了成本和系统复杂性。InterSystems IRIS for Health SQL Builder使制造商的数据科学家能够使用熟悉的SQL分析工具有效地查询和分析数据。该解决方案使制造商能够向监管机构提供设备合规性的证据。它还提高了对人口健康数据的可见性,并提供可操作的见解,以帮助个体患者更好地管理疾病和检测早期预警信号。
以色列卫生部使用InterSystems IRIS for Health来有效地存储和分析来自分散在全国各地的不同医院EHR系统的人口健康数据。InterSystems IRIS for Health SQL Builder使检查大型FHIR格式的数据集变得容易,帮助卫生部简化流行病学调查,加速发现,并遏制传染病的传播。此外,它还以 FHIR 格式收集信息,例如遗传疾病、死亡和其他人口统计数据。
eHealth Exchange 是一个连接美国联邦机构和非联邦医疗保健组织的网络网络,因此可以在全国范围内交换医疗数据。eHealth Exchange活跃于所有50个州,建立在InterSystems HealthShare之上,是该国最大的基于查询的健康信息网络。美国食品和药物管理局的生物制品有效性和安全性 (BEST) 计划使用 eHealth Exchange 从 EHR 系统中检索人口健康数据。更具体地说,BEST 使用 FHIR 来查询 EHR 系统,以获取有关对生物制品有不良反应的个人的数据。该解决方案简化了监测和流行病学研究,帮助 FDA 确保国家疫苗、血液制品和先进疗法的安全性和有效性。
结论
FHIR 可以帮助您打破互操作性障碍,并将原始健康和护理数据转换为有意义且可操作的信息。它可以帮助您更快、更轻松地访问来自不同来源的数据,从而提高几乎任何医疗保健服务、流程或产品的质量、效率和安全性。
InterSystems拥有产品、专业知识和合作伙伴,可以帮助您自信地开发、交付和扩展FHIR应用。欢迎随时联系我们InterSystems了解如何帮助您的组织快速引入FHIR并取得成果。
公告
Claire Zheng · 七月 29, 2021
亲爱的社区开发者们,大家好!
InterSystems 开发者竞赛:人工智能与机器学习 圆满结束,现已决出优胜者!
让我们把掌声送给以下开发者!
🏆 专家提名奖(Experts Nomination)- 获奖者由我们特别挑选的专家团选出:
🥇 第一名 奖金 $4,000 项目链接 fhir-integratedml-example 作者 @José.Pereira and @Henrique
🥈 第二名 奖金 $2,000 项目链接 ESKLP 作者 @Aleksandr.Kalinin6636
🥉 第三名 奖金 $1,000 项目链接 cryptocurrency-rate-forecasting 作者 @Oleh.Dontsov
🏆 社区提名奖(Community Nomination)- 获得总投票数最多的应用:
🥇 第一名 奖金$1,000 项目链接 fhir-integratedml-example 作者 @José.Pereira and @Henrique
🥈 第二名 奖金 $500 项目链接 cryptocurrency-rate-forecasting 作者 @Oleh.Dontsov
🥉 第三名 奖金 $250 项目链接 iris_satellite_plantation 作者 @Renato.Banzai
恭喜获奖者!
感谢大家对本次比赛的关注和付出!
文章
Qiao Peng · 二月 6, 2021
在本文中,我们将讨论一个我每天都会使用的应用程序,当监控 InterSystems IRIS 平台上的应用程序和集成解决方案并查找所发生的错误时,我就会用到它。
在查找用来记录 InterSystems IRIS、Ensemble 和 Caché DBMS 中对象变化的解决方案时,我发现了一篇关于[使用宏进行日志记录](https://community.intersystems.com/post/logging-using-macros-intersystems-cach%C3%A9)的好文章。 受到该文章的启发,我对其介绍的项目进行了分叉,并做了相应调整以满足一些特定需求。 生成的解决方案以面板子类 %CSP.Util.Pane 的形式实现,它具有主命令窗口、“Run”(运行)按钮和已启用的命令配置。
该应用程序允许查看和编辑 global 数组、执行查询(包括 JDBC 和 ODBC)、通过电子邮件发送搜索结果(压缩的 XLS 文件)、查看和编辑对象,以及用几个简单图表来表示系统协议。
该 apptools-admin 应用程序基于 jQuery-UI、UiKit、chart.js 和 jsgrid.js。 欢迎查看[源代码](https://openexchange.intersystems.com/package/apptools-admin)。
### 安装
仓库中详细介绍了所有安装方法。 但是,最简单的方法是使用包管理器命令:
```
zpm "install apptools-admin"
[apptools-admin] Reload START
[apptools-admin] Reload SUCCESS
[apptools-admin] Module object refreshed.
[apptools-admin] Validate START
[apptools-admin] Validate SUCCESS
[apptools-admin] Compile START
[apptools-admin] Compile SUCCESS
[apptools-admin] Activate START
[apptools-admin] Configure START
http://hp-msw:52773/apptools/apptools.core.LogInfo.cls
http://hp-msw:52773/apptools/apptools.Tabs.PanelUikitPermissMatrx.cls?autoload=Matrix
[apptools-admin] Configure SUCCESS
[apptools-admin] Activate SUCCESS
```
第一个建议链接必须在浏览器的地址字段中打开。 在加载的面板中输入 `?` ,然后按“Execute”(执行)按钮。 应用程序随后会显示命令示例。

### 命令
在面板中,您可以运行实用工具,查看和编辑 global,以及执行查询。 每次启动都保存在命名空间上下文的历史记录中,因此可以找到并重复。 在此上下文中,“启动”表示开始执行命令,命令表示我们在面板中输入的所有内容。 下面的屏幕截图显示了 global 数组 `^%apptools.History` 查看命令的示例

如您所知,自动错误检测和通知可以由流行的解决方案(例如 Prometheus)处理。 但通常可以通过视觉评估错误的严重性。
我经常需要快速获取所有命名空间中的生产错误信息。 为此,我实现了一个实用工具:
`##class(apptools.core.Production).FindAndDrawAllErr`
这会启动一个每日搜索请求,用于查找每个包含工作产品的命名空间中的错误,并允许通过快速转换到可视化跟踪来查看这些错误。 您可以在 apptools 面板中像运行其他任何程序一样运行此实用工具,只需加上 `xec` 前缀。 
所有有用命令都可以保存在作用域上下文的 global 扩展中,以便随时查找和重复。

### Global
apptools-admin 应用程序的很大一部分专门用于处理 global。 可以按倒序查看 global,还可以对链接和数据应用筛选。 显示的注释可以进行编辑或删除。

您可以在 global 名称后输入 `*` 通配符,以获得具有附加特征的 global 列表。
第二个 `*` 将添加一个新字段“Allocated MB”(已分配 MB)。
第三个将添加“Used MB”(已使用 MB)字段。 此语法解析为两个报告的结合,星号将通常较长的报告分成易管理的部分。 
当您获取 global 列表形式的报告时(上面的屏幕截图中),可以点击活动链接来查看 global 本身。 还可以在管理门户中点击“`Permission`”(权限)字段中的 `R` 或 `W`,以标准方式查看和编辑 global。
通常,在调试项目时,对 global 的写操作用于记录变量和对象的状态。 为此,我使用特殊宏:
`set $$$AppL("MSW","anyText")=$$$AppObJs(%request)`
在此示例中,`$$$AppL` 为一个带 `^log` 前缀的 glob 以及索引值中的日期和时间形成链接。
`$$$AppObJs` 是对象序列化宏。

您可以在面板中查看协议 global,对象可以在窗口中以完全格式化的形式显示。
### 查询
与 global 的使用几乎一样多的功能是查询。 通过输入命令形式的语句来运行此功能。
例如,可以执行一个 SQL 语句。 
还可以将结果保存在 global `^mtempSQLGN` 中。 
随后,global 中保存的结果可以显示在面板中。 
### 将报告转换为 Excel 格式
标准管理门户缺少的一项功能是执行数据库 JDBC 或 ODBC 源中配置的查询,输出 XLS 格式的结果,然后将文件存档并通过电子邮件发送。
要在应用程序中实现此功能,只需在执行命令之前选中“Upload to Excel file”(上传到 Excel 文件)复选框。
这个功能为我的日常工作节省了很多时间,让我可以成功地将现成模块融入到新的应用程序和集成解决方案中。 
要启用此功能,首先需要配置服务器上用于创建文件的路径、用户凭据以及邮件服务器。 为此,又需要编辑全局程序设置 `^%apptools.Setting` 的节点。 
### 全局保存报告
通常,您需要将报告执行的结果保存到 global。 为此,可以使用以下程序:
| | 函数 |
| -------- | -------------------------------------- |
| 对于 JDBC: | ##class(apptools.core.sys).SqlToDSN |
| 对于 ODBC: | ##class(apptools.core.sys).SaveGateway |
| 对于 SQL: | ##class(apptools.core.sys).SaveSQL |
| 对于查询: | ##class(apptools.core.sys).SaveQuery |
例如,使用 `##class(apptools.core.sys).SaveQuery` 函数,将查询 `%SYSTEM.License:Counts` 的结果保存到 global `^mtempGN` 中。 
然后可以使用以下命令在面板中显示已保存的内容:
`result ^mtempGN("%SYSTEM.License:Counts", 0)`
https://lh5.googleusercontent.com/KCIekwZw3guq79GWxVdHYdAbWQc4u97-dr-hWT26lYE2oEzUTSkwCE4ki1zvNqRFBg6dKQshSqcy3YSgUbjFKgX3v7Ecpa5Bm_NEQuZhP8Fn8p1gzrmAdTR-Cg9jBeVcNWGukW3a
### 增强功能模块
还有什么简化和自动化了我的工作? 就是让我能够在形成查询字符串时执行自定义模块的更改。 我可以将新功能即时嵌入到报告中,例如用于对数据执行其他操作的活动链接。 让我们看一些示例。
我们使用以下函数在浏览器中显示查询结果:
`##class(apptools.core.LogInfoPane).DrawSQL`
 让我们将字标记函数 `##class(apptools.core.LogInfo)`.MarkRed 添加到参数 5 中。  同样,可以为输出补充其他功能,例如,活动链接或工具提示。
本解决方案中的 global 编辑器根据同样的原理实现。
以下是以表格形式输出 global 和查询的函数列表:
| | 函数 |
| ------------- | ----------------------------------------------------------------------------- |
| 对于 global: | ##class(apptools.core.LogInfoPane).DrawArray("^mtempSQLGN") |
| 对于 SQL: | ##class(apptools.core.LogInfoPane).DrawSQL("select * From %SYS.ProcessQuery") |
| 对于查询: | ##class(apptools.core.LogInfoPane).DrawSQL("query %SYSTEM.License:Counts") |
| 对于 global 结果: | ##class(apptools.core.LogInfoPane).DrawSQL("result ^mtempSQLGN") |
使用 apptools.core.Parameter 类 在安装了 apptools-admin 的实例的上下文中,此链接将在浏览器中打开 CSP 应用程序。
`http://localhost:52773/apptools/apptools.Form.Exp.cls?NSP=APP&SelClass=apptools.core.Parameter`
或在面板中选择活动链接。  将加载 CSP 应用程序以编辑存储类的实例,在此示例中: `apptools.core.Parameter`。  
### 通过表导航器创建 apptools.core.Parameter
在安装了 apptools-admin 的实例的上下文中,如果在浏览器中打开此链接:
`http://localhost:52773/apptools/apptools.Form.Exp.cls?panel=AccordionExp&NSP=APP`
或在面板中选择活动链接。 
将加载 CSP 应用程序以导航存储类,并能够编辑它们。 
### 简单 CSP 应用程序的示例
在安装了 apptools-admin 的实例的上下文中,如果在浏览器中打开此链接:
`http://localhost:52773/apptools/apptools.Tabs.PanelSample.cls`
或在面板中选择活动链接。  此示例还显示了编辑类实例 `apptools.core.Parameter` 的能力。 
### 图表
为了直观展示数据库的增长,应用程序提供了一个图表页面,显示每月测量的数据库大小。 该图表来源于 IRIS file.log(对于 Caché 则为 cconsole.log)中从当天向回“扩展”的记录。
程序会遍历协议,找到数据库扩展记录,并从当前数据库大小中减去增量的兆字节。 最终生成数据库增长的图表。
例如,下面的屏幕截图显示了 InterSystems IRIS 中通过协议文件形成的事件图。 
下面是另一个示例:系统中的事件时间表,基于系统协议 file.log (cconsole.log)。 
### 总结
我们在本文中讨论的应用程序旨在帮助我执行日常任务。 它包括一组模块,您可以将它们用作自定义管理员工具的构建块。 如果您觉得它对您的工作有用,我会非常高兴。 欢迎将愿望和建议作为任务添加到项目[仓库](https://github.com/SergeyMi37/apptools-admin)。
文章
Claire Zheng · 十二月 3, 2021
InterSystems面向中国用户推出InterSystems IRIS医疗版互联互通套件,以满足医院信息化建设的标准化要求,促进业务协同,助力公立医院高效建设互联互通平台。