Miklix

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

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() (ซึ่งตรงกับการดำเนินการบริการ "create" ใน AIF) ประกอบด้วยข้อมูลเกี่ยวกับลูกค้าที่ถูกสร้างขึ้น รวมถึง RecId ของเรคอร์ด CustTable ที่ถูกสร้างขึ้นด้วย

หากสิ่งที่คุณต้องการทดสอบคือพอร์ตขาออก หรือหากคุณต้องการตัวอย่างว่า XML ควรมีลักษณะอย่างไรในพอร์ตขาเข้า คุณสามารถใช้คลาสเอกสารเพื่อส่งออกข้อมูลลูกค้าไปยังไฟล์แทนได้ โดยเรียกใช้เมธอด read() (ซึ่งตรงกับการดำเนินการบริการ "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 ปี และปัจจุบันทำงานเต็มเวลาให้กับบริษัทไอทีขนาดใหญ่แห่งหนึ่งในยุโรป เมื่อไม่ได้เขียนบล็อก เขาจะใช้เวลาว่างไปกับความสนใจ งานอดิเรก และกิจกรรมต่างๆ มากมาย ซึ่งในระดับหนึ่งอาจสะท้อนให้เห็นได้จากหัวข้อต่างๆ มากมายที่กล่าวถึงในเว็บไซต์นี้