搜索​​​​

清除过滤器
公告
Claire Zheng · 八月 27, 2024

开发者社区AI (DC AI)来了!

欢迎来到开发者社区AI的新纪元! 🚀 InterSystems Developer Community AI 🚀 开发者社区 AI (即DC AI), 我们的新助手,已经准备好为您答疑解惑! 借助 InterSystems IRIS Vector Search 及 SerenityGPT, 能够基于InterSystems开发者社区提供相关度最高的答案。此外,DC AI支持六种语言,包括英语、西班牙语、葡萄牙语、日语、中文和法语,极大地方便了全球各地的开发者们! 如何使用 登录:登录您的开发者社区账号 导航至 DC AI: 进入 DC AI 页面 ,在您主页的右上角,有一个 "What's New(最新变化)" 模块,通过这个模块即可快速到达DC AI页面。 提问:直接在该页面提交您的问题即可。 更多功能: 如果没有得到您需要的答案,可以使用“在社区提问(Ask Community)”按钮轻松地将您的问题转换为帖子。 您可以使用共享按钮()与他人分享您的聊天内容,并保存/复制答案以备将来参考()。 通过来源部分列出的相关社区帖子,更深入了解DC AI的答案。 我们期待您的回复!由于该功能仍处于测试阶段,您的反馈对改进DC AI至关重要: 使用“喜欢/不喜欢”按钮对答案进行评分。 在这篇文章的评论中分享具体的反馈、建议和想法。 即刻尝试DC AI! 提出您的问题并与社区分享您的经验。
文章
Lilian Huang · 十二月 31, 2022

HL7 ADT消息的类型和ADT^A04的例子

在上一篇文章中,我们讨论了标准 HL7v2 的起源、结构和消息类型。现在让我们看一下最常用的消息类型之一及其结构示例。我说的是 ADT。 HL7 ADT 消息(入院、出院、转院)用于在医疗机构传达基本患者信息、就诊信息和患者状态。 ADT 消息是使用最广泛且容量最大的 HL7 消息类型之一,因为它为许多触发事件提供信息,包括患者入院、注册、取消、更新、出院、患者数据合并等。 所有患者信息都输入到医疗机构的医院信息系统 (HIS) 或电子病历 (EMR) 中。这些系统中的新患者或更新通过 ADT 消息分发到辅助系统,以保持当前患者数据的同步。 此消息有很多子类型,具体取决于情况和要采取的操作。这里是其中的一些。 子类型 描述 ADT^A01 病人入院/就诊 ADT^A02 病人转运 ADT^A03 病人出院 ADT^A04 患者登记 ADT^A05 患者入院前 ADT^A08 患者信息更新 ADT^A11 取消入院 ADT^A12 取消患者转运 ADT^A13 取消患者出院 如果我们查看此类消息的一般结构,它将由以下部分组成。考虑到 HL7v2 的不同版本支持向后兼容,在更高的版本中你可能有更多的字段。 HL7 ADT 的片段 段 描述 MSH 消息头:每条消息都必须包含一个消息头,在 ADT 中称为 MSH 段。标头包含有关发送系统和位置、接收系统和位置、创建消息的日期和时间、正在通信的触发事件类型以及正在使用的 HL7 消息版本的信息。 EVN 事件类型:传达为了生成消息而发生的事件。该段是数据流的关键部分,因为它根据事件类型指示消息发送的位置和时间。 PID 患者识别:重要的患者身份信息,包括患者人口统计信息。 [{NK1}] 近亲联系信息:患者最亲近的亲属的联系信息,以备需要联系时使用。必要时可以重复此部分。 PV1 患者就诊:有关患者帐户的信息或任何特定访问的详细信息,例如服务设施、主治医生和访问 ID 都保存在该部分中。 [PV2] 患者就诊 - 附加信息:该部分是患者就诊具体信息的延续,并且是传达入院原因的部分。如果消息中包含 DG1 段,则它是可选段。如果没有 DG1 段,则需要 PV2 段。 [{OBX}] 观察/结果:每个 OBX 段都包含有关单个医学观察或结果的信息。此段在 ORU(观察报告)消息中更常用。必要时可以重复。 [{AL1}] 过敏信息:包含有关患者过敏的信息,包括过敏原类型、反应和严重程度。必要时可以重复此部分。 [{DG1}] 诊断信息:该部分包含有关患者诊断的信息,并使用 ICD 编码标准来传达特定疾病、体征、症状、异常、患者投诉等。 [{PR1}] 程序:保存有关可以对患者执行的各种程序的信息,并且可以重复以传达有关多个程序的信息。 [{ROL}] 角色:从患者记录中添加、更新、更正和删除所需的人员和事件涉及信息。 [{GT1}] 担保人信息:有关患者担保人(即对患者帐户负有财务责任的人)的信息保存在该部分中。该段在与保险计费应用程序通信时特别有用。 [{IN1..2..3}] 保险信息:生成患者和保险账单所必需的保险单覆盖信息,例如计划和提供者标识符。 [ ] = 可选段,{ } = 重复段 现在我们知道了此类消息的构建块,让我们看一个示例。 HL7 ADT^A04 消息示例 假设我们有以下消息: MSH |^~\&| EPIC | EPICADT | SMS | SMSADT |202211031408| CHARRIS | ADT ^ A04 |1817457| D |2 .5 | EVN ||202211030800||||202211030800 PID ||0493575^^^2^ ID 1|454721|| DOE ^ JOHN ^^^^| DOE ^ JOHN ^^^^|19480203| M || B |254 MYSTREET AVE ^^ MYTOWN ^ OH ^44123^ USA ||(216)123 -4567 ||| M | NON |400003403~1129086| NK1 || ROE ^ MARIE ^^^^| SPO ||(216)123 -4567 || EC ||||||||||||||||||||||||||| PV1 || O |168 ~219~ C ~ PMA ^^^^^^^^^||||277^ ALLEN MYLASTNAME ^ BONNIE ^^^^|||||||||| ||2688684|||||||||||||||||||||||||202211031408||||||002376853 在此示例中,您会注意到我们有 5 个不同的段,由回车符分隔: MSH 、 EVN 、 PID 、 NK1和PV1 。 您还会注意到每个段都包含许多复合材料。例如,在第一行中,竖线字符 (|) 分隔 SMS 和 SMS ADT 段。 最后,在第二行,名字子字段 JOHN 与姓氏 DOE 使用 ^ 字符分隔。 此外,始终有一个所用 HL7v2 标准版本的指示符,以便接收应用程序知道在哪个字段中期望什么。在本例中,版本为 2.5。 现在让我们看看这条消息的每一段,了解它携带的信息。 段MSH MSH|^~\&|EPIC|EPICADT|SMS|SMSADT|202211031408|CHARRIS|ADT^A04|1817457|D|2.5| 场地 长度 选择性 价值 MSH.1 字段分隔符 1个 必需的 | MSH.2 编码字符 4个 必需的 ^~\& MSH.3 发送申请 227 选修的 史诗 MSH.4 发送设备 227 选修的 EPICADT MSH.5 接收申请 227 选修的 短信 MSH.6 接收设施 227 选修的 短消息ADT MSH.7 消息日期/时间 26 必需的 202211031408 MSH.8 安全 40 选修的 查理斯 MSH.9 消息类型 15 必需的 ADT^A04 MSH.10 消息控制 ID 20 必需的 1817457 MSH.11 处理编号 3个 必需的 丁 MSH.12 版本号 60 必需的 2.5 MSH.13 序列号 15 选修的 MSH.14 延续指针 180 选修的 MSH.15 接受确认类型 2个 选修的 MSH.16 申请确认类型 2个 选修的 MSH.17 国家代码 3个 选修的 MSH.18 字符集 16 选修的 MSH.19 消息的主要语言 250 选修的 MSH.20 备用字符集处理方案 20 选修的 MSH.21 消息配置文件标识符 427 选修的 段EVN EVN||202211030800||||202211030800 场地 长度 选择性 价值 EVN.1 事件类型代码 3个 向后兼容性 EVN.2 记录日期/时间 26 必需的 202211030800 EVN.3 日期/时间计划事件 26 选修的 EVN.4 事件原因代码 3个 选修的 EVN.5 操作员编号 250 选修的 EVN.6 事件日期/时间 26 选修的 202211030800 EVN.7 活动设施 241 选修的 段PID PID||0493575^^^2^ID 1|454721||DOE^JOHN^^^^|DOE^JOHN^^^^|19480203|M||B|254 MYSTREET AVE^^MYTOWN^OH^44123^USA ||(216)123-4567|||男|非|400003403~1129086| 场地 长度 选择性 价值 PID.1 设置 ID - PID 4个 选修的 PID.2 患者编号 20 向后兼容性 0493575^^^2^ PID.3 患者标识符列表 250 必需的 1 PID.4 备用患者 ID - PID 20 向后兼容性 454721 PID.5 患者姓名 250 必需的 能源部^约翰^^^^ PID.6 母亲的娘家姓 250 选修的 能源部^约翰^^^^ PID.7 出生日期/时间 26 选修的 19480203 PID.8 行政性 1个 选修的 米 PID.9 患者别名 250 向后兼容性 PID.10 种族 250 选修的 乙 PID.11 患者地址 250 选修的 254 MYSTREET AVE^^MYTOWN^OH^44123^美国 PID.12 县代码 4个 向后兼容性 PID.13 N电话号码 - 主页 250 选修的 (216)123-4567 PID.14 电话号码 - 业务 250 选修的 PID.15 主要语言 250 选修的 PID.16 婚姻状况 250 选修的 米 PID.17 宗教 250 选修的 非 PID.18 患者帐号 250 选修的 400003403~1129086 PID.19 SSN 号码 - 患者 16 向后兼容性 PID.20 驾照号码 - 患者 25 向后兼容性 PID.21 母亲的身份证明 250 选修的 PID.22 民族 250 选修的 PID.23 出生地 250 选修的 PID.24 多胞胎指标 1个 选修的 PID.25 出生顺序 2个 选修的 PID.26 国籍 250 选修的 PID.27 退伍军人军人身份 250 选修的 PID.28 国籍 250 向后兼容性 PID.29 患者死亡日期和时间 26 选修的 PID.30 患者死亡指标 1个 选修的 PID.31 身份未知指示器 1个 选修的 PID.32 身份可靠性代码 20 选修的 PID.33 最后更新日期/时间 26 选修的 PID.34 最后更新工具 241 选修的 PID.35 物种代码 250 有条件的 PID.36 品种代码 250 有条件的 PID.37 拉紧 80 选修的 PID.38 生产类代码 250 选修的 PID.39 部落公民身份 250 选修的 NK1段 NK1||ROE^MARIE^^^^|SPO||(216)123-4567||EC||||||||||||||||||||||||| 场地 长度 选择性 价值 NK1.1 套装 ID - NK1 4个 必需的 NK1.2 NK名称 250 选修的 ROE^MARIE^^^^ NK1.3 关系 250 选修的 SPO NK1.4 地址 250 选修的 NK1.5 电话号码 250 选修的 (216)123-4567 NK1.6 公司电话号码 250 选修的 NK1.7 联系人角色 250 选修的 欧共体 NK1.8 开始日期 8个 选修的 NK1.9 结束日期 8个 选修的 NK1.10 近亲/关联方职称 60 选修的 NK1.11 近亲/关联方职位代码/类别 20 选修的 NK1.12 近亲/关联方雇员编号 250 选修的 NK1.13 组织名称 - NK1 250 选修的 NK1.14 婚姻状况 250 选修的 NK1.15 行政性 1个 选修的 NK1.16 出生日期/时间 26 选修的 NK1.17 生活依赖 2个 选修的 NK1.18 动态状态 2个 选修的 NK1.19 国籍 250 选修的 NK1.20 主要语言 250 选修的 NK1.21 生活安排 2个 选修的 NK1.22 公示码 250 选修的 NK1.23 保护指示灯 1个 选修的 NK1.24 学生指标 2个 选修的 NK1.25 宗教 250 选修的 NK1.26 母亲的娘家姓 250 选修的 NK1.27 国籍 250 选修的 NK1.28 民族 250 选修的 NK1.29 联系原因 250 选修的 NK1.30 联络人姓名 250 选修的 NK1.31 联络人电话 250 选修的 NK1.32 联络人地址 250 选修的 NK1.33 近亲/关联方的标识符 250 选修的 NK1.34 工作现状 2个 选修的 NK1.35 种族 250 选修的 NK1.36 差点 2个 选修的 NK1.37 联系人社会安全号码 16 选修的 NK1.38 近亲出生地 250 选修的 NK1.39 贵宾指标 2个 选修的 段 PV1 PV1||O|168 ~219~C~PMA^^^^^^^^^||||277^ALLEN MYLASTNAME^BONNIE^^^^||||||||| ||2688684|||||||||||||||||||||||202211031408||||||002376853 场地 长度 选择性 价值 PV1.1 设置 ID - PV1 4个 选修的 PV1.2 病人等级 1个 必需的 欧 PV1.3 分配的患者位置 80 选修的 168~219~C~PMA^^^^^^^^^ PV1.4 录取类型 2个 选修的 PV1.5 预准号码 250 选修的 PV1.6 先前的患者位置 80 选修的 PV1.7 主治医生 250 选修的 277^艾伦我的姓氏^邦尼^^^^ PV1.8 推荐医生 250 选修的 PV1.9 咨询医生 250 复古兼容性 PV1.10 医院服务 3个 选修的 PV1.11 临时位置 80 选修的 PV1.12 准考前测试指示器 2个 选修的 PV1.13 重新接纳指标 2个 选修的 PV1.14 承认来源 6个 选修的 PV1.15 动态状态 2个 选修的 PV1.16 贵宾指标 2个 选修的 PV1.17 录取医生 250 选修的 PV1.18 患者类型 2个 选修的 PV1.19 访问次数 250 选修的 2688684 PV1.20 金融类 50 选修的 PV1.21 收费价格指标 2个 选修的 PV1.22 礼遇守则 2个 选修的 PV1.23 信用评级 2个 选修的 PV1.24 合约代码 2个 选修的 PV1.25 合约生效日期 8个 选修的 PV1.26 合同金额 12 选修的 PV1.27 合同期 3个 选修的 PV1.28 兴趣代码 2个 选修的 PV1.29 转移到坏账代码 4个 选修的 PV1.30 转移到坏账日期 8个 选修的 PV1.31 坏账代理代码 10 选修的 PV1.32 坏帐转移金额 12 选修的 PV1.33 坏账回收金额 12 选修的 PV1.34 删除账户指标 1个 选修的 PV1.35 删除帐户日期 8个 选修的 PV1.36 出院处置 3个 选修的 PV1.37 出院地点 47 选修的 PV1.38 饮食类型 250 选修的 PV1.39 维修设施 2个 选修的 PV1.40 床位状况 1个 复古兼容性 PV1.41 帐户状态 2个 选修的 PV1.42 待定地点 80 选修的 PV1.43 先前的临时位置 80 选修的 PV1.44 承认日期/时间 26 选修的 202211031408 PV1.45 出院日期/时间 26 选修的 PV1.46 当前患者余额 12 选修的 PV1.47 总费用 12 选修的 PV1.48 总调整 12 选修的 PV1.49 总付款 12 选修的 002376853 PV1.50 备用访问 ID 250 选修的 PV1.51 访问指标 1个 选修的 PV1.52 其他医疗保健提供者 250 选修的 现在就是这样。在官方门户网站上找到有关 HL7v2 的更多信息。 欢迎在评论部分提出任何意见/建议。
文章
Nicky Zhu · 九月 27, 2021

IRIS 2021 技术文档 First Look 17 Globals

