搜索​​​​

清除过滤器
公告
Claire Zheng · 六月 13, 2022

2022 SUTA培训报名启动啦!

SUTA培训是InterSystems专为SUTA有效期客户提供的原厂产品技术服务,具体包括产品的基础管理、编程管理、高级管理和开发培训等。即日起2022 SUTA培训报名启动,本年度为针对InterSystems数据平台产品的线上培训,一共6期12个课程,其中每期两个课程,时间安排在周五下午半天(6月24日—8月5号),6期培训总时长共计三天。点击此处报名,或者扫描下图中的二维码报名,在您的报名信息经过审核后,我们会与您进一步沟通线上培训细节。快来报名吧! 点击下载,了解2022 SUTA培训课程安排详情。
文章
Hao Ma · 三月 25, 2021

使用DBeaver连接IRIS数据库

在Caché时代, 比较受欢迎的IRIS数据库客户端是Sqldbx和Winsql, 这两者的共同点是提供ODBC兼容的连接,而且免费。限制也差不多:只能用于Windows环境,只能用ODBC连接。 DBeaver是我最近使用的免费SQL客户端, 推荐给各位。它有几个好处: 1. 支持各种操作系统:Windows, Linux, Mac. 2. 内置Caché和IRIS的JDBC driver, 可以简单配置到Caché 或者IRIS的连接。 3. 免费 下面说说配置的一些小细节: - 连接IRIS 下图中的配置项都很简单,需要的信息无非是数据库IP地址, 端口,数据库的名称,以及账号密码。值得一说的是下面下拉栏里的InterSystems IRIS driver. 初始安装DBeaver时这个driver不是默认安装好的, 你需要到"Edit Driver Setting"的"Libraries"页面去下载,按钮是"Download/Update". 下载的地址是https://github.com/intersystems-community/iris-driver-distribution/raw/main/intersystems-jdbc-3.1.0.jar。 讨厌的是,这个页面的响应速度有点慢,因此您很可能会被timeout。我的解决方法是拷贝这个网址,从浏览器把这个包下来,然后放到DBeaver指定的路径去。上述地址和要放的文件路径都可以在”Driver Setting"的"information"页面得到。 -连接Caché 这个就容易多了。 虽然也有可能要下载driver, 但Caché的driver是已经存在Dbeaver网站的repo里面了,不会有下载和更新timeout的问题。 (我相信用不了多久IRIS的driver也会放进DBeaver的repo的) happy coding 马老师好,请教个问题,就是我按照步骤操作之后,连接还是提示Connection refused: connect,驱动我是从本地安装目录拷贝出来的(D:\IRIS-HealthConnect\dev\java\lib\JDK18\intersystems-jdbc-3.1.0.jar),这个可能会是什么问题
公告
Claire Zheng · 五月 9, 2021

欢迎中文社区新版主@刘文艺

亲爱的社区开发者们, 我很高兴地向大家介绍一位我们的新版主@刘文艺。 @刘文艺在嘉和美康(北京)科技股份有限公司任职集成平台研发部产品经理。 以下是@刘文艺的自我介绍: 大家好,我带领团队主导了多家大型医院的信息平台开发、系统集成和互联互通项目,有丰富的基于InterSystems产品的开发、部署和项目经验,对医疗信息行业有很深的认识和独特的想法,熟悉医疗行业相关标准,并获得HL7认证证书,和InterSystems技术认证证书。 本人乐于参与组织各种活动,分享经验,协作能力强,善于与人交流,很荣幸在InterSystems开发者社区(中文版)与大家相识,今后希望通过与大家共同努力,不断完善开发者社区的内容建设,提高社区人气的活跃度和忠诚度。让社区更好地为开发者提供知识传播、在线学习等服务。 感谢@刘文艺,恭喜你成为新版主! 热烈欢迎! 欢迎欢迎! 欢迎刘文艺! 作为国内首位开发者大赛的获奖者,请多多和大家分享你的经验哈
公告
Claire Zheng · 十一月 14, 2021

大突破:全球开发者社区已有1万名成员! 中国开发者社区不到一年时间突破270人!增速全球第一!

亲爱的开发者们,我们很高兴地跟大家分享一个好消息! 我们的社区全球注册会员突破10000名!中国开发者社区不到一年时间突破270人!增速全球第一!这是一个了不起的成就!感谢大家的支持🎊 在InterSystems,我们相信社区的力量。所以我们非常感谢你们在过去六年里所做的贡献,并期待未来的道路! 我们希望与大家分享一些有趣的数据,全球社区: 2015年12月上线 总计发布 - 8,600篇 共计提问 - 5,500次 总计浏览 - 430万 中文社区 2021年1月上线 总计发布 - 748篇 共计提问 - 100+次 总计浏览 - 21000+ 不到一年的时间,能够有如此大的成绩,非常感谢所有人的参与和贡献,感谢你们的热情和分享!我们非常感谢大家的帮助,使我们的社区成为InterSystems乃至整个医疗信息化开发人员更好的地方。大家真的很棒! 请随时分享您成为InterSystems开发人员全球和中国大家庭一员的感受! 再次感谢大家,共同成就了这个可爱的大社区! 敬上,开发者社区团队 ❤️
公告
Claire Zheng · 七月 11, 2022

