Форматирование строк с помощью макроса и strFmt в Dynamics AX 2012
Опубликовано: 16 февраля 2025 г. в 00:48:54 UTC
Последнее обновление: 12 января 2026 г. в 08:44:32 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));
}
Дополнительное чтение
Если вам понравился этот пост, вам также могут понравиться эти предложения:
- Краткий обзор Dynamics AX 2012 SysOperation Framework
- Определение класса документа и запроса для службы AIF в Dynamics AX 2012
- Как перебрать элементы перечисления из кода X++ в Dynamics AX 2012
