Форматування рядків за допомогою 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, і він просто не працював. Він повністю ігнорував параметри % і повертав лише решту рядка.
Після ознайомлення з цим я виявив, що самі макроси можна використовувати для форматування рядків, чого я також не знав. Що ж, завжди добре дізнаватися щось нове, але я все одно був дуже здивований, що випадково не стикався з цим раніше.
В принципі, щось на кшталт цього
;
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));
}
Додаткова література
Якщо вам сподобався цей пост, вам також можуть сподобатися ці пропозиції:
- Помилка "Для об'єкта контракту даних не визначено клас метаданих" у Dynamics AX 2012
- Виклик служб документообігу AIF безпосередньо з X++ у Dynamics AX 2012
- Визначення класу документа та запиту для служби AIF у Dynamics AX 2012
