Miklix

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

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

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

#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-корпорации. Когда он не ведет блог, то тратит свое свободное время на огромное количество интересов, хобби и занятий, что в некоторой степени отражается в разнообразии тем, освещаемых на этом сайте.