Conversión de EBCDIC NL en ASCII CR LF

En este se describe una tarea de ejemplo que cambia los caracteres de nueva línea (NL) en un mensaje de texto por los pares de caracteres de retorno de carro (CR) y salto de línea (LF).

Esta conversión puede ser útil si los mensajes de una plataforma EBCDIC (por ejemplo, utilizando CCSID 1047) se envían a una plataforma ASCII (por ejemplo, utilizando CCSID 437). Los problemas pueden surgir porque el carácter hexadecimal '15' EBCDIC se convierte al carácter hexadecimal '7F? ASCII no definido. No existe ningún correspondiente punto de código para el carácter NL en la página de códigos ASCII.

En este ejemplo, se crea un flujo de mensajes que interpreta el mensaje de entrada como mensaje en el dominio BLOB. Éste se pasa a un nodo ResetContentDescriptor para restablecer los datos para un mensaje en el dominio MRM. El mensaje se denomina msg_nl (un conjunto de elementos de repetición de serie de caracteres delimitados por caracteres EBCDIC NL). Se ha utilizado un nodo Compute para crear una salida basándose en otro mensaje del dominio MRM denominado msg_crlf (un conjunto de elementos de serie de caracteres de repetición delimitados por pares CR LF). El dominio de mensajes se vuelve a cambiar por BLOB en otro nodo ResetContentDescriptor. Este flujo de mensajes se muestra a continuación.


Diagrama que muestra un flujo de mensajes lineal formado por dos nodos: MQInput1 con el terminal de salida conectado a ResetContentDescriptor1, con el terminal de salida conectado a Compute1, con el terminal de salida conectado a ResetContentDescriptor2, con el terminal de salida conectado a MQOutput1. No hay otros terminales conectados.

En las siguientes instrucciones se muestra cómo crear los mensajes y configurar el flujo de mensajes.

  1. Crear los modelos de mensajes para los mensajes en el dominio MRM:
    1. Cree un proyecto de conjunto de mensajes denominado myProj.
    2. Cree un conjunto de mensajes denominado myMessageSet con un formato físico de TDS (el nombre por omisión es TDS1).
    3. Cree un elemento string1 de tipo xsd:string.
    4. Cree un tipo complejo denominado t_msg_nl y especifique las siguientes propiedades de tipo complejo:
      • Composición = Conjunto ordenado
      • Validación de contenido = Cerrado
      • Separación de elementos de datos = Todos los elementos codificados
      • Delimitador = <U+0085> (hex '0085' es la representación UTF-16 de un carácter NL)
      • Repetir =
      • Mín apariciones = 1
      • Máx apariciones = 50 (se da por supuesto que el texto del mensaje no tiene más de 50 líneas)
    5. Añada el elemento string1 y establezca la siguiente propiedad:
      • Delimitador de elemento de repetición = <U+0085>
    6. Cree un mensaje msg_nl y establezca su tipo complejo asociado en t_msg_nl
    7. Cree un tipo complejo denominado t_msg_crlf y especifique las siguientes propiedades de tipo complejo:
      • Composición = Conjunto ordenado
      • Validación de contenido = Cerrado
      • Separación de elementos de datos = Todos los elementos codificados
      • Delimitador <CR><LF> (<CR> y <LF> son los mnemotécnicos para los caracteres CR y LF)
      • Repetir =
      • Mín apariciones = 1
      • Máx apariciones = 50
    8. Añada el elemento string1 y establezca la siguiente propiedad:
      • Delimitador de elemento de repetición = <CR><LF>
    9. Cree un mensaje msg_crlf y establezca el tipo complejo en t_msg_crlf.
  2. Configure el flujos de mensajes que se muestra en la figura anterior:
    1. Empiece con el nodo MQInput1:
      • Establezca el Dominio de mensajes = BLOB
      • Establezca el Nombre de cola = <El nombre de cola de mensajes de entrada>
    2. Añada el nodo ResetContentDescriptor1, conectado al terminal de salida de MQInput1:
      • Establezca el Dominio de mensajes = MRM
      • Seleccione Restablecer dominio de mensaje
      • Establezca Conjunto de mensajes = <ID de conjunto de mensajes> (13 caracteres como máximo)
      • Seleccione Restablecer conjunto de mensajes
      • Establezca Tipo de mensaje = msg_nl
      • Seleccione Restablecer tipo de mensaje
      • Establezca Formato del mensaje = TDS1
      • Seleccione Restablecer formato de mensaje
    3. Añada el nodo Compute1, conectado al terminal de salida de ResetContentDescriptor1:
      • Entre el nombre del Módulo ESQL para este nodo o acepte el valor por omisión (<nombre de flujo de mensajes>_Compute1).
      • Pulse el botón derecho del ratón en el nodo Compute1 y seleccione Abrir ESQL. Escriba el siguiente código ESQL en el módulo:
        -- Declare local working variables
        DECLARE I INTEGER 1;
        DECLARE J INTEGER CARDINALITY(InputRoot.*[]);
        
        -- Loop to copy all message headers from input to output message
        WHILE I < J DO
         	SET OutputRoot.*[I] = InputRoot.*[I];
         	SET I=I+1;
        END WHILE; 
        
        -- Set new output message type which uses CRLF delimiter
        SET OutputRoot.Properties.MessageType = 't_msg_crlf';
        
        -- Loop to copy each instance of string1 child within message body
        SET I = 1;
        SET J = CARDINALITY("InputBody"."string1"[]);
        WHILE I <= J DO
          SET "OutputRoot"."MRM"."string1"[I] = "InputBody"."string1"[I];
          		SET I=I+1;
        END WHILE;

        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
    4. Añada el nodo ResetContentDescriptor2, conectado al terminal de salida del nodo Compute1:
      • Establezca el Dominio de mensajes = BLOB
      • Seleccione Restablecer dominio de mensaje.
    5. Por último, añada el nodo MQOutput1, conectado al terminal de salida del nodo ResetContentDescriptor2. Configure sus propiedades para que dirija el mensaje de salida a la cola o colas necesarias.

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 MQInput
Nodo MQOutput
Nodo ResetContentDescriptor
ESQL
Sentencia DECLARE
Sentencia SET
Sentencia WHILE
Mnemotécnico de TDS