#InterSystems IRIS

0 关注者 · 929 帖子

InterSystems IRIS 是一个完整的数据平台
InterSystems IRIS 为您提供了捕获、共享、理解组织最宝贵的资产(数据)并采取相应行动所需的一切。
作为一个完整的平台,InterSystems IRIS 不需要集成多种开发技术。应用程序需要更少的代码、更少的系统资源和更少的维护。

文章 姚 鑫 · 八月 12, 2024 2m read

第八章 指定自定义 HTTP 请求

默认情况下,Web 客户端使用 HTTPSOAP 消息传输到 Web 服务并接收响应。Web 客户端会自动创建并发送 HTTP 请求,但可以创建自定义 HTTP 请求。为此,请使用以下步骤:

  1. 在创建 %Net.HttpReques 的实例并根据需要设置属性。有关此类的信息,请参阅使用 Internet 实用程序或 %Net.HttpRequest类文档。
  2. Web 客户端的 HttpRequest 属性设置为等于此实例。

如果希望在同一会话中支持对 SOAP 服务的多次调用,这尤其有用。默认情况下, Web 客户端不支持使用同一会话对 SOAP 服务进行多次调用。要解决此问题,创建一个新的 %Net.HttpRequest 实例,并将其用作 Web 客户端的 HttpRequest 属性。此更改强制对所有调用重复使用相同的 HTTP 请求,这将在对下一个请求的响应中返回所有 cookie

自定义 Web 客户端的回调

可以通过覆盖其回调方法来定制 Web 客户端的行为:

%OnSOAPRequest()

