Strängformatering med makro och strFmt i Dynamics AX 2012
Publicerad: 16 februari 2025 kl. 00:48:57 UTC
Den här artikeln beskriver en del märkliga beteenden i Dynamics AX 2012 när ett makro används som formatsträng i strFmt, samt exempel på hur man kan kringgå det.
String Formatting with Macro and strFmt in Dynamics AX 2012
Informationen i det här inlägget är baserad på Dynamics AX 2012 R3. Det kan eller kanske inte är giltigt för andra versioner.
Jag stötte nyligen på ett problem med strFmt-funktionen som förbryllade mig lite. Det mest förbryllande var att jag av en konstig slump aldrig har stött på det förut under mina många år som Axapta/Dynamics AX-utvecklare.
Problemet var att jag försökte använda ett makro som formatsträng för strFmt-funktionen och det fungerade bara inte. Den ignorerade helt parametrarna % och returnerade bara resten av strängen.
Efter att ha tittat på det upptäckte jag att makron i sig kan användas för att formatera strängar, vilket också var något jag inte visste. Nåja, det är alltid bra att lära sig något nytt, men jag blev ändå väldigt förvånad över att jag inte råkade stöta på det här tidigare.
I grund och botten, något sånt här
;
info(strFmt(#FormatMacro, salesId, itemId, lineNum));
kommer inte att fungera eftersom %-tecknen i makrot faktiskt används för makrots egna strängformateringsfunktioner. I det här fallet kommer strFmt-funktionen att se formateringssträngen som "--" och returnerar därför bara det.
Något så här:
info(#FormatMacro(salesId,itemId,lineNum));
kommer att fungera, men förmodligen inte som du vill ha det. Istället för att mata ut värdena för de tre variablerna, kommer den att mata ut namnen på variablerna istället, i det här fallet "salesId-itemId-lineNum". (Lägg märke till att jag inte satte mellanslag efter kommatecken när jag skickade parametrar till makrot, som jag brukar göra i metodanrop. Det beror på att makrot faktiskt kommer att använda sådana mellanslag också, så utdata skulle bli "salesId- itemId- lineNum" om jag gjorde det).
För att faktiskt använda ett makro som formateringssträng med strFmt måste du undkomma procenttecknen med omvända snedstreck, så här:
;
info(strFmt(#FormatMacro, salesId, itemId, lineNum));
Detta kommer faktiskt att fungera som om du hade tillhandahållit formatsträngen direkt.
Detta lilla jobb illustrerar exemplen:
{
#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));
}