html {overflow-x: initial !important;}:root { --bg-color: #ffffff; --text-color: #333333; --select-text-bg-color: #B5D6FC; --select-text-font-color: auto; --monospace: "Lucida Console",Consolas,"Courier",monospace; --title-bar-height: 20px; } .mac-os-11 { --title-bar-height: 28px; } html { font-size: 14px; background-color: var(--bg-color); color: var(--text-color); font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; } body { margin: 0px; padding: 0px; height: auto; inset: 0px; font-size: 1rem; line-height: 1.42857143; overflow-x: hidden; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: inherit; tab-size: 4; background-position: inherit; background-repeat: inherit; } iframe { margin: auto; } a.url { word-break: break-all; } a:active, a:hover { outline: 0px; } .in-text-selection, ::selection { text-shadow: none; background: var(--select-text-bg-color); color: var(--select-text-font-color); } #write { margin: 0px auto; height: auto; width: inherit; word-break: normal; word-wrap: break-word; position: relative; white-space: normal; overflow-x: visible; padding-top: 36px; } #write.first-line-indent p { text-indent: 2em; } #write.first-line-indent li p, #write.first-line-indent p * { text-indent: 0px; } #write.first-line-indent li { margin-left: 2em; } .for-image #write { padding-left: 8px; padding-right: 8px; } body.typora-export { padding-left: 30px; padding-right: 30px; } .typora-export .footnote-line, .typora-export li, .typora-export p { white-space: pre-wrap; } .typora-export .task-list-item input { pointer-events: none; } @media screen and (max-width: 500px) { body.typora-export { padding-left: 0px; padding-right: 0px; } #write { padding-left: 20px; padding-right: 20px; } .CodeMirror-sizer { margin-left: 0px !important; } .CodeMirror-gutters { display: none !important; } } #write li > figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max-width: 100%; vertical-align: middle; image-orientation: from-image; } button, input, select, textarea { color: inherit; font-family: inherit; font-size: inherit; font-style: inherit; font-variant-caps: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; } input[type="checkbox"], input[type="radio"] { line-height: normal; padding: 0px; } *, ::after, ::before { box-sizing: border-box; } #write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p, #write pre { width: inherit; } #write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p { position: relative; } p { line-height: inherit; } h1, h2, h3, h4, h5, h6 { break-after: avoid-page; break-inside: avoid; orphans: 4; } p { orphans: 4; } h1 { font-size: 2rem; } h2 { font-size: 1.8rem; } h3 { font-size: 1.6rem; } h4 { font-size: 1.4rem; } h5 { font-size: 1.2rem; } h6 { font-size: 1rem; } .md-math-block, .md-rawblock, h1, h2, h3, h4, h5, h6, p { margin-top: 1rem; margin-bottom: 1rem; } .hidden { display: none; } .md-blockmeta { color: rgb(204, 204, 204); font-weight: 700; font-style: italic; } a { cursor: pointer; } sup.md-footnote { padding: 2px 4px; background-color: rgba(238, 238, 238, 0.7); color: rgb(85, 85, 85); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; cursor: pointer; } sup.md-footnote a, sup.md-footnote a:hover { color: inherit; text-transform: inherit; text-decoration: inherit; } #write input[type="checkbox"] { cursor: pointer; width: inherit; height: inherit; } figure { overflow-x: auto; margin: 1.2em 0px; max-width: calc(100% + 16px); padding: 0px; } figure > table { margin: 0px; } tr { break-inside: avoid; break-after: auto; } thead { display: table-header-group; } table { border-collapse: collapse; border-spacing: 0px; width: 100%; overflow: auto; break-inside: auto; text-align: left; } table.md-table td { min-width: 32px; } .CodeMirror-gutters { border-right-width: 0px; background-color: inherit; } .CodeMirror-linenumber { } .CodeMirror { text-align: left; } .CodeMirror-placeholder { opacity: 0.3; } .CodeMirror pre { padding: 0px 4px; } .CodeMirror-lines { padding: 0px; } div.hr:focus { cursor: none; } #write pre { white-space: pre-wrap; } #write.fences-no-line-wrapping pre { white-space: pre; } #write pre.ty-contain-cm { white-space: normal; } .CodeMirror-gutters { margin-right: 4px; } .md-fences { font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; overflow: visible; white-space: pre; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: inherit; position: relative !important; background-position: inherit; background-repeat: inherit; } .md-fences-adv-panel { width: 100%; margin-top: 10px; text-align: center; padding-top: 0px; padding-bottom: 8px; overflow-x: auto; } #write .md-fences.mock-cm { white-space: pre-wrap; } .md-fences.md-fences-with-lineno { padding-left: 0px; } #write.fences-no-line-wrapping .md-fences.mock-cm { white-space: pre; overflow-x: auto; } .md-fences.mock-cm.md-fences-with-lineno { padding-left: 8px; } .CodeMirror-line, twitterwidget { break-inside: avoid; } .footnotes { opacity: 0.8; font-size: 0.9rem; margin-top: 1em; margin-bottom: 1em; } .footnotes + .footnotes { margin-top: 0px; } .md-reset { margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: top; text-decoration: none; text-shadow: none; float: none; position: static; width: auto; height: auto; white-space: nowrap; cursor: inherit; line-height: normal; font-weight: 400; text-align: left; box-sizing: content-box; direction: ltr; background-position: 0px 0px; } li div { padding-top: 0px; } blockquote { margin: 1rem 0px; } li .mathjax-block, li p { margin: 0.5rem 0px; } li blockquote { margin: 1rem 0px; } li { margin: 0px; position: relative; } blockquote > :last-child { margin-bottom: 0px; } blockquote > :first-child, li > :first-child { margin-top: 0px; } .footnotes-area { color: rgb(136, 136, 136); margin-top: 0.714rem; padding-bottom: 0.143rem; white-space: normal; } #write .footnote-line { white-space: pre-wrap; } @media print { body, html { border: 1px solid transparent; height: 99%; break-after: avoid; break-before: avoid; font-variant-ligatures: no-common-ligatures; } #write { margin-top: 0px; padding-top: 0px; border-color: transparent !important; } .typora-export * { -webkit-print-color-adjust: exact; } .typora-export #write { break-after: avoid; } .typora-export #write::after { height: 0px; } .is-mac table { break-inside: avoid; } .typora-export-show-outline .typora-export-sidebar { display: none; } } .footnote-line { margin-top: 0.714em; font-size: 0.7em; } a img, img a { cursor: pointer; } pre.md-meta-block { font-size: 0.8rem; min-height: 0.8rem; white-space: pre-wrap; background-color: rgb(204, 204, 204); display: block; overflow-x: hidden; } p > .md-image:only-child:not(.md-img-error) img, p > img:only-child { display: block; margin: auto; } #write.first-line-indent p > .md-image:only-child:not(.md-img-error) img { left: -2em; position: relative; } p > .md-image:only-child { display: inline-block; width: 100%; } #write .MathJax_Display { margin: 0.8em 0px 0px; } .md-math-block { width: 100%; } .md-math-block:not(:empty)::after { display: none; } .MathJax_ref { fill: currentcolor; } [contenteditable="true"]:active, [contenteditable="true"]:focus, [contenteditable="false"]:active, [contenteditable="false"]:focus { outline: 0px; box-shadow: none; } .md-task-list-item { position: relative; list-style-type: none; } .task-list-item.md-task-list-item { padding-left: 0px; } .md-task-list-item > input { position: absolute; top: 0px; left: 0px; margin-left: -1.2em; margin-top: calc(1em - 10px); border: none; } .math { font-size: 1rem; } .md-toc { min-height: 3.58rem; position: relative; font-size: 0.9rem; border-top-left-radius: 10px; border-top-right-radius: 10px; border-bottom-right-radius: 10px; border-bottom-left-radius: 10px; } .md-toc-content { position: relative; margin-left: 0px; } .md-toc-content::after, .md-toc::after { display: none; } .md-toc-item { display: block; color: rgb(65, 131, 196); } .md-toc-item a { text-decoration: none; } .md-toc-inner:hover { text-decoration: underline; } .md-toc-inner { display: inline-block; cursor: pointer; } .md-toc-h1 .md-toc-inner { margin-left: 0px; font-weight: 700; } .md-toc-h2 .md-toc-inner { margin-left: 2em; } .md-toc-h3 .md-toc-inner { margin-left: 4em; } .md-toc-h4 .md-toc-inner { margin-left: 6em; } .md-toc-h5 .md-toc-inner { margin-left: 8em; } .md-toc-h6 .md-toc-inner { margin-left: 10em; } @media screen and (max-width: 48em) { .md-toc-h3 .md-toc-inner { margin-left: 3.5em; } .md-toc-h4 .md-toc-inner { margin-left: 5em; } .md-toc-h5 .md-toc-inner { margin-left: 6.5em; } .md-toc-h6 .md-toc-inner { margin-left: 8em; } } a.md-toc-inner { font-size: inherit; font-style: inherit; font-weight: inherit; line-height: inherit; } .footnote-line a:not(.reversefootnote) { color: inherit; } .md-attr { display: none; } .md-fn-count::after { content: "."; } code, pre, samp, tt { font-family: var(--monospace); } kbd { margin: 0px 0.1em; padding: 0.1em 0.6em; font-size: 0.8em; color: rgb(36, 39, 41); background-color: rgb(255, 255, 255); border: 1px solid rgb(173, 179, 185); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; box-shadow: rgba(12, 13, 14, 0.2) 0px 1px 0px, rgb(255, 255, 255) 0px 0px 0px 2px inset; white-space: nowrap; vertical-align: middle; } .md-comment { color: rgb(162, 127, 3); opacity: 0.8; font-family: var(--monospace); } code { text-align: left; } a.md-print-anchor { white-space: pre !important; border: none !important; display: inline-block !important; position: absolute !important; width: 1px !important; right: 0px !important; outline: 0px !important; text-shadow: initial !important; background-position: 0px 0px !important; } .os-windows.monocolor-emoji .md-emoji { font-family: "Segoe UI Symbol", sans-serif; } .md-diagram-panel > svg { max-width: 100%; } [lang="flow"] svg, [lang="mermaid"] svg { max-width: 100%; height: auto; } [lang="mermaid"] .node text { font-size: 1rem; } table tr th { border-bottom-width: 0px; } video { max-width: 100%; display: block; margin: 0px auto; } iframe { max-width: 100%; width: 100%; border: none; } .highlight td, .highlight tr { border: 0px; } mark { background-color: rgb(255, 255, 0); color: rgb(0, 0, 0); } .md-html-inline .md-plain, .md-html-inline strong, mark .md-inline-math, mark strong { color: inherit; } .md-expand mark .md-meta { opacity: 0.3 !important; } mark .md-meta { color: rgb(0, 0, 0); } @media print { .typora-export h1, .typora-export h2, .typora-export h3, .typora-export h4, .typora-export h5, .typora-export h6 { break-inside: avoid; } } .md-diagram-panel .messageText { stroke: none !important; } .md-diagram-panel .start-state { fill: var(--node-fill); } .md-diagram-panel .edgeLabel rect { opacity: 1 !important; } .md-require-zoom-fix { height: auto; margin-top: 16px; margin-bottom: 16px; } .md-require-zoom-fix foreignObject { font-size: var(--mermaid-font-zoom); } .md-fences.md-fences-math { font-size: 1em; } .md-fences-advanced:not(.md-focus) { padding: 0px; white-space: nowrap; border: 0px; } .md-fences-advanced:not(.md-focus) { background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: inherit; background-position: inherit; background-repeat: inherit; } .typora-export-show-outline .typora-export-content { max-width: 1440px; margin: auto; display: flex; flex-direction: row; } .typora-export-sidebar { width: 300px; font-size: 0.8rem; margin-top: 80px; margin-right: 18px; } .typora-export-show-outline #write { --webkit-flex: 2; flex: 2 1 0%; } .typora-export-sidebar .outline-content { position: fixed; top: 0px; max-height: 100%; overflow: hidden auto; padding-bottom: 30px; padding-top: 60px; width: 300px; } @media screen and (max-width: 1024px) { .typora-export-sidebar, .typora-export-sidebar .outline-content { width: 240px; } } @media screen and (max-width: 800px) { .typora-export-sidebar { display: none; } } .outline-content li, .outline-content ul { margin-left: 0px; margin-right: 0px; padding-left: 0px; padding-right: 0px; list-style: none; } .outline-content ul { margin-top: 0px; margin-bottom: 0px; } .outline-content strong { font-weight: 400; } .outline-expander { width: 1rem; height: 1.428571429rem; position: relative; display: table-cell; vertical-align: middle; cursor: pointer; padding-left: 4px; } .outline-expander::before { content: ''; position: relative; font-family: Ionicons; display: inline-block; font-size: 8px; vertical-align: middle; } .outline-item { padding-top: 3px; padding-bottom: 3px; cursor: pointer; } .outline-expander:hover::before { content: ''; } .outline-h1 > .outline-item { padding-left: 0px; } .outline-h2 > .outline-item { padding-left: 1em; } .outline-h3 > .outline-item { padding-left: 2em; } .outline-h4 > .outline-item { padding-left: 3em; } .outline-h5 > .outline-item { padding-left: 4em; } .outline-h6 > .outline-item { padding-left: 5em; } .outline-label { cursor: pointer; display: table-cell; vertical-align: middle; text-decoration: none; color: inherit; } .outline-label:hover { text-decoration: underline; } .outline-item:hover { border-color: rgb(245, 245, 245); background-color: var(--item-hover-bg-color); } .outline-item:hover { margin-left: -28px; margin-right: -28px; border-left-width: 28px; border-left-style: solid; border-left-color: transparent; border-right-width: 28px; border-right-style: solid; border-right-color: transparent; } .outline-item-single .outline-expander::before, .outline-item-single .outline-expander:hover::before { display: none; } .outline-item-open > .outline-item > .outline-expander::before { content: ''; } .outline-children { display: none; } .info-panel-tab-wrapper { display: none; } .outline-item-open > .outline-children { display: block; } .typora-export .outline-item { padding-top: 1px; padding-bottom: 1px; } .typora-export .outline-item:hover { margin-right: -8px; border-right-width: 8px; border-right-style: solid; border-right-color: transparent; } .typora-export .outline-expander::before { content: "+"; font-family: inherit; top: -1px; } .typora-export .outline-expander:hover::before, .typora-export .outline-item-open > .outline-item > .outline-expander::before { content: '−'; } .typora-export-collapse-outline .outline-children { display: none; } .typora-export-collapse-outline .outline-item-open > .outline-children, .typora-export-no-collapse-outline .outline-children { display: block; } .typora-export-no-collapse-outline .outline-expander::before { content: "" !important; } .typora-export-show-outline .outline-item-active > .outline-item .outline-label { font-weight: 700; } .md-inline-math-container mjx-container { zoom: 0.95; } :root { --side-bar-bg-color: #fafafa; --control-text-color: #777; } @include-when-export url(https://fonts.loli.net/css?family=Open+Sans:400italic,700italic,700,400&subset=latin,latin-ext); /* open-sans-regular - latin-ext_latin */ /* open-sans-italic - latin-ext_latin */ /* open-sans-700 - latin-ext_latin */ /* open-sans-700italic - latin-ext_latin */ html { font-size: 16px; -webkit-font-smoothing: antialiased; } body { font-family: "Open Sans","Clear Sans", "Helvetica Neue", Helvetica, Arial, 'Segoe UI Emoji', sans-serif; color: rgb(51, 51, 51); line-height: 1.6; } #write { max-width: 860px; margin: 0 auto; padding: 30px; padding-bottom: 100px; } @media only screen and (min-width: 1400px) { #write { max-width: 1024px; } } @media only screen and (min-width: 1800px) { #write { max-width: 1200px; } } #write > ul:first-child, #write > ol:first-child{ margin-top: 30px; } a { color: #4183C4; } h1, h2, h3, h4, h5, h6 { position: relative; margin-top: 1rem; margin-bottom: 1rem; font-weight: bold; line-height: 1.4; cursor: text; } h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor, h5:hover a.anchor, h6:hover a.anchor { text-decoration: none; } h1 tt, h1 code { font-size: inherit; } h2 tt, h2 code { font-size: inherit; } h3 tt, h3 code { font-size: inherit; } h4 tt, h4 code { font-size: inherit; } h5 tt, h5 code { font-size: inherit; } h6 tt, h6 code { font-size: inherit; } h1 { font-size: 2.25em; line-height: 1.2; border-bottom: 1px solid #eee; } h2 { font-size: 1.75em; line-height: 1.225; border-bottom: 1px solid #eee; } /*@media print { .typora-export h1, .typora-export h2 { border-bottom: none; padding-bottom: initial; } .typora-export h1::after, .typora-export h2::after { content: ""; display: block; height: 100px; margin-top: -96px; border-top: 1px solid #eee; } }*/ h3 { font-size: 1.5em; line-height: 1.43; } h4 { font-size: 1.25em; } h5 { font-size: 1em; } h6 { font-size: 1em; color: #777; } p, blockquote, ul, ol, dl, table{ margin: 0.8em 0; } li>ol, li>ul { margin: 0 0; } hr { height: 2px; padding: 0; margin: 16px 0; background-color: #e7e7e7; border: 0 none; overflow: hidden; box-sizing: content-box; } li p.first { display: inline-block; } ul, ol { padding-left: 30px; } ul:first-child, ol:first-child { margin-top: 0; } ul:last-child, ol:last-child { margin-bottom: 0; } blockquote { border-left: 4px solid #dfe2e5; padding: 0 15px; color: #777777; } blockquote blockquote { padding-right: 0; } table { padding: 0; word-break: initial; } table tr { border: 1px solid #dfe2e5; margin: 0; padding: 0; } table tr:nth-child(2n), thead { background-color: #f8f8f8; } table th { font-weight: bold; border: 1px solid #dfe2e5; border-bottom: 0; margin: 0; padding: 6px 13px; } table td { border: 1px solid #dfe2e5; margin: 0; padding: 6px 13px; } table th:first-child, table td:first-child { margin-top: 0; } table th:last-child, table td:last-child { margin-bottom: 0; } .CodeMirror-lines { padding-left: 4px; } .code-tooltip { box-shadow: 0 1px 1px 0 rgba(0,28,36,.3); border-top: 1px solid #eef2f2; } .md-fences, code, tt { border: 1px solid #e7eaed; background-color: #f8f8f8; border-radius: 3px; padding: 0; padding: 2px 4px 0px 4px; font-size: 0.9em; } code { background-color: #f3f4f4; padding: 0 2px 0 2px; } .md-fences { margin-bottom: 15px; margin-top: 15px; padding-top: 8px; padding-bottom: 6px; } .md-task-list-item > input { margin-left: -1.3em; } @media print { html { font-size: 13px; } table, pre { page-break-inside: avoid; } pre { word-wrap: break-word; } } .md-fences { background-color: #f8f8f8; } #write pre.md-meta-block { padding: 1rem; font-size: 85%; line-height: 1.45; background-color: #f7f7f7; border: 0; border-radius: 3px; color: #777777; margin-top: 0 !important; } .mathjax-block>.code-tooltip { bottom: .375rem; } .md-mathjax-midline { background: #fafafa; } #write>h3.md-focus:before{ left: -1.5625rem; top: .375rem; } #write>h4.md-focus:before{ left: -1.5625rem; top: .285714286rem; } #write>h5.md-focus:before{ left: -1.5625rem; top: .285714286rem; } #write>h6.md-focus:before{ left: -1.5625rem; top: .285714286rem; } .md-image>.md-meta { /*border: 1px solid #ddd;*/ border-radius: 3px; padding: 2px 0px 0px 4px; font-size: 0.9em; color: inherit; } .md-tag { color: #a7a7a7; opacity: 1; } .md-toc { margin-top:20px; padding-bottom:20px; } .sidebar-tabs { border-bottom: none; } #typora-quick-open { border: 1px solid #ddd; background-color: #f8f8f8; } #typora-quick-open-item { background-color: #FAFAFA; border-color: #FEFEFE #e5e5e5 #e5e5e5 #eee; border-style: solid; border-width: 1px; } /** focus mode */ .on-focus-mode blockquote { border-left-color: rgba(85, 85, 85, 0.12); } header, .context-menu, .megamenu-content, footer{ font-family: "Segoe UI", "Arial", sans-serif; } .file-node-content:hover .file-node-icon, .file-node-content:hover .file-node-open-state{ visibility: visible; } .mac-seamless-mode #typora-sidebar { background-color: #fafafa; background-color: var(--side-bar-bg-color); } .md-lang { color: #b4654d; } /*.html-for-mac { --item-hover-bg-color: #E6F0FE; }*/ #md-notification .btn { border: 0; } .dropdown-menu .divider { border-color: #e5e5e5; opacity: 0.4; } .ty-preferences .window-content { background-color: #fafafa; } .ty-preferences .nav-group-item.active { color: white; background: #999; } .menu-item-container a.menu-style-btn { background-color: #f5f8fa; background-image: linear-gradient( 180deg , hsla(0, 0%, 100%, 0.8), hsla(0, 0%, 100%, 0)); } :root {--mermaid-font-zoom:1em ;} @media print { @page {margin: 0 0 0 0;} body.typora-export {padding-left: 0; padding-right: 0;} #write {padding:0;}} 目录 技术概要: Globals 1 什么是 Globals? 1 为什么要学习 Globals? 1 试一试: 访问 Globals 的三种方式 2 用前须知 2 导入和检查类定义 2 导入示例数据并检查 Globals 3 关系访问 Globals(Accessing Globals Relationaly) 5 将 Globals 作为对象访问(Accessing Globals as Objects) 6 直接访问 Globals(Accessing Globals Directly) 7 有关 Globals 的更多信息 8 使用 InterSystems IRIS API 访问 Globals 9 了解有关 Globals 的更多信息 10 Globals 及其结构 10 多模型开发 10 InterSystems Native API 10 技术概要: Globals 本文档向您介绍了 globals 的概念,globals是 InterSystems IRIS®数据平台的底层存储结构。我们将向您展示如何使用关系模型和对象模型访问 globals,以及如何直接访问 globals。 要浏览所有的技术概要(First Look),包括可以在 InterSystems IRIS 免费的评估实例上执行的那些 ,请参见 InterSystems First Looks(《InterSystems 技术概要》)。 什么是 Globals? InterSystems IRIS 数据平台的特点之一是它能够一次性存储数据,并允许您使用多个范式(paradigm)来访问它。例如,您可以使用 InterSystems SQL 将数据可视化为行和列,或者您可以使用 ObjectScript 将数据视为具有属性和方法的对象。您的应用程序甚至可以混合使用这两种数据模型,对于给定的任务使用最简单和更有效的模型。但是无论您如何访问数据,InterSystems IRIS 都将其存储在被称为 globals 的底层数据结构中。 Globals 可以被认为是持久化多维稀疏数组(persistent multidimensional sparse arrays): 持久化(Persistent)------Globals 存储在数据库中,可以在任何时候被任何可以访问该数据库的进程(process)检索到。 多维(Multidimensional)------global 节点可以有任意数量的下标。这些下标可以是整数、小数,或字符串。 稀疏(Sparse)------节点下标不必是连续的,这意味着没有存储值的下标不会使用任何存储。 Global 节点可以存储多种类型的数据,包括: 字符串 数字数据 字符或二进制数据流 数据集合,如列表或数组 对其他存储位置的引用 即使是您编写的服务器端代码,最终也存储在 globals 中! 为什么要学习 Globals? 在了解很少或几乎不了解 globals 的情况下,虽然也可以在 InterSystems IRIS 平台上编写应用程序,但出于以下几个原因,您可能想了解有关它们的更多信息: 如果您直接访问 globals,有些操作可能会更容易或更有效。 您可能希望为不符合关系或对象数据模型的数据创建自定义数据结构。 试一试: 访问 Globals 的三种方式 有些系统管理任务是在 global 层面完成的,了解 globals 将使这些任务对您更有意义。 试一试:访问 Globals 的三种方式 在本文档中,您将检查用于存储 U.S. 州类对象的数据的 globals。该类的属性包括州名、双字母邮政缩写、首府、建州年份和面积(单位:平方英里)。然后,您将使用关系和对象技术,以及直接操作 globals 来访问和存储这个类的对象。 用前须知 要使用这个技术概要(First Look),您需要一个正在运行的 InterSystems IRIS 实例。您的选择包括几种类型的已授权的和免费的评估实例;该实例不需要由您正在工作的系统托管(尽管您的系统必须能够通过网络访问该实例)。关于如何部署每种类型的实例的信息(如果您还没有可使用的实例),请参见 InterSystems IRIS Basics: Connecting an IDE(《InterSystems IRIS 基础:连接一个 IDE》)中的 Deploying InterSystems IRIS(部署 InterSystems IRIS)。 您也需要知道: 实例的基于 web 的管理门户(Management Portal)的 URL,这是 InterSystems IRIS 的系统管理用户界面。 如何访问终端(Terminal),InterSystems IRIS 命令行工具。 实例的用户名和密码(InterSystems Labs 上的 web 实例不需要)。 您还需要从 InterSystems GitHub repo :https://github.com/intersystems/First- Look-Globals 下载两个示例文件。 FirstLookGlobals.xml 包含 State 类的类定义。 FirstLookGlobals.gof 包含了 U.S. 最初 13 个州的一些 global 示例数据。 关于如何访问管理门户(Management Portal )或终端(Terminal)的更多信息,请参见 InterSystems IRIS Basics:Connecting an IDE(《InterSystems IRIS 基础:连接一个 IDE》)中的"InterSystems IRIS Connection Information(InterSystems IRIS 连接信息)"。您实际上并不需要一个 IDE 来做这些练习。 导入和检查类(Class)定义 首先,将 State 类定义导入 InterSystems IRIS: 从管理门户(Management Portal)的主页,选择 System Explorer(系统资源管理器) > Classes(类)。 在 Classes 页面上,查看左栏,确保您在 USER 命名空间。您可以把命名空间看作是工作空间或目录。 点击 Import(导入)。 在 Import Classes 的对话框中: a. 如果您的 InterSystems IRIS 实例在远程服务器上运行,请指定是将示例文件下载到远程服务器还是下载到您的本地计算机。 b. 在 File 或 Directory 的 Import(导入)区域,点击 File(文件)。 c. 浏览您从 GitHub 下载的 FirstLookGlobals.xml 文件。 试一试: 访问 Globals 的三种方式 d. 选择 Compile Imported Items(编译导入项)。 e. 对于 Compile Flags(编译标志),指定 cuk。 f. 点击 Next(下一步)。 g. 点击 Import(导入)。 h. 当出现加载成功的消息时,点击 Done(完成)。 现在,在 Classes 页面,您应该看到 FirstLook.State.cls 在类的列表中。在 InterSystems IRIS 中,包含类的包名称(FirstLook)附加有类的名称(State)。扩展名 .cls 用来表示类文件。 注意: 如果您的命名空间包含大量的类,可以在页面左栏的 Class Name(类名) 框中输入 F*.cls 来过滤列表。 在 FirstLook.State.cls 类的右侧,点击 Documentation(文档) 来查看为该类生成的文档。 您会注意到的第一件事是 FirstLook.State 类扩展了 %Persistent 类,这意味着该类的数据将存储在数据库中 (系统定义的类和方法通常以 % 开头) 。 persistent class FirstLook.State extends %Persistent 扩展 %Persistent 还提供了一些方法,您可以使用这些方法在该类上执行操作。例如,它允许您创建该类的新对象或从数据库访问对象并将其加载到内存中。 再往下看,您可以看到这个类有五个属性:Area、Capital、Established、Name 和 PostalAbbr。 property Area as %Integer; property Capital as %String; property Established as %Integer; property Name as %String [ Required ]; property PostalAbbr as %String; 这个类还有两个索引,CapitalIndex 和 PostalAbbrIndex,这两个索引可以加快 SQL 查询的速度,并允许您通过首府和邮政缩写快速查找州。 index (CapitalIndex on Capital) [Unique]; index (PostalAbbrIndex on PostalAbbr) [Unique]; 导入示例数据并检查 Globals 要了解存储 State 类对象的 globals,首先要导入一些数据: 从管理门户(Management Portal)的主页,选择 System Explorer(系统资源管理器) > Globals。(或从 Classes 页面,点击 Globals 按钮。) 在 Globals 页面上,查看左栏,确保您在 USER 命名空间。 点击 Import(导入)。 在 Import Globals 对话框中: a. 如果您的 InterSystems IRIS 实例在远程服务器上运行,请指定是将示例文件下载到远程服务器还是下载到您的本地计算机。 b. 浏览您从 GitHub 下载的 FirstLookGlobals.gof 文件。 c. 点击 Next(下一步)。 d. 点击 Import(导入)。 试一试: 访问 Globals 的三种方式 e. 当出现加载成功的消息时,点击 Done(完成)。 现在,在 Globals 页面上,您应该看到 FirstLook.StateD 和 FirstLook.StateI 这两个 globals 在列表中。默认情况下,类(class)的数据存储在名称后面加 Dappended 的 global 中,索引存储在名称后面加 Iappended 的 global 中。最常见的情况是,您会看到 globals 名称前有一个插入符号(\^)。 注意: 如果您的命名空间包含大量的 globals,可以在页面左栏的 Global Name(Global 名称) 框中输入 F* 来过滤这个列表。 在 FirstLook.StateD global 的右边,点击 View(查看) 来显示 global 内容的列表。 \^FirstLook.StateD = 13 \^FirstLook.StateD(1) = $lb("","Delaware","DE","Dover",1787,2489) \^FirstLook.StateD(2) = $lb("","Pennsylvania","PA","Harrisburg",1787,46054) \^FirstLook.StateD(3) = $lb("","New Jersey","NJ","Trenton",1787,8723) \^FirstLook.StateD(4) = $lb("","Georgia","GA","Atlanta",1788,59425) \^FirstLook.StateD(5) = $lb("","Connecticut","CT","Hartford",1788,5543) \^FirstLook.StateD(6) = $lb("","Massachusetts","MA","Boston",1788,10554) \^FirstLook.StateD(7) = $lb("","Maryland","MD","Annapolis",1788,12406) \^FirstLook.StateD(8) = $lb("","South Carolina","SC","Columbia",1788,32020) \^FirstLook.StateD(9) = $lb("","New Hampshire","NH","Concord",1788,9349) \^FirstLook.StateD(10) = $lb("","Virginia","VA","Richmond",1788,42775) \^FirstLook.StateD(11) = $lb("","New York","NY","Albany",1788,54555) \^FirstLook.StateD(12) = $lb("","North Carolina","NC","Raleigh",1789,53819) \^FirstLook.StateD(13) = $lb("","Rhode Island","RI","Providence",1790,1545) 您可以看到,每个状态的节点都有一个整数的下标,称为对象 ID(或简称 ID),它是在您存储这个类的新对象时由系统生成的。Global 的根节点,没有下标,包含一个计数器,该计数器递增以生成下一个 ID。 每个节点的数据按照在类定义中指定的顺序存储为属性列表。如果查看 \^FirstLook.StateD(3),您可以看到州名是新泽西州(New Jersey),邮政缩写是 NJ,首府是特伦顿(Trenton),该州于 1787 年加入联邦(Union),面积为 8723 平方英里。 点击 Cancel(取消) 返回 globals 列表,然后点击 global FirstLook.StateI 旁边的 View(查看) 查看 State 类的索引。 \^FirstLook.StateI("CapitalIndex"," ALBANY",11) = "" \^FirstLook.StateI("CapitalIndex"," ANNAPOLIS",7) = "" \^FirstLook.StateI("CapitalIndex"," ATLANTA",4) = "" \^FirstLook.StateI("CapitalIndex"," BOSTON",6) = "" \^FirstLook.StateI("CapitalIndex"," COLUMBIA",8) = "" \^FirstLook.StateI("CapitalIndex"," CONCORD",9) = "" \^FirstLook.StateI("CapitalIndex"," DOVER",1) = "" \^FirstLook.StateI("CapitalIndex"," HARRISBURG",2) = "" \^FirstLook.StateI("CapitalIndex"," HARTFORD",5) = "" \^FirstLook.StateI("CapitalIndex"," PROVIDENCE",13) = "" \^FirstLook.StateI("CapitalIndex"," RALEIGH",12) = "" \^FirstLook.StateI("CapitalIndex"," RICHMOND",10) = "" \^FirstLook.StateI("CapitalIndex"," TRENTON",3) = "" \^FirstLook.StateI("PostalAbbrIndex"," CT",5) = "" \^FirstLook.StateI("PostalAbbrIndex"," DE",1) = "" \^FirstLook.StateI("PostalAbbrIndex"," GA",4) = "" \^FirstLook.StateI("PostalAbbrIndex"," MA",6) = "" \^FirstLook.StateI("PostalAbbrIndex"," MD",7) = "" \^FirstLook.StateI("PostalAbbrIndex"," NC",12) = "" \^FirstLook.StateI("PostalAbbrIndex"," NH",9) = "" \^FirstLook.StateI("PostalAbbrIndex"," NJ",3) = "" \^FirstLook.StateI("PostalAbbrIndex"," NY",11) = "" \^FirstLook.StateI("PostalAbbrIndex"," PA",2) = "" \^FirstLook.StateI("PostalAbbrIndex"," RI",13) = "" \^FirstLook.StateI("PostalAbbrIndex"," SC",8) = "" \^FirstLook.StateI("PostalAbbrIndex"," VA",10) = "" 仔细看看 global \^FirstLook.StateI 中的第一个节点。这里,第一个下标("CapitalIndex")是索引的名称,第二个下标是被索引的属性的值("ALBANY"),第三个下标是以奥尔巴尼(Albany)为首府的州的 ID(11)。如果您回顾一下 global 数据,您会发现 \^FirstLook.StateD(11) 是纽约州(New York)。 Globals 使用数组下标自动按排序顺序存储。 试一试: 访问 Globals 的三种方式 关系访问 Globals (Accessing Globals Relationally) 现在,看看为 State 类生成的 InterSystems IRIS 表: 从管理门户(Management Portal)的主页,选择 System Explorer(系统资源管理器) > SQL。 在 SQL 页面上,查看页面的顶部,确保您在 USER 名称空间。 如果不是,请点击 Switch(切换)来改更改命名空间。 在左栏中,展开 Tables(表)部分来查看命名空间中的表。 在 Tables 下,点击 FirstLook.State 表。 在 Catalog Details(目录详情) 标签上,点击 Fields(字段),您将看到为 State 类的每个属性生成的字段,以及称为 ID(有时称为 RowID) 的额外字段。 这个字段类似于您在类的 globals 中看到的对象 ID。 注意: 如果您的命名空间包含大量的表,可以在页面左栏的 Filter(过滤) 框中输入 F* 来过滤列表。 点击 Execute Query(执行查询) 标签,打开一个文本区,您可以在这里编写针对 FirstLook.State 表运行的查询。 输入以下查询: SELECT * FROM FirstLook.State WHERE ID = 6 并点击 Execute(执行)。该查询返回您请求的马萨诸塞州(Massachusetts )的行。 输入以下查询: INSERT INTO FirstLook.State(Area, Capital, Established, Name, PostalAbbr) VALUES (9616, 'Montpelier', 1791, 'Vermont', 'VT') 并点击 Execute(执行),将一行插入第 14 个州佛蒙特州(Vermont )的表中。 要查看在 FirstLook.State 表中插入一行的效果,请返回到命名空间 USER 的 Globals 页面,并再次查看 globals。 从管理门户(Management Portal)的主页,选择 System Explorer(系统资源管理器) > Globals。 在 Globals 页面上,查看左栏,确保您在 USER 命名空间。 查看数据 global,\^FirstLook.StateD,您可以看到 ID 计数器已经增加: \^FirstLook.StateD = 14 并且一个新的节点被添加到 global: \^FirstLook.StateD(14) = $lb("","Vermont","VT","Montpelier",1791,9616) 查看索引 global,\^FirstLook.StateI,可以看到索引已经被更新为两个新节点: \^FirstLook.StateI("CapitalIndex"," MONTPELIER",14) = "" 和 \^FirstLook.StateI("PostalAbbrIndex"," VT",14) = "" 试一试: 访问 Globals 的三种方式 将 Globals 作为对象访问(Accesing Globals as Objects) 请记住,当您创建 State 类时,扩展了类 %Persistent,这使您可以访问一些有用的方法,这些方法使您可以在类的 globals 中存储数据并再次检索它。接下来,通过在 InterSystems 终端(Terminal)中编写一些 ObjectScript 来测试其中一些方法。如果您以前没有使用过终端(Terminal),请参见 InterSystems IRIS Basics:Connecting an IDE(《InterSystems IRIS 基础:连接一个 IDE》)中的"InterSystems IRIS Connection Information(InterSystems IRIS 连接信息"。 在您启动 Terminal session (终端会话)后,您应该看到一个提示符,指示您所处的名称空间。如果您不在 USER 命名空间,执行以下命令: set $namespace = "USER" 首先,将您刚刚用 SQL 查询添加的佛蒙特州(Vermont)的数据加载到内存中。调用 FirstLook.State 类的 %OpenId() 方法,并将返回值赋给变量 vt。%OpenId() 返回对象的"句柄(handle)",更正式地称为对象引用或 OREF。 USER>set vt = ##class(FirstLook.State).%OpenId(14) 您可以通过访问对象的 Name 属性来查看刚刚加载的状态的名称: USER>write vt.Name Vermont 您可以使用 zwrite 命令获取所有对象属性的摘要。该命令提供的其他信息超出了本文档的范围。 USER>zwrite vt vt=2@FirstLook.State ; <OREF> +----------------- general information --------------- | oref value: 2 | class name: FirstLook.State | %%OID: $lb("14","FirstLook.State") | reference count: 2 +----------------- attribute values ------------------ | %Concurrency = 1 <Set> | Area = 9616 | Capital = "Montpelier" | Established = 1791 | Name = "Vermont" | PostalAbbr = "VT" +----------------------------------------------------- 要创建一个新的 State 对象,请使用 %New() 方法,该方法将一个 OREF 返回给新对象。 USER>set newstate = ##class(FirstLook.State).%New() 现在,设置第 15 个州肯塔基州(Kentucky)的属性。USER>set newstate.Name = "Kentucky" USER>set newstate.PostalAbbr = "KY" USER>set newstate.Capital = "Frankfort" USER>set newstate.Established = 1792 USER>set newstate.Area = 40408 检查所有属性。 试一试: 访问 Globals 的三种方式 USER>zwrite newstate newstate=4@FirstLook.State ; <OREF> +----------------- general information --------------- | oref value: 4 | class name: FirstLook.State | reference count: 2 +----------------- attribute values ------------------ | %Concurrency = 1 <Set> | Area = 40408 | Capital = "Frankfort" | Established = 1792 | Name = "Kentucky" | PostalAbbr = "KY" +----------------------------------------------------- 如果您对一切看起来很满意,通过调用新对象的 %Save() 方法将对象保存到磁盘。%Save() 方法返回一个状态,如果保存成功,该状态的值为 1。 USER>set status = newstate.%Save() USER>write status 1 再一次,通过进入管理门户(Management Portal)中的 Globals 页面来检查您的工作。查看数据 global, \^FirstLook.StateD,您可以看到 ID 计数器再次增加: \^FirstLook.StateD = 15 并且一个新的节点被添加到 global: \^FirstLook.StateD(15) = $lb("","Kentucky","KY","Frankfort",1792,40408) 查看索引 global,\^FirstLook.StateI,可以看到索引已经被更新为两个新节点: \^FirstLook.StateI("CapitalIndex"," FRANKFORT",15) = "" 和 \^FirstLook.StateI("PostalAbbrIndex"," KY",15) = "" 直接访问 Globals(Accessing Globals Directly) 虽然 InterSystems IRIS 中的数据最常见的是通过 SQL 或使用对象层来访问,但您也可以直接访问扩展 %Persistent 的类的 globals。这种方法比较棘手,因为您需要知道 global 的结构。 首先,找到 ID 为 15 的州名称。 在终端(Terminal)中,用下标 15 将变量 ky 赋给数据 global 中的节点。 USER>set ky = \^FirstLook.StateD(15) 您可以使用 zwrite 检查存储在这个节点上的值: USER>zwrite ky ky=$lb("","Kentucky","KY","Frankfort",1792,40408) 接下来,使用 $list() 函数来获取列表中的第二项: USER>write $list(ky, 2) Kentucky 根据您在使用 SQL 或对象方法添加状态后检查 globals 所学到的内容,编写一些代码来添加新状态。 首先,准备数据,将每个属性(从对象的角度考虑)或字段(从 SQL 的角度考虑)放入不同的变量。 试一试: 访问 Globals 的三种方式 USER>set name = "Tennessee" USER>set postalabbr = "TN" USER>set capital = "Nashville" USER>set established = 1796 USER>set area = 42144 然后使用 $listbuild() 函数构建可以存储的属性列表。 USER>set properties = $listbuild("", name, postalabbr, capital, established, area) USER>zwrite properties properties=$lb("","Tennessee","TN","Nashville",1796,42144) 使用一个 ObjectScript 语句,增加 \^FirstLook.StateD global 的 ID 计数器,并将新值赋给变量 id。 USER>set id = $increment(\^FirstLook.StateD) USER>write \^FirstLook.StateD 16 USER>write id 16 现在,将数据存储在数据 global 中。 USER>set \^FirstLook.StateD(id) = properties USER>zwrite \^FirstLook.StateD(id) \^FirstLook.StateD(16)=$lb("","Tennessee","TN","Nashville",1796,42144) 现在我们需要手动更新索引,否则在首府(Capital )或邮政缩写(PostalAbbr)上,带有 WHERE 子句的 SQL 查询将不包括田纳西州(Tennessee)。这个过程比存储数据要复杂一些。 对于字符串值(string value)的索引,InterSystems IRIS 将字符串转换为大写字母,并在前面添加一个空格字符,以便于排序。使用 _运算符将一个空格连接到大写字母的前面,然后使用 $zconvert() 函数将其转换为大写字母。然后对邮政缩写执行相同操作。 USER>set capital = $zconvert(" "_capital, "U") USER>set postalabbr = $zconvert(" "_postalabbr, "U") 最后,将索引条目存储在索引 global 中。 USER>set \^FirstLook.StateI("CapitalIndex", capital, id) = "" USER>set \^FirstLook.StateI("PostalAbbrIndex", postalabbr, id) = "" 为确保您正确完成工作,请进入管理门户(Management Portal)中的 Globals 页面,并查看 \^FirstLook.StateD 和 \^FirstLook.StateI globals。您也可以使用 zwrite \^FirstLook.StateD 和 zwrite \^FirstLook.StateI 从终端(Terminal)显示每个 global 的完整内容。 有关 Globals 的更多信息 使用 SQL 创建 Globals 在本文档中,您所看到的 globals 是通过存储使用类定义(class definition)指定的类的对象(object)创建的。您可以通过使用 SQL 创建表和表的索引来创建结构非常相似的 globals。然后,InterSystems IRIS 将根据您创建的表为您生成一个类。 作为练习,进入管理门户(Management Portal)中 USER 命名空间的 SQL 页面,并使用 Execute Query(执行查询)标签执行下列语句。 使用 InterSystems IRIS API 访问 Globals CREATE TABLE FirstLook.SQL (%CLASSPARAMETER USEEXTENTSET 0, %CLASSPARAMETER DEFAULTGLOBAL = '\^FirstLook.SQL', Name CHAR(30) NOT NULL, PostalAbbr CHAR(2), Capital CHAR(30), Established INT, Area INT) CREATE UNIQUE INDEX CapitalIndex ON FirstLook.SQL (Capital) CREATE UNIQUE INDEX PostalAbbrIndex ON FirstLook.SQL (PostalAbbr) INSERT INTO FirstLook.SQL (Name, PostalAbbr, Capital, Established, Area) VALUES ('Maine', 'ME', 'Augusta', 1820, 35380) 在 SQL 页面的左栏中,您现在应该看到 FirstLook.SQL 表。 进入 Classes 页面,找到类 FirstLook.SQL.cls 并查看其文档。您注意到有什么不同吗?这个类有一个额外的索引,称为位图扩展索引(Bitmap Extent Index)。然后进入 Globals 页面,找到 \^FirstLook.SQLD 和 \^FirstLook.SQLI globals。看看 \^FirstLook.SQLI,并看看您是否能找到额外的索引。 创建自定义 Globals 到目前为止,您已经看到了扩展 %Persistent 类时创建的 globals。但是,globals 可用于存储无模式的数据,这些数据可能不适合类或关系范式。例如,使用终端(Terminal)或管理门户(Management Portal),切换到 %SYS 命名空间,并检查 \^CONFIGglobal,它存储了一些 InterSystems IRIS 配置设置。下面是 \^CONFIGglobal 示例的一部分: \^CONFIG("Cluster","CommIPAddress") = "" \^CONFIG("Cluster","JoinCluster") = 0 \^CONFIG("ConfigFile","Version") = "2018.20" \^CONFIG("Conversions","LastConvertTime") = "2019-03-13 08:39:45" \^CONFIG("Databases","ENSLIB") = "/usr/irissys/mgr/enslib/" \^CONFIG("Databases","IRISAUDIT") = "/usr/irissys/mgr/irisaudit/" \^CONFIG("Databases","IRISLIB") = "/usr/irissys/mgr/irislib/" \^CONFIG("Databases","IRISLOCALDATA") = "/usr/irissys/mgr/irislocaldata/" \^CONFIG("Databases","IRISSYS") = "/usr/irissys/mgr/" \^CONFIG("Databases","IRISTEMP") = "/usr/irissys/mgr/iristemp/" \^CONFIG("Databases","USER") = "/usr/irissys/mgr/user/" 如果您想创建和存储自己的自定义数据结构,您可以使用 ObjectScript 轻松做到。使用下面的示例,您可以编写几行代码定义一个有向图来存储机场之间的机票价格: USER>set \^Fares("BOS", "ORD") = 87 USER>set \^Fares("ORD", "BOS") = 63 USER>set \^Fares("BOS", "LAX") = 143 USER>set \^Fares("LAX", "BOS") = 143 USER>set \^Fares("ORD", "LAX") = 57 USER>set \^Fares("LAX", "ORD") = 94 USER>zwrite \^Fares \^Fares("BOS","LAX")=143 \^Fares("BOS","ORD")=87 \^Fares("LAX","BOS")=143 \^Fares("LAX","ORD")=94 \^Fares("ORD","BOS")=63 \^Fares("ORD","LAX")=57 使用 InterSystems IRIS API 访问 Globals 如果您正在用 Java、.NET、Node.js 或 Python 编写应用程序,InterSystems IRIS 提供的 API 允许您使用本文中讨论的三种模型来操作您的数据库: 通过 JDBC、ADO.NET 或 PyODBC API 进行关系访问 通过 InterSystems XEP API 访问对象 通过 InterSystems Native API 直接访问 globals 了解有关 Globals 的更多信息 现在您知道了,无论您决定如何存储或访问数据,您所做的就是使用 globals。 注意: 并非所有语言都支持所有形式的访问。 了解有关 Globals 的更多信息 使用下面列出的参考资料来了解更多有关 globals 和如何访问它们的信息。 Globals 及其结构 Globals QuickStart(Globals 快速入门)------提供 global 结构的可视化视图,并给出在自定义 global 结构中存储数据的示例。 Using Globals(《使用 Globals》)------讨论 Globals 的结构、如何管理它们以及如何使用 SQL 或 ObjectScript 访问它们。 Globals------Defining and Using Classes(定义和使用类)这部分解释了为扩展 %Persistent 类的类创建的 globals 的命名约定。 多模型开发 Multi-Model QuickStart(多模型快速入门)------描述了 InterSystems IRIS 如何允许您用各种不同的语言(包括 Java、.NET 和 ObjectScript)使用您选择的数据模型。 Java QuickStart(Java 快速入门)------向您展示如何使用 Java API 对 InterSystems IRIS 数据库进行关系、对象和直接访问。 .NET QuickStart(.NET 快速入门)------向您展示如何使用 .NET API 对 InterSystems IRIS 数据库进行关系、对象和直接访问。 Python QuickStart(Python 快速入门)------向您展示如何使用 Python API 对 InterSystems IRIS 数据库进行关系、对象和直接访问。 InterSystems Native API Using the Native API for Java(《使用 Native API for Java》) (交互式课程)------向您展示如何使用 Native API for Java 访问 globals 以及调用类方法(call class method)和例程。 Using the Native API for Java(《使用 Native API for Java 》)(书籍)------向您展示如何使用 Native API for Java 访问 globals 以及调用类方法(call class method)和例程。 First Look: InterSystems IRIS Native API for Java(《技术概要:InterSystems IRIS Native API for Java》) --- 展示如何从 Java 应用程序访问 InterSystems IRIS globals。 Using the Native API for .NET(《使用 Native API for .NET》 )(交互式课程)------向您展示如何使用 Native API for .NET 访问 globals 以及调用类方法(call class method)和例程。 Using the InterSystems Native API for .NET(《使用 InterSystems Native API for .NET》)(书籍)------向您展示如何使用 Native API for .NET 访问 globals 以及调用类方法(call class method)和例程。 First Look: InterSystems IRIS Native API for .NET(《技术概要:InterSystems IRIS Native API for .NET》) ------展示如何从 .NET 应用程序访问 InterSystems IRIS globals。 了解有关 Globals 的更多信息 Node.js QuickStart(Node.js 快速入门)------向您展示如何使用 Native API for Node.js 访问 globals 以及调用类方法(call class method)和例程。 Using the Native API for Node.js(《使用 Native API for Node.js》)------向您展示如何使用 Native API for Python 访问 globals 以及调用类方法(call class method)和例程。 First Look: InterSystems IRIS Native API for Node.js(《技术概要:InterSystems IRIS Native API for Node.js》)-展示如何从 Node.js 应用程序访问 InterSystems IRIS globals。 Using the Native API for Python(《使用 Native API for Python》) (交互式课程)------向您展示如何使用 Native API for Python 访问 globals 以及调用类方法(call class method)和例程。 Using the Native API for Python(《使用 Native API for Python》) (书籍)------向您展示如何使用 Native API for Python 访问 globals 以及调用类方法(call class method)和例程。 First Look: InterSystems IRIS Native API for Python(《技术概要:InterSystems IRIS Native API for Python》)------展示如何从 Python 应用程序访问 InterSystems IRIS globals。
问题
洪玉 刘 · 二月 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
公告
Claire Zheng · 四月 18, 2021

置顶--社区福利持续更新中!来Global Masters,赢取Apple AirPods,Amazon Echo Dot,解锁更多奖品

Hi 亲爱的社区开发者们,福利来了! 在Global Masters,我们为 Expert, Ambassador and VIP levels(专家级、大使级和VIP级)的用户提供了更多奖励! Apple AirPods 希望你们喜欢新奖品! 此外,你可以在奖励列表中看到"解锁获奖" 项目,根据提示完成相应目标后,便可解锁并申请奖品。 社区奖励兑换近期更新啦,有帽子,Amzon Echo Dot 等众多新礼品,欢迎大家多赚积分多兑换!!!更多更新还在路上,敬请期待! 关于Global Masters: 如何加入InterSystems Global Masters倡导中心? Global Masters等级及徽章说明(英文) 如果您还没有加入InterSystems Global Masters倡导中心 , 现在就加入吧! 如果您有任何疑问,欢迎跟帖回复! 👍👍 努力攒积分中 问问题,回答问题,发表文章,看帖子,做小测试。。。都可以获得点数,欢迎大家踊跃参与完成挑战! 详情请访问:https://globalmasters.intersystems.com/challenges
文章
Louis Lu · 一月 19, 2023

HL7 V2.5.1 的查询与结果返回

这篇文章主要介绍 HL7 V2.5.1 标准是如何定义查询类请求,以及查询类响应的。相关HL7 V2 的更多基础知识可以参考:HL7v2到底是什么?! 的一系列文章。 1 查询标准的发展 1.1 最早的查询模式 最初,HL7的查询参数通过QRD以及QFR 字段传入。因为这两个字段的设计是为了满足所有的查询需求,所以这两个字段的定义非常随意。 1.2 加强的查询模式 从HL7 V2.3开始,引入了加强版的查询模式,它包含了四种方式: • 嵌入式查询语言类请求查询:自由格式的select SQL语句 • 虚拟表类请求查询:基于特定的select 条件查询服务端的数据库表 • 存储过程类请求查询:执行服务端的存储过程返回数据 • 事件类请求查询:返回基于特定事件的查询结果 1.3 基于2.4 版本的查询 HL 7 v2.3.1之后的版本更清晰地将请求查询的方式与返回查询数据的方式分开,并且强调了“符合性声明”的存在。 HL 7继续支持存储过程、事件查询和虚拟表查询的语义,但推荐使用新的查询方式,即按参数查询(QBP),使语法更清晰。 QBP查询的目的是在一个精确的一致性声明的框架内统一存储过程、事件和虚拟表查询的语义。 同时该标准仍可以继续使用最初模式查询(QRD/QRF),但使用新的查询形式可以更清楚地解释其语义。 2 符合性声明Conformance Statement 符合性声明很像我们熟悉的“接口文档”,在其中定义了哪些数据是可用的,数据将如何被返回,以及哪些变量可以在查询中被赋值以及其约束范围。典型的符合性声明应由下面的内容组成: 介绍部分包含标题、触发事件、模式、特点和目的 查询语法 返回语法 输入规范和注释 返回控制 输出规范和注释 更多符合性声明文档的解释和例子可以参考HL7官方文档。 3 消息格式 正如前面说的,HL 7 v2.3.1之后的版本更清晰地将请求查询的方式与返回查询数据的方式分开,这里重点介绍这两个不同的方式。每种消息的示例会在文章最后给出。 3.1 返回查询结果数据 HL7 定义了三种返回查询结果数据的格式:分段、表格或显示格式。分段格式的响应是由一组HL7段组成。每个查询都会在符合性声明中定义它将返回的HL7片段每个字段的含义。表格式响应是以一组行的形式返回数据,每行一个RDT段。最后的显示查询是以DSP段承载返回数据。 3.1.1 分段响应格式 分段格式的返回是HL7提供数据的传统方式。服务器通过返回HL7段的方式对查询作出响应。例如,对检验数据查询的响应的核心可能由以下分段语法定义。 { PID OBR [{OBX}]。 } 其中,病人信息将在PID段中返回,实验室检验结果在OBR和OBX段中返回。在这种模式下,服务器返回的消息通常与现有的非请求类HL7消息非常接近。 在为分段模式的返回内容定义一致性声明时,数据所有者必须决定它将返回的确切段语法。它应该在必要时阐明每个字段的含义、数据的数量,以及数据是可选的还是必须的。 3.1.2 表格响应格式 表格模式的返回是一个相当传统的由行和列组成的表格。行和列的具体含义会在在该查询的符合性声明中被完整的定义。 当所返回的信息相对简单时,以表格的方式是合适的。但对于涉及复杂的结果嵌套的检验报告来说,它并不是很合适。同时典型的HL7段或段组所携带的数据也可以被建模为一个表格。例如,ADT系统可以将PID、NK1和PV1段拼接到一张表中。但另一方面,在一个单一的表格中包含一个病人的所有就诊历史是很困难的。 3.1.3 显示响应格式 一些情况下,返回的信息不需要被接收的系统保存在数据库里,而只要显示出来就行。 显示响应实际上并不代表组织数据的正式风格。它代表了一个决定,即返回的内容为人类阅读而不是为计算机使用的数据格式。从逻辑上讲,以显示模式返回的内容可能是HL7段模式携带的复杂数据,也可能是由表格模式响应携带的简单记录。 3.2 请求格式 前面介绍的是三种返回查询客户端的方式,现在这里介绍HL7 推荐的三种不同的查询请求方式。 3.2.1 简单参数查询 在简单参数查询中,输入参数在HL7段中连续按顺序传递。 服务器只需要从相应的HL7段中读取它们,并将它们插入到内部函数中执行查询操作。 这是查询的最基本形式,服务端在符合性声明中指定一个固定的参数列表,调用查询时,客户端为每个参数传递一个特定值,这就类似于对数据库调用存储过程并传入参数。 MSH|^~\&|FEH.IVR|HUHA.CSC|HUHA.DEMO||199902031135-0600||QBP^Z58^QBP_Q13|1|D|2.5.1 QPD|Z58^Pat Parm Qry 2|Q502|111069999 RCP|I 3.2.2 示例查询 按示例查询(QBE)是按参数查询(QBP)的扩展,其通过在原本定义的段中发送搜索参数来传递搜索参数,而不是作为QPD段中的字段传递。 例如,如果想要使用QBE执行“查找候选者”查询,则将查询参数保存在PID和或PD 1字段中,并将其中不是查询参数的那些字段留空。 例如,如果宗教不是查询参数之一,则当在查询中发送PID时,PID-17将被留空。 HL 7消息原本定义中不出现的参数,如搜索算法、置信度等, 将继续在QPD段中携带,就像它们在按参数查询一样。 可用作查询参数的确切段和字段将在查询的符合性声明中指定。 MSH|^~\&|FEH.IVR|HUHA.CSC|HUHA.DEMO||199902031135-0600||QBP^Z58^QBP_Q13|1|D|2.5.1 QPD|Z58^Pat Parm Qry 2|Q502 PID|||111069999 RCP|I 3.2.3 选择性查询QSC(Query selection criteria) 第三个方式称为选择性查询QSC,因为它使用了QSC数据类型,而QSC数据类型一般在虚拟表查询中使用。 服务端的符合性声明中将定义客户端可能在表达式中使用的所有变量。 在运行时,客户端能够通过构造类似于“树”节点的方式定义可用的输入参数。 服务端要执行查询,必须可以在运行时分析和解析查询表达式。 服务端可以将输入表达式翻译成它本地可访问数据的语言。 客户端的复杂表达式类似于针对关系数据库的SQL select语句。 MSH|^~\&|FEH.IVR|HUHA.CSC|HUHA.DEMO||199902031135-0600||QBP^Q13^QBP_Q13|1|D|2.5.1 QPD|Z999^Pat Sel Qry 1|Q501|@MedicalRecordNo^EQ^111069999 RCP|I 3.2.4 三种请求格式比较 在使用QSC时,客户端可以选择所提供的任何或所有变量,并且可以为每个变量指定任何允许的运算符和值。 相比之下,在简单参数查询或示例查询中,客户端必须为所提供的所有变量提供值。 简单参数查询易于解析和处理,查询传入参数是预定义好以及有着固定的顺序。 类似地,示例查询也较容易处理,因为参数将出现在定义的段中的固定位置。 相反的,选择性查询需要更多的解析和处理,因为它的灵活性和参数的可选性。 因此,虽然选择性查询向客户端提供了更多功能,但是它对于服务端的处理来说是更繁琐的,简单参数查询和示例查询向客户端提供较少的功能,但通常更易于服务端实现,并且它们往往是基于服务端现有存储过程而提供的。 4 查询返回消息示例 4.1 简单参数查询(QBP)/分段模式返回(RSP) 用户希望查询从1998年5月31日开始到1999年5月31日结束的时间段内,为病历号为“555444222111”的患者分配的所有药物。 使用以下简单参数查询请求消息: MSH|^~\&|PCR|Gen Hosp|PIMS||199811201400-0800||QBP^Z81^QBP_Q11|ACK9901|P|2.5.1|||||||| QPD|Z81^Dispense History^HL7nnnn|Q001|555444222111^^^MPI^MR||19980531|19990531| RCP|I|999^RD| 药房系统识别属于Adam Everyman的医疗记录号“555444222111”,并定位从1998年5月31日开始到1999年5月31日结束的时间段内有4次处方配药,并返回以下RSP消息: MSH|^~\&|PIMS|Gen hosp|PCR||199811201400-0800||RSP^Z82^RSP_Z82|8858|P|2.5.1|||||||| MSA|AA|ACK9901| QAK|Q001|OK|Z81^Dispense History^HL7nnnn|4| QPD|Z81^Dispense History^HL7nnnn|Q001|555444222111^^^MPI^MR||19980531|19990531| PID|||555444222111^^^MPI^MR||Everyman^Adam||19600614|M||C|2222 HOME STREET^^Oakland^CA^94612||^^^^^555^5552004|^^^^^555^5552004|||||34313 2266|||N||||||||| ORC|RE||89968665||||||199805121345-0700|||77^Hippocrates^Harold^H^III^DR^MD||^^^^^555^ 5552104|||||| RXE|1^BID^^19980529|00378112001^Verapamil Hydrochloride 120 mg TAB^NDC|120||mgm|||||||||||||||||||||||||| RXD|1|00378112001^Verapamil Hydrochloride 120 mg TAB^NDC |199805291115-0700|100|||1331665|3||||||||||||||||| RXR|PO|||| ORC|RE||89968665||||||199805291030-0700|||77^Hippocrates^Harold^H^III^DR^MD||^^^^^555^555-5001|||||| RXE|1^^D100^^20020731^^^TAKE 1 TABLET DAILY --GENERIC FOR CALANSR|00182196901^VERAPAMIL HCL ER TAB 180MG ER^NDC |100||180MG|TABLETSA|||G|||0|BC3126631^CHU^Y^L||213220929|0|0|19980821||| RXD|1|00182196901^VERAPAMIL HCL ER TAB 180MG ER^NDC|19980821|100|||213220929|0|TAKE 1 TABLET DAILY --GENERIC FOR CALANSR|||||||||||| RXR|PO|||| ORC|RE||235134037||||||199809221330-0700|||8877^Hippocrates^Harold^H^III^DR^MD||^^^^^555^555-5001||||||RXD|1|00172409660^BACLOFEN 10MG TABS^NDC|199809221415-0700|10|||235134037|5|AS DIRECTED|||||||||||| RXR|PO|||| ORC|RE||235134030||||||199810121030-0700|||77^Hippocrates^Harold^H^III^DR^MD||^^^^^555^555-5001|||||| RXD|1|00054384163^THEOPHYLLINE 80MG/15ML SOLN^NDC|199810121145-0700|10|||235134030|5|AS DIRECTED|||||||||||| RXR|PO 4.2 简单参数查询(QBP)/表格模式返回(RTB) 用户希望获取病历号为“555444222111”的患者的身份信息。使用简单参数查询 MSH|^~\&|PCR|GenHosp|MPI||199811201400-0800||QBP^Z91^QBP_Q13|8699|P|2.5.1|||||||| QPD|Z91^WhoAmI^HL7nnnn|Q0009|555444222111^^^MPI^MR RCP|I|999^RD| RDF|PatientList^CX^20~PatientName^XPN^48~Mother’sMaidenName^XPN^48~DOB^TS^26~Sex^IS^1~Race^CE^80| 以表格方式返回查询结果: MSH|^~\&|MPI|GenHosp|PCR||199811201400-0800||RTB^Z92^RTB_K13|8699|P|2.5.1|||||||| MSA|AA|8699| QAK|Q0009|OK|Z91^WhoAmI^HL7nnnn|1^1| QPD|Z91^WhoAmI^HL7nnnn|Q0009|555444222111^^MPI^MR RDF|PatientList^CX^20~PatientName^XPN^48~Mother’sMaidenName^XPN^48~DOB^TS^26~Sex^IS^1~Race^CE^80| RDT|555444222111^^^MPI^MR|Everyman^Adam||19600614|M|| 4.3 简单参数查询(QBP)/显示模式返回(RDY) 用户希望了解从1998年5月31日开始到1999年5月31日结束的时间段内,为病历号为“555444222111”的患者分配的所有药物。请求消息: MSH|^~\&|PCR|Gen Hosp|PIMS||199909171400-0800||QBP^Z97^QBP_Q15|8699|P|2.5.1|||||||| QPD|Z97^DispenseHistoryDisplay^HL7nnnn|Q005|555444222111^^^MPI^MR||19980531|19990531| RCP|I|999^RD| 返回消息: MSH|^~\&|PIMS|Gen Hosp|PCR||199909171401-0800||RDY^Z98^RDY_K15|8858|P|2.5.1|||||||| MSA|AA|8699| QAK|Q005|OK|Z97^DispenseHistoryDisplay|4 QPD|Z97^DispenseHistoryDisplay^HL7nnnn|Q005|555444222111^^^MPI^MR||19980531|19990531| DSP|| GENERAL HOSPITAL – PHARMACY DEPARTMENT DATE:09-17-99 DSP|| DISPENSE HISTORY REPORT Page 1 DSP||MRN Patient Name MEDICATION Dispense DISP-DATE DSP||555444222111 Everyman,Adam VERAPAMIL HCL 120 mg TAB 05/29/1998 DSP||555444222111 Everyman,Adam VERAPAMIL HCL ER TAB 180MG 08/21/1998 DSP||555444222111 Everyman,Adam BACLOFEN 10MG TABS 09/22/1998 DSP||555444222111 Everyman,Adam THEOPHYLLINE 80MG/15ML SOL 10/12/1998 DSP|| << END OF REPORT >> 4.4 示例查询(QBP)/表格模式返回(RTB) 客户希望查看人口统计学资料如下的患者列表: 姓名:张三 性别:男 生日: 1948年12月11日 客户希望使用peekaboo算法,以及满足80%置信水平。 请求消息: MSH|^~\&|PCR|GenHosp|MPI||199811201400-0800||QBP^Z77^QBP_Q13|8699|P|2.5.1|||||||| QPD|Z77^find_candidates^HL7nnnn|Q0001|peekaboo|80| PID|||||张&三||19481211|M RCP|I|25^RD| RDF|PatientList^CX^20~PatientName^XPN^48~Mother’sMaidenName^XPN^48~DOB^TS^26~Sex^IS^1~Race^CE^80| 返回消息: MSH|^~\&|MPI|GenHosp|PCR||199811201400- 0800||RTB^Z78^RTB_R13|8699|P|2.5.1|||||||| MSA|AA|8699| QAK| QPD|Z77^find_candidates^HL7nnnn|Q0001|peekaboo|80| RDF|PatientList^CX^20~PatientName^XPN^48~Mother’sMaidenName^XPN^48~DOB^TS^26~Sex^IS^1~Race^CE^80| RDT|555444222111^^^MPI&KP.NCA&L^MR|张^三||19481211|M|| 4.5 选择性查询/表格模式返回(RTB) 用户希望了解从1998年5月31日开始到1999年5月31日结束的时间段内,为病历号为"555444222111"的患者分配的所有药物。 将生成以下消息。 请求消息: MSH|^~\&|PCR|Gen Hosp|PIMS||199811201400-0800||QBP^Z95^QBP_Q13|8699|P|2.5.1|||||||| QPD|Z95^Dispense Information^HL7nnnn|Q504|PID.3^EQ^55544422211^AND~RXD.3^GE^19980531^AND~RXD.3^LE^19990531 RCP|I|999^RD| RDF|3|PatientList^ST^20~PatientName^XPN^48~OrderControlCode^ID^2~OrderingProvider^XCN^120~MedicationDispensed^ST^40~DispenseDate^TS^26~QuantityDispensed^NM^20| 返回消息: MSH|^~\&|PIMS|Gen Hosp|PCR||199811201400-0800||RTB^Z96^RTB_K13|8858|P|2.5.1|||||||| MSA|AA|8699| QAK|Q001|OK|Z95^Dispense Information^HL7nnnn|4 QPD|Z95^Dispense Information^HL7nnnn|Q504|PID.3^EQ^55544422211^AND~RXD.3^GE^19980531^AND~RXD.3^LE^19990531 RDF|3|PatientList^ST^20~PatientName^XPN^48~OrderControlCode^ID^2~OrderingProvider^XCN^120~MedicationDispensed^ST^40~DispenseDate^TS^26~QuantityDispensed^NM^20| RDT|555444222111^^^MPI^MR|Everyman^Adam|RE|77^Hippocrates^Harold^H^III^DR^MD |525440345^Verapamil Hydrochloride 120 mg TAB^NDC |199805291115-0700|100 RDT|555444222111^^^MPI^MR|Everyman^Adam|RE|77^Hippocrates^Harold^H^III^DR^MD |00182196901^VERAPAMIL HCL ER TAB 180MG ER^NDC|19980821-0700|100 RDT|555444222111^^^MPI^MR|Everyman^Adam|RE|88^Seven^Henry^^^DR^MD|00172409660^BACLOFEN 10MG TABS^NDC |199809221415-0700|10 RDT|555444222111^^^MPI^MR|Everyman^Adam|RE|99^Assigned^Amanda^^^DR^MD|00054384163^THEOPHYLLINE 80MG/15ML SOLN^NDC|199810121145-0700|10 5 InterSystems IRIS 对于HL7 V2.x 的支持 5.1 内置 HL7 V2.x 文档 方便随时查看HL7 V2.x 各个字段、节点的含义、限制以及可用字典表定义 可以方便的打开一个HL7 V2.x 文档,鼠标悬停就可以看到该字段的解释: 5.2 互操作性 5.2.1 内置的数据转化工具:使用鼠标拖拽就可以进行数据格式的转换 5.2.2 HL7 消息路由编辑器: 图形化页面设置,方便根据HL7 消息字段内容将消息发送到不同目标 5.2.3 消息追踪器:方便追踪在平台中的经过数据的流向
文章
Claire Zheng · 三月 14, 2023

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

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

OpenAPI-Suite(从 OpenAPI 3.0 生成 ObjectScript 代码的工具集):介绍 InterSystems 开发人员工具大赛 2023 获奖者

开发者您好! 这里向介绍@Lorenzo Scalese的OpenAPI-Suite (一个用于从OpenAPI 3.0生成 ObjectScript 代码的工具集)。这个工具集在 2023 年 InterSystems 开发工具大赛的21 个参赛作品中获得专家提名第三名。 目前 IRIS 最高支持OpenAPI 2.0 ,但是这个工具支持 OpenAPI 3.0 ! 提供的功能如下。 在服务器端创建类(与 OpenAPI 2.0相同,首先创建使用 API First理念创建的 REST 调度类所需的类。) 创建客户端 HTTP 类 创建客户端Production(业务服务、业务流程、业务操作、Ens.Request、Ens.Response) 一个 Web 界面,允许您指定要从此工具生成哪些功能 从 OpenAPI 1.x、2.x 到 3.0 版的转换工具 关于各个功能的详细介绍,请参考@Lorenzo Scales撰写的文章《 OpenAPI Suite - Part 1 》和《 OpenAPI Suite - Part 2 》。 在本文中,我尝试了 1 个功能。其中,以下的应对方案非常好。 根据OpenAPI 3.0新增的Components对象的内容自动生成类的定义(在指定包下创建一个模型包,在那里创建可以实例化的类) 在POST或PUT的情况下,为了较为轻松地使用实施类(impl.cls)处理HTTP请求中传递的信息,我将Body中接收到的JSON数据设为了1中生成的类的实例, 目前,虽然需要进行一些手动更改,但是仅使用按原样创建的实例在 impl.cls 中叫 %Save() 方法也可以保存成功。 ) IRIS 提供了一种根据 OpenAPI 2.0 规范创建 REST 调度类的方法,但实际使用中它只创建要使用的类和根URL。 仅作为参考,这里是使用 IRIS 支持的 OpenAPI 2.0 创建的内容。 (以下示例使用了根据 OpenAPI2.0 规范创建的 JSON 示例。) 在下面的示例中,/crud 是根 URL,类是在 crud 包下创建的。​​​​​​ 生成的类如下(左:impl.cls,右:spec.cls) 由于调度类(disp.cls)是一个不需要改动的类,所以这里展示了studio的这部分代码。 接下来介绍一下@Lorenzo Scalese的OpenAPI-Suite的成果。 使用它的过程非常简单。 从管理门户或Studio导入IPM (InterSystems Package Manager,以前称为 ZPM)客户端工具后,您只需运行以下命令,工具就可以使用了。 客户端工具导入可以导入到任意命名空间中。 从管理门户导入时,使用以下菜单: 管理门户 -> 系统资源管理器 -> 类 -> 选择要导入的命名空间 -> 单击导入按钮 转到您希望 REST 调度类存在的命名空间,并使用 ZPM 命令安装工具。 zpm "install openapi-suite" 安装过程中的画面显示 USER>zpm “安装 openapi-suite” [USER|sslclient] 重新加载开始 (/usr/irissys/mgr/.modules/USER/sslclient/1.0.4/)[用户|sslclient] 重新加载成功[sslclient] 模块对象已刷新。[USER|sslclient] 验证开始[USER|sslclient] 验证成功[USER|sslclient] 编译开始[用户|sslclient] 编译成功[USER|sslclient] 激活开始[USER|sslclient] 配置开始[用户|sslclient] 配置成功[USER|sslclient] 激活成功[USER|yaml-utils] 重新加载开始 (/usr/irissys/mgr/.modules/USER/yaml-utils/0.1.2/)[USER|yaml-utils] 重新加载成功[yaml-utils] 模块对象已刷新。[USER|yaml-utils] 验证开始[USER|yaml-utils] 验证成功[USER|yaml-utils] 编译开始[USER|yaml-utils] 编译成功[USER|yaml-utils] 激活开始[USER|yaml-utils] 配置开始[USER|yaml-utils] 配置成功[USER|yaml-utils] 激活成功[USER|swagger-validator-cli] 重新加载开始 (/usr/irissys/mgr/.modules/USER/swagger-validator-cli/0.0.1/)[USER|swagger-validator-cli] 重新加载成功[swagger-validator-cli] 模块对象已刷新。[USER | swagger-validator-cli] 验证开始[USER|swagger-validator-cli] 验证成功[USER|swagger-validator-cli] 编译开始[USER|swagger-validator-cli] 编译成功[USER|swagger-validator-cli] 激活 START[USER|swagger-validator-cli] 配置开始[USER|swagger-validator-cli] 配置成功[USER|swagger-validator-cli] 激活成功[USER|swagger-converter-cli] 重新加载开始 (/usr/irissys/mgr/.modules/USER/swagger-converter-cli/0.0.2/)[USER|swagger-converter-cli] 重新加载成功[swagger-converter-cli] 模块对象已刷新。[USER | swagger-converter-cli] 验证开始[USER|swagger-converter-cli] 验证成功[USER|swagger-converter-cli] 编译开始[USER|swagger-converter-cli] 编译成功[USER|swagger-converter-cli] 激活开始[USER|swagger-converter-cli] 配置开始[USER|swagger-converter-cli] 配置成功[USER|swagger-converter-cli] 激活成功[USER|objectscript-openapi-definition] 重新加载开始 (/usr/irissys/mgr/.modules/USER/objectscript-openapi-definition/1.3.1/)[USER|objectscript-openapi-definition] 重新加载成功[objectscript-openapi-definition] 模块对象已刷新。[USER|objectscript-openapi-definition] 验证开始[USER|objectscript-openapi-definition] 验证成功[USER|objectscript-openapi-definition] 编译开始[USER|objectscript-openapi-definition] 编译成功[USER|objectscript-openapi-definition] 激活开始[USER|objectscript-openapi-definition] 配置开始[USER|objectscript-openapi-definition] 配置成功[USER|objectscript-openapi-definition] 激活成功[USER|io-redirect] 重新加载开始 (/usr/irissys/mgr/.modules/USER/io-redirect/1.0.2/)[USER|io-redirect] 重新加载成功[io-redirect] 模块对象已刷新。[USER|io-redirect] 验证开始[USER|io-redirect] 验证成功[USER|io-redirect] 编译开始[USER|io-redirect] 编译成功[USER|io-redirect] 激活开始[USER|io-redirect] 配置开始[USER|io-redirect] 配置成功[USER|io-redirect] 激活成功[USER|openapi-common-lib] 重新加载开始 (/usr/irissys/mgr/.modules/USER/openapi-common-lib/1.0.0/)[用户|openapi-common-lib] 重新加载成功[openapi-common-lib] 模块对象已刷新。[USER|openapi-common-lib] 验证开始[USER|openapi-common-lib] 验证成功[USER|openapi-common-lib] 编译开始[USER|openapi-common-lib] 编译成功[USER|openapi-common-lib] 激活开始[USER|openapi-common-lib] 配置开始[USER|openapi-common-lib] 配置成功[USER|openapi-common-lib] 激活成功[USER|openapi-server-gen] 重新加载开始 (/usr/irissys/mgr/.modules/USER/openapi-server-gen/1.0.0/)[USER|openapi-server-gen] 重新加载成功[openapi-server-gen] 模块对象已刷新。[USER|openapi-server-gen] 验证开始[USER|openapi-server-gen] 验证成功[USER|openapi-server-gen] 开始编译[USER|openapi-server-gen] 编译成功[USER|openapi-server-gen] 激活开始[USER|openapi-server-gen] 配置开始[USER|openapi-server-gen] 配置成功[USER|openapi-server-gen] 激活成功[USER|openapi-client-gen] 重新加载开始 (/usr/irissys/mgr/.modules/USER/openapi-client-gen/2.1.0/)[USER|openapi-client-gen] 重新加载成功[openapi-client-gen] 模块对象已刷新。[USER|openapi-client-gen] 验证开始[USER|openapi-client-gen] 验证成功[USER|openapi-client-gen] 编译开始[USER|openapi-client-gen] 编译成功[USER|openapi-client-gen] 激活开始[USER|openapi-client-gen] 配置开始[USER|openapi-client-gen] 配置成功[USER|openapi-client-gen] 激活成功[USER|openapi-suite] 重新加载开始 (/usr/irissys/mgr/.modules/USER/openapi-suite/1.0.0/)[用户|openapi-suite] 重新加载成功[openapi-suite] 模块对象已刷新。[USER | openapi-suite] 验证开始[USER|openapi-suite] 验证成功[USER|openapi-suite] 编译开始[USER|openapi-suite] 编译成功[USER | openapi-suite] 激活开始[USER|openapi-suite] 配置开始[USER|openapi-suite] 配置成功[USER|openapi-suite] 激活成功用户> 安装后,您可以通过以下 URL 访问该工具的相关信息。 http://localhost:端口号/openapisuite/ui/index.csp 示例)http://localhost:52773/openapisuite/ui/index.csp 在初始阶段,屏幕右下方的“Install On Server”按钮无法按下。似乎可以通过将值设置为以下全局变量来按下按钮。 (请在你安装工具的命名空间中用ZPM命令设置) Set ^openapisuite .config( "web" , "enable-install-onserver" ) = 1 准备工作完成后,进行以下设置。 对于“Application package name”,选择类定义的包名称(示例中的 PetStore);对于“What do you want to generate?”问题,选择“REST Server”;对于“NameSpace”,选择要注册 REST 调度类的命名空间;对于“Web 应用程序名称”,指定已定义的根 URL(Web 应用程序路径)(示例中的 /pet1)。 之后,只需指定根据OpenAPI规范创建的JSON文件即可。示例中默认指定https://petstore3.swagger.io/api/v3/openapi.json ,我们可以直接使用这个文件路径。 最后,单击 Install On Server 按钮。 日志如下图所示,确认正常结束后点击关闭按钮。 通过该工具,将创建一个 Web 应用程序路径:/pet1。 从管理门户 -> 系统管理 -> 安全 -> 应用程序 -> Web 应用程序检查 /pet1 是否存在。 定义完成! 现在,让我们检查是否已经创建了记载输入路径对应的方法的disp(调度类)和实施代码的impl类。 类定义已经在 PetStore 包下创建完成! 与IRIS提供的OpenAPI 2.0的类不同的是,这里包含了model包和requests包。 在这个工具中,OpenAPI 3.0的Components对象中指定的信息被创建为可以生成实例的类定义。 (它继承了 %RegisteredObject 类) Components对象Pet的信息可以在下方展开查看。 Components:Pet的规格 "Pet":{ "required":[ "name", "photoUrls" ], "type":"object", "properties":{ "id":{ "type":"integer", "format":"int64", "example":10 }, "name":{ "type":"string", "example":"doggie" }, "category":{ "$ref":"#/components/schemas/Category" }, "photoUrls":{ "type":"array", "xml":{ "wrapped":true }, "items":{ "type":"string", "xml":{ "name":"photoUrl" } } }, "tags":{ "type":"array", "xml":{ "wrapped":true }, "items":{ "$ref":"#/components/schemas/Tag" } }, "status":{ "type":"string", "description":"pet status in the store", "enum":[ "available", "pending", "sold" ] } }, "xml":{ "name":"pet" } }, 根据此信息创建的类如下: 它在可以实例化的类中。 如果将super class从 %RegisteredObject 更改为 %Persistent 并编译,则可以将其用作可以在数据库中持久化储存的类。 此外,POST 请求将发送以下格式的 JSON 对象。 { "id": 0, "category": { "id": 0, "name": "Dog" }, "name": "Hachi", "photoUrls": [ "https://x.gd/1pbYK" ], "tags": [ { "id": 0, "name": "Middle" } ], "status": "available" } 能够将此 JSON 直接作为 Pet、Tag 和 Category 类下的实例会很好,因此又追加继承了 %JSON.Adaptor 。 另外,如果我要修改 Pet、Tag 和 Category,最好将super class的配置从 %RegisteredObject 更改为 %Persistent 和 %JSON.Adaptor 的多重继承。 在此之后,需要将接收到的Body信息更新到数据库中。 Request包下的类描述了这个过程的概要。以下示例显示了在向 /pet 发出 POST 请求时运行的类 (PetStore.requests.addPet.cls) 的内容。 如果你注意LoadFromRequest()方法,你会发现它在把可以处理HTTP请求的%request传递给参数request(在IRIS的REST调度类内部处理时,HTTP请求存储在%CSP.Request的一个实例中)。 request.Content 上面的执行可以得到Body中指定的JSON对象。 Do ..PetNewObject (). %JSONImport (request.Content) 这个类中虽然调用了以上方法,但由于该类中实际上并没有PetNewObject()方法,所以做了如下修改(生成一个Pet实例,将其设置为属性Pet,然后将接收到的JSON分配给实例处理)。 set ..Pet = ##class (PetStore.model.Pet). %New () do ..Pet . %JSONImport (request.Content) 这样就完成了接收到 HTTP 请求时的处理。剩下的就是impl.cls的实现了。 在初始状态下,以下方法没有任何描述。 ClassMethod addPet(messageRequest As PetStore.requests.addPet) As %Status { ; Implement your service here. ; Return {} $$$ThrowStatus ( $$$ERROR ( $$$NotImplemented )) } 参数 messageRequest 指定了 PetStore.requests.addPet 类的一个实例,该实例在之前的流程中得到确认(根据 HTTP 请求中收到的 JSON 对象创建的实例在该实例的 Pet 属性中设置。) 改写如下,编译,大功告成! ClassMethod addPet(messageRequest As PetStore.requests.addPet) As %Status { ;Implement your service here. ; Return {} //$$$ThrowStatus($$$ERROR($$$NotImplemented)) set status= $$$OK set status=messageRequest.Pet. %Save () return status } 让我们来测试 POST 请求。 Pet、Category、和Tag都注册并添加数据成功了! 这个用例还是需要一些手动修改,但当我发现类定义是通过 OpenAPI 3.0 Components 对象自动生成的,让我觉得很便利! 大家也请试用一下。
文章
姚 鑫 · 九月 29, 2021

