Object Script(二)
ObjectScript没有定义任何保留字:你可以自由地使用任何字作为标识符(如变量名)。为了达到这个目的,ObjectScript使用了一组内置的命令以及特殊的字符(比如函数名的"$"前缀),以便将标识符与其他语言元素区分开来。
Object Script(二)
ObjectScript没有定义任何保留字:你可以自由地使用任何字作为标识符(如变量名)。为了达到这个目的,ObjectScript使用了一组内置的命令以及特殊的字符(比如函数名的"$"前缀),以便将标识符与其他语言元素区分开来。
指定XData块所属的XML名称空间。
要指定XData块所属的XML名称空间,请使用如下语法:
XData name [ XMLNamespace = "namespaceURL" ] { }
其中namespaceURL是XML名称空间的URI。
注意,这一项是用双引号括起来的。
该关键字指定XData块所属的XML名称空间。
如果省略这个关键字,则该XData块的内容不属于任何名称空间。
XData MyXData [ XMLNamespace = "http://www.mynamespace.org" ]
{
}
指定该类的数据存储位置。
<DataLocation>^Sample.PersonD</DataLocation>
element的值是一个全局变量名称,具有可选的前导下标。
一个表达式,它是存储该类数据的位置。
通常这将是一个全局变量引用,如^User.PersonD。
全局变量引用还可以包含一个或多个前导下标。
例如, ^User.Data("Person")。
在从属类(父-子关系中的子类)中使用{%%PARENT}代替全局或局部变量名也是有效的。
例如,{%%PARENT}(ChildData)
Object Script(一)
ObjectScript是一种用于在InterSystems IRIS数据平台上快速开发编程语言,它是面向对象的弱类型脚本语言,非常适用于各种应用,包括业务逻辑、应用集成和数据处理。
在这里,我将主要介绍ObjectScript的命令脚本,类,方法和Routine等使用方式和语法规范。如有任何疑问,可在InterSystems开发者社区进行深入讨论。
可以使用InterSystems IRIS内置的Studio或Visual Studio Code(需要安装Object Script扩展)来查看和编辑代码。这里我们使用InterSystems IRIS内置Studio来做示例。
如果你已安装InterSystems IRIS或者InterSystems HS 等任何InterSystems产品,找到右下角的图标
,单击鼠标右键,点击Studio,如下图所示:

