Форматирование строк с помощью макроса и strFmt в Dynamics AX 2012
Опубликовано: 16 февраля 2025 г. в 00:48:54 UTC
В этой статье описывается необычное поведение Dynamics AX 2012 при использовании макроса в качестве строки формата в strFmt, а также приводятся примеры того, как это обойти.
String Formatting with Macro and strFmt in Dynamics AX 2012
Информация в этом посте основана на Dynamics AX 2012 R3. Она может быть верна или нет для других версий.
Недавно я столкнулся с проблемой функции strFmt, которая меня немного озадачила. Самым озадачивающим было то, что по странному совпадению я никогда не сталкивался с ней за много лет работы разработчиком Axapta/Dynamics AX.
Проблема была в том, что я пытался использовать макрос в качестве строки формата для функции strFmt, и он просто не работал. Он полностью игнорировал параметры % и возвращал только остаток строки.
После изучения я обнаружил, что макросы сами по себе могут использоваться для форматирования строк, чего я тоже не знал. Ну что ж, всегда хорошо узнавать что-то новое, но я все равно был очень удивлен, что мне это раньше не попадалось.
В общем, что-то вроде этого
;
info(strFmt(#FormatMacro, salesId, itemId, lineNum));
не будет работать, поскольку знаки % в макросе фактически используются для собственных функций форматирования строк макроса. В этом случае функция strFmt увидит строку форматирования как "--" и, следовательно, вернет только ее.
Что-то вроде этого:
info(#FormatMacro(salesId,itemId,lineNum));
будет работать, но, вероятно, не так, как вам хотелось бы. Вместо вывода значений трех переменных он выведет имена переменных, в данном случае "salesId-itemId-lineNum". (Обратите внимание, что я не ставил пробелы после запятых при передаче параметров макросу, как я обычно делаю в вызовах методов. Это потому, что макрос на самом деле будет использовать и такие пробелы, поэтому вывод был бы "salesId-itemId-lineNum", если бы я это сделал).
Чтобы фактически использовать макрос в качестве строки форматирования с помощью strFmt, вам необходимо экранировать знаки процента с помощью обратных косых черт, например:
;
info(strFmt(#FormatMacro, salesId, itemId, lineNum));
Фактически это будет работать так же, как если бы вы указали строку формата напрямую.
Эта небольшая работа иллюстрирует примеры:
{
#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));
}