การจัดรูปแบบสตริงด้วยแมโครและ strFmt ใน Dynamics AX 2012
ที่ตีพิมพ์: 16 กุมภาพันธ์ 2025 เวลา 0 นาฬิกา 49 นาที 08 วินาที UTC
ปรับปรุงล่าสุด : 12 มกราคม 2026 เวลา 8 นาฬิกา 44 นาที 37 วินาที 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));
}
อ่านเพิ่มเติม
หากคุณชอบโพสต์นี้ คุณอาจชอบคำแนะนำเหล่านี้ด้วย:
- ข้อผิดพลาด "ไม่มีคลาสเมตาดาต้าที่กําหนดไว้สําหรับวัตถุสัญญาข้อมูล" ใน Dynamics AX 2012
- ภาพรวมอย่างรวดเร็วของกรอบงาน SysOperation ของ Dynamics AX 2012
- การเรียกบริการเอกสาร AIF โดยตรงจาก X++ ใน Dynamics AX 2012