输入用户名和密码(用户名:superuser 密码:安装时自己设置的密码),即可进入到Studio开发环境,如下图所示:
可以直接打开InterSystems IRIS的终端尝试执行ObjectScript的简单指令。
指定一个或多个列,其修改将导致SQL触发触发器。
仅对TSQL可用。
要指定其修改触发触发器的列,请使用以下语法:
Trigger name [ Event = sqlevent, UpdateColumnList = updatecolumnlist ] { //implementation }
其中updatecolumnlist是一个列名或用逗号分隔的列名列表,用括号括起来。
该关键字指定一个或多个列,其修改将触发触发器。
注意,此关键字仅对TSQL可用。
指定这个XData块是否是内部的(不在类文档中显示)。
注意,类文档目前根本没有显示XData。
要指定这个XData块是内部的,请使用以下语法:
XData name [ Internal ] { }
否则,忽略该关键字或将Not放在该关键字之前。
类文档中不显示内部类成员。 如果希望用户看到一个类而不是它的所有成员,则此关键字非常有用。
注意,类文档目前根本没有显示XData块。
指定XData块的MIME类型。
指定存储受事件影响的行或语句的旧值的转换表的名称。
要指定存储旧值的转换表的名称,请使用以下语法:
Trigger name [ Event = sqlevent, OldTable = oldtable, NewTable = newtable ] { //implementation }
其中oldtable是此命名空间中的SQL表的名称。
每个触发器都可以通过转换表(由旧表和新表关键字指定)访问受事件影响的行或语句的旧值和新值。
默认值为空字符串。
在同一个EVENT和TIME有多个触发器的情况下,指定触发器应该触发的顺序。
要指定此触发器的触发顺序,相对于具有相同EVENT和TIME的其他触发器,请使用以下语法:
Trigger name [ Event = sqlevent, Order = n, Time = time ] { //implementation }
其中n为整数。
在同一个EVENT和TIME有多个触发器的情况下,该关键字指定触发器应该触发的顺序。
默认值为0。
指定用于此触发器的SQL名称。
控制触发器何时被触发。
Trigger name [ Event = sqlevent, Foreach = foreach ] { //implementation }
其中foreach是下列值之一:
row — 该触发器由触发语句影响的每一行触发。
注意,TSQL不支持行级触发器,因此Language关键字的设置必须是objectscript。row/object — 此触发器由受触发语句或通过对象访问进行的更改影响的每一行触发。请注意,TSQL不支持行级触发器,因此Language关键字的设置必须为objectscript。这个选项定义了一个统一触发器,之所以这么叫,是因为它是由通过SQL或对象访问发生的数据更改触发的。
(相比之下,与其他触发器相比,如果在通过对象访问发生更改时使用相同的逻辑,则需要实现回调,如%OnDelete()。)
statement — 整个语句只触发一次触发器。
ObjectScript和TSQL都支持语句级触发器;
即Language关键字的设置分别为objectscript或tsql。控制何时触发触发器。
如果省略此关键字,则触发器为行级触发器。
TSQL不支持行级触发器。
指定此触发器定义是否为内部触发器(不显示在类文档中)。
指定这个类查询是否为web方法。
仅应用于定义为web服务或web客户端的类。
要指定这个查询是一个web方法,请使用以下语法:
Query name(formal_spec) As classname [ WebMethod ] { //implementation }
否则,忽略该关键字或将Not放在该关键字之前。
这个关键字指定这个类查询是否是一个web方法,是否可以通过SOAP协议调用。
如果忽略此关键字,则无法以web方法调用查询。
当你将这个关键字添加到类查询并编译类时,类编译器会生成两个额外的类:
Package.OriginalClass.QueryNamePackage.OriginalClass.QueryName.DSPackage.OriginalClass是包含web方法的类,QueryName是类查询的名称。
例如,假设从类ROBJDemo.QueryWS开始。
,然后向它添加一个名为MyQuery的类查询。
当你将WebMethod关键字添加到该类查询并编译它时,类编译器会生成以下额外的类:
ROBJDemo.QueryWS.MyQueryROBJDemo.QueryWS.MyQuery.DS不要修改或直接使用这些生成的类;它们仅供内部使用。
覆盖投影SQL存储过程的默认名称。
仅当此查询被投影为SQL存储过程时应用。
要覆盖查询投射为SQL存储过程时使用的默认名称,请使用以下语法:
Query name(formal_spec) As classname [ SqlProc, SqlName = sqlname ] { //implementation }
其中sqlname是SQL标识符。
如果将此查询投影为一个SQL存储过程,则使用此名称作为存储过程的名称。
如果忽略此关键字,查询名称将用作SQL过程名称。
指定查询是否可以作为SQL存储过程调用。
要指定查询可以作为SQL存储过程调用,请使用以下语法:
Query name(formal_spec) As classname [ SqlProc ] { //implementation }
否则,忽略该关键字或将Not放在该关键字之前。
该关键字指定是否可以作为SQL存储过程调用查询。
如果忽略此关键字,则无法将查询作为SQL存储过程调用。
指定是否将此查询投影为SQL视图。
这是一个IRIS 2020.2上的代码示例,并非InterSystems 官方支持!
本demo基于原始类描述 is based on the raw class descriptions.
使用的数据类是Address, Person, Employee, Company
如果要做更有吸引力的 demo, 可以添加 JSONtoString by ID的方法
用ZPM安装后从终端启动:After installation with ZPM just run from Terminal
USER>do ##class(rcc.ONAPI.demo).Run()
Adjust Parameters
host[127.0.0.1]:
port[51773]:
namespace[USER]:
user[_SYSTEM]:
pwd[SYS]:
timeout[5]:
****** connected ********
下一步, 你会得到一系列可能的Demo动作。you get a list of possible demo actions.
没有输入就意味着没有动作No input means no action.
菜单会一直循环直到退出The menu loops until you exit.
这些API虽然在IRIS 2020.1中已经实现了,但没有被放在官方文档里。
这都是直接从Class Reference中提取的,我只是收集了它来创建第一个概述。
ObjectScript的本地API遵循其他语言平台上使用的API。它从一个静态API开始,允许用户使用Iris Connection连接到IRIS命名空间,无论是本地还是远程。连接接口允许用户实例化IRIS本地API类(%Net.DB.Iris)。然后,该实例可用于访问IRIS全局数组,管理事务,调用例程或类中实现的函数和方法,以及实例化远程迭代器。
该类实现了IRIS Native API for Object Script DataSource接口。
目前,该接口仅包含 CreateConnection 方法
CreateConnection 方法接受 url, port, namespace, user, 和 pwd 等参数. 这些参数的信息请参考 %Net.DB.Connection 。CreateConnection() 返回 %Net.DB.Connection的实例
| host | input | The host name or address, defaults to 127.0.0. |
我有一个CSP页面,当我把大量的文本(例如:10000个字符)放到一个提交的表单的一个字段中时,会出现 "414 error - Request-URI Too Long"。该表格是用POST方法提交的。
根据我做的一些实验,似乎一个URL的最大尺寸是8200个字符左右。
官方的限制是什么,是否有办法增加它?我在文档中搜索了一下,但没有找到任何东西。
亲爱的社区开发者们,大家好!
欢迎积极参与新一轮InterSystems开发者竞赛!
🏆 InterSystems开发者竞赛:InterSystems IRIS Analytics 🏆
竞赛时间:2021年8月23日-9月12日
奖金总额: $8,750
登录页面即可参赛: https://contest.intersystems.com
指定属性是否存储在数据库中。仅适用于持久类。
要指定属性不存储在数据库中,请使用以下语法:
Property name As classname [ Transient ];
否则,请省略此关键字或将该词放在该关键字之前。
对于持久化类,指定属性不存储在数据库中。
请注意, IRIS验证瞬态属性的方式与验证其他属性的方式相同。例如,当保存对象时,系统会验证其所有属性,包括所有临时属性。
在子类中,可以将非瞬态属性标记为瞬态Transient,但不能反过来。
如果省略此关键字,则属性不是瞬态Transient的。
此查询的客户端投影使用的别名。
要在将查询投影到客户端语言时覆盖查询的默认名称,请使用以下语法:
Query name(formal_spec) As classname [ ClientName = clientname ] { //implementation }
其中clientname是在客户端语言中使用的名称。
当查询被投影到客户端语言时,此关键字允许定义查询的替代名称。如果查询名称包含客户端语言中不允许的字符,这尤其有用。
如果省略此关键字,查询名称将用作客户端名称。
指定此查询是否为最终查询(不能在子类中覆盖)。
此关键字控制何时重新计算属性。仅适用于触发的计算属性。
要指定何时重新计算属性,请使用以下语法:
Property name As classname [ SqlComputed, SqlComputeCode=sqlcomputecode, SqlComputeOnChange = propertynames ];
其中sqlcomputecode在SqlComputeCode中描述,propertyname是单个属性名或以逗号分隔的属性名列表。该值还可以包括值%%INSERT或%%UPDATE。
请注意,必须使用实际的属性名,而不是SqlFieldname给出的值。
此关键字仅适用于触发的计算属性;对于其他属性,它将被忽略。(触发的计算属性是一个属性,其SqlComputed为真,并且指定了SqlComputeCode,但是其computed和Transient都为假)
此关键字控制重新计算此属性的条件。重新计算可能源于:
如果关键字的值为%%INSERT或%%UPDATE,则分别调用INSERT或UPDATE,指定字段(属性)值的事件触发计算。
%%INSERT,当一行被插入到表中时, IRIS计算字段值。当前医院面临更多互联互通需求,如预约挂号与分级诊疗、检验结果共享、医联体信息化、监管数据上报、临床辅助决策支持等,都需要对多源数据进行集成与整合。医疗机构内部和跨机构数据交换与共享,对互联互通提出新的要求。HL7 FHIR是国际上医疗行业实现数据交换和信息共享的标准之一,正在快速得到医疗行业广泛关注。InterSystems中国技术总监乔鹏在视频中分享了FHIR标准与国际互联互通的一些实践经验。
国际互联互通的需求是在不断增长,这跟咱们国内的情况是非常类似的。这些年美国在互联互通领域的政策跟实践还是不少的,比如大家可能听到过包括“有意义的使用(Meaningful Use)”,“21世纪治愈法案(21st Century Cures Act)”,还有更多的政策上的驱动。这里先介绍一下“有意义的使用(Meaningful Use)”。
回过头来,业务场景都是千人千面的, FHIR怎么能够用一个标准涵盖尽可能多的用例?HL7吸收了V3的教训,在V3里面不成功的、或者说采纳度比较低的一个原因就V3试图穷举所有用例,由HL7组织自己来规范这些用例。这个是蛮沉重的教训,这也是V3的方法论虽然好,但是这套实施的路线在国际上有很大障碍的原因。
FHIR是快速医疗互操作资源(Fast Healthcare Interoperability Resources)的缩写,所以FHIR的核心是资源模型。它的颗粒度和结构都优于之前的V2 、V3、CDA标准,而且能够灵活扩展。另外一个优势就是它的API,它不仅提供了针对于资源模型本身的原子化的CRUD(创建、读取、更新、删除的这样一些原子化操作),而且提供了查询这种更复杂操作的能力,同样API是可以扩展的。
在国际上有很多互操作标准的开发组织,在我们医院信息化、医疗信息化领域有40多个标准开发组织,最广为人知的就是HL7国际、IHE,当然SNOMED也是,它开发的是行业术语跟语义的标准。
实现互通的方式方法有很多种,我们通常会见到4种:消息交换、文档交换、服务和 API。
在医疗行业要实现互操作,应该要达到语义级别。只有达到语义级别才能保障医疗信息的准确和医疗行为的安全。而要达到语义级别,我们需要基于标准。
什么是互联互通?我们所说的互联互通其实就是国际上的互操作性,HIMSS对于互操作性定义的是:不同的信息系统、设备、应用系统之间、程序之间,在机构区域和国家边界之内,以及跨机构、区域和国家边界,以协调的方式来访问交换集成和协作使用数据的能力。
发现官网上的native api for java教程无内容. 是不是后端出问题了.png)
指定是否将此属性投影到Java客户机。
要指定属性是否被投影到Java客户端,请使用以下语法:
Property name As classname [ ServerOnly = n ];
其中n是下列之一:
0表示此属性是投影的。1表示不投影该属性。此关键字指定属性是否被投影到Java客户端。
如果省略此关键字,属性将被投影。
指定此属性的SQL列号。仅适用于持久类。
要指定属性的SQL列号,请使用以下语法:
Property name As classname [ SqlColumnNumber = 4 ];
其中n是正整数。
此关键字允许显式设置此属性的SQL列号。这是为了支持传统应用程序而提供的。
默认值为空字符串。
指定设置此属性值的代码。
要指定属性的计算方式,请使用以下语法:
Property name As classname [ SqlComputeCode = { Set {FieldName} = Expression }, SqlComputed ];
FieldName—正在定义的属性的SQL字段名称。Expression—对象指定属性值的脚本表达式。指定删除相关对象时在当前表中采取的操作。此关键字仅适用于将基数Cardinality 指定为“父”或“一”的关系属性。它的使用在所有其他上下文中都是无效的。
要指定删除相关对象时在当前表中采取的操作,请使用以下语法:
Relationship relname As classname [ Cardinality = cardinality, Inverse = inverse, OnDelete = ondelete ];
其中ondelete是以下值之一。在本讨论中,相关记录是属于关系另一方的记录或对象,引用记录是关系这一方的记录或对象。
cascade级联—删除相关记录时,也会删除该表中的引用记录。noaction无操作—当试图删除相关记录时,尝试会失败。setdefault —删除相关记录时,该表中的引用记录将被设置为其默认值。setnull —删除相关记录时,该表中的引用记录将被设置为null。此关键字定义了在关系的另一端删除记录时发生的引用操作。
如果忽略此关键字,则:
Cardinality 基数为父的关系,OnDelete是级联的。也就是说,当删除父记录时,默认情况下,关联的子记录将被删除。OnDelete为noaction指定此属性的初始值。
要指定此属性的初始值,请使用以下语法:
Property name As classname [ InitialExpression = initialexpression ];
其中,initialexpression是用大括号括起来的常量或ObjectScript表达式。
此关键字指定属性的初始值。该值是在创建新实例时由类的%New()方法分配的。(如果属性是瞬态的的,则其初始值由创建实例时%New()调用的代码或实例从磁盘加载到内存时%OpenId()调用的代码确定。)
初始表达式的值必须适合给定的属性类型。
表达式可以是任意复杂的,有以下限制:
..therPropertyname}这样的表达式无效。子类继承InitialExpression
不推荐使用的方法是指定集合属性的集合类型。不要使用。
此关键字已被“as”语法替换。
指定此属性已弃用。此关键字被类编译器忽略,仅提供属性已弃用的人类可读指示符。
要指定不推荐使用此属性,请使用以下语法:
Property name As classname [ Deprecated ];
否则,请省略此关键字或将该词放在该关键字之前。
指定此属性是否为最终属性(不能在子类中重写)。
要指定属性为最终属性,请使用以下语法:
Property name As classname [ Final ];
否则,请省略此关键字或将该词放在该关键字之前。
标记为Final的类成员不能在子类中被重写。
如果省略此关键字,则该属性不是最终属性。
指定此属性是否对应于相应SQL表中的IDENTITY列。适用于持久类。
要指定此属性对应于相应SQL表中的IDENTITY列,请使用以下语法:
Property name As %Integer [ Identity ];
注意:属性类型可以是任何整数类型,例如%BigInt、%Integer、%SmallInt或%TinyInt。
我最近看到一个客户问题,是使用 Caché 数据库上运行的病毒扫描程序导致应用程序间歇性变慢和用户响应时间不佳。
出乎意料的是,这是一个常见问题,所以本帖就是提个醒,要将主要 Caché 组件排除在病毒扫描之外。
通常,病毒扫描必须排除 CACHE.DAT 数据库文件和 Caché 二进制文件。 如果防病毒软件扫描 CACHE.DAT 和 InterSystems 文件,那么系统性能_将_受到较大影响。
具体来说,防病毒软件必须排除的 Caché 文件包括:
更多详细信息,请参见在线文档。
指定此属性的其他名称,以便通过对象访问使用。
要为属性指定其他名称,请使用以下语法:
Property name As classname [ Aliases=othernames ];
其中othernames是用逗号分隔的有效属性名列表,用大括号括起来。
如果指定别名关键字,编译器会创建一个或多个给定的别名,这些别名指向原始属性所指向的同一基础数据。例如,重新定义Sample.Person的Name属性,如下所示:
Property Name As %String(POPSPEC = "Name()") [ Aliases = {Alternate}, Required ];
然后,代码可以使用Name属性或等效的Alternate属性,如以下终端会话所示:
SAMPLES>set p=##class(Sample.Person).%OpenId(1)
SAMPLES>w p.Name
Fripp,Charles Z.
SAMPLES>w p.Alternate
Fripp,Charles Z.
SAMPLES>set p.Alternate="Anderson,Neville J."
SAMPLES>w p.Name
Anderson,Neville J.