Formatação de strings com macro e strFmt no Dynamics AX 2012
Publicado: 16 de fevereiro de 2025 às 00:48:49 UTC
Este artigo descreve um comportamento peculiar no Dynamics AX 2012 ao usar uma macro como string de formato no strFmt, bem como exemplos de como contorná-lo.
String Formatting with Macro and strFmt in Dynamics AX 2012
As informações nesta postagem são baseadas no Dynamics AX 2012 R3. Elas podem ou não ser válidas para outras versões.
Recentemente, encontrei um problema com a função strFmt que me deixou um pouco perplexo. A parte mais desconcertante foi que, por alguma estranha coincidência, eu nunca havia encontrado isso antes em meus muitos anos como desenvolvedor Axapta/Dynamics AX.
O problema foi que tentei usar uma macro como string de formato para a função strFmt e ela simplesmente não funcionou. Ela ignorou completamente os parâmetros % e retornou apenas o restante da string.
Depois de pesquisar, descobri que as próprias macros podem ser usadas para formatar cadeias de caracteres, o que também era algo que eu não sabia. Bem, é sempre bom aprender algo novo, mas ainda assim fiquei muito surpreso por não ter me deparado com isso antes.
Basicamente, algo como isto
;
info(strFmt(#FormatMacro, salesId, itemId, lineNum));
não funcionará porque os sinais % na macro são, na verdade, usados para os recursos de formatação de cadeia de caracteres da própria macro. Nesse caso, a função strFmt verá a string de formatação como "--" e, portanto, retornará apenas isso.
Algo como isto:
info(#FormatMacro(salesId,itemId,lineNum));
funcionará, mas provavelmente não da maneira que você deseja. Em vez de produzir os valores das três variáveis, ele produzirá os nomes das variáveis, nesse caso "salesId-itemId-lineNum". (Observe que não coloquei espaços após as vírgulas ao passar parâmetros para a macro, como normalmente faço nas chamadas de método. Isso se deve ao fato de que a macro também usará esses espaços, de modo que o resultado seria "salesId- itemId- lineNum" se eu fizesse isso).
Para realmente usar uma macro como string de formatação com strFmt, você precisa escapar dos sinais de porcentagem com barras invertidas, assim:
;
info(strFmt(#FormatMacro, salesId, itemId, lineNum));
Na verdade, isso funcionará como se você tivesse fornecido a string de formatação diretamente.
Esse pequeno trabalho ilustra os exemplos:
{
#define.FormatMacro('%1-%2-%3')
#define.FormatMacroEscaped('\\%1-\\%2-\\%3')
SalesId salesId = '1';
ItemId itemId = '2';
LineNum lineNum = 3.00;
;
info(#FormatMacro(salesId,itemId,lineNum));
info(strFmt(#FormatMacro, salesId, itemId, lineNum));
info(strFmt(#FormatMacroEscaped, salesId, itemId, lineNum));
}