Miklix

Форматиране на низове с 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 и просто не работи. Той напълно игнорира % параметрите и връща само остатъка от низа.

След като го разгледах, открих, че самите макроси могат да се използват за форматиране на низове, което също беше нещо, което не знаех. О, добре, винаги е хубаво да научиш нещо ново, но все пак бях много изненадан, че случайно не съм попадал на това преди.

По принцип нещо подобно

#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Закачи в Пинтерест

Микел Банг Кристенсен

За автора

Микел Банг Кристенсен
Микел е създател и собственик на сайта miklix.com. Той има над 20 години опит като професионален компютърен програмист/разработчик на софтуер и в момента работи на пълен работен ден в голяма европейска ИТ корпорация. Когато не пише в блога, той прекарва свободното си време в широк спектър от интереси, хобита и дейности, които до известна степен могат да бъдат отразени в разнообразието от теми, обхванати в този уебсайт.