Miklix

Κλήση υπηρεσιών εγγράφων 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, εάν χρειάζεται.

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' με τον αριθμό λογαριασμού του πελάτη που θέλετε να διαβάσετε.

Περαιτέρω ανάγνωση

Αν σας άρεσε αυτή η ανάρτηση, ίσως σας αρέσουν και αυτές οι προτάσεις:


Μοιραστείτε το στο BlueskyΚοινή χρήση στο FacebookΚοινοποίηση στο LinkedInΜοιραστείτε το στο TumblrΚοινοποίηση στο XΚοινοποίηση στο LinkedInΚαρφιτσώστε στο Pinterest

Mikkel Christensen

Σχετικά με τον συγγραφέα

Mikkel Christensen
Ο Μιχαήλ είναι ο δημιουργός και ιδιοκτήτης του miklix.com. Έχει πάνω από 20 χρόνια εμπειρίας ως επαγγελματίας προγραμματιστής υπολογιστών/προγραμματιστής λογισμικού και σήμερα εργάζεται με πλήρη απασχόληση σε μια μεγάλη ευρωπαϊκή εταιρεία πληροφορικής. Όταν δεν ασχολείται με το ιστολόγιο, αφιερώνει τον ελεύθερο χρόνο του σε ένα ευρύ φάσμα ενδιαφερόντων, χόμπι και δραστηριοτήτων, τα οποία μπορεί σε κάποιο βαθμό να αντικατοπτρίζονται στην ποικιλία των θεμάτων που καλύπτονται σε αυτόν τον ιστότοπο.