Convertir página de códigos y codificación de mensajes

Puede utilizar ESQL dentro de un nodo Compute para convertir datos para la página de códigos y codificación de mensajes. Si el flujo de mensajes está procesando mensajes de WebSphere MQ, puede utilizar los recursos de WebSphere MQ (incluidas las opciones de obtener y transferir y las rutinas de salida de conversión de datos de WebSphere MQ) para proporcionar estas conversiones. Si no está procesando mensajes de WebSphere MQ o decide no utilizar los recursos de WebSphere MQ, puede utilizar los recursos de WebSphere Business Integration Message Broker codificando el ESQL adecuado en un nodo Compute en el flujo de mensajes.

El contenido de MQMD, el MQRFH2, y el cuerpo de un mensaje en el dominio MRM se ha modelado con un formato físico CWF pueden estar sujetos a conversiones de página de códigos y de codificación. El contenido del cuerpo de un mensaje en los dominios XML, XMLNS y JMS, y los mensajes del dominio MRM que se han modelado con un formato físico XML o TDS, se tratan como series. Sólo se aplica la conversión de página de códigos; no se requiere la conversión de codificación.

Para los mensajes del dominio MRM que se han modelado con un formato físico CWF, puede establecer los campos de MQMD CCSID y codificación del mensaje de salida, más el CCSID y la codificación de cualquiera de las cabeceras adicionales, en el valor de destino necesario.

Para los mensajes del dominio MRM que se han modelado con un formato físico XML o TDS, puede establecer el campo MQMD CCSID del mensaje de salida, más el CCSID de cualquiera de las cabeceras adicionales. Los datos XML y TDS se manejan como series y, por lo tanto, sólo están sujetas a la conversión CCSID.

Por ejemplo, un mensaje de WebSphere MQ tiene una cabecera MQMD una cabecera MQRFH2 y un cuerpo de mensaje. Para convertir este mensaje en una codificación y CCSID de sistema principal, escriba el siguiente código ESQL en el nodo Compute:

SET OutputRoot.MQMD.CodedCharSetId = 500; 
SET OutputRoot.MQMD.Encoding = 785; 
SET OutputRoot.MQRFH2.CodedCharSetId = 500; 
SET OutputRoot.MQRFH2.Encoding = 785;

