קריאה לשירותי מסמכים של 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, במידת הצורך.
{
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"), כך:
{
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' במספר החשבון של הלקוח שברצונך לקרוא.
קריאה נוספת
אם נהניתם מהפוסט הזה, אולי תאהבו גם את ההצעות הבאות:
- המר ריאל למחרוזת עם כל הספרות העשרוניות ב- Dynamics AX 2012
- זיהוי מחלקת מסמכים ושאילתה עבור שירות AIF ב- Dynamics AX 2012
- סקירה מהירה של Dynamics AX 2012 SysOperation Framework
