大家好!
我正在创建一个脚本,从Ensemble Production中删除一个项目(Component),我知道有手动的方法,但由于有几个Component,我想用一个脚本来更快。
我试着用%Delete()并在Ens.Config.Item上做选择,但这最终在生产中产生了几个错误。有谁知道我怎样才能简单地做到这一点?
答案参见:https://community.intersystems.com/post/delete-item-production
大家好!
我正在创建一个脚本,从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.setValue(100); // you will receive the type checking error message here
// Also in Angular 14
const strictlyTypedControl = new FormControl(true);
strictlyTypedControl.setValue(100); // you will receive the type checking error message here
IRIS 异常处理程序可以处理 Python 异常并将它们无缝传递给 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 对“字节”数据类型的对象和字符串(表示字符串的 字节序列)进行了明确区分,它们是简单的 位字节序列。在
用 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"
}
从 调用方法时,在参数前放置一个句点以通过引用传递它,如下所示:
USER>set arg1 = "white bread"
USER>set arg2 = "peanut butter"
USER>set arg3 = "grape jelly"
USER>do ##class(User.EmbeddedPython).SandwichSwitch(arg1, .arg2, .arg3)
USER>write arg1
white bread
USER>write arg2
almond butter
USER>write arg3
cherry preserves
由于 ObjectScript 和 Python 语言之间的差异,将需要了解一些有助于弥合语言之间差距的信息。
在 ObjectScript 方面, 类允许从 ObjectScript 使用 。
在 方面, 模块允许使用 Python 中的 。在 中,键入 以获取其方法和函数的列表。
包在 解释器启动时自动加载,它包含语言的所有内置标识符,例如基对象类和所有内置数据类型类、异常类、函数和常量。
可以将此包导入 ObjectScript 以访问所有这些标识符,如下所示:
set builtins = ##class(%SYS.Python).Import("builtins")
函数实际上是内置模块的一个方法,因此现在可以在 中使用此函数:
USER>do builtins.print("hello world!")
hello world!
然后可以使用 命令检查内置对象,因为它是一个 对象,所以它使用内置包的 方法来获取该对象的字符串表示形式。例如:
出于同样的原因,可以使用 方法创建 列表。
嵌入式 Python 让可以轻松访问数以千计的有用库。通常称为“包”,它们需要从 Python 包索引 (PyPI) 安装到 目录中,然后才能使用。
例如, 是一个用于生成 和图形的开源库。以下命令使用软件包安装程序 irispip 在 系统上安装 :
在基于 的系统上,使用:
$ pip3 install --target /InterSystems/IRIS/mgr/python reportlab
安装包后,可以使用 %SYS.Python 类的 方法在 代码中使用它。
给定一个文件位置,以下 方法 创建一个示例 PDF 文件并将其保存到该位置。
Class Demo.PDF
{
ClassMethod CreateSamplePDF(fileloc As %String) As %Status
{
set canvaslib = ##class(%SYS.Python).Import("reportlab.pdfgen.canvas")
set canvas = canvaslib.Canvas(fileloc)
do canvas.drawImage("C:\Sample\isc.png", 150, 600)
do canvas.drawImage("C:\Sample\python.png", 150, 200)
do canvas.setFont("Helvetica-Bold", 24)
do canvas.drawString(25, 450, "InterSystems IRIS & Python. Perfect Together.")
do canvas.save()
}
}
可以通过以下方式定义表:
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.Employee (
EMPNUM INT NOT NULL,
NAMELAST CHAR (30) NOT NULL,
NAMEFIRST CHAR (30) NOT NULL,
STARTDATE TIMESTAMP,
SALARY MONEY,
ACCRUEDVACATION INT,
ACCRUEDSICKLEAVE INT,
CONSTRAINT EMPLOYEEPK PRIMARY KEY (EMPNUM)))
IF SQLCODE=0{ WRITE "Table created" RETURN "Success"}
ELSEIF SQLCODE=-201 { WRITE "Table already exists" RETURN SQLCODE}
ELSE { WRITE "Serious SQL Error, returing SQLCODE " RETURN SQLCODE_" "_%msg}
}本文概述了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 系统上的文件 ,其中包含以下代码:
# 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)
可以从命令行运行 ,如下所示:
C:\InterSystems\IRIS\bin>set IRISUSERNAME = <username>
C:\InterSystems\IRIS\bin>set IRISPASSWORD = <password>
C:\InterSystems\IRIS\bin>set IRISNAMESPACE = USER
C:\InterSystems\IRIS\bin>irispython \python\test.py
Fibonacci series:
0 1 1 2 3 5 8
InterSystems IRIS classes in this namespace:
User.Company
User.Person
1
多院区信息化建设离不开医院的管理模式,这是在建设信息系统前我们必须要搞清楚的事。比如医院财务是不是独立、分院之间住院患者流转是转科还是转院、检验检查是不是可以跨院区预约,是否有统一的职能部门管理业务流程等等。类似这样一些问题在建设前要认真梳理,做好多院区信息建设的顶层布局。
2022年7月1日,由国家卫生健康委医院管理研究所指导、《中国数字医学》杂志社有限公司主办、《中国数字医学》杂志社陕西通联站协办、东华医为科技有限公司与InterSystems中国支持的“医院数字化转型研讨会”在西安召开。以下为中南大学湘雅医院网络信息中心主任冯嵩在此次论坛上的分享。
嵌入式 Python 允许使用 Python 作为编程 IRIS 应用程序的本机选项。
使用嵌入式 所需的 版本取决于运行的平台。
在 Microsoft Windows 上, 安装工具包安装正确版本的 Python(当前为 ),仅用于嵌入式 。如果在开发机器上并希望将 用于一般用途,建议从 下载并安装相同的版本。
许多基于 UNIX 的操作系统都安装了 。如果需要安装,请使用包管理器为操作系统推荐的版本,例如:
macOS:使用 Homebrew 安装 Python 3.9 如果收到“无法加载 ”的错误,这意味着没有安装 Python,或者系统上安装了意外版本的 。使用上述方法之一安装或重新安装。
在基于 的系统上,可能希望使用 命令安装 包。如果尚未安装 ,请使用系统的包管理器安装包 。
要防止在运行 时出现 错误,请启用 。在管理门户中,,选择 ,然后选中启用服务框。
本节详细介绍了运行 的几种方法:
可以从终端会话或命令行启动 。
通过调用 类的 方法,从 终端会话启动 。这将以交互模式启动 解释器。终端会话中的用户和命名空间被传递给 。
通过键入命令 退出 。
VSCode 是目前很流行的一款免费开发工具,IRIS也支持使用其进行连接和开发,相比Studio 只能在windows 环境使用,Vscode 可以跨平台使用。
我们传统的工具Studio 是连接代码服务器的形式,不能便捷的使用目前流行的有本地代码的版本控制工具(如git),但VSCode可以存在本地代码,并且能方便的使用各类存在本地代码的版本控制工具。
以下的内容会帮助大家来配置使用VSCode连接IRIS 进行开发。
IRIS 中的类被投影到 SQL,除了使用类方法或直接全局访问之外,还允许使用查询访问数据。 iris 模块为提供了两种从 运行 语句的不同方式。
以下示例使用 运行 语句以查找类名称以“%Net.LDAP”开头的所有类定义,返回一个包含每个名称和超类的结果集每个班级。在这里,系统类 将 投影为同名表。
>>> rs = iris.sql.exec("SELECT Name, Super FROM %Dictionary.ClassDefinition WHERE Name %STARTSWITH '%Net.LDAP'")
以下示例使用 准备 查询对象,然后执行查询,将“%Net.LDAP”作为参数传入:
>>> stmt = iris.sql.prepare("SELECT Name, Super FROM %Dictionary.ClassDefinition WHERE Name %STARTSWITH ?")
>>> rs = stmt.execute("%Net.LDAP")
无论哪种情况,都可以按如下方式遍历结果集,并且输出相同:
>>> for idx, row in enumerate(rs):
... print(f"[{idx}]: {row}")
...
[0]: ['%Net.LDAP.Client.EditEntry', '%RegisteredObject']
[1]: ['%Net.LDAP.Client.Entries', '%RegisteredObject,%Collection.AbstractIterator']
[2]: ['%Net.LDAP.Client.Entry', '%RegisteredObject,%Collection.AbstractIterator']
[3]: ['%Net.LDAP.Client.PropList', '%RegisteredObject']
[4]: ['%Net.LDAP.Client.Search.Scope', '%Integer']
[5]: ['%Net.LDAP.Client.Session', '%RegisteredObject']
[6]: ['%Net.LDAP.Client.StringList', '%RegisteredObject']
[7]: ['%Net.LDAP.Client.ValueList', '%RegisteredObject,%Collection.AbstractIterator']
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 中的 模块,或者使用 编写的 类中的方法。要遵循本节中的示例,可以使用 命令 从终端会话启动 。
当启动终端会话时,将被放置在 的 命名空间中,将看到提示 USER>。但是,如果从 加载了示例类,则需要在 命名空间中才能访问它们。
在终端中,更改为 命名空间,然后启动 ,如下所示:
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 shell 继承与终端相同的上下文,例如,当前命名空间和用户。局部变量不被继承。
要从 访问 类,请使用 模块来实例化要使用的类。然后,可以像访问
嵌入式 Python 允许将 Python 与 IRIS 数据平台的本地编程语言 ObjectScript 一起使用。当使用嵌入式 在 类中编写方法时, 源代码与编译后的 代码一起编译为在服务器上运行的目标代码。与使用网关或 的 相比,这允许更紧密的集成。还可以导入 包,无论它们是自定义的还是公开的,并在 代码中使用它们。 对象是 中的一等公民,反之亦然。
ObjectScript 的 Python 库 - 此方案假设 开发人员,并且希望利用 开发人员社区可用的众多 库的强大功能。ObjectScript 和 开发人员组成的混合团队中,并且想知道如何一起使用这两种语言。将需要 或更高版本的正在运行的 实例,以及取决于操作系统的一些先决条件。还需要知道如何访问终端,即 IRIS 命令行工具。
本文档中的一些示例使用来自 上 存储库的类:https://github.com/intersystems/Samples-Data。 建议创建一个名为 的专用命名空间并将样本加载到该命名空间中。如果想查看或修改示例代码,则需要设置集成开发环境 ()。推荐使用 。
许多类使用 %Status 数据类型类来表示状态信息,并且它们的方法返回表示成功或错误的 %Status 值(状态)。如果状态表示一个错误(或多个错误),则状态值还包括有关错误的信息。
还可以返回自己的状态值。
本文讨论状态值以及如何使用它们。
如上所述,许多 类中的方法返回一个状态以指示成功或错误。例如,%Library.Persistent中的%Save()` 方法返回一个状态。对于任何此类方法,请务必获取返回值。然后检查状态,然后适当地继续。基本工具如下:
要检查状态是表示成功还是错误,请使用以下任一方法:
$$$ISOK 和 $$$ISERR 宏,在包含文件 %occStatus.inc 中定义。此包含文件在所有对象类中自动可用。要显示错误详细信息,请使用 $SYSTEM.OBJ.DisplayError() 或 。这些方法彼此等效。他们将输出写入当前设备。
要获取包含错误详细信息的字符串,请使用 。
/// d ##class(PHA.TEST.AdvancedConcepts).Status()
ClassMethod Status()
{
s object = ##class(Sample.Person).%New()
s object.Name = "yao,xin"
s tSC = object.%Save()
if $$$ISERR(tSC) {
d $SYSTEM.OBJ.DisplayError(tSC)
q
}
}
除了推荐的 REST 应用程序支持之外,产品还支持两种类型的传统 Web 应用程序:CSP 和 。在配置使用 和 的自定义登录页面时,遵循推荐的协议很重要。这些协议提供了更高的安全性,并最大限度地减少了升级到新产品或版本时的不兼容性。
创建自定义 登录页面:
%CSP.Login 页面的子类。Draw 方法,以便页面看起来像想要的那样。其中包括修改登录页面外观的方法和修改安全令牌页面外观的方法(如果使用双因素身份验证):DrawHEAD、DrawSTYLE、请注意, 和 DrawSTTitle 方法调用 DrawTitleSection 方法。
重要提示:创建自定义登录页面时,必须使用 的子类。在 应用程序中创建登录页面的其他方法可能会导致各种问题。 如果编写了不使用 子类的自定义登录页面,并且应用了来自任何用于升级或保护实例的更改,那么登录页面可能会失败而没有错误消息。例如,用户可能会尝试使用有效的用户名和密码登录,但他们的登录将在没有任何明显原因的情况下失败。这种情况可能表明需要更改自定义登录以使用所需的方法。
本片文章主要介绍两种Production debug的方式,
我现在在使用object script。如果把代码从 objectscript转成 Java 我需要做些什么?
你好。
我想访问一个远程SQL Server数据库中的存储过程。我对Object Script很陌生。
该存储过程有3个参数:2个日期时间参数和1个整数。
哪种方法最好呢?我想知道我是否可以在object script中使用链接存储过程的功能或一些SQL语句。
这个存储过程返回一组行,我想读取、转换并保存在一个持久化类中。
先谢谢了。
Hi,
I want to access a Stored Procedure in a remote SQL Server Database. I am quite new to Object script.
The stored procedure has 3 parameters: 2 datetime parameters and 1 integer.
Which is the best way to do that? I'm wondering if I can use the link stored procedure feature inside object script or some SQL statement in Object Script.
This SP returns a set of rows which I want to read, transform and save in a persistent class.
亲爱的女士们和先生们,在上个月,我改进了我的工具Caché监视器......但首先:名字
选择Caché Monitor这个名字是为了反映该工具与Caché数据库的紧密结合。我想,在可预见的未来,Intersystems Caché这个既定名称很可能会被InterSystems IRIS数据平台完全取代。因此,重塑品牌的步骤成为必要。为了在未来不那么紧密地与一个产品名称联系在一起,我们选择了一个更加中立的新名字: SQL Data Lens
不管叫什么名字,实现与Intersystems产品最紧密的整合仍然是我们的目标。持续的发展也反映在版本号的延续上。上一个版本是Caché Monitor 2.96,下一个版本是SQL Data Lens 3.0。
但这不仅仅是重新命名,而且还集成了许多新的功能,例如
第二十一章 使用工作队列管理器(四)
分离和附加工作队列
通常,初始化一组工作程序,将工作项排队,然后等待工作程序完成工作项。但是,可能会遇到工作人员作业完成工作项所需的时间比预期更长的情况,或者无法将单个进程专门用于等待。因此,工作队列管理器使能够将工作队列与进程分离,然后将工作队列附加到同一进程或不同的进程。
例如,假设队列引用了初始化的工作队列。还假设向工作队列中添加了几个工作项。在调用 Wait() 或 WaitForComplete() 来确定正在处理的工作的状态之前,可以使用以下方法:
Detach()
method Detach(ByRef token As %String, timeout As %Integer=86400) as Status 从初始化工作队列时创建的对象引用中分离工作队列对象。 Detach() 方法使任何正在进行的工作能够继续并保留工作队列的当前状态。
token 参数表示一个安全令牌,可以使用它随后将工作队列附加到另一个进程。 timeout 参数是可选的,它指示系统保留分离的工作队列对象的时间量(以秒为单位)。超时期限过后,系统会删除与工作队列关联的所有工作人员作业和信息。超时的默认值为 1 天。
调用 Detach() 方法后,对分离对象引用的大多数调用都会返回错误。
如题:
.png)