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>
}
}