嗨社区,
这篇文章公开介绍我的 iris-fhir-client 客户端应用。
iris-fhir-client 可以可以借助嵌入式 python 连接到任何开放的 FHIR 服务器 fhirpy 图书馆.
通过终端和使用 CSP Web 应用程序获取资源信息。
InterSystems ObjectScript 是一种脚本语言,可使用 InterSystems 数据平台的任何数据模型(对象、关系、键值、文档、全局变量/Global)处理数据,并在 InterSystems 数据平台上为服务器端应用程序开发业务逻辑。
文档。
嗨社区,
这篇文章公开介绍我的 iris-fhir-client 客户端应用。
iris-fhir-client 可以可以借助嵌入式 python 连接到任何开放的 FHIR 服务器 fhirpy 图书馆.
通过终端和使用 CSP Web 应用程序获取资源信息。
在这篇文章中,你可以访问InterSystems开发者社区中与学习InterSystems IRIS最相关主题的文章库。找到按机器学习、嵌入式Python、JSON、API和REST应用、管理和配置InterSystems环境、Docker和云、VSCode、SQL、分析/BI、全局、安全、DevOps、互操作性、Native API排列的顶级发表的文章。快来享受学习的乐趣吧!
机器学习是建立先进的数据分析和自动化人工活动的一种必要的技术,具有很好的效率。它可以创建认知模型,从现有的数据中学习,并根据其自我调整的算法进行预测、概率计算、分类、识别和 "非创造性 "的人类活动的自动化。
在所有情况下,InterSystems IRIS作为一个数据平台和环境来创建、执行、提供和使用这些机器学习模型。IRIS能够从SQL命令(IntegratedML)中使用ML,使用嵌入式Python和PMML(预测模型标记语言)来执行ML。你可以在以下文章中查看它的功能:
|
标题 |
描述 |
地址URL |
|---|---|---|
|
一体化机器学习动手实验 |
一体化机器学习概览ML |
在Caché基础课程中,同学们同时学习了Caché开发和ObjectScript语法。为了帮助大家完成练习,我们提供了ObjectScript快速参考(俗称 "小抄")。
它不是所有ObjectScript的参考资料! 它是学生在课程中使用的ObjectScript命令和函数的列表,以及对象、集合等的常用语法。它还包含一些有用的宏。
我们正在为开发者社区提供一个pdf版本。
有时,有必要从主机操作系统的Shell(即你的ObjectScript程序所在的地方)执行命令,以启动程序、操作系统服务、安排crontasks以及其他活动。为此,该语言有一个叫做$ZF(-100). 的实用程序:
$ZF(-100,flags,program,args)
其中flags是你想执行的命令的类型。在我们的例子中,标志是"/ SHELL",用于在主机操作系统上执行shell命令。
Program是要执行的程序或服务的名称。
Args是传递给程序的执行参数。
一个例子是在提示符下打印一些内容,例如:
$ZF(-100,"/SHELL","echo","https://www.intersystems.com/")
如果你的程序依赖于改变当前目录,要运行该程序,在调用前使用以下命令:
Do ##class(%SYSTEM.Process).CurrentDirectory("/path/")ObjectScriptt至少有三种处理错误的方法(状态代码status codes、异常 exceptions, SQLCODE等)。大多数系统代码使用状态码,但由于一些原因,异常更容易处理。在处理遗留代码时,你要花一些时间在不同的技术之间进行转换。我经常使用这些片段作为参考。希望它们对其他人也是有用的。
///Status from SQLCODE:set st $$$ERRORClass Extends
假设有一个类 "X.Y.Z"
它的SQL表名称是什么?如何通过ObjectScript获取??
快速的搜素不能显示任何方法或属性。文档有点 "不对" 说 SQL 表名称是一样的. 至少应该是 'x_y.z'.
答案见英文社区:https://community.intersystems.com/post/getting-sql-table-name-given-cl…
我现在在使用object script。如果把代码从 objectscript转成 Java 我需要做些什么?
在前一篇文章中,我已经演示了一种简单的方法来记录数据的变化。在这个时候,我改变了负责记录审计数据的 "审计抽象类 "和记录审计日志的数据结构。
我已经将数据结构改为父子结构,其中将有两个表来记录 "交易 "和在该交易中改变的 "字段的值"。
看一下新的数据模型:

