Artículo
Alberto Fuentes · Mayo 11 Lectura de 2 min

El almacenamiento en globals creados via ObjectScript vs. DDL puede ser diferente

¡Hola desarrolladores!

A veces necesitamos insertar o referir los datos de clases directamente en globals.

Y quizá muchos de vosotros esperáis que la estructura de datos de una global con registros sea:

^Sample.Person(Id)=$listbuild("",col1,col2,...,coln).

Este artículo es un aviso de que esto no siempre es verdad, así que no se debe dar por supuesto!

Para obtener la estructura de un global, prueba el siguiente código. Crea una clase en IRIS:

Class Sample.Person Extends %Persistent 
{
Property Surname As %Library.String(MAXLEN = 50) [ Required, SqlColumnNumber = 2 ];
Property Name As %Library.String(MAXLEN = 50) [ SqlColumnNumber = 3 ];
Parameter DEFAULTGLOBAL = "^Sample.Person";
Parameter USEEXTENTSET = 1;
}

A continuación, inserta registros via SQL (por ejemplo, vía DBeaver):

INSERT INTO Sample.Person VALUES ('Doe','John')

INSERT INTO Sample.Person VALUES ('Smith','Adam')

Puedes ver el global desde una sesión de Terminal:

IRISAPP>zw ^Sample.Person.1
^Sample.Person.1=2
^Sample.Person.1(1)=$lb("","Doe","John")
^Sample.Person.1(2)=$lb(,"Smith","Adam")

Ten en cuenta que el primer segmento de $LB es "- normalmente está vacío si tu clase deriva directamente de %Persistent.

Pero si creas la clase utilizando DDL e insertas unas pocas líneas, verás que el almacenamiento es diferente. Esto es:

^Sample.Person(Id)=$listbuild(col1,col,2,...,coln)

No hay un primer elemento vacío. 

Vamos a reproducirlo. Primero vamos a eliminar la clase y los datos:

DROP TABLE Sample.Person

Crea la misma clase via DDL:

CREATE TABLE Sample.Person (

   Surname VARCHAR(50) NOT NULL,

   Name VARCHAR(50) 

)  WITH %CLASSPARAMETER DEFAULTGLOBAL = '^Sample.Person'

Inserta registros desde SQL como hicimos antes, y muestra el global en una sesión de Terminal:

IRISAPP>zw ^Sample.Person.1
^Sample.Person.1=2
^Sample.Person.1(1)=$lb("Doe","John")
^Sample.Person.1(2)=$lb("Smith","Adam")

IRISAPP>

Resultó que cuando se crea una clase vía DDL, la genera con una cláusula Final, lo que significa que no está permitida la herencia de clases.

Class Sample.Person Extends %Persistent [ ClassType = persistent, DdlAllowed, Final, Owner = {_SYSTEM}, ProcedureBlock, SqlRowIdPrivate, SqlTableName = Person ]

Pero ¡atención!, este comportamiento se puede ajustar. De manera que cuando generes una clase desde DDL no lo haga incluyendo la cláusula Final.

set sc=$SYSTEM.SQL.Util.SetOption("DDLFinal",0,.oldval)
0
0 21
Debate (0)2
Inicie sesión o regístrese para continuar