第三十六章 XML 模式的高级选项 - 创建子类型的替换组
创建子类型的替换组
XML 模式规范还允许定义替换组,这可以是创建选择的替代方法。语法有些不同。
XML 模式规范还允许定义替换组,这可以是创建选择的替代方法。语法有些不同。
根据 XML Schema 规范,复杂类型可以由类型(特别是相关类型)的选择列表组成。假设我们希望架构允许使用 , , or 元素,而不是 元素。要定义这样的架构,我们会将 Person 属性的 XMLTYPECONSTRAINT 属性参数设置为等于“CHOICE”,如下所示:
Class UsingSubclasses.Example2 Extends (%Persistent, %XML.Adaptor)
{
Property Person As UsingSubclasses.Person(XMLTYPECONSTRAINT = "CHOICE");
}
默认情况下,选择列表由 Person 类的所有子类组成。
类和属性参数
XMLTYPECONSTRAINT
XMLINCLUDEINLIST
XMLINHERITANCE
当为一个类定义 XML 投影时,它的所有子类都会自动映射到单独的类型,所有这些类型都使用超类作为基类型。这意味着无论何时使用超类型,都可以使用其中一种子类型。还可以使用子类型在 XML 模式中定义选择列表或替换组。
请注意,可以为抽象类定义 XML 映射;该类在任何派生类模式中都显示为基类型,尽管它是抽象的,无法实例化。
考虑一个例子。我们从一个简单的 Person 类开始:
Class UsingSubclasses.Person Extends (%Persistent, %XML.Adaptor)
{
Property Name As %String [Required];
Property DOB As %Date(FORMAT = 5, MAXVAL = "+$h") [Required];
}
假设我们有两个直接基于 Person 类的类。首先是 Patient 类:
Class UsingSubclasses.Patient Extends UsingSubclasses.XML 的类到 XML 类型的映射对于支持 XML 的类或基于支持 XML 的类的属性,XML 类型按如下方式确定: 如果该类具有 XMLTYPE 参数的值,则该值将用作类型名称。否则,短类名将被视为 XML 类型名。
例如,考虑以下类定义:
Class GXML.PersonWithAddress Extends (%Persistent, %XML.Adaptor)
{
Parameter XMLTYPE = "PersonType";
Property Name As %Name;
Property DOB As %Date(FORMAT = 5, MAXVAL = "+$h");
Property HomeAddress As GXML.Address;
}
对于此类的实例,XML 类型是 PersonType,它取自 XMLTYPE 参数。
假设 GXML.Address 类不包含 XMLTYPE 参数。在本例中,对于 元素,XML 类型是 Address,它是短类名。
XML 类型分配给命名空间,如下所示:
XSDTYPE 类参数,则该类型位于以下 W3 命名空间中:http://www.w3.本部分显示了从支持 XML 的类生成的 XML架构的一部分,该类包含定义为 %ListOfObjects 的属性。例如,考虑以下属性定义:
Property PropName As list Of %Integer(XMLITEMNAME = "MyXmlItemName");
如果此属性位于名为 Test.DemoObjList1 的启用 XML 的类中,则该类的 XML 架构包含以下内容:
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:s="http://www.w3.%ListOfDataTypes本部分显示从支持 XML 的类生成的 XML 架构的一部分,该类包含中定义为%ListOfDataTypes 的属性。例如,考虑以下属性定义:
Property PropName As %ListOfDataTypes(XMLITEMNAME = "MyXmlItemName");
如果此属性位于名为 Test.DemoList 的启用 XML 的类中,则该类的 XML 架构包含以下内容:
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:s="http://www.w3.Array of Classname本部分显示了从启用 XML 的类生成的XML 架构的一部分,此时该类包含定义为类名数组的属性。例如,考虑以下属性定义:
Property PropName As array Of %Integer(XMLITEMNAME = "MyXmlItemName", XMLKEYNAME = "MyXmlKeyName");
如果此属性位于名为 Test.DemoArray1 的启用 XML 的类中,则该类的 XML 架构包含以下内容:
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:s="http://www.w3.TCP作为OSI 7层的传输层的通信协议,其使用上不像更上层的通信协议那么方便,因为TCP操作的不是数据包,它操作的是数据流。因此有多种将TCP数据流“解释”为数据包(消息)的方法。
InterSystems IRIS提供了多种TCP适配器,用于不同的“解释”,例如EnsLib.TCP.FramedInboundAdapter使用特定的首尾字符做为分隔、EnsLib.TCP.CountedInboundAdapter使用固定的长度进行分隔...
同时,InterSystems IRIS提供了多种开箱即用的TCP业务服务和业务操作,方便接入和发送TCP数据。这里我们介绍常见的使用特定的首尾字符做为分隔的TCP业务服务和业务操作。
EnsLib.TCP.Framed.PassthroughService和EnsLib.TCP.Framed.PassthroughOperation是一组使用特定的首尾字符做为分隔TCP数据流的通用业务服务和业务操作。EnsLib.TCP.Framed.PassthroughService业务服务会将TCP数据封装在Ens.StreamContainer发送给业务流程或业务操作;而EnsLib.TCP.Framed.PassthroughOperation业务操作发送并接收Ens.
2023年11月24日19:00-20:00,InterSystems开发者社区举办了“InterSystems第二届技术征文大赛线上分享会”,邀请参赛作者进行了作品分享&点评,此次分享吸引了66位开发者参会。
未参加此次会议的社区成员,可通过以下链接了解此次Meetup详情(请注意,您需要登录后申请查看视频)
InterSystems IRIS 提供了一组通用的RESTful 业务服务和业务操作类,用户无需开发自定义的业务服务和业务操作类,就可以直接向外提供RESTful服务和调用外部的RESTful API。
| BS | EnsLib.REST.GenericService | 通用REST业务服务 |
| BS | EnsLib.REST.SAMLGenericService | 检查SAML令牌的签名和时间戳的REST业务服务 |
| BO | EnsLib.REST.GenericOperation | 通用REST业务操作 |
| BO | EnsLib.REST.GenericOperationInProc | 用于透传模式的通用REST业务操作 |
通用的RESTful 业务服务和业务操作类使用一个通用的RESTful消息类 - EnsLib.REST.GenericMessage,它是EnsLib.HTTP.GenericMessage的子类,二者数据结构都是
| HTTPHeaders | 记录http头的数组 |
| Stream | 记录http体的数据流 |
| Type | 数据流类型,例如是字符流还是二进制流。 |
目前在使用Codemirror展示cache的代码,codemirror能支持csp和js的代码高亮,但是cls的代码没有对应插件,不知具体关键字的正则表达式,是否有对应插件或解决方法,可是cls代码高亮。
✓ 十一月有 49 位新成员加入
✓ 截至目前共发布了 2,002 篇帖子
✓ 截至目前共有 1,595 位成员加入
我创建了一个类,里面有个属性OPDT 是 %Library.DateTime类型的,类继承了%XML.Adaptor,我是用 d obj.XMLExportToString(.xml) 导出为xml后,OPDT的值是 2023-11-28T13:57:26 这样的,我需要的值是 2023-11-28 13:57:26 这样的,T需要换成“ ”,有没有什么方式能设置导出的数据格式?
在日常Cache运维过程中可能会由于数据或者程序等原因造成锁的异常增长,导致数据库性能受到影响会出现程序报错或卡顿无法正常运行的问题。遇到此类问题需查看数据库当前锁列表情况,找到出现次数最多关键锁,根据关键锁对应的进程来判断处理。总结有以下三种方式查看关键锁。
|
查看方式
|
优点
|
缺点
|
|
第一种
|
易操作、方式简便
|
慢、锁数量太多无法显示
|
|
第二种
|
快、不受网页限制
|
易忘、需要输入准确命令
|
|
第三种
|
快、灵活、直接显示关键锁信息
|
需定位准确命名空间
|
下面给出自定义程序实例,程序逻辑为按命名空间循环所有锁信息,通过计数器方式记录所有锁当中出现次数最多的一个,输出其信息。入参为数据库中不同命名空间,输出结果为锁名称及锁的所有者,所有者一般为进程ID或ECP。
我们继续使用FHIR适配器的示例,在本文中,我们将回顾如何在我们的IRIS实例中进行配置以及安装的结果。
配置项目的步骤与官方文档中所示的相同,您可以直接在此处查看。好吧,让我们开始工作吧!
正如您在与本文相关的项目中看到的,我们将 IRIS 实例部署在 Docker 中,因此初始配置的主要部分将在 Dockerfile 中完成。别担心,我们不会详细介绍 Docker 配置。
要安装 FHIR 适配器,我们只需:
set status = ##class (HS.FHIRServer.Installer).InteropAdapterConfig( "/Adapter/r4" )在我们的例子中,我们定义了将接收 REST 请求的 IRIS 端点的 URL 为/Adapter/r4 。
FHIR 适配器安装完成后,我们可以查看 IRIS 实例中发生的情况。为此,我们首先查看 Web 应用程序菜单(系统管理 -> 安全 -> 应用程序 -> Web 应用程序)
.png)
正如我们所看到的,一个新的 Web 应用程序已添加到列表中,表明它对应于我们的 ADAPTER 命名空间。让我们访问它以更详细地查看其配置。
.png)
想必大家都听说过 FHIR 是解决系统间所有互操作性和兼容性问题的灵丹妙药和解决方案。就在这里,我们可以看到他手持一份 FHIR 资源,愉快地享受其中:
.png)
但对于我们这些普通人,我们将做一个小小的介绍。
让我们直接进入定义:FHIR(Fast Healthcare Interoperability Resource)是由HL7(Health Level 7标准组)开发的一种互操作性标准,旨在实现医疗行业中不同系统之间的电子医疗数据交换。
主要是通过 REST API 和 JSON 格式进行 HTTP 调用的结合(尽管它可以是 XML 以及我们可用的任何其他通信,具体根据我们的使用情况)。
一般来说,最简单的方式是拥有一个FHIR服务器,我们将使用诸如GET(从服务器获取数据)、PUT(更新数据)、POST(保存数据)和DELETE(删除数据)等HTTP调用与其通信。
FHIR处理了“资源”(Resource)的概念,用于在服务器和客户端之间发送和接收数据。这些资源旨在涵盖系统间80%的互通性需求。在这里,我们可以看到默认情况下可用的资源图示。
.png)
如您所见,每个资源都附带一个表示资源成熟度的数字或字母(其中N = 正式)。如果您访问官方的FHIR文档,您将能够获取到众多示例。
🏆InterSystems开发者社区中文版第二届技术征文大赛🏆(←点击链接进入参赛页面,浏览所有参赛文章)获奖名单已公布!
11月24日19:00-20:00,InterSystems开发者社区将举办“InterSystems第二届技术征文大赛线上分享会”,邀请参赛作者进行作品分享&点评、探讨热门话题,同期还将送出多份幸运奖品,欢迎参会!
特别提醒:今晚拼手速,赢取幸运奖品,请提前准备好自己的社区主页链接,以便快速填写(点击头像右上角进入个人主页,复制浏览器链接即可,如:https://cn.community.intersystems.com/user/claire-zheng)
会议主题:InterSystems开发者社区第二届技术征文大赛线上分享会
会议时间:2023/11/24 19:00-20:00 (GMT+08:00) 中国标准时间 - 北京
点击链接入会,或添加至会议列表:
https://meeting.tencent.com/dm/a7BNMvn2Sqx4
#腾讯会议:306-552-860
复制该信息,打开手机腾讯会议即可参与
大家好!
终于到了宣布获奖名单的时间!
🏆InterSystems开发者社区中文版第二届技术征文大赛🏆(←点击链接进入参赛页面,浏览所有参赛文章)已经结束,此次大赛收到了来自8名参赛者的12篇参赛文章,最终进入评选的文章为10篇,感谢大家的积极参与!
以下是获奖名单!
.png)
专家提名奖:活动期间发布文章且成功参赛后,由InterSystems专家评选得出
🥇第一名,姚 鑫,作品:浅谈一下个人基于IRIS后端业务开发框架的理解
🥈第二名,王喆 👀, 作品:IRIS自动安装集群--manifest(安装清单)
🥉第三名,Yuxiang Niu,作品:关于Cache中查看关键锁的几种方式
🏆第四名,liu bo,作品:通过自定义数据类型实现参数统一验证优化重构代码
开发者社区奖:活动期间发布文章且成功参赛后,由社区成员点赞评选得出
🥇第一名,Yongfeng Hou ,作品:IRISHealth在DBServer和ECPApp之间启用SSL/TLS安全双向认证加密通信
🥈第二名,Meng Cao ,作品:使用支持SSL的ODBC连接IRIS数据库
🥉第三名,water huang,作品:进程表
🏆第四名,haoyinhang Hao ,作品:通过XSL自动生成消息模型
恭喜获奖者!
感谢大家的积极参与!
奖品领取
请获奖者点击【获奖者信息提交】提交信息,以便我们及时与您联系奖品寄送事宜。
随着网络安全日益被重视,特别是等级保护制度的大环境下,SSL加密传输越来越被重视,本文介绍如何使用支持SSL的ODBC连接IRIS数据库。
数据库版本:IRISHealth-2023.1
1)新建SSL服务器配置。
.png)
2)开启超级端口的SSL支持,这里我们选择启用即可,如所有超级端口的连接都支持SSL可选要求。
.png)
1)创建 SSLDefs.ini 配置文件,并编辑内容:
[TLS to an InterSystems IRIS instance]
Address=127.0.0.1
Port=51773
SSLConfig=DHCC
[DHCC]
TLSMinVersion=8
TLSMaxVersion=16
CipherList=ALL:!aNULL:!eNULL:!EXP:!SSLv2
KeyType=2
VerifyPeer=1
Password=
CertFile=E:\ADSSL\ADSSL.crt
KeyFile=E:\ADSSL\ADSSL.
SqlDbx是我们常用的数据库查询与操作工具,因其轻量且无须安装而无处不在,然而习惯了在Intersystems的CACHE和ENSEMBLE版本下使用SqlDbx在升级到IRIS版本后却无法使用了,为此进行了一系列尝试,并最终获得成功,形成本文攻略,分享给大家。
1、在SqlDbx的连接登录窗口,从DBMS Type中直接选择 “InterSystems CACHE”连接IRIS会报错,提示“通过IRISconnect失败”,说明“InterSystems CACHE”不再适用于IRIS。


