Encontrar

Article
· Sep 1 3m read

Programación práctica en ObjectScript: de JSON a Globals a SQL

Al comenzar con InterSystems IRIS o Caché, los desarrolladores a menudo se encuentran con tres conceptos fundamentales: Dynamic Objects, Globals y Relational Table. Cada uno tiene su papel en la construcción de soluciones escalables y mantenibles. En este artículo recorreremos ejemplos prácticos de código, destacaremos buenas prácticas y mostraremos cómo estos conceptos se relacionan entre sí.

1. Trabajando con Dynamic Objects:

Los objetos dinámicos (%DynamicObject y %DynamicArray) permiten a los desarrolladores manipular estructuras similares a JSON directamente en ObjectScript. Son especialmente útiles para aplicaciones modernas que necesitan analizar, transformar o generar JSON.

Ejemplo: Crear y manipular Dynamic Objects

    // Create a Dynamic object
    Set obj - {}

    // Add properties
    Set obj.name = "Vachan"
    Set obj.age = 25
    // Nested objects
    Set obj.address = {"city":"Bengaluru", "zip":"560000"}
    
    // Add an Array
    Set obj.skills = ["Objectscript", "SQL"]
    
    // Convert to JSON string
    Set json = obj.%ToJSON()
    Write json,!
    
    // Parse JSON string back to an object
    Set parser = {}.%FromJSON(json)
    Write parser.name

Mejores prácticas

  • Validad siempre la entrada JSON con %FromJSON() para detectar errores.
  • Usad obj.%Get("property") cuando no estéis seguros de que una propiedad exista.
  • Preferid %DynamicArray para estructuras de tipo lista.

2. Usando Globals de manera efectiva:

Los Globals son arrays dispersos jerárquicos almacenados directamente en el motor de la base de datos IRIS. Son extremadamente rápidos y pueden almacenar prácticamente cualquier estructura.

Ejemplo: Almacenando datos en Globals

// Store student data in a global
SET ^Student(1,"Name") = "Alice"
SET ^Student(1,"Age") = 29
SET ^Student(2,"Name") = "Bob"
SET ^Student(2,"Age") = 34
// Retrieve data
WRITE ^Student(1,"Name")  // outputs: Alice
// Iterate over all students
SET id=""
FOR  SET id=$ORDER(^Student(id)) QUIT:id=""  {
    WRITE "Student ",id,": ",^Student(id,"Name")," (Age ",^Student(id,"Age"),")",!
}

Mejores prácticas:

  • Definid una estructura clara para el global antes de codificar (evitad claves ad-hoc).
  • Usad globals para almacenamiento de alto rendimiento cuando no se necesite la sobrecarga de SQL.
  • Para los datos de la aplicación, preferid clases persistentes con globals gestionados internamente.

3. Creación de tablas relacionales SQL:

En IRIS, las tablas relacionales se pueden crear tanto usando SQL DDL como clases persistentes.

Ejemplo: Crear una tabla SQL mediante DDL

CREATE TABLE Employee (
    ID SERIAL PRIMARY KEY,
    Name VARCHAR(50),
    Age INT,
    Department VARCHAR(50)
);

Ejemplo: Crear la misma tabla como Clase Persistente

Class Company.Employee Extends (%Persistent) {
    Property Name As %String(MAXLEN=50);
    Property Age As %Integer;
    Property Department As %String(MAXLEN=50);
}

Una vez compilada, esta clase crea automáticamente un global subyacente y una tabla SQL. Ahora podéis usar tanto ObjectScript como SQL:

// Create and save an employee
SET emp = ##class(Company.Employee).%New()
SET emp.Name = "Charlie"
SET emp.Age = 40
SET emp.Department = "IT"
DO emp.%Save()

// Query employees with SQL
&sql(SELECT Name, Age FROM Company.Employee)
WHILE (SQLCODE=0) {
    WRITE "Employee: ",Name,", Age: ",Age,!
    FETCH NEXT
}

Mejores Prácticas:

  • Preferid clases persistentes para aplicaciones mantenibles.
  • Usad SQL DDL para definiciones rápidas de tablas o integración con sistemas externos.
  • Definid siempre índices para las propiedades que se consultan con frecuencia.

RESUMEN:

Ya sea que estéis analizando cargas JSON, gestionando datos de acceso rápido o diseñando tablas relacionales, entender cuándo usar objetos dinámicos, globals o clases persistentes es clave para convertiros en desarrolladores efectivos de ObjectScript.

