我可以从AIX命令行提示符运行以下命令,而不会出现任何问题
-bash-2.05b$ echo t t -bash-2.05b$ echo œ œ
当我从内部Cache调用时,我遇到了问题。
USER>D $ZF(-1,"echo t") t USER>D $ZF(-1,"echo œ") D $ZF(-1,"echo œ") ^ <TRANSLATE>
我正在使用Cache 2017.2。有人可以帮忙吗?
谢谢你。
我可以从AIX命令行提示符运行以下命令,而不会出现任何问题
-bash-2.05b$ echo t t -bash-2.05b$ echo œ œ
当我从内部Cache调用时,我遇到了问题。
USER>D $ZF(-1,"echo t") t USER>D $ZF(-1,"echo œ") D $ZF(-1,"echo œ") ^ <TRANSLATE>
我正在使用Cache 2017.2。有人可以帮忙吗?
谢谢你。
在Ensemble中使用SQL进行批量插入
你好,社区。
我试图在一个表中插入多个值。下面是简单的SQL语句。
插入到表X中
values ('Name', 'Address', 'Phone')
我怎样才能在一条语句中进行多次插入(行)?
数值不在另一个表中,所以我不能使用选择进入。
谢谢。
吉米-克里斯蒂安
Hello Community,
I am trying to insert multiple values in a table. Below is the simple sql statement.
Insert Into TableX
values ('Name', 'Address', 'Phone')
How can i do multiple inserts(rows) in one single statement?
Values are not in another table, so i cannot use Select into.
Thanks,
Jimmy Christian.
我想知道是否有更好的方法来使用动态SQL对数据集进行分页,而不是我下面使用的方法。问题是,当潜在的数据池变大时,这段代码就会变慢,以至于无法使用。在分析下面的每一行代码时,似乎速度变慢与最初的rset.%Next()迭代有关。 有没有什么不需要子查询/%VID的可用方法,比如简单的LIMIT/OFFSET?
我的代码类似于:
s sql=##class(%SQL.Statement).%New()
s query="SELECT *,%VID FROM (SELECT prop FROM table WHERE prop=x) WHERE %VID BETWEEN 1 AND 100"
s sc=sql.%Prepare(query)
s rset=sql.%Execute()
while rset.%Next() {.....
从Terminal 访问 global 内容,答案见英文社区:
https://community.intersystems.com/post/view-globals-terminal
大家好!
我正在创建一个脚本,从Ensemble Production中删除一个项目(Component),我知道有手动的方法,但由于有几个Component,我想用一个脚本来更快。
我试着用%Delete()并在Ens.Config.Item上做选择,但这最终在生产中产生了几个错误。有谁知道我怎样才能简单地做到这一点?
答案参见:https://community.intersystems.com/post/delete-item-production
Hi, 请问如何更改表(有数据)上的主键?谢谢!
答:
如果数据已经存在,那么这是一项必须重视的任务,特别是如果存在继承或父/子关系,因为这将导致你的数据存储方案的改变。
最简单的方法是通过一个中间(临时)表来实现。
创建一个具有相同结构的新类,但有一个新的主键。
使用SQL(不是合并命令)将数据从旧的类中移到它里面。
删除旧类中的数据/索引,然后改变其中的主键。
使用合并命令,将数据从新类移到旧类中。
删除带有数据的新类。
重建索引(如果有的话)。
几个有用的链接:
MERGE
如果仍然有问题,最好向WRC寻求帮助。
Hi 大家好! 我是 Sergei Sarkisian,在InterSystems 做Angular 前端7年。Angular是非常流行的框架,我们的开发人员、客户和合作伙伴经常选择它来开发他们的应用程序。
我会写一系列的文章,涵盖Angular的不同方面:概念、方法、最佳实践、高级主题等等。这个系列的文章将针对那些已经熟悉Angular的人,不会涉及基本概念。由于我正在构建文章的路线图,我想从突出最近的Angular版本中的一些重要功能开始。
这可能是近几年来Angular最受欢迎的功能。有了Angular 14,开发者现在可以在Angular Reactive Forms中使用TypeScript的所有严格类型检查功能。
表单控制Formcontrol 类现在是通用的,并接受它所持有的值的类型。
/* Before Angular 14 */
const untypedControl = new FormControl(true);
untypedControl.setValue(100); // value is set, no errors
// Now
const strictlyTypedControl = new FormControl<boolean>(true);
strictlyTypedControl.IRIS 异常处理程序可以处理 Python 异常并将它们无缝传递给 ObjectScript。在前面的 Python 库示例的基础上,如果尝试使用不存在的文件调用 canvas.drawImage(),并在 ObjectScript 中捕获异常,会看到以下内容:
USER>try { do canvas.drawImage("C:\Sample\bad.png", 150, 600) } catch { write "Error: ", $zerror, ! }
Error: <THROW> *%Exception.PythonException <THROW> 230 ^^0^DO canvas.drawImage("W:\Sample\isc.png", 150, 600)
<class 'OSError'>: Cannot open resource "W:\Sample\isc.png" -
这里 是从 Python 传回的异常。
Python 对“字节”数据类型的对象和字符串(表示字符串的 UTF-8 字节序列)进行了明确区分,它们是简单的 8 位字节序列。
用 ObjectScript 编写的方法中的参数可以通过值或引用传递。在下面的方法中,签名中第二个和第三个参数前面的 ByRef 关键字表示它们打算通过引用传递。
ClassMethod SandwichSwitch(bread As %String, ByRef filling1 As %String, ByRef filling2 As %String)
{
set bread = "whole wheat"
set filling1 = "almond butter"
set filling2 = "cherry preserves"
}
从 ObjectScript 调用方法时,在参数前放置一个句点以通过引用传递它,如下所示:
USER>set arg1 = "white bread"
USER>set arg2 = "peanut butter"
USER>set arg3 = "grape jelly"
USER>do ##class(User.EmbeddedPython).SandwichSwitch(arg1, .arg2, .由于 ObjectScript 和 Python 语言之间的差异,将需要了解一些有助于弥合语言之间差距的信息。
在 ObjectScript 方面,%SYS.Python 类允许从 ObjectScript 使用 Python。
在 Python 方面,iris 模块允许使用 Python 中的 ObjectScript。在 Python 中,键入 help(iris) 以获取其方法和函数的列表。
builtins 包在 Python 解释器启动时自动加载,它包含语言的所有内置标识符,例如基对象类和所有内置数据类型类、异常类、函数和常量。
可以将此包导入 ObjectScript 以访问所有这些标识符,如下所示:
set builtins = ##class(%SYS.Python).Import("builtins")
Python print() 函数实际上是内置模块的一个方法,因此现在可以在 ObjectScript 中使用此函数:
USER>do builtins.print("hello world!")
hello world!嵌入式 Python 让可以轻松访问数以千计的有用库。通常称为“包”,它们需要从 Python 包索引 (PyPI) 安装到 目录中,然后才能使用。
例如,ReportLab Toolkit 是一个用于生成 PDF 和图形的开源库。以下命令使用软件包安装程序 irispip 在 Windows 系统上安装 ReportLab:
C:\InterSystems\IRIS\bin>irispip install --target C:\InterSystems\IRIS\mgr\python reportlab
在基于 UNIX 的系统上,使用:
$ pip3 install --target /InterSystems/IRIS/mgr/python reportlab
安装包后,可以使用 %SYS.Python 类的 Import() 方法在 ObjectScript 代码中使用它。
给定一个文件位置,以下 ObjectScript 方法 CreateSamplePDF() 创建一个示例 PDF 文件并将其保存到该位置。
Class Demo.可以通过以下方式定义表:
MyApp.Person表可以使用DDL CREATE TABLE语句来定义,指定SQL schema.table名称。成功执行这个SQL语句会生成一个相应的持久化类,包名MyApp,类名Person。当使用DDL命令定义一个表时,你不需要指定USEEXTENTSET或创建一个位图范围索引。InterSystems SQL会自动应用这些设置,并将它们包含在预测的持久化类中。默认情况下,CREATE TABLE在相应的类定义中指定了Final类的关键字,表示它不能有子类。
CREATE TABLE MyApp.Person (
Name VARCHAR(50) NOT NULL,
SSN VARCHAR(15) DEFAULT 'Unknown',
DateOfBirth DATE,
Sex VARCHAR(1)
)
ClassMethod CreateTable() As %String
{
&sql(CREATE TABLE Sample.本文概述了InterSystems SQL的特点,特别是那些没有被SQL标准所涵盖或与InterSystems IRIS 数据平台的统一数据架构有关的特点。假定你已有SQL的知识,本文不是SQL概念或语法的介绍。
在InterSystems SQL中,数据是在表内呈现的。每个表都被定义为包含若干列。一个表可以包含零个或多个数据值的行。以下术语大致上是等同的。
| 数据 | 关系型数据库术语 | InterSystems SQL术语 | InterSystems IRIS术语 |
|---|---|---|---|
| database | schema | schema | package |
| database | table | table | persistent class |
| field | column | column | property |
| record | row | row |
SQL schema提供了一种将相关表、视图、存储过程和缓存查询分组的方法。模式的使用有助于防止在表一级的命名冲突,因为一个表、视图或存储过程的名称必须只在其schema内是唯一的。一个应用程序可以在多个schema中指定表。
SQL schema对应于IRIS中持久化的类包。
InterSystems SQL为存储在IRIS数据库中的数据提供不折不扣的、标准的关系型访问。
InterSystems SQL具有以下优点。
高性能和可扩展性 - InterSystems SQL的性能和可扩展性优于其他关系型数据库产品。
与IRIS对象技术的集成 - InterSystems SQL与IRIS对象技术紧密集成。你可以混合使用关系型和对象型的数据访问,而不牺牲任何一种方法的性能。
低维护 - 与其他关系型数据库不同,IRIS应用程序不需要在部署的应用程序中重建索引和压缩表。
支持标准SQL查询 - InterSystems SQL支持SQL-92标准语法和命令。
你可以将InterSystems SQL用于许多目的,包括。
基于对象和Web应用程序 - 你可以在InterSystems Object和Caché Server Page应用程序中使用SQL查询,以执行强大的数据库操作,如查询和搜索。
在线事务处理 - InterSystems SQL为插入和更新操作以及通常在事务处理应用程序中发现的查询类型提供出色的性能。
BI和数据仓库 - IRIS多维数据库引擎和位图索引技术的结合使其成为数据仓库式应用的绝佳选择。
点对点查询和报告 - 你可以使用InterSystems SQL包含的全功能ODBC和JDBC驱动来连接到流行的报告和查询工具。
还可以使用 irispython 命令执行 Python 脚本。
考虑 Windows 系统上的文件 C:\python\test.py,其中包含以下代码:
# print the members of the Fibonacci series that are less than 10
print('Fibonacci series:')
a, b = 0, 1
while a < 10:
print(a, end=' ')
a, b = b, a + b
# import the iris module and show the classes in this namespace
import iris
print('\nInterSystems IRIS classes in this namespace:')
status = iris.cls('%SYSTEM.OBJ').ShowClasses()
print(status)
可以从命令行运行 test.
多院区信息化建设离不开医院的管理模式,这是在建设信息系统前我们必须要搞清楚的事。比如医院财务是不是独立、分院之间住院患者流转是转科还是转院、检验检查是不是可以跨院区预约,是否有统一的职能部门管理业务流程等等。类似这样一些问题在建设前要认真梳理,做好多院区信息建设的顶层布局。
2022年7月1日,由国家卫生健康委医院管理研究所指导、《中国数字医学》杂志社有限公司主办、《中国数字医学》杂志社陕西通联站协办、东华医为科技有限公司与InterSystems中国支持的“医院数字化转型研讨会”在西安召开。以下为中南大学湘雅医院网络信息中心主任冯嵩在此次论坛上的分享。
嵌入式 Python 允许使用 Python 作为编程 IRIS 应用程序的本机选项。
使用嵌入式 Python 所需的 Python 版本取决于运行的平台。
在 Microsoft Windows 上,IRIS 安装工具包安装正确版本的 Python(当前为 3.9.5),仅用于嵌入式 Python。如果在开发机器上并希望将 Python 用于一般用途,建议从 https://www.python.org/downloads/ 下载并安装相同的版本。
许多基于 UNIX 的操作系统都安装了 Python。如果需要安装,请使用包管理器为操作系统推荐的版本,例如:
macOS:使用 Homebrew 安装 Python 3.9 (https://formulae.brew.sh/formula/python@3.9)Ubuntu: apt-get install python3Red Hat Enterprise Linux or Oracle Linux: yum install python3SUSE: zypper install python3如果收到“无法加载 python”的错误,这意味着没有安装 Python,或者系统上安装了意外版本的 Python。使用上述方法之一安装或重新安装。
VSCode 是目前很流行的一款免费开发工具,IRIS也支持使用其进行连接和开发,相比Studio 只能在windows 环境使用,Vscode 可以跨平台使用。
我们传统的工具Studio 是连接代码服务器的形式,不能便捷的使用目前流行的有本地代码的版本控制工具(如git),但VSCode可以存在本地代码,并且能方便的使用各类存在本地代码的版本控制工具。
以下的内容会帮助大家来配置使用VSCode连接IRIS 进行开发。
IRIS 中的类被投影到 SQL,除了使用类方法或直接全局访问之外,还允许使用查询访问数据。 iris 模块为提供了两种从 Python 运行 SQL 语句的不同方式。
以下示例使用 iris.sql.exec() 运行 SQL SELECT 语句以查找类名称以“%Net.LDAP”开头的所有类定义,返回一个包含每个名称和超类的结果集每个班级。在这里,系统类 %Dictionary.ClassDefinition 将 SQL 投影为同名表。
>>> rs = iris.sql.exec("SELECT Name, Super FROM %Dictionary.ClassDefinition WHERE Name %STARTSWITH '%Net.LDAP'")
以下示例使用 iris.sql.prepare() 准备 SQL 查询对象,然后执行查询,将“%Net.LDAP”作为参数传入:
>>> stmt = iris.sql.prepare("SELECT Name, Super FROM %Dictionary.ClassDefinition WHERE Name %STARTSWITH ?")
>>> rs = stmt.execute("%Net.InterSystems Native SDK for Python是 InterSystems IRIS APIs 的轻量级接口,曾经只能通过 ObjectScript 使用。
准确地说,我对调用 ObjectScript 方法、类方法的能力特别感兴趣。 它可以工作,而且效果很好,但默认情况下,调用只支持标量参数:字符串、布尔值、整数和浮点数。
但如果你想:
- 传递或返回结构,例如字典或列表
- 传递或返回流
您需要编写一些粘合代码或使用这个project (使用 pip install edpy 安装)。 edpy 包会给你一个简单的签名:
它允许您调用任何 ObjectScript 方法并返回结果。
开始 - 请拉到页面底部查看该系列文章第一部分 .
3. 使用globals时结构的变体
一个结构,比如说一个有序排列的“树”,有各种特殊的情况。让我们来看看那些对使用globals有实际价值的情况。
InterSystems DeepSee的目的是使你能够将BI嵌入到你的应用程序中,这样你的用户就可以对他们的数据提出和回答复杂的问题。你的应用程序可以包括仪表盘,它包含图形部件。这些部件用来显示数据,由透视表和KPIs(关键绩效指标)驱动。对于一个透视表,用户可以显示一个列表,用其显示源值。
透视表、KPIs和列表是查询,在运行时执行。
数据透视表可以对运行时的输入作出反应,如用户的过滤器选择。在内部,它使用一个MDX(MultiDimensional eXpressions)查询,与DeepSee cube进行通信。一个cube由一个事实表和其索引组成。一个事实表由一组事实(行)组成,每个事实对应于一个基本记录。例如,这些事实可以代表病人或部门。DeepSee还生成了一组维度表(level tables)。所有的表都是动态维护的,根据你的配置和实现,DeepSee检测你的事务表的变化,并传播到事实表。当用户在分析器中创建透视表时,DeepSee会自动生成一个MDX查询。
KPI也可以对运行时的用户输入做出反应。在内部,它使用MDX查询(与DeepSee立方体)或SQL查询(与任何表)。在这两种情况下,你都可以手动创建查询,或从其他地方复制它。
列表显示来自用户选择的透视表行的源记录的选定值。在内部,一个列表是一个SQL查询。你可以指定要使用的字段,让DeepSee生成实际的查询。
亲爱的社区开发者们,
我很高兴地向大家介绍一位我们的新版主@黄念刚。

让我们以热烈的掌声欢迎 @黄念刚!
@黄念刚目前任职于东华医为(Mediway),担任技术支持中心开发工程师一职。
以下是@黄念刚的自我简介:
再次欢迎我们的新版主@黄念刚👏🏼👏🏼👏🏼👏🏼👏🏼
期待你在DC成长为一名优秀版主!
如果使用的是嵌入式 Python 并且需要与 IRIS 交互,可以使用 Python shell 中的 iris 模块,或者使用 Python 编写的 IRIS 类中的方法。要遵循本节中的示例,可以使用 ObjectScript 命令 do ##class(%SYS.Python).Shell() 从终端会话启动 Python shell。
当启动终端会话时,将被放置在 IRIS 的 USER 命名空间中,将看到提示 USER>。但是,如果从 GitHub 加载了示例类,则需要在 SAMPLES 命名空间中才能访问它们。
在终端中,更改为 SAMPLES 命名空间,然后启动 Python shell,如下所示:
USER>set $namespace = "SAMPLES"
SAMPLES>do ##class(%SYS.Python).Shell()
Python 3.9.5 (default, Jul 19 2021, 17:50:44) [MSC v.1927 64 bit (AMD64)] on win32
Type quit() or Ctrl-D to exit this shell.嵌入式 Python 允许将 Python 与 IRIS 数据平台的本地编程语言 ObjectScript 一起使用。当使用嵌入式 Python 在 IRIS 类中编写方法时,Python 源代码与编译后的 ObjectScript 代码一起编译为在服务器上运行的目标代码。与使用网关或 Python的 Native SDK 相比,这允许更紧密的集成。还可以导入 Python 包,无论它们是自定义的还是公开的,并在ObjectScript 代码中使用它们。 Python 对象是 ObjectScript 中的一等公民,反之亦然。
ObjectScript 的 Python 库 - 此方案假设 ObjectScript 开发人员,并且希望利用 Python 开发人员社区可用的众多 Python 库的强大功能。Python 调用 IRIS API — 此方案假定您是一名 Python 开发人员,对 IRIS 不熟悉,并且想知道如何访问 API。ObjectScript 和 Python — 这个场景假设在一个由 ObjectScript 和 Python 开发人员组成的混合团队中,并且想知道如何一起使用这两种语言。将需要 2021.2 或更高版本的正在运行的 IRIS 实例,以及取决于操作系统的一些先决条件。
许多类使用 %Status 数据类型类来表示状态信息,并且它们的方法返回表示成功或错误的 %Status 值(状态)。如果状态表示一个错误(或多个错误),则状态值还包括有关错误的信息。
还可以返回自己的状态值。
本文讨论状态值以及如何使用它们。
如上所述,许多 类中的方法返回一个状态以指示成功或错误。例如,%Library.Persistent中的%Save()` 方法返回一个状态。对于任何此类方法,请务必获取返回值。然后检查状态,然后适当地继续。基本工具如下:
要检查状态是表示成功还是错误,请使用以下任一方法:
$$$ISOK 和 $$$ISERR 宏,在包含文件 %occStatus.inc 中定义。此包含文件在所有对象类中自动可用。$SYSTEM.Status.IsOK() 和 $SYSTEM.Status.IsError() 方法,它们在终端(不能使用宏)中特别方便。要显示错误详细信息,请使用 $SYSTEM.OBJ.DisplayError() 或 $SYSTEM.Status.DisplayError()。这些方法彼此等效。他们将输出写入当前设备。
要获取包含错误详细信息的字符串,请使用 $SYSTEM.Status.GetErrorText()。
/// d ##class(PHA.TEST.除了推荐的 REST 应用程序支持之外,产品还支持两种类型的传统 Web 应用程序:CSP 和 Zen。在配置使用 CSP 和 Zen 的自定义登录页面时,遵循推荐的协议很重要。这些协议提供了更高的安全性,并最大限度地减少了升级到新产品或版本时的不兼容性。
创建自定义 CSP 登录页面:
%CSP.Login 页面的子类。Draw 方法,以便页面看起来像想要的那样。其中包括修改登录页面外观的方法和修改安全令牌页面外观的方法(如果使用双因素身份验证):DrawCSS3STYLE、DrawHEAD、DrawSTYLE、DrawTitleDrawSTHEAD、DrawSTTitle请注意,DrawTitle 和 DrawSTTitle 方法调用 DrawTitleSection 方法。
重要提示:创建自定义登录页面时,必须使用 %CSP.Login 的子类。在 CSP 应用程序中创建登录页面的其他方法可能会导致各种问题。
如果编写了不使用 %CSP.Login 子类的自定义登录页面,并且应用了来自任何用于升级或保护实例的更改,那么登录页面可能会失败而没有错误消息。
本片文章主要介绍两种Production debug的方式,