Miklix

Formátování řetězce pomocí maker a strFmt v Dynamics AX 2012

Vydáno: 16. února 2025 v 0:47:52 UTC
Poslední aktualizace: 12. ledna 2026 v 8:44:21 UTC

Tento článek popisuje některé zvláštní chování v aplikaci Dynamics AX 2012 při použití makra jako formátovacího řetězce v příkazu strFmt a také příklady, jak tento problém 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 aplikaci Dynamics AX 2012 R3. Pro jiné verze mohou, ale nemusí být platné.

Nedávno jsem narazil na problém s funkcí strFmt, který mě trochu mátl. Nejvíc mě zaráželo, že jsem se s ním nějakou podivnou náhodou za mnoho let své praxe jako vývojář v 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 ignorovalo parametry % a vracelo pouze zbytek řetězce.

Poté, co jsem se na to podíval, jsem zjistil, že makra samotná lze použít k formátování řetězců, což jsem také nevěděl. No nic, vždycky je dobré se něco nového naučit, ale i tak mě velmi překvapilo, že jsem se na to náhodou nesetkal dřív.

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ězců makra. V tomto případě funkce strFmt vidí formátovací řetězec jako „--“ a proto vrátí pouze tuto hodnotu.

Něco takového:

#define.FormatMacro('%1-%2-%3');
info(#FormatMacro(salesId,itemId,lineNum));

Bude to fungovat, ale pravděpodobně ne tak, jak chcete. Místo výstupu hodnot tří proměnných se vypíší názvy proměnných, v tomto případě „salesId-itemId-lineNum“. (Všimněte si, že při předávání parametrů makru jsem za čárky nevložil mezery, jak obvykle dělám u volání metod. Je to proto, že makro takové mezery také použije, takže výstup by byl „salesId-itemId-lineNum“).

Abyste mohli makro skutečně použít jako formátovací řetězec s funkcí strFmt, musíte znaky procent escapovat zpětnými lomítky, například takto:

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

info(strFmt(#FormatMacro, salesId, itemId, lineNum));

To bude fungovat, jako byste formátovací řetězec zadali přímo.

Tato malá úloha 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));
}

Další čtení

Pokud se vám tento příspěvek líbil, mohly by se vám líbit i tyto návrhy:


Sdílet na BlueskySdílejte na FacebookuSdílet na LinkedInSdílet na TumblrSdílet na XSdílet na LinkedInPřipnout na Pinterest

Mikkel Christensen

O autorovi

Mikkel 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.