تنسيق السلسلة باستخدام الماكرو وstrFmt في Dynamics AX 2012
نُشرت: ١٦ فبراير ٢٠٢٥ م في ١٢:٤٧:٥١ ص 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- itemId- lineNum" إذا فعلت ذلك).
لاستخدام ماكرو فعليًا كتنسيق للسلسلة باستخدام 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));
}