Σημείωση
Η πρόσβαση σε αυτή τη σελίδα απαιτεί εξουσιοδότηση. Μπορείτε να δοκιμάσετε να συνδεθείτε ή να αλλάξετε καταλόγους.
Η πρόσβαση σε αυτή τη σελίδα απαιτεί εξουσιοδότηση. Μπορείτε να δοκιμάσετε να αλλάξετε καταλόγους.
Note
Οι ομάδες ενδιαφέροντος της κοινότητας έχουν πλέον μετακινηθεί από το Yammer στο Microsoft Viva Engage. Για να συμμετάσχετε σε μια κοινότητα Viva Engage και να συμμετάσχετε στις τελευταίες συζητήσεις, συμπληρώστε τη φόρμα Αίτηση πρόσβασης στο Finance and Operations Viva Engage Community και επιλέξτε την κοινότητα στην οποία θέλετε να συμμετάσχετε.
Αυτό το άρθρο περιγράφει τον τρόπο δημιουργίας και χρήσης μακροεντολών σε X++.
Οι οδηγίες προ-συμμόρφωσης, δηλαδή οι μακροεντολές, διεκπεραιώνονται εννοιολογικά πριν από τη μεταγλώττιση του κώδικα. Οι οδηγίες δηλώνουν και χειρίζονται μακροεντολές και τις τιμές τους. Οι οδηγίες αντικαθίστανται με το περιεχόμενο που ορίζουν, έτσι ώστε ο μεταγλωττιστής να μην τις αντιμετωπίζει ποτέ. Το πρόγραμμα μεταγλώττισης X++ βλέπει μόνο την ακολουθία χαρακτήρων που είναι γραμμένοι στον κώδικα X++ από τις οδηγίες.
Προειδοποίηση
Οι μακροεντολές είναι δυνατότητες παλαιού τύπου και ενδέχεται να καταργηθούν σε μελλοντικές εκδόσεις. Αντί για αυτό, χρησιμοποιήστε κατασκευές γλωσσών: Αντί για μακροεντολές, χρησιμοποιήστε κατασκευές γλωσσών όπως αυτές:
Ορισμός μακροεντολών
Ορίζετε μια επώνυμη μακροεντολή χρησιμοποιώντας τη σύνταξη που εμφανίζεται παρακάτω
- #define. Η συνάρτηση MyMacro(Value) δημιουργεί μια μακροεντολή με μια προαιρετική τιμή.
- #if. Το MyMacro ελέγχει εάν έχει οριστεί μακροεντολή.
- #undef. Το MyMacro καταργεί έναν μακρο ορισμό.
οδηγίες #define και #if
Όλες οι οδηγίες και τα σύμβολα προ-υπολογιστή ξεκινούν με τον # χαρακτήρα .
Καθορίστε μια μακροεντολή με την ακόλουθη σύνταξη:
#define.MyMacro(Value) // creates a macro with a value.
#define.AnotherMacro() // creates a macro without a value.
Μπορείτε να ορίσετε μια μακροεντολή οπουδήποτε στον κώδικά σας. Η μακροεντολή μπορεί να έχει μια τιμή που είναι μια ακολουθία χαρακτήρων, αλλά δεν χρειάζεται να έχει μια τιμή. Η #define οδηγία καθοδηγεί τον προ-υπολογιστή στη δημιουργία της μακροεντολής μεταβλητής, συμπεριλαμβάνοντας προαιρετικά μια τιμή.
Η #if οδηγία ελέγχει εάν έχει οριστεί η μεταβλητή και, προαιρετικά, εάν διαθέτει συγκεκριμένη τιμή, όπως φαίνεται στο παρακάτω παράδειγμα:
#if.MyMacro
// The MyNaacro is defined.
#endif
#ifnot.MyMacro
// The MyNaacro is not defined.
#endif
Οι οδηγίες προμεταγλώττισης X++, τα μακρο ονόματα που ορίζουν και οι #if δοκιμές τιμών οδηγίας δεν κάνουν διάκριση πεζών-κεφαλαίων. Ωστόσο, καθορίστε τα ονόματα μακροεντολών που ξεκινούν με κεφαλαίο γράμμα.
οδηγία για #undef
Χρησιμοποιήστε την #undef οδηγία για να καταργήσετε έναν μακροεντολό ορισμό που υπάρχει από έναν προηγούμενο #define.
#undef.MyMacro
#if.MyMacro
// The macro is not defined, so this is not included
#endif
Μπορείτε να επαναπροσδιορίσετε ένα όνομα μακροεντολής που καταργήσατε με #undef αυτό χρησιμοποιώντας ένα άλλο #define.
Χρήση τιμής μακροεντολής
Μπορείτε να ορίσετε ένα όνομα μακροεντολής για να έχετε μια τιμή.
#define.Offset(42)
...
print #Offset; // 42
Μια μακροεντολή τιμή δεν έχει συγκεκριμένο τύπο δεδομένων, είναι απλώς μια ακολουθία χαρακτήρων. Αναθέστε μια τιμή σε μια μακροεντολή, παρέχοντας την τιμή που περικλείεται σε παρενθέσεις στο τέλος μιας #define.MyMacro οδηγίας. Χρησιμοποιήστε το σύμβολο μακροεντολής όπου θέλετε να εμφανίζεται η τιμή στον κώδικα X++. Ένα σύμβολο μακροεντολής είναι το όνομα της μακροεντολής με τον # χαρακτήρα να έχει προστεθεί ως πρόθεμα. Το ακόλουθο δείγμα κώδικα εμφανίζει ένα #MyMacro μακροεντολού συμβόλου. Το σύμβολο αντικαθίσταται από την τιμή της μακροεντολής.
Δοκιμή τιμής μακροεντολής
Μπορείτε να ελέγξετε μια μακροεντολή για να προσδιορίσετε εάν διαθέτει τιμή. Μπορείτε επίσης να προσδιορίσετε αν η τιμή του ισούται με μια συγκεκριμένη ακολουθία χαρακτήρων. Αυτές οι δοκιμές σάς επιτρέπουν να συμπεριλάβετε υπό όρους γραμμές κώδικα στο πρόγραμμα X++. Δεν υπάρχει τρόπος να ελέγξετε εάν μια καθορισμένη μακροεντολή έχει τιμή. Μπορείτε να ελέγξετε μόνο εάν η τιμή μακροεντολής συμφωνεί με μια συγκεκριμένη τιμή. Ως βέλτιστη πρακτική, να ορίζετε πάντα μια τιμή για οποιοδήποτε μακροεντολό όνομα ορίζετε ή δεν ορίζετε ποτέ μια τιμή. Όταν εναλλάσσεστε μεταξύ αυτών των λειτουργιών, γίνεται δύσκολο να κατανοήσετε τον κωδικά σας.
οδηγίες #defInc και #defDec
#defInc Τα και #defDec είναι οι μόνες οδηγίες που ερμηνεύουν την τιμή μιας μακροεντολής. Ισχύουν μόνο για μακροεντολές που έχουν μια τιμή που μπορεί να μετατρέψει ο προ-υπολογιστής στον τυπικό τύπο int . Αυτές οι οδηγίες αλλάζουν την αριθμητική τιμή μιας μακροεντολής κατά τον χρόνο μεταγλώττισης. Η τιμή μπορεί να περιέχει μόνο αριθμούς. Ο μόνος μη αριθμητικός χαρακτήρας που επιτρέπεται είναι ένα αρχικό αρνητικό πρόσημο (-). Η ακέραια τιμή αντιμετωπίζεται ως X++ int, όχι ως int64. Για τα μακροεντολά ονόματα που χρησιμοποιεί η #defInc οδηγία, η #define οδηγία που δημιουργεί τη μακροεντολή δεν θα πρέπει να βρίσκεται σε δήλωση κλάσης. Η συμπεριφορά του #defInc σε αυτές τις περιπτώσεις είναι απρόβλεπτη. Αντίθετα, καθορίστε αυτές τις μακροεντολές μόνο σε μια μέθοδο. Χρησιμοποιήστε τις #defInc οδηγίες και #defDec μόνο για μακροεντολές που έχουν ακέραια τιμή. Η προμεταγλώττιση ακολουθεί ειδικούς κανόνες για #defInc την περίπτωση που η μακροεντολή τιμή δεν είναι ακέραιος ή όταν η τιμή είναι ασυνήθιστη ή ακραία. Ο παρακάτω πίνακας παραθέτει τις τιμές που #defInc μετατρέπονται σε μηδέν (0) και, στη συνέχεια, προσαυξήσεις. Όταν #defInc μετατρέπει μια τιμή σε 0, δεν μπορείτε να ανακτήσετε την αρχική τιμή, ούτε καν χρησιμοποιώντας τη συνάρτηση #defDec.
| Τιμή μακροεντολής | Τιμή defInc | Συμπεριφορά |
|---|---|---|
| (+55) | 56 | Το πρόθημα θετικού πρόσημο (+) κάνει τον προ-υπολογιστή να αντιμετωπίζει αυτή την τιμή ως μη αριθμητική συμβολοσειρά. Ο προεταιριστής αντιμετωπίζει όλες τις μη αριθμητικές συμβολοσειρές ως 0 όταν χειρίζεται μια #defInc οδηγία (ή #defDec). |
| ("3") | 1 | Οι ακέραιοι που περικλείονται σε εισαγωγικά αντιμετωπίζονται ως 0. |
| ( ) | 1 | Μια συμβολοσειρά κενών διαστήματα αντιμετωπίζεται ως 0. |
| () | 1 | Μια συμβολοσειρά μηδενικού μήκους αντιμετωπίζεται ως 0. |
| (Τυχαία συμβολοσειρά.) | 1 | Οποιαδήποτε μη αριθμητική συμβολοσειρά χαρακτήρων αντιμετωπίζεται ως 0. |
| (0x12) | 1 | Οι δεκαεξαδικοί αριθμοί αντιμετωπίζονται ως μη αριθμητικές συμβολοσειρές. Επομένως, ο προ-υπολογιστής τις μετατρέπει σε 0. |
| (-44) | -43 | Οι αρνητικοί αριθμοί είναι αποδεκτοί. |
| (2147483647) | -2147483648 | Η μέγιστη θετική τιμή int υπερχειλίζει στην ελάχιστη αρνητική τιμή int κατά #defInc. |
| (999888777666555) | 1 | Οποιοσδήποτε μεγάλος αριθμός, πέρα από τη χωρητικότητα των int και int64. |
| (5.8) | 1 | Οι πραγματικοί αριθμοί ερμηνεύονται ως 0. |
| 1 | Όταν δεν υπάρχει τιμή και δεν παρέχονται παρενθέσεις για την οδηγία #define.MyValuelessMacro , η τιμή είναι 0. |
οδηγία για #globaldefine
Η #globaldefine οδηγία είναι παρόμοια με την #define οδηγία. Χρησιμοποιήστε #define αντί για #globaldefine.
οδηγίες #localmacro και #macro
Η #localmacro οδηγία είναι μια καλή επιλογή όταν θέλετε μια μακροεντολή να έχει μια τιμή μεγάλη από πολλές γραμμές ή όταν η τιμή μακροεντολής περιέχει μια δεξιά παρένθεση, καθιστώντας τις κατάλληλες υποψήφιες για να περιέχουν τμήματα πηγαίου κώδικα.
#macro.RetailMatchedAggregatedSalesLine(
%1.price == %2.price
&& %1.businessDate == %2.businessDate
&& %1.itemId == %2.itemId
&& ((((%3) && (%1.qty <= 0)) || ((! %3) && (%1.qty > 0))) || (%4))
)
#endmacro
Η #localmacro οδηγία μπορεί να γραφτεί ως #macro. Ωστόσο, #localmacro είναι ο προτεινόμενος όρος. Χρησιμοποιώντας την #if οδηγία, μπορείτε να ελέγξετε εάν δηλώνεται ένα μακροεντολό όνομα με την #define οδηγία. Ωστόσο, δεν μπορείτε να ελέγξετε εάν το όνομα μακροεντολής δηλώνεται με την #localmacro οδηγία. Η οδηγία επηρεάζει μόνο τις μακροεντολές που δηλώνονται με χρήση της #define#undef οδηγίας. Σε μια #define οδηγία, μπορείτε να καθορίσετε ένα όνομα που είναι ήδη εντός εμβέλειας #localmacroως . Το αποτέλεσμα είναι να απορρίψετε το #localmacro και να δημιουργήσετε μια #define μακροεντολή. Αυτό ισχύει επίσης για την αντίθετη ακολουθία, το οποίο σημαίνει ότι ένας #localmacro μπορεί να επαναπροσδιορίσει ένα #define. Μια #localmacro (που διαθέτει ένα μακροεντολό όνομα και μια τιμή) παρακάμπτει πάντα ένα προηγούμενο #localmacro που έχει το ίδιο όνομα. Αυτό το ίδιο πρόβλημα παρουσιάζεται με #globaldefineτο . Η κύρια διαφορά μεταξύ μιας #define μακροεντολής και μιας #localmacro μακροεντολής είναι ο τρόπος τερματισμού της σύνταξής τους. Οι εξολοθρευτές έχουν ως εξής:
-
#define– τερματίζεται από–) -
#localmacro– τερματίζεται από–#endmacro
#localmacro Το είναι καλύτερη επιλογή για μακροεντολές με τιμές πολλαπλών γραμμών. Οι τιμές πολλών γραμμών είναι συνήθως γραμμές κώδικα X++ ή SQL. Οι X++ και SQL περιέχουν πολλές παρενθέσεις και αυτές θα τερματίσουν πρόωρα μια #define. Αμφότερα #define τα και #localmacro μπορούν να δηλωθούν και να τερματιστούν είτε σε μία γραμμή είτε σε επόμενες γραμμές. Στην πράξη, το #define τερματίζεται στην ίδια γραμμή στην οποία δηλώνεται. Στην πράξη, ο #localmacro χαρακτήρας τερματίζεται σε επόμενη γραμμή.
Παράμετροι μακροεντολής
Μπορείτε να ορίσετε μακροεντολές τιμές για να συμπεριλάβετε σύμβολα παραμέτρων. Το πρώτο σύμβολο παραμέτρου είναι %1, το δεύτερο είναι %2και ούτω καθεξής. Διαβιβάζετε τιμές για τις παραμέτρους όταν αναφέρετε το όνομα του συμβόλου μακροεντολής για επέκταση. Οι τιμές μακροεντολών παραμέτρων είναι ακολουθίες χαρακτήρων χωρίς επίσημο τύπο και είναι οριοθετημένες με κόμματα. Δεν υπάρχει τρόπος μεταβίβασης σε κόμμα ως μέρος μιας τιμής παραμέτρου. Ο αριθμός των παραμέτρων που διαβιβάζονται μπορεί να είναι μικρότερος, μεγαλύτερος από ή ίσος με τον αριθμό των παραμέτρων που έχει σχεδιαστεί να λαμβάνει η τιμή μακροεντολής. Το σύστημα ανέχεται αναντιστοιχίες στον αριθμό των παραμέτρων που διαβιβάζονται. Εάν διαβιβαάζονται λιγότερες παράμετροι από όσες αναμένει η μακροεντολή, κάθε παράμετρος που παραλείπεται αντιμετωπίζεται ως ακολουθία χαρακτήρων μηδενικού μήκους.
Ένθεση συμβόλων μακροεντολών
Μπορείτε να ενσωματώσετε οδηγίες ορισμού προ-υπολογιστή μέσα σε μια οδηγία εξωτερικού ορισμού. Οι οδηγίες για τους κύριους ορισμούς είναι τα #define και #localmacro.
Μια #define οδηγία μπορεί να δοθεί στο εσωτερικό μιας #localmacro οδηγίας και μπορεί #localmacro να βρίσκεται σε ένα #define.
οδηγία για #macrolib
Στην Εξερεύνηση εφαρμογών στον κόμβο Μακροεντολές στον κόμβο Κώδικας, υπάρχουν πολλοί κόμβοι βιβλιοθήκης που περιέχουν σύνολα μακροεντολών οδηγιών. Εμφανίζονται και οι δύο #define και #localmacro συχνά στα περιεχόμενα αυτών των μακροεντολών βιβλιοθηκών. Μπορείτε να χρησιμοποιήσετε το #macrolib. MyAOTMacroLibrary για να συμπεριλάβετε τα περιεχόμενα μιας βιβλιοθήκης μακροεντολών στον κώδικά σας X++. Οι #if οδηγίες και #undef δεν ισχύουν για #macrolib τα ονόματα. Ωστόσο, ισχύουν για #define τις οδηγίες που αποτελούν το περιεχόμενο μιας #macrolib μακροεντολής. Η οδηγία #macrolib. Το MyAOTMacroLibrary μπορεί επίσης να γραφτεί ως #MyAOTMacroLibrary. Το #macrolib πρόθεμα συνιστάται καθώς δεν είναι ποτέ ασαφές για ένα άτομο που αργότερα διαβάζει τον κώδικα.
Οδηγία #linenumber
Μπορείτε να χρησιμοποιήσετε την οδηγία κατά τη #linenumber διάρκεια της ανάπτυξης και εντοπισμού σφαλμάτων κώδικα. Αντικαθίσταται από τον αριθμό της φυσικής γραμμής στο αρχείο κώδικα πριν από οποιαδήποτε μακρο επέκταση.
Μακροσκοπική εμβέλεια
Η περιοχή στην οποία μπορείτε να αναφερθείτε σε μια μακροεντολή εξαρτάται από το σημείο όπου ορίζετε τη μακροεντολή. Σε μια κλάση, μπορείτε να αναφερθείτε σε μακροεντολές που ορίζετε στη γονική κλάση. Όταν ο προ-υπολογιστής χειρίζεται μια θυγατρική κλάση, πρώτα ανιχνεύει την αλυσίδα μεταβίβασης στην κλάση ρίζας. Στη συνέχεια, ο προμεταγλωττιστής επεξεργάζεται όλες τις οδηγίες από την κλάση ρίζας έως την κλάση που μεταγλωττίζεται. Αποθηκεύει όλες τις μακροεντολές και τις τιμές τους στους εσωτερικούς πίνακές της. Τα αποτελέσματα των οδηγιών σε κάθε δήλωση κλάσης ισχύουν για τους εσωτερικούς πίνακες που έχουν ήδη συμπληρωθεί από οδηγίες που εντοπίστηκαν προηγουμένως στην αλυσίδα μεταβίβασης.
Ωστόσο, ο προ-υπολογιστής χειρίζεται κάθε μέθοδο ξεχωριστά. Ενημερώνει τους εσωτερικούς πίνακές του, ώστε να μπορεί να επαναφέρει την κατάσταση των πινάκων όπως ήταν πριν από την επεξεργασία της τρέχουσας μεθόδου. Αφού ο προ-υπολογιστής χειριστεί την πρώτη μέθοδο, επαναφέρει τους εσωτερικούς πίνακες πριν χειριστεί την επόμενη μέθοδο.
Σε αυτό το περιβάλλον, μια μέθοδος ορίζεται ως τα περιεχόμενα ενός κόμβου μεθόδου στο δέντρο αντικειμένου εφαρμογής (AOT). Στον AOT, μπορείτε να αναπτύξετε τον κόμβο, να αναπτύξετε έναν κόμβο κλάσης, να κάνετε δεξί κλικ σε έναν κόμβο μεθόδου και, στη συνέχεια, να επιλέξετε Επεξεργασία. Στη συνέχεια, μπορείτε να προσθέσετε μια γραμμή για #define.MyMacro("abc") πριν από τη δήλωση μεθόδου. Ο προμεταγλωττιστής αντιμετωπίζει αυτή την #define οδηγία ως μέρος της μεθόδου, παρόλο που αυτό #define συμβαίνει εκτός του {} μπλοκ της μεθόδου.