Artigo
· Ago. 7, 2023 2min de leitura

Como evitar truncamento em mensagens HL7 com campos muito grandes (32K+)

Transformações DTL e chamadas GetValueAt/SetValueAt em mensagens HL7 truncarão todos os campos com mais de 32 K. Para evitar isso, os métodos GetFieldStreamRaw e StoreFieldStreamRaw devem ser utilizados ao lidar com campos que possam ser maiores que 32K. OBX:5 é um exemplo frequente. Esses métodos têm algumas sutilezas e devem ser usados com cuidado.

Isso não pode ser feito simplesmente arrastando da esquerda para a direita em um DTL. Isso deve ser feito com uma ação de código. Além disso, a chamada StoreFieldStreamRaw deve ser a última edição feita no segmento porque o segmento se torna imutável depois disso.

StoreFieldStreamRaw usa 3 argumentos: a stream a ser colocada no campo, o caminho VDoc do campo no qual armazenar a stream e um argumento pRemainder. Se o argumento pRemainder não for especificado, todos os campos após o campo que está sendo armazenado serão apagados. Se pRemainder for especificado, todos os campos após aquele que está sendo armazenado serão substituídos pelo que está em pRemainder.

Exemplo:
OBX|1|2|3|4|5|6|7
depois de StoreFieldStreamRaw(stream, "OBX:5")
OBX|1|2|3|4|<stream>
(observe que os campos 6 e 7 sumiram).
depois de StoreFieldStreamRaw(stream, "OBX:5", "|six|seven"):
OBX|1|2|3|4|<stream>|six|seven

Likewise, GetFieldStreamRaw takes 3 arguments: the stream output argument, the VDoc path of the field, and the pRemainder output argument.  pRemainder will be filled with all fields after the one being extracted.

Da mesma forma, GetFieldStreamRaw usa 3 argumentos: o argumento com a stream de saída, o caminho VDoc do campo e o argumento de saída pRemainder. pRemainder será preenchido com todos os campos após o que está sendo extraído.

Example:
OBX|1|2|3|4|5|6|7
after GetFieldStreamRaw(stream, "OBX:5", .rem)
rem contains "|6|7"

So, to put it altogether, we want to extract the field from the source and store it in the target.  But we don't want to take the remainder from the source and store that in the target because it will revert any edits we already made to fields after the long field in the target.  Therefore, what we want to do is take the stream field from the source, but the remainder from the target, and store both of those in the target like this:

Portanto, para resumir, queremos extrair o campo da origem e armazená-lo no destino. Mas não queremos pegar o restante da origem e armazená-lo no destino, pois isso reverterá todas as edições que já fizemos nos campos após o campo longo no destino. Portanto, o que queremos fazer é pegar o campo stream da origem, mas o restante do destino, e armazenar ambos no destino assim:

    do source.GetFieldStreamRaw(.stream, "OBX:5")
    do target.GetFieldStreamRaw(.dummy, "OBX:5", .rem)
    do target.StoreFieldStreamRaw(stream, "OBX:5", rem)

Fazer dessa forma evitamos que as edições anteriores feitas nos campos após OBX:5 no destino sejam revertidas ou excluídas.

Discussão (0)1
Entre ou crie uma conta para continuar