การจัดรูปแบบสตริงด้วยแมโครและ strFmt ใน Dynamics AX 2012
ที่ตีพิมพ์: 16 กุมภาพันธ์ 2025 เวลา 0 นาฬิกา 49 นาที 08 วินาที 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));
}