Miklix

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.


Denna sida har maskinöversatts från engelska för att göra den tillgänglig för så många som möjligt. Tyvärr är maskinöversättning ännu inte en fulländad teknik, så fel kan uppstå. Om du föredrar det kan du se den engelska originalversionen här:

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

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

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:

#define.FormatMacro('%1-%2-%3');
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:

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

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:

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));
}
Dela på BlueskyDela på FacebookDela på LinkedInDela på TumblrDela på XDela på LinkedInFäst på Pinterest

Mikkel Bang Christensen

Om författaren

Mikkel Bang Christensen
Mikkel är skaparen och ägaren av miklix.com. Han har över 20 års erfarenhet som professionell datorprogrammerare/mjukvaruutvecklare och är för närvarande heltidsanställd på ett stort europeiskt IT-bolag. När han inte bloggar ägnar han sin fritid åt en mängd olika intressen, hobbies och aktiviteter, vilket i viss mån kan återspeglas i de olika ämnen som behandlas på den här webbplatsen.