2、考虑IRIS的ODBC支持,为此换一种思路,采用ODBC方式连接,此方式需要在ODBC中建立DSN。


3、从Intersystems官网https://intersystems-community.github.io/iris-driver-distribution/或github网站https://github.com/intersystems-community/iris-driver-distribution/tree/...下载InterSystems IRIS ODBC 32位驱动,注意一定要下载32位驱动(注:SqlDbx现只支持32位的ODBC)。


ensemble里边实现分页比较麻烦,毕竟对于sql的书写比较麻烦,单表的查询相对简单,对于多表的关联查询单纯的sql不好查询,我们使用sql进行先查询出主表满足条件的rowId,在根据根据满足条件的rowid进行遍历取值。
我们先取对比一下其他数据库实现的原理。
Mysql的实现原理 总数:SELECT COUNT(*) AS total FROM person WHERE (name LIKE ?) 分页:SELECT id,name,age,email FROM person WHERE (name LIKE ?) LIMIT ?,?
ORACLE的实现原理 rownum 总数:SELECT COUNT() AS total FROM person WHERE (name LIKE ?) 分页:SELECT * FROM ( SELECT TMP., ROWNUM ROW_ID FROM ( SELECT id,name,age,email FROM person WHERE (name LIKE ?) ) TMP WHERE ROWNUM <=?) WHERE ROW_ID > ?
由于cache没有limit关键字,看看有没有和oracle里边rownum一样的原理。
由于InterSystems最近宣布从2023.2版本开始停止对InterSystems Studio的支持,转而独家开发Visual Studio Code(VSC)IDE的扩展,相信后者比Studio提供了更优越的体验,我们很多开发者都已切换或开始使用 VSC。很多人可能想知道如何打开终端进行操作,因为VSC没有像Studio那样的输出面板,也没有集成的功能来打开IRIS终端,除非下载InterSystems开发的插件。
在 VSC 中打开终端的方法有多种,具体取决于您使用的具体配置,我在这里总结了适合任何情况的最佳解决方案:
至少拥有 IRIS 2020.1.1 或 IRIS 2021.1.
大家好!
🏆InterSystems开发者社区中文版第二届技术征文大赛🏆(←点击链接进入参赛页面,浏览所有参赛文章)即将步入尾声!“征文&投票”环节即将结束(截至11月23日23:59)!来抓住最后的时间为你喜欢的作品投票吧!
11月24日19:00-20:00,InterSystems开发者社区将举办“InterSystems第二届技术征文大赛线上分享会”,邀请参赛作者进行作品分享&点评、探讨热门话题,同期还将送出各类奖品,欢迎参会!
会议主题:InterSystems开发者社区第二届技术征文大赛线上分享会
会议时间:2023/11/24 19:00-20:00 (GMT+08:00) 中国标准时间 - 北京
点击链接入会,或添加至会议列表:
https://meeting.tencent.com/dm/a7BNMvn2Sqx4
#腾讯会议:306-552-860
复制该信息,打开手机腾讯会议即可参与
由于国内使用基于M语言IRIS平台几乎都在医疗行业。医疗系统又非常的庞大和复杂。前期由于快速占领市场,系统数量越来越多,到了临界点后就产生了质变,所以前期基于功能的线性开发注重效率,所以导致大量的产品业务代码有如下集中情况:

