Consultar informacion basada en XML en casos (con scope)

<< Clic para mostrar Tabla de Contenidos >>

Navegación:  Bizagi Studio > Asistente de Procesos > Reglas de Negocio > Ejemplos de reglas de negocio > XML Helper para interfaces >

Consultar informacion basada en XML en casos (con scope)

Introducción

XML Helper hace parte del API de reglas de negocio de Bizagi, provee acceso a la información de sus procesos cuando trabaja con información estructurada XML, como se describe en XML Helper.

Esta sección muestra un ejemplo de cómo usar uno de los métodos de XML Helper, el método getCaseAsString, que está orientado a consultar información de cualquier caso, dependiendo de lo que esté almacenado en su scope.

 

Ejemplo

En el siguiente proceso de ejemplo, asumimos que tenemos una entidad de proceso llamada SimplePurchaseRequest.

Este proceso tiene el siguiente modelo de datos:

 

xmlhelper_02datamodel

 

 

Para obtener información que ya se ha ingresado en un caso de este proceso en una estructura XML, se puede usar el método CEntityXmlHelper.getCaseAsString y obtener una cadena de texto con esa información.

Haga esto dentro de una expresión en una regla de negocio Bizagi:

 

xmlhelper_ex2_rule

 

El código completo de la expresión de la anterior imagen es el siguiente:

var app_schema = CHelper.getXSD("App", "SimplePurchaseRequest");

CHelper.trace("my_trace",app_schema);

var app_result = CEntityXmlHelper.getCaseAsString(Me.Case.Id, app_schema, null, null);

CHelper.trace("my_trace",app_result);

 

Considere que el método CEntityXmlHelper.getCaseAsString recibe cuatro entradas:

La primera el identificador del caso.

Tenga en cuenta que puede usar Me.Case.Id si necesita información del mismo caso desde donde está ejecutando la expresión. También, puede recoger información de otro caso al asegurarse que tiene su ID almacenado en un atributo del modelo de datos.

El segundo, en el ejemplo anterior se llama app_schema, que es una definición XSD en una cadena de texto, definiendo los campos que se quieren obtener de los registros que aplican.

Tenga en cuenta que debe asegurarse de que se esté usando el esquema de la entidad de proceso del proceso del cual se tiene una instancia caso.

 

xmlhelper_03schema

 

El uso del esquema XSD es descrito más adelante.

El tercero es una definición XSL (o XSLT) en una cadena de texto (p.e un archivo de transformación XML) que define cómo se quiere transformar la salida, de tal forma que tiene información diferente (filtrada) o que su estructura esta nombrada de forma diferente. Esta entrada es totalmente opcional y no se muestra en el ejemplo, pero se explicará con detalle al final de esta sección.

El cuarto es la definición del Contexto XPath en una cadena de texto, que define desde dónde Bizagi empezará a interpretar el esquema. Esta entrada es totalmente opcional y no se muestra en el ejemplo, pero se explicará con detalle al final de esta sección.

El método CEntityXmlHelper.getCaseAsString retornará una estructura XML como cadena de texto con la información del caso dado, como se muestra a continuación:

 

xmlhelper_ex2_formatted

 

La respuesta del ejemplo es la siguiente:

<?xml version="1.0" encoding="UTF-8"?>

<SimplePurchaseRequest key="852">

  <Requestdate>2017-10-05T16:43:27.557</Requestdate>

  <Requester entityName="WFUSER" key="6">

     <userName>tomh</userName>

     <fullName>Tom Hall</fullName>

     <domain>agilityCorp</domain>

     <idUser>6</idUser>

     <contactEmail>tomh@agilityCorp.com</contactEmail>

  </Requester>

  <Requestedproduct entityName="Requestedproduct" key="3">

     <Paytoaddress>1KfvVqDNo6fb8girHiNa1kEoH4ASD26s92</Paytoaddress>

     <Name>Translation services</Name>

     <Code>TS</Code>

     <PriceBitcoins>0.00113</PriceBitcoins>

     <Price>250.00</Price>

  </Requestedproduct>

  <Vendors>

     <Vendors key="1">

        <Applicable>1</Applicable>

        <Vendor entityName="Vendor" key="1">

           <Code>V001</Code>

           <Name>IBM</Name>

        </Vendor>

     </Vendors>

     <Vendors key="2">

        <Applicable>1</Applicable>

        <Vendor entityName="Vendor" key="3">

           <Code>V003</Code>

           <Name>Apple</Name>

        </Vendor>

     </Vendors>

     <Vendors key="3">

        <Applicable>0</Applicable>

        <Vendor entityName="Vendor" key="4">

           <Code>V004</Code>

           <Name>Microsoft</Name>

        </Vendor>

     </Vendors>

     <Vendors key="4">

        <Applicable>1</Applicable>

        <Vendor entityName="Vendor" key="2">

           <Code>V002</Code>

           <Name>Dell</Name>

        </Vendor>

     </Vendors>

  </Vendors>