看看从 "审计类 "改变的代码吧:
下面的代码允许用户查看其实例的审计设置。通过运行类方法 "test "来运行该代码。:
class objectscript.checkAudit Extends %RegisteredObject
{
classmethod test() {
w "Checking for Auditing...",!
Set SYSOBJ = ##class(Security.System).%OpenId("SYSTEM")
If +SYSOBJ = 0 Set SYSOBJ = ##class(Security.System).%New()
i SYSOBJ.AuditEnabled {
w "Security Auditing is enabled for the following services",!
s rs=##class(%ResultSet).%New("Security.Events:ListAllSystem")
s sc=rs.Execute() If $$$ISERR(sc) Do DisplayError^%apiOBJ(sc) Quit
while rs.%Next() {
d:rs.Data("Enabled")="Yes" rs.%Print()
}
d rs.Close()
s rs=##class(%ResultSet).%New("Security.Events:ListAllUser")
s sc=rs.Execute() If $$$ISERR(sc) Do DisplayError^%apiOBJ(sc) Quit
while rs.%Next() {
d:rs.Data("Enabled")="Yes" rs.%Print()
}
d rs.Close()
}
}
这是一个在InterSystems IRIS中用python和objectscript建立的对比测试。
测试目的是比较在python和objectscript中从BP到BO来回发送一千条请求/消息的速度。
更多信息,请访问 https://github.com/LucasEnard/benchmark-python-objectscript。
重要提示 : 这里用的是python, graph objectscipt和objectscript从一个BP到一个BO来回发送1000条消息的时间,单位是秒。
字符串信息是由十个字符串变量组成。
对象信息由十个对象变量组成,每个对象都是它自己的int、float、str和List(str)。
| 消息字符串 | 1000条消息来回的时间 (秒) |
|---|---|
| Python BP | 1.8 |
| BPL | 1.8 |
| ObjectScript | 1.4 |
| 消息对象 | 1000条消息来回的时间 (秒) |
|---|---|
| Python BP | 3.2 |
| BPL | 2.1 |
| ObjectScript | 1.8 |
行中函数的时间是列中函数的x倍 :
| 消息字符串 | Python | BPL | ObjectScript |
|---|---|---|---|
| Python | 1 | 1 | 1.3 |
| BPL | 1 | 1 | 1.3 |
| ObjectScript | 0.76 | 0. |
我今天遇到了一个有趣的ObjectScript用例,有一个通用的解决方案,我想与大家分享。
我有一个JSON数组(在本例中具体而言是一个来自Jira的问题数组),我想在几个字段上进行聚合--例如,类别、优先级和问题类型。然后,我想把聚合的数据编平化到一个简单的列表中,其中包含每个组的总数。当然,对于聚合来说,使用一个本地数组的形式是有意义的,即:
agg(category, priority, type) = total
这样,对于输入数组中的每一条记录,我可以只用:
Do $increment(agg(category, priority, type))但是一旦我做了聚合,我想把它变成一种更容易迭代的形式,比如一个整数下标的数组:
简单的方法是,用$Order嵌套三个For循环--比如说:
Set category = ""
For {
Set category = $Order(agg(category))
Quit:category=""
Set priority = ""
For {
Set priority = $Order(agg(category,priority))
Quit:priority=""
Set type = ""
For {
Set type = $Order(agg(category,priority,type),1,total)
Quit:type=""
Set summary($i(summary)) = $listbuild(total,category,priority,type)
}
}
绕过ODBC使用ObjectScript访问远程系统
这是一个在 IRIS 2020.1 和 Caché 2018.1.3 上工作的代码示例
不会与新版本保持同步
也不会获得 InterSystems 提供的支持服务!
我们经常会遇到这样的情况,由于各种原因ODBC是访问一个远程系统的唯一选择。如果你只需要检查或改变表,这就足够了。但你不能直接执行一些命令或改变一些Global。
特别感谢@Anna Golitsyna 启发我发表此文。
这个例子提供了3种 SQLprocedure 方法来实现访问远程系统这个目的,如果其他的访问方式被阻止,通常是被一些防火墙阻止。
Object Script(六)
ObjectScript中的变量是没有类型的,也就是说,它们没有一个指定的数据类型,可以接受任何数据值。
ObjectScript支持以下几种类型的变量:
1. 本地变量 :只有创建它的进程可以访问的变量,当该进程终止时,改变量将自动删除。一个本地变量可以从任何命名空间访问。
示例:
SET str = "A string"
2. 进程私有的全局变量 : 只有创建它的进程可以访问的变量,并且在进程结束时不再存在。一个进程专用的全局变量可以从任何命名空间访问,因为它与命名空间无关。进程私有的全局变量对于临时存储大数据值特别有用。在许多情况下,它们可以替代Mgr/Temp目录的使用,在进程终止时提供自动清理。
示例:
SET ^||flintstones(1)="Fred"
SET ^||flintstones(2)="Wilma"
3. 全局变量 : 一个存储在InterSystems IRIS数据库中的持久性变量。一个全局变量可以从任何进程中访问,并且在创建它的进程终止后仍然存在。全局变量是针对个别命名空间的。
示例:
SET ^myglobal = "This is a global stored in the current namespace"
4.
Object Script(五)
Property PropName as Classname(PARAM1=value,PARAM2=value) [ Keywords ] ;Property SSN As %String(PATTERN = "3N1""-""2N1""-""4N") [ Required ];Studio创建:
将下段代码填写入建好的类中:
ClassMethod FindPatient(id As %String) As HIS.Patient
Terminal 调用:
传入参数的类型分为普通参数,输出型参数和返回参数:
普通参数 (传值参数):
输出型参数(引用) :
返回参数:
包名、类名不能修改,可以用
大家是不是经常遇到以下情况:
Hi, 社区!
想和大家分享一下俄罗斯论坛上的一个Debug方法。
假设我想对应用程序进行Debug,我想让它在某一行停止执行。
在代码中加入这一行:
l +d,-d
当我想在这一行中开始调试时,我在终端中屏蔽了d
USER> l +d
执行该应用程序。
应用程序在这一行停止,让我用Studio调试器连接到它。
为了释放锁,我在终端做了以下工作
还有其他好的Debug 建议吗?
本月我们正式发布VS Code ObjectScript扩展的1.8.0版本,它包含以下增强功能和错误修复。
最大的更新是支持服务器端的项目文件,因为很多人会记得Studio。如果你在客户端工作,VS Code已经有很好的项目管理功能。你可以简单地使用一个文件夹作为一个项目,或者使用多个根目录的工作空间。但是如果你在服务器端工作,你可能会喜欢一些更好的工具管理能力,这就是这个功能的意义所在。更多内容,欢迎查阅文档的新项目章节。
完整的更新日志在这里。
如果您已经安装了ObjectScript扩展,VS Code会自动更新。如果您是一个新用户,请从这里开始。
我一直希望 VSCode 能够拥有熟悉的 Studio 外观。
值得庆幸的是,VSCode 易于定制,因此您可以为任何元素选择任何颜色。
这是我到目前为止得到的:
要获得相同的外观,请添加到您的 settings.json:
有很多方法可以使用Intersystems生成excel文件,其中一些是ZEN报告、IRIS报告(Logi报告或正式称为JReports),或者我们可以使用第三方Java库,可能性几乎是无限的。
但是,如果你想只用Caché ObjectScript创建一个简单的电子表格呢?(没有第三方应用程序)
在我的案例中,我需要生成包含大量原始数据的报告(财务人员喜欢这些数据),但是我的ZEN/IRIS失败了,给了我一个我想称之为 "零字节的文件",基本上说java的内存用完了,并导致报告服务器上的重载。
这可以用Office Open XML(OOXML)来完成。Office Open XML格式是由一个ZIP包内的一些XML文件组成的。因此,基本上我们需要生成这些XML文件,并将其压缩重命名为.xslx。就这么简单。
这些文件遵循一套简单的惯例,称为开放包装惯例。你需要声明各部分的内容类型,以及告诉消费应用程序应该从哪里开始。
为了创建一个简单的电子表格,我们至少需要5个文件。
workbook.xml
工作簿是各种工作表的容器。
要用程序编辑Production(界面),你可以使用互操作性API和SQL查询的组合。
从顶层了解你目前正在工作的命名空间和生产是很重要的。
// Object script
// The active namespace is stored in this variable
$$$NAMESPACE
// Print namespace
Write $$$NAMESPACE
# Python
import iris
# The active namespace is returned from this method
iris.utils._OriginalNamespace()
# Print namespace
print(iris.utils._OriginalNamespace())
>>> DEMONSTRATION
另外,知道你的Production名称是很重要的,你可以使用以下API获得名称空间中正在运行的Production。
// ObjectScript
USER>ZN "DEMONSTRATION"
// Get current or last run production
DEMONSTRATION>W ##class(Ens.Director).GetActiveProductionName()
>>> Hospital.HospitalProduction
HI 开发者们,
我们在bilibili 发布了新的视频!
好人不需要规则。
神秘博士
要成为日期和时间的主人并不是一件容易的事,在任何编程语言中,这总是一个问题,有时会让人感到困惑,我们将澄清并提出一些提示,使这项任务尽可能简单。
坐上TARDIS,我将把你变成一个时间领主。

How to use Studio Coding to do service registration function of service component in production system 如何通过studio代码开发,实现production界面的服务组件的服务注册功能
.png)
@Ming Zhou 在 https://community.intersystems.com/post/how-get-all-properties-defined-c 上问了一个很好的问题......而这个答案正好总结了为什么ObjectScript 是我最喜欢的语言。
当我第一次向别人介绍ObjectScript或IRIS时,我总是解释说,你可以写一个类,编译它,得到一个表,并从对象或关系的角度来处理你的数据--这是一种最自然的方式。
但无论哪种方式,它都只是一个薄薄的包装,包裹着被称为Globals的超级快速的内部数据结构,当你真的需要更快的速度时,你可以使用这些结构。
当我和比较爱较真的技术人员沟通时,我会告诉他们:ObjectScript允许各种炫酷的元编程,因为你可以用完全相同的方式与你刚刚写的类进行交互--从对象或关系的角度。或者在你需要额外的速度时直接使用超快的底层数据结构。
你可以在对这个问题的回答中看到答案: "我怎样才能得到一个类中的所有属性,包括继承的属性?"
这里有三种不同的方式来获得相同的答案。
Class DC.Demo.PropertyQuery Extends %Persistent
{
Property Foo As %String;
Property Bar As %Boolean;
/// Demonstrates all the ways to skin this particular cat
ClassMethod Run()
{
for method = "FromRelationship","WithQuery","AsQuicklyAsPossible" {
write !,method,":"
kill properties
do $classmethod($classname(),"GetProperties"_method,.properties)
do ..Print(.properties)
write !
}
}
ClassMethod Benchmark()
{
for method = "FromRelationship","WithQuery","AsQuicklyAsPossible" {
write !,method,":",!
set start = $zhorolog
set startGlobalRefs = $system.Process.GlobalReferences($job)
set startLines = $system.Process.LinesExecuted($job)
for i=1:1:1000 {
kill properties
do $classmethod($classname(),"GetProperties"_method,.properties)
}
set endLines = $system.Process.LinesExecuted($job)
set endGlobalRefs = $system.Process.GlobalReferences($job)
write "Elapsed time (1000x): ",($zhorolog-start)," seconds; ",(endGlobalRefs-startGlobalRefs)," global references; ",(endLines-startLines)," routine lines",!
}
}
/// Get properties using the properties relationship in %Dictionary.CompiledClass
ClassMethod GetPropertiesFromRelationship(Output properties)
{
// Minor problem: %OpenId and Properties.GetNext() are slow because they load more data than you strictly need.
// More global references = it takes longer.
set class = ##class(%Dictionary.CompiledClass).IDKEYOpen($classname(),,.sc)
$$$ThrowOnError(sc)
set key = ""
for {
set property = class.Properties.GetNext(.key)
quit:key=""
set properties(property.Name) = $listbuild(property.Type,property.Origin)
// Avoids consuming excess memory
do class.Properties.%UnSwizzleAt(key)
}
}
/// Get properties using a query against %Dictionary.CompiledProperty
ClassMethod GetPropertiesWithQuery(Output properties)
{
// Getting properties with SQL avoids the overhead of unnecessary references
set result = ##class(%SQL.Statement).%ExecDirect(,
"select Name,Type,Origin from %Dictionary.CompiledProperty where parent = ?",
$classname())
if result.%SQLCODE < 0 {
throw ##class(%Exception.SQL).CreateFromSQLCODE(result.%SQLCODE,result.%Message)
}
while result.%Next(.sc) {
$$$ThrowOnError(sc)
set properties(result.Name) = $listbuild(result.Type,result.Origin)
}
$$$ThrowOnError(sc)
}
/// Get properties using macros wrapping direct global references
ClassMethod GetPropertiesAsQuicklyAsPossible(Output properties)
{
// Getting properties via macro-wrapped direct global references is harder to read,
// but is the fastest way to do it.
set key = ""
set class = $classname()
for {
set key = $$$comMemberNext(class,$$$cCLASSproperty,key)
quit:key=""
set type = $$$comMemberKeyGet(class,$$$cCLASSproperty,key,$$$cPROPtype)
set origin = $$$comMemberKeyGet(class,$$$cCLASSproperty,key,$$$cPROPorigin)
set properties(key) = $listbuild(type,origin)
}
}
ClassMethod Print(ByRef properties)
{
set key = ""
for {
set key = $order(properties(key),1,data)
quit:key=""
set $listbuild(type,origin) = data
write !,"property: ",key,"; type: ",type,"; origin: ",origin
}
}
Storage Default
{
<Data name="PropertyQueryDefaultData">
<Value name="1">
<Value>%%CLASSNAME</Value>
</Value>
<Value name="2">
<Value>Foo</Value>
</Value>
<Value name="3">
<Value>Bar</Value>
</Value>
</Data>
<DataLocation>^DC.Demo.PropertyQueryD</DataLocation>
<DefaultData>PropertyQueryDefaultData</DefaultData>
<IdLocation>^DC.Demo.PropertyQueryD</IdLocation>
<IndexLocation>^DC.Demo.PropertyQueryI</IndexLocation>
<StreamLocation>^DC.Demo.PropertyQueryS</StreamLocation>
<Type>%Storage.Persistent</Type>
}
}Hello 家人们,
InterSystems 学习网站有许多非常棒的课程。 因此,如果您想了解 InterSystems 并开始使用 InterSystems,希望这些资源可以帮到你:
听IRIS 专家聊IRIS,学技术,练英语听力,尽在Intersystems 系联在线培训广播电台
https://datapoints.intersystems.com.
21. Embedded Python — Released February 3, 2022
20. The InterSystems Kubernetes Operator — Released July 27, 2021 [Transcript available]
19. What's New in Version 2021.1 of InterSystems IRIS? — Released June 3, 2021
18. The InterSystems IRIS® FHIR® Accelerator Service — Released May 5, 2021
17. The Analytics & AI Landscape — Released April 6, 2021
16. A Cloud DBMS Visionary — Released January 27, 2021
15. Writing ObjectScript in VS Code — Released November 17, 2020
Hi 开发者们,
New video is already on InterSystems Developers YouTube:
⏯ Embedded Python for ObjectScript Developers: Working with Python and ObjectScript Side-By-Side
深入指导如何将Python与ObjectScript并排使用,包括:
🗣 主讲人: @Bob Kuszewski Product Manаger, Developer Experience, InterSystems
祝您观看愉快,并请继续关注
表示当前的本地日期和时间,是由两个整数值组成的字符串,这些整数是计数器,是InterSystems IRIS存储格式,不是用户可读的日期和时间。
ddddd,sssss代码示例:
w $H,!
北京时间2021年12月29日15:15:30时,输出结果为:
66107,54930第一个整数,ddddd,是当前日期,表示为自1840年12月31日以来的天数,其中第1天是1841年1月1日。这个日期到达的最大年年限是9999年12月31日,所以这个整数的最大值是2980013。$HOROLOG不能直接用于表示1840年到9999年范围之外的日期
第二个整数,sssss,是当前的时间,表示为从当天午夜开始的秒数计数。系统将时间字段从0递增到86399秒。当午夜时分达到86399时,系统将时间字段重置为0,并将日期字段增加1。
你可以通过调用Horolog()方法获得相同的当前日期和时间信息,如下所示。
WRITE $SYSTEM.SYS.Horolog()$NOW()返回当前进程的本地日期和时间,是InterSystems IRIS存储格式,不是用户可读的日期和时间。
ddddd,sssss.ffffff代码示例:
| 值 | 描述 |
|---|---|
| 1 | MM/DD/[YY]YY : 07/01/97 或 02/22/2018 |
| 2 | DD Mmm [YY]YY : 01 Jul 97 |
| 3 | YYYY-MM-DD :2018-02-22 (ODBC时间格式:默认值在下面的tformat部分有描述) 默认情况下,这种格式与当前的地区设置无关 如果要使用你当前的日期和时间的地区设置与这种格式,请将localeopt设置为0。 |
| 4 | DD/MM/[YY]YY :01/07/97 或 22/02/2018 |
| 5 | Mmm [D]D, YYYY :Jul 1, 1997 |
| 6 | Mmm [D]D YYYY :Jul 1 1997 |
| 7 | Mmm DD [YY]YY :Jul 01 1997 |
| 8 | YYYYMMDD :19970701 |
| 9 | Mmmmm [D]D, YYYY :July 1, 1997 |
| 10 | W (2) :一个星期的日数,从0(星期日)到6(星期六)编号。 |
正如你在我的简介中看到的,我在一所大学教书,我想分享我对IRIS(或之前的Caché)教学的看法。
已经有一段时间了,但我还记得在今年早些时候看到YURI MARX GOMES关于 "用InterSystems对象和SQL开发 "一系列课程。他对第1天、第2天和第3天的课程内容进行了简要的描述,并附有讲师Joel Solon的评论。我心想,分享我自己的经验可能会有趣。
在我真正写下我教给学生的东西之前,先简单介绍一下我的经历。
在我毕业拿到硕士学位回到大学工作后,我们系决定更新我们的课程,在普通课程中增加几门新课程。其中一门是 "后关系型数据库"。它是为研究生第一年的学生讲授的。开始时,它包括72小时的讲座和72小时的实践。现在变为秋季学期72小时的讲座和36小时的实践。
由于我是一名新员工,而且是一名年轻有为的员工,我被赋予了讲授这门新学科的职责。我感到惊讶和惊恐是不言而喻的。首先,我根本没有任何教学方面的实践经验。其次,我只有夏天的三个月时间来学习一项对我来说完全陌生的技术并准备课程的讲授。幸运的是,我已经知道了应该教授哪个数据库。这个数据库就是InterSystems Caché。
总之,我或多或少地准备好了,然后我亲爱的学生们的问题开始了。例如,为什么他们必须学习这个数据库,他们在哪里以及如何使用这个数据库,等等。