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.