Miklix

Форматування рядків за допомогою Macro і strFmt в Dynamics AX 2012

Опубліковано: 16 лютого 2025 р. о 00:49:00 UTC
Останнє оновлення: 12 січня 2026 р. о 08:44:34 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 років досвіду роботи професійним програмістом/розробником програмного забезпечення і наразі працює на повну ставку у великій європейській ІТ-корпорації. У вільний від ведення блогу час він присвячує різноманітним інтересам, хобі та захопленням, що певною мірою відображається на різноманітності тем, які висвітлюються на цьому сайті.