Stringopmaak met macro en strFmt in Dynamics AX 2012
Gepubliceerd: 16 februari 2025 om 00:48:46 UTC
In dit artikel wordt vreemd gedrag in Dynamics AX 2012 beschreven wanneer u een macro gebruikt als opmaakreeks in de strFmt. Ook worden voorbeelden gegeven van hoe u dit kunt omzeilen.
String Formatting with Macro and strFmt in Dynamics AX 2012
De informatie in dit bericht is gebaseerd op Dynamics AX 2012 R3. Het kan wel of niet geldig zijn voor andere versies.
Ik kwam onlangs een probleem tegen met de strFmt-functie dat me even verbaasde. Het meest verbijsterende was dat ik het door een vreemd toeval nog nooit eerder ben tegengekomen in mijn vele jaren als Axapta/Dynamics AX-ontwikkelaar.
Het probleem was dat ik probeerde een macro te gebruiken als de format string voor de strFmt functie en het werkte gewoon niet. Het negeerde de % parameters volledig en gaf alleen de rest van de string terug.
Nadat ik me erin verdiept had, ontdekte ik dat macro's zelf gebruikt kunnen worden om strings te formatteren, wat ik ook niet wist. Ach, het is altijd goed om iets nieuws te leren, maar ik was toch erg verrast dat ik dit nog niet eerder was tegengekomen.
In principe zoiets als dit
;
info(strFmt(#FormatMacro, salesId, itemId, lineNum));
zal niet werken omdat de % tekens in de macro daadwerkelijk worden gebruikt voor de eigen string-opmaakfuncties van de macro. In dit geval zal de strFmt functie de opmaakstring zien als "--" en zal daarom alleen dat retourneren.
Zoiets als dit:
info(#FormatMacro(salesId,itemId,lineNum));
zal werken, maar waarschijnlijk niet op de manier die u wilt. In plaats van de waarden van de drie variabelen uit te voeren, worden in plaats daarvan de namen van de variabelen uitgevoerd, in dit geval "salesId-itemId-lineNum". (Merk op dat ik geen spaties na de komma's heb gezet bij het doorgeven van parameters aan de macro, zoals ik normaal doe bij methodeaanroepen. Dat komt omdat de macro ook daadwerkelijk zulke spaties zal gebruiken, dus de uitvoer zou "salesId-itemId-lineNum" zijn als ik dat deed).
Om een macro daadwerkelijk als opmaakreeks met strFmt te gebruiken, moet u de percentagetekens escapen met backslashes, zoals dit:
;
info(strFmt(#FormatMacro, salesId, itemId, lineNum));
Dit werkt alsof u de opmaakreeks rechtstreeks hebt opgegeven.
Dit kleine klusje illustreert de voorbeelden:
{
#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));
}