Existem alguns cenários nos quais a migração de arquivos mfmap não é suportada. Este tópico explica por que a migração não é automática nestas situações e fornece instruções sobre como concluir uma migração bem-sucedida.
O modelo de programação para mapas de mensagens é muito diferente entre a Versão 5.0 (em que o formato de arquivo é mfmap) e a Versão 6.0 (em que o formato é msgmap). Os mapas de mensagens da Versão 5.0 possuem um modelo de programação orientado por procedimentos, que é, basicamente, um ESQL alternativo, no qual você descreve todas as etapas requeridas para desempenhar uma transformação. A Versão 6.0 utiliza um modelo de programação declarativo, no qual você descreve o resultado da transformação e as ferramentas determinam como obter esse resultado.
A maioria das falhas de migração resultam de mapas de mensagens que contêm uma grande quantidade de informações sobre as etapas que desempenham a transformação e não possuem informações suficientes sobre o resultado desejado. Para estes mapas de mensagens, a migração é ativada alterando o arquivo mfmap para que as seções específicas "como" sejam separadas em uma função ou procedimento ESQL que pode ser chamado pelo mapa de mensagem. O arquivo mfmap chama o ESQL em vez de contê-lo como uma expressão. O comando mqsimigratemfmaps então migra o arquivo mfmap, mas chama o ESQL em vez de registrar um erro de migração.
Uma limitação é que o ESQL (o tempo de execução para os arquivos mfmap e msgmap) não pode definir funções que retornam valores de elemento complexo (ou REFERENCE). O procedimento a seguir explica como resolver esta limitação de destino do elemento complexo; em muitos casos, isto significa que o mapa deve ser regravado como ESQL. Para obter exemplos e informações adicionais sobre como chamar o ESQL a partir de mapas, consulte a amostra de mapeamento de intermediários em
.src_msg.e[1] + src_msg.e[2]calcule o resultado de uma função ESQL como:
CREATE FUNCTION addOneAndTwo(IN src_msg) BEGIN RETURN src_msg.e[1] + src_msg.e[2]; END;No arquivo msgmap, chame a função ESQL addOneAndTwo utilizando o elemento pai src_msg como um parâmetro.
src_msg.*ou
src_msg.*[]pode ser processada utilizando uma função que utiliza o pai do campo de repetição:
CREATE FUNCTION processAny(IN src_msg) BEGIN DECLARE nodeRef REFERENCE TO src_msg.e.*; DECLARE result <dataType> <initialValue>; WHILE LASTMOVE nodeRef DO -- colocar expressão aqui SET result = result; END WHILE; RETURN RESULT; END;No arquivo msgmap, chame a função ESQL utilizando o elemento pai src_msg como um parâmetro.
src_msg.{'a' || 'b'}podem ser processadas por funções ESQL que processam o pai do campo de repetição:
CREATE FUNCTION processDynamicName(IN src_msg) BEGIN RETURN src_msg.{'a' || 'b'}; END;No arquivo msgmap, chame a função ESQL utilizando o elemento pai src_msg como um parâmetro.
SELECT MAX("#T".FIRSTNAME) FROM Database.CUSTOMER AS "#T" WHERE "#T".CUSTOMERID = custIdpodem ser processadas por funções ESQL que processam o pai do campo de repetição:
CREATE FUNCTION processMAX(IN custId) BEGIN RETURN SELECT MAX("#T".FIRSTNAME) FROM Database.CUSTOMER AS "#T" WHERE "#T".CUSTOMERID = custId END;No arquivo msgmap, chame a função ESQL utilizando o elemento custId como um parâmetro.
e || "#I"devem ser totalmente regravados em ESQL. Por definição, deve haver um elemento pai de repetição complexo e isto não é suportado por funções ESQL.
src_msg.e[src_msg.a]devem ser regravadas utilizando linhas if, funções msgmap:occurrence() e funções ESQL:
for src_msg.e if condition msgmap:occurrence(src_msg/e) = src_msg/a
src_msg.e["#I" +5] src_msg.e[< 3]todo o arquivo mfmap deve ser regravado em ESQL, porque os arquivos msgmap ainda não suportam acesso indexado a campos de repetição.
src_msg.e IN (1, 2, 3)devem ser regravados em ESQL, porque os arquivos msgmap não suportam expressões ESQL ROW.