第二十九章 SQL命令 DISTINCT

# 第二十九章 SQL命令 DISTINCT 指定仅返回不同值的`SELECT`子句。 # 大纲 ```sql SELECT [DISTINCT [BY (item {,item2})] ] | [ALL] select-item {,select-item2} ``` ## 参数 - `DISTINCT` - 可选-返回组合选择项值唯一的行。 - `DISTINCT BY (item {,item2})` - 可选-返回按(项)值唯一的行的选择项值。 - `ALL` - 可选-返回结果集中的所有行。默认设置。 # 描述 可选`DISTINCT`子句出现在`SELECT`关键字之后、可选`TOP`子句和第一个`SELECT-ITEM`之前。 `DISTINCT`子句应用于`SELECT`语句的结果集。它将每个不同(唯一)值返回的行数限制为一个任意行。如果未指定`DISTINCT`子句,则默认情况下显示满足选择条件的所有行。`ALL`子句与不指定`DEFAULT`子句相同;如果指定`ALL`,`SELECT`将返回表中满足选择条件的所有行。 `DISTINCT`从句有两种形式: - `SELECT DISTINCT`:为选择项值的每个唯一组合返回一行。可以指定一个或多个选择项。例如,以下查询返回一行,其中包含`Home_State`和`Age`值的每个唯一组合的`Home_State`和`Age`值: ```sql SELECT DISTINCT Home_State,Age FROM Sample.Person ``` - `SELECT DISTINCT BY(Item)`:为项目值的每个唯一组合返回一行。可以指定单个项目或逗号分隔的项目列表。指定的项目或项目列表必须用括号括起来。可以在by关键字和圆括号之间指定或省略空格。选择项列表可以(但不一定)包括指定的项。例如,以下查询返回一行,其中包含`Home_State`和`Age`值的每个唯一组合的`Name`和`Age`值: ```sql SELECT DISTINCT BY (Home_State,Age) Name,Age FROM Sample.Person ``` 项目字段必须按列名指定。有效值包括以下值:列名(`DISTINCT BY(City)`);`%ID`(返回所有行);指定列名的标量函数(`DISTINCT BY(ROUND(Age,-1)`;指定列名的排序函数(`DISTINCT BY(%Exact(City)`。不能按列别名指定字段;尝试这样做会生成`SQLCODE-29`错误。不能按列号指定字段;这将被解释为文字,并返回一行。将文字指定为`DISTINCT`子句中的项值将返回`1`行;返回哪行是不确定的。因此,指定`7`、`‘Chicago’`、`‘’`、`0`或`NULL`都返回`1`行。但是,如果将文字指定为逗号分隔列表中的项值,则该文字将被忽略,并且`DISTINCT`将为指定字段名的每个唯一组合选择一行。 `DISTINCT`子句在`TOP`子句之前应用。如果两者都指定,则`SELECT`只返回具有唯一值的行,唯一值是在`TOP`子句中指定的唯一值行数。 如果`DISTINCT`子句中指定的列包含`NULL`(不包含值)行,则`DISTINCT`将返回一行作为`DISTINCT`(唯一)值的`NULL`,如以下示例所示: ```sql SELECT DISTINCT FavoriteColors FROM Sample.Person ``` ```sql SELECT DISTINCT BY (FavoriteColors) Name,FavoriteColors FROM Sample.Person ORDER BY FavoriteColors ``` `DISTINCT`子句在嵌入式SQL简单查询中没有意义,因为在这种类型的嵌入式SQL中,`SELECT`始终只返回一行数据。但是,嵌入式SQL基于游标的查询可以返回多行数据;在基于游标的查询中,`DISTINCT`子句只返回唯一值行。 ## DISTINCT和ORDER BY `DISTINCT`子句在`ORDER BY`子句之前应用。因此,`DISTINCT`和`ORDER BY`的组合将首先选择满足`DISTINCT`子句的任意行,然后根据`ORDER BY`子句对这些行进行排序。 ## DISTINCT和GROUP BY `DISTINCT`和`GROUP BY`这两个记录按指定字段(或多个字段)分组,并为该字段的每个唯一值返回一条记录。它们之间的一个重要区别是`DISTINCT`在分组之前计算聚合函数。`GROUP BY`计算分组后的聚合函数。以下示例显示了这种差异: ```sql SELECT DISTINCT BY (ROUND(Age,-1)) Age,AVG(Age) AS AvgAge FROM Sample.Person /* Avg(Age)返回表中所有年龄的平均值 */ ``` ```sql SELECT Age,AVG(Age) AS AvgAge FROM Sample.Person GROUP BY ROUND(Age,-1) /* Avg(Age)返回每个年龄组的平均年龄 */ ``` `DISTINCT`子句可以用一个或多个聚合函数字段指定,尽管这很少有意义,因为聚合函数返回单个值。因此,下面的示例返回单行: ```sql SELECT DISTINCT BY (AVG(Age)) Name,Age,AVG(Age) FROM Sample.Person ``` 注意:如果将聚合函数作为唯一项或选择项的`DISTINCT`子句与`GROUP BY`子句一起使用,则`DISTINCT`子句将被忽略。可以使用子查询实现`DISTINCT`、聚合函数和`GROUP BY`的预期组合。 ## 字母大小写与DISTINCT优化 根据为字段定义的排序规则类型,将字符串值不同地分组在一起。默认情况下,字符串数据类型字段使用`SQLUPPER`排序规则定义,该排序规则不区分大小写。 如果字段/特性排序规则类型为`SQLUPPER`,则分组的字段值将全部以大写字母返回。要按原始字母大小写对值进行分组,或以原始字母大小写显示分组字段的返回值,请使用`%Exact`排序规则函数。以下示例显示了这一点,这些示例假设`Home_City`字段是使用排序规则类型`SQLUPPER`定义的,并且包含值`‘New York’`和`‘New York’`: ```sql SELECT DISTINCT BY (Home_City) Name,Home_City FROM Sample.Person /* 将Home_City值按其大写字母值组合在一起将以大写字母返回每个分组城市的名称。因此,返回‘new york’. */ ``` ```sql SELECT DISTINCT BY (Home_City) Name,%EXACT(Home_City) FROM Sample.Person /* 将Home_City值按其大写字母值组合在一起将返回每个分组的城市的名称(原始字母大小写)。因此,可以返回‘New York’或‘new York’,但不能同时返回两者。 */ ``` ```sql SELECT DISTINCT BY (%EXACT(Home_City)) Name,Home_City FROM Sample.Person /* 将Home_City值按其原始字母大小写组合在一起将返回每个分组的城市的名称(原始字母大小写)。 因此,‘New York’和‘new York’都会返回。 未使用优化. */ ``` 可以使用管理门户优化包含`DISTINCT`子句的查询的查询性能。依次选择系统管理、配置、SQL和对象设置、SQL。查看和编辑`GROUP BY`和`DISTINCT`查询必须生成原始值选项。(此优化也适用于`GROUP BY`子句。)。默认值为“否”。 此默认设置按字母值的大写排序规则对字母值进行分组。此优化利用选定字段的索引。因此,只有在一个或多个选定字段存在索引时才有意义。它对存储在索引中的字段值进行排序;字母字符串以全部大写字母返回。您可以设置此系统范围的选项,然后使用`%exact`排序规则函数为特定查询覆盖它以保留字母大小写。 也可以使用`$SYSTEM.SQL.Util.SetOption()`方法快速区分选项在系统范围内设置此选项。要确定当前设置,请调用`$SYSTEM.SQL.CurrentSettings()`,它显示打开的不同优化设置;默认值为`1`。 ## DISTINCT的其他用法 - 流字段:`DISTINCT`对流字段的`OID`进行操作,而不是对其实际数据进行操作。因为所有流字段`OID`都是唯一值,所以`DISTINCT`对实际流字段重复数据值没有影响。`DISTINCT BY(StreamField)`将流字段为空的记录数减少到一个空记录。 - 星号语法:`DISTINCT*`语法是合法的,但没有意义,因为根据定义,所有行都包含一些不同的唯一标识符。不同于(`*`)的语法不合法。 - 子查询:在子查询中使用`DISTINCT`子句是合法的,但没有意义,因为子查询返回单个值。 - 未选择行数据:`DISTINCT`子句可以与不访问任何表数据的`SELECT`一起使用。如果`SELECT`包含`FROM`子句,则在一行中指定`DISTINCT`结果将包含这些非表值;如果未指定`DISTINCT`(或`TOP`),则`SELECT`将产生与`FROM`子句表中的行数相同的行数。如果`SELECT`不包含`FROM`子句,则`DISTINCT`是合法的,但没有意义。 - 聚合函数:可以在聚合函数中使用`DISTINCT`子句,以仅选择要包含在聚合中的不同(唯一)字段值。与`SELECT DISTINCT`子句不同,聚合函数中的`DISTINCT`不包括`NULL`作为`DISTINCT`(唯一)值。请注意,`MAX`和`MIN`聚合函数分析`DISTINCT`子句语法没有错误,但此语法不执行任何操作。 ## DISTINCT和%ROWID 指定`DISTINCT`关键字会导致基于游标的嵌入式SQL查询不设置`%ROWID`变量。即使`DISTINCT`不限制返回的行数,也不设置`%ROWID`。下面的示例显示了这一点: ```java ClassMethod Distinct() { s %ROWID = 999 &sql( DECLARE EmpCursor3 CURSOR FOR SELECT DISTINCT Name, Home_State INTO :name,:state FROM Sample.Person WHERE Home_State %STARTSWITH 'M' ) &sql( OPEN EmpCursor3 ) q:(SQLCODE '= 0) for { &sql( FETCH EmpCursor3 ) q:SQLCODE w !,"RowID: ",%ROWID," row count: ",%ROWCOUNT w " Name=",name," State=",state } &sql( CLOSE EmpCursor3 ) } ``` 查询行为的这种更改仅适用于基于游标的嵌入式`SQL SELECT`查询。动态`SQL SELECT`查询和非游标嵌入式`SQL SELECT`查询从未设置`%ROWID`。 ## DISTINCT和事务处理 指定`DISTINCT`关键字会导致查询检索所有当前数据,包括当前事务尚未提交的数据。忽略事务的`READ COMMITTED`隔离模式参数(如果设置);在`READ UNCOMMITTED`模式下检索所有数据。 # 示例 以下查询为每个不同的`Home_State`值返回一行: ```sql SELECT DISTINCT Home_State FROM Sample.Person ORDER BY Home_State ``` 以下查询为每个不同的`Home_State`值返回一行,但返回该行的其他字段。无法预测检索到的是哪一行: ```sql SELECT DISTINCT BY (Home_State) %ID,Name,Home_State,Office_State FROM Sample.Person ORDER BY Home_State ``` 以下查询为`Home_State`和`Office_State`值的每个不同组合返回一行。根据数据的不同,它要么返回更多行,要么返回与上一个示例相同的行数: ```sql SELECT DISTINCT BY (Home_State,Office_State) %ID,Name,Home_State,Office_State FROM Sample.Person ORDER BY Home_State,Office_State ``` 以下查询使用`DISTINCT BY`为每个不同的名称长度返回一行: ```sql SELECT DISTINCT BY ($LENGTH(Name)) Name,$LENGTH(Name) AS lname FROM Sample.Person ORDER BY lname ``` 下面的查询使用`DISTINCT BY`为`FavoriteColors` `%List`值的每个不同的第一个元素返回一行。它列出`FavoriteColors`为空的不同行: ```sql SELECT DISTINCT BY ($LIST(FavoriteColors,1)) Name,FavoriteColors,$LIST(FavoriteColors,1) AS FirstColor FROM Sample.Person ``` 以下查询按排序规则升序返回从`Sample.Person`检索到的前`20`个不同的`Home_State`值。`“top”`行反映`Sample.Person`中所有行的`ORDER BY`子句排序。 ```sql SELECT DISTINCT TOP 20 Home_State FROM Sample.Person ORDER BY Home_State ``` 以下查询在主查询和`WHERE`子句子查询中都使用`DISTINCT`。它返回`Sample.Person`中的前`20`个不同的`Home_State`值,这些值也在`Sample.Employee`中。如果未提供子查询`DISTINCT`,它将检索`Sample.Person`中与`Sample.Employee`中随机选择的`Home_State`值匹配的`DISTINCT Home_State`值: ```sql SELECT DISTINCT TOP 20 Home_State FROM Sample.Person WHERE Home_State IN(SELECT DISTINCT TOP 20 Home_State FROM Sample.Employee) ORDER BY Home_State ``` 以下查询返回前`20`个不同的`FavoriteColore`值。这反映了`Sample.Person`中所有行的`ORDER BY`子句排序。众所周知,`FavoriteColors`字段具有`NULL`,因此`FavoriteColors`为`NULL`的不同行出现在排序规则序列的顶部。 ```sql SELECT DISTINCT BY (FavoriteColors) TOP 20 FavoriteColors,Name FROM Sample.Person ORDER BY FavoriteColors ``` 还要注意,在前面的示例中,因为`FavoriteColors`是一个列表字段,所以归类序列包括元素长度字节。因此,以三个字母元素(红色)开头的不同列表值列在以四个字母元素(蓝色)开头的列表值之前。
文章
姚 鑫 · 七月 25, 2023

