Convertendo Página de Código e Codificação da Mensagem

Você pode utilizar ESQL em um nó Compute para converter dados para página de códigos e codificação de mensagens. Se seu fluxo de mensagens estiver processando as mensagens do , você poderá utilizar os recursos do (incluindo as opções get e put e a conversão de dados do sairá) para fornecer essas conversões. Se não estiver processando mensagens do ou se escolher não utilizar recursos do , poderá utilizar recursos do , codificando o ESQL apropriado em um nó Compute em seu fluxo de mensagens.

O conteúdo de MQMD, de MQRFH2 e do corpo da mensagem de uma mensagem no domínio MRM, que foi modelado com um formato físico CWF, pode estar sujeito à conversão de página de códigos e de codificação. O conteúdo do corpo de uma mensagem nos domínios XML, XMLNS e JMS e as mensagens no domínio MRM que foram modeladas com um formato físico XML ou TDS são tratados como cadeias. Apenas a conversão de página de códigos é aplicável; nenhuma conversão de codificação é necessária.

Para mensagens no domínio MRM modeladas com um formato físico CWF, é possível definir os campos MQMD CCSID e de Codificação da mensagem de saída, além de CCSID e Codificação de quaisquer cabeçalhos adicionais, para o valor de destino requerido.

Para mensagens no domínio MRM modeladas com um formato físico XML ou TDS, você pode definir o campo MQMD CCSID da mensagem de saída, além do CCSID de quaisquer cabeçalhos adicionais. Os dados XML e TDS são tratados como cadeias e, portanto, estão sujeitos apenas à conversão de CCSID.

Uma mensagem de exemplo do possui um cabeçalho MQMD, um cabeçalho MQRFH2 e um corpo de mensagem.Para converter esta mensagem em um CodedCharSetId e Codificação de mainframe, codifique o seguinte ESQL no nó Compute:

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

O exemplo a seguir ilustra o que deve ser feito para modificar uma mensagem CWF para que ela possa ser transmitida do para o IMS no z/OS.

  1. Você definiu a mensagem de entrada em XML e está utilizando um cabeçalho MQRFH2. Remova o cabeçalho antes de transmitir a mensagem para o IMS.
  2. A mensagem transmitida para o IMS deve ter o cabeçalho MQIIH e estar na página de código do z/OS. Essa mensagem é modelada no MRM e tem o nome de IMS1. Defina os campos PIC X dessa mensagem como cadeia de tipo lógico para que ocorram conversões entre EBCDIC e ASCII. Se forem binários de tipo lógico, não ocorrerá nenhuma conversão de dados; os dados binários são ignorados quando uma mensagem CWF é analisada pelo analisador MRM.
  3. A mensagem recebida do IMS também está definida no MRM e é chamada de IMS2. Defina os campos PIC X dessa mensagem como cadeia de tipo lógico para que ocorram conversões entre EBCDIC e ASCII. Se forem binários de tipo lógico, não ocorrerá nenhuma conversão de dados; os dados binários são ignorados quando uma mensagem CWF é analisada pelo analisador MRM.
  4. Converta a mensagem de resposta na página de códigos do Windows. O cabeçalho MQIIH é mantido nesta mensagem.
  5. Você criou um fluxo de mensagens que contém os seguintes nós: :
    1. O fluxo de saída, MQInput1 --> Compute1 --> MQOutput1.
    2. O fluxo de entrada, MQInput2 --> Compute2 --> MQOutput2.
  6. Codifique o ESQL no nó Compute1 (saída) da seguinte maneira, especificando o ID relevante do MessageSet. Esse código mostra o uso do nome de camadas físicas padrão do CWF. É necessário utilizar o nome que corresponde a suas definições de modelo. Se você especificar um valor incorreto, o intermediário falhará com a mensagem 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 a utilização de uma variável J, que é inicializada para o valor da cardinalidade dos cabeçalhos existentes na mensagem. Isso é mais eficiente do que calcular a cardinalidade em cada iteração do loop, que ocorre se você codificar a seguinte instrução WHILE:

    WHILE I < CARDINALITY(InputRoot.*[]) DO
  7. Crie o ESQL no nó Compute2 (entrada) da seguinte forma, especificando o id relevante do MessageSet. Esse código mostra o uso do nome de camadas físicas padrão do CWF. É necessário utilizar o nome que corresponde a sua definição de modelo. Se você especificar um valor incorreto, o intermediário falhará com a mensagem 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';

Não é necessário definir valores específicos para as propriedades do nó MQInput1, porque a mensagem e o conjunto de mensagens são identificados no cabeçalho MQRFH2 e nenhuma conversão é requerida.

Você deve definir valor para o domínio, conjunto, tipo e formato de mensagem no nó MQInput para o fluxo de mensagens de entrada (MQInput2). Não é necessário definir parâmetros de conversão.

Uma situação específica na qual você pode converter dados em uma página de códigos para outra é quando as mensagens contêm indicadores de novas linhas e estão sendo transmitidas entre sistemas EBCDIC e ASCII. A conversão requerida para esta situação é descrita em Convertendo NL EBCDIC em LF CR ASCII

Conceitos relacionados
Fluxos de Mensagem
ESQL
Modelagem de Mensagens

Tarefas relacionadas
Projetando um Fluxo de Mensagens
Definindo o Conteúdo do Fluxo de Mensagens
Gerenciando Arquivos ESQL

Referências relacionadas
Suporte ao Idioma Nacional
Nó Compute
Nó Database
Nó Filter
ESQL
Função CARDINALITY
Instrução DECLARE
Instrução SET
Instrução WHILE