如上图所示,这仅仅是展示了五个模块之前的交互,在此基础上继续增加模块则复杂度成指数级上升,并且如果每个模块之间如果没有做好接口管理,维护起来也是地狱级别。
如何解决这个问题,一般会分为两派:优化派与架构派。
优化派的思想是将现有的系统优化。例如重构某个方法,优化某个SQL。优化派的优势是针对系统改动较小,可以保持系统的稳定性,可以快速实施,缺点是治标不治本,随着需求越来越多,增加的代码量越多,后期还是会撑不住。
架构派的核心思想是调整系统架构,将原来的大系统拆分为多个互相配合的小系统,例如药库系统拆分为,采购模块,订单模块,查询模块,分析模块等。架构派的优势是一次调整可以支撑比较长期的业务发展,缺点是动作较大,耗时较长,稳定性需要项目考验。
前言
在日常工作中经常会遇到大量的接口开发需求,对于没有IRIS开发经验的同事来说很不友好,需要求助于公司开发人员来做接口开发,对项目联调进度多少会有些影响,本文站在没有IRIS开发经验的工作人员角度来阐述一下如何利用xslt转换文件自动生成接口联调所需要的Message模型。
基本思路是首先定义一套通用的数据模型,用来接收定义消息所需要的基础属性,包括类名,请求&响应(对应继承Ens.Request&Ens.Response),节点名称、节点长度、是否必填、默认值、字段约束等等。
这是Java 编程比赛的相关文章。
我决定推出一个基于 IRIS Native API for Java 的 CRUD++ Global编辑器。
++因为它不仅仅是C reate、 R ead、 U pdate、 D elete
Global可视化对于立即查看结果始终很重要。
这需要在服务器端有一个小的帮助器类作为默认 API 的扩展
我的策略是拥有一个可从命令行使用的相当适度的界面
就像在 Docker 控制台或终端上一样,并使其尽可能简单。
花哨的图形界面只会分散示例的基本内容。
如果有任何默认值或先前的值,则会在输入提示中显示。
在 Docker 容器中,编辑器已经可以使用了。
您首先连接到服务器
欢迎使用 IRIS NativeAPI 全局编辑器
>>> 服务器IP [127.0.0.Hi 开发者们,
我们非常高兴地邀请大家参加新的 InterSystems 在线编程竞赛,重点关注 Java 及其衍生产品!
时间: 2023年11月13日至12月3日(美国东部时间)
奖金池: 14,000 美元
.jpg)
我们最近发布了一份关于在镜像环境中使用报告节点(完整的“异步报告镜像成员”)的新白皮书。越来越多的客户正在研究这种机制,将其作为一种快速、简单的方法来设置保持最新的生产数据副本,但可以用于分析查询或重型报告工作负载,而不影响源系统。 请在此处阅读白皮书。
与往常一样,我们很想听听您对如何在组织中使用此镜像选项的反馈,以及您是否对我们如何提高其效率有想法。
大家好!
2023年9月19日-11月24日(北京时间),🏆InterSystems开发者社区中文版第二届技术征文大赛🏆正在进行中(←点击链接进入参赛页面,浏览所有参赛文章)!作为此次大赛重要奖项“专家提名奖”评比的重要部分,我们的专家评审团已组建成团!