第二章 HL7 架构和可用工具

# 第二章 HL7 架构和可用工具 - HL7 模式和消息概述 ## HL7 模式和消息概述 `InterSystems` 产品可以处理和传递 `HL7` 消息,而无需使用架构来解析它,但将架构与消息关联允许执行以下操作: - 解析消息并访问以下字段值: - 数据转换 - 路由规则 - 自定义 `ObjectScript` 代码 - 验证消息是否符合架构。 每个 `HL7` 消息均由消息类型标识,该消息类型在 `MSH` 段 `MessageType` 字段 (`MSH:9`) 中指定。一些消息类型共享相同的消息结构。例如,在`HL7`版本`2.3.1`中,用于预先接纳患者的`ADT_A05`消息具有与`ADT_A01`接纳消息相同的结构。该架构指定 `ADT_A05` 消息具有结构类型 `ADT_A01`。 为了解析 `HL7` 消息,需要两条信息: - 架构类别 — 这是 `HL7` 版本号,例如 `2.3.1` 或 `2.7`,或者它可能是 `InterSystems` 产品中定义的自定义架构的类别。`production` 从业务服务消息模式类别设置或从数据转换设置获取模式类别。尽管 `HL7` 消息在 `MSH` 段 `VersionID` 字段中包含模式版本号 (`MSH:12`),但 `InterSystems` 不使用此值,因为许多应用程序并未一致地设置此字段。 - 结构类型 - `production` 从 `MSH:9` 字段获取消息类型,然后检查架构定义以获取该消息的结构类型。 在某些情况下,使用 `MSH:9.3` 子字段来限定消息类型。 `MSH:9:`3 子字段在 `HL7` 消息中以两种方式使用:1) 作为消息类型的修饰符,或 2) 指定结构类型。如果 MSH:9:3 修改消息类型(通常为数字),InterSystems 产品会将其作为消息类型的一部分。如果 MSH:9:3 指定结构类型(例如 `ADT_A01`),则 `InterSystems` 在确定消息类型和设置 `Name` 属性时都会忽略它。 `InterSystems` 产品不需要 `MSH:9.3` 子字段来确定结构类型,因为它们从架构中获取结构类型。 当业务服务或数据转换创建 `EnsLib.HL7.Message` 对象来存储 `HL7` 消息时,它会组合架构类别和结构类型,并使用以下语法将其存储在 `DocType` 属性中: ``` category:structureType ``` 例如,类别 `2.3.1` 的有效 `DocType` 值包括 `2.3.1:ACK`、`2.3.1:ADT_A17`、`2.3.1:BAR_P01` 和 `2.3.1:PEX_P07`。消息类型可以与结构类型不同,存储在 `Name` 属性中。 如果在 `ObjectScript` 代码中创建 `EnsLib.HL7.Message` 对象,则应根据 `MSH:9` 字段中的值设置 `DocType` 和 `Name` 属性。 `HL7` 标准允许本地扩展,例如尾部 `Z` 段。这些段未在基本架构类别中定义。如果要访问数据转换、路由规则或 `ObjectScript` 中自定义 `Z` 段中的字段,则需要定义指定扩展消息的自定义架构类别。 可以将自定义 `HL7` 架构置于源代码管理之下。启用源代码控制后,源代码控制选项(例如签出和签入)可从主 `HL7` 模式页面使用,但在用于处理自定义模式的其他页面(例如 `HL7` 模式消息类型页面)上不可用。在使用其他页面编辑架构之前,必须从 `HL7` 架构页面检查整个架构。 `HL7` 模式主页面提供了源代码控制输出窗口,该窗口捕获所有相关 `HL7` 模式页面的源代码控制活动。有关设置源代码控制的信息,请参阅将 `IRIS` 与源代码控制系统集成。 这个应该只是讲的HL7 v2 的消息吧?
文章
Michael Lei · 八月 19, 2022

