Miklix

Форматирование строк с помощью макроса и 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, и это просто не сработало. Функция полностью игнорировала параметры % и возвращала только остаток строки.

После изучения вопроса я обнаружил, что макросы сами по себе могут использоваться для форматирования строк, чего я тоже не знал. Ну что ж, всегда полезно узнать что-то новое, но я всё равно был очень удивлён, что не сталкивался с этим раньше.

В общем, что-то вроде этого.

#define.FormatMacro('%1-%2-%3')
;

info(strFmt(#FormatMacro, salesId, itemId, lineNum));

Это не сработает, потому что знаки % в макросе фактически используются для собственных функций форматирования строк макроса. В этом случае функция strFmt воспримет строку форматирования как "--" и, следовательно, вернет только ее.

Примерно так:

#define.FormatMacro('%1-%2-%3');
info(#FormatMacro(salesId,itemId,lineNum));

Это сработает, но, вероятно, не так, как вам нужно. Вместо вывода значений трех переменных, он выведет их имена, в данном случае "salesId-itemId-lineNum". (Обратите внимание, что я не ставил пробелы после запятых при передаче параметров макросу, как обычно делаю при вызове методов. Это потому, что макрос также будет использовать такие пробелы, поэтому вывод был бы "salesId-itemId-lineNum", если бы я их поставил).

Чтобы использовать макрос в качестве строки форматирования с помощью функции strFmt, необходимо экранировать знаки процента обратными косыми чертами, вот так:

#define.FormatMacro('\\%1-\\%2-\\%3')
;

info(strFmt(#FormatMacro, salesId, itemId, lineNum));

На самом деле это будет работать так же, как если бы вы указали строку формата напрямую.

Эта небольшая работа иллюстрирует примеры:

static void StrFmtMacroTest(Args _args)
{
    #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));
}

Дополнительное чтение

Если вам понравился этот пост, вам также могут понравиться эти предложения:


Поделиться на BlueskyПоделиться на FacebookПоделиться на LinkedInПоделиться на TumblrПоделиться на XПоделиться на LinkedInЗакрепить на Pinterest

Миккель Кристенсен

Об авторе

Миккель Кристенсен
Миккель - создатель и владелец сайта miklix.com. Он имеет более чем 20-летний опыт работы в качестве профессионального программиста/разработчика программного обеспечения и в настоящее время работает на полную ставку в крупной европейской IT-корпорации. Когда он не ведет блог, то тратит свое свободное время на огромное количество интересов, хобби и занятий, что в некоторой степени отражается в разнообразии тем, освещаемых на этом сайте.