การเรียกบริการเอกสาร AIF โดยตรงจาก X++ ใน Dynamics AX 2012
ที่ตีพิมพ์: 16 กุมภาพันธ์ 2025 เวลา 11 นาฬิกา 23 นาที 29 วินาที UTC
ในบทความนี้ ผมจะอธิบายวิธีการเรียกใช้บริการเอกสาร Application Integration Framework ใน 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 ที่ถูกต้องตาม schema ตามเครื่องมืออื่น ๆ ดังนั้นโดยรวมแล้วมันพิสูจน์แล้วว่าง่ายกว่าที่ฉันคิด
ในระหว่างความพยายามฉันมักจะพยายามหาว่าปัญหาคืออะไรกับไฟล์ 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() (ซึ่งสอดคล้องกับการดําเนินการบริการ "สร้าง" ใน AIF) ประกอบด้วยข้อมูลเกี่ยวกับลูกค้าที่สร้างขึ้น เหนือสิ่งอื่นใด RecId ของเรกคอร์ด CustTable ที่สร้างขึ้น
หากสิ่งที่คุณพยายามทดสอบคือพอร์ตขาออกแทน หรือถ้าคุณต้องการตัวอย่างว่า XML ควรมีลักษณะอย่างไรบนพอร์ตขาเข้า คุณยังสามารถใช้คลาสเอกสารเพื่อส่งออกลูกค้าไปยังไฟล์แทนได้โดยการเรียกใช้เมธอด 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' ด้วยหมายเลขบัญชีของลูกค้าที่คุณต้องการอ่าน