IRIS 医疗版docker 容器初体验

我很高兴与大家分享我第一次使用docker容器版本的IRIS for Health的经验,以探索你对使用或试用的兴趣,利用docker容器的优势,它是轻量级的,易于部署。本文将通过使用Renan Lourenco编写的名为ENSDEMO的GitHub仓库的实施步骤。 设置IRIS for Health社区版docker容器环境的步骤: 启动运行Docker 下载docker 镜像image docker pull containers.intersystems.com/intersystems/irishealth-community:2022.2.0.304.0 从GitHub 克隆源repository git clone https://github.com/OneLastTry/irishealth-ensdemo 改一下文件目录. 从docker-compose.yml建立容器镜像 docker-compose build 运行你的容器 docker-compose up -d 在我最初的尝试中,我无法下载irishealth community:2022.2.0.304.0的确切版本,因为它在ENSDEMO的最初发布中已经发生了变化。修复方法是,当试图从InterSystems容器注册表拉出docker镜像时,在注册表中拉出最新的可用标签。 我遇到的另一个错误是在执行docker-compose build命令后显示"=>ERROR[internal]load metadata for docker pull containers.intersystems.com/intersystems/irishealth-community:2022.2.0.293.0" 。这是因为我下载的docker镜像的版本和Dockerfile中指定的容器镜像版本之间有冲突。 登录IRIS医疗版: 管理门户: http://localhost:9092/csp/sys/%25CSP.Portal.Home.zen 用户名: SuperUser 密码: SYS SuperServer 端口: 9091 Web 端口: 9092 命名空间: ENSDEMO 启动 IRIS 终端 session: docker exec -it ensdemo iris session iris 启动 bash session: docker exec -it ensdemo /bin/bash 视频: https://www.loom.com/share/36bd8c63db724eebae65debf0d89c821 参考: https://github.com/OneLastTry/irishealth-ensdemo by Renan Lourenco (Renan.Lourenco@intersystems.com) https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=ACLOUD 咨询下,启动出现下边错误,是什么原因呢? [root@elite ~]# docker logs irishealth[INFO] Executing command /home/irisowner/irissys/startISCAgent.sh 2188...[INFO] Writing status to file: /home/irisowner/irissys/iscagent.statusReading configuration from file: /home/irisowner/irissys/iscagent.confISCAgent[18]: StartingISCAgent[19]: Starting ApplicationServer on *:2188[INFO] ...executed command /home/irisowner/irissys/startISCAgent.sh 2188[ERROR] Required Linux capability cap_setuid is missing.[ERROR] Required Linux capability cap_dac_override is missing.[ERROR] Required Linux capability cap_fowner is missing.[ERROR] Required Linux capability cap_setgid is missing.[ERROR] Required Linux capability cap_kill is missing.[FATAL] Your IRIS container is missing one or more required Linux capabilities.[INFO] Executing command /home/irisowner/irissys/startISCAgent.sh 2188... 最新docker引擎做了变化,运行IRIS的2022.2之前的版本,要增加一个参数--check-caps false,例如: docker run --name test2 --publish 1972:1972 --publish 52773:52773 docker.iscinternal.com/intersystems/irishealth:2021.1.0.215.0 --check-caps false --key <keyfile-path>
文章
Lilian Huang · 五月 10, 2022