欢迎中文社区新版主@黄念刚

亲爱的社区开发者们, 我很高兴地向大家介绍一位我们的新版主@黄念刚。 让我们以热烈的掌声欢迎 @黄念刚! @黄念刚目前任职于东华医为(Mediway),担任技术支持中心开发工程师一职。 以下是@黄念刚的自我简介: 我从2012年入职东华后开始接触InterSystems 的集成平台。使用过 InterSystems早期的Caché版本, Ensemble,目前使用的最高版本是Ensemble2016。 本人有接近10年的医疗信息化经验,熟悉 HL7 V2/V3,有着丰富的领域知识。 InterSystems 平台是一个非常优秀的集成平台,借助该技术,给我们业务带来了非常大的便利。我希望这么优秀的技术,能给更多的兄弟单位和合作伙伴创造价值。我希望能够在社区与大家一起交流,分享自己的一些实践经验,此外希望借助社区这个平台,向大家学习一些优秀的实践。我们一起成长,共同进步! 再次欢迎我们的新版主@黄念刚👏🏼👏🏼👏🏼👏🏼👏🏼 期待你在DC成长为一名优秀版主! 热烈欢迎!!!
文章
Tingting Jiang · 三月 21, 2023

实习生招聘

注意:请投递时,发送英文简历! 工作概述 每年夏天InterSystems都会招聘实习生在中国办公室工作,从事专门围绕InterSystems产品设计的项目。我们信任实习生团队在导师的指导下可独立的工作。除了在项目中工作外,实习生还能融入我们的团队,与我们的全职员工一起解决所面对的工作问题。 InterSystems的带薪暑期实习项目可以让学生接触到在重要的职业生涯中出类拔萃所需的各种技术和软技能。 我们希望实习生可以累计工作时长4个月,预计于2023年6月份开始。 工作职责 参加必要的培训课程,成功完成实习期间分配的项目。 在导师和其他InterSytems员工的指导下,成功地完成分配给他们团队的项目。 向高层领导和InterSystems的员工展示他们的项目。 遵守实习计划的所有要求(包括出勤、着装、行为)。 遵守公司关于实习的合理指示。 在公司规定的时间内可以进行活动。 如果在实习期间有任何计划外的缺席,请及时通知人力资源部门。 遵守适合公司的职业行为标准。 遵守公司的政策和程序,包括那些与WHS和就业公平和多样性有关的政策和程序。 在任何时候都要适当地、负责任地使用公司的资源。 承担所有与实习有关的评估活动。 对在实习期间获得的有关公司、员工、客户和公司业务的信息进行保密。 公司可能不时地指示其他职责。 任职条件 优先有以下一种或多种编码经验:Python、InterSystems ObjectScript、Node.js、SQL、XSLT和AngularJS在敏捷团队中工作,或类似的经验。 技术上的好奇心。 对复杂的技术挑战有创造力。 协作的团队心态。 在不断变化的工作环境中表现出灵活的态度。 主动为自己的职业生涯打下技术基础。 专业要求 计算机等相关专业的本科生、硕士生或者博士在读学生。 薪资 本科生:RMB6,000/月;硕士生:RMB7,000/月;博士生:RMB8,000/月。 工作地点 北京市朝阳区建国门外大街1号银泰中心写字楼C座2701 如何申请 请点击链接InterSystems Careers, 或在2023年4月30日前发送邮件至recruitment.asiapacific@intersystems.com。 不知道我可不可以 你可以给实习生当老师 哈哈哈哈
文章
TZ Zhuang · 六月 2, 2021

FAQ 常见问题系列--系统管理篇 如何进行数据库备份

