• Inicio
  • Novedades
  • Academia SAP
  • FAQ
  • Blog
  • Contacto
S4PCADEMY_Logo
Twitter Linkedin Instagram
S4PCADEMY_Logo
Twitter Linkedin Instagram
FORMACIÓN SAP

Caso de uso de enrutador CPI: enrutamiento condicional basado en XPath que puede ocurrir varias veces

By s4pcademy 


Este blog cubre algunas ideas y enfoques sobre el enrutamiento de mensajes basados ​​en una condición XPath particular en SAP CPI.

Requisito:

  • Flujo: SAP S4 HANA -> CPI -> SFTP de terceros
  • Fuente: IDOC, Destino: Definición externa
  • Los IDOC que no tienen /ZCUSTOM_ZINVOIC02_INV/IDOC/E1EDP01/ZCUSTOM_E1EDP01_SUBITEM/ZFLAG=”A” deben terminarse en CPI y no enviarse al sistema de destino.
  • Los IDOC que tienen valores mixtos, es decir, se puede enviar una combinación de «A» y otros valores, pero el mapeo debe considerarse solo para ZFLAG = «A»
  • El origen es IDOC y el destino es un XML personalizado Definición externa
  • Se pueden enviar múltiples IDOC en un lote

Se exploraron 3 enfoques de la siguiente manera:

