Miklix

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

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