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.
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
;
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:
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:
;
info(strFmt(#FormatMacro, salesId, itemId, lineNum));
To bude fungovat, jako byste formátovací řetězec zadali přímo.
Tato malá úloha 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));
}
Další čtení
Pokud se vám tento příspěvek líbil, mohly by se vám líbit i tyto návrhy:
- Rychlý přehled Dynamics AX 2012 SysOperation Framework
- Použití dotazu v třídě SysOperation Data Contract v Dynamics AX 2012
- Identifikace třídy dokumentu a dotazu pro službu AIF v Dynamics AX 2012