En el siguiente ejemplo se muestra qué se debe hacer para modificar un mensaje CWF para que pueda pasarse de WebSphere Business Integration Message Broker a IMS en z/OS.

  1. Ha definido el mensaje de entrada en XML y está utilizando una cabecera MQRFH2. Elimine la cabecera antes de pasar el mensaje a IMS.
  2. El mensaje pasado a IMS debe tener la cabecera MQIIH y debe estar en la página de códigos de z/OS. Este mensaje se modela en el MRM y se denomina IMS1. Defina los campos PIC X en este mensaje como serie de caracteres de tipo lógico para que tengan lugar las conversiones entre EBCDIC y ASCII. Si son de tipo lógico binario, no se produce ninguna conversión; los datos binarios se ignoran cuando el analizador de MRM analiza un mensaje CWF.
  3. El mensaje recibido de IMS también se define en el MRM y se denomina IMS2. Defina los campos PIC X en este mensaje como serie de caracteres de tipo lógico para que tengan lugar las conversiones entre EBCDIC y ASCII. Si son de tipo lógico binario, no se produce ninguna conversión; los datos binarios se ignoran cuando el analizador de MRM analiza un mensaje CWF.
  4. Convierta el mensaje de respuesta a la página de códigos Windows. En este mensaje se retiene la cabecera MQIIH.
  5. Ha creado un flujo de mensajes que contiene los siguientes nodos: :
    1. El flujo de salida, MQInput1 --> Compute1 --> MQOutput1.
    2. El flujo de entrada, MQInput2 --> Compute2 --> MQOutput2.
  6. Escriba código ESQL en el nodo Compute1 (de salida) de la forma indicada a continuación, especificando el ID del conjunto de mensajes pertinente. Este código muestra el uso del nombre de capa física CWF por omisión. Debe utilizar el nombre que coincide con las definiciones de modelo. Si especifica un tipo incorrecto, el intermediario no se ejecuta correctamente y emite el mensaje BIP5431.
    -- Loop to copy message headers
    DECLARE I INTEGER 1;
    DECLARE J INTEGER CARDINALITY(InputRoot.*[]);
    
    WHILE I < J - 1 DO
      	SET OutputRoot.*[I] = InputRoot.*[I];
      		SET I=I+1;
    END WHILE;
    
    SET OutputRoot.MQMD.CodedCharSetId = 500;
    SET OutputRoot.MQMD.Encoding = 785;
    SET OutputRoot.MQMD.Format = 'MQIMS   ';
    SET OutputRoot.MQIIH.StrucId = 'IIH ';
    SET OutputRoot.MQIIH.Version = 1;
    SET OutputRoot.MQIIH.StrucLength = 84;
    SET OutputRoot.MQIIH.Encoding = 785;
    SET OutputRoot.MQIIH.CodedCharSetId = 500;
    SET OutputRoot.MQIIH.Format = 'MQIMSVS ';
    SET OutputRoot.MQIIH.Flags = 0;
    SET OutputRoot.MQIIH.LTermOverride = '        ';
    SET OutputRoot.MQIIH.MFSMapName = '        ';
    SET OutputRoot.MQIIH.ReplyToFormat = 'MQIMSVS ';
    SET OutputRoot.MQIIH.Authenticator = '        ';
    SET OutputRoot.MQIIH.TranInstanceId = X'00000000000000000000000000000000';
    SET OutputRoot.MQIIH.TranState = ' ';
    SET OutputRoot.MQIIH.CommitMode = '0';
    SET OutputRoot.MQIIH.SecurityScope = 'C';
    SET OutputRoot.MQIIH.Reserved = ' ';
    SET OutputRoot.MRM.e_elen08 = 30;
    SET OutputRoot.MRM.e_elen09 = 0;
    SET OutputRoot.MRM.e_string08 = InputBody.e_string01;
    SET OutputRoot.MRM.e_binary02 = X'31323334353637383940';
    SET OutputRoot.Properties.MessageDomain = 'MRM';
    SET OutputRoot.Properties.MessageSet = 'DHCJOEG072001';
    SET OutputRoot.Properties.MessageType = 'IMS1';
    SET OutputRoot.Properties.MessageFormat = 'CWF1';

    Observe la utilización de la variable, J, que se ha inicializado con el valor de cardinalidad de las cabeceras existentes en el mensaje. Es más eficaz que calcular la cardinalidad de cada iteración del bucle, que sucede si codifica la siguiente sentencia WHILE:

    WHILE I < CARDINALITY(InputRoot.*[]) DO
  7. Cree ESQL en el nodo Compute2 (de entrada) de la forma indicada a continuación, especificando el ID del conjunto de mensajes pertinente. Este código muestra el uso del nombre de capa física CWF por omisión. Debe utilizar el nombre que coincide con la definición de modelo. Si especifica un tipo incorrecto, el intermediario no se ejecuta correctamente y emite el mensaje BIP5431.
    -- Loop to copy message headers
    DECLARE I INTEGER 1;
    DECLARE J INTEGER CARDINALITY(InputRoot.*[]);
    
    WHILE I < J DO
      	SET OutputRoot.*[I] = InputRoot.*[I];
      		SET I=I+1;
    END WHILE;
    
    SET OutputRoot.MQMD.CodedCharSetId = 437;
    SET OutputRoot.MQMD.Encoding = 546;
    SET OutputRoot.MQMD.Format = 'MQIMS   ';
    SET OutputRoot.MQIIH.CodedCharSetId = 437;
    SET OutputRoot.MQIIH.Encoding = 546;
    SET OutputRoot.MQIIH.Format = '        ';
    SET OutputRoot.MRM = InputBody;
    SET OutputRoot.Properties.MessageDomain = 'MRM';
    SET OutputRoot.Properties.MessageSet = 'DHCJOEG072001';
    SET OutputRoot.Properties.MessageType = 'IMS2';
    SET OutputRoot.Properties.MessageFormat = 'CWF1';

No tiene que establecer ningún valor específico para las propiedades del nodo MQInput1 porque el mensaje y el conjunto de mensajes se identifican en la cabecera MQRFH2 y no se requiere efectuar ninguna conversión.

Debe establecer los valores para el dominio, el conjunto, el tipo y el formato de los mensajes en el nodo MQInput para el flujo de mensajes de entrada (MQInput2). No es necesario establecer parámetros de conversión.

Una situación específica en la que podría ser necesario convertir datos de una página de códigos a otra es cuando los mensajes contienen nuevos indicadores de línea y se pasan entre los sistemas EBCDIC y ASCII. La conversión requerida para esta situación se describe en Conversión de EBCDIC NL en ASCII CR LF.

Conceptos relacionados
Flujos de mensajes
ESQL
Diseño de mensajes

Tareas relacionadas
Diseño de un flujo de mensajes
Definición del contenido del flujo de mensajes
Gestión de archivos ESQL

Referencia relacionada
Soporte de idioma nacional
Nodo Compute
Nodo Database
Nodo Filter
ESQL
Función CARDINALITY
Sentencia DECLARE
Sentencia SET
Sentencia WHILE