Discussion (0)1
Log in or sign up to continue
Article
· Sep 1 7m read

Crea un agente de IA para atención al cliente con smolagents + InterSystems IRIS (SQL, RAG e interoperabilidad)

Las preguntas de atención al cliente pueden abarcar datos estructurados (pedidos, productos 🗃️), conocimiento no estructurado (docs/FAQs 📚) y otros sistemas integrados (actualizaciones de envío 🚚). En este post vamos a construir un agente de IA compacto que cubre los tres—usando:

  • 🧠 Python + smolagents para orquestar el “cerebro” del agente
  • 🧰 InterSystems IRIS para SQL, Búsqueda Semántica (RAG) e Interoperabilidad (una API de seguimiento de envío simulada)

1 Comment
Discussion (1)2
Log in or sign up to continue
Article
· Sep 1 6m read

Build a Customer Support AI Agent with smolagents + InterSystems IRIS (SQL, RAG & Interoperability)

Customer support questions span structured data (orders, products 🗃️), unstructured knowledge (docs/FAQs 📚), and live systems (shipping updates 🚚). In this post we’ll ship a compact AI agent that handles all three—using:

  • 🧠 Python + smolagents to orchestrate the agent’s “brain”
  • 🧰 InterSystems IRIS for SQL, Vector Search (RAG), and Interoperability (a mock shipping status API)

Discussion (0)1
Log in or sign up to continue
Announcement
· Sep 1

Récapitulation de la communauté des développeurs, Août 2025

Bonjour et bienvenue à la récapitulation de la Communauté des développeurs d'août 2025.
Statistiques générales
✓ Nouvelles publications 22 publiées l'Août :
 12 nouveaux articles
 10 nouvelles annonces
✓ Nouveaux membres 4 ayant rejoint l'Août
✓ Publications 1,244 publiées depuis le début
✓ Membres 185 ayant rejoint depuis le début
Meilleures publications
Les meilleurs auteurs du mois
Articles
#InterSystems IRIS
Configuration d'OpenTelemetry dans IRIS
Par Sylvain Guilbaud
Comment créer votre propre table de recherche pour la messagerie HL7
Par Lorenzo Scalese
Utilisation de LIKE avec des variables et des modèles dans SQL
Par Iryna Mykhailova
Un guide pour débutants sur la création de tables SQL et leur visualisation en tant que classes
Par Iryna Mykhailova
Hébergement d'une application Flask de l'API REST sur InterSystems IRIS à l'aide de l'interface WSGI
Par Liam Evans
Pilote pour connecter IRIS à Metabase
Par Guillaume Rongier
Pourquoi devons-nous établir des règles ou des conventions de codage ?
Par Lorenzo Scalese
Traçage des applications InterSystems IRIS à l'aide de Jaeger
Par Iryna Mykhailova
Comment contrôler l'ordre des colonnes affichées lors de l'accès à partir d'un outil ODBC / JDBC
Par Sylvain Guilbaud
 
#Autre
 
#InterSystems IRIS for Health
 
#Communauté des développeurs officielle
 
Annonces
#Communauté des développeurs officielle
 
#IRIS contest
 
#InterSystems IntelliCare
 
#Global Masters
 
#InterSystems IRIS for Health
 
#InterSystems officiel
 
#HealthShare
 
Août, 2025Month at a GlanceInterSystems Developer Community
Discussion (0)1
Log in or sign up to continue
Question
· Sep 1

IRISTEMPの拡張が 276MBあたりで停止し <FILEFULL> エラーが発生する件

1. 現象

>w $zv
IRIS for Windows (x86-64) 2024.3 (Build 217U) Thu Nov 14 2024 17:59:58 EST

大きなXMLファイル(約165MB)をライブラリー%XMLでパースすると、<FILEFULL>エラーが発生する。

エラーパート

    s libraryFile = "D:\iTunes3\iTunes Library.xml" ;サイズ=165M
    w !,"libraryFile = ",libraryFile
    w !,"##class(%File).GetFileSize(libraryFile)=",##class(%File).GetFileSize(libraryFile)
    w !,"s sc=##class(%XML.TextReader).ParseFile(libraryFile,.reader) 実行"
    Set sc = ##class(%XML.TextReader).ParseFile(libraryFile,.reader)
    w !,$SYSTEM.Status.GetErrorText(sc)
    q

