Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Megjegyzés:
A közösségi érdekcsoportok mostantól a Yammerből a Microsoft Viva Engagebe költöztek. Ha csatlakozni szeretne egy Viva Engage-közösséghez, és részt szeretne venni a legutóbbi megbeszéléseken, töltse ki a Pénzügyi és üzemeltetési Hozzáférés kérése Viva Engage Community űrlapot, és válassza ki a közösséget, amelyhez csatlakozni szeretne.
Ez a cikk azt ismerteti, hogyan hozhat létre és használhat makrókat az X++-ban.
Az előkomponens-irányelvek, vagyis a makrók a kód fordítása előtt fogalmilag fel vannak dolgozva. Az irányelvek deklarálják és kezelik a makrókat és azok értékeit. Az irányelvek helyébe az általuk kijelölt tartalom kerül, így a fordító soha nem találkozik velük. Az X++ fordító csak az X++ kódba írt karakterek sorozatát látja az irányelvek szerint.
Figyelmeztetés
A makrók régi funkciók, és a jövőbeli kiadásokban elavultak lehetnek. Használjon inkább nyelvi szerkezeteket: Makrók helyett használja az alábbihoz hasonló nyelvi szerkezeteket:
Makrók definiálása
Elnevezett makrót az alábbi szintaxissal definiálhat
- #define. A MyMacro(Value) nem kötelező értékkel rendelkező makrót hoz létre.
- #if. A MyMacro ellenőrzi, hogy van-e definiálva makró.
- #undef. A MyMacro eltávolít egy makródefiníciót.
#define és #if irányelvek
Minden előkomponens-direktíva és szimbólum a # karakterrel kezdődik.
Adjon meg egy makrót a következő szintaxissal:
#define.MyMacro(Value) // creates a macro with a value.
#define.AnotherMacro() // creates a macro without a value.
A kódban bárhol definiálhat makrót. A makró tartalmazhat olyan értéket, amely karaktersorozat, de nem kell értéket megadnia. Az #define irányelv arra utasítja az előösszetevőt, hogy hozza létre a makróváltozót, opcionálisan egy értéket is beleértve.
Az #if irányelv ellenőrzi, hogy a változó definiálva van-e, és ha igen, adott értékkel rendelkezik-e, ahogyan az a következő példában látható:
#if.MyMacro
// The MyNaacro is defined.
#endif
#ifnot.MyMacro
// The MyNaacro is not defined.
#endif
Az X++ előkomplikációs irányelvek, az általuk definiált makrónevek és az #if irányelvérték-tesztek mind érzéketlenek. Adjon meg azonban olyan makróneveket, amelyek nagybetűvel kezdődnek.
#undef irányelv
#undef Az irányelvvel eltávolíthat egy korábbi #definemakródefiníciót.
#undef.MyMacro
#if.MyMacro
// The macro is not defined, so this is not included
#endif
Egy másik #undefparanccsal #define újradefinitálhatja az eltávolított makrónevet.
Makróérték használata
Megadhat egy makrónevet, hogy érték legyen.
#define.Offset(42)
...
print #Offset; // 42
A makróértékek nem rendelkeznek adott adattípussal – ez csak egy karaktersorozat. Rendeljen hozzá egy értéket egy makróhoz úgy, hogy zárójelben adja meg az értéket az #define.MyMacro irányelv végén. Használja a makrószimbólumot bárhol, ahol az X++ kódban meg szeretné jeleníteni az értéket. A makrószimbólum annak a makrónak a neve, amelynek a karaktere # előtagként van hozzáadva. Az alábbi kódminta egy makrószimbólumot #MyMacro mutat be. A szimbólum helyébe a makró értéke lép.
Makróérték tesztelése
Egy makrót tesztelhet annak megállapításához, hogy van-e értéke. Azt is meghatározhatja, hogy az értéke egy adott karaktersorozatnak felel-e meg. Ezek a tesztek lehetővé teszik a kódsorok feltételes hozzáadását az X++ programban. Nem lehet ellenőrizni, hogy egy megadott makró rendelkezik-e értékkel. Csak azt tesztelheti, hogy a makró értéke megfelel-e egy adott értéknek. Ajánlott eljárásként mindig definiáljon egy értéket bármely definiált makrónévhez, vagy soha ne adjon meg értéket. Ha váltogat ezek között a módok között, a kód nehezen érthetővé válik.
#defInc és #defDec irányelvek
#defInc és #defDec csak azok az irányelvek, amelyek a makró értékét értelmezik. Csak azokra a makrókra vonatkoznak, amelyek olyan értékkel rendelkeznek, amelyet az előkomponens konvertálhat formális int típusra. Ezek az irányelvek fordításkor módosítják a makró numerikus értékét. Az érték csak számokat tartalmazhat. Az egyetlen nem numerikus karakter engedélyezett, ha egy negatív előjelet (-) ad meg. Az egész szám értéke X++ int, nem int64. Az irányelv által #defInc használt makrónevek esetében a #define makrót létrehozó irányelvnek nem kell osztálydeklarációban lennie. Ezekben az #defInc esetekben a viselkedés kiszámíthatatlan. Ehelyett csak egy metódusban definiálja az ilyen makrókat. Csak egész számértékekkel rendelkező makrókhoz használja az #defInc és #defDec az irányelveket. Az előkompiler speciális szabályokat követ arra az esetben #defInc , ha a makró értéke nem egész szám, vagy ha az érték szokatlan vagy szélsőséges. Az alábbi táblázat felsorolja azokat az értékeket, amelyek #defInc nullára (0) konvertálnak, majd növekmények lesznek. Ha #defInc egy értéket 0-ra konvertál, az eredeti érték nem állítható helyre, még a használatával #defDecsem.
| Makróérték | defInc érték | Magatartás |
|---|---|---|
| (+55) | 56 | A pozitív előtag (+) miatt az előtag ezt az értéket nem numerikus sztringként kezeli. Az előkomponens az összes nem numerikus sztringet 0-ként kezeli, amikor ( #defInc vagy #defDec) direktívát kezel. |
| ("3") | 1 | Az idézőjelek közé zárt egész számokat a rendszer 0-ként kezeli. |
| ( ) | 1 | A szóközök sztringje 0-ként lesz kezelve. |
| () | 1 | A nulla hosszúságú sztringek 0-ként lesznek kezelve. |
| (Véletlenszerű sztring.) | 1 | A nem numerikus karaktersorozatok 0-ként lesznek kezelve. |
| (0x12) | 1 | A hexadecimális számok nem numerikus sztringekként vannak kezelve. Ezért az előkomponens 0-ra konvertálja őket. |
| (-44) | -43 | A negatív számok elfogadhatók. |
| (2147483647) | -2147483648 | A maximális pozitív int érték túlcsordul a minimális negatív int értékre #defInc. |
| (999888777666555) | 1 | Bármilyen nagy szám, az int és az int64 kapacitásán túl. |
| (5.8) | 1 | A valós számok 0-ként vannak értelmezve. |
| 1 | Ha az irányelvhez #define.MyValuelessMacro nincs megadva érték és zárójel, az érték 0. |
#globaldefine irányelv
Az #globaldefine irányelv hasonló az #define irányelvhez.
#definehelyett használja #globaldefine.
#localmacro és #macro irányelvek
Az #localmacro irányelv akkor jó választás, ha azt szeretné, hogy egy makró több sor hosszú értéket tartalmazzon, vagy ha a makró értéke záró zárójelet tartalmaz, így a megfelelő jelöltek a forráskódtöredékek tárolására.
#macro.RetailMatchedAggregatedSalesLine(
%1.price == %2.price
&& %1.businessDate == %2.businessDate
&& %1.itemId == %2.itemId
&& ((((%3) && (%1.qty <= 0)) || ((! %3) && (%1.qty > 0))) || (%4))
)
#endmacro
Az #localmacro irányelv a következőképpen írható: #macro.
#localmacro Ez azonban az ajánlott kifejezés. Az irányelv használatával #if tesztelheti, hogy egy makrónév deklarálva van-e az #define irányelvvel. Nem tesztelheti azonban, hogy a makró neve deklarálva van-e az #localmacro irányelvvel. Az irányelv csak az #define irányelv által deklarált makrókat érinti #undef .
#define Az irányelvben megadhat egy olyan nevet, amely már hatókörben #localmacrovan. Az effektus az, hogy elveti a makrót #localmacro , és létrehoz egy makrót #define . Ez az ellenkező sorrendre is vonatkozik, ami azt jelenti, hogy a #localmacro#define. Az A #localmacro (makrónévvel és értékkel is rendelkező) mindig felülír egy korábbit #localmacro , amelynek ugyanaz a neve. Ugyanez a #globaldefineprobléma a . A makrók és a #define makrók közötti #localmacro fő különbség a szintaxis leállása. A terminátorok a következők:
-
#define– megszűnik a következő:) -
#localmacro– megszűnik a következő:#endmacro
#localmacro jobb választás többsoros értékekkel rendelkező makrókhoz. A többsoros értékek általában X++ vagy SQL-kód sorai. Az X++ és az SQL sok zárójelet tartalmaz, és ezek idő előtt leállnak egy #define.
#define Mindkettő #localmacro deklarálható és megszakítható egyetlen sorban vagy az azt követő vonalakon. A gyakorlatban a #define leállítás ugyanazon a vonalon történik, amelyen deklarálva van. A gyakorlatban a #localmacro leállítás egy későbbi sorban történik.
Makróparaméterek
A makróértékek paraméterszimbólumokat is tartalmazhatnak. Az első paraméterszimbólum %1a második %2, és így tovább. A paraméterek értékeit akkor adja át, amikor a makrószimbólum nevére hivatkozik a bővítéshez. A makróparaméter-értékek formális típus nélküli karaktersorozatok, és vesszővel tagoltak. Paraméterérték részeként nem lehet vesszőt megadni. Az átadott paraméterek száma kisebb lehet, mint a makróérték fogadására tervezett paraméterek száma, nagyobb vagy egyenlő lehet. A rendszer tolerálja az átadott paraméterek számának eltéréseit. Ha a makró által vártnál kevesebb paramétert adnak át, a rendszer minden kihagyott paramétert nulla hosszúságú karaktersorozatként kezel.
Makrószimbólumok beágyazása
Az előkomplikátordefiníciós irányelveket egy külső definíciós irányelvbe ágyazhatja be. A fő definíciós irányelvek a következők #define : és #localmacro.
Az #define irányelv egy #localmacro irányelven belül adható meg, és a #localmacro#define.
#macrolib irányelv
A Kódcsomópont alatti Makrók csomópont alatti Alkalmazáskezelőben számos olyan kódtárcsomópont található, amelyek makróirányelvényeket tartalmaznak. Ezek a makrótárak mind #define megjelennek, és #localmacro gyakran megjelennek bennük. Használhatja a #macrolib. MyAOTMacroLibrary , hogy belefoglalja egy makrótár tartalmát az X++ kódba. Az #if és #undef az irányelvek nem vonatkoznak a nevekre #macrolib . Ezek azonban olyan irányelvekre #define vonatkoznak, amelyek egy #macrolib makró tartalmát képezik. Az irányelv #macrolib. A MyAOTMacroLibrary #MyAOTMacroLibrary is írható . Az #macrolib előtag azért ajánlott, mert soha nem egyértelmű egy olyan személy számára, aki később felolvassa a kódot.
#linenumber irányelv
A kód fejlesztése és hibakeresése során használhatja az #linenumber irányelvet. A makróbővítés előtt a kódfájl fizikai sorszáma váltja fel.
Makró hatóköre
A makrók hivatkozási tartománya attól függ, hogy hol definiálja a makrót. Egy osztályban hivatkozhat a szülőosztályban definiált makrókra. Amikor az előkomponens egy gyermekosztályt kezel, először az öröklési láncot a gyökérosztályhoz fogja követni. Az előkomponens ezután feldolgozza a gyökérosztálytól a lefordított osztályig minden direktívát. Az összes makrót és azok értékeit a belső tábláiban tárolja. Az egyes osztálydeklarációkban szereplő irányelvek eredményei azokra a belső táblákra vonatkoznak, amelyek már ki vannak töltve az öröklési láncban korábban talált irányelvekből.
Az előkomponens azonban külön kezeli az egyes metódusokat. Frissíti a belső táblákat, hogy visszaállíthassa a táblák állapotát az aktuális módszer feldolgozása előtt. Miután az előkomplikátor kezeli az első metódust, a következő metódus kezelése előtt visszaállítja a belső táblákat.
Ebben a kontextusban a metódus az Application Object Tree (AOT) metóduscsomópontjának tartalmaként van definiálva. Az AOT-ban kibonthatja az Osztályok csomópontot, kibonthat egy osztálycsomópontot, kattintson a jobb gombbal egy metóduscsomópontra, majd válassza a Szerkesztés lehetőséget. Ezután hozzáadhat egy sort a #define.MyMacro("abc") metódus deklarációja előtt. Az előkomponens ezt az #define irányelvet a módszer részeként kezeli, még akkor is, ha az a #define{} módszer blokkon kívül történik.