Artigo
· Jul. 4, 2023 5min de leitura

Utilizando Python no Iris

Olá, Criei este artigo inicialmente para demonstrar a usabilidade do Python dentro do Iris e sua funcionalidade, no código abaixo trago um exemplo de algo muito próximo que utilizamos para a solução de um problema, nele recebemos uma Global contendo um XML com mais de 7.000.000 de caractéres, onde fazemos as tratativas de limpeza, organização, conversão para um arquivo JSON e retornamos ele como resposta uma Global.

 

 

 

 

 

Class AXS.BP.Exemplo Extends (Ens.BusinessProcess, %XML.Adaptor) [ ClassType = persistent 

{

 

Method OnRequest(pRequest As AXS.BP.Req.ExemploBPRequest, Output pResponse As AXS.BP.Resp.ExemploBPResponse) As %Status

 

{

 

    Set tSC = $System.Status.OK()

 

    Try

 

    {          

        Set tRequest = ##Class(AXS.BO.BOT.Req.ExemploRequest).%New()

 

        Do pRequest.xml.Rewind()

 

        Do tRequest.fatura.CopyFrom(..RetornaJSON(pRequest.xml))

 

        $$$THROWONERROR(tSC,..SendRequestSync("Exemplo",tRequest,.tResponse))

 

        If $IsObject(tResponse) {

 

            Set pResponse=##class(AXS.BP.Resp.ExemploBPResponse).%New()

 

            If tResponse.status '= 200 {

 

            } Else {

 

                Set pResponse.retorno = tResponse.retorno

 

                Set pResponse.status = tResponse.status

 

            }       

 

        }  

 

    }

 

    Catch tException

 

    {

 

        Set:'$$$ISERR(tSC) tSC=tException.AsStatus()

 

        Set tSC = $System.Status.GetErrorText(tSC)

 

    }

 

    Quit tSC

 

}

 

ClassMethod RetornaJSON(XML As %Stream.GlobalCharacter) As %Stream.GlobalCharacter [ Language = python ]

 

{

 

    import xmltodict

 

    import json

 

    from datetime import datetime

 

    import iris

 

    XML.Rewind()

 

    xmllido = ""

 

    while XML.AtEnd == 0:

 

        xmlle = XML.ReadLine(9000)

 

        xmllido = xmllido + str(xmlle)

 

    def converte_xml_para_json(xml_file):

 

        xml_data = xml_file

 

        json_data = xmltodict.parse(xml_data)

 

        json_output = json.dumps(json_data, indent=4)

 

        return json_output

 

    def filtro_array_tres_meses(json_data):

 

        data_atual = datetime.now()

 

        dados_corretos = []

 

        dados_errados = []

 

        for item in json_data["Relatorio"]["Linha"]:

 

            if 'Periodo' in item:

 

                periodo = item['Periodo']

 

                periodo_date = datetime.strptime(periodo, "%Y/%m")

 

                diferenca_meses = (data_atual.year - periodo_date.year) * 12 + data_atual.month - periodo_date.month

 

                if diferenca_meses <= 3:

 

                    if len(item) == 15:

 

                        dados_corretos.append(item)

 

                    else:

 

                        dados_errados.append(item)

 

        return dados_corretos, dados_errados

 

    def converter_maiusculas_para_minusculas(dados_json):

 

        if isinstance(dados_json, dict):

 

            novo_dict = {}

 

            for chave, valor in dados_json.items():

 

                nova_chave = chave.lower()

 

                novo_valor = converter_maiusculas_para_minusculas(valor)

 

                novo_dict[nova_chave] = novo_valor

 

            return novo_dict

 

        elif isinstance(dados_json, list):

 

            novo_lista = []

 

            for item in dados_json:

 

                novo_item = converter_maiusculas_para_minusculas(item)

 

                novo_lista.append(novo_item)

 

            return novo_lista

 

        elif isinstance(dados_json, str):

 

            return dados_json.lower()

 

        else:

 

            return dados_json

 

    json_data = converte_xml_para_json(xmllido)

 

    dados_convertidos = json.loads(json_data)

 

    dados_corretos, dados_errados = filtro_array_tres_meses(dados_convertidos)

 

    json_saida = {}

 

    json_saida["Fatura"] = dados_corretos

 

    json_saida["Erro"] = dados_errados

 

    total_objetos = len(json_saida['Fatura'])

 

    for i in range(total_objetos):

 

        if json_saida["Fatura"][i]["Per_prox_saldo_exp"] == None:

 

            json_saida["Fatura"][i]["Per_prox_saldo_exp"] = ""

 

    json_combinado_saida = json.dumps(json_saida, indent=4)

 

    dados_convertidos = converter_maiusculas_para_minusculas(json_combinado_saida)

 

    jsonPronto = iris.cls('%Stream.GlobalCharacter')._New() 

 

    for linha in dados_convertidos:

 

        jsonPronto.Write(linha)

 

    return jsonPronto

 

}

 

Storage Default

{

<Type>%Storage.Persistent</Type>

}

}

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