วิธีการทําซ้ําองค์ประกอบของ Enum จากรหัส X++ ใน Dynamics AX 2012
ที่ตีพิมพ์: 15 กุมภาพันธ์ 2025 เวลา 23 นาฬิกา 11 นาที 09 วินาที UTC
ปรับปรุงล่าสุด : 12 มกราคม 2026 เวลา 8 นาฬิกา 42 นาที 11 วินาที UTC
บทความนี้อธิบายวิธีการแจงนับและวนลูปผ่านองค์ประกอบของ enum พื้นฐานใน Dynamics AX 2012 รวมถึงตัวอย่างโค้ด X++
How to Iterate Over the Elements of an Enum from X++ Code in Dynamics AX 2012
ข้อมูลในโพสต์นี้อ้างอิงจาก Dynamics AX 2012 R3 อาจใช้ได้หรือไม่ก็ได้กับเวอร์ชันอื่นๆ
เมื่อไม่นานมานี้ ฉันกำลังสร้างแบบฟอร์มที่ต้องแสดงค่าสำหรับแต่ละองค์ประกอบใน enum แทนที่จะสร้างฟิลด์ด้วยตนเอง (และต้องดูแลรักษาแบบฟอร์มหาก enum มีการเปลี่ยนแปลงในอนาคต) ฉันจึงตัดสินใจที่จะใช้การสร้างแบบไดนามิกเพื่อให้มันเพิ่มฟิลด์ลงในดีไซน์โดยอัตโนมัติเมื่อใช้งาน
อย่างไรก็ตาม ในไม่ช้าฉันก็พบว่าการวนซ้ำค่าต่างๆ ใน enum นั้น แม้จะง่ายพอเมื่อรู้หลักการแล้ว แต่ก็ค่อนข้างสับสนอยู่บ้าง
แน่นอนว่าคุณต้องเริ่มต้นด้วยคลาส DictEnum ก่อน ดังที่คุณจะเห็น คลาสนี้มีเมธอดหลายอย่างสำหรับดึงข้อมูล เช่น ชื่อและป้ายกำกับ จากทั้งดัชนีและค่า
ความแตกต่างระหว่างดัชนีและค่าคือ ดัชนีเป็นหมายเลขขององค์ประกอบใน enum หากองค์ประกอบของ enum ถูกกำหนดหมายเลขเรียงลำดับจากศูนย์ ในขณะที่ค่าคือคุณสมบัติ "ค่า" ที่แท้จริงขององค์ประกอบนั้น เนื่องจาก enum ส่วนใหญ่มีค่าเรียงลำดับจาก 0 ดังนั้นดัชนีและค่าขององค์ประกอบจึงมักจะเหมือนกัน แต่ก็ไม่เสมอไป
แต่คุณจะรู้ได้อย่างไรว่า enum มีค่าอะไรบ้าง? นี่แหละคือจุดที่ทำให้สับสน คลาส DictEnum มีเมธอดที่ชื่อว่า values() คุณอาจคาดหวังว่าเมธอดนี้จะคืนค่าเป็นลิสต์ของค่าต่างๆ ใน enum แต่เห็นได้ชัดว่านั่นง่ายเกินไป ดังนั้นมันจึงคืนค่าเป็นจำนวนค่าที่ enum มีอยู่ อย่างไรก็ตาม จำนวนค่านี้ไม่เกี่ยวข้องกับค่าที่แท้จริง ดังนั้นคุณต้องใช้จำนวนนี้เป็นพื้นฐานในการเรียกใช้เมธอดที่อิงตามดัชนี ไม่ใช่เมธอดที่อิงตามค่า
ถ้าหากพวกเขาตั้งชื่อเมธอดนี้ว่า indexes() แทน มันคงจะไม่สับสนเท่านี้ ;-)
โปรดจำไว้ด้วยว่าค่า enum (และดัชนีเหล่านี้) เริ่มต้นที่ 0 ซึ่งแตกต่างจากดัชนีของอาร์เรย์และคอนเทนเนอร์ใน X++ ที่เริ่มต้นที่ 1 ดังนั้นในการวนลูปผ่านองค์ประกอบใน enum คุณสามารถทำได้ดังนี้:
Counter c;
;
for (c = 0; c < dictEnum.values(); c++)
{
info(strFmt('%1: %2', dictEnum.index2Symbol(c), dictEnum.index2Label(c)));
}
คำสั่งนี้จะแสดงสัญลักษณ์และป้ายกำกับของแต่ละองค์ประกอบใน enum ไปยัง infolog
อ่านเพิ่มเติม
หากคุณชอบโพสต์นี้ คุณอาจชอบคำแนะนำเหล่านี้ด้วย:
- การระบุคลาสเอกสารและแบบสอบถามสำหรับบริการ AIF ใน Dynamics AX 2012
- การใช้เฟรมเวิร์ก SysExtension เพื่อค้นหาว่าคลาสย่อยที่จะสร้างอินสแตนซ์ใน Dynamics AX 2012
- การเรียกบริการเอกสาร AIF โดยตรงจาก X++ ใน Dynamics AX 2012
