Форматування рядків за допомогою 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, але це просто не спрацювало. Він повністю проігнорував параметри % і повернув лише решту рядка.
Вивчивши це, я виявив, що макроси самі по собі можуть використовуватися для форматування рядків, про що я також не знав. Ну добре, завжди приємно вчитися чомусь новому, але я все одно була дуже здивована, що раніше не стикалася з таким.
В принципі, приблизно так
;
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));
}