Μορφοποίηση συμβολοσειρών με Macro και strFmt στο Dynamics AX 2012
Δημοσιεύθηκε: 16 Φεβρουαρίου 2025 στις 12:48:22 π.μ. UTC
Αυτό το άρθρο περιγράφει κάποια περίεργη συμπεριφορά στο Dynamics AX 2012 κατά τη χρήση μιας μακροεντολής ως συμβολοσειράς μορφής στο strFmt, καθώς και παραδείγματα σχετικά με τον τρόπο αντιμετώπισης της.
String Formatting with Macro and strFmt in Dynamics AX 2012
Οι πληροφορίες σε αυτήν την ανάρτηση βασίζονται στο Dynamics AX 2012 R3. Μπορεί να ισχύει ή να μην ισχύει για άλλες εκδόσεις.
Πρόσφατα αντιμετώπισα ένα πρόβλημα με τη λειτουργία strFmt που με μπέρδεψε για λίγο. Το πιο περίεργο μέρος ήταν ότι κατά μια περίεργη σύμπτωση δεν το έχω ξανασυναντήσει στα πολλά χρόνια που ήμουν προγραμματιστής Axapta/Dynamics AX.
Το θέμα ήταν ότι προσπάθησα να χρησιμοποιήσω μια μακροεντολή ως συμβολοσειρά μορφής για τη συνάρτηση strFmt και απλά δεν λειτούργησε. Αγνόησε εντελώς τις παραμέτρους % και επέστρεψε μόνο το υπόλοιπο της συμβολοσειράς.
Αφού το έψαξα, ανακάλυψα ότι οι ίδιες οι μακροεντολές μπορούν να χρησιμοποιηθούν για τη διαμόρφωση συμβολοσειρών, κάτι που επίσης δεν ήξερα. Λοιπόν, είναι πάντα καλό να μαθαίνεις κάτι καινούργιο, αλλά και πάλι ήμουν πολύ έκπληκτος που δεν είχα τύχει να το συναντήσω πριν.
Βασικά, κάτι τέτοιο
;
info(strFmt(#FormatMacro, salesId, itemId, lineNum));
δεν θα λειτουργήσει επειδή τα σημάδια % στη μακροεντολή χρησιμοποιούνται στην πραγματικότητα για τις δυνατότητες μορφοποίησης συμβολοσειράς της ίδιας της μακροεντολής. Σε αυτήν την περίπτωση, η συνάρτηση strFmt θα δει τη συμβολοσειρά μορφοποίησης ως "--" και επομένως θα επιστρέψει μόνο αυτήν.
Κάτι σαν αυτό:
info(#FormatMacro(salesId,itemId,lineNum));
θα λειτουργήσει, αλλά μάλλον όχι όπως θέλετε. Αντί να εξάγει τις τιμές των τριών μεταβλητών, θα παράγει τα ονόματα των μεταβλητών, σε αυτήν την περίπτωση "salesId-itemId-lineNum". (Παρατηρήστε ότι δεν έβαλα κενά μετά τα κόμματα όταν μεταβιβάζω παραμέτρους στη μακροεντολή, όπως κάνω συνήθως στις κλήσεις μεθόδων. Αυτό συμβαίνει επειδή η μακροεντολή θα χρησιμοποιήσει και τέτοια κενά, οπότε η έξοδος θα ήταν "salesId- itemIdlineNum" αν έκανα).
Για να χρησιμοποιήσετε πραγματικά μια μακροεντολή ως συμβολοσειρά μορφοποίησης με strFmt, πρέπει να ξεφύγετε από τα σύμβολα ποσοστού με ανάστροφες κάθετες, όπως αυτό:
;
info(strFmt(#FormatMacro, salesId, itemId, lineNum));
Αυτό θα λειτουργήσει πραγματικά σαν να είχατε δώσει απευθείας τη συμβολοσειρά μορφοποίησης.
Αυτή η μικρή εργασία επεξηγεί τα παραδείγματα:
{
#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));
}