InterSystems产品有四种备份方法:(1) 外部备份(2) 在线备份(3) 冷备份(4) 传统的并行外部备份有关这些方法的细节请参考在线文档 https://docs.intersystems.com/irisforhealthlatest/csp/docbook/DocBook.UI.Page.cls?KEY=GCDI_BACKUP 以下是对每种备份方法的简要描述: (1) 外部备份外部备份是InterSystems推荐的最佳备份方式。外部备份一般是对数据库文件所在的存储创建快照的方式来实现。创建快照可以在多个层面进行,例如存储层面,操作系统层面,等等,因此这些相关技术和工具一般由第三方来提供。在做快照前,一定要先停止对数据库文件的写入(InterSystems IRIS的IRIS.DAT,Caché/Ensemble的CACHE.DAT)。但是用户进程可以继续对内存进行更新,而不需要中断。InterSystems提供了停止对数据库文件写入的方法,用户可以把这个加入到快照工具的脚本里。外部备份一般包括以下几步:1. 使用Backup.General.ExternalFreeze()方法来停止对数据库文件的写入。2. 使用第三方快照工具来对文件系统创建快照。3. 使用Backup.General.ExternalThaw()方法来恢复对数据库文件的写入。4. 把快照拷贝到备份介质上(用于存储备份的磁盘,磁带,等等)。5. 删除快照。 (2) 在线备份在线备份是InterSystems自己特有的备份方式,可实现无宕机备份。但是,在线备份只能备份数据库文件(InterSystems IRIS的IRIS.DAT,Caché/Ensemble的CACHE.DAT),并且会把所有需要备份的数据库文件中的数据块写入到一个.cbk的备份文件。因此如果想要使用在线备份来备份整个系统环境,除了数据库文件外,还需要额外备份很多系统文件,例如InterSystems产品的安装目录,WIJ文件,主日志和备日志目录等等。在线备份包括3种类型:1. 全备份 -- 把所有使用的数据块写入到一个.cbk文件。2. 累积备份 -- 从上一次全备份起,所有变化过的数据块写入到一个.cbk文件。恢复时,需要和上一次全备份一起恢复。3. 增量备份 -- 从上一次备份起,所有变化过的数据块写入到一个.cbk文件。恢复时,需要和上一次全备份及中间所有备份一起恢复。在线备份的这些特性,并不适用于作为数据量大的生产系统的备份方案。 (3) 冷备份冷备份是在数据库系统正常停机状态下,所做的外部备份,即拷贝文件系统到存储介质。 (4) 传统的并行外部备份传统的并行外部备份是一种在特殊情况下才可行的备份方法。一般需要满足以下条件:1. 数据库在一个集群里,并且不能有宕机时间。2. 没有快照功能。3. 在线备份不能满足需求。并行外部备份结合了数据库文件(*.DAT)拷贝和在线备份里增量备份的功能。其步骤如下:1. 在数据库中设置备份启动标志。2. 拷贝数据库文件(*.DAT)。3. 对该拷贝时间内被修改的数据进行在线备份的增量备份。具体使用情况和详情也请参考在线文档 https://docs.intersystems.com/irisforhealthlatest/csp/docbook/Doc.View.cls?KEY=GCDI_backup#GCDI_backup_methods_ext_concurrent 最新版本InterSystems IRIS for Health示例:===============================================================1. 设置标志,开始备份数据库。Set ^ClearOK=$CLRINC^DBACK("QUIET")2. 拷贝操作系统上的数据库文件(*.DAT)。3. 运行下面的命令,表明你已经使用了一个外部备份工具。Set x=$$BACKUP^DBACK("","E","Dirty external backup","","","")4. 进行增量备份。Set x=$$BACKUP^DBACK("","I","incremental","test.cbk","Y","bck.log","QUIET","Y","Y")===============================================================InterSystems产品中的上述处理可以做成例程Routine或类方法,并与批处理相结合进行操作。关于传统并行外部备份中使用的^DBACK例程的更多信息,请参考以下文件https://docs.intersystems.com/irisforhealthlatest/csp/docbook/Doc.View.cls?KEY=GCDI_backup#GCDI_backup_util_DBACK_entry_backup
文章
Qiao Peng · 二月 18, 2022

SQL语句与数据模式(Select Mode)

