Miklix

การเรียกบริการเอกสาร 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 ถ้าคุณต้องการ

static void CustomerCreate(Args _args)
{
    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() (ซึ่งสอดคล้องกับการดําเนินการบริการ "อ่าน") แทน เช่นนั้น:

static void CustomerRead(Args _args)
{
    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' ด้วยหมายเลขบัญชีของลูกค้าที่คุณต้องการอ่าน

แชร์บนบลูสกายแชร์บนเฟสบุ๊คแชร์บน LinkedInแชร์บน Tumblrแชร์บน Xแชร์บน LinkedInปักหมุดบน Pinterest

มิคเคล บัง คริสเตนเซ่น

เกี่ยวกับผู้เขียน

มิคเคล บัง คริสเตนเซ่น
ไมเคิล คือผู้สร้างและเจ้าของเว็บไซต์ miklix.com เขามีประสบการณ์เป็นโปรแกรมเมอร์/นักพัฒนาซอฟต์แวร์คอมพิวเตอร์มืออาชีพมากว่า 20 ปี และปัจจุบันทำงานเต็มเวลาให้กับบริษัทไอทีขนาดใหญ่แห่งหนึ่งในยุโรป เมื่อไม่ได้เขียนบล็อก เขาจะใช้เวลาว่างไปกับความสนใจ งานอดิเรก และกิจกรรมต่างๆ มากมาย ซึ่งในระดับหนึ่งอาจสะท้อนให้เห็นได้จากหัวข้อต่างๆ มากมายที่กล่าวถึงในเว็บไซต์นี้