关于自适应分析Adaptive Analytics 示例模式操作!

InterSystems IRIS 2021.1 的发布引入了自适应分析(Adaptive Analytics)的介绍。 为了开始使用和熟悉 InterSystems IRIS BI cube示例,我们创建了一个用于自适应分析的 HoleFoods 应用程序示例模版。 此示例应用程序可在 Open Exchange 上获得, 还有一个学习服务课程learning services course 可用于了解有关自适应分析的更多信息。 首先,前往 Open Exchange 并点击下载按钮。您将会被引至发布页面,该页面包含最新版本的应用程序示例, 下载 ZIP 文件开始创建示例样本。 加载示例样本前准备 IRIS 确保你已经在IRIS 命名空间中已经有要导入的样本MySample 模式被定义 如果未定义上述1模式,请在 SMP 中运行以下 SQL 创建表 MySample.Dummy (P1 INT NOT NULL) 如果您还想设置一些 global mappings, 请至少插入 1 行,以便找出需要映射的global hash 插入MySample.Dummy (P1) 值 (1) 在 AtScale 中,登录并转到 PROJECTS 选项卡 点击 hamburger 菜单 并选择 "Use a sample" 选择您的DWH,the MySample 模式,和zip 文件 可以使用默认权限 您现在该期待IRIS中的新Table和AtScale中的新Project了! 安装示例应用程序后,您可以开始使用 Excel、Tableau 或 Power BI 等第三方工具发现和探索数据功能。 查看已发布的多维数据集时,您可以查看有关如何连接到不同第三方工具的详细信息。 相比发现和探索数据功能,您可能首先会探索这个模式与现有的 HoleFoods InterSystems IRIS BI Cube做比较。
文章
yaoguai wan · 九月 30, 2022

