Miklix

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.


Tato stránka byla strojově přeložena z angličtiny, aby byla přístupná co největšímu počtu lidí. Strojový překlad bohužel ještě není dokonalá technologie, takže může dojít k chybám. Pokud si přejete, můžete si prohlédnout původní anglickou verzi zde:

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

#define.FormatMacro('%1-%2-%3')
;

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:

#define.FormatMacro('%1-%2-%3');
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:

#define.FormatMacro('\\%1-\\%2-\\%3')
;

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:

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));
}
Sdílet na BlueskySdílejte na FacebookuSdílet na LinkedInSdílet na TumblrSdílet na XSdílet na LinkedInPřipnout na Pinterest

Mikkel Bang Christensen

O autorovi

Mikkel Bang Christensen
Mikkel je tvůrcem a majitelem webu miklix.com. Má více než 20 let zkušeností jako profesionální programátor/vývojář softwaru a v současné době pracuje na plný úvazek pro velkou evropskou IT společnost. Pokud zrovna nepíše blog, věnuje svůj volný čas široké škále zájmů, koníčků a aktivit, což se může do jisté míry odrážet v rozmanitosti témat na tomto webu.