Enfoque 1:

  • Use un mapeo de mensajes y aplique la lógica para verificar el valor ZFLAG en el nivel IDOC raíz. Suprima los IDOC que no tengan líneas en IDOC que tengan ZFLAG=A.
  • Use un enrutador en el siguiente paso y verifique si el recuento de IDOC es cero.
    • Si el recuento no es cero, páselo al mapeo principal en la ruta predeterminada donde se realiza el mapeo de definición externa de IDOC (ruta predeterminada)
    • Si el recuento es cero, finalice ese lote aquí (Condición del enrutador: recuento (//IDOC) = 0)

Enfoque 2:

  • Use un Groovy Script que lleva un conteo de todos los elementos que tienen ZFLAG=”A” y establece el conteo como una propiedad de intercambio
  • Use un enrutador en el siguiente paso para verificar si el recuento de propiedades de intercambio es mayor que cero
    • Si el conteo no es cero, páselo a la ruta predeterminada donde se realiza el mapeo de definición externa de IDOC y se envía por adelantado
    • Si el recuento es cero, finalice ese IDOC en CPI

Enfoque 3:

  • Use un modificador de contenido para capturar todos los valores reales de Flag en una propiedad de intercambio y use otra propiedad de intercambio para capturar el valor aplicable (aquí es «A»)
  • Use un enrutador en el siguiente paso y verifique si el valor de Propiedad de intercambio de valor aplicable existe en la propiedad de intercambio de valor real.
    • Si el valor aplicable existe en la lista de valores reales, páselo al mapeo principal en la ruta predeterminada donde se realiza el mapeo de definición externa IDOC
    • Si el valor aplicable no existe en la lista de valores reales, finalice ese IDOC en CPI

Los 3 enfoques se tratan en detalle a continuación:

Enfoque 1: combinación de mapeo de filtro + enrutador + mapeo principal

Enfoque%201%20%3A%20Filtro%20Mapeo%20+%20Router%20+%20Principal%20Mapeo

Figura 1- Enfoque 1: Mapeo de filtros + Router + Mapeo principal

Paso 1: Asignación de mensajes que suprime los IDOC que no tienen ni un solo elemento de línea con ZFLAG=A

  • Use un mapeo de mensajes y aplique un filtro para verificar el valor ZFLAG en el nivel IDOC raíz y en el segmento E1EDP01 (los segmentos restantes se pueden mapear uno a uno)
  • Suprima los IDOC que no tienen elementos de línea en IDOC que tengan ZFLAG=A en el mapeo.

Mapeo%20Lógica%20para%20filtrado%20IDOCs%20que%20no%20tienen%20ninguna%20línea%20elementos%20con%20ZFLAG%3DA

Figura 2: Lógica de mapeo para filtrar los IDOC que no tienen elementos de línea con ZFLAG=A (Lógica aplicable para el segmento IDOC raíz y el segmento E1EDP01)

NOTA: Después de ifWithoutElse, se usa un UDF que devuelve un solo verdadero, si al menos existe una sola línea con ZFLAG=A en un IDOC, de lo contrario, devolverá falso, lo que suprimirá ese IDOC en sí mismo (UDF no se analiza aquí)

Paso 2: enrutamiento condicional

  • Paso 2.1: Si el recuento no es cero, páselo al mapeo principal en la ruta predeterminada donde se realiza el mapeo de definición externa de IDOC (ruta predeterminada)
  • Paso 2.2: Si el recuento es cero, finalice ese lote aquí (Condición del enrutador: recuento (//IDOC) = 0)

Enrutador%20Condición%20para%20terminando%20IDOC

Figura 3: Condición del enrutador para terminar los IDOC

Paso 3: dividir y asignar IDOC a XML según corresponda

Resultados de simulación para caso de prueba positivo: cuando los IDOC en un lote contienen al menos un elemento de línea con ZFLAG=A. 4 IDOC activados en un lote, 2 no tienen elementos de línea con ZFLAG=A y 2 IDOC tienen valores mixtos

Simulación%20resultado%20de%20Asignación%20Lógica

Simulación%20resultado%20de%20Asignación%20Lógica

Figura 4: resultado de la simulación de Mapping Logic para un caso de prueba positivo, es decir, cuando un lote de IDOC tiene al menos una línea con ZFLAG=A. De los 4 IDOC en un lote, 2 tienen valores mixtos de ZFLAG y 2 no tienen elementos de línea con ZFLAG=A que se suprimen como se muestra arriba.

Simulation%20Result%20of%20iflow%20for%20positive%20test%20case%20i.e%20when%20batch%20of%20IDOCs%20have%20atleast%20one%20line%20have%20ZFLAG%3DA

Figura 5: resultado de la simulación de iflow para un caso de prueba positivo, es decir, cuando el lote de IDOC tiene al menos una línea con ZFLAG=A. De los 4 IDOC en un lote, 2 tienen valores mixtos de ZFLAG y 2 no tienen elementos de línea con ZFLAG=A que se suprimen en la asignación y los IDOC filtrados relevantes se envían por delante.

Resultados de simulación para caso de prueba negativo: cuando ninguno de los IDOC en un lote tiene elementos de línea con ZFLAG = A

Simulación%20resultado%20de%20asignación%20lógica%20para%20negativo%20prueba%20caso

Figura 6: resultado de la simulación de la lógica de mapeo para el caso de prueba negativo, es decir, cuando el lote de IDOC no tiene líneas que tengan ZFLAG=A. De 2 IDOC en un lote, ninguno de ellos tiene elementos de línea con ZFLAG=A que se suprimen como se muestra arriba.

Simulation%20Result%20when%20batch%20of%20IDOCs%20have%20no%20lines%20have%20ZFLAG%3DA

Figura 7: resultado de la simulación de iflow para un caso de prueba negativo, es decir, cuando el lote de IDOC no tiene líneas que tengan ZFLAG=A. De los 2 IDOC en un lote, ninguno de ellos tiene elementos de línea con ZFLAG=A que se suprimen en Mapping out y, por lo tanto, el recuento de IDOC es cero aquí, por lo tanto, este lote finaliza en CPI.

Enfoque 2: combinación de Groovy + Router + Mapeo principal

Enfoque%202%20%3A%20Groovy%20+%20Router%20+%20Principal%20Mapeo%20Combinación

Figura 8 – Enfoque 2: Groovy + Router + Mapeo principal

  • Paso 1: dividir los IDOC
  • Paso 2: Groovy Script que lleva un conteo de todos los elementos que tienen ZFLAG=”A” y establece el conteo como Exchange Property-ZFLAG_Count
    // Purpose of using this groovy - per requirement, if an IDOC has no Line item (E1EDP01) containing ZCUSTOM_E1EDP01_ITEM/ZFLAG=A, then no output XML for that IDOC should be created from CPI.
    // Below script will return the count of ZFLAG=A in Exchange property, If count > 1 then send idoc to mapping, else end such message in CPI
    
    import com.sap.gateway.ip.core.customdev.util.Message;
    import java.util.HashMap;
    import groovy.util.XmlSlurper ;
    import groovy.xml.XmlUtil;
    import org.w3c.dom.*;
    import javax.xml.parsers.*;
    import java.io.*;
    import java.io.StringReader;
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import org.w3c.dom.Document;
    import org.xml.sax.InputSource;
    def Message processData(Message message) 
    {
    def mapProperties = message.getProperties();
    
    //read message as string
    def body = message.getBody(java.lang.String) as String;
    
    //initialize variables
    def count=0;
    
    //Create a DocumentBuilder
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document doc = builder.parse(new InputSource(new StringReader(body)));
    doc.getDocumentElement().normalize();
    
    //Extract the root element
    Element root = doc.getDocumentElement();
    System.out.println("Root element " + doc.getDocumentElement().getNodeName());
    NodeList nList = doc.getElementsByTagName("E1EDP01");
    
    for (int temp = 0; temp < nList.getLength(); temp++) 
    {
        Node nNode = nList.item(temp);
        Element eElement = (Element) nNode;
                  
        if (eElement.getElementsByTagName("ZFLAG").item(0).textContent.equals("A"))
        count++;
    }
        message.setProperty("ZFLAG_Count", count);
        return message;
        
    }
    

  • Paso 3: use un enrutador en el siguiente paso para verificar si Exchange Property ZFLAG_Count
    • Paso 3.1: si el conteo es mayor que cero, páselo a la ruta predeterminada donde se realiza el mapeo de definición externa de IDOC y se envía adelante (ruta predeterminada)
    • Paso 3.2: Si la respuesta es No, finalice ese IDOC en CPI (Condición: ${property.ZFLAG_Count} = ‘0’)Figura%209%20-%20Router%20Condición
      Figura 9 – Configuración del enrutador
  • Etapa 4 : Asignación de IDOC-XML según corresponda


Resultados de simulación para caso de prueba positivo: cuando IDOC en un lote contiene al menos un elemento de línea con ZFLAG=A. 4 IDOC activados en un lote, 2 no tienen elementos de línea con ZFLAG=A y 2 IDOC tienen valores mixtos

Figura%20-%20IDOC%20con%20no%20ZFLAG%3DA%20terminado%20en%20CPI

Figura 10: IDOC que tienen al menos un ZFLAG=A enviado a la ruta predeterminada.

Figura%20-%20IDOC%20con%20al menos%20una%20ZFLAG%3DA%20enviado%20a%20ruta%20predeterminada

Figura 11: IDOC que no tienen ZFLAG=A terminados en CPI

Resultados de simulación para caso de prueba negativo: cuando ninguno de los IDOC en un lote tiene elementos de línea con ZFLAG = A

Figure%20-%20No%20IDOCs%20in%20a%20batch%20contain%20line%20items%20with%20ZFLAG%3DA%20ending%20in%20CPI

Figura 12: Ningún IDOC en un lote contiene artículos de línea con ZFLAG=A terminados en CPI

Enfoque 3: Modificador de contenido + Enrutador + Combinación de mapeo principal

Figure%2010%20-%20Approach%203%20%3A%20Content%20Modifier%20+%20Router%20+%20Main%20Mapping%20Combination

Figura 13 – Enfoque 3: Modificador de contenido + Enrutador + Mapeo principal

  • Paso 1: dividir los IDOC
  • Paso 2 : Usar un modificador de contenido
    • capturar todos los valores reales de ZFLAG en una propiedad de intercambio (ZFLAG_ACTUAL_VALUES-string-join((//E1EDP01/ZCUSTOM_E1EDP01_SUBITEM/ZFLAG/text()),’,’)
    • capturar todos los valores aplicables de ZFLAG en una propiedad de intercambio (ZFLAG_APPLICABLE_VALUES). Aquí este valor está codificado en «A» según el requisito. (Esto también se puede externalizar)

NOTA: Aquí se usa otra propiedad de intercambio: ZFLAG_COUNT con el valor XPath: count(//E1EDP01[ZCUSTOM_E1EDP01_SUBITEM/ZFLAG=”A”])(¡Podemos aprovechar esto como una alternativa al script Groovy en el Enfoque 2 también!)

Content%20Modifier%20Exchange%20Properties%20%28ZFLAG_COUNT%20value%20can%20be%20levraged%20inplace%20of%20Approach%202%20Groovy%20script%20as%20well%21%29
Figura 14: propiedades de intercambio del modificador de contenido (¡el valor ZFLAG_COUNT también se puede aprovechar en lugar del script Groovy de Approach 2!)

  • Paso 3: use un enrutador en el siguiente paso y verifique si el valor de Propiedad de intercambio-ZFLAG_APPLICABLE_VALUES existe en la propiedad de intercambio-ZFLAG_ACTUAL_VALUES.
  • Paso 4: Mapeo según corresponda


Resultados de simulación para caso de prueba positivo: cuando IDOC en un lote contiene al menos un elemento de línea con ZFLAG=A. 4 IDOC activados en un lote, 2 no tienen elementos de línea con ZFLAG=A y 2 IDOC tienen valores mixtos

IDOC%20que tienen%20al menos%20uno%20ZFLAG%3DA

Figura 16: IDOC que tienen al menos un ZFLAG=A enviado a la ruta predeterminada

Positive%20test%20Case%20%3A%204%20IDOCs%20triggered%20in%20a%20batch%2C%202%20have%20no%20line%20items%20with%20ZFLAG%3DA%20and%202%20IDOCs%20have%20mixed% 20valores

Figura: los IDOC que no tienen ZFLAG=A terminaron en CPI

Resultados de simulación para caso de prueba negativo: cuando ninguno de los IDOC en un lote tiene elementos de línea con ZFLAG = A

Ningún%20IDOC%20en%20a%20lote%20contiene%20línea%20elementos%20con%20ZFLAG%3DA%20finalizado%20en%20CPI

Figura 17: Ningún IDOC en un lote contiene artículos de línea con ZFLAG=A terminados en CPI

Resumen

Se compartieron enfoques/ideas multidimensionales para un requisito de bifurcar datos basados ​​en XPath repetitivo como se explicó anteriormente.

Espero que este blog haya sido informativo con respecto a las ideas sobre cómo abordar un requisito de diferentes maneras y que sea relevante para los desarrolladores/consultores de CPI/PI/PO.

Los comentarios constructivos o comentarios/sugerencias, si los hay, son bienvenidos.

Referencias

Filtrado del segmento IDoc en SAP CPI | Comunidad SAP

[SAP Cloud Platform-Integration] Filtro de contenido en detalle | Blogs de SAP

Recuento de XPath | Documentación de Mendix

Uso de funciones XPath (oracle.com)

Modificador de contenido Tipo de datos Xpath | Comunidad SAP

Conozca el lenguaje de expresión simple de Camel en SAP Cloud Integration | Blogs de SAP

Explique en detalle el enrutador condicional en CPI | Comunidad SAP

Concat mismo campo de nodo en XPath de CPI | Comunidad SAP

Definir enrutador | Portal de ayuda de SAP




Novedades de SAP Activate – SAP S/4HANA Cloud 2302
Previo
SAP S/4HANA Cloud, edición pública: seguro por defecto
Siguiente

Madrid

Calle Eloy Gonzalo, 27
Madrid, Madrid.
Código Postal 28010

México

Paseo de la Reforma 26
Colonia Juárez,  Cuauhtémoc
Ciudad de México 06600

Costa Rica

Real Cariari
Autopista General Cañas, 
San José, SJ 40104

Perú

Av. Jorge Basadre 349
San Isidro
Lima, LIM 15073

Twitter Linkedin Instagram
Copyright 2022 | All Right Reserved.