Escrito por

Analista Desenvolvedora Jr at Bridger
Artigo Heloisa Paiva · Set. 26, 2024 5m read

IRIS Python nativo - Parte 2

Na sessão anterior, exploramos o processo de instalação e começamos a escrever o IRIS em Python nativo. Agora procederemos a examinar a global percorrida e interatuar com os objetos da classe IRIS

get: esta função se utiliza para obter valores do nó percorrido

deftraversal_firstlevel_subscript():"""
    ^mygbl(235)="test66,62" and ^mygbl(912)="test118,78"
    """for  i in irispy.node('^mygbl'):
        print(i, gbl_node.get(i,''))

 

node e items: percorrido de um só nível com node  e obtenção dos valores da mesma maeira que $Order(^mygbl(subscript), direction, data).

#single level traversaldeftraversal_dollar_order_single_level():for  sub,val in irispy.node('^mygbl').items():
         print('subscript:',sub,' value:', val)
# multi level traversaldeftraversal_dollar_order_multi_level():for  sub,val in irispy.node('^mygbl').items():
         print(f'sub type is: {type(sub)}{sub} and val type is {type(val)}')
         for sub1,val1 in irispy.node('^mygbl',sub).items():
            print('subscript:',sub1,' value:', val1)
        

 

nextsubscript: diferente do código anterior, pode usar nextsubstricpt para obter o subíndice seguinte facilmente.

deftraversal_dollar_order_use_nextsubscript():
      direction = 0
      next_sub = ''while next_sub != None:
            next_sub = irispy.nextSubscript(direction,'^mygbl', next_sub)
            print(f'next subscript = {next_sub}' )
            next_sub1=''if next_sub == None:returnwhile next_sub1 != None:
                next_sub1 = irispy.nextSubscript(direction,'^mygbl',next_sub,next_sub1)
                print(f'1st subscript = {next_sub} next subscript {next_sub1}' )

 

Clases e Objetos

Você pode chamar os classmethods (métodos de classe) desde a definição da classe usando a função específica. Como mencionei anteriormente, os Typecast Methods são cruciais para obter a resposta adequada de IRIS.

Antes de continuar, é importante se dar conta de que, diferente dos tipos de dados de IRIS, qie podemos tratar tudo como string, os tipod de dados de Python, como int, str,bool list se classificam como objetos. Cada um desses tipos possui seus próprios atributos e métodos; por exemplo, o tipo de string do Python inclui funções como .upper() .lower() que não são aplicáveis em outros tipos de dados. Em consequência, o IRIS está equipado com a capacidade de converter os valores de cadeia de IRIS em objetos de tipos de dados compatíveis com Python mediante o uso dos Typecast Methods. Essa funcionalidade se aplica de maneira similar aos métodos de classe, funções definidas pelo usuário e procedimentos. Do contrário, você deve utilizar as funções de conversão de tipos de Python para conseguir o tipo de dados desejado.

classMethodValue:Chama o Classmethod desde o Python sem iniciar o objeto, da mesma maneira que (por exemplo):

Do ##Class(Test.MYTest).FirstNameGetStored(1)) e obtem um valor predeterminado de tipo "string" em Python. Há diferentes métoods de conversão de tipo disponíveis para o valor de retorno esperado no lugar de string. Por favor, veja o seguinte:

defget_clsmethod_value():
    print(irispy.classMethodValue('Test.MYTest','FirstNameGetStored',1)) #return string 
    date_horolog = irispy.classMethodInteger('Test.MYTest','GetHorolog') #return +$H value
    print(irispy.classMethodVoid('Test.MYTest','SetTestGlobal','test')) # no return resposne

 

classMethodObject: Função importante para instanciar um novo objeto IRIS ou abrir um objeto existente. Configure as propriedades e invoque métodos de instância, etc.

Nuevo objeto IRIS: Inicie o objeto de classe para Test.MYTest e configure as propriedades.

defcls_object_new():"""
    initiate new object and store
    """
    iris_proxy_obj = irispy.classMethodObject('Test.MYTest','%New','ashok','kumar')

    birthdate_horolog = irispy.classMethodInteger('Test.MYTest','GetHorolog','12/12/1990')
    horolog = irispy.classMethodInteger('Test.MYTest','GetHorolog')
    iris_proxy_obj.set('BirthDate',birthdate_horolog) #set birthdate property
    iris_proxy_obj.set('RegisteredDate',horolog) #set the RegisteredDate property
    status = iris_proxy_obj.invoke('%Save') #call instance methodreturn status

 

Abrir objeto IRIS: No código que se segue, abra o objeto da classee Test.MyTest e obtenha os valores de Birthdate e RegisteredDate do objectid "2", e converta RegisteredDate em uma lista Python.

defcls_object_open():
    iris_proxy_obj = irispy.classMethodObject('Test.MYTest','%OpenId',2)
    birth_date = iris_proxy_obj.get('BirthDate')
    full_name iris_proxy_obj.InvokeString("GetFullName")
    data = [birth_date, iris_proxy_obj.get('RegisteredDate')]
    return data

 

Definição de classe IRIS que utilizei para a demonstração do código de classe e objeto em Python.

 

Spoiler

 
Class Test.MYTest Extends%Persistent
{

Property FirstName As%String;Property LastName As%String;Property BirthDate As%Date;Property RegisteredDate As%Date;
Method %OnNew(FirstName, LastName) As%Status
{
	Set..FirstName = FirstName
	Set..LastName = LastName
	Return$$$OK
}

ClassMethod GetHorolog(pDate As%String = "") [ CodeMode = expression ]
{
$Select(pDate'="":$ZDH(pDate),1: +$H)
}

Method GetFullName() As%String
{
	Return..FirstName_","_..LastName
}
}

 

 

Typecast methods:

Estes são alguns métodos typecast para recuperar valores de retorno adequados de IRIS:

classMethodValue() - para chamar a métodos de classe gerais.

classMethodInteger - Devolve um valor inteiro
classMethodVoid - Sem valor de retorno
classMethodValue - String por padrão
classMethodFloat - Valor de retorno float

invoke() - se utiliza para chamar aos métodos de instância. Você deve iniciar o objeto para chamar a esta invocação de funções

invokeString - String por padrão
invokeFloat - valor de retorno float
invokeInteger - valor de retorno inteiro

Cobriremos as funções, chamadas a procedimentos em rotinas e outras funcionalidades no próximo artigo.