Κλήση υπηρεσιών εγγράφων AIF απευθείας από την X++ στο Dynamics AX 2012
Δημοσιεύθηκε: 16 Φεβρουαρίου 2025 στις 11:22:54 π.μ. UTC
Σε αυτό το άρθρο, εξηγώ πώς μπορείτε να καλέσετε τις υπηρεσίες εγγράφων του πλαισίου ενοποίησης εφαρμογών στο Dynamics AX 2012 απευθείας από τον κώδικα X++, εξομοιώνοντας τόσο τις εισερχόμενες όσο και τις εξερχόμενες κλήσεις, γεγονός που μπορεί να διευκολύνει σημαντικά την εύρεση και τον εντοπισμό σφαλμάτων στον κώδικα AIF.
Calling AIF Document Services Directly from X++ in Dynamics AX 2012
Οι πληροφορίες σε αυτήν την καταχώρηση βασίζεται στο Dynamics AX 2012 R3. Μπορεί να ισχύει ή να μην ισχύει για άλλες εκδόσεις.
Πρόσφατα βοήθησα έναν πελάτη να εφαρμόσει μια θύρα εισερχομένων του Πλαισίου ενοποίησης εφαρμογών (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() (η οποία αντιστοιχεί στη λειτουργία υπηρεσίας "δημιουργία" στο 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» με τον αριθμό λογαριασμού του πελάτη που θέλετε να διαβάσετε.