Formatação de String com Macro e strFmt no Dynamics AX 2012
Publicado: 16 de fevereiro de 2025 às 00:48:51 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 contidas neste post 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 o facto de eu, por uma estranha coincidência, nunca o ter encontrado antes nos meus muitos anos como programador Axapta/Dynamics AX.
O problema era que eu tentava usar uma macro como string de formato para a função strFmt e simplesmente não funcionava. Ignorava completamente os parâmetros % e devolvia apenas o resto da cadeia de caracteres.
Depois de investigar, descobri que as próprias macros podem ser utilizadas para formatar cadeias de caracteres, o que também era algo que eu não sabia. Bem, é sempre bom aprender algo novo, mas mesmo assim fiquei muito surpreendido por não me ter deparado com isto 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 strings da própria macro. Neste 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 forma que pretende. Em vez de produzir os valores das três variáveis, produzirá os nomes das variáveis, neste 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 em chamadas de método. Isto deve-se ao facto de a macro também utilizar esses espaços, pelo que o resultado seria "salesId- itemId- lineNum" se o fizesse).
Para utilizar efetivamente uma macro como cadeia de formatação com strFmt, é necessário escapar aos sinais de percentagem com barras invertidas, desta forma:
;
info(strFmt(#FormatMacro, salesId, itemId, lineNum));
Isto funcionará como se tivesse fornecido a cadeia de formatação diretamente.
Este 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));
}