การเรียกบริการเอกสาร AIF โดยตรงจาก X++ ใน Dynamics AX 2012
ที่ตีพิมพ์: 16 กุมภาพันธ์ 2025 เวลา 11 นาฬิกา 23 นาที 29 วินาที UTC
ปรับปรุงล่าสุด : 12 มกราคม 2026 เวลา 8 นาฬิกา 55 นาที 28 วินาที UTC
ในบทความนี้ ผมจะอธิบายวิธีการเรียกใช้บริการเอกสาร Application Integration Framework (AIF) ใน Dynamics AX 2012 โดยตรงจากโค้ด X++ โดยจำลองทั้งการเรียกเข้าและการเรียกออก ซึ่งจะช่วยให้ค้นหาและแก้ไขข้อผิดพลาดในโค้ด AIF ได้ง่ายขึ้นอย่างมาก
Calling AIF Document Services Directly from X++ in Dynamics AX 2012
ข้อมูลในโพสต์นี้อ้างอิงจาก Dynamics AX 2012 R3 อาจใช้ได้หรือไม่ก็ได้กับเวอร์ชันอื่นๆ
เมื่อไม่นานมานี้ ฉันได้ช่วยลูกค้าในการติดตั้งพอร์ตขาเข้าของ Application Integration Framework (AIF) เพื่อสร้างข้อมูลลูกค้าโดยอิงจากข้อมูลที่พวกเขาได้รับจากระบบอื่น เนื่องจาก Dynamics AX มีบริการเอกสาร CustCustomer อยู่แล้ว ซึ่งมีตรรกะในการทำงานนี้ เราจึงตัดสินใจใช้โซลูชันมาตรฐานเพื่อให้ง่ายต่อการใช้งาน
อย่างไรก็ตาม ในไม่ช้าก็พบว่ามีปัญหามากมายในการทำให้ระบบภายนอกสร้าง XML ที่ Dynamics AX ยอมรับได้ โครงสร้าง XML ที่สร้างโดย Dynamics AX นั้นค่อนข้างซับซ้อน และดูเหมือนว่าจะมีข้อผิดพลาดบางอย่างใน Dynamics AX ที่บางครั้งทำให้มันปฏิเสธ XML ที่ถูกต้องตามโครงสร้างตามที่เครื่องมืออื่นตรวจสอบแล้ว ดังนั้นโดยรวมแล้ว มันจึงไม่ง่ายอย่างที่ฉันคิดไว้
ในระหว่างการดำเนินการนั้น ฉันมักประสบปัญหาในการหาสาเหตุที่แท้จริงของปัญหาในไฟล์ XML บางไฟล์ เนื่องจากข้อความแสดงข้อผิดพลาดที่ AIF ให้มานั้นไม่ค่อยให้ข้อมูลมากนัก นอกจากนี้ยังเป็นเรื่องน่าเบื่อ เพราะฉันต้องรอให้ระบบภายนอกส่งข้อความใหม่ผ่าน MSMQ แล้วรอให้ AIF รับข้อความและประมวลผลอีกครั้งก่อนจึงจะเห็นข้อผิดพลาดได้
ดังนั้น ฉันจึงตรวจสอบว่าสามารถเรียกใช้โค้ดบริการโดยตรงด้วยไฟล์ XML ในเครื่องเพื่อการทดสอบที่รวดเร็วยิ่งขึ้นได้หรือไม่ และปรากฏว่าทำได้ และไม่เพียงเท่านั้น ยังทำได้ง่ายมากและให้ข้อความแสดงข้อผิดพลาดที่มีความหมายมากกว่าเดิมอีกด้วย
ตัวอย่างงานด้านล่างนี้จะอ่านไฟล์ XML ในเครื่องและพยายามใช้งานร่วมกับคลาส AxdCustomer (ซึ่งเป็นคลาสเอกสารที่ใช้โดยบริการ CustCustomer) เพื่อสร้างลูกค้า คุณสามารถสร้างงานที่คล้ายกันนี้สำหรับคลาสเอกสารอื่นๆ ได้ทั้งหมด เช่น AxdSalesOrder หากคุณต้องการ
{
FileNameOpen fileName = @'C:\\TestCustomerCreate.xml';
AxdCustomer customer;
AifEntityKey key;
#File
;
new FileIoPermission(fileName, #IO_Read).assert();
customer = new AxdCustomer();
key = customer.create( XmlDocument::newFile(fileName).xml(),
new AifEndpointActionPolicyInfo(),
new AifConstraintList());
CodeAccessPermission::revertAssert();
info('Done');
}
อ็อบเจ็กต์ AifEntityKey ที่ส่งคืนโดยเมธอด customer.create() (ซึ่งตรงกับการดำเนินการบริการ "create" ใน AIF) ประกอบด้วยข้อมูลเกี่ยวกับลูกค้าที่ถูกสร้างขึ้น รวมถึง RecId ของเรคอร์ด CustTable ที่ถูกสร้างขึ้นด้วย
หากสิ่งที่คุณต้องการทดสอบคือพอร์ตขาออก หรือหากคุณต้องการตัวอย่างว่า XML ควรมีลักษณะอย่างไรในพอร์ตขาเข้า คุณสามารถใช้คลาสเอกสารเพื่อส่งออกข้อมูลลูกค้าไปยังไฟล์แทนได้ โดยเรียกใช้เมธอด read() (ซึ่งตรงกับการดำเนินการบริการ "read") ดังนี้:
{
FileNameSave fileName = @'C:\\TestCustomerRead.xml';
Map map = new Map( Types::Integer,
Types::Container);
AxdCustomer customer;
AifEntityKey key;
XMLDocument xmlDoc;
XML xml;
AifPropertyBag bag;
#File
;
map.insert(fieldNum(CustTable, AccountNum), ['123456']);
key = new AifEntityKey();
key.parmTableId(tableNum(CustTable));
key.parmKeyDataMap(map);
customer = new AxdCustomer();
xml = customer.read(key,
null,
new AifEndpointActionPolicyInfo(),
new AifConstraintList(),
bag);
new FileIoPermission(fileName, #IO_Write).assert();
xmlDoc = XmlDocument::newXml(xml);
xmlDoc.save(fileName);
CodeAccessPermission::revertAssert();
info('Done');
}
คุณควรแทนที่ '123456' ด้วยหมายเลขบัญชีของลูกค้าที่คุณต้องการอ่านข้อมูล
อ่านเพิ่มเติม
หากคุณชอบโพสต์นี้ คุณอาจชอบคำแนะนำเหล่านี้ด้วย:
- การจัดรูปแบบสตริงด้วยแมโครและ strFmt ใน Dynamics AX 2012
- ข้อผิดพลาด "ไม่มีคลาสเมตาดาต้าที่กําหนดไว้สําหรับวัตถุสัญญาข้อมูล" ใน Dynamics AX 2012
- ภาพรวมอย่างรวดเร็วของกรอบงาน SysOperation ของ Dynamics AX 2012