</SimplePurchaseRequest>

 

note_pin

Obtener información que está almacenada en el scope de Bizagi, significa que se tiene información que no ha sido persistida al completar una actividad (esto no es visible desde otros lugares del proceso que no sean la actividad actual).

 

CHelper.trace() y CHelper.getXSD()

Note en el ejemplo anterior que aunque se están utilizando otros dos métodos (tanto CHelper.trace como CHelper.getXSD) estos usualmente se pueden usar junto con CEntityXmlHelper.getCaseAsString con otros propósitos:

CHelper.trace: Le permite imprimir trazas personalizadas de valores y respuestas durante la ejecución de las reglas.

La imagen a continuación, muestra cómo se verían estas trazas:

 

xmlhelper_ex2_trace

 

Para más información sobre trazas, refiérase a Validar mi regla de negocio.

 

CHelper.getXSD: Le permite obtener el esquema predefinido de una entidad, como fue configurada en Bizagi Studio.

La imagen a continuación, muestra el esquema para la entidad de proceso (SimplePurchaseRequest), nombrada explicita mente como SimplePurchaseRequest (como se referencia en la expresión de ejemplo):

 

xmlhelper_ex2_simpleprocess_schema

 

Para más información sobre predefinir esquemas, refiérase a Esquemas XML del modelo de datos.

 

note_pin

Usualmente, obtener información de un caso en una estructura XML como cadena de texto, le permitirá usarla para diferentes requerimientos tales como crear nuevos casos basados en otros cerrados o usar esa información para activar un evento de negocio, entre otros.

 

Usando archivos de transformación (XSL)

Considere el mismo ejemplo utilizado anteriormente, excepto que esta vez, vamos a hacer que el método CEntityXmlHelper.getCaseAsString aplique la transformación XML por nosotros, para que la salida tenga una estructura diferente (que tenga menos información y que esté formateado de manera diferente como con etiquetas HTML u otras). En este ejemplo, estaremos adicionando el parámetro XPath Context para permitirle saber a Bizagi que queremos usar SimplePurchaseRequest como punto inicial de nuestro esquema.

 

Usaremos el mismo ejemplo utilizando el tercer parámetro, el cual es el siguiente archivo de transformación:

 

xmlhelper_ex2_XSL_file

 

Note que este archivo de transformación de ejemplo sólo hará uso de la información en Requestdate y Code del Requestedproduct, aunque renombra las etiquetas de dicho detalle:

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

 <xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes" />

 <xsl:template match="/">

 <xsl:for-each select = "SimplePurchaseRequest">

         <Root>

                 <xsl:for-each select = "Requestdate">

                         <Requested><xsl:value-of select = "."/></Requested>

                 </xsl:for-each>

                 <xsl:for-each select = "Requestedproduct/Code">

                         <Product><xsl:value-of select = "."/></Product>

                 </xsl:for-each>

         </Root>

 </xsl:for-each>

 </xsl:template>

</xsl:stylesheet>

 

Eso quiere decir que la nueva regla se ve así:

 

xmlhelper_ex2_XSL_rule

 

Con el código de la exoresión mostrada en la imagen anteiors, tenemos:

var processentity_schema = CHelper.getXSD("SimplePurchaseRequest", "SimplePurchaseRequest");
CHelper.trace("my_trace",processentity_schema);
var processentity_xsl = '<?xml version="1.0" encoding="utf-8"?>'
+ '<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">'
+ '<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes" /><xsl:template match="/">'
+ '<xsl:for-each select = "SimplePurchaseRequest"><Root><xsl:for-each select = "Requestdate"><Requested>'
+ '<xsl:value-of select = "."/></Requested></xsl:for-each><xsl:for-each select = "Requestedproduct/Code">'
+ '<Product><xsl:value-of select = "."/></Product></xsl:for-each></Root></xsl:for-each></xsl:template></xsl:stylesheet>';
var processentity_result =
CEntityXmlHelper.getCaseAsString(Me.Case.Id, processentity_schema, processentity_xsl, "SimplePurchaseRequest");
CHelper.trace("my_trace", processentity_result);

 

Por lo tanto, este método con esta transformación, muestra este resultado:

 

xmlhelper_ex2_XSL_output