Convertir EBCDIC NL en ASCII CR LF

Este tema describe una tarea de ejemplo que cambia los caracteres de nueva línea (NL) de un mensaje de texto por las parejas de caracteres de retorno de carro (CR) y salto de línea (LF).

Esta conversión puede resultar útil si se envían mensajes de una plataforma EBCDIC (que utilice, por ejemplo, CCSID 1047) a una plataforma ASCII (que utilice, por ejemplo, CCSID 437). Pueden producirse problemas porque el carácter NL de EBCDIC hex '15' se convierte en el carácter ASCII indefinido hex '7F'. No hay ningún punto de código correspondiente 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 un mensaje del dominio BLOB. Éste se pasa a un nodo ResetContentDescriptor para restablecer los datos para un mensaje del dominio MRM. El mensaje se denomina msg_nl (un conjunto de elementos periódicos de serie de caracteres delimitado por caracteres NL de EBCDIC). A continuación, se utiliza un nodo Compute para crear una salida basada en otro mensaje del dominio MRM llamado msg_crlf (un conjunto de elementos periódicos de serie de caracteres delimitado por pares CR LF). El dominio de mensajes vuelve a ser BLOB en otro nodo ResetContentDescriptor. Este flujo de mensajes puede verse a continuación.


Diagrama que muestra un flujo de mensajes que comprende los nodos: MQInput1 con un terminal Out conectado a ResetContentDescriptor1, con un terminal Out conectado a Compute1, con un terminal Out conectado a ResetContentDescriptor2, con un terminal Out conectado a MQOutput1. No hay ningún otro terminal conectado.

Las siguientes instrucciones muestran cómo crear los mensajes y configurar el flujo de mensajes.

  1. Creación de modelos de mensaje para los mensajes del dominio MRM:
    1. Cree un proyecto de conjunto de mensajes llamado myProj.
    2. Cree un conjunto de mensajes llamado myMessageSet con un formato físico TDS (el nombre por omisión es TDS1).
    3. Cree un elemento string1 de tipo xsd:string.
    4. Cree un tipo complejo llamado 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 delimitados
      • Delimitador = <U+0085> (hex '0085' es la representación UTF-16 de un carácter NL)
      • Repetición =
      • 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 el tipo complejo asociado a él en t_msg_nl
    7. Cree un tipo complejo llamado 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 delimitados
      • Delimitador <CR><LF> (<CR> y <LF> son los mnemónicos para los caracteres CR y LF)
      • Repetición =
      • 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 flujo de mensajes que aparece en la figura de arriba:
    1. Empiece con el nodo MQInput1:
      • Establezca Dominio de mensajes = BLOB
      • Establezca Nombre de cola = <El nombre de su cola de mensajes de entrada>
    2. Añada el nodo ResetContentDescriptor1, conectado al terminal out (de salida) de MQInput1:
      • Establezca Dominio de mensajes = MRM
      • Seleccione Restablecer dominio de mensaje
      • Establezca Conjunto de mensajes = <El ID del conjunto de mensajes> (tiene un máximo de 13 caracteres)
      • 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 out (de salida) de ResetContentDescriptor1:
      • Entre un nombre para el Módulo ESQL de este nodo o acepte el valor predeterminado (<nombre del flujo de mensajes>_Compute1).
      • Pulse el botón derecho del ratón sobre el nodo Compute1 y seleccione Abrir ESQL. Codifique el siguiente ESQL en el módulo:
        -- Declare variables locales de trabajo
        DECLARE I INTEGER 1;
        DECLARE J INTEGER CARDINALITY(InputRoot.*[]);
        
        -- Bucle para copiar todas las cabeceras de mensajes del mensaje de entrada al de salida
        WHILE I < J DO
         SET OutputRoot.*[I] = InputRoot.*[I];
         SET I=I+1;
        END WHILE; 
        
        -- Establezca un nuevo tipo de mensaje de salida que utilice el delimitador CRLF
        SET OutputRoot.Properties.MessageType = 't_msg_crlf';
        
        -- Bucle para copiar cada instancia del hijo de string1 dentro del texto del mensaje
        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;

        Tenga en cuenta la utilización de una variable, J, inicializada para el valor de la cardinalidad de las cabeceras existentes en el mensaje. Esto es más eficaz que calcular la cardinalidad en cada iteración del bucle, cosa que sucede si se codifica la siguiente sentencia WHILE:

        WHILE I < CARDINALITY(InputRoot.*[]) DO
    4. Añada el nodo ResetContentDescriptor2, conectado al terminal out (de salida) del nodo Compute1:
      • Establezca Dominio de mensajes = BLOB
      • Seleccione Restablecer dominio de mensaje.
    5. Finalmente, añada el nodo MQOutput1, conectado al terminal out (de salida del nodo ResetContentDescriptor2. Configure sus propiedades para dirigir el mensaje de salida a la o las colas necesarias.
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
Referencia relacionada
Soporte de idiomas nacionales
Nodo Compute
Nodo MQInput
Nodo MQOutput
Nodo ResetContentDescriptor
Referencia de ESQL
Sentencia DECLARE
Sentencia SET
Sentencia WHILE
Mnemónicos TDS
Avisos | Marcas registradas | Descargas | Biblioteca | Soporte | Su opinión
Copyright IBM Corporation 1999, 2006 Última actualización: 22/08/2006
ac11630_