InterSystems IRIS和InterSystems Caché 里,是否您遇到过执行一个SQL Insert/Update语句,明明给的是正确的日期值,但被告知“值‘2022-01-01’ 校验失败”的类似情况,并感到困惑? 如果有,那么您需要了解一下InterSystems IRIS和InterSystems Caché保存和显示数据的模式。 一 数据模式 InterSystems IRIS和InterSystems Caché里,数据有3种模式,称之为SELECT MODE:逻辑模式:这是数据被保存到InterSystems IRIS和InterSystems Cache'时的格式。例如,%Date类型的数据,在数据库里被保存为一个整数,即从1840年12月31号到这个日期的天数,而不是YYYY-MM-DD的格式。 ODBC模式:这是ODBC对数据定义的格式。在这个模式下,%Date类型的数据就会显示为YYYY-MM-DD的格式。 显示模式:这是数据在InterSystems IRIS和InterSystems Caché里默认的显示格式。例如在美国语言环境下,%Date的默认显示格式是DD/MM/YYYY格式。 InterSystems IRIS和InterSystems Caché只会使用逻辑模式保存数据,但可以以任何模式显示数据。 二 数据类型与数据模式 大多数数据类型在3种数据模式下的格式是一样的,例如%String、%Integer等。但有些情况下,数据在不同数据模式下的格式是不一样的: 时间、日期类型的数据 InterSystems提供多种时间、日期数据类型,包括%Date、%Time、%PosixTime、%TimeStamp 和%MV.Date。除了%TimeStamp,这些时间日期数据类型的3种数据模式下的格式都是不同的。 列表类型的数据 作为一个多模型数据库,可以指定数据为列表类型(%ListOfDataTypes)。列表类型数据的在不同数据模式下的格式也是不同的。例如一个定义为list of %String的属性/字段,中文数据以显示模式和ODBC模式看,数据显示是没问题的,但逻辑模式下看似乱码(其实并非乱码)。 指定了VALUELIST 和 DISPLAYLIST的数据 例如在建立患者模型时,我们指定其性别数据类型为%String,但通过VALUELIST限定它的值只可以是0、1、2、9,通过DISPLAYLIST设置这4个值的显示值为“未知的性别"、 "男性"、"女性"、"未说明的性别"。这样,数据被保存到数据库时,保存的是0、1、2、9,而显示值和ODBC值都是中文说明。 空字符串和空字符流数据 在逻辑模式下,空字符串和 空BLOB 由不可显示的字符 $CHAR(0) 表示。在显示模式下,它们由一个空字符串 ("") 表示。 三 SQL与数据模式 InterSystems提供很多种SQL操作的方式,而其当使用SQL操作数据的时候,很多操作和数据模式有关,例如数据排序。 SQL操作的方式 您是如何使用SQL的?是通过ODBC/JDBC,还是在Object Script里通过嵌入式SQL或动态SQL,抑或是通过Terminal或管理门户的SQL操作页面? 1. ODBC/JDBC 通过ODBC/JDBC连接到InterSystems数据库时,问题很简单:无论是插入或更新数据,还是查询数据,作为值、查询条件的数据和返回的数据显示结果都是按ODBC格式的。也就是说,这种情况下,您不需要关心数据模式。 2. 嵌入式SQL 如果您在使用嵌入式SQL(&SQL)操作数据,那么就需要留心数据模式了。可以通过#SQLCompile Select这个预处理器指令设置需要的数据模式,例如设置为ODBC模式: ClassMethod Test(pDocNo = "Doc123456") { #SQLCompile Select=ODBC &SQL(Insert into Test.Table( DocumentNo, DOB, name_Value) values( :pDocNo, '2001-10-10', '预防接种史描述') ) } #SQLCompile Select可以设置为逻辑模式(Logical)、显示模式(Display)、 ODBC模式(ODBC)或 运行时模式(RuntimeMode)。而RuntimeMode默认为逻辑模式。 3. 动态SQL 如果是使用动态SQL,对于%SQL.Statement,它有一个属性%SelectMode,可以用来设置数据模式。它的可选值为:0 (逻辑模式)、1 (ODBC模式) 、2(显示模式),0(逻辑模式)是默认值。 例如下面的例子将数据模式设置为逻辑模式: SET myquery = 3 SET myquery(1) = "SELECT {t '12:04:29'} AS time1," SET myquery(2) = "{t '12:4:29'} AS time2," SET myquery(3) = "{t '12:04:29.00000'} AS time3" SET tStatement = ##class(%SQL.Statement).%New() SET tStatement.%SelectMode=0 SET tStatus = tStatement.%Prepare(.myquery) SET rset = tStatement.%Execute() DO rset.%Display() 4. Terminal的SQL shell 当使用Do $System.SQL.Shell()进入Terminal的SQL操作环境时,可以使用SET SELECTMODE命令来查询和设置数据模式。 直接使用SET SELECTMODE命令,返回的是当前数据模式。要设置数据模式,使用SET SELECTMODE=odbc/logic/display,例如SET SELECTMODE=odbc将当前SQL操作环境的数据模式设置为ODBC模式。 注意:SET SELECTMODE=odbc,等号前后不能有空格! 5. 管理门户的SQL操作页面 在管理门户的SQL操作页面中,通过下拉列表来选择当前的数据模式。 例如下面的逻辑模式的数据显示结果: 这是相同的数据在显示模式下的数据显示结果: 6. 在同一个SQL语句中显示不同的数据模式 有可能出于某种原因,你希望在SQL语句中对不同的字段使用不同的数据模式。这时,可以使用SQL函数:%EXTERNAL、%INTERNAL和 %ODBCOUT 来控制输出模式。 %EXTERNAL:按显示模式输出表达式结果%INTERNAL:按逻辑模式输出表达式结果 %ODBCOUT :按ODBC模式输出表达式结果 例如对于相同的数据,我们采用不同的数据模式输出: 那么除了显示和赋值,哪些操作和数据模式相关呢? 和数据模式相关的操作 1. 比较谓语 在where子句中进行比较的谓语,包括=、>、<、BETWEEN和 IN,这些比较谓语操作时,都会用逻辑模式的值进行比较操作,但可以通过SQL函数做其他数据模式到逻辑模式的数据转换。 例如,我们做日期类型的比较,当前的数据模式是ODBC模式,mydate是ODBC模式,比较条件值也应该是ODBC模式,可以这样写: ... WHERE mydate > '2010-01-01' 而如果数据模式是逻辑数据模式,上面的SQL写法将不会得到你想要的结果,因为这时mydate是逻辑模式的值。你可以用SQL函数TO_DATE将ODBC格式的日期值转为逻辑值: ... WHERE mydate>TO_DATE('2010-01-01','YYYY-MM-DD') 2. 模式谓语在where子句中进行模式分析的谓语,包括%INLIST、 LIKE、 %MATCHES、 %PATTERN、 %STARTSWITH、 [ (包含操作符) 和 ] (跟随操作符),这些模式分析操作也是用逻辑值进行比较,但不能用SQL函数进行其他模式到逻辑模式的转换。 当然,你可以考虑用模式转换函数将数据转换为字符串进行模式分析,例如下面的SQL使用%ODBCOUT将mydate转为ODBC格式的字符串,并看其模式是否满足以“2010-”开头。 ...WHERE %ODBCOut(mydate) %STARTSWITH '2010-' 注意,这时SQL引擎不会使用mydate上的索引,有可能造成性能降低。 3. 排序操作 无论使用哪种数据模式,ORDER BY 都使用逻辑模式的值进行排序。
问题
洪玉 刘 · 二月 8, 2023

