Форматиране на низове с Macro и strFmt в Dynamics AX 2012
Публикувано: 16 февруари 2025 г. в 0:47:52 ч. 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));
}