Artigo
· Fev. 21, 2022 2min de leitura

Globais de Armazenamento de Dados Criadas via DDL e a partir de ObjectScript podem ser diferentes

Olá desenvolvedores!

Algumas vezes precisamos inserir ou fazer referência aos dados de classes persistentes diretamente através das globais.

E talvez muitos de vocês estejam esperando que a estrutura de dados da global com os registros seja:

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

Este artigo é um aviso que nem sempre isso é verdade. Não espere que sempre seja assim!

Para recuperar a estrutura da global experimente o código da seguinte classe. Crie a classe abaixo no 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;
}

E insira registros via SQL (ex. via DBeaver):

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

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

Você pode visualizar as globais usando:

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

Note que o primeiro segmento do $LB é " " - ele é normalmente vazio se sua classe deriva diretamente de %Persistent.

Porém, se você criar a classe a partir de DDL e, inserir algumas poucas linhas, notará que o armazenamento é diferente, assim:

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

Não existe um elemento inicial vazio. 

Reproduzindo. Vamos inicialmente deletar a classe e seus dados:

DROP TABLE Sample.Person

Crie a mesma classe usando DDL:

CREATE TABLE Sample.Person (

   Surname VARCHAR(50) NOT NULL,

   Name VARCHAR(50) 

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

Insira registros e, conforme abaixo, exiba o conteúdo da global:

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

IRISAPP>

Isso demonstra que quando uma classe é criada via DDL, ela é gerada como Final, o que significa que não são permitidas heranças a partir desta classe (por que a propósito?). 

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

E significa que neste caso, este elemento "não tem uso".

Mas se você esperava isso, isso pode ser confuso.

Discussão (0)2
Entre ou crie uma conta para continuar