libraryFile = D:\iTunes3\iTunes Library.xml
##class(%File).GetFileSize(libraryFile)=165739267
s sc=##class(%XML.TextReader).ParseFile(libraryFile,.reader) 実行
エラー #6301: SAX XMLパーサエラー: <FILEFULL>startElement+3^%XML.SAX.Utils.Sequencer.1 ^||IRIS.Temp(4,13592576),c:\intersystems\iris1\mgr\iristemp\  while processing D:\iTunes3\iTunes Library.xml at line 2280394 offset 34
USER>

上の処理と同時に同じネームスペースで、##Class(%Stream.TmpCharacter) の処理をしていて、それも

エラー #5002: ObjectScript エラー:<FILEFULL>SetupTmpGbl+3^%Stream.GlobalCharacter.1 ^||%IRIS.Stream,c:\intersystems\iris1\mgr\iristemp\

で止まる。

また、起動していた、システム管理ポータルも次の遷移時に

エラー #5002: ObjectScript エラー:<FILEFULL>GetCSPClassName+18^%SYS.cspServer ^IRIS.TempCSP("ClsN","%SYS","/iris1/csp/sys/exp/%25CSP.UI.Portal.SQL.Home.zen","/iris1/csp/sys/%CSP.Broker.cls"),c:\intersystems\iris1\mgr\iristemp\

で止まる。この時、各処理をHALTしないで、IRISのSTOPをすると、止まらい場合があり、強制終了(iris force IRIS1)が必要な場合があった。

直接の原因は、IRISTEMP(c:\intersystems\iris1\mgr\iristemp\)のIRIS.DATで <FILEFULL>エラー(空きなし)が起こっている。

2. 再現検証テスト

いろいろ調べましたが、問題は、「IRISTEMP のサイズがある値(240M、276M、282M あたり)以上に拡張されない」ことにあるのでないかと思います。
以下、その簡単な検証テストです。

1) IRIS(インスタンス名=IRIS1)を停止

2)C:\InterSystems\IRIS1\mgr\iristemp\IRIS.DAT (現サイズ282.624KB) を削除

3) IRIS1 起動

4) ターミナル %SYS

%SYS>d ^DATABASE (管理ポータル > システムオペーレション > データベース > IRISTEMP の代わり)
  
 1) Create a database
 2) Edit a database
 3) List databases
 4) Delete a database
 5) Mount a database
 6) Dismount a database
 7) Compact globals in a database
 8) Show free space for a database
 9) Show details for a database
10) Recreate a database
11) Manage database encryption
12) Return unused space for a database
13) Compact free space in a database
14) Defragment a database
15) Show background database tasks
16) Manage multi-volume database properties
 
Option? 9
Database directories? C:\InterSystems\IRIS1\mgr\iristemp\

Directory:               c:\intersystems\iris1\mgr\iristemp\
MirrorDBName:
MaxSize:                 0
Size:                    1
Status:                  マウント/RW
BlockSize:               8192
ClusterMountMode:        0
ClusterMounted:          0
ExpansionSize:           0
LastExpansionTime:
Mounted:                 1
NewGlobalCollation:      IRIS standard
NewGlobalGrowthBlock:    50
NewGlobalIsKeep:         0
GlobalJournalState:      いいえ
NewGlobalPointerBlock:   16
ReadOnly:                0
ResourceName:            %DB_IRISTEMP
MountedReadOnly:         0
EncryptedDB:             0
EncryptionKeyID:
NewVolumeThreshold:      0
NewVolumeDirectory:      c:\intersystems\iris1\mgr\iristemp\
MultiVolume:             0
Configured DB Name:      IRISTEMP
Mount Required At Startup: Yes
  
 8) Show free space for a database
Option? 8
Database directory to show free space for (*=All)? C:\InterSystems\IRIS1\mgr\iristemp\
 
                              Database Free Space
                              Sep 01 2025  9:10 AM
Database                           Max Size  Size    Available %Free   Disk Free
c:\intersystems\iris1\mgr\iristemp\無制限    1MB     0.17MB    17      70.25GB
 
IRIS.DATのエクスプローラサイズ 初期値 1M

5) ターミナル USER

テンポラリーグローバル ^||...に大量書き込み

