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