IRIS架构的浅显理解以及windows10、docker安装IRIS Health详解流程及部分问题浅析

前言 本人因技术需要,了解到了IRIS Health产品,在听了产品介绍会之后,感觉该产品是否有趣,并且比较符合自己目前的需求,因此大概了解了下IRIS的架构。以下是本人的浅显理解,如有错误之处欢迎讨论。 本人从产品介绍和社区的文档中,了解到IRIS的大概功能分类 InterSystems IRIS是一款数据平台,适用于软甲开发人员 基于FHIR 整合医疗全流程数据,通过机器学习和人工智能分析 业务优化 数据管理 Sharding数据分片技术 分布式架构 IRIS互操作性 数据分析能力 IRIS对FHIR的支持 机器学习与自动化 其中结合到自己想要研究的领域,想要探索是否可以利用该产品并结合其他工具开发一套通用的专病数据库构建及应用方法。 我目前对该产品的初步定位是对自行提供的数据集合的存储和处理,其中提供包括编码规范、高效存储架构、编程接口、算法在内的辅助工具。针对数据的处理和应用,该产品做的很完善,但是对于数据的获取,例如是否支持extract-transformation-load功能,或者能否利用自定义编程接口实现流批一体化数据抽取。根据上述两个问题,第一步需要安装该产品,所以本人根据社区官网上相关的安装教程进行了安装实验,在此期间发现了社区的教程有些简单并且有些关键点很容易被忽视本人在安装过程中就遇到过一个和系联的工程师讨论了一段时间之后才发现的,因此想与大家分享下安装过程中遇到的一些问题,避免一些问题后,安装过程还是很简单的,傻瓜式操作,后面可以分享下我的安装命令。 问题分享 首先注意产品的平台基本要求,这是平台操作手册上讲的,一定要严格遵守否则会报各种奇怪的错误,IRIS对不同版本的操作系统间的兼容性还有比较严格的,要注意,操作系统和后面容器的配合,我遇到的一个问题就是操作系统的版本和容器的版本不一致导致安装失败。 1、使用docker安装IRIS Health 安装平台介绍:Ubuntu18.04及docker 20.10 要求满足的容器版本20.04 安装过程中遇到的问题:注意linux的发行版本,必须严格遵守,本人在安装过程中最开始使用的是Ubuntu20,使用docker pull containers.intersystems.com/intersystems/iris-community:2022.1.0.209.0 命令可以顺利拉取镜像,但是在启动容器的过程中,一直失败,参考社区中有关启动失败时,设置cpu等限制sudo docker run --name my-iris --cpuset-cpus 0-7 -d store/intersystems/iris-community:2021.2.0.649.0,同样失败,最后发现是ubuntu的版本问题导致的,我最开始只关注了docker的版本,后来使用ubuntu18.04,即可顺利拉取镜像并启动容器。 附:1、查看ubuntu版本命令 cat /proc/version 2、查看docker版本命令 dicker version 2、windows安装IRIS Health 安装平台介绍:windows10(64位) 硬件介绍:16核cpu,32G运存,500G存储。注:因为本人采用的是虚拟机,所以各项配置初始时调整的很高,安装后发现社区版对各种性能有限制,例如cpu最多用8个,内存限制等,所以硬件环境无需太高,但是也不能太低,像windows10这种,首先要保证系统可以顺利安装, 在配置方面,Win10的配置要求其实并不高,具体配置如下: CPU:1GHz或更快的处理器   RAM:1GB(32位)或2GB(64位)   HDD:16GB(32位操作系统)或20GB(64位操作系统)   显卡:DirectX 9或更高版本(包含WDDM 1.0驱动程序)   显示器:1024x600分辨率   简而言之,只要满足或者高于以上要求即可安装。 但是考虑到iris还要占用很大一块运存和存储,所以windows10最少得4G运存和200G存储,这样系统运行不会太卡,iris运行速度也算可以(这个速度我只测试没有运行处理任务的速度)。 安装过程中遇到的问题:1、注意windows10的位数不要安装32位的操作系统,同时IRIS不支持windows7,一开始没注意,一直安装失败。 windows确定操作系统版本以及位数的命令不在赘述,google一下,很简单。 下一步计划 平台建好以后开始考虑数据的获取,下一步首先继续熟悉iris产品架构,然后尝试能否实现ETL与IRIS的对接。 好文,期待下一步分享! linux的安装可以参考一下马老师写的这篇文章https://cn.community.intersystems.com/node/516631,很nice
文章
Louis Lu · 四月 15, 2021