Method %OnSOAPRequest(mode As %String, 
                      client As %SOAP.
0
0 141
文章 Michael Lei · 八月 6, 2024 5m read

数据收集

这篇分步说明指南将讲解如何创建任务来收集 InterSystems 数据库及其全局变量的相关数据(如关联的 Open Exchange App 所示,其中包含所有相关代码)

免责声明:此软件仅用于测试/演示目的。 InterSystems 不支持将此代码作为任何发布产品的一部分。 它由 InterSystems 提供,作为特定产品和版本的演示/测试工具。 用户或客户全权负责此软件交付后的维护和测试,InterSystems 对此代码的错误或误用不承担任何责任

  1. 首先,通过管理门户导入文件“DataCollection.xml”,并确保没有错误。 如果存在错误,则可能是版本问题,请发送电子邮件至 ari.glikman@intersystems.com 联系 Ari Glikman 获取适合你的版本的支持。 另外,确保将数据导入到你想要收集其内部数据以供后续检查的命名空间中。

  2. 导入完成后,应该看到 Sample 软件包以及几个子软件包 image

如果服务器上已经存在 Sample 软件包,那么你仍然应该可以看到新的子软件包以及先前存在的其他文件夹。

  1. 现在,运行单元测试以确保一切正常运行。

a. 创建可以被 InterSystems Terminal 读取的名为 Unit Tests 的文件夹,例如,由于我有一个本地安装,我需要在 C 盘中创建一个文件夹。

image

b.

3
0 150
文章 Michael Lei · 八月 7, 2024 6m read

表的图形显示

在这里,我们将说明如何以图形方式显示数据收集的结果。 项目的输出将如下所示:

image

我使用的是本地计算机。 如果你在服务器上,注意使用正确的 IP 地址。

首先,导入需要的三个类(注意,我们将晚些时候编辑它们):

你可以使用 xml 并将其导入系统。

规范将创建调度类和实现模板。 如果你想详细了解此过程,可以读一读我同事 Eduard Lebedyuk 写的文章

设置 API

注意,在此演示中我们将使用 Basic Authorization。 我们还假设 Sample_DBExpansion_Data.DBAnalysisInfo 和 Sample_DBExpansion_Data.GlobalAnalysisInfo 表中已经有数据。 如果没有,返回数据收集获取数据。

  1. 首先,创建一个可以让我们访问数据的端点: image

填写相同的名称,除非你打算为 react 应用自行定制代码。

  1. 点击 Save,然后测试我们的 API。
0
0 130
文章 Michael Lei · 八月 7, 2024 3m read

数据分析

这是数据收集的续集。 如果你还没有安装,请先完成安装。

这里提供的是对先前收集的数据的分析。

你需要导入构成此仓库的 xml,与先前仓库中的操作大致相同。

最顶层有一个任务:

InvestigateInfoTask

这个任务将允许我们设置将要监控的参数, 如下所示:

image

GrowthPercentageWarning:对于Global增长来说,“可接受的”百分比增长。

PeriodWarning:Global在多少天内实现增长是合理的?

HistoryLength:回溯 Sample_DBExpansion_Data.GlobalAnalysisInfo 表的时长。

默认设置为 7 天内增长 5%,回溯过去 30 天。 设置参数后,即使任务已经运行一次或多次,你仍然可以再次编辑。 转到任务详细信息,点击 Edit,然后根据需要更改。

该任务会调用 Sample.DBExpansion.DBSizeAnalysis.InvestigateInfo 类的 CreateReport 方法。

CreateReport 将填充两个表,如下所述:

  1. GlobalInvestigationReport
  • 这个表将保存分析 Sample_DBExpansion_Data.GlobalAnalysisInfo 表的“报告”。 我们可以通过多个字段用不同的参数来衡量增长。
0
0 121
文章 姚 鑫 · 八月 7, 2024 1m read

第三章 控制 xsi:type 属性的使用

控制 xsi:type 属性的使用

默认情况下, SOAP 消息仅包含顶级类型的 xsi:type属性。例如:

<?xml version="1.0" encoding="UTF-8" ?>
...
<types:GetPersonResponse>
<GetPersonResult href="#id1" />
</types:GetPersonResponse>
<types:Person id="id1" xsi:type="types:Person">
<Name>Yeats,Clint C.</Name>
<DOB>1944-12-04</DOB>
</types:Person>  
...

在这些示例中,已添加换行符以提高可读性。要将此属性用于 SOAP 消息中的所有类型,请执行以下操作之一:

  • Web 客户端实例中将 OutputTypeAttribute 属性设置为等于 1
  • Web 客户端类中将 OUTPUTTYPEATTRIBUTE 参数设置为等于 1

相同的输出将如下所示:

<?xml version="1.
0
0 61
文章 Michael Lei · 八月 7, 2024 5m read

默认情况下,在容器内创建的所有文件都存储在可写的容器层上。 这意味着:

  • 当容器消失时,数据将不会持续存在,并且如果另一个进程需要数据,很难将数据从容器中取出。
  • 容器的可写层与运行容器的主机紧密耦合。 你无法轻易将数据移动到其他地方。
0
0 207
文章 Michael Lei · 八月 6, 2024 2m read

开发新的互操作性Production时,最初在Production中添加设置是很自然的做法。

不过,一旦要将Production从开发环境移动到测试或其他环境,你就会发现 HTTP 服务器、IP 地址和/或端口之类的设置都需要更改。 为了避免这些设置在后续重新部署时被覆盖,必须将这些设置从Production得设置中移动到系统默认设置(System Default Settings)。

虽然系统默认设置可以手动创建,但是当生产中有大量业务组件时会难以处理。 因此,@Wietze Drost 让我开发一个工具自动执行此流程,通过筛选表达式指定哪些设置必须创建为系统默认设置。

  • 这个表达式可以定义为“*:HTTPServer,SSLConfig*”,其中“\*”表示“为任何主机类名”。 冒号后面是需要移动的设置列表。 所以,这个表达式的意思是“为所有名为 HTTPServer 和 SSLConfig 的设置创建或更新系统默认设置”。
1
0 127
文章 Louis Lu · 八月 6, 2024 4m read

在使用 InterSystems ObjectScript 进行编程时,当你定义了属性property、查询query或者索引index,系统会在编译的过程中自动创建与之相关的一些方法,这篇文章对这些方法做了些总结:

 

属性Properties

1. 假设你定义了一个属性 Property, 下面的方法会被自动创建

ClassMethod PropertyGetStored(id)

对于数据类型属性,这个函数将返回其逻辑值,对于对象属性,返回id。这是一个对类global数据的封装,也是获取单例属性值(singular property value)最快的方法。此方法仅适用于已持久化存储的属性。

这里是一段采用多种方法读取数据的对比代码,用于测试各种访问数据方式的时间差异,其结果是:

Iterations: 10000
Object access: .130111
GetStored access: .014388
SQL access: .020268
Global access: .007717
Object access takes 904.30% of GetStored time
Object access takes 641.95% of SQL time
Object access takes 1686.
0
0 105
文章 姚 鑫 · 八月 5, 2024 2m read

第一章 修改 Web 客户端

修改 Web 客户端

生成 Web 客户端类后,通常不需要编辑该类。相反,需要编写代码来创建该类的实例并提供客户端错误处理。本主题讨论了微调 Web 客户端的各种方法,可以通过修改 Web 客户端实例或(不太常见)修改生成的类来实现。

注意:不要创建生成的 Web 客户端类的子类。编译器不会生成正常运行所需的支持类,因此子类将无法使用。

禁用 Web 客户端的 Keep-Alive

默认情况下,如果重复使用 Web 客户端实例来发送多条请求消息,IRIS 会在一次 HTTP 传输中发送所有消息(使用 HTTP 1.1 保持活动连接)。具体来说,IRIS 保持 TCP/IP 套接字打开,这样 IRIS 就无需关闭并重新打开它。要禁用此保持活动行为,请执行以下操作之一:

  • 终止 Web 客户端实例并创建并使用一个新的。
  • 发送第一条消息后,将客户端的 HttpRequest.SocketTimeout 属性设置为 0。例如:
Set client.HttpRequest.SocketTimeout=0

注意:如果正在使用 WS-ReliableMessaging 并使用 SSL/TLSWeb 服务通信,请不要禁用保持活动。有关 WS-ReliableMessaging 的信息,请参阅保护 Web 服务。

0
0 94
文章 YuCheng Hu · 八月 1, 2024 3m read

针对 InterSystems IRIS 数据库的一些基本概念。

InterSystems IRIS 是什么

InterSystems IRIS 是基于 Caché/M 语言开发的一个数据库,这个数据库被大量使用在医疗系统中,也是北美地区医疗系统病历和文件管理中默认使用的事实标准。

Caché/M 是什么

Caché/M 是 MUMPS 程序语言 开发的数据库,Caché/M 提供了代码接口,可以直接使用 Caché/M 对数据库来进行操作。

Caché 是一个法语单词,但是又非常容易和英语使用的 Cache 搞混,所以大部分时候使用的是 Caché/M 来表达。

M 表达的意思是 Mumps 程序语言,简称 M 语言,Caché 使用 M 语言构建了不少函数。

InterSystems IRIS 不是开源数据库

因为涉及到医疗系统数据的使用,所以 InterSystems IRIS 并不是一个开源的数据库,你可以使用下面的链接:Evaluate InterSystems Products 8 来下载评估版本。

本文就是根据下载的链接来进行 Windows 安装的教程。

上面的页面在下载之前,你需要进行注册,并且提供你的信息。

双击运行

当下载完成后,可以双击运行安装程序。

我们会看到下面的安装界面:

InterSystems-IRIS-Windows-Install-01

同意许可协议后,单击下一步继续安装。

配置实例名

我们在这里使用默认的就可以,通常使用的 IRIS。

InterSystems-IRIS-Windows-Install-02

0
0 418
文章 Hao Ma · 七月 29, 2024 2m read

转发自Eduard Lebedyu的原文

在本系列文章中,我将介绍并讨论使用 InterSystems 技术和 GitLab 进行软件开发的几种可行方法。我将涉及以下主题:

1
0 197
文章 姚 鑫 · 七月 27, 2024 1m read

第五章 控制 xsi:type 属性的使用

控制 xsi:type 属性的使用

默认情况下, SOAP 消息仅包含顶级类型的 xsi:type 属性。例如:

<?xml version="1.0" encoding="UTF-8" ?>
...
<types:GetPersonResponse>
<GetPersonResult href="#id1" />
</types:GetPersonResponse>
<types:Person id="id1" xsi:type="types:Person">
<Name>Yeats,Clint C.</Name>
<DOB>1944-12-04</DOB>
</types:Person>  
...

在这些示例中,已添加换行符以提高可读性。要将此属性用于 SOAP 消息中的所有类型,请将 OUTPUTTYPEATTRIBUTE 参数或 OutputTypeAttribute 属性设置为 1。相同的输出将如下所示:

<?xml version="1.
0
0 81
文章 Michael Lei · 七月 25, 2024 1m read

InterSystems 常见问题FAQ 

要编译包含映射修饰符的类rountine,请指定编译器修饰符“/mapped=1”或“/mapped”。例如,执行以下操作:

[示例 1] 获取类列表并编译

 do $System.OBJ.GetClassList(.list,"/mapped")
 // build your classes starting from .list
 do $System.OBJ.Compile(.list) 

[示例 2] 编译所有类 

 do $system.OBJ.CompileAll("/mapped") 
0
0 134
文章 光辉 赵 · 七月 23, 2024 6m read

FHIR是标准,是规范,使用FHIR使大家可以使用同一种语言、语义进行交流,名称、API都是统一的,只要符合FHIR标准,任何系统都可交互。对业务开发者来说,大部分接口交互的定义交给FHIR来处理,效率大大提高。

1
0 204
文章 Michael Lei · 七月 18, 2024 2m read

InterSystems 常见问题系列

使用 ErrorList 查询 SYS.ApplicationError 类.

  • 注 1: 在 %SYS 命名空间中运行.
  • 注 2: 这是个非存储的utility, 所以我们用 %ResultSet 类而不用 %SQL.Statement.

执行命令的例子如下.

USER>set $namespace="%SYS"   //equal to zn "%SYS"
%SYS>set rset=##class(%ResultSet).%New()

%SYS>set rset.ClassName="SYS.ApplicationError"
%SYS>set rset.QueryName="ErrorList"
// The first argument of the query is the namespace name, the second argument is the date (in MM/DD/YYYY format).
%SYS>do rset.Execute("USER","08/17/2020")

// To display the results on the screen, execute the %Display() method.
%SYS>do rset.
0
0 153
文章 Michael Lei · 七月 18, 2024 1m read

InterSystems 常见问题系列

可以通过 TRY-CATCH 来完成:

 #dim ex As %Exception.AbstractException
 TRY {
    //Code that causes an error
  }
  CATCH ex {
     do ex.Log()
  }

如果用了 ^%ETN, 从BACK 接入点 (BACK^%ETN)处调用.

请参考另外一篇文章: 如何使用命令获得应用错误 (^ERRORS)

0
0 146
文章 Hao Ma · 三月 25, 2021 8m read

关键字:PyODBC,unixODBC,IRIS,IntegratedML,Jupyter Notebook,Python 3

 

目的

几个月前,我简单谈到了关于“将 Python JDBC 连接到 IRIS”的话题。我后来频繁提起它, 因此决定再写一篇 5 分钟的笔记,说明如何“将 Python ODBC 连接到 IRIS”。

在 Windows 客户端中通常很容易设置 ODBC 和 PyODBC,不过我每次在 Linux/Unix 风格的服务器中设置 unixODBC 和 PyODBC 客户端时,都会遇到一些麻烦。

有没有一种简单连贯的方法,可以不安装任何 IRIS,在原版 Linux 客户端中让 PyODBC/unixODBC 针对远程 IRIS 服务器运行?

 

范围

最近,我花了点时间研究如何在 Linux Docker 环境的 Jupyter Notebook 中从头开始让一个 PyODBC 演示运行起来, 记录下这篇稍微有些繁琐的笔记,以供日后快速参考。  

范围内: 

这篇笔记将涉及以下组件:

  • PyODBC over unixODBC 
  • 安装了 TensorFlow 2.2 和 Python 3 的 Jupyter Notebook 服务器
  • 带有 IntegratedML 的 IRIS2020.3 CE 服务器,包括示例测试数据。
  • 1
    0 518
    问题 y g · 七月 16, 2024

    ubuntu系统中,查询到的数据都是空字符串

     

     python3 httpTest2.py
    ('', '', '', '', None, '')
    ('', '', '', '', None, '')
    ('', '', '', '', None, '')
    ('', '', '', '', None, '')
    ('', '', '', '', None, '')
    ('', '', '', '', None, '')
    ('', '', '', '', None, '')
    ('', '', '', '', None, '')
    ('', '', '', '', None, '')
    ('', '', '', '', None, '')

     

    代码如下
    import pyodbc
    import requests

    driver = '/usr/irisodbc/bin/libirisodbc35.so'
    server = 'xx'
    database = 'xx'
    username = 'xx'
    password = 'xx'
    port = 'xx'


    cnxn = pyodbc.connect(driver=driver, server=server,port='51773', database=database, uid=username, pwd=password,charset='UTF-8')
    cursor = cnxn.

    0
    0 90
    文章 Yongfeng Hou · 十一月 23, 2023 3m read

            IRISHealth以其完备且系统化的安全特性在医疗行业的数据库中独树一帜,这些特性包括安全认证、安全授权、安全审计、数据加密以及安全配置。其中数据传输无疑是其中最重要的一环。为此,IRISHealth采用了SSL/TLS技术来对传输的数据进行加密,有效保障了从IRIS数据平台的超级服务数据传输、Telnet服务数据传输、java/.net/Studio客户端的访问数据传输、MIRROR与DB的数据传输,到DBServer和ECPApp之间的数据传输的安全性。


            本文是在两个IRISHealth2021实例之间进行ECP服务通信的示例,一个作为DBServer,一个作为ECPApp,两个实例之间通过使用SSL/TLS的ECP协议进行TCP的加密传输通信。

    1.IRIS的DB和ECP环境:




    DBServer 

    ECPApp

    10.1.30.231  10.1.30.232

     

    2. CA证书的环境:




    CA根服务器 

    DBServer

    ECPApp

    10.1.30.231 10.1.30.231 10.1.30.232
    CARoot.cer DataSever.cer ECPApp.cer
    CARoot.key DataSever.key ECPApp.
    5
    3 425
    文章 Michael Lei · 七月 11, 2024 1m read

    在当今充满活力的医疗保健行业,获取全面、精简的医疗记录对于做出明智的决策至关重要。人工智能驱动的健康图表应用程序是一个开创性的解决方案,旨在为医生提供一种获取和理解健康数据的有效方式。

    主要功能

    - 全面的数据检索: 健康图表应用程序通过提取各种健康数据,包括过敏症、病情、手术、免疫接种、药物、家族史、社会史、生命体征和化验结果,超越了传统记录。这种全面的视角可以让人们深入了解患者的健康历程。

    - 通过人工智能增强洞察力:通过利用人工智能的力量,Health Chart 应用程序可以智能处理数据。人工智能引擎将原始信息转化为可操作的洞察,生成健康摘要和风险评估。这不仅节省了医生的宝贵时间,还提高了患者护理质量。

    公司介绍:https://www.prairiebyte.com

    软件试用

    目标使用者--临床医生

    类别--护理协调, 数据可视化, 疾病管理/基层医疗

    应用程序类型--SMART ON FHIR应用程序

    FHIR 版本--R4

    支持的电子病历系统--Cerner、Epic等支持FHIR API的软件系统

    0
    0 251
    文章 Michael Lei · 七月 7, 2024 1m read

    InterSystems 常见问题系列FAQ

    如果要让超时功能失效, 在DSN设置查询超时为disabled:

    Windows Control Panel > Administrative Tools > Data Sources (ODBC) > System DSN configuration

    如果勾选了Disable query timeout , 超时就会失效.

    如果想在应用侧修改,你可以在ODBC API 层设置:在连接数据源之前,调用ODBC SQLSetStmtAttr功能设置SQL_ATTR_QUERY_TIMEOUT 属性 

    0
    0 212
    文章 Michael Lei · 七月 7, 2024 1m read

    InterSystems 常见问题FAQ

    如果您想在InterSystems 产品启动时执行一个操作系统可执行文件,命令或者程序,可以在SYSTEM^%ZSTART routine里面写明流程 ( %ZSTART routine在 %SYS 命名空间里面创建).

    在 SYSTEM^%ZSTART 里面写代码之前, 请确保他可以在任何情况下能正常工作

    如果 ^%ZSTART routine 写的不对,或者没有响应或者发生错误,InterSystems 产品可能会无法启动。

    更多信息,请参考一下文档。

    About writing %ZSTART and %ZSTOP routines [IRIS]
    About writing %ZSTART and %ZSTOP routines

    0
    0 131
    文章 Michael Lei · 七月 7, 2024 4m read

    InterSystems  常见问题系列FAQ

    InterSystems 产品里数据 (表、对象、实例数据) 是存在global 变量里的。
    每个global 的数据大小可以从管理门户中中点击属性查看Management Portal > System > Configuration > Local Database > Globals page, 然后在global 属性页点击计算大小Calculate Size 按钮。
    你可以在终端上调用^%GSIZE  来在命名空间里显示数据大小,方法如下.

    USER>do ^%GSIZE
     
    Directory name: c:\intersystems\ensemble\mgr\user\ =>
    All Globals? No => Yes
    ^DeepSee.ActiveTasks contains no data
    Include it anyway? No => Y
    Include any other similar globals without asking again? Yes =>
    ^DeepSee.ActiveTasks contains no data
    Include it anyway? No => Yes
    Include any other similar globals without asking again?
    0
    0 162
    文章 Michael Lei · 七月 7, 2024 2m read

    InterSystems 常见问题系列FAQ

    流程如下

    1. 上传到 FTP server

     set tmpfile="c:\temp\test.jpg"
     set ftp=##class(%Net.FtpSession).%New() 
     // connect to FTP server
     do ftp.Connect("","<username>","<password>")
     // set transfer mode to BINARY
     do ftp.Binary()
     // Move to the directory to upload
     do ftp.SetDirectory("/temp/upload")
     // Prepare a stream of files to upload  
     set file=##class(%File).%New(tmpfile)
     do file.Open("UK\BIN\")
     // upload file
     // 1st argument: File name to create at upload destination
     // 2nd argument: File stream to upload
     do ftp.Store("test.jpg",file)
     // Logout from ftp server
     do ftp.
    0
    0 151
    文章 Louis Lu · 七月 1, 2024 2m read

    在 OEX 最近一次编程竞赛之后,我有一些令人惊讶的发现。
    几乎所有的应用程序都是基于人工智能与预制 Python 模块的结合。
    但深入研究后发现,所有示例都使用了 IRIS 的相同技术组件。

    从 IRIS 的角度来看,无论是搜索文本还是搜索图像或其他模式都是一样的。 其底层基本都是一样的。

              这让我想起了我家里的情况。我的妻子和女儿对家里的大量裙子、衬衫和其他衣服的信息进行了整理。
              但无论如何进行整理、分类、归档,我依然通过和我的妻子和女儿说话,来确定我的穿着。
               无论怎样包装,其结果都是如此。

    回到这次竞赛比赛:
    同样的 IRIS 技术内容,却有很多花哨的包装。
    每个人都在同一条高速公路上奔跑。没有人提到它有什么限制。

    于是我试着深入挖掘,找出新数据类型 VECTOR 的使用限制。
    所有向量都有两个基本参数
      - 静态 DATATYPE:"整型integer"(或 "int")、"double"、"十进制decimal"、"字符串 "和 "时间戳"。
      - 半动态 LEN(gth): > 0 通常也称为 POSITION;纯整数。

    这个 LEN/POSITION 参数就相当于vector的数学维度。
    当然,在爱因斯坦的宇宙中,根据他的相对论,你可能只需要 4 个维度或更少。
    即使是 60 年代提出的宇宙弦理论也没有超过 11.

    0
    0 127
    文章 Louis Lu · 七月 1, 2024 4m read

    迄今为止,我看到的大多数使用向量vector的示例,将它只作为 SQL 中的一种功能,尤其是围绕 VECTOR_Search 的 3 个函数。
    * TO_VECTOR()
    * vector_dot_product ()
    * vector_cosine ()

    iris-vector-search 演示包中隐藏着一个非常有用的摘要。
    从那里,你可以通过多个链接找到所需的一切。

    我还缺少更多的 VECTOR 方法,于是在 Idea Portal 上提出了相关请求。

    接着,我想起每个 SQL 方法或存储过程都有一堆 ObjectScript 代码。
    于是我开始搜索,下面就是我的研究的一些总结:

    %Library.Vector 是对新数据类型的核心描述
          这是一种复杂的结构,就像对象或 %DynamicObjects 或 $Bit Expressions 一样,需要特定的方式去访问。
    我们还可以看到 2 个必备参数: 
          * DATATTYPE - 一旦设置就不能更改。 可接受的类型:  "整数integer"(或 "int")、"双精度浮点double"、"十进制decimal"、"字符串 "和 "时间戳"。
          * LEN >0 时,可以增长,但绝对不能缩小

    $vector() / $ve() 是矢量访问的基本方法
          * 设置矢量数据 >>> SET $VE(. . .

    0
    0 138
    文章 Louis Lu · 六月 30, 2024 1m read

    你可以使用List query 对 %SYS.Audit 查询审计日志,代码如下:

     Set statement=##class(%SQL.Statement).%New()  
     Set status=statement.%PrepareClassQuery("%SYS.Audit","List")
     Set rs=statement.%Execute()  
     Set tab = $char(9)
     While rs.%Next() {    
       Write rs.%Get("TimeStamp")_tab_rs.%Get("Event")_tab_rs.%Get("Username"),!      
     }
    0
    0 98