Este blog cubre algunas ideas y enfoques sobre el enrutamiento de mensajes basados en una condición XPath particular en SAP CPI.
Se exploraron 3 enfoques de la siguiente manera:
Los 3 enfoques se tratan en detalle a continuación:
Paso 1: Asignación de mensajes que suprime los IDOC que no tienen ni un solo elemento de línea con ZFLAG=A
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 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
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
// 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;
}
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
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
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!)
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!)
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
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
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.
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
Calle Eloy Gonzalo, 27
Madrid, Madrid.
Código Postal 28010
Paseo de la Reforma 26
Colonia Juárez, Cuauhtémoc
Ciudad de México 06600
Real Cariari
Autopista General Cañas,
San José, SJ 40104
Av. Jorge Basadre 349
San Isidro
Lima, LIM 15073