2020线上峰会 —— 第2天数据平台专题会议精彩回顾

我们刚刚结束了第二天的专题会议,会议内容精彩纷呈!虽然大家无法同时观看多个平行会议,但是线上会议有一个优势,那就是您可以根据自己的需要回看错过的内容! 在昨天的博客文章(第一天会议亮点)中,我介绍了大部分值得关注的公告,如 InterSystems IRIS Adaptive Analytics 和FHIR加速器服务等。所以,今天我想更宽泛地讨论一些战略主题。 运营和系统管理 现在,越来越多的客户业务已经运行在云端,也有越来越多的人开始在本地部署现代部署策略。Mark Bolinsky今天主持了两场背靠背会议:CL003 云存储策略和CL004 云备份策略,为使用云端生产工作的用户带来了很多技术细节。我们新推出的系统警报和监控(SAM)模块也得到了不错的反馈。相关内容请查看DEV007 系统警报和监控和CL005 分布式部署。另一个另广大开发者兴奋的消息是,集群监控现在可以轻松实现。在此感谢所有参与并提出问题的与会者! 安全性 在安全性方面,InterSystems一直受到客户和分析师的高度好评,不过大多数人会认为这样做是为了保持自身产品的安全。这当然是我们的一个目标,但是我们还添加了许多新的安全特性。今天的SEC000 OCSP装订就是一个典型的例子。虽然OCSP(在线证书状态协议)可提供更强的安全性,但也会影响浏览器性能。使用OCSP装订功能后,服务器会检查X.509证书的有效性,并将状态进行装订响应给浏览器,从而大幅缩短响应时间,并增强安全性。 机器学习 去年,我们发布了一款纯SQL的嵌入式机器学习工具——IntegratedML。现在,这一工具已被广泛应用。今天,Tom Dyar向大家介绍了这款工具的入门教程,并深入探讨了H2O和DataRobot的合作。昨天的内容还包括我们的早期采用者Baystate的用例。更多关于机器学习平台的最佳实践的内容将在明天为大家揭晓! 数据仓库和商业智能 为了让InterSystems IRIS能够更加成功地应用于分析用例中,我们做了大量投资,新的自适应分析产品只是其中的一项。Benjamin De Boe在会上概述了公司在数据仓库技术方面所做出的努力,并向大家介绍了我们SQL引擎的一些内部结构。在终端用户方面,Mark Massias介绍了我们为用户提供的自由选择——用户可以自由选择商业智能和报告工具,以便将数据仓库中的数据可视化。最后,Carmen Logue介绍了我们的合作伙伴——来自BioReference Labs的Mike Senatore,他们采用了我们新的“Selective Cube Build”功能,以最大限度地提高其InterSystems IRIS BI环境的可用性。明天会介绍关于我们与新技术合作伙伴Altheryx在该领域的更多合作内容! 开发人员对话 在今天的几个会议中,我们的开发人员介绍了几款将数据和应用程序导入IRIS数据平台的强大工具。Harry介绍了如何使用Change Data Capture这一现代技术在数据库之间进行数据迁移。如果您想要构建客户端应用程序,请查看Bob Kuszewki的指南:对象、关系和本机客户端Java API。说到应用程序开发,如果您想要构建和部署IRIS应用程序,那么Tim Leavitt主持的ZPM软件包管理器专题会议不容错过。 互操作性和FHIR Matt Spielman在FHIR展望专题会议中回顾了自2014年开始的InterSystems对FHIR技术的研究历史。他概述了未来两年的FHIR路线图,包括bulk FHIR和FHIR分析。随着FHIR的发展,FHIR的需求增长越来越多地来自客户,而InterSystems工程师的推动作用越来越小。 InterSystems在增强X12支持方面将继续投入大量资金。IP004:新的X12增强功能展示专题会议简短介绍了X12的新功能,并演示了一些值得关注的功能,包括SNIP Level 1和2验证以及专门针对X12的合并DTL支持功能。 Stefan Wittmann在IP003:HL7 Feeds助力高效运行专题会议中提前展示了HL7生产力工具包的最新功能。InterSystems IRIS现在能够根据入站和出站HL7v2消息生成DTL存根,支持接口开发人员采用迭代模式改进DTL和重新测试。我们希望此功能可以进一步提高生产力。另一个功能是将用户跨命名空间或安装实例对production进行修改成为可能,从而显着降低升级成本。 自InterSystems API Manager(IAM)问世一年多以来,许多合作伙伴已经使用了InterSystems IRIS数据库平台的这一新功能。所以今天的会议对IAM进行了更深入的介绍。IP002:快速入门InterSystems API Manager 为尚未探索IAM的人士提供了一次快速了解IAM主要功能的机会,并介绍了下一版本IAM 1.5.0.3将包含的新特性。Stefan还在IP001:IAM的最佳实践专题会议中探讨了实现高可用性并对API流量提供最佳粒度控制的方法。 未来活动 专题会议将于明天结束,我们期待会议取得圆满成功。会后大家仍然可以通过多种方式与我们互动。欢迎通过VS2020questions@InterSystems.com发送您的问题和反馈。您还可以在当天结束时参与现场问答环节,充分利用下周的学习和工作时间。 如果想深入了解您感兴趣的话题,最好的途径是参与我们的咨询专家活动。欢迎提前预约10月30日或11月2日由专家或培训师主持的相关会议! 今天的线上峰会上您最喜欢的内容是什么?请在下方的评论中告诉我们。 祝明天的会议顺利! Jeff
文章
Vivi Zhu · 五月 7, 2022

KLAS报告: 2022美国EMR电子病历市场份额

从数据上看,2022年Epic的市场份额遥遥领先,而Cerner的市场却在不断被蚕食。 非常骄傲的是Epic电子病历是基于InterSystems数据平台构建,早在2020年Epic就将其数据库从Cache升级到InterSystems IRIS。 关于KLASKLAS是一家全球性数据驱动型公司,旨在通过提升医疗机构和保险公司的话语权来改善医疗服务水平和质量。KLAS与数以千计的医疗领域专业人员携手合作,收集对软件、服务和医疗设备的相关见解与反馈,并发布相应的行业报告、发展趋势和统计概况。KLAS如实提供准确且公正的数据,这种调研直接反映了医疗领域专家的声音,并帮助医疗行业的供应商提高业绩。更多详情,请登录:https://klasresearch.com/ 报告原文也可以从网上获取。 V总第一篇!