USER>s d=$j(" ",1024*1024) try {f i=1:1:300 w:i#50=0 " ",i s ^||temp(i)=d} catch {w !,"$ze=",$ze,!!,"i=",i}
 50 100 150 200 250
$ze=<FILEFULL> ^||temp(273),c:\intersystems\iris1\mgr\iristemp\
 
i=273

同様 IRISTEMPで <FILEFULL> エラー
i=300 まで行かない。IRISTEMPのサイズ拡張が止まり、空き領域なしでエラー?

6) ターミナル %SYS>d ^DATABASE

                              Database Free Space
                              Sep 01 2025  9:16 AM
Database                           Max Size  Size    Available %Free   Disk Free
c:\intersystems\iris1\mgr\iristemp\無制限    276MB   0.62MB    0    <- 69.98GB
 
%Free=0
エクスプローラ IRIS.DAT サイズ 282,624KB

7) ターミナル USER HALT

空き領域は回復

8) ターミナル %SYS>d ^DATABASE

                              Database Free Space
                              Sep 01 2025  9:18 AM
Database                           Max Size  Size    Available %Free   Disk Free
c:\intersystems\iris1\mgr\iristemp\無制限    276MB   275MB     100     69.98GB

9) %SYS で 実行

%SYS>s d=$j(" ",1024*1024) try {f i=1:1:300 w:i#50=0 " ",i s ^||temp(i)=d} catch {w !,"$ze=",$ze,!!,"i=",i}
 50 100 150 200 250
$ze=<FILEFULL> ^||temp(273),c:\intersystems\iris1\mgr\iristemp\
 
i=273

同様にエラー。%SYSでも、テンプグローバル ^||... は、IRISTEMを使っている。

                              Database Free Space
                              Sep 01 2025  9:21 AM
Database                           Max Size  Size    Available %Free   Disk Free
c:\intersystems\iris1\mgr\iristemp\無制限    276MB   0.57MB    0    <- 69.98GB
 
%SYS>k ^||temp
 
%SYS>d ^DATABASE 
                              Database Free Space
                              Sep 01 2025  9:22 AM
Database                           Max Size  Size    Available %Free   Disk Free
c:\intersystems\iris1\mgr\iristemp\無制限    276MB   275MB     100     69.98GB
 
エクスプローラ IRIS.DAT サイズ 282,624KB 変わらず。

%SYSも含め、すべてのネームスペースのTemp Storageは、同じ IRISTEMP にマップされている。

3. その他テスト

3.1 管理ポータル/ローカルデータベースでサイズ拡大処理

管理ポータル > システム管理 > 構成 > システム構成 > ローカルデータベース

名前    IRISTEMP
ディレクトリ    c:\intersystems\iris1\mgr\iristemp\
ブロックサイズ    8192 バイト
サイズ (MB)    現在    240 (>=240)
拡張                0        デフォルトは0
最大                0        0で無制限になります
リソース名            %DB_IRISTEMP

で、現在の値を、500等、より大きな値を入れるが、270 -> 276 になるが、これ以上大きくならない。拡張に10,100等を指定するが効果なし。
ちなみに、IRIS.DATサイズの初期値が 1M の時は、現値に、500 入れると、一覧表示のステータスが 拡大中となる。しかし、276M で拡張が止まる。

3.2 新データベース MYTEMP を作成、Temp Storage にマップするが、マップされていない

通常のIRIS.DATの様に拡張可能性を期待してMYTEMPという別のデータベースを新規に作り、管理ポータル > ネームスペースで 
既存別ネームスペース(USER2) のTemp Storageを IRISTEMP から MYTEMP に設定、テストしました。

管理ポータル > システム管理 > 構成 > システム構成 > ネームスペース

       Namespace     Globals     Routines     Temp Storage                         
     %SYS    IRISSYS    IRISSYS    IRISTEMP    グローバルマッピング    ルーチンマッピング    パッケージマッピング    - (変更削除不可)
     USER    USER    USER    IRISTEMP    グローバルマッピング    ルーチンマッピング    パッケージマッピング    削除
     USER2    USER2    USER2    MYTEMP        グローバルマッピング    ルーチンマッピング    パッケージマッピング    削除
 
%SYS>d ^DATABASE   
                              Database Free Space
                              Sep 01 2025  9:30 AM
Database                           Max Size  Size    Available %Free   Disk Free
d:\intersystems\iris1\mytemp\      無制限    240MB   239MB     100     155.09GB
 
エクスプローラ IRIS.DAT サイズ 282,624KB

(管理ポータル > ローカルデータベースで 現在の値を、500に入れても、240Mのまま、無駄な?拡張は避けている模様?)

USER2 >s d=$j(" ",1024*1024) try {f i=1:1:300 w:i#50=0 " ",i s ^||temp(i)=d} catch {w !,"$ze=",$ze,!!,"i=",i}
 50 100 150 200 250
$ze=<FILEFULL> ^||temp(273),c:\intersystems\iris1\mgr\iristemp\
 
i=273

エラーから、Temp Strage が D:\InterSystems\IRIS1\MYTEMP\ でなく c:\intersystems\iris1\mgr\iristemp\
Temp Storageが指定通りにマップされていない模様? 

3.3 IRIS修理再インストール

c:\intersystems\iris1\mgr\iristemp\IRIS.DAT を削除後
IRIS_Community-2024.3.0.217.0-win_x64.exe
を修理再インストールするが、システム変更されていませんとなり、¥iristemp¥ には、何も作られない状態でした。

起動後

message.logに
09/01/25-13:55:51:991 (6084) 0 [Utility.Event] Creating missing IRISTEMP database in C:\InterSystems\IRIS1\mgr\iristemp
09/01/25-13:55:52:017 (6084) 0 [Database.MountedRW] Mounted database c:\intersystems\iris1\mgr\iristemp\ (SFN 3) read-write.
09/01/25-13:55:52:021 (6084) 0 [Utility.Event] C:\InterSystems\IRIS1\mgr\iristemp\ initialized as IRISTEMP
のログあり

管理ポータル > システムオペーレション > データベース > IRISTEMP

    ディレクトリ:    c:\intersystems\iris1\mgr\iristemp\
    リソース名:    %DB_IRISTEMP
    マウント:    はい
    読込専用:    いいえ
    読み取り専用の理由:     
    暗号化:    いいえ
    暗号化キーID:     
        
データベースサイズ
    ブロックサイズ:    8192
    ブロック:    1408
    最大サイズ:    無制限
    サイズ:    11MB
    拡張サイズ:    システムデフォルト
    利用可能空き容量:    9.9MB
    % 空き容量:    90%
    ディスク空き容量:    69.63GB
    最終拡張時刻:    09/01/2025 13:56:24
    フル:    いいえ
    新しいボリュームしきい値サイズ(MB):    0

でした。

%SYS>d ^DATABASE
                              Database Free Space
                              Sep 01 2025  1:57 PM
Database                           Max Size  Size    Available %Free   Disk Free
c:\intersystems\iris1\mgr\iristemp\無制限    11MB    9.9MB     90      69.63GB
         
USER>s d=$j(" ",1024*1024) try {f i=1:1:300 w:i#50=0 " ",i s ^||temp(i)=d} catch {w !,"$ze=",$ze,!!,"i=",i}
 50 100 150 200 250
$ze=<FILEFULL> ^||temp(273),c:\intersystems\iris1\mgr\iristemp\
 
i=273

4. 問題

問題1:IRISTEMP のサイズが拡張されない

管理画面や ^DATABASE で「無制限」と表示されていても、IRISTEMP の実際の物理ファイル(IRIS.DAT)は 276MB までで拡張が止まる。
拡張サイズ設定(10MB、100MB)を変更しても意味がなかった。0 指定は、あるデフォルトの拡張サイズがある?
このため、大容量処理(例:165MB の XML パース)で TEMP が不足し <FILEFULL> が発生する。

問題2:Temp Storage に MYTEMP を設定しても無視される

管理画面で名前空間の Temp Storage を MYTEMP に設定しても、実際には IRISTEMP にマップされている。
IRISTEMPは、%SYS他のすべてのネームスペースで、Temp Storageとし共有されているため、特別な保護処置や制約等があるのでは?

確認してほしい事

a) IRISTEMP が物理的に 276MB 以上拡張されない理由
 (設定は無制限、拡張サイズも十分、ディスク空きもあるにもかかわらず)

b) Temp Storage に別データベース(MYTEMP)を指定しても、IRISTEMP が使用される理由

c) TEMP 領域が大量に必要となる処理(例:XML パース)への対応策

d) IRISTEMP の安全な拡張手順または再作成方法

よろしくお願いします。

2 Comments
Discussion (2)1
Log in or sign up to continue