jueves, 23 de mayo de 2024

[JD Edwards] Orchestrator: Manipulate Output - Eliminar nodos duplicados (ES)

 

Hola JDEFriends,


En esta ocasión quería mostraros cómo he conseguido realizar de manera simple transformar un json de orchestrator con artículos repetidos, en otro como salida sin referencias repetidas.

Tenemos el siguiente json input:


Vemos cómo tenemos varias referencias repetidas. Vamos a usar la función "uniq" del módulo json en JRuby en el Manipulate Output de nuestro orchestrator:

require 'json'  
def main(orchAttr, input)
    
    jsonIn = JSON.parse(input)
    
    #Add code here to manipulate JSON output
    items = jsonIn['ITEMS']
    unique_items = items.uniq{|item| item['ShortItemNo']}
    jsonIn['ITEMS'] = unique_items
    
    jsonOut = JSON.generate(jsonIn)
    
    return jsonOut
end

Obtenemos todos los nodos de ITEMS y aplicamos la función uniq que itera sobre todo los items y nos devuelve el json con los items únicos en función del atributo 'ShortItemNo'



Buen código!


4 comentarios:

  1. muy bueno, yo tengo un problema parecido a ver si lo puedo solucionar así.

    Realizo una conexión a una base de datos externa con una conexión/conector y solo debo obtener el mayor Nro de un Select

    def selectStmt = "SELECT MAX (ALHONB) FROM BLXXXX WHERE C0ST= 'F';
    esto no me trae nada , pero no me da error en la ORCH.

    def selectStmt = "SELECT ALHONB FROM BLXXXX WHERE C0ST= 'F' ORDER BY ALHONB DESC";
    Me devuelve el JSON con muchos valores ordenados , pero solo debo tomar el mayor

    ResponderEliminar
  2. Pues me extraña bastante que en la primera no te devuelva el máximo, ¿has probado por base de datos la salida? ¿has comprobado poniendo una traza en el groovy/jruby del script? ¿cómo se lo estás asignando al parámetro de salida? pone un alias "MAX(ALHONB) AS ALHONB". De todas formas, con la segunda opción también podrías poner un "LIMIT 1" al final para que te devuelva solo el primer registro. Saludos.

    ResponderEliminar
  3. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  4. Buenas, gracias por la respuesta
    he cambiado la salida , xq estaba como "Rows" entonces la sentencia MAX me intentaba hacerlo en un array entiendo .
    //use the helper to set the records from the result set to the array variable
    returnMap = orchAttr.mapResultSetToDataSet(resultSet,"rows");
    returnMap = orchAttr.mapResultSetToDataSet(resultSet,"ALHONB"); la cambie por esta y le quité los valores de salida a la ORCH

    Me devuelve solo el mayor --> 682217

    "ConnectorRequest1": {
    "ALHONB": [
    {
    "00001": 682217
    }
    ]
    },
    "jde__status": "SUCCESS",
    "jde__startTimestamp": "2024-07-24T07:59:17.329+0200",
    "jde__endTimestamp": "2024-07-24T07:59:17.748+0200",
    "jde__serverExecutionSeconds": 0.419
    }

    gracias por la respuesta, en JDE tengo experiencia , en estas cuestiones de integraciones todavía necesito mas practica !

    ResponderEliminar