Transformación de un mensaje complejo

Cuando codifique el ESQL para un nodo Compute, utilice la función SELECT para la transformación de mensajes complejos.

Este tema proporciona ejemplos de transformación de mensajes complejos. Revise los ejemplos y modifíquelos para utilizarlos como desee. Todos están basados en el mensaje Invoice como entrada.

En este ejemplo, Invoice contiene un número variable de Items. La transformación se muestra a continuación:

SET OutputRoot.XMLNS.Data.Statement[] =
    (SELECT I.Customer.Title                                   AS Customer.Title, 
            I.Customer.FirstName || ' ' || I.Customer.LastName AS Customer.Name,
            COALESCE(I.Customer.PhoneHome,'')                  AS Customer.Phone,
            (SELECT II.Title                          AS Desc,
                    CAST(II.UnitPrice AS FLOAT) * 1.6 AS Cost,
                    II.Quantity                       AS Qty 
             FROM I.Purchases.Item[] AS II
             WHERE II.UnitPrice > 0.0 ) AS Purchases.Article[],
            (SELECT SUM( CAST(II.UnitPrice AS FLOAT) *
                    CAST(II.Quantity  AS FLOAT) *
                    1.6                           )
             FROM I.Purchases.Item[] AS II        )        AS Amount,
            'Dollars'                                      AS Amount.(XML.Attribute)Currency
            
            FROM InputRoot.XMLNS.Invoice[] AS I
            WHERE I.Customer.LastName <> 'Brown' 
    );

El mensaje de salida generado es:

<Data>
 <Statement>
  <Customer>
   <Title>Mr</Title>
   <Name>Andrew Smith</Name>
   <Phone>01962818000</Phone>
  </Customer>
  <Purchases>
   <Article>
    <Desc Category="Computer" Form="Paperback" Edition="2">The XML Companion</Desc>
    <Cost>4.472E+1</Cost>
    <Qty>2</Qty>
   </Article>
   <Article>
    <Desc Category="Computer" Form="Paperback" Edition="2">
          A Complete Guide to DB2 Universal Database</Desc>
    <Cost>6.872E+1</Cost>
    <Qty>1</Qty>
   </Article>
   <Article>
    <Desc Category="Computer" Form="Hardcover" Edition="0">JAVA 2 Developers Handbook</Desc>
    <Cost>9.5984E+1</Cost>
    <Qty>1</Qty>
   </Article>
  </Purchases>
  <Amount Currency="Dollars">2.54144E+2</Amount>
 </Statement>
</Data>    

Esta transformación tiene cláusulas SELECT anidadas. La sentencia externa operan en la lista de Invoices. La sentencia interna opera en la lista de Items. La cláusula AS asociada con la cláusula SELECT interna espera una matriz:

            (SELECT II.Title                          AS Desc,
                    CAST(II.UnitPrice AS FLOAT) * 1.6 AS Cost,
                    II.Quantity                       AS Qty 
             FROM I.Purchases.Item[] AS II
             WHERE II.UnitPrice > 0.0 ) 
            -- Observe el uso de [] en la expresión siguiente
               AS Purchases.Article[],

Esta sentencia indica a la cláusula SELECT externa que espere un número variable de elementos (Items) en cada resultado. Cada cláusula SELECT tiene su propio nombre de correlación: I para la cláusula SELECT externa y II para la interna. Normalmente cada cláusula SELECT utiliza su propio nombre de correlación, pero la cláusula FROM de la cláusula SELECT interna hace referencia al nombre de correlación de la cláusula SELECT externa:

            (SELECT II.Title                          AS Desc,
                    CAST(II.UnitPrice AS FLOAT) * 1.6 AS Cost,
                    II.Quantity                       AS Qty 
            -- Observe el uso de I.Purchases.Item en la siguiente expresión
             FROM I.Purchases.Item[] AS II
             WHERE  II.UnitPrice> 0.0              ) AS Purchases.Article[],

Esta sentencia indica a la cláusula SELECT interna que trabaje con los elementos de la factura actual. Ambas cláusulas SELECT contienen cláusulas WHERE. La externa utiliza un criterio para descartar determinados clientes y la interna utiliza un criterio diferente para descartar determinados elementos. El ejemplo también muestra el uso de COALESCE para impedir que los campos de entrada que faltan hagan que se omita el campo de salida correspondiente. Finalmente, también utiliza la función SUM de columna para sumar el valor de todos los Items de cada Invoice. Las funciones de columna se describen en Referencia a columnas de una base de datos.

Cuando se crean los campos Desc, se copia todo el campo Title de entrada: los atributos XML y el valor del campo. Si no desea estos atributos en el mensaje de salida, utilice la función FIELDVALUE para descartarlos; por ejemplo, codifique el siguiente ESQL:

SET OutputRoot.XMLNS.Data.Statement[] =
    (SELECT I.Customer.Title                                   AS Customer.Title, 
            I.Customer.FirstName || ' ' || I.Customer.LastName AS Customer.Name,
            COALESCE(I.Customer.PhoneHome,'')                  AS Customer.Phone,
            (SELECT FIELDVALUE(II.Title)                       AS Desc,
                    CAST(II.UnitPrice AS FLOAT) * 1.6 AS Cost,
                    II.Quantity                       AS Qty 
             FROM I.Purchases.Item[] AS II
             WHERE II.UnitPrice > 0.0 ) AS Purchases.Article[],
            (SELECT SUM( CAST(II.UnitPrice AS FLOAT) *
                    CAST(II.Quantity  AS FLOAT) *
                    1.6                           )
             FROM I.Purchases.Item[] AS II        )        AS Amount,
            'Dollars'                                      AS Amount.(XML.Attribute)Currency
                    
    FROM InputRoot.XMLNS.Invoice[] AS I
    WHERE I.Customer.LastName <> 'Brown' 
    );

Ese código genera el siguiente mensaje de salida:

<Data>
 <Statement>
  <Customer>
   <Title>Mr</Title>
   <Name>Andrew Smith</Name>
   <Phone>01962818000</Phone>
  </Customer>
  <Purchases>
   <Article>
    <Desc>The XML Companion</Desc>
    <Cost>4.472E+1</Cost>
    <Qty>2</Qty>
   </Article>
   <Article>
    <Desc>A Complete Guide to DB2 Universal Database</Desc>
    <Cost>6.872E+1</Cost>
    <Qty>1</Qty>
   </Article>
   <Article>
    <Desc>JAVA 2 Developers Handbook</Desc>
    <Cost>9.5984E+1</Cost>
    <Qty>1</Qty>
   </Article>
  </Purchases>
  <Amount Currency="Dollars">2.54144E+2</Amount>
 </Statement>
</Data>
Conceptos relacionados
Visión general de flujos de mensajes
Visión general de ESQL
Modelado de mensajes
Tareas relacionadas
Diseñar un flujo de mensajes
Definir el contenido del flujo de mensajes
Gestión de archivos ESQL
Manejar mensajes XML grandes
Referencia relacionada
Nodo Compute
Nodo Database
Nodo Filter
Referencia de ESQL
Función CAST
Función COALESCE
Función SELECT
Sentencia SET
Mensaje de ejemplo
Avisos | Marcas registradas | Descargas | Biblioteca | Soporte | Su opinión

Copyright IBM Corporation 1999, 2009Copyright IBM Corporation 1999, 2009.
Última actualización : 2009-02-16 13:55:37

ak05750_