license

license和 cpf 文件的使用机制 这个问题有点大,建议先看我们的官方文档后: 有具体问题再继续讨论。 https://docs.intersystems.com/results.html?docs%5Bquery%5D=license, https://docs.intersystems.com/irislatest/csp/docbook/Doc.Results.cls?docs%5Bquery%5D=CPF&docs%5BrefinementList%5D%5Bproduct%5D%5B0%5D=InterSystems%20IRIS&docs%5BrefinementList%5D%5Bversion%5D%5B0%5D=2022.3
文章
Qiao Peng · 三月 29, 2021

CDC系列之三 :建立InterSystems IRIS/Caché的Global数据变更与SQL表记录的对应关系

一些熟悉SQL的用户希望用SQL表的方式获取InterSystems IRIS/Caché的变更数据。知道了Global和SQL表的对应关系,就可以知道是哪一张SQL表数据变化了,甚至通过SQL查询获取变更的数据。下面介绍如何实现这种方式,和注意事项。 获取Global和SQL表的对应关系 通常InterSystems IRIS/Caché的持久化的对象模型(类)和SQL表之间有一一对应的关系;而持久化的对象模型和Global之间也有一一对应关系。建立Global和SQL表的对应关系,通常可以使用以下的SQL查询特定SQL schema下所有表对应的Global: SELECT CC.SqlQualifiedNameQ SQLTable, CS.parent Class, CS.DataLocation FROM %Dictionary.CompiledStorage CS, %Dictionary.CompiledClass CC WHERE CS.parent = CC.ID AND CC.SqlSchemaName= <schemaname> 其中<schemaname>是SQL的Schema名称; 返回字段SQLTable是SQL表名、Class是对象类名、DataLocation是保存数据的Global名称。 多种建模方式Global和SQL表的对应关系的影响 InterSystems IRIS/Caché都是支持多种建模方式的数据平台,常见的建模方式有SQL、面向对象、多维数组。如果之前不了解InterSystems IRIS/Caché的多维数组,可以先简单理解为键值对。无论使用何种建模方式,都可以得到3套模型:SQL模型、对象模型和多维数组存储模型(Global模型)。上面提到通常InterSystems IRIS/Caché的持久化的对象模型(类)和SQL表之间有一一对应的关系。但由于SQL表达模型的局限性, InterSystems IRIS/Caché的对象模型和SQL表之间并不总是一一对应的关系。 下面就逐一分析各种建模方式下,如何分析和获取Global和SQL表的对应关系。 1. 基于SQL建模 如果InterSystems IRIS/Caché模型就是用SQL建模的,查找Global和SQL表的对应关系很简单:对象模型是基于SQL模型自动创建的,因此它们之间是一对一的关系。这是,在Caché里,编译出的Storage 类型为%Library.CacheStorage;在InterSystems IRIS里,编译出的Storage 类型为%Storage.Persistent。 可以执行SQL查询: SELECT CC.SqlQualifiedNameQ as SQLTable, CS.parent as Class, CS.DataLocation FROM %Dictionary.CompiledStorage CS, %Dictionary.CompiledClass CC WHERE CS.parent = CC.ID AND CC.SqlSchemaName= <schemaname> AND type='%Library.CacheStorage' 其中<schemaname>是SQL的Schema名称,如果Schema里有“_”,应将其去掉。Parent字段是SQL表对应的类名,DataLocation是保存数据的Global名称。而Global的第一个下标就是行号/Id字段。 例如使用DDL创建一个table: Create table Demo.Mytable(name varchar(20), notes varchar(100)) 通过上面的SQL查询,DataLocation为Demo.MytableD。那么Journal中所有对于Global为Demo.MytableD的操作就是对表Demo.Mytable的记录操作。例如^Demo.MytableD(123), 就是对行号/Id字段为123的Demo.Mytable记录到操作,从而可以通过SQL: SELECT name, notes from Demo.Mytable WHERE id = 123 获取这条变更的记录。 2. 基于对象建模 如果InterSystems IRIS/Caché模型是使用对象建模的,查找Global和SQL表的对应关系有时并不那么简单。例如以下描述患者及地址的简单对象模型: Class Demo.Address Extends %SerialObject { Property Type As %String; Property City As %String; Property Street As %String; Property RoomNo As %String; } Class Demo.Patient Extends %Persistent { Property Name As %String; Property Gender As %String; Property DOB As %Date; Property Addresses As list Of Demo.Address(SQLPROJECTION = "table", STORAGEDEFAULT = "array"); } 因为患者可能有多个地址,因此Demo.Patient类用以列表类型(list)描述地址属性。其中地址Demo.Address对象模型是通过被引用的持久化对象来序列化的,此处引用它的持久化对象类就是Demo.Patient。Demo.Address类并没有独立的Global保存其数据,它的数据是保存在Demo.Patient的Global中的。 这个对象模型很容易理解,以对象方式在InterSystems IRIS/Caché里也很容易操作数据。但SQL的二维表无法表达这样稍微复杂一点的模型,因此需要将患者的地址投射为一张地址表,并用主外键将地址表和患者表的记录关联起来。 上面的患者对象模型中Addresses属性的SQLPROJECTION和STORAGEDEFAULT参数就是将属性Addresses投射为一张SQL表。 编译后,这个患者对象模型,在SQL上会投射出两张表:患者表:Demo.Patient地址表:Demo.Patient_Addresses注意:SQL表Demo.Patient_Addresses并不是由对象类Demo.Address投射而来,它是由对象类Patient的列表类型的属性Addresses投射而来。对象类Demo.Address是序列化类,它并不会投射SQL表。 执行SQL查询 SELECT CC.SqlQualifiedNameQ as SQLTable, CS.parent as Class, CS.DataLocation FROM %Dictionary.CompiledStorage CS, %Dictionary.CompiledClass CC WHERE CS.parent = CC.ID AND CC.SqlSchemaName= 'Demo' 将返回类似如下结果: SQLTable Class DataLocation Demo.Patient Demo.Patient ^Demo.PatientD Demo.Patient_Addresses Demo.Patient 注意:SQL表Demo.Patient_Addresses并没有对应的Global,因为它的数据是保存在Patient的Global里的。 这时可以使用以下SQL查询获取SQL表Demo.Patient_Addresses对应的Global和下标: SELECT CC.ID||'_'||CSD.Attribute as SQLTable, CS.parent as Class, CS.DataLocation, CSD.Structure, CSD.Subscript FROM %Dictionary.CompiledStorage CS, %Dictionary.CompiledClass CC, %Dictionary.CompiledStorageData CSD WHERE CS.parent = CC.Name AND CS.ID1 = CSD.parent AND CC.SqlSchemaName= 'Demo' AND CC.ID||CSD.Attribute in (select parent from %Dictionary.CompiledStorage where DataLocation is null) 它返回类似如下结果: SQLTable Class DataLocation Structure Subscript Demo.Patient_Addresses Demo.Patient ^Demo.PatientD subnode “Addresses” 这说明SQL表Demo.Patient_Addresses的数据放在Global ^Demo.PatientD的下标为"Addresses"的子节点下。所以对Global节点 ^Demo.PatientD(“Addresses”)的数据变更就是对SQL表Demo.Patient_Addresses的数据变更。 类似的,当创建对象模型的父子关系时,父子关系子方的数据可以保存在父方的Global中。如以下模型:患者模型 Class Demo.Patient Extends %Persistent { Property Name As %String; Property Gender As %String; Property DOB As %Date; Property Addresses As list Of Demo.Address(SQLPROJECTION = "table", STORAGEDEFAULT = "array"); Relationship Encounters As Demo.Encounter [ Cardinality = children, Inverse = Patient ]; } 就诊模型,它和患者模型是父子关系 Class Demo.Encounter Extends %Persistent { Property EncounterNo As %String; Property VisitDate As %Date; Relationship Patient As Demo.Patient [ Cardinality = parent, Inverse = Encounters ]; } 执行SQL查询 SELECT CC.SqlQualifiedNameQ as SQLTable, CS.parent as Class, CS.DataLocation FROM %Dictionary.CompiledStorage CS, %Dictionary.CompiledClass CC WHERE CS.parent = CC.ID AND CC.SqlSchemaName= 'Demo' 将返回类似如下结果: SQLTable Class DataLocation Demo.Encounter Demo.Encounter {%%PARENT}(“Encounters”) Demo.Patient Demo.Patient ^Demo.PatientD Demo.Patient_Addresses Demo.PatientAddresses 这说明SQL表Demo.Encounter的数据放在Global ^Demo.PatientD的下标为" Encounters"的子节点下。所以对Global ^Demo.PatientD(“Encounters”)的数据变更就是对SQL表Demo.Encounter的数据变更。 3. 基于Global建模 直接基于Global建模并不常见。如果是直接基于Global建模的,可以在Global模型的基础上再建立对象模型,这样数据不仅可以使用多维数组方式操作,也可以通过对象和SQL方式操作。 这种情况下的对象模型,使用的Storage 类型在Caché里为%CacheSQLStorage,在InterSystems IRIS里为%Storage.SQL。 例如如下使用%CacheSQLStorage的Caché对象类Demo.Department: Class Demo.Department Extends %Persistent [ StorageStrategy = SQLStorage ] { Property Id As %Integer; Property Name As %String; Property Parent As Demo.Department; Index MyId On Id [ IdKey ]; Storage SQLStorage { <SQLMap name="DataMap"> <Data name="Id"> <Delimiter>"^"</Delimiter> <Node>"id"</Node> <Piece>1</Piece> </Data> <Data name="Name"> <Delimiter>"^"</Delimiter> <Node>"Name"</Node> <Piece>1</Piece> </Data> <Data name="Parent"> <Delimiter>"^"</Delimiter> <Node>"Parent"</Node> <Piece>1</Piece> </Data> <Global>^MyDepartment</Global> <RowIdSpec name="1"> <Field>Id</Field> </RowIdSpec> <Subscript name="1"> <Expression>{Id}</Expression> </Subscript> <Subscript name="2"> <Expression>"Dep"</Expression> </Subscript> <Type>data</Type> </SQLMap> <StreamLocation>^Demo.DepartmentS</StreamLocation> <Type>%CacheSQLStorage</Type> } } 对于这种使用%CacheSQLStorage或%Storage.SQL的对象类所投射出的SQL表,可以使用以下SQL查询获取SQL表对应的Global和下标: SELECT CC.SqlQualifiedNameQ as sqltable, CC.id as class, CSM._Global as DataLocation, CSM.Structure, CSMS.Name as subscript,CSMS.Expression FROM %Dictionary.CompiledStorage CS, %Dictionary.CompiledClass CC, %Dictionary.CompiledStorageSQLMap CSM, %Dictionary.CompiledStorageSQLMapSub CSMS WHERE CS.parent = CC.ID AND CS.ID1 = CSM.parent AND CSM.ID = CSMS.parent AND CSM.Type='data' AND CC.SqlSchemaName= <schemaname> 其中<schemaname>是SQL的Schema名称。它返回类似如下结果: SQLTable Class DataLocation Structure Subscript Expression Demo.Department Demo.Department ^MyDepartment 1 {Id} Demo.Department Demo.Department ^MyDepartment 2 “Dep” 说明SQL表Demo.Department的数据保存在^MyDepartment 中,并且放在2个下标下,第一维下标为Id字段,第二维下标为字符串常量"Dep"。 这时,可以通过^MyDepartment的第一维下标(字段Id)值,执行SQL语句获取变更的整条记录: SELECT * FROM Demo.Department WHERE id=? 使用%CacheSQLStorage/%Storage.SQL为Storage类型的InterSystems IRIS/Caché对象类,其Global模型可以任意灵活,而且不影响对象操作和SQL操作。但这也提高了将Global变更对应到SQL表的难度。 总结 通过上面的分析,如果要从InterSystems IRIS/Caché中通过SQL方式分析数据变更,需要先了解其建模方式,分析Global对应SQL表的关系。可以建立一张SQL表,存储分析得到的Global及下标和SQL表对应关系。当通过Dejournal filter发现global数据变更时,查询该SQL表,将数据变更表达为对应SQL表和对应记录(RowID),从而使用SQL获取完整的变化记录。 其它注意事项:流类型的属性/字段,通常保存在名为S的Global内,因此这些Global的数据更新也应该捕获并转换为对应SQL表的数据变更记录。 CDC系列 更多的CDC选项实现,请参考: 1. CDC系列之一 :使用Dejournal Filter在InterSystems IRIS/Caché上通过Mirroring实现CDC功能 2. CDC系列之二 :使用Dejournaling filter routine在Caché上通过Shadow实现CDC 3. CDC系列之三 :建立InterSystems IRIS/Caché的Global数据变更与SQL表记录的对应关系 4. CDC系列之四:使用DSTIME特性在InterSystems IRIS/Caché上实现CDC功能
公告
Michael Lei · 五月 8, 2021

