Miklix

קריאה לשירותי מסמכים של AIF ישירות מ-X++ ב- Dynamics AX 2012

פורסם: 16 בפברואר 2025 בשעה 11:23:35 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 כבר מספקת את שירות המסמכים של CustomCustomer, שמיישם את ההיגיון לכך, החלטנו לשמור על זה פשוט ולהשתמש בפתרון הסטנדרטי.

עם זאת, עד מהרה התברר שיש הרבה בעיות לגרום למערכת החיצונית ליצור XML ש- Dynamics AX יקבל. סכימת ה-XML שנוצרה על-ידי Dynamics AX היא די מורכבת ונראה גם שיש מעט באגים ב-Dynamics AX שלעיתים גורמים לו לדחות XML שהוא תקף לסכימה לפי כלים אחרים, כך שבסך הכל, זה התברר כפחות פשוט ממה שחשבתי.

במהלך המאמץ, לעתים קרובות נאבקתי להבין מה בדיוק הבעיה עם קבצי XML מסוימים מכיוון שהודעות השגיאה שסיפקה AIF אינן אינפורמטיביות. זה היה גם מייגע, כי נאלצתי לחכות שהמערכת החיצונית תשלח הודעה חדשה דרך MSMQ ואז שוב ל-AIF לאסוף את ההודעה ולעבד אותה לפני שאוכל לראות שגיאה.

לכן בדקתי אם אפשר להתקשר ישירות לקוד השירות עם קובץ XML מקומי לבדיקה קצת יותר מהירה ומתברר שכן - ולא רק זה, זה ממש פשוט לביצוע ולמעשה מספק הרבה יותר הודעות שגיאה משמעותיות.

העבודה לדוגמה להלן קוראת קובץ XML מקומי ומנסה להשתמש בו עם המחלקה AxdCustomer (שהיא מחלקת המסמכים המשמשת את שירות CustomCustomer) כדי ליצור לקוח. אתה יכול לבצע עבודות דומות עבור כל מחלקות המסמכים האחרות, למשל 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() (המקבילה לפעולת השירות "קריאה"), כך:

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' במספר החשבון של הלקוח שברצונך לקרוא.

שתפו בבלוסקישתפו בפייסבוקשתפו בלינקדאיןשתפו ב-Tumblrשתפו ב-Xשתפו בלינקדאיןהצמד בפינטרסט

מיקל בנג כריסטנסן

על המחבר

מיקל בנג כריסטנסן
מיקל הוא היוצר והבעלים של miklix.com. יש לו למעלה מ-20 שנות ניסיון כמתכנת מחשבים/מפתח תוכנה מקצועי וכיום הוא מועסק במשרה מלאה בתאגיד IT אירופאי גדול. כשהוא לא כותב בלוג, הוא מבלה את זמנו הפנוי במגוון עצום של תחומי עניין, תחביבים ופעילויות, שעשויים לבוא לידי ביטוי במידה מסוימת במגוון הנושאים המכוסים באתר זה.