Formátování řetězce pomocí maker a strFmt v Dynamics AX 2012
Vydáno: 16. února 2025 v 0:47:52 UTC
Tento článek popisuje některé zvláštní chování v Dynamics AX 2012 při použití makra jako formátovacího řetězce v strFmt a také příklady, jak to obejít.
String Formatting with Macro and strFmt in Dynamics AX 2012
Informace v tomto příspěvku jsou založeny na Dynamics AX 2012 R3. Může a nemusí platit pro jiné verze.
Nedávno jsem narazil na problém s funkcí strFmt, který mě trochu zmátl. Nejvíce matoucí na tom bylo, že jsem se s tím nějakou podivnou shodou okolností za mnoho let, co jsem vývojář Axapta/Dynamics AX, nikdy předtím nesetkal.
Problém byl v tom, že jsem se pokusil použít makro jako formátovací řetězec pro funkci strFmt a prostě to nefungovalo. Zcela ignoroval parametry % a vrátil pouze zbytek řetězce.
Po prozkoumání jsem zjistil, že k formátování řetězců lze použít samotná makra, což jsem také nevěděl. Ach jo, vždycky je fajn se naučit něco nového, ale i tak mě hodně překvapilo, že jsem se s tímhle ještě nesetkal.
V podstatě něco takového
;
info(strFmt(#FormatMacro, salesId, itemId, lineNum));
nebude fungovat, protože znaky % v makru se ve skutečnosti používají pro vlastní funkce formátování řetězce makra. V tomto případě funkce strFmt uvidí formátovací řetězec jako "--" a proto vrátí pouze tento.
Něco jako toto:
info(#FormatMacro(salesId,itemId,lineNum));
bude fungovat, ale pravděpodobně ne tak, jak byste chtěli. Namísto výstupu hodnot tří proměnných vypíše názvy proměnných, v tomto případě "salesId-itemId-lineNum". (Všimněte si, že jsem při předávání parametrů do makra nevkládal mezery za čárky, jak to obvykle dělám při volání metod. Je to proto, že makro ve skutečnosti takové mezery také použije, takže výstup by byl "salesId- itemId- lineNum", kdybych to udělal).
Chcete-li skutečně použít makro jako formátovací řetězec pomocí strFmt, musíte znak procenta ukončit zpětnými lomítky, jako je tento:
;
info(strFmt(#FormatMacro, salesId, itemId, lineNum));
To bude ve skutečnosti fungovat, jako byste zadali formátovací řetězec přímo.
Tato malá práce ilustruje příklady:
{
#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));
}