Conversión de 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 los pares 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 mensaje 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 una serie de caracteres string1 de elementos de tipo xsd:string.
    4. Cree un tipo complejo llamado t_msg_nl y especifique las siguientes propiedades de tipo complejo:
      • Composition = Conjunto ordenado
      • Content Validation = Cerrada
      • Data Element Separation = Todos los elementos delimitados
      • Delimiter = <U+0085> (hex '0085' es la representación en UTF-16 de un carácter NL)
      • Repeat =
      • Min Occurs = 1
      • Max Occurs = 50 (se da por supuesto que el texto del mensaje no tiene más de 50 líneas)
    5. Añada la serie de caracteres string1 de elemento y establezca la siguiente propiedad:
      • Repeating Element Delimiter = <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:
      • Composition = Conjunto ordenado
      • Content Validation = Cerrada
      • Data Element Separation = Todos los elementos delimitados
      • Delimiter <CR><LF> (<CR> y <LF> son mnemotécnicos para los caracteres CR y LF)
      • Repeat =
      • Min Occurs = 1
      • Max Occurs = 50
    8. Añada la serie de caracteres string1 de elemento y establezca la siguiente propiedad:
      • Repeating Element Delimiter = <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 Message Domain = BLOB
      • Establezca Queue Name = <El nombre de la cola de mensajes de entrada
    2. Añada el nodo ResetContentDescriptor1, conectado al terminal out (de salida) de MQInput1:
      • Establezca Message Domain = MRM
      • Seleccione Reset Message Domain
      • Set Message Set = <El ID de conjunto de mensajes (tiene un máximo de 13 caracteres)
      • Seleccione Reset Message Set
      • Establezca Message Type = msg_nl
      • Seleccione Reset Message Type
      • Establezca Message Format = TDS1
      • Seleccione Reset Message Format
    3. Añada el nodo Compute1, conectado al terminal out (de salida) de ResetContentDescriptor1:
      • Entre un nombre en ESQL Module para este nodo o acepte el valor por omisión (<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 Message Domain = BLOB
      • Seleccione Reset Message Domain.
    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
Modelos de mensaje
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 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, 2005 Última actualización: 11/11/2005
ac11630_