Κλήση υπηρεσιών εγγράφων AIF απευθείας από την X++ στο Dynamics AX 2012
Δημοσιεύθηκε: 16 Φεβρουαρίου 2025 στις 11:22:54 π.μ. UTC
Τελευταία ενημέρωση: 12 Ιανουαρίου 2026 στις 8:55:12 π.μ. UTC
Σε αυτό το άρθρο, εξηγώ πώς να καλείτε τις υπηρεσίες εγγράφων του Application Integration Framework στο Dynamics AX 2012 απευθείας από κώδικα X++, εξομοιώνοντας τόσο τις εισερχόμενες όσο και τις εξερχόμενες κλήσεις, κάτι που μπορεί να διευκολύνει σημαντικά την εύρεση και τον εντοπισμό σφαλμάτων σε κώδικα AIF.
Calling AIF Document Services Directly from X++ in Dynamics AX 2012
Οι πληροφορίες σε αυτήν την ανάρτηση βασίζονται στο Dynamics AX 2012 R3. Ενδέχεται να ισχύουν ή όχι για άλλες εκδόσεις.
Πρόσφατα βοηθούσα έναν πελάτη να εφαρμόσει μια θύρα εισερχόμενης πρόσβασης (inbound port) του 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' με τον αριθμό λογαριασμού του πελάτη που θέλετε να διαβάσετε.
Περαιτέρω ανάγνωση
Αν σας άρεσε αυτή η ανάρτηση, ίσως σας αρέσουν και αυτές οι προτάσεις:
- Προσδιορισμός κλάσης εγγράφων και ερωτήματος για υπηρεσία AIF στο Dynamics AX 2012
- Διαγραφή Νομικής οντότητας (Εταιρικοί Λογαριασμοί) στο Dynamics AX 2012
- Μετατροπή πραγματικού σε συμβολοσειρά με όλα τα δεκαδικά ψηφία στο Dynamics AX 2012
