Formatowanie ciągu za pomocą makra i strFmt w Dynamics AX 2012
Opublikowano: 16 lutego 2025 00:48:48 UTC
W tym artykule opisano pewne nietypowe zachowanie w systemie Dynamics AX 2012 w przypadku użycia makra jako ciągu formatującego w strFmt, a także przykłady obejścia tego problemu.
String Formatting with Macro and strFmt in Dynamics AX 2012
Informacje zawarte w tym poście dotyczą systemu Dynamics AX 2012 R3. Mogą być lub nie być ważne dla innych wersji.
Niedawno natrafiłem na problem z funkcją strFmt, który trochę mnie zdezorientował. Najbardziej zdumiewające było to, że jakimś dziwnym zbiegiem okoliczności nigdy wcześniej się z nim nie spotkałem w ciągu wielu lat pracy jako programista Axapta/Dynamics AX.
Problem polegał na tym, że próbowałem użyć makra jako ciągu formatującego dla funkcji strFmt i po prostu nie działało. Całkowicie ignorowało parametry % i zwracało tylko pozostałą część ciągu.
Po przyjrzeniu się temu odkryłem, że same makra mogą być używane do formatowania ciągów, czego również nie wiedziałem. Cóż, zawsze dobrze jest nauczyć się czegoś nowego, ale i tak byłem bardzo zaskoczony, że wcześniej na to nie trafiłem.
Zasadniczo coś takiego
;
info(strFmt(#FormatMacro, salesId, itemId, lineNum));
nie zadziała, ponieważ znaki % w makrze są w rzeczywistości używane do własnych funkcji formatowania ciągu makra. W tym przypadku funkcja strFmt zobaczy ciąg formatujący jako „--” i zwróci tylko ten.
Coś takiego:
info(#FormatMacro(salesId,itemId,lineNum));
zadziała, ale prawdopodobnie nie tak, jak chcesz. Zamiast wyprowadzać wartości trzech zmiennych, wyprowadzi nazwy zmiennych, w tym przypadku „salesId-itemId-lineNum”. (Zauważ, że nie umieściłem spacji po przecinkach podczas przekazywania parametrów do makra, jak zwykle robię w wywołaniach metod. Dzieje się tak, ponieważ makro będzie faktycznie używać takich spacji, więc wyjściem byłoby „salesId-itemId-lineNum”, gdybym to zrobił).
Aby faktycznie użyć makra jako ciągu formatującego ze strFmt, należy poprzedzić znaki procentowe ukośnikami odwrotnymi, w następujący sposób:
;
info(strFmt(#FormatMacro, salesId, itemId, lineNum));
W rzeczywistości będzie to działać tak, jakbyś podał ciąg formatujący bezpośrednio.
Ta mała praca ilustruje przykłady:
{
#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));
}