Miklix

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

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() (η οποία αντιστοιχεί στη λειτουργία υπηρεσίας "δημιουργία" στο AIF) περιέχει πληροφορίες σχετικά με το ποιος πελάτης δημιουργήθηκε, μεταξύ άλλων το RecId της δημιουργηθείσας εγγραφής CustTable.

Εάν αυτό που προσπαθείτε να δοκιμάσετε είναι μια θύρα εξερχομένων ή εάν χρειάζεστε απλώς ένα παράδειγμα για το πώς πρέπει να φαίνεται η XML στη θύρα εισερχομένων, μπορείτε επίσης να χρησιμοποιήσετε την κλάση εγγράφου για να εξαγάγετε έναν πελάτη σε ένα αρχείο καλώντας τη μέθοδο 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

Μίκελ Μπανγκ Κρίστενσεν

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

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