Intersystems IRIS for Health 数据平台医疗版最新在线培训课程--涉及多个Docker 容器的应用开发

在这个一小时的互动课程中,用户可以参与了涉及多个Docker容器的复合应用程序的开发。此外,学员们还学习如何创建数据转换和业务规则,使用业务流程设计器来建立病人护理的逻辑,并使用Spark和PMML将业务操作与机器学习模型连接起来。 赶快来参加我们的线上课程吧: https://learning.intersystems.com/course/view.php?id=1662&ssoPass=1 只有受众组'1.0 HealthShare Content Access'的成员可以自主选课 请问您的账户可以看其他课程吗?
文章
Claire Zheng · 三月 14, 2023

【视频】互联互通套件赋能数据利用与应用创新

数字化转型已经颠覆了很多行业,相信医疗卫生信息行业也不会例外。我们希望通过InterSystems IRIS医疗版互联互通套件,以互联互通为基础,让医院信息平台成为医疗卫生行业数字化转型的智能核心。
文章
Michael Lei · 八月 9, 2022

如何以编程/自动化方式为InterSystems IRIS创建新的数据库、命名空间和Web应用程序

下面是一个ObjectScript片段,它允许为InterSystems IRIS创建数据库、命名空间和Web应用程序: ``` set currentNS = $namespace zn "%SYS" write "Create DB ...",! set dbName="testDB" set dbProperties("Directory") = "/InterSystems/IRIS/mgr/testDB" set status=##Class(Config.Databases).Create(dbName,.dbProperties) write:'status $system.Status.DisplayError(status) write "DB """_dbName_""" was created!",!! write "Create namespace ...",! set nsName="testNS" //DB for globals set nsProperties("Globals") = dbName //DB for routines set nsProperties("Routines") = dbName set status=##Class(Config.Namespaces).Create(nsName,.nsProperties) write:'status $system.Status.DisplayError(status) write "Namespace """_nsName_""" was created!",!! write "Create web application ...",! set webName = "/csp/testApplication" set webProperties("NameSpace") = nsName set webProperties("Enabled") = $$$YES set webProperties("IsNameSpaceDefault") = $$$YES set webProperties("CSPZENEnabled") = $$$YES set webProperties("DeepSeeEnabled") = $$$YES set webProperties("AutheEnabled") = $$$AutheCache set status = ##class(Security.Applications).Create(webName, .webProperties) write:'status $system.Status.DisplayError(status) write "Web application """webName""" was created!",! zn currentNS ``` 还有以下其他文档手册: - [创建数据库](https://irisdocs.intersystems.com/iris20181/csp/documatic/%25CSP.Documatic.cls?PAGE=CLASS&LIBRARY=%25SYS&CLASSNAME=Config.Databases) - [命名空间](https://irisdocs.intersystems.com/iris20181/csp/documatic/%25CSP.Documatic.cls?PAGE=CLASS&LIBRARY=%25SYS&CLASSNAME=Config.Namespaces) - [CSP 应用](https://irisdocs.intersystems.com/iris20181/csp/documatic/%25CSP.Documatic.cls?PAGE=CLASS&LIBRARY=%25SYS&CLASSNAME=Security.Applications)
文章
Kelly Huang · 三月 28, 2023

安装本地 FHIR 服务器的最快最简单的方法!

嗨大家好! 最近我需要使用 IRIS For Health 设置本地 FHIR 服务器,我认为我找到了有史以来最简单的方法! 只需在终端中运行以下两行: docker run --rm --name my-iris -d --publish 9091:1972 --publish 9092:52773 intersystemsdc/irishealth-community 和 docker exec -it my-iris iris session iris -U "USER" '##class(%ZPM.PackageManager).Shell("install fhir-server")' 您将在 http://localhost:9092/fhir/r4 本地运行 FHIR 服务器。 就是这么简单! FHIR 服务器将使用最新版本的 InterSystems IRIS for Health Community Edition,并将通过 FHIRSERVER 命名空间中的 IPM 包从该应用程序部署 FHIR 服务器。 这是针对 Mac OS的,所以请在评论中添加它在 Windows 中的工作方式。 这是一篇非常短的文章,因为使用 InterSystems IRIS for Health 和IPM Package Manager 设置本地 FHIR 服务器真的很容易。 原文来自于 @ Evgeny Shvarov
公告
Michael Lei · 三月 22, 2023

Caelestinus 2023 孵化器活动正式启动!

大家好! 第二次数字健康互操作与FHIR创业孵化器——Caelestinus,今日启动! 今天,21 支选定的队伍将在 Caelestinus 开始为期八个月的旅程。在孵化期间,团队将数字健康互操作性引入到他们的互联医疗服务或医疗设备创新中,并添加对 FHIR、HL7、DICOM、CDA、X12 和其他数字健康标准的支持,并使用InterSystems IRIS for Health和FHIR Server进行转型在经验丰富的 InterSystems 团队的帮助下。 我很高兴邀请大家观看 Caelestinus 2023 启动活动直播,您可以在其中了解哪些团队被选中以及他们的创新想法。 请从欧洲中部时间下午 3 点开始通过www.caelestinus.tech观看流媒体。 很高兴在在线上与您相见。 祝 Caelestini 初创公司好运!