Miklix

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

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

במהלך המאמץ, התקשיתי לעתים קרובות להבין מה בדיוק הבעיה עם קבצי 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 אמור להיראות בפורט הנכנס, תוכלו גם להשתמש במחלקה document כדי לייצא לקוח לקובץ על ידי קריאה למתודה 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' במספר החשבון של הלקוח שברצונך לקרוא.

קריאה נוספת

אם נהניתם מהפוסט הזה, אולי תאהבו גם את ההצעות